@relu-interactives/spatial-ecs 0.3.18 → 0.3.19

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 (40) hide show
  1. package/dist/{XRHandPose-B8xxFb9A.d.cts → XRHandPose-CLl4MiHx.d.cts} +12 -2
  2. package/dist/{XRHandPose-ubMe5Igc.d.ts → XRHandPose-CrzI57JA.d.ts} +12 -2
  3. package/dist/{chunk-PFE2SDXR.js → chunk-D6KXWNYT.js} +3 -3
  4. package/dist/{chunk-PFE2SDXR.js.map → chunk-D6KXWNYT.js.map} +1 -1
  5. package/dist/{chunk-J3EUNW57.js → chunk-H6DQ7JRE.js} +48 -18
  6. package/dist/chunk-H6DQ7JRE.js.map +1 -0
  7. package/dist/{chunk-7SSOZWXM.js → chunk-JYKFLQB5.js} +46 -5
  8. package/dist/chunk-JYKFLQB5.js.map +1 -0
  9. package/dist/{chunk-KRWBNC6Y.js → chunk-P42OE3RU.js} +4 -4
  10. package/dist/{chunk-KRWBNC6Y.js.map → chunk-P42OE3RU.js.map} +1 -1
  11. package/dist/components/index.cjs +33 -10
  12. package/dist/components/index.cjs.map +1 -1
  13. package/dist/components/index.d.cts +3 -3
  14. package/dist/components/index.d.ts +3 -3
  15. package/dist/components/index.js +1 -1
  16. package/dist/docs/guide/vr-and-hand-poses.md +67 -0
  17. package/dist/factories/index.cjs +8 -0
  18. package/dist/factories/index.cjs.map +1 -1
  19. package/dist/factories/index.d.cts +2 -2
  20. package/dist/factories/index.d.ts +2 -2
  21. package/dist/factories/index.js +3 -3
  22. package/dist/{handPose-dFxqbFFY.d.cts → handPose-DlcTtqgx.d.cts} +26 -1
  23. package/dist/{handPose-dFxqbFFY.d.ts → handPose-DlcTtqgx.d.ts} +26 -1
  24. package/dist/{index-7CFf45fo.d.cts → index-3pNbH0iP.d.cts} +1 -1
  25. package/dist/{index-D7aSZ-e9.d.ts → index-C_589fc4.d.ts} +1 -1
  26. package/dist/{index-DhWfxUgL.d.ts → index-JRcoel9F.d.ts} +3 -2
  27. package/dist/{index-CA9fqh4Z.d.cts → index-g777AmFv.d.cts} +3 -2
  28. package/dist/index.cjs +87 -15
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.cts +11 -8
  31. package/dist/index.d.ts +11 -8
  32. package/dist/index.js +8 -8
  33. package/dist/systems/index.cjs +78 -15
  34. package/dist/systems/index.cjs.map +1 -1
  35. package/dist/systems/index.d.cts +2 -2
  36. package/dist/systems/index.d.ts +2 -2
  37. package/dist/systems/index.js +3 -3
  38. package/package.json +1 -1
  39. package/dist/chunk-7SSOZWXM.js.map +0 -1
  40. package/dist/chunk-J3EUNW57.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../core/Component.ts","../../core/components/Object3DRef.ts","../../core/components/ParentId.ts","../../core/components/Transform.ts","../../core/utils/modelCache.ts","../../core/systems/ObjectManagementSystem.ts","../../core/AnimationStateMachine.ts","../../core/components/Animation.ts","../../core/components/Camera.ts","../../core/components/Audio.ts","../../core/components/Environment.ts","../../core/components/Postprocessing.ts","../../core/components/MeshGeometry.ts","../../core/components/InstancedMesh.ts","../../core/components/InstanceSlotComponent.ts","../../core/components/Physics.ts","../../core/components/Image.ts","../../core/components/ImageTarget.ts","../../core/components/Light.ts","../../core/components/Material.ts","../../core/components/Model.ts","../../core/components/Name.ts","../../core/components/PrefabInstance.ts","../../core/components/PrefabNode.ts","../../core/components/ScriptComponent.ts","../../core/components/ScriptObjectComponent.ts","../../core/components/Selectable.ts","../../core/components/Sprite.ts","../../core/components/Video.ts","../../core/components/VRTeleportArea.ts","../../core/components/XRInteractable.ts","../../core/components/XRRig.ts","../../core/components/XRInteractor.ts","../../core/xr/handPosePresets.ts","../../core/components/XRHandPose.ts","../../core/utils/dracoDecoderPath.ts","../../core/systems/AnimationSystem.ts","../../core/systems/CameraSyncSystem.ts","../../core/systems/ObjectVisibilitySystem.ts","../../core/systems/EnvironmentSyncSystem.ts","../../core/systems/PostprocessingSyncSystem.ts","../../core/systems/PhysicsSyncSystem.ts","../../core/systems/keyboardKeys.ts","../../core/systems/InputSystem.ts","../../core/systems/LightSyncSystem.ts","../../core/systems/MaterialSyncSystem.ts","../../core/systems/MeshGeometrySystem.ts","../../core/utils/loader.ts","../../core/systems/InstancedMeshSystem.ts","../../core/systems/RenderSystem.ts","../../core/prefab/collectEntitySubtree.ts","../../core/hydration/readers.ts","../../core/hydration/componentValues.ts","../../core/hydration/parentLinks.ts","../../core/hydration/postCreateComponents.ts","../../core/hydration/animation.ts","../../core/hydration/restoreComponentState.ts","../../core/hydration/types.ts","../../core/hydration/hydrateWorld.ts","../../core/prefab/overrides.ts","../../core/prefab/instantiateSubtree.ts","../../core/prefab/types.ts","../../core/prefab/spawnPrefab.ts","../../core/Behaviour.ts","../../core/systems/scriptShared.ts","../../core/systems/ScriptBehaviourSystem.ts","../../core/ScriptObject.ts","../../core/systems/ScriptObjectSystem.ts","../../core/systems/TransformSyncSystem.ts","../../core/systems/AudioSystem.ts","../../core/systems/VideoSystem.ts","../../core/systems/XRInputSystem.ts","../../core/xr/throwVelocity.ts","../../core/xr/twoHandTransform.ts","../../core/systems/XRInteractionSystem.ts","../../core/xr/teleportArc.ts","../../core/xr/teleportAimGate.ts","../../core/systems/XRLocomotionSystem.ts","../../core/xr/types.ts","../../core/systems/XRSessionSystem.ts","../../core/systems/VRTeleportAreaSystem.ts","../../core/xr/handPresets.ts","../../core/systems/XRControllerVisualSystem.ts","../../core/systems/XRTeleportVisualSystem.ts","../../core/xr/handPose.ts","../../core/systems/XRHandPoseSystem.ts","../../core/systems/XRHoverVisualSystem.ts"],"names":["Vector3","Euler","Quaternion","THREE2","THREE3","THREE4","toFiniteNumber","asRecord","toBoolean","THREE6","toHexColor","THREE7","GLTFLoader","DRACOLoader","THREE8","FBXLoader","entries","THREE9","THREE10","EffectComposer","RenderPass","BokehPass","THREE11","UnrealBloomPass","ShaderPass","VignetteShader","HueSaturationShader","SepiaShader","FilmPass","DotScreenPass","SSAOPass","GlitchPass","OutputPass","THREE12","body","THREE13","THREE14","THREE15","THREE17","count","geometry","instancedMesh","options","THREE18","THREE19","THREE20","key","THREE21","snapshotOptions","THREE22","THREE23","THREE24","THREE25","THREE26","interactable","THREE27","THREE28","buildGeometry","THREE29","THREE30","XRControllerModelFactory","XRHandModelFactory","THREE31","THREE32","THREE33","fingers","THREE34","THREE35"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Marker base class for every ECS component. Subclass `Component` to declare\n * a typed data container that systems can query.\n *\n * @remarks\n * Components own state only — runtime behaviour belongs in {@link Behaviour}\n * subclasses for user scripts. Keep fields plain (numbers, strings, vectors,\n * asset URLs).\n *\n * @category Components\n */\nexport class Component {}\n\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Wraps the live `THREE.Object3D` for an entity. Almost every entity that\n * renders to the scene carries an `Object3DRef` so transform sync, selection,\n * and parenting systems can manipulate the underlying object.\n *\n * @remarks\n * The `object` reference may be replaced when assets finish loading. Read it\n * fresh inside system/script hooks rather than caching it across frames.\n *\n * @category Components\n */\nexport class Object3DRef extends Component {\n /** Live three.js object placed in the scene graph. May be replaced when assets finish loading. */\n object: THREE.Object3D;\n /** Whether the object is currently visible. Mirrors `object.visible` and is preserved across reloads. */\n visibility: boolean;\n\n constructor(object: THREE.Object3D, visibility?: boolean) {\n super();\n this.object = object;\n this.visibility =\n typeof visibility === \"boolean\" ? visibility : Boolean(object.visible);\n }\n}\n","import { Component } from \"../Component\";\nimport type { EntityId } from \"../types\";\n\n/**\n * Records the parent entity id for hierarchical scene graphs. `null` means\n * the entity is at the world root. The `ObjectManagementSystem` reconciles\n * scene-graph parenting from this component each frame.\n *\n * @category Components\n */\nexport class ParentId extends Component {\n /** Parent entity id, or `null` for root-level entities. */\n value: EntityId | null;\n\n constructor(value: EntityId | null = null) {\n super();\n this.value = value;\n }\n}\n","import { Component } from \"../Component\";\nimport {\n Euler,\n Quaternion,\n Vector3,\n type EulerOrder,\n} from \"three\";\n\n/** Plain XYZ vector. All ECS transform fields use this shape rather than `THREE.Vector3` so they save cleanly with the project. */\nexport type Vec3 = {\n /** X component. */\n x: number;\n /** Y component. */\n y: number;\n /** Z component. */\n z: number;\n};\n\n/** Optional initial values passed to {@link TransformComponent}. Missing axes default to `0` for position/rotation and `1` for scale. */\nexport type TransformData = {\n /** Initial position (defaults to `{ 0, 0, 0 }`). */\n position?: Partial<Vec3>;\n /** Initial rotation in **radians** (defaults to `{ 0, 0, 0 }`). */\n rotation?: Partial<Vec3>;\n /** Initial scale (defaults to `{ 1, 1, 1 }`). */\n scale?: Partial<Vec3>;\n};\n\ntype TransformInput = Vector3 | Euler | Quaternion;\n\nfunction readXYZ(input: TransformInput): Vec3 {\n return {\n x: input.x,\n y: input.y,\n z: input.z,\n };\n}\n\n/**\n * Position, rotation, and scale of an entity in its parent's local space.\n *\n * @remarks\n * Rotation is stored in **radians** (Euler XYZ). The editor inspector converts\n * to/from degrees for display — do not store degrees in this component.\n * Mutations should go through the `setPosition` / `setRotation` / `setScale`\n * helpers so dependent systems pick up the change.\n *\n * @category Components\n */\nexport class TransformComponent extends Component {\n /** Local position relative to the parent (or world if no parent). */\n position: Vec3;\n /** Local rotation as Euler XYZ in **radians**. */\n rotation: Vec3;\n /** Local scale factors per axis (`1` = identity). */\n scale: Vec3;\n\n constructor(data: TransformData = {}) {\n super();\n\n const position = data.position ?? {};\n const rotation = data.rotation ?? {};\n const scale = data.scale ?? {};\n\n this.position = {\n x: position.x ?? 0,\n y: position.y ?? 0,\n z: position.z ?? 0,\n };\n\n this.rotation = {\n x: rotation.x ?? 0,\n y: rotation.y ?? 0,\n z: rotation.z ?? 0,\n };\n\n this.scale = {\n x: scale.x ?? 1,\n y: scale.y ?? 1,\n z: scale.z ?? 1,\n };\n }\n\n toPositionVector3(target = new Vector3()): Vector3 {\n return target.set(this.position.x, this.position.y, this.position.z);\n }\n\n toRotationEuler(\n target = new Euler(),\n order: EulerOrder = \"XYZ\",\n ): Euler {\n return target.set(this.rotation.x, this.rotation.y, this.rotation.z, order);\n }\n\n toRotationQuaternion(\n target = new Quaternion(),\n order: EulerOrder = \"XYZ\",\n ): Quaternion {\n const euler = new Euler(\n this.rotation.x,\n this.rotation.y,\n this.rotation.z,\n order,\n );\n return target.setFromEuler(euler);\n }\n\n toScaleVector3(target = new Vector3()): Vector3 {\n return target.set(this.scale.x, this.scale.y, this.scale.z);\n }\n\n setPosition(input: TransformInput): this {\n const next = readXYZ(input);\n this.position.x = next.x;\n this.position.y = next.y;\n this.position.z = next.z;\n return this;\n }\n\n setScale(input: TransformInput): this {\n const next = readXYZ(input);\n this.scale.x = next.x;\n this.scale.y = next.y;\n this.scale.z = next.z;\n return this;\n }\n\n setRotation(input: TransformInput, order: EulerOrder = \"XYZ\"): this {\n if (input instanceof Quaternion) {\n const euler = new Euler().setFromQuaternion(input, order);\n this.rotation.x = euler.x;\n this.rotation.y = euler.y;\n this.rotation.z = euler.z;\n return this;\n }\n\n const next = readXYZ(input);\n this.rotation.x = next.x;\n this.rotation.y = next.y;\n this.rotation.z = next.z;\n return this;\n }\n}\n","import * as THREE from \"three\";\nimport type { GLTF } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { clone as cloneWithSkeleton } from \"three/examples/jsm/utils/SkeletonUtils.js\";\n\n/**\n * userData flag set on geometries/materials that back shared (cached) model\n * scenes. Entity disposal must skip these — other live clones and future\n * spawns reference the same GPU resources.\n */\nexport const SHARED_MODEL_RESOURCE_FLAG = \"spatialEcsSharedModelResource\";\n\nconst modelCache = new Map<string, Promise<GLTF>>();\n\nfunction markSharedResources(root: THREE.Object3D): void {\n root.traverse((child) => {\n if (!(child instanceof THREE.Mesh)) {\n return;\n }\n if (child.geometry) {\n child.geometry.userData[SHARED_MODEL_RESOURCE_FLAG] = true;\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const material of materials) {\n if (material) {\n material.userData[SHARED_MODEL_RESOURCE_FLAG] = true;\n }\n }\n });\n}\n\n/**\n * Load a GLTF once per URL and share the parsed result, so repeated spawns of\n * the same model skip both the fetch and the parse. The cached scene must\n * never be mounted directly (an Object3D has a single parent) — mount a\n * cloneModelScene() of it. Failed loads are evicted so a retry re-fetches.\n */\nexport function loadSharedGltf(\n url: string,\n load: () => Promise<GLTF>,\n): Promise<GLTF> {\n let pending = modelCache.get(url);\n if (!pending) {\n pending = load().then((gltf) => {\n markSharedResources(gltf.scene);\n return gltf;\n });\n pending.catch(() => {\n modelCache.delete(url);\n });\n modelCache.set(url, pending);\n }\n return pending;\n}\n\n/**\n * Skeleton-aware clone of a cached model scene for mounting. Geometries and\n * materials are shared with the cached original (marked via\n * SHARED_MODEL_RESOURCE_FLAG); the object hierarchy — including rebound\n * skeletons for skinned meshes — is fresh per call.\n */\nexport function cloneModelScene(scene: THREE.Object3D): THREE.Object3D {\n return cloneWithSkeleton(scene);\n}\n\n/**\n * Forget cached models (one URL, or everything). Subsequent loads fetch and\n * parse anew. Does not dispose GPU resources — live clones may still use them.\n */\nexport function clearModelCache(url?: string): void {\n if (typeof url === \"string\") {\n modelCache.delete(url);\n return;\n }\n modelCache.clear();\n}\n","import * as THREE from \"three\";\n\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { ParentId } from \"../components/ParentId\";\nimport type { TransformData } from \"../components/Transform\";\nimport { TransformComponent } from \"../components/Transform\";\nimport type { EcsSystem } from \"../System\";\nimport { SHARED_MODEL_RESOURCE_FLAG } from \"../utils/modelCache\";\nimport type { World } from \"../World\";\nimport type { EntityId, EcsEntityKind } from \"../types\";\n\nexport type CreatePayload = {\n name?: string;\n transform?: TransformData;\n parentId?: EntityId | null;\n path?: string;\n options?: Record<string, unknown>;\n camera?: Record<string, unknown>;\n useWorldCamera?: boolean;\n /**\n * Suppress the default child entities a factory would otherwise create.\n *\n * Set during hydration: the snapshot already contains those children, so\n * letting the factory add its own too duplicates them on every load.\n */\n skipDefaultChildren?: boolean;\n};\n\nexport type CreateContext = {\n world: World;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n payload: CreatePayload;\n isEditor?: boolean;\n};\n\nexport type EntityFactory = (context: CreateContext) => EntityId;\n\nexport type EcsComponentFactoryKind =\n | \"animation\"\n | \"audio\"\n | \"camera\"\n | \"environment\"\n | \"entityType\"\n | \"image\"\n | \"imageTargetAnchor\"\n | \"imageTarget\"\n | \"light\"\n | \"material\"\n | \"mesh\"\n | \"meshGeometry\"\n | \"model\"\n | \"name\"\n | \"object3DRef\"\n | \"parentId\"\n | \"physics\"\n | \"postprocessing\"\n | \"script\"\n | \"scriptObject\"\n | \"selectable\"\n | \"selectionTransformState\"\n | \"sprite\"\n | \"transform\"\n | \"video\"\n | \"instancedMesh\"\n | \"xrRig\"\n | \"vrTeleportArea\"\n | \"xrHandPose\"\n | \"xrInteractable\"\n | \"xrInteractor\"\n | \"xrInteractorSide\";\n\nexport type ComponentFactory = (\n world: World,\n entityId: EntityId,\n ...args: any[]\n) => unknown;\n\ntype CreateRequest = {\n kind: EcsEntityKind;\n payload: CreatePayload;\n onCreated?: (entityId: EntityId) => void;\n};\n\nexport function createTransform(input?: TransformData): TransformComponent {\n return new TransformComponent(input);\n}\n\nexport function applyTransform(\n object: THREE.Object3D,\n transform: TransformComponent,\n): void {\n object.position.set(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n object.rotation.set(\n transform.rotation.x,\n transform.rotation.y,\n transform.rotation.z,\n );\n object.scale.set(transform.scale.x, transform.scale.y, transform.scale.z);\n}\n\nexport class ObjectManagementSystem implements EcsSystem {\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private readonly isEditor: boolean;\n private readonly registry = new Map<EcsEntityKind, EntityFactory>();\n private readonly componentRegistry = new Map<\n EcsComponentFactoryKind,\n ComponentFactory\n >();\n private readonly createQueue: CreateRequest[] = [];\n\n constructor(\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n isEditor = false,\n ) {\n this.scene = scene;\n this.camera = camera;\n this.isEditor = isEditor;\n }\n\n register(kind: EcsEntityKind, factory: EntityFactory): void {\n this.registry.set(kind, factory);\n }\n\n registerComponentFactory(\n kind: EcsComponentFactoryKind,\n factory: ComponentFactory,\n ): void {\n this.componentRegistry.set(kind, factory);\n }\n\n getOrCreateAudioListener(): THREE.AudioListener {\n const existing = this.camera.userData.ecsAudioListener;\n if (existing instanceof THREE.AudioListener) {\n return existing;\n }\n\n const listener = new THREE.AudioListener();\n this.camera.add(listener);\n this.camera.userData.ecsAudioListener = listener;\n return listener;\n }\n\n isEditorMode(): boolean {\n return this.isEditor;\n }\n\n getComponentFactory(kind: EcsComponentFactoryKind): ComponentFactory | null {\n return this.componentRegistry.get(kind) ?? null;\n }\n\n createComponentNow(\n kind: EcsComponentFactoryKind,\n world: World,\n entityId: EntityId,\n ...args: any[]\n ): unknown {\n const factory = this.componentRegistry.get(kind);\n if (!factory) {\n throw new Error(`Unknown component kind: ${kind}`);\n }\n\n return factory(world, entityId, ...args);\n }\n\n requestCreate(\n kind: EcsEntityKind,\n payload: CreatePayload = {},\n onCreated?: (entityId: EntityId) => void,\n ): void {\n this.createQueue.push({ kind, payload, onCreated });\n }\n\n createNow(\n kind: EcsEntityKind,\n world: World,\n payload: CreatePayload = {},\n ): EntityId {\n const factory = this.registry.get(kind);\n if (!factory) {\n throw new Error(`Unknown object kind: ${kind}`);\n }\n\n const entityId = factory({\n world,\n scene: this.scene,\n camera: this.camera,\n payload,\n isEditor: this.isEditor,\n });\n\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) {\n object.userData.ecsKind = kind;\n }\n\n if (payload.parentId !== undefined) {\n world.addComponent(entityId, new ParentId(payload.parentId));\n }\n\n return entityId;\n }\n\n /**\n * Removes an entity from the ECS world and its associated `Object3D` from the\n * THREE.js scene graph.\n *\n * @param world - The world the entity belongs to.\n * @param entityId - The entity to remove.\n * @param dispose - When `true`, traverses the entity's `Object3D` subtree and\n * calls `.dispose()` on every `BufferGeometry` and `Material` found. Pass\n * `true` when the entity will not be reused and you want to free GPU memory\n * immediately (e.g. dynamically spawned objects). Defaults to `false`.\n * @returns `true` if the entity existed and was removed; `false` if the entity\n * was not found.\n *\n * @example\n * ```ts\n * // Remove from scene, keep GPU resources (safe if geometry is shared)\n * objects.deleteEntity(world, entityId);\n *\n * // Remove from scene and free GPU memory (use for one-off spawned objects)\n * objects.deleteEntity(world, entityId, true);\n * ```\n */\n deleteEntity(world: World, entityId: EntityId, dispose = false): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n const object3d = world.getComponent(entityId, Object3DRef)?.object;\n if (object3d?.parent) {\n object3d.parent.remove(object3d);\n }\n\n if (dispose && object3d) {\n object3d.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n // Resources backing shared (cached) model scenes are skipped —\n // other live clones and future spawns reference the same objects.\n if (!child.geometry?.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n child.geometry?.dispose();\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const mat of materials) {\n if (mat && !mat.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n mat.dispose();\n }\n }\n }\n });\n }\n\n world.destroyEntity(entityId);\n return true;\n }\n\n setParent(\n world: World,\n entityId: EntityId,\n parentId: EntityId | null,\n options?: {\n preserveWorldTransform?: boolean;\n },\n ): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n if (parentId !== null && !world.hasEntity(parentId)) {\n return false;\n }\n\n if (parentId === entityId) {\n return false;\n }\n\n let ancestor = parentId;\n while (ancestor !== null) {\n if (ancestor === entityId) {\n return false;\n }\n\n ancestor = world.getComponent(ancestor, ParentId)?.value ?? null;\n }\n\n const parentComponent = world.getComponent(entityId, ParentId);\n if (parentComponent) {\n if (parentComponent.value === parentId) {\n return false;\n }\n\n parentComponent.value = parentId;\n } else {\n world.addComponent(entityId, new ParentId(parentId));\n }\n\n const preserveWorldTransform = options?.preserveWorldTransform ?? true;\n if (preserveWorldTransform) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n const parentObject =\n parentId !== null\n ? world.getComponent(parentId, Object3DRef)?.object ?? null\n : null;\n\n if (object) {\n // Refresh matrixWorld before attach so world-space preservation is accurate.\n this.scene.updateMatrixWorld(true);\n\n if (parentObject && parentObject !== object) {\n parentObject.attach(object);\n } else {\n this.scene.attach(object);\n }\n\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n }\n\n this.reconcileSceneFromWorld(world);\n return true;\n }\n\n private syncTransformComponentFromObject(\n world: World,\n entityId: EntityId,\n object: THREE.Object3D,\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) {\n return;\n }\n\n transform.position.x = object.position.x;\n transform.position.y = object.position.y;\n transform.position.z = object.position.z;\n\n transform.rotation.x = object.rotation.x;\n transform.rotation.y = object.rotation.y;\n transform.rotation.z = object.rotation.z;\n\n transform.scale.x = object.scale.x;\n transform.scale.y = object.scale.y;\n transform.scale.z = object.scale.z;\n }\n\n reconcileSceneFromWorld(world: World): void {\n const worldObjects = new Map<EntityId, THREE.Object3D>();\n const entityIds = world.query(Object3DRef);\n\n for (const entityId of entityIds) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!object) {\n continue;\n }\n\n worldObjects.set(entityId, object);\n }\n\n for (const child of [...this.scene.children]) {\n const entityId = child.userData?.entityId;\n if (typeof entityId === \"number\" && !world.hasEntity(entityId)) {\n this.scene.remove(child);\n }\n }\n\n for (const [entityId, object] of worldObjects.entries()) {\n const parentEntityId = world.getComponent(entityId, ParentId)?.value;\n const parentObject =\n typeof parentEntityId === \"number\"\n ? worldObjects.get(parentEntityId)\n : undefined;\n\n if (parentObject && parentObject !== object) {\n if (object.parent !== parentObject) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n parentObject.add(object);\n object.updateMatrixWorld(true);\n }\n continue;\n }\n\n if (object.parent !== this.scene) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n this.scene.add(object);\n object.updateMatrixWorld(true);\n }\n }\n }\n\n update(world: World): void {\n for (const request of this.createQueue.splice(0)) {\n const entityId = this.createNow(request.kind, world, request.payload);\n request.onCreated?.(entityId);\n }\n\n this.reconcileSceneFromWorld(world);\n }\n}\n","import type * as THREE from \"three\";\n\nexport interface StateMachine {\n name: string;\n clip: THREE.AnimationClip;\n clipId: string | null;\n loop: boolean;\n isPlaying: boolean;\n isPaused: boolean;\n onStart: () => void;\n onPlaying: () => void;\n onEnd: () => void;\n play: () => void;\n pause: () => void;\n stop: () => void;\n}\n\nexport type AnimationStateCallbacks = {\n onStart?: () => void;\n onPlaying?: () => void;\n onEnd?: () => void;\n};\n\nexport class AnimationStateMachine implements StateMachine {\n name: string;\n clip: THREE.AnimationClip;\n clipId: string | null;\n loop: boolean;\n isPlaying = false;\n isPaused = false;\n private callbacks: Required<AnimationStateCallbacks>;\n\n constructor(\n name: string,\n clip: THREE.AnimationClip,\n callbacks: AnimationStateCallbacks = {},\n loop = false,\n clipId: string | null = null,\n ) {\n this.name = name;\n this.clip = clip;\n this.clipId = clipId;\n this.loop = loop;\n this.callbacks = {\n onStart: callbacks.onStart ?? (() => {}),\n onPlaying: callbacks.onPlaying ?? (() => {}),\n onEnd: callbacks.onEnd ?? (() => {}),\n };\n }\n\n setCallbacks(callbacks: AnimationStateCallbacks): void {\n this.callbacks = {\n onStart: callbacks.onStart ?? this.callbacks.onStart,\n onPlaying: callbacks.onPlaying ?? this.callbacks.onPlaying,\n onEnd: callbacks.onEnd ?? this.callbacks.onEnd,\n };\n }\n\n setLoop(loop: boolean): void {\n this.loop = loop;\n }\n\n onStart(): void {\n this.callbacks.onStart();\n }\n\n onPlaying(): void {\n this.callbacks.onPlaying();\n }\n\n onEnd(): void {\n this.callbacks.onEnd();\n }\n\n play(): void {\n const wasPlaying = this.isPlaying;\n this.isPlaying = true;\n this.isPaused = false;\n\n if (!wasPlaying) {\n this.onStart();\n }\n\n this.onPlaying();\n }\n\n pause(): void {\n if (!this.isPlaying) {\n return;\n }\n\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n stop(): void {\n const shouldNotifyEnd = this.isPlaying || this.isPaused;\n this.isPlaying = false;\n this.isPaused = false;\n\n if (shouldNotifyEnd) {\n this.onEnd();\n }\n }\n}\n\nexport class AnimationStateManager {\n private readonly states = new Map<string, AnimationStateMachine>();\n private activeState: AnimationStateMachine | null = null;\n\n addState(state: AnimationStateMachine): AnimationStateMachine {\n this.states.set(state.name, state);\n return state;\n }\n\n createState(\n name: string,\n clip: THREE.AnimationClip,\n callbacks: AnimationStateCallbacks = {},\n loop = false,\n clipId: string | null = null,\n ): AnimationStateMachine {\n const state = new AnimationStateMachine(name, clip, callbacks, loop, clipId);\n this.states.set(name, state);\n return state;\n }\n\n removeState(name: string): boolean {\n const state = this.states.get(name);\n if (!state) {\n return false;\n }\n\n if (this.activeState?.name === name) {\n this.activeState.stop();\n this.activeState = null;\n }\n\n return this.states.delete(name);\n }\n\n getState(name: string): AnimationStateMachine | null {\n return this.states.get(name) ?? null;\n }\n\n hasState(name: string): boolean {\n return this.states.has(name);\n }\n\n listStates(): AnimationStateMachine[] {\n return [...this.states.values()];\n }\n\n getActiveState(): AnimationStateMachine | null {\n return this.activeState;\n }\n\n switchState(name: string, autoPlay = true): AnimationStateMachine | null {\n const next = this.states.get(name) ?? null;\n if (!next) {\n return null;\n }\n\n if (this.activeState && this.activeState !== next) {\n this.activeState.stop();\n }\n\n this.activeState = next;\n if (autoPlay) {\n next.play();\n }\n\n return next;\n }\n\n playState(name?: string): boolean {\n const state = name ? this.switchState(name, false) : this.activeState;\n if (!state) {\n return false;\n }\n\n this.activeState = state;\n state.play();\n return true;\n }\n\n pauseState(name?: string): boolean {\n const state = name ? this.states.get(name) : this.activeState;\n if (!state) {\n return false;\n }\n\n state.pause();\n return true;\n }\n\n stopState(name?: string): boolean {\n const state = name ? this.states.get(name) : this.activeState;\n if (!state) {\n return false;\n }\n\n state.stop();\n if (!name || this.activeState?.name === name) {\n this.activeState = null;\n }\n return true;\n }\n\n clear(): void {\n this.stopState();\n this.states.clear();\n this.activeState = null;\n }\n}","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\nimport {\n AnimationStateManager,\n type AnimationStateMachine,\n} from \"../AnimationStateMachine\";\n\n/** Initializer for {@link AnimationComponent}. */\nexport type AnimationComponentOptions = {\n /** Initial set of clips imported from the entity's model. */\n clips?: THREE.AnimationClip[];\n /** URLs (or `localasset://` paths) of clips to load asynchronously and merge into the catalog. */\n externalClipSources?: string[];\n /** Name of the state to activate after construction. */\n activeState?: string | null;\n /** Whether playback starts paused. */\n paused?: boolean;\n /** Play the active clip in reverse. */\n reverse?: boolean;\n /** Time-scale multiplier (`1` = real-time). */\n timeScale?: number;\n /** Default cross-fade duration in seconds when switching states. */\n crossFadeDuration?: number;\n /** Predefined state machine entries (`name` -> clip binding). */\n states?: Array<{\n /** State name (must be unique). */\n name: string;\n /** Clip name to play in this state. */\n clip: string;\n /** Optional stable clip id used to disambiguate same-named clips. */\n clipId?: string;\n /** Loop the clip while in this state. */\n loop?: boolean;\n }>;\n};\n\n/** Catalog entry describing a clip available to the entity (from a model or an external source). */\nexport type AnimationClipCatalogEntry = {\n /** Stable id used to reference the clip from state machines. */\n id: string;\n /** Internal clip name as stored on the `THREE.AnimationClip`. */\n name: string;\n /** Display label shown in the inspector. */\n label: string;\n /** Underlying three.js clip. */\n clip: THREE.AnimationClip;\n /** Where this clip came from. */\n source: \"model\" | \"external\";\n /** Source URL/path for `external` clips; `null` for clips imported from a model. */\n sourceUrl: string | null;\n};\n\ntype ImportedClipEntry = {\n clip: THREE.AnimationClip;\n sourceUrl: string | null;\n};\n\n/**\n * Animation catalog and runtime state for an entity. Combines clips imported\n * from a model with externally added clips, exposes a state machine for\n * named transitions, and is queried each frame by the animation system to\n * advance mixer time.\n *\n * @remarks\n * Use the `addState` / `switchState` helpers rather than mutating the state\n * machine directly so the animation system observes transitions.\n *\n * @category Components\n */\nexport class AnimationComponent extends Component {\n private modelClips: THREE.AnimationClip[];\n private importedClips: ImportedClipEntry[];\n private clipById: Map<string, THREE.AnimationClip>;\n private clipEntriesById: Map<string, AnimationClipCatalogEntry>;\n\n /** Combined ordered list of clips (model + external) currently loaded. */\n clips: THREE.AnimationClip[];\n /** Per-clip metadata used by the inspector. */\n clipCatalog: AnimationClipCatalogEntry[];\n /** Display names of clips available for state-machine bindings. */\n availableClips: string[];\n /** URLs/paths of external clip sources (saved with the project). */\n externalClipSources: string[];\n /** Whether playback is currently paused. */\n paused: boolean;\n /** Play the active clip in reverse. */\n reverse: boolean;\n /** Playback speed multiplier (`1` = real-time). */\n timeScale: number;\n /** Default cross-fade duration in seconds when switching states. */\n crossFadeDuration: number;\n /** All state-machine entries authored on this entity. */\n states: AnimationStateMachine[];\n /** State currently being played, or `null` if none. */\n active: AnimationStateMachine | null;\n /** Name of the {@link active} state, or `null` if none. */\n activeStateName: string | null;\n /** Manager that drives state transitions; mutate via {@link addState}/{@link switchState}. */\n stateManager: AnimationStateManager;\n\n constructor(options: AnimationComponentOptions = {}) {\n super();\n\n this.modelClips = Array.isArray(options.clips) ? [...options.clips] : [];\n this.importedClips = [];\n this.clipById = new Map<string, THREE.AnimationClip>();\n this.clipEntriesById = new Map<string, AnimationClipCatalogEntry>();\n this.clips = [];\n this.clipCatalog = [];\n this.availableClips = [];\n this.externalClipSources = [];\n\n this.setExternalClipSources(options.externalClipSources ?? []);\n this.refreshClipCatalog();\n\n this.paused = options.paused ?? false;\n this.reverse = options.reverse ?? false;\n this.timeScale = options.timeScale ?? 1;\n this.crossFadeDuration = options.crossFadeDuration ?? 0;\n\n this.stateManager = new AnimationStateManager();\n this.states = this.stateManager.listStates();\n this.active = this.stateManager.getActiveState();\n this.activeStateName = this.active?.name ?? null;\n\n if (Array.isArray(options.states) && options.states.length > 0) {\n for (const entry of options.states) {\n this.addState(entry.name, entry.clip, entry.loop ?? false);\n }\n }\n // else {\n // for (const clip of this.clips) {\n // this.addState(clip.name || \"Default\", clip.name, false);\n // }\n // }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n this.switchState(options.activeState, !this.paused);\n }\n }\n\n private refreshClipCatalog(): void {\n const catalog: AnimationClipCatalogEntry[] = [];\n const nameCounts = new Map<string, number>();\n const nextById = new Map<string, THREE.AnimationClip>();\n const nextEntriesById = new Map<string, AnimationClipCatalogEntry>();\n\n for (const [index, clip] of this.modelClips.entries()) {\n const name = typeof clip?.name === \"string\" && clip.name.length > 0\n ? clip.name\n : `Clip ${index + 1}`;\n const id = `model:${index}:${name}`;\n const count = (nameCounts.get(name) ?? 0) + 1;\n nameCounts.set(name, count);\n\n const entry: AnimationClipCatalogEntry = {\n id,\n name,\n label: count > 1 ? `${name} (${count})` : name,\n clip,\n source: \"model\",\n sourceUrl: null,\n };\n\n catalog.push(entry);\n nextById.set(id, clip);\n nextEntriesById.set(id, entry);\n }\n\n for (const [index, imported] of this.importedClips.entries()) {\n const clip = imported.clip;\n const name = typeof clip?.name === \"string\" && clip.name.length > 0\n ? clip.name\n : `Clip ${index + 1}`;\n const sourceUrl = imported.sourceUrl;\n const id = `external:${index}:${name}`;\n const count = (nameCounts.get(name) ?? 0) + 1;\n nameCounts.set(name, count);\n\n const sourceSuffix = sourceUrl\n ? sourceUrl.split(\"/\").pop() ?? sourceUrl\n : \"external\";\n\n const entry: AnimationClipCatalogEntry = {\n id,\n name,\n label:\n count > 1\n ? `${name} (${count}) • ${sourceSuffix}`\n : `${name} • ${sourceSuffix}`,\n clip,\n source: \"external\",\n sourceUrl,\n };\n\n catalog.push(entry);\n nextById.set(id, clip);\n nextEntriesById.set(id, entry);\n }\n\n this.clipById = nextById;\n this.clipEntriesById = nextEntriesById;\n this.clipCatalog = catalog;\n this.clips = catalog.map((entry) => entry.clip);\n this.availableClips = catalog.map((entry) => entry.name);\n }\n\n private refreshStateRefs(): void {\n this.states = this.stateManager.listStates();\n this.active = this.stateManager.getActiveState();\n this.activeStateName = this.active?.name ?? null;\n }\n\n private resolveClipRef(clipRef: string): { id: string; clip: THREE.AnimationClip } | null {\n const trimmed = clipRef.trim();\n if (!trimmed) {\n return null;\n }\n\n const byId = this.clipById.get(trimmed);\n if (byId) {\n return { id: trimmed, clip: byId };\n }\n\n const byName = this.clipCatalog.find((entry) => entry.name === trimmed);\n if (!byName) {\n return null;\n }\n\n return { id: byName.id, clip: byName.clip };\n }\n\n setModelClips(clips: THREE.AnimationClip[]): void {\n this.modelClips = Array.isArray(clips) ? [...clips] : [];\n this.refreshClipCatalog();\n }\n\n setImportedClips(\n clips: THREE.AnimationClip[] | ImportedClipEntry[],\n ): void {\n if (!Array.isArray(clips)) {\n this.importedClips = [];\n this.refreshClipCatalog();\n return;\n }\n\n this.importedClips = clips\n .map((entry) => {\n if (entry instanceof THREE.AnimationClip) {\n return { clip: entry, sourceUrl: null };\n }\n\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n\n const candidate = entry as Partial<ImportedClipEntry>;\n if (!(candidate.clip instanceof THREE.AnimationClip)) {\n return null;\n }\n\n return {\n clip: candidate.clip,\n sourceUrl:\n typeof candidate.sourceUrl === \"string\" && candidate.sourceUrl.length > 0\n ? candidate.sourceUrl\n : null,\n };\n })\n .filter((entry): entry is ImportedClipEntry => entry !== null);\n\n this.refreshClipCatalog();\n }\n\n setExternalClipSources(sources: string[]): void {\n if (!Array.isArray(sources)) {\n this.externalClipSources = [];\n return;\n }\n\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const source of sources) {\n if (typeof source !== \"string\") {\n continue;\n }\n\n const trimmed = source.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n normalized.push(trimmed);\n }\n\n this.externalClipSources = normalized;\n }\n\n addState(name: string, clipRef: string, loop = false): AnimationStateMachine | null {\n if (!name.trim()) {\n return null;\n }\n\n const resolved = this.resolveClipRef(clipRef);\n if (!resolved) {\n return null;\n }\n\n const state = this.stateManager.createState(name, resolved.clip, {}, loop, resolved.id);\n this.refreshStateRefs();\n return state;\n }\n\n setStates(states: Array<{ name: string; clip: string; clipId?: string; loop?: boolean }>): void {\n const previousActive = this.activeStateName;\n this.stateManager.clear();\n\n for (const state of states) {\n if (!state.name.trim()) {\n continue;\n }\n\n let createdState: AnimationStateMachine | null = null;\n\n if (typeof state.clipId === \"string\" && state.clipId.trim().length > 0) {\n createdState = this.addState(state.name, state.clipId, Boolean(state.loop));\n }\n\n if (!createdState) {\n this.addState(state.name, state.clip, Boolean(state.loop));\n }\n }\n\n if (previousActive) {\n this.stateManager.switchState(previousActive, !this.paused);\n }\n\n this.refreshStateRefs();\n }\n\n getStateConfigs(): Array<{ name: string; clip: string; clipId: string | null; loop: boolean }> {\n return this.states.map((state) => ({\n name: state.name,\n clip: state.clip.name,\n clipId: state.clipId,\n loop: state.loop,\n }));\n }\n\n setActiveState(name: string | null, autoPlay = true): boolean {\n if (!name) {\n const stopped = this.stateManager.stopState();\n this.paused = true;\n this.refreshStateRefs();\n return stopped;\n }\n\n return this.switchState(name, autoPlay);\n }\n\n removeState(name: string): boolean {\n const removed = this.stateManager.removeState(name);\n if (removed) {\n this.refreshStateRefs();\n }\n return removed;\n }\n\n switchState(name: string, autoPlay = true): boolean {\n const state = this.stateManager.switchState(name, autoPlay);\n if (!state) {\n return false;\n }\n\n this.paused = !state.isPlaying;\n this.refreshStateRefs();\n return true;\n }\n\n playState(name?: string): boolean {\n const played = this.stateManager.playState(name);\n if (!played) {\n return false;\n }\n\n this.paused = false;\n this.refreshStateRefs();\n return true;\n }\n\n pauseState(name?: string): boolean {\n const paused = this.stateManager.pauseState(name);\n if (!paused) {\n return false;\n }\n\n this.paused = true;\n this.refreshStateRefs();\n return true;\n }\n\n stopState(name?: string): boolean {\n const stopped = this.stateManager.stopState(name);\n if (!stopped) {\n return false;\n }\n\n this.paused = true;\n this.refreshStateRefs();\n return true;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Runtime camera mode. `3d` is a free camera; `ar` is composited over a tracked\n * image/face feed; `xr` is driven by an immersive WebXR session (the headset\n * owns the pose and projection — locomotion moves the camera's XR rig parent).\n */\nexport type CameraRuntimeType = \"3d\" | \"ar\" | \"xr\";\n/** Projection model. */\nexport type CameraProjection = \"perspective\" | \"orthographic\";\n\n/** Optional initializer for {@link CameraComponent}. Any field omitted falls back to the defaults documented on the component. */\nexport type CameraComponentOptions = {\n /** Pre-built three.js camera. When omitted the component creates one from {@link projection}. */\n camera?: THREE.Camera;\n /** Runtime camera mode. */\n type?: CameraRuntimeType;\n /** Mark this camera as the default camera the renderer uses. */\n isDefault?: boolean;\n /** Projection model. */\n projection?: CameraProjection;\n /** Vertical field of view in **degrees** (perspective only). */\n fov?: number;\n /** Near clip plane in world units. */\n near?: number;\n /** Far clip plane in world units. */\n far?: number;\n /** Left edge of the orthographic frustum in world units. */\n left?: number;\n /** Right edge of the orthographic frustum in world units. */\n right?: number;\n /** Top edge of the orthographic frustum in world units. */\n top?: number;\n /** Bottom edge of the orthographic frustum in world units. */\n bottom?: number;\n /** Zoom multiplier (`1` = no zoom). */\n zoom?: number;\n};\n\nconst DEFAULT_FOV = 50;\nconst DEFAULT_NEAR = 0.1;\nconst DEFAULT_FAR = 2000;\nconst DEFAULT_ORTHO_LEFT = -5;\nconst DEFAULT_ORTHO_RIGHT = 5;\nconst DEFAULT_ORTHO_TOP = 5;\nconst DEFAULT_ORTHO_BOTTOM = -5;\nconst DEFAULT_ZOOM = 1;\n\nfunction inferProjection(camera: THREE.Camera | undefined): CameraProjection {\n if (camera instanceof THREE.OrthographicCamera) {\n return \"orthographic\";\n }\n\n return \"perspective\";\n}\n\nfunction readCameraNear(camera: THREE.Camera | undefined): number | null {\n if (\n camera &&\n \"near\" in camera &&\n typeof camera.near === \"number\" &&\n Number.isFinite(camera.near)\n ) {\n return camera.near;\n }\n\n return null;\n}\n\nfunction readCameraFar(camera: THREE.Camera | undefined): number | null {\n if (\n camera &&\n \"far\" in camera &&\n typeof camera.far === \"number\" &&\n Number.isFinite(camera.far)\n ) {\n return camera.far;\n }\n\n return null;\n}\n\nfunction inferFov(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.PerspectiveCamera && Number.isFinite(camera.fov)) {\n return camera.fov;\n }\n\n return DEFAULT_FOV;\n}\n\nfunction inferNear(camera: THREE.Camera | undefined): number {\n const near = readCameraNear(camera);\n if (near !== null) {\n return near;\n }\n\n return DEFAULT_NEAR;\n}\n\nfunction inferFar(camera: THREE.Camera | undefined): number {\n const far = readCameraFar(camera);\n if (far !== null) {\n return far;\n }\n\n return DEFAULT_FAR;\n}\n\nfunction inferOrthoLeft(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.left)) {\n return camera.left;\n }\n\n return DEFAULT_ORTHO_LEFT;\n}\n\nfunction inferOrthoRight(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.right)) {\n return camera.right;\n }\n\n return DEFAULT_ORTHO_RIGHT;\n}\n\nfunction inferOrthoTop(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.top)) {\n return camera.top;\n }\n\n return DEFAULT_ORTHO_TOP;\n}\n\nfunction inferOrthoBottom(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.bottom)) {\n return camera.bottom;\n }\n\n return DEFAULT_ORTHO_BOTTOM;\n}\n\nfunction inferZoom(camera: THREE.Camera | undefined): number {\n if (\n camera &&\n \"zoom\" in camera &&\n typeof camera.zoom === \"number\" &&\n Number.isFinite(camera.zoom)\n ) {\n return camera.zoom;\n }\n\n return DEFAULT_ZOOM;\n}\n\n/**\n * Camera entity state. Supports perspective and orthographic projections, a\n * `3d` or `ar` runtime type, and an `isDefault` flag for the camera that the\n * preview/editor renders through. Field-of-view, near/far, ortho frustum, and\n * zoom are persisted; the live `THREE.Camera` is recreated when the project loads.\n *\n * @category Components\n */\nexport class CameraComponent extends Component {\n /** Live three.js camera. Recreated when the project loads to match {@link projection}. */\n camera: THREE.Camera;\n /** Runtime camera mode (`3d` or `ar`). */\n type: CameraRuntimeType;\n /** When `true`, this is the active rendering camera. Only one camera per scene should be the default. */\n isDefault: boolean;\n /** Active projection model (`perspective` or `orthographic`). */\n projection: CameraProjection;\n /** Vertical field of view in **degrees**. Used when {@link projection} is `perspective`. */\n fov: number;\n /** Near clip plane in world units. */\n near: number;\n /** Far clip plane in world units. */\n far: number;\n /** Left edge of the orthographic frustum (orthographic only). */\n left: number;\n /** Right edge of the orthographic frustum (orthographic only). */\n right: number;\n /** Top edge of the orthographic frustum (orthographic only). */\n top: number;\n /** Bottom edge of the orthographic frustum (orthographic only). */\n bottom: number;\n /** Zoom multiplier applied to the projection. */\n zoom: number;\n\n constructor(payload: CameraComponentOptions = {}) {\n super();\n\n this.camera = payload.camera ?? new THREE.PerspectiveCamera();\n this.type = payload.type ?? \"3d\";\n this.isDefault = typeof payload.isDefault === \"boolean\" ? payload.isDefault : false;\n this.projection = payload.projection ?? inferProjection(payload.camera);\n this.fov =\n typeof payload.fov === \"number\" && Number.isFinite(payload.fov)\n ? payload.fov\n : inferFov(payload.camera);\n this.near =\n typeof payload.near === \"number\" && Number.isFinite(payload.near)\n ? payload.near\n : inferNear(payload.camera);\n this.far =\n typeof payload.far === \"number\" && Number.isFinite(payload.far)\n ? payload.far\n : inferFar(payload.camera);\n this.left =\n typeof payload.left === \"number\" && Number.isFinite(payload.left)\n ? payload.left\n : inferOrthoLeft(payload.camera);\n this.right =\n typeof payload.right === \"number\" && Number.isFinite(payload.right)\n ? payload.right\n : inferOrthoRight(payload.camera);\n this.top =\n typeof payload.top === \"number\" && Number.isFinite(payload.top)\n ? payload.top\n : inferOrthoTop(payload.camera);\n this.bottom =\n typeof payload.bottom === \"number\" && Number.isFinite(payload.bottom)\n ? payload.bottom\n : inferOrthoBottom(payload.camera);\n this.zoom =\n typeof payload.zoom === \"number\" && Number.isFinite(payload.zoom)\n ? payload.zoom\n : inferZoom(payload.camera);\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * @internal Default options applied when no override is provided.\n */\nconst DEFAULT_AUDIO_OPTIONS = {\n autoplay: false,\n loop: false,\n pitch: 1,\n volume: 1,\n positional: false,\n refDistance: 1,\n distanceModel: \"inverse\",\n rolloffFactor: 1,\n};\n\n/**\n * Plays an audio clip from `path`. Supports both global stereo (`positional:\n * false`) and 3D positional audio with the configured distance model.\n * Runtime fields (`object`, `audio`, `isPlaying`, `isPaused`) are recreated\n * when the project loads and are never persisted to saved snapshots.\n *\n * @category Components\n */\nexport class AudioComponent extends Component {\n /** Source URL or `localasset://` path of the audio file. */\n path: string;\n /**\n * Playback options.\n *\n * | Field | Default | Description |\n * |---|---|---|\n * | `autoplay` | `false` | Start playback as soon as the clip is loaded. |\n * | `loop` | `false` | Loop playback indefinitely. |\n * | `pitch` | `1` | Playback rate multiplier (`1` = normal speed/pitch). |\n * | `volume` | `1` | Linear gain in `[0, 1]`. |\n * | `positional` | `false` | When `true`, audio is spatialized using the entity's transform. |\n * | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |\n * | `distanceModel` | `\"inverse\"` | WebAudio distance model (`linear`, `inverse`, `exponential`). |\n * | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. |\n */\n options: typeof DEFAULT_AUDIO_OPTIONS;\n /** Live three.js object hosting the audio (a parented `Audio`/`PositionalAudio`). `null` until built. */\n object: THREE.Object3D | null;\n /** Live three.js audio source. `null` until built. Recreated when the project loads. */\n audio: THREE.Audio<GainNode> | THREE.PositionalAudio | null;\n\n /**\n * Whether the audio should be playing. Managed by `AudioSystem` in preview.\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link play} / {@link stop}.\n */\n declare isPlaying: boolean;\n\n /**\n * Whether the audio is paused mid-playback (position is preserved).\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link pause} / {@link play} / {@link stop}.\n */\n declare isPaused: boolean;\n\n constructor(\n path: string,\n options: Partial<typeof DEFAULT_AUDIO_OPTIONS> = {},\n ) {\n super();\n this.path = path;\n this.options = {\n ...DEFAULT_AUDIO_OPTIONS,\n ...options,\n };\n this.object = null;\n this.audio = null;\n\n // Runtime-only playback state. Non-enumerable so these values are never\n // written into save data, debug snapshots, or undo history.\n Object.defineProperty(this, \"isPlaying\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(this, \"isPaused\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n\n /**\n * Signals `AudioSystem` to start (or resume) playback.\n * Has no direct effect in the editor — `AudioSystem` drives the actual\n * THREE.js call in preview.\n */\n play(): void {\n this.isPlaying = true;\n this.isPaused = false;\n }\n\n /**\n * Signals `AudioSystem` to pause playback, preserving the current position.\n * Calling {@link play} afterwards resumes from where it paused.\n * No-op if not currently playing.\n */\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n /**\n * Signals `AudioSystem` to stop playback and reset the playback position.\n */\n stop(): void {\n this.isPlaying = false;\n this.isPaused = false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Skybox rendering modes. `none` disables skybox rendering entirely. */\nexport type EnvironmentSkyboxType = \"gradient\" | \"color\" | \"image\" | \"none\";\n/** Gradient distribution applied when {@link EnvironmentSkyboxState.type} is `\"gradient\"`. */\nexport type EnvironmentGradientEffect = \"radial\" | \"linear\" | \"angular\";\n/** Fog distance models. `none` disables fog. */\nexport type EnvironmentFogType = \"linear\" | \"exponential\" | \"none\";\n\n/** Skybox configuration. Only the fields relevant to {@link type} are read at render time. */\nexport type EnvironmentSkyboxState = {\n /** Active skybox mode. */\n type: EnvironmentSkyboxType;\n /** Solid color used when {@link type} is `\"color\"`. `#rrggbb`. */\n color: string;\n /** URL or `localasset://` path of the equirectangular image used when {@link type} is `\"image\"`. */\n imageUrl?: string;\n /** Gradient parameters used when {@link type} is `\"gradient\"`. */\n gradient: {\n /** Ordered list of color stops as `#rrggbb` strings. */\n colors: string[];\n /** Gradient distribution. */\n effect: EnvironmentGradientEffect;\n };\n};\n\n/** Fog configuration. Mirrors three.js `Fog` / `FogExp2`. */\nexport type EnvironmentFogState = {\n /** Active fog model. */\n type: EnvironmentFogType;\n /** Fog color as `#rrggbb`. */\n color: string;\n /** Linear-fog parameters used when {@link type} is `\"linear\"`. */\n linear: {\n /** Distance at which fog begins to take effect. */\n near: number;\n /** Distance at which fog reaches full opacity. */\n far: number;\n };\n /** Exponential-fog parameters used when {@link type} is `\"exponential\"`. */\n exponential: {\n /** Density coefficient. Higher values produce thicker fog. */\n density: number;\n };\n};\n\n/** World gravity vector applied by the physics system, in world units per second squared. */\nexport type EnvironmentGravityState = {\n /** Gravity along world X. */\n x: number;\n /** Gravity along world Y (negative pulls objects down). */\n y: number;\n /** Gravity along world Z. */\n z: number;\n};\n\n/** Aggregated authoring state owned by {@link Environment}. */\nexport type EnvironmentState = {\n /** Skybox configuration. */\n skybox: EnvironmentSkyboxState;\n /** Fog configuration. */\n fog: EnvironmentFogState;\n /** World gravity. */\n gravity: EnvironmentGravityState;\n /**\n * Fixed timestep (seconds) used by the physics accumulator loop.\n * Physics is stepped in fixed increments of this size each frame.\n * Default is `0.02` (50 Hz).\n */\n fixedTimeStep: number;\n};\n\nexport const DEFAULT_ENVIRONMENT_STATE: EnvironmentState = {\n skybox: {\n type: \"none\",\n color: \"#1e1e1e\",\n imageUrl: \"\",\n gradient: {\n colors: [\"#464766\", \"#657ea6\", \"#0f0e1a\"],\n effect: \"linear\",\n },\n },\n fog: {\n type: \"none\",\n color: \"#1e1e1e\",\n linear: {\n near: 1,\n far: 100,\n },\n exponential: {\n density: 0.002,\n },\n },\n gravity: {\n x: 0,\n y: -9.81,\n z: 0,\n },\n fixedTimeStep: 0.02,\n};\n\nfunction normalizeColors(colors: unknown): string[] {\n if (!Array.isArray(colors)) {\n return [...DEFAULT_ENVIRONMENT_STATE.skybox.gradient.colors];\n }\n\n const normalized = colors.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0,\n );\n if (normalized.length === 0) {\n return [...DEFAULT_ENVIRONMENT_STATE.skybox.gradient.colors];\n }\n\n return normalized;\n}\n\nfunction normalizeGradientEffect(value: unknown): EnvironmentGradientEffect {\n if (value === \"radial\" || value === \"linear\" || value === \"angular\") {\n return value;\n }\n\n return DEFAULT_ENVIRONMENT_STATE.skybox.gradient.effect;\n}\n\nfunction normalizeSkyboxType(value: unknown): EnvironmentSkyboxType {\n if (value === \"gradient\" || value === \"color\" || value === \"none\") {\n return value;\n }\n\n if (value === \"image\" || value === \"Image\") {\n return \"image\";\n }\n\n return DEFAULT_ENVIRONMENT_STATE.skybox.type;\n}\n\nfunction normalizeFogType(value: unknown): EnvironmentFogType {\n if (value === \"linear\" || value === \"exponential\" || value === \"none\") {\n return value;\n }\n\n return DEFAULT_ENVIRONMENT_STATE.fog.type;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n\n return value;\n}\n\n/**\n * Scene environment settings: skybox (gradient/color/image), fog\n * (linear/exponential), and gravity vector for the physics world.\n * Singleton-style — attached to one environment entity per scene.\n *\n * Use `world.getEnvironmentComponent()` to access this component directly\n * from a Behaviour script. Mutate `values` to change settings at runtime;\n * `EnvironmentSyncSystem` applies the changes on the next frame.\n *\n * @category Components\n */\nexport class Environment extends Component {\n /** Aggregated environment authoring state (skybox, fog, gravity). Saved with the project. */\n values: EnvironmentState;\n\n constructor(values?: Partial<EnvironmentState>) {\n super();\n\n const skybox = values?.skybox;\n const fog = values?.fog;\n const gravity = values?.gravity;\n this.values = {\n skybox: {\n type: normalizeSkyboxType(skybox?.type),\n color:\n typeof skybox?.color === \"string\"\n ? skybox.color\n : DEFAULT_ENVIRONMENT_STATE.skybox.color,\n imageUrl:\n typeof skybox?.imageUrl === \"string\"\n ? skybox.imageUrl\n : DEFAULT_ENVIRONMENT_STATE.skybox.imageUrl,\n gradient: {\n colors: normalizeColors(skybox?.gradient?.colors),\n effect: normalizeGradientEffect(skybox?.gradient?.effect),\n },\n },\n fog: {\n type: normalizeFogType(fog?.type),\n color:\n typeof fog?.color === \"string\"\n ? fog.color\n : DEFAULT_ENVIRONMENT_STATE.fog.color,\n linear: {\n near: toFiniteNumber(\n fog?.linear?.near,\n DEFAULT_ENVIRONMENT_STATE.fog.linear.near,\n ),\n far: toFiniteNumber(\n fog?.linear?.far,\n DEFAULT_ENVIRONMENT_STATE.fog.linear.far,\n ),\n },\n exponential: {\n density: toFiniteNumber(\n fog?.exponential?.density,\n DEFAULT_ENVIRONMENT_STATE.fog.exponential.density,\n ),\n },\n },\n gravity: {\n x: toFiniteNumber(gravity?.x, DEFAULT_ENVIRONMENT_STATE.gravity.x),\n y: toFiniteNumber(gravity?.y, DEFAULT_ENVIRONMENT_STATE.gravity.y),\n z: toFiniteNumber(gravity?.z, DEFAULT_ENVIRONMENT_STATE.gravity.z),\n },\n fixedTimeStep: toFiniteNumber(\n values?.fixedTimeStep,\n DEFAULT_ENVIRONMENT_STATE.fixedTimeStep,\n ),\n };\n }\n}\n","import { Component } from \"../Component\";\n\n/** Aggregated post-processing effect chain authored on the scene environment. Each sub-effect has its own `enabled` flag plus per-effect parameters. */\nexport type PostprocessingState = {\n /** Master toggle. When `false` no post-processing is applied even if individual effects are enabled. */\n postEnabled: boolean;\n /** Depth-of-field (bokeh) effect. */\n dof: {\n /** Enable the effect. */\n enabled: boolean;\n /** Distance to the focal plane in world units. */\n focusDistance: number;\n /** Lens focal length controlling depth-of-field strength. */\n focalLength: number;\n /** Bokeh blur kernel scale. */\n bokehScale: number;\n };\n /** Bloom (HDR glow) effect. */\n bloom: {\n /** Enable the effect. */\n enabled: boolean;\n /** Strength of the bloom contribution. */\n intensity: number;\n /** Luminance threshold above which pixels bloom. */\n threshold: number;\n /** Blur radius applied to the bloom buffer. */\n radius: number;\n };\n /** Vignette (corner darkening) effect. */\n vignette: {\n /** Enable the effect. */\n enabled: boolean;\n /** Distance from screen center where the vignette begins. */\n offset: number;\n /** Maximum darkness applied at screen edges. */\n darkness: number;\n };\n /** Chromatic aberration (RGB channel offset) effect. */\n chromAberration: {\n /** Enable the effect. */\n enabled: boolean;\n /** Horizontal channel offset. */\n offsetX: number;\n /** Vertical channel offset. */\n offsetY: number;\n };\n /** Film-noise overlay. */\n noise: {\n /** Enable the effect. */\n enabled: boolean;\n /** Opacity of the noise layer in `[0, 1]`. */\n opacity: number;\n };\n /** Pixelation (mosaic) effect. */\n pixelation: {\n /** Enable the effect. */\n enabled: boolean;\n /** Pixel block size in screen pixels. */\n granularity: number;\n };\n /** Tone-mapping exposure control. */\n toneMapping: {\n /** Enable the effect. */\n enabled: boolean;\n /** Exposure multiplier applied before tone-mapping. */\n exposure: number;\n };\n /** Hue/saturation color grading. */\n hueSaturation: {\n /** Enable the effect. */\n enabled: boolean;\n /** Hue rotation in radians. */\n hue: number;\n /** Saturation offset (`0` = unchanged, `>0` = more saturated). */\n saturation: number;\n };\n /** Sepia color grade. */\n sepia: {\n /** Enable the effect. */\n enabled: boolean;\n /** Blend strength between original and sepia in `[0, 1]`. */\n intensity: number;\n };\n /** SMAA antialiasing pass. */\n smaa: {\n /** Enable the effect. */\n enabled: boolean;\n };\n /** Screen-space ambient occlusion. */\n ssao: {\n /** Enable the effect. */\n enabled: boolean;\n /** Strength of the AO contribution. */\n intensity: number;\n /** Sampling radius in world units. */\n radius: number;\n };\n /** Dot-screen (halftone) effect. */\n dotScreen: {\n /** Enable the effect. */\n enabled: boolean;\n /** Pattern scale (legacy field; use {@link scale} where available). */\n dotScreenScale: number;\n /** Pattern rotation in radians (legacy field; use {@link angle} where available). */\n dotScreenAngle: number;\n /** Pattern rotation in radians. */\n angle?: number;\n /** Pattern scale. */\n scale?: number;\n /** Three.js blend function override. */\n blendFunction?: number;\n /** Effect opacity in `[0, 1]`. */\n opacity?: number;\n };\n /** Glitch effect (digital corruption simulation). */\n glitch: {\n /** Enable the effect. */\n enabled: boolean;\n /** Three.js blend function override. */\n blendFunction?: number;\n /** RGB channel offset applied during a glitch burst. */\n chromaticAberrationOffset?: { x: number; y: number } | [number, number];\n /** `[min, max]` delay (seconds) between glitch bursts. */\n delay?: [number, number];\n /** `[min, max]` duration (seconds) of each glitch burst. */\n duration?: [number, number];\n /** Glitch displacement strength (scalar or per-axis). */\n strength?: number | { x: number; y: number };\n /** Size of the displacement texture sampled by the glitch shader. */\n dtSize?: number;\n /** Fraction of columns affected during a glitch burst. */\n columns?: number;\n /** Ratio between weak and strong glitch bursts. */\n ratio?: number;\n /** Glitch mode label (matches the postprocessing library's mode enum). */\n mode?: string;\n /** Force the glitch to remain active. */\n active?: boolean;\n };\n};\n\nexport const DEFAULT_POSTPROCESSING_STATE: PostprocessingState = {\n postEnabled: false,\n dof: {\n enabled: false,\n focusDistance: 0.015,\n focalLength: 0.018,\n bokehScale: 3,\n },\n bloom: {\n enabled: false,\n intensity: 1.2,\n threshold: 0.2,\n radius: 0.7,\n },\n vignette: {\n enabled: false,\n offset: 0.05,\n darkness: 1.2,\n },\n chromAberration: {\n enabled: false,\n offsetX: 0.003,\n offsetY: 0.003,\n },\n noise: {\n enabled: false,\n opacity: 0.12,\n },\n pixelation: {\n enabled: false,\n granularity: 6,\n },\n toneMapping: {\n enabled: false,\n exposure: 1.3,\n },\n hueSaturation: {\n enabled: false,\n hue: 0.05,\n saturation: 0.2,\n },\n sepia: {\n enabled: false,\n intensity: 0.5,\n },\n smaa: {\n enabled: false,\n },\n ssao: {\n enabled: false,\n intensity: 1.5,\n radius: 0.25,\n },\n dotScreen: {\n enabled: false,\n dotScreenScale: 1.2,\n dotScreenAngle: 1.57,\n scale: 1.2,\n angle: 1.57,\n blendFunction: undefined,\n opacity: undefined,\n },\n glitch: {\n enabled: false,\n blendFunction: undefined,\n chromaticAberrationOffset: undefined,\n delay: undefined,\n duration: undefined,\n strength: undefined,\n dtSize: undefined,\n columns: undefined,\n ratio: undefined,\n mode: undefined,\n active: undefined,\n },\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n\n return value;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== \"boolean\") {\n return fallback;\n }\n\n return value;\n}\n\nfunction normalizeNumberTuple(value: unknown): [number, number] | undefined {\n if (!Array.isArray(value) || value.length !== 2) {\n return undefined;\n }\n\n if (\n typeof value[0] !== \"number\" ||\n !Number.isFinite(value[0]) ||\n typeof value[1] !== \"number\" ||\n !Number.isFinite(value[1])\n ) {\n return undefined;\n }\n\n return [value[0], value[1]];\n}\n\nfunction normalizePostprocessing(\n value: Partial<PostprocessingState> | undefined,\n): PostprocessingState {\n const postprocessing = asRecord(value);\n const defaults = DEFAULT_POSTPROCESSING_STATE;\n\n const dof = asRecord(postprocessing?.dof);\n const bloom = asRecord(postprocessing?.bloom);\n const vignette = asRecord(postprocessing?.vignette);\n const chromAberration = asRecord(postprocessing?.chromAberration);\n const noise = asRecord(postprocessing?.noise);\n const pixelation = asRecord(postprocessing?.pixelation);\n const toneMapping = asRecord(postprocessing?.toneMapping);\n const hueSaturation = asRecord(postprocessing?.hueSaturation);\n const sepia = asRecord(postprocessing?.sepia);\n const smaa = asRecord(postprocessing?.smaa);\n const ssao = asRecord(postprocessing?.ssao);\n const dotScreen = asRecord(postprocessing?.dotScreen);\n const glitch = asRecord(postprocessing?.glitch);\n const glitchChromaticAberrationOffset = asRecord(\n glitch?.chromaticAberrationOffset,\n );\n const glitchStrength = asRecord(glitch?.strength);\n\n const dotScreenScale = toFiniteNumber(\n dotScreen?.dotScreenScale,\n defaults.dotScreen.dotScreenScale,\n );\n const dotScreenAngle = toFiniteNumber(\n dotScreen?.dotScreenAngle,\n defaults.dotScreen.dotScreenAngle,\n );\n\n const normalizedGlitchStrength =\n typeof glitch?.strength === \"number\" && Number.isFinite(glitch.strength)\n ? glitch.strength\n : glitchStrength &&\n typeof glitchStrength.x === \"number\" &&\n Number.isFinite(glitchStrength.x) &&\n typeof glitchStrength.y === \"number\" &&\n Number.isFinite(glitchStrength.y)\n ? { x: glitchStrength.x, y: glitchStrength.y }\n : undefined;\n\n const normalizedGlitchChromaticAberrationOffset =\n normalizeNumberTuple(glitch?.chromaticAberrationOffset) ??\n (glitchChromaticAberrationOffset &&\n typeof glitchChromaticAberrationOffset.x === \"number\" &&\n Number.isFinite(glitchChromaticAberrationOffset.x) &&\n typeof glitchChromaticAberrationOffset.y === \"number\" &&\n Number.isFinite(glitchChromaticAberrationOffset.y)\n ? {\n x: glitchChromaticAberrationOffset.x,\n y: glitchChromaticAberrationOffset.y,\n }\n : undefined);\n\n return {\n postEnabled: toBoolean(postprocessing?.postEnabled, defaults.postEnabled),\n dof: {\n enabled: toBoolean(dof?.enabled, defaults.dof.enabled),\n focusDistance: toFiniteNumber(dof?.focusDistance, defaults.dof.focusDistance),\n focalLength: toFiniteNumber(dof?.focalLength, defaults.dof.focalLength),\n bokehScale: toFiniteNumber(dof?.bokehScale, defaults.dof.bokehScale),\n },\n bloom: {\n enabled: toBoolean(bloom?.enabled, defaults.bloom.enabled),\n intensity: toFiniteNumber(bloom?.intensity, defaults.bloom.intensity),\n threshold: toFiniteNumber(bloom?.threshold, defaults.bloom.threshold),\n radius: toFiniteNumber(bloom?.radius, defaults.bloom.radius),\n },\n vignette: {\n enabled: toBoolean(vignette?.enabled, defaults.vignette.enabled),\n offset: toFiniteNumber(vignette?.offset, defaults.vignette.offset),\n darkness: toFiniteNumber(vignette?.darkness, defaults.vignette.darkness),\n },\n chromAberration: {\n enabled: toBoolean(chromAberration?.enabled, defaults.chromAberration.enabled),\n offsetX: toFiniteNumber(chromAberration?.offsetX, defaults.chromAberration.offsetX),\n offsetY: toFiniteNumber(chromAberration?.offsetY, defaults.chromAberration.offsetY),\n },\n noise: {\n enabled: toBoolean(noise?.enabled, defaults.noise.enabled),\n opacity: toFiniteNumber(noise?.opacity, defaults.noise.opacity),\n },\n pixelation: {\n enabled: toBoolean(pixelation?.enabled, defaults.pixelation.enabled),\n granularity: toFiniteNumber(pixelation?.granularity, defaults.pixelation.granularity),\n },\n toneMapping: {\n enabled: toBoolean(toneMapping?.enabled, defaults.toneMapping.enabled),\n exposure: toFiniteNumber(toneMapping?.exposure, defaults.toneMapping.exposure),\n },\n hueSaturation: {\n enabled: toBoolean(hueSaturation?.enabled, defaults.hueSaturation.enabled),\n hue: toFiniteNumber(hueSaturation?.hue, defaults.hueSaturation.hue),\n saturation: toFiniteNumber(\n hueSaturation?.saturation,\n defaults.hueSaturation.saturation,\n ),\n },\n sepia: {\n enabled: toBoolean(sepia?.enabled, defaults.sepia.enabled),\n intensity: toFiniteNumber(sepia?.intensity, defaults.sepia.intensity),\n },\n smaa: {\n enabled: toBoolean(smaa?.enabled, defaults.smaa.enabled),\n },\n ssao: {\n enabled: toBoolean(ssao?.enabled, defaults.ssao.enabled),\n intensity: toFiniteNumber(ssao?.intensity, defaults.ssao.intensity),\n radius: toFiniteNumber(ssao?.radius, defaults.ssao.radius),\n },\n dotScreen: {\n enabled: toBoolean(dotScreen?.enabled, defaults.dotScreen.enabled),\n dotScreenScale,\n dotScreenAngle,\n scale: toFiniteNumber(dotScreen?.scale, dotScreenScale),\n angle: toFiniteNumber(dotScreen?.angle, dotScreenAngle),\n blendFunction:\n typeof dotScreen?.blendFunction === \"number\" &&\n Number.isFinite(dotScreen.blendFunction)\n ? dotScreen.blendFunction\n : defaults.dotScreen.blendFunction,\n opacity:\n typeof dotScreen?.opacity === \"number\" && Number.isFinite(dotScreen.opacity)\n ? dotScreen.opacity\n : defaults.dotScreen.opacity,\n },\n glitch: {\n enabled: toBoolean(glitch?.enabled, defaults.glitch.enabled),\n blendFunction:\n typeof glitch?.blendFunction === \"number\" && Number.isFinite(glitch.blendFunction)\n ? glitch.blendFunction\n : defaults.glitch.blendFunction,\n chromaticAberrationOffset:\n normalizedGlitchChromaticAberrationOffset,\n delay: normalizeNumberTuple(glitch?.delay) ?? defaults.glitch.delay,\n duration: normalizeNumberTuple(glitch?.duration) ?? defaults.glitch.duration,\n strength: normalizedGlitchStrength,\n dtSize:\n typeof glitch?.dtSize === \"number\" && Number.isFinite(glitch.dtSize)\n ? glitch.dtSize\n : defaults.glitch.dtSize,\n columns:\n typeof glitch?.columns === \"number\" && Number.isFinite(glitch.columns)\n ? glitch.columns\n : defaults.glitch.columns,\n ratio:\n typeof glitch?.ratio === \"number\" && Number.isFinite(glitch.ratio)\n ? glitch.ratio\n : defaults.glitch.ratio,\n mode: typeof glitch?.mode === \"string\" ? glitch.mode : defaults.glitch.mode,\n active: toBoolean(glitch?.active, defaults.glitch.active ?? false),\n },\n };\n}\n\n/**\n * Postprocessing stack settings (depth-of-field, bloom, vignette, chromatic\n * aberration, noise, pixelation, tone mapping, hue/saturation, sepia, SMAA,\n *\n * Use `world.getPostprocessingComponent()` to access this component directly\n * from a Behaviour script. Mutate `values` to toggle effects or adjust\n * parameters at runtime; `PostprocessingSyncSystem` applies changes next frame.\n * SSAO, dot-screen, glitch). The render system applies enabled effects in a\n * `postprocessing`-library composer when `postEnabled` is `true`. Singleton-\n * style — attached to one entity per scene.\n *\n * @category Components\n */\nexport class Postprocessing extends Component {\n /** Aggregated post-processing state. Saved with the project. */\n values: PostprocessingState;\n\n constructor(values?: Partial<PostprocessingState>) {\n super();\n this.values = normalizePostprocessing(values);\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Editable primitive kinds the mesh-geometry system can rebuild on the fly. `model` is a passthrough placeholder for entities that own a loaded GLTF/GLB instead. */\nexport type EditableMeshObjectKind =\n | \"capsule\"\n | \"cube\"\n | \"cylinder\"\n | \"model\"\n | \"plane\"\n | \"sphere\";\n\n/** Box geometry parameters in world units. */\nexport type CubeMeshParameters = {\n /** Box width along X. */\n width: number;\n /** Box height along Y. */\n height: number;\n /** Box depth along Z. */\n depth: number;\n};\n\n/** Plane geometry parameters in world units. */\nexport type PlaneMeshParameters = {\n /** Plane width along X. */\n width: number;\n /** Plane height along Y. */\n height: number;\n};\n\n/** Radius-only primitive parameters (sphere). */\nexport type RadiusMeshParameters = {\n /** Sphere radius in world units. */\n radius: number;\n};\n\n/** Radius + height primitive parameters (capsule, cylinder). */\nexport type RadiusHeightMeshParameters = {\n /** Radius of the cap/cylinder cross-section. */\n radius: number;\n /** Length of the straight section between caps (capsule) or full height (cylinder). */\n height: number;\n};\n\n/** Empty parameter set for `model` entities. */\nexport type ModelMeshParameters = Record<string, never>;\n\n/** Map from {@link EditableMeshObjectKind} to its parameter shape. */\nexport type MeshGeometryParametersByKind = {\n capsule: RadiusHeightMeshParameters;\n cube: CubeMeshParameters;\n cylinder: RadiusHeightMeshParameters;\n model: ModelMeshParameters;\n plane: PlaneMeshParameters;\n sphere: RadiusMeshParameters;\n};\n\nexport type MeshGeometryParameters =\n MeshGeometryParametersByKind[EditableMeshObjectKind];\n\nexport const DEFAULT_MESH_GEOMETRY_PARAMETERS: MeshGeometryParametersByKind = {\n capsule: { radius: 0.5, height: 1 },\n cube: { width: 1, height: 1, depth: 1 },\n cylinder: { radius: 0.5, height: 1 },\n model: {},\n plane: { width: 100, height: 100 },\n sphere: { radius: 0.5 },\n};\n\nconst GEOMETRY_TYPE_BY_KIND: Record<EditableMeshObjectKind, string> = {\n capsule: \"CapsuleGeometry\",\n cube: \"BoxGeometry\",\n cylinder: \"CylinderGeometry\",\n model: \"Model\",\n plane: \"PlaneGeometry\",\n sphere: \"SphereGeometry\",\n};\n\n/**\n * Editable geometry parameters for primitive meshes (cube, sphere, plane,\n * capsule, cylinder) and the placeholder for `model` entities. Holds the\n * authoring values plus shadow casting/receiving flags. The mesh-geometry\n * system rebuilds the underlying `BufferGeometry` when parameters change.\n *\n * @category Components\n */\nexport class MeshGeometryComponent extends Component {\n /** Primitive kind (`cube`, `sphere`, `plane`, `capsule`, `cylinder`) or `model` for loaded assets. */\n readonly kind: EditableMeshObjectKind;\n /** Three.js geometry class name (e.g. `\"BoxGeometry\"`, `\"SphereGeometry\"`). Derived from {@link kind}. */\n readonly geometryType: string;\n /** Editable parameters whose shape depends on {@link kind}. The mesh-geometry system rebuilds geometry when these change. */\n parameters: MeshGeometryParameters;\n /** Live three.js object whose geometry is being managed. `null` until the object is built. */\n object: THREE.Object3D | null;\n /** Human-readable model name shown in the inspector for `model` entities; empty for primitives. */\n modelName: string;\n /** Whether the mesh casts shadows in the renderer. */\n castShadow: boolean;\n /** Whether the mesh receives shadows in the renderer. */\n receiveShadow: boolean;\n\n constructor(\n kind: EditableMeshObjectKind,\n object: THREE.Object3D | null,\n parameters?: Partial<MeshGeometryParameters>,\n options?: {\n modelName?: string;\n castShadow?: boolean;\n receiveShadow?: boolean;\n },\n ) {\n super();\n\n this.kind = kind;\n this.geometryType = GEOMETRY_TYPE_BY_KIND[kind];\n this.object = object;\n this.modelName = options?.modelName ?? \"\";\n this.castShadow = options?.castShadow ?? false;\n this.receiveShadow = options?.receiveShadow ?? false;\n\n switch (kind) {\n case \"cube\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n ...(parameters as Partial<CubeMeshParameters> | undefined),\n };\n break;\n case \"plane\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.plane,\n ...(parameters as Partial<PlaneMeshParameters> | undefined),\n };\n break;\n case \"sphere\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere,\n ...(parameters as Partial<RadiusMeshParameters> | undefined),\n };\n break;\n case \"cylinder\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder,\n ...(parameters as Partial<RadiusHeightMeshParameters> | undefined),\n };\n break;\n case \"capsule\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule,\n ...(parameters as Partial<RadiusHeightMeshParameters> | undefined),\n };\n break;\n case \"model\":\n this.parameters = {};\n break;\n }\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\nimport type {\n CubeMeshParameters,\n MeshGeometryParameters,\n PlaneMeshParameters,\n RadiusHeightMeshParameters,\n RadiusMeshParameters,\n} from \"./MeshGeometry\";\nimport { DEFAULT_MESH_GEOMETRY_PARAMETERS } from \"./MeshGeometry\";\n\n/**\n * Per-instance transform stored inside {@link InstancedMeshComponent}.\n * All rotations are in radians.\n */\nexport type InstanceTransform = {\n position: { x: number; y: number; z: number };\n /** Euler rotation in radians (XYZ order). */\n rotation: { x: number; y: number; z: number };\n scale: { x: number; y: number; z: number };\n};\n\n/** Primitive geometry kinds and custom 3D model kind supported by instanced mesh rendering. */\nexport type InstancedMeshKind =\n | \"capsule\"\n | \"cube\"\n | \"cylinder\"\n | \"model\"\n | \"plane\"\n | \"sphere\";\n\n/** Default identity instance transform. */\nexport const DEFAULT_INSTANCE_TRANSFORM: InstanceTransform = {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n};\n\n/** Default geometry parameters per instanced mesh kind. For \"model\" kind, cube params are stored as a placeholder (unused). */\nexport const DEFAULT_INSTANCED_MESH_PARAMETERS: Record<\n InstancedMeshKind,\n MeshGeometryParameters\n> = {\n capsule: DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule,\n cube: DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n cylinder: DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder,\n model: DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n plane: DEFAULT_MESH_GEOMETRY_PARAMETERS.plane,\n sphere: DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere,\n};\n\n/**\n * Holds authored instanced-mesh data for an entity that renders as a\n * `THREE.InstancedMesh`. Supports primitive geometry kinds (cube, sphere,\n * plane, capsule, cylinder).\n *\n * The `instancedMesh` field is a live runtime reference that is **not**\n * serialized into snapshots — it is excluded by the snapshot normalizer in\n * `worldSnapshotUtils.ts` to prevent history churn.\n *\n * @category Components\n */\nexport class InstancedMeshComponent extends Component {\n /** Geometry kind for all instances. Use `\"model\"` for a custom GLTF/GLB asset. */\n meshKind: InstancedMeshKind;\n /**\n * Path to the GLTF/GLB asset when `meshKind === \"model\"`.\n * Serialized in snapshots and restored on hydration.\n */\n modelPath: string;\n /** Editable geometry parameters (width/height/depth, radius, etc.). Ignored when `meshKind === \"model\"`. */\n meshParameters: MeshGeometryParameters;\n /** Whether all instances cast shadows. */\n castShadow: boolean;\n /** Whether all instances receive shadows. */\n receiveShadow: boolean;\n /**\n * Ordered list of entity IDs for the instance slot entities owned by this group.\n * Each slot entity carries a `TransformComponent` that `InstancedMeshSystem`\n * reads every frame to build the per-instance matrix.\n */\n instanceEntityIds: number[];\n\n /**\n * Live runtime container managed by `InstancedMeshSystem`:\n * - For primitive kinds: a `THREE.InstancedMesh`.\n * - For `\"model\"` kind: a `THREE.Group` containing per-mesh `THREE.InstancedMesh` objects.\n * Excluded from snapshot serialization — do **not** read this in hydration code.\n */\n instancedMesh: THREE.Object3D | null;\n\n constructor(\n meshKind: InstancedMeshKind = \"cube\",\n meshParameters?: Partial<MeshGeometryParameters>,\n options?: {\n castShadow?: boolean;\n receiveShadow?: boolean;\n instanceEntityIds?: number[];\n modelPath?: string;\n },\n ) {\n super();\n this.meshKind = meshKind;\n this.modelPath = options?.modelPath ?? \"\";\n this.meshParameters = {\n ...DEFAULT_INSTANCED_MESH_PARAMETERS[meshKind],\n ...(meshParameters ?? {}),\n } as MeshGeometryParameters;\n this.castShadow = options?.castShadow ?? false;\n this.receiveShadow = options?.receiveShadow ?? false;\n this.instanceEntityIds = options?.instanceEntityIds ?? [];\n this.instancedMesh = null;\n }\n\n /** Sanitize and return a copy of the current mesh parameters with valid values. */\n getSanitizedParameters(): MeshGeometryParameters {\n const MIN_DIM = 0.01;\n const MIN_RAD = 0.001;\n const sanitize = (v: number, min: number) =>\n Number.isFinite(v) ? Math.max(min, v) : min;\n\n switch (this.meshKind) {\n case \"cube\": {\n const p = this.meshParameters as CubeMeshParameters;\n return {\n width: sanitize(p.width, MIN_DIM),\n height: sanitize(p.height, MIN_DIM),\n depth: sanitize(p.depth, MIN_DIM),\n };\n }\n case \"plane\": {\n const p = this.meshParameters as PlaneMeshParameters;\n return {\n width: sanitize(p.width, MIN_DIM),\n height: sanitize(p.height, MIN_DIM),\n };\n }\n case \"sphere\": {\n const p = this.meshParameters as RadiusMeshParameters;\n return { radius: sanitize(p.radius, MIN_RAD) };\n }\n case \"cylinder\":\n case \"capsule\": {\n const p = this.meshParameters as RadiusHeightMeshParameters;\n return {\n radius: sanitize(p.radius, MIN_RAD),\n height: sanitize(p.height, MIN_DIM),\n };\n }\n case \"model\":\n // No geometry parameters for model kind; return cube defaults as a placeholder.\n return DEFAULT_MESH_GEOMETRY_PARAMETERS.cube;\n }\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Marks an entity as an instance slot owned by an {@link InstancedMeshComponent} group entity.\n *\n * Instance slot entities are lightweight data containers — they carry\n * `TransformComponent` (the per-instance local transform) and this component,\n * but do **not** have an `Object3DRef`. Their transforms are consumed each\n * frame by `InstancedMeshSystem` to compose the instance matrix.\n *\n * @category Components\n */\nexport class InstanceSlotComponent extends Component {\n /** Entity ID of the owning `instancedMesh` group entity. */\n groupEntityId: number;\n /** Zero-based index of this slot within the group's `instanceEntityIds` array. */\n slotIndex: number;\n\n constructor(groupEntityId: number, slotIndex: number) {\n super();\n this.groupEntityId = groupEntityId;\n this.slotIndex = slotIndex;\n }\n}\n","import { Component } from \"../Component\";\n\ntype RapierRigidBody = import(\"@dimforge/rapier3d-compat\").RigidBody;\ntype RapierCollider = import(\"@dimforge/rapier3d-compat\").Collider;\n\n// ---------------------------------------------------------------------------\n// Rigidbody\n// ---------------------------------------------------------------------------\n\n/**\n * Rigidbody body type:\n * - `dynamic`: simulated by physics; affected by forces and gravity.\n * - `fixed`: immovable static body.\n * - `kinematicPosition`: moved by setting next position; ignores forces.\n * - `kinematicVelocity`: moved by setting velocity; ignores forces.\n */\nexport type RigidbodyType =\n | \"dynamic\"\n | \"fixed\"\n | \"kinematicPosition\"\n | \"kinematicVelocity\";\n\n/** Authoring state for the rigidbody half of {@link PhysicsComponent}. Saved with the project. */\nexport type RigidbodyState = {\n /** When `false`, the body is removed from physics simulation but kept in state. */\n enabled: boolean;\n /** Body type. See {@link RigidbodyType}. */\n type: RigidbodyType;\n /** Mass in kilograms. Only meaningful for `dynamic` bodies. */\n mass: number;\n /** Damping applied to linear velocity each step (`0` = none). */\n linearDamping: number;\n /** Damping applied to angular velocity each step (`0` = none). */\n angularDamping: number;\n /** Scale factor applied to world gravity for this body (`1` = full gravity, `0` = floating). */\n gravityScale: number;\n /** Allow the body to sleep when at rest to save simulation cost. */\n canSleep: boolean;\n /** Enable continuous collision detection to prevent tunneling for fast bodies. */\n ccdEnabled: boolean;\n /** Master toggle: when `true`, all linear motion is locked. */\n lockTranslations: boolean;\n /** Lock translation along world X. */\n lockTranslationX: boolean;\n /** Lock translation along world Y. */\n lockTranslationY: boolean;\n /** Lock translation along world Z. */\n lockTranslationZ: boolean;\n /** Master toggle: when `true`, all rotation is locked. */\n lockRotations: boolean;\n /** Lock rotation around world X. */\n lockRotationX: boolean;\n /** Lock rotation around world Y. */\n lockRotationY: boolean;\n /** Lock rotation around world Z. */\n lockRotationZ: boolean;\n};\n\nexport const DEFAULT_RIGIDBODY_STATE: RigidbodyState = {\n enabled: true,\n type: \"dynamic\",\n mass: 1,\n linearDamping: 0,\n angularDamping: 0,\n gravityScale: 1,\n canSleep: true,\n ccdEnabled: false,\n lockTranslations: false,\n lockTranslationX: false,\n lockTranslationY: false,\n lockTranslationZ: false,\n lockRotations: false,\n lockRotationX: false,\n lockRotationY: false,\n lockRotationZ: false,\n};\n\n// ---------------------------------------------------------------------------\n// Collider\n// ---------------------------------------------------------------------------\n\n/** Collider primitive shape. `trimesh` derives geometry from the entity's mesh. */\nexport type ColliderShape =\n | \"cuboid\"\n | \"ball\"\n | \"capsule\"\n | \"cylinder\"\n | \"trimesh\";\n\n/** Authoring state for the collider half of {@link PhysicsComponent}. Only the size fields relevant to {@link ColliderState.shape} are read at simulation time. */\nexport type ColliderState = {\n /** When `false`, the collider is removed from physics simulation but kept in state. */\n enabled: boolean;\n /** Collider primitive shape. */\n shape: ColliderShape;\n /** Local offset of the collider relative to the entity's transform, in world units. */\n offsetPosition: {\n /** Offset along local X. */\n x: number;\n /** Offset along local Y. */\n y: number;\n /** Offset along local Z. */\n z: number;\n };\n /** Local rotation offset in **radians** (Euler XYZ). */\n offsetRotation: {\n /** Rotation around local X (radians). */\n x: number;\n /** Rotation around local Y (radians). */\n y: number;\n /** Rotation around local Z (radians). */\n z: number;\n };\n /** FULL edge lengths for `cuboid` shape (NOT half-extents), in unscaled local units — multiplied by the entity world scale at collider build time. */\n size: {\n /** Half-extent along X. */\n x: number;\n /** Half-extent along Y. */\n y: number;\n /** Half-extent along Z. */\n z: number;\n };\n /** Radius for `ball`, `capsule`, and `cylinder` shapes. */\n radius: number;\n /** Height for `capsule` (segment length between caps) and `cylinder`. */\n height: number;\n /** Bounciness in `[0, 1]`. `0` is no bounce; `1` is perfectly elastic. */\n restitution: number;\n /** Surface friction coefficient. `0` is frictionless. */\n friction: number;\n /** When `true`, the collider reports overlaps but does not generate contact responses. */\n isSensor: boolean;\n};\n\nexport const DEFAULT_COLLIDER_STATE: ColliderState = {\n enabled: true,\n shape: \"cuboid\",\n offsetPosition: {\n x: 0,\n y: 0,\n z: 0,\n },\n offsetRotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n size: {\n x: 1,\n y: 1,\n z: 1,\n },\n radius: 0.5,\n height: 1,\n restitution: 0,\n friction: 0.5,\n isSensor: false,\n};\n\n// ---------------------------------------------------------------------------\n// PhysicsState\n// ---------------------------------------------------------------------------\n\n/** Combined authoring state for {@link PhysicsComponent}. Saved with the project. */\nexport type PhysicsState = {\n /** Rigid body settings. */\n rigidbody: RigidbodyState;\n /** Collider settings. */\n collider: ColliderState;\n};\n\nexport const DEFAULT_PHYSICS_STATE: PhysicsState = {\n rigidbody: DEFAULT_RIGIDBODY_STATE,\n collider: DEFAULT_COLLIDER_STATE,\n};\n\n// ---------------------------------------------------------------------------\n// Normalization helpers (private)\n// ---------------------------------------------------------------------------\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n return value;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== \"boolean\") {\n return fallback;\n }\n return value;\n}\n\nfunction toRigidbodyType(value: unknown, fallback: RigidbodyType): RigidbodyType {\n if (\n value === \"dynamic\" ||\n value === \"fixed\" ||\n value === \"kinematicPosition\" ||\n value === \"kinematicVelocity\"\n ) {\n return value;\n }\n return fallback;\n}\n\nfunction toColliderShape(value: unknown, fallback: ColliderShape): ColliderShape {\n if (\n value === \"cuboid\" ||\n value === \"ball\" ||\n value === \"capsule\" ||\n value === \"cylinder\" ||\n value === \"trimesh\"\n ) {\n return value;\n }\n return fallback;\n}\n\nfunction normalizeRigidbodyState(\n value: Partial<RigidbodyState> | undefined,\n): RigidbodyState {\n const source = asRecord(value);\n const defaults = DEFAULT_RIGIDBODY_STATE;\n // Legacy: if per-axis flags are absent, fall back to master toggle value.\n const legacyLockTranslations = toBoolean(\n source?.lockTranslations,\n defaults.lockTranslations,\n );\n const legacyLockRotations = toBoolean(\n source?.lockRotations,\n defaults.lockRotations,\n );\n\n const lockTranslationX = toBoolean(\n source?.lockTranslationX,\n legacyLockTranslations,\n );\n const lockTranslationY = toBoolean(\n source?.lockTranslationY,\n legacyLockTranslations,\n );\n const lockTranslationZ = toBoolean(\n source?.lockTranslationZ,\n legacyLockTranslations,\n );\n const lockRotationX = toBoolean(source?.lockRotationX, legacyLockRotations);\n const lockRotationY = toBoolean(source?.lockRotationY, legacyLockRotations);\n const lockRotationZ = toBoolean(source?.lockRotationZ, legacyLockRotations);\n\n return {\n enabled: toBoolean(source?.enabled, defaults.enabled),\n type: toRigidbodyType(source?.type, defaults.type),\n mass: Math.max(0.0001, toFiniteNumber(source?.mass, defaults.mass)),\n linearDamping: Math.max(\n 0,\n toFiniteNumber(source?.linearDamping, defaults.linearDamping),\n ),\n angularDamping: Math.max(\n 0,\n toFiniteNumber(source?.angularDamping, defaults.angularDamping),\n ),\n gravityScale: toFiniteNumber(source?.gravityScale, defaults.gravityScale),\n canSleep: toBoolean(source?.canSleep, defaults.canSleep),\n ccdEnabled: toBoolean(source?.ccdEnabled, defaults.ccdEnabled),\n lockTranslations: legacyLockTranslations,\n lockTranslationX,\n lockTranslationY,\n lockTranslationZ,\n lockRotations: legacyLockRotations,\n lockRotationX,\n lockRotationY,\n lockRotationZ,\n };\n}\n\nfunction normalizeColliderState(\n value: Partial<ColliderState> | undefined,\n): ColliderState {\n const source = asRecord(value);\n const defaults = DEFAULT_COLLIDER_STATE;\n const offsetPosition = asRecord(source?.offsetPosition);\n const offsetRotation = asRecord(source?.offsetRotation);\n const size = asRecord(source?.size);\n\n return {\n enabled: toBoolean(source?.enabled, defaults.enabled),\n shape: toColliderShape(source?.shape, defaults.shape),\n offsetPosition: {\n x: toFiniteNumber(offsetPosition?.x, defaults.offsetPosition.x),\n y: toFiniteNumber(offsetPosition?.y, defaults.offsetPosition.y),\n z: toFiniteNumber(offsetPosition?.z, defaults.offsetPosition.z),\n },\n offsetRotation: {\n x: toFiniteNumber(offsetRotation?.x, defaults.offsetRotation.x),\n y: toFiniteNumber(offsetRotation?.y, defaults.offsetRotation.y),\n z: toFiniteNumber(offsetRotation?.z, defaults.offsetRotation.z),\n },\n size: {\n x: Math.max(0.0001, toFiniteNumber(size?.x, defaults.size.x)),\n y: Math.max(0.0001, toFiniteNumber(size?.y, defaults.size.y)),\n z: Math.max(0.0001, toFiniteNumber(size?.z, defaults.size.z)),\n },\n radius: Math.max(0.0001, toFiniteNumber(source?.radius, defaults.radius)),\n height: Math.max(0.0001, toFiniteNumber(source?.height, defaults.height)),\n restitution: Math.max(0, toFiniteNumber(source?.restitution, defaults.restitution)),\n friction: Math.max(0, toFiniteNumber(source?.friction, defaults.friction)),\n isSensor: toBoolean(source?.isSensor, defaults.isSensor),\n };\n}\n\nexport function normalizePhysicsState(\n value: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> } | undefined,\n): PhysicsState {\n const source = asRecord(value);\n return {\n rigidbody: normalizeRigidbodyState(\n (source?.rigidbody as Partial<RigidbodyState>) ?? undefined,\n ),\n collider: normalizeColliderState(\n (source?.collider as Partial<ColliderState>) ?? undefined,\n ),\n };\n}\n\n// ---------------------------------------------------------------------------\n// PhysicsComponent\n// ---------------------------------------------------------------------------\n\n/**\n * Unified physics component combining a Rapier rigid body and a Rapier\n * collider into a single authoring and runtime container.\n *\n * Use `values.rigidbody` to configure body type, mass, damping, locks, etc.\n * Use `values.collider` to configure collider shape, size, offset, material\n * properties, and sensor mode.\n *\n * The runtime `rigidBody` and `collider` references are created by the physics\n * system when the project loads and are `null` until physics is initialized.\n *\n * @category Components\n */\n/**\n * Write a live Rapier ref as a NON-ENUMERABLE own property. Always via\n * defineProperty (mirroring ScriptObjectComponent's `instance` ref): a\n * history-restored clone that dropped the original slot would otherwise get an\n * ENUMERABLE property from plain assignment, leaking Rapier objects — and for\n * trimesh their huge vertex buffers — into snapshot/history/debug walks.\n */\n/**\n * A velocity waiting to be applied to the body, in world space.\n *\n * Needed because a throw is decided while the body is still kinematic (the hand\n * was holding it), and Rapier ignores velocity on kinematic bodies. Queueing it\n * lets `PhysicsSyncSystem` apply it in the same tick it turns the body dynamic\n * again, which is the only moment the velocity actually takes.\n */\nexport type PendingBodyVelocity = {\n linear: { x: number; y: number; z: number };\n angular: { x: number; y: number; z: number };\n};\n\nexport function setPhysicsLiveRef(\n component: PhysicsComponent,\n key: \"rigidBody\" | \"collider\" | \"pendingVelocity\",\n value:\n | RapierRigidBody\n | RapierCollider\n | PendingBodyVelocity\n | null,\n): void {\n Object.defineProperty(component, key, {\n value,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n}\n\nexport class PhysicsComponent extends Component {\n /** Authoring state. Saved with the project. */\n values: PhysicsState;\n /**\n * Velocity to apply the moment this body becomes dynamic again.\n *\n * Non-enumerable, like the Rapier refs — never serialized.\n */\n pendingVelocity?: PendingBodyVelocity | null;\n /**\n * Live Rapier rigid body. `null` until physics is initialized.\n * NON-ENUMERABLE — Rapier wrappers (and, for trimesh, their vertex buffers)\n * must never leak into snapshots/history/debug walks.\n */\n declare rigidBody: RapierRigidBody | null;\n /** Live Rapier collider. `null` until physics is initialized. NON-ENUMERABLE. */\n declare collider: RapierCollider | null;\n\n constructor(values?: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> }) {\n super();\n this.values = normalizePhysicsState(values);\n setPhysicsLiveRef(this, \"rigidBody\", null);\n setPhysicsLiveRef(this, \"collider\", null);\n }\n\n /**\n * Patch rigidbody and/or collider state. Each sub-object is deep-merged\n * with the current values via the respective normalizer.\n */\n setValues(patch: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> }): void {\n this.values = normalizePhysicsState({\n rigidbody: { ...this.values.rigidbody, ...(patch.rigidbody ?? {}) },\n collider: { ...this.values.collider, ...(patch.collider ?? {}) },\n });\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Renders a 2D image as a textured quad in the scene. Width/height are in\n * world units. Texture loading is handled by the image system, which\n * populates {@link ImageComponent.texture} and {@link ImageComponent.object}\n * asynchronously.\n *\n * @category Components\n */\nexport class ImageComponent extends Component {\n /** Source URL or `localasset://` path of the image file. */\n path: string;\n /** Width of the rendered quad in world units. */\n width: number;\n /** Height of the rendered quad in world units. */\n height: number;\n /** Loaded texture, populated asynchronously by the image system. `null` until loaded. */\n texture: THREE.Texture | null;\n /** Live three.js object representing the textured quad. `null` until built. */\n object: THREE.Object3D | null;\n\n constructor(path: string, width: number = 1, height: number = 1) {\n super();\n this.path = path;\n this.width = width;\n this.height = height;\n this.texture = null;\n this.object = null;\n }\n}\n","import { Component } from \"../Component\";\nimport type * as THREE from \"three\";\n\n\n/** Single uploaded image used as input to the image-target compiler. */\nexport type ImageTargetReference = {\n /** Stable target id assigned at compile time. Referenced by {@link ImageTargetAnchor.targetId}. */\n id: number;\n /** Source image URL or `localasset://` path. */\n url: string;\n /** Image width in pixels. */\n width: number;\n /** Image height in pixels. */\n height: number;\n /** Local directory the source image is stored in (desktop projects). */\n storageDir?: string;\n /** Local file name for the source image (desktop projects). */\n fileName?: string;\n};\n\n/**\n * Image-tracking target metadata used by AR projects. Holds the source images\n * users uploaded plus the URL of the compiled `.mind` target file produced by\n * the image-target compiler. Pair with {@link ImageTargetAnchor} on child\n * entities that should appear when the target is detected.\n *\n * @category Components\n */\nexport class ImageTarget extends Component {\n /** Source images that were combined into the compiled `.mind` target. */\n targets: ImageTargetReference[];\n /** URL of the compiled `.mind` target file. Set after the image-target compiler finishes. */\n compiledTargetUrl?: string;\n /** Directory containing the compiled `.mind` file (desktop projects). */\n compiledTargetDir?: string;\n /** Optional preview texture used in the editor viewport. `null` when not assigned. */\n texture: THREE.Texture | null;\n /** Optional preview object placed in the editor viewport. `null` when not assigned. */\n object: THREE.Object3D | null;\n\n constructor(options?: {\n targets?: ImageTargetReference[];\n compiledTargetUrl?: string;\n compiledTargetDir?: string;\n }, texture?: THREE.Texture, object?: THREE.Object3D) {\n super();\n this.targets = options?.targets ?? [];\n this.compiledTargetUrl = options?.compiledTargetUrl;\n this.compiledTargetDir = options?.compiledTargetDir;\n this.texture = texture ?? null;\n this.object = object ?? null;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Authoring state for {@link LightComponent}. Common fields apply to every light kind; the optional fields are only meaningful for specific kinds. */\ntype LightValueState = {\n /** Light color as `#rrggbb` hex string. */\n color: string;\n /** Light intensity multiplier (units depend on three.js physically-correct mode). */\n intensity: number;\n /** Whether the light casts shadows. */\n castShadow: boolean;\n /** Whether the light is frustum-culled when off-screen. */\n frustumCulling: boolean;\n /** Maximum range; `0` means infinite. (PointLight, SpotLight) */\n distance?: number;\n /** Falloff exponent for distance attenuation. (PointLight, SpotLight) */\n decay?: number;\n /** Cone half-angle in **radians**. (SpotLight) */\n angle?: number;\n /** Soft-edge factor in `[0, 1]`; `0` is a hard edge. (SpotLight) */\n penumbra?: number;\n /** Rectangle width in world units. (RectAreaLight) */\n width?: number;\n /** Rectangle height in world units. (RectAreaLight) */\n height?: number;\n};\n\nfunction toHexColor(value: THREE.Color): string {\n return `#${value.getHexString()}`;\n}\n\nfunction createValueState(light: THREE.Light): LightValueState {\n const base: LightValueState = {\n color: toHexColor(light.color),\n intensity: light.intensity,\n castShadow: (light as THREE.Light & { castShadow?: boolean }).castShadow ?? false,\n frustumCulling: light.frustumCulled,\n };\n\n if (light instanceof THREE.PointLight) {\n base.distance = light.distance;\n base.decay = light.decay;\n } else if (light instanceof THREE.SpotLight) {\n base.distance = light.distance;\n base.decay = light.decay;\n base.angle = light.angle;\n base.penumbra = light.penumbra;\n } else if (light instanceof THREE.RectAreaLight) {\n base.width = light.width;\n base.height = light.height;\n }\n\n return base;\n}\n\n/**\n * Light source attached to an entity. `type` selects the underlying three.js\n * light class (directional, point, spot, ambient, hemisphere, rect-area).\n * `values` carries authoring state including color, intensity, and\n * type-specific fields (distance, decay, angle, penumbra, width, height).\n *\n * @category Components\n */\nexport class LightComponent extends Component {\n /** Live three.js light placed in the scene. Recreated when the project loads. */\n light: THREE.Light;\n /** Three.js class name of the light (e.g. `\"DirectionalLight\"`, `\"PointLight\"`, `\"SpotLight\"`). */\n type: string;\n /** Serialized authoring state. Saved with the project. */\n values: LightValueState;\n\n constructor(light: THREE.Light) {\n super();\n this.light = light;\n this.type = light.type;\n this.values = createValueState(light);\n }\n\n setValues(patch: Partial<LightValueState>): void {\n this.values = {\n ...this.values,\n ...patch,\n };\n }\n}\n\nexport type { LightValueState };\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Supported material classes. Each maps to a three.js `Mesh*Material` type. */\ntype MaterialTypeValue = \"standard\" | \"basic\" | \"phong\" | \"physical\";\n/** Texture sampling mode. `smooth` uses linear filtering; `sharp` uses nearest filtering for pixel-art look. */\ntype TextureFilteringValue = \"smooth\" | \"sharp\";\n\n/** Authoring state for a single slot in {@link MaterialComponent.values}. Mirrors the live three.js material so it can be re-applied when the project loads. */\ntype MaterialValueState = {\n /** Underlying material class. */\n type: MaterialTypeValue;\n /** Base color as `#rrggbb` hex string. */\n color: string;\n /** PBR roughness in `[0, 1]`. */\n roughness: number;\n /** PBR metalness in `[0, 1]`. */\n metalness: number;\n /** Multiplier applied to the normal map (uniform on both axes). */\n normalScale: number;\n /** Surface opacity in `[0, 1]`. Combine with {@link transparent} to enable alpha. */\n opacity: number;\n /** Emissive color as `#rrggbb` hex string. */\n emissive: string;\n /** Emissive intensity multiplier. */\n emissiveIntensity: number;\n /** Three.js `Side` enum value (`FrontSide`, `BackSide`, or `DoubleSide`). */\n side: number;\n /** Three.js `Blending` enum value. */\n blending: number;\n /** Whether depth testing is enabled. */\n depthTest: boolean;\n /** Whether depth writes are enabled. */\n depthWrite: boolean;\n /** Render as wireframe. */\n wireframe: boolean;\n /** Enable transparency (must be `true` for {@link opacity} < 1 to render correctly). */\n transparent: boolean;\n /** Color/diffuse texture URL. */\n textureMap?: string;\n /** Alpha (transparency) texture URL. */\n alphaTextureMap?: string;\n /** Tangent-space normal map URL. */\n normalMap?: string;\n /** Roughness map URL (red channel). */\n roughnessMap?: string;\n /** Metalness map URL (red channel). */\n metalnessMap?: string;\n /** Ambient occlusion map URL. */\n aoMap?: string;\n /** Emissive color map URL. */\n emissiveMap?: string;\n /** Bump map URL (height-based shading approximation). */\n bumpMap?: string;\n /** Displacement map URL (geometric vertex offset). */\n displacementMap?: string;\n /** Pre-baked light map URL. */\n lightMap?: string;\n /** Environment reflection map URL. */\n envMap?: string;\n /** Texture sampling mode applied to the color map. */\n textureFiltering: TextureFilteringValue;\n /** Whether mipmaps are generated for texture maps. */\n useMipmaps: boolean;\n};\n\nfunction toHexColor(value: unknown, fallback: string): string {\n if (\n value &&\n typeof value === \"object\" &&\n typeof (value as { getHexString?: () => string }).getHexString ===\n \"function\"\n ) {\n try {\n return `#${(value as { getHexString: () => string }).getHexString()}`;\n } catch {\n return fallback;\n }\n }\n\n return fallback;\n}\n\nfunction getMaterialType(material: THREE.Material): MaterialTypeValue {\n if (material instanceof THREE.MeshPhysicalMaterial) {\n return \"physical\";\n }\n\n if (material instanceof THREE.MeshPhongMaterial) {\n return \"phong\";\n }\n\n if (material instanceof THREE.MeshBasicMaterial) {\n return \"basic\";\n }\n\n return \"standard\";\n}\n\n/** Shape we read off a decoded texture image. */\ntype TextureImageLike = { src?: unknown; currentSrc?: unknown };\n\n/**\n * A texture's source URL, read from its decoded image.\n *\n * `THREE.Texture.image` is deliberately untyped by three (it can be an\n * HTMLImageElement, ImageBitmap, canvas, video, …), so narrow it here once\n * rather than at each of the dozen texture slots below.\n */\nfunction textureImageSrc(\n texture: THREE.Texture | null | undefined,\n): string | undefined {\n const src = (texture?.image as TextureImageLike | undefined)?.src;\n return typeof src === \"string\" ? src : undefined;\n}\n\n/**\n * Same, but preferring the browser-resolved `source.data.currentSrc` when it is\n * available (the colour map is the one slot that can be backed by an element\n * whose `src` is still relative).\n */\nfunction textureSourceUrl(\n texture: THREE.Texture | null | undefined,\n): string | undefined {\n if (!texture?.image) {\n return undefined;\n }\n const currentSrc = (\n texture.source as { data?: TextureImageLike } | undefined\n )?.data?.currentSrc;\n if (typeof currentSrc === \"string\" && currentSrc) {\n return currentSrc;\n }\n return textureImageSrc(texture);\n}\n\nfunction createMaterialValue(material: THREE.Material): MaterialValueState {\n const materialRecord = material as unknown as Record<string, unknown>;\n const normalScale = materialRecord.normalScale as\n | { x?: number; y?: number }\n | undefined;\n const map = materialRecord.map as THREE.Texture | undefined;\n\n return {\n type: getMaterialType(material),\n color: toHexColor(materialRecord.color, \"#ffffff\"),\n roughness:\n typeof materialRecord.roughness === \"number\" ? materialRecord.roughness : 0.5,\n metalness:\n typeof materialRecord.metalness === \"number\" ? materialRecord.metalness : 0.5,\n normalScale:\n typeof normalScale?.x === \"number\" ? normalScale.x : 1,\n opacity: typeof materialRecord.opacity === \"number\" ? materialRecord.opacity : 1,\n emissive: toHexColor(materialRecord.emissive, \"#000000\"),\n emissiveIntensity:\n typeof materialRecord.emissiveIntensity === \"number\"\n ? materialRecord.emissiveIntensity\n : 0,\n side: typeof materialRecord.side === \"number\" ? materialRecord.side : THREE.FrontSide,\n blending:\n typeof materialRecord.blending === \"number\"\n ? materialRecord.blending\n : THREE.NormalBlending,\n depthTest: materialRecord.depthTest !== false,\n depthWrite: materialRecord.depthWrite !== false,\n wireframe: Boolean(materialRecord.wireframe),\n transparent: Boolean(materialRecord.transparent),\n textureMap: textureSourceUrl(map),\n alphaTextureMap: textureImageSrc(\n materialRecord.alphaMap as THREE.Texture | undefined,\n ),\n normalMap: textureImageSrc(\n materialRecord.normalMap as THREE.Texture | undefined,\n ),\n roughnessMap: textureImageSrc(\n materialRecord.roughnessMap as THREE.Texture | undefined,\n ),\n metalnessMap: textureImageSrc(\n materialRecord.metalnessMap as THREE.Texture | undefined,\n ),\n aoMap: textureImageSrc(materialRecord.aoMap as THREE.Texture | undefined),\n emissiveMap: textureImageSrc(\n materialRecord.emissiveMap as THREE.Texture | undefined,\n ),\n bumpMap: textureImageSrc(\n materialRecord.bumpMap as THREE.Texture | undefined,\n ),\n displacementMap: textureImageSrc(\n materialRecord.displacementMap as THREE.Texture | undefined,\n ),\n lightMap: textureImageSrc(\n materialRecord.lightMap as THREE.Texture | undefined,\n ),\n envMap: textureImageSrc(materialRecord.envMap as THREE.Texture | undefined),\n textureFiltering:\n map?.magFilter === THREE.NearestFilter ? \"sharp\" : \"smooth\",\n useMipmaps: map?.generateMipmaps !== false,\n };\n}\n\nexport function defaultMaterialValue(): MaterialValueState {\n return {\n type: \"standard\",\n color: \"#ffffff\",\n roughness: 0.5,\n metalness: 0.5,\n normalScale: 1,\n opacity: 1,\n emissive: \"#000000\",\n emissiveIntensity: 0,\n side: THREE.FrontSide,\n blending: THREE.NormalBlending,\n depthTest: true,\n depthWrite: true,\n wireframe: false,\n transparent: false,\n textureFiltering: \"smooth\",\n useMipmaps: true,\n };\n}\n\n/**\n * Material catalog for an entity. Tracks the live three.js materials\n * (`materials`, `material`) plus serialized authoring state (`values[]`)\n * mirrored from the inspector. Supports `standard`, `basic`, `phong`, and\n * `physical` PBR types with optional texture map slots.\n *\n * @remarks\n * Use `setMaterials`, `updateValue`, `setMaterialType`, `setTextureFiltering`,\n * and `setUseMipmaps` to mutate state — these keep `values[]` and the live\n * three.js materials in sync. Texture URLs use the `localasset://` protocol\n * inside the editor.\n *\n * @category Components\n */\nexport class MaterialComponent extends Component {\n /** Live three.js materials currently bound to the entity's mesh (one per submesh). */\n materials: THREE.Material[];\n /** Convenience reference to `materials[0]`. `null` when no material is assigned. */\n material: THREE.Material | null;\n /** Serialized authoring state (one entry per material in {@link materials}). Saved with the project. */\n values: MaterialValueState[];\n /**\n * Editor-managed material-asset linkage, one entry per slot (parallel to\n * {@link values}). A `localasset://` URL of a `.material` asset file, or\n * `null`/absent for a local (unlinked) material. The editor materializes the\n * asset's values into {@link values} and keeps them in sync when the asset\n * is edited — rendering and the runtime read only {@link values} and ignore\n * this field. Saved with the project; survives material rebinds.\n */\n assetRefs: (string | null)[];\n\n constructor(materialOrMaterials: THREE.Material | THREE.Material[] = []) {\n super();\n\n this.materials = [];\n this.material = null;\n this.values = [];\n this.assetRefs = [];\n this.setMaterials(materialOrMaterials);\n }\n\n /** Link/unlink a slot to a material asset URL (editor bookkeeping only). */\n setAssetRef(index: number, url: string | null): void {\n if (index < 0) {\n return;\n }\n while (this.assetRefs.length <= index) {\n this.assetRefs.push(null);\n }\n this.assetRefs[index] = url;\n }\n\n /** The material-asset URL a slot is linked to, or null when local. */\n getAssetRef(index: number): string | null {\n return this.assetRefs[index] ?? null;\n }\n\n setMaterials(\n materialOrMaterials: THREE.Material | THREE.Material[] = [],\n ): void {\n this.materials = Array.isArray(materialOrMaterials)\n ? materialOrMaterials.filter(Boolean)\n : materialOrMaterials\n ? [materialOrMaterials]\n : [];\n\n this.material = this.materials[0] ?? null;\n this.values =\n this.materials.length > 0\n ? this.materials.map((material) => createMaterialValue(material))\n : [defaultMaterialValue()];\n }\n\n updateValue(index: number, patch: Partial<MaterialValueState>): void {\n if (index < 0) {\n return;\n }\n\n while (this.values.length <= index) {\n this.values.push(defaultMaterialValue());\n }\n\n this.values[index] = {\n ...this.values[index],\n ...patch,\n };\n }\n\n resetValue(index: number): void {\n if (index < 0) {\n return;\n }\n\n while (this.values.length <= index) {\n this.values.push(defaultMaterialValue());\n }\n\n const type = this.values[index]?.type ?? \"standard\";\n this.values[index] = {\n ...defaultMaterialValue(),\n type,\n };\n }\n\n setMaterialType(index: number, type: MaterialTypeValue): void {\n this.updateValue(index, { type });\n }\n\n setTextureFiltering(index: number, filtering: TextureFilteringValue): void {\n this.updateValue(index, { textureFiltering: filtering });\n }\n\n setUseMipmaps(index: number, enabled: boolean): void {\n this.updateValue(index, { useMipmaps: enabled });\n }\n}\n\nexport type { MaterialTypeValue, MaterialValueState, TextureFilteringValue };\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * References a GLTF/GLB asset loaded from `path`. The model loading system\n * resolves the asset asynchronously and populates {@link ModelComponent.object}\n * once available; loading is deferred-tolerant so the entity exists before\n * the model finishes loading.\n *\n * @category Components\n */\nexport class ModelComponent extends Component {\n /** Source URL or `localasset://` path of the GLTF/GLB asset. */\n path: string;\n /** Loaded model object, populated asynchronously by the model loader. `null` until loaded. */\n object: THREE.Object3D | null;\n\n constructor(path: string) {\n super();\n this.path = path;\n this.object = null;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Human-readable name for an entity. Shown in the editor hierarchy panel and\n * preserved across save/reload.\n *\n * @category Components\n */\nexport class Name extends Component {\n /** Display name for the entity. Shown in the editor hierarchy. */\n value: string;\n\n constructor(value: string) {\n super();\n this.value = value;\n }\n}\n","import { Component } from \"../Component\";\n\nconst generateInstanceId = (): string => {\n try {\n return crypto.randomUUID();\n } catch {\n // Non-secure-context fallback — uniqueness within a document is enough.\n return `i-${Math.random().toString(36).slice(2, 10)}${Date.now().toString(36)}`;\n }\n};\n\n/**\n * Marks the ROOT entity of a prefab instance and records its link to the\n * source `.prefab` asset plus the instance's per-property overrides.\n *\n * Instances may appear in a scene OR nested inside another prefab's file\n * (nested prefabs): the nested root keeps the child prefab's `PrefabNode`\n * identity AND this link. `instanceId` is a per-placement uuid that scopes\n * node identity across nesting — two nested instances of the same prefab\n * share nodeIds but never instanceIds, so override keys stay unambiguous.\n *\n * `overrides` is a flat list of encoded strings so it survives snapshot\n * serialization at any depth:\n *\n * ```\n * \"<nodeKey>|<ComponentName>|<slash/separated/path>\"\n * \"<nodeKey>|<ComponentName>|\" // empty path = whole component overridden\n * \"<nodeKey>|+node|\" // marker: node added by the HOST document\n * // inside a nested region (never deleted by\n * // file patching)\n * ```\n *\n * where `<nodeKey>` is the entity's `PrefabNode.nodeId` prefixed by the\n * `instanceId` chain of any nested instance roots between the scope root and\n * the entity (e.g. `\"9f2c…\"` for direct children, `\"<iB>/<bNode>\"` inside a\n * nested instance). Overridden paths keep their per-instance values when the\n * prefab asset is re-applied; everything else syncs from the file. The\n * instance root's Transform, Name, and ParentId are implicitly per-instance\n * and never appear here. Overrides are an editor-side concern — the runtime\n * never resolves them (scene-placed instances are fully materialized;\n * runtime spawns are fresh copies of the file).\n *\n * @category Components\n */\nexport class PrefabInstance extends Component {\n /** URL of the source `.prefab` asset (`localasset://…` inside the editor). */\n url: string;\n /** Encoded override paths — see class docs for the format. */\n overrides: string[];\n /**\n * Per-placement uuid scoping node identity across nesting. Stable for the\n * lifetime of the placement (persisted; survives applies) so override keys\n * referencing nested content stay valid.\n */\n instanceId: string;\n\n constructor(url: string, overrides: string[] = [], instanceId?: string) {\n super();\n this.url = url;\n this.overrides = overrides;\n this.instanceId =\n typeof instanceId === \"string\" && instanceId.length > 0\n ? instanceId\n : generateInstanceId();\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Stable identity for an entity that originated from a prefab asset.\n *\n * Every entity serialized into a `.prefab` file carries a `PrefabNode` with a\n * uuid `nodeId`. Hydrating the prefab (editor instantiate or runtime spawn)\n * restores the component, so each instance entity can be matched back to its\n * prefab-file counterpart regardless of live entity ids. The per-property\n * override system diffs and merges in nodeId-space.\n *\n * Node ids are unique within one prefab subtree — two instances of the same\n * prefab intentionally share nodeIds.\n *\n * @category Components\n */\nexport class PrefabNode extends Component {\n /** Stable uuid identifying this entity within its prefab definition. */\n nodeId: string;\n\n constructor(nodeId: string) {\n super();\n this.nodeId = nodeId;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * One script attached to an entity. Multiple entries may target a single\n * entity (different classes from the same or different files).\n */\nexport type ScriptEntry = {\n /** Owning entity id. */\n entityId: number;\n /** Class name exported by the script module (default export class name). */\n className: string;\n /** Compiled script URL (e.g. `localasset://.../scripts/foo.js`). */\n scriptUrl: string;\n /** When `false`, the script is skipped each frame. */\n enabled: boolean;\n /** Inspector-bound payload exposed to the script as `this.data`. */\n data: Record<string, unknown>;\n /** Last load/runtime status reported by `ScriptBehaviourSystem`. */\n runtimeState?: \"idle\" | \"loading\" | \"ready\" | \"error\";\n /** Optional human-readable status message (e.g. compile/load error). */\n runtimeMessage?: string;\n};\n\n/**\n * Component holding the list of {@link ScriptEntry | scripts} attached to an\n * entity. Loaded from the saved project; the runtime-side fields\n * (`scriptInstance`, `scriptInstances`) are non-enumerable so they never leak\n * into save data or undo history.\n *\n * @remarks\n * Authored scripts subclass {@link Behaviour}.\n *\n * @category Components\n */\nexport class ScriptComponent extends Component {\n /** Authored script entries attached to the entity. Each entry references a class by name plus its inspector field overrides. Saved with the project. */\n entries: ScriptEntry[];\n /** First live behaviour instance after compile/load. Non-enumerable, so it does not appear in save data. `null` when no script is loaded. */\n declare scriptInstance: unknown | null;\n /** Map of `entityId` to its compiled behaviour instance (one entry per script bound to the entity). Non-enumerable, so it does not appear in save data. */\n declare scriptInstances: Map<number, unknown>;\n\n constructor(entries: ScriptEntry[] = []) {\n super();\n\n this.entries = entries.map((entry) => ({\n entityId: typeof entry.entityId === \"number\" ? entry.entityId : 0,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data && typeof entry.data === \"object\" && !Array.isArray(entry.data)\n ? (entry.data as Record<string, unknown>)\n : {},\n runtimeState: entry.runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\" ? entry.runtimeMessage : undefined,\n }));\n\n // Runtime-only reference used by ScriptBehaviourSystem.\n // Keep non-enumerable so snapshots/history/hydration payloads remain stable.\n Object.defineProperty(this, \"scriptInstance\", {\n value: null,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n\n // Runtime-only map of all entry instances keyed by entryIndex.\n // Non-enumerable for the same reason as scriptInstance.\n Object.defineProperty(this, \"scriptInstances\", {\n value: new Map<number, unknown>(),\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n","import { Component } from \"../Component\";\nimport type { ScriptObject } from \"../ScriptObject\";\n\nexport type ScriptObjectRuntimeState = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type ScriptObjectComponentInput = Partial<{\n /** Compiled script URL (e.g. `localasset://.../scripts/foo.js`). */\n scriptUrl: string | null;\n /** Class name exported by the script module. */\n className: string | null;\n /** When `false`, the script object is not built/ticked. */\n enabled: boolean;\n /** Inspector-bound payload exposed to the script as `this.data`. */\n data: Record<string, unknown>;\n /** Last load/build status reported by `ScriptObjectSystem`. */\n runtimeState: ScriptObjectRuntimeState;\n /** Optional human-readable status message (e.g. compile/build error). */\n runtimeMessage: string;\n}>;\n\n/**\n * Component for a **script object** — a single {@link ScriptObject} whose\n * THREE.js visual is built by user code and runs in the editor AND at runtime.\n * Unlike {@link ScriptComponent} this holds ONE script (not an entries array).\n * The live instance ref is non-enumerable so it never leaks into save data or\n * undo history.\n *\n * @category Components\n */\nexport class ScriptObjectComponent extends Component {\n scriptUrl: string | null;\n className: string | null;\n enabled: boolean;\n data: Record<string, unknown>;\n runtimeState: ScriptObjectRuntimeState;\n runtimeMessage?: string;\n /** Live ScriptObject instance. Non-enumerable — never enters snapshots/history. */\n declare instance: unknown | null;\n\n constructor(input: ScriptObjectComponentInput = {}) {\n super();\n\n this.scriptUrl =\n typeof input.scriptUrl === \"string\" && input.scriptUrl.length > 0\n ? input.scriptUrl\n : null;\n this.className =\n typeof input.className === \"string\" && input.className.length > 0\n ? input.className\n : null;\n this.enabled = typeof input.enabled === \"boolean\" ? input.enabled : true;\n this.data =\n input.data && typeof input.data === \"object\" && !Array.isArray(input.data)\n ? (input.data as Record<string, unknown>)\n : {};\n this.runtimeState =\n input.runtimeState === \"idle\" ||\n input.runtimeState === \"loading\" ||\n input.runtimeState === \"ready\" ||\n input.runtimeState === \"error\"\n ? input.runtimeState\n : \"idle\";\n this.runtimeMessage =\n typeof input.runtimeMessage === \"string\" ? input.runtimeMessage : undefined;\n\n // Runtime-only reference used by ScriptObjectSystem. Non-enumerable so\n // snapshots/history/hydration payloads remain stable.\n Object.defineProperty(this, \"instance\", {\n value: null,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Toggles whether the editor selection system can pick this entity. When\n * `enabled` is `false`, the entity is excluded from raycast hit tests.\n *\n * @category Components\n */\nexport class Selectable extends Component {\n /** When `false`, the editor selection raycaster ignores this entity. */\n enabled: boolean;\n\n constructor(enabled = true) {\n super();\n this.enabled = enabled;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Camera-facing 2D sprite. Unlike {@link ImageComponent}, sprites use\n * `THREE.Sprite` and always render as billboards.\n *\n * @category Components\n */\nexport class SpriteComponent extends Component {\n /** Source URL or `localasset://` path of the sprite image. */\n path: string;\n /** Width of the sprite in world units. */\n width: number;\n /** Height of the sprite in world units. */\n height: number;\n /** Loaded texture, populated asynchronously. `null` until loaded. */\n texture: THREE.Texture | null;\n /** Live `THREE.Sprite` placed in the scene. `null` until built. */\n object: THREE.Sprite | null;\n\n constructor(path: string, width: number = 1, height: number = 1) {\n super();\n this.path = path;\n this.width = width;\n this.height = height;\n this.texture = null;\n this.object = null;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * @internal Default options applied when no override is provided.\n */\nconst DEFAULT_VIDEO_OPTIONS = {\n autoplay: false,\n loop: true,\n volume: 1,\n width: 1,\n height: 1,\n isGreenScreen: false,\n backgroundColor: \"#00ff00\",\n similarity: 0.4,\n smoothness: 0.08,\n spill: 0.12,\n /** When `true`, the video's audio stream is spatialized using the entity's transform. */\n positional: false,\n /** Distance at which volume is unattenuated (positional only). */\n refDistance: 1,\n /** WebAudio distance model (`linear`, `inverse`, `exponential`). Positional only. */\n distanceModel: \"inverse\",\n /** How quickly volume falls off past `refDistance`. Positional only. */\n rolloffFactor: 1,\n};\n\n/**\n * Plays a video file as a texture on a quad. Supports green-screen keying\n * (`isGreenScreen`, `backgroundColor`, `similarity`, `smoothness`, `spill`).\n * The video element, texture, and material are runtime-only and re-created\n * when the project loads.\n *\n * @category Components\n */\nexport class VideoComponent extends Component {\n /** Source URL or `localasset://` path of the video file. */\n path: string;\n /**\n * Playback + green-screen options.\n *\n * | Field | Default | Description |\n * |---|---|---|\n * | `autoplay` | `false` | Start playback as soon as the video is ready. |\n * | `loop` | `true` | Loop playback indefinitely. |\n * | `volume` | `1` | Linear gain in `[0, 1]`. |\n * | `width` | `1` | Quad width in world units. |\n * | `height` | `1` | Quad height in world units. |\n * | `isGreenScreen` | `false` | Enable chroma keying using the fields below. |\n * | `backgroundColor` | `\"#00ff00\"` | Color to key out (CSS color string). |\n * | `similarity` | `0.4` | How close a pixel must be to the key to be removed (`0`–`1`). |\n * | `smoothness` | `0.08` | Soft-edge thickness around the key threshold. |\n * | `spill` | `0.12` | Amount of color spill suppression near edges. |\n * | `positional` | `false` | When `true`, the video's audio stream is spatialized using the entity's 3D position. |\n * | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |\n * | `distanceModel` | `\"inverse\"` | WebAudio distance model (`linear`, `inverse`, `exponential`). Positional only. |\n * | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. Positional only. |\n */\n options: typeof DEFAULT_VIDEO_OPTIONS;\n /** Live three.js object hosting the video quad. `null` until built. */\n object: THREE.Object3D | null;\n /** Underlying HTML video element. `null` until built. */\n videoElement: HTMLVideoElement | null;\n /** Three.js texture sampling the video element. `null` until built. */\n texture: THREE.VideoTexture | null;\n /** Material rendering the video texture (with green-screen shader when enabled). `null` until built. */\n material: THREE.Material | null;\n /**\n * THREE.js audio node connected to this video's audio stream via\n * `setMediaElementSource`. Present only in preview when the camera\n * listener is available. `null` in editor mode.\n */\n audioNode: THREE.Audio<GainNode> | THREE.PositionalAudio | null;\n\n /**\n * Whether the video should be playing. Managed by `VideoSystem` in preview.\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link play} / {@link stop}.\n */\n declare isPlaying: boolean;\n\n /**\n * Whether the video is paused mid-playback (position is preserved).\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link pause} / {@link play} / {@link stop}.\n */\n declare isPaused: boolean;\n\n constructor(\n path: string,\n options: Partial<typeof DEFAULT_VIDEO_OPTIONS> = {},\n ) {\n super();\n this.path = path;\n this.options = {\n ...DEFAULT_VIDEO_OPTIONS,\n ...options,\n };\n this.object = null;\n this.videoElement = null;\n this.texture = null;\n this.material = null;\n this.audioNode = null;\n\n // Runtime-only playback state. Non-enumerable so these values are never\n // written into save data, debug snapshots, or undo history.\n Object.defineProperty(this, \"isPlaying\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(this, \"isPaused\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n\n /**\n * Signals `VideoSystem` to start (or resume) playback.\n * Has no direct effect in the editor — `VideoSystem` drives the actual\n * HTML video element call in preview.\n */\n play(): void {\n this.isPlaying = true;\n this.isPaused = false;\n }\n\n /**\n * Signals `VideoSystem` to pause playback, preserving the current position.\n * Calling {@link play} afterwards resumes from where it paused.\n * No-op if not currently playing.\n */\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n /**\n * Signals `VideoSystem` to stop playback and reset the playback position.\n */\n stop(): void {\n this.isPlaying = false;\n this.isPaused = false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Footprint of a teleport destination. */\nexport type VrTeleportShape = \"plane\" | \"circle\";\n\n/** Optional initializer for {@link VRTeleportAreaComponent}. */\nexport type VRTeleportAreaOptions = {\n /** Disable to keep the area authored but inert. */\n enabled?: boolean;\n /** Footprint shape. */\n shape?: VrTeleportShape;\n /** Full width in metres (`plane`), or diameter (`circle`). */\n width?: number;\n /** Full depth in metres. Ignored for `circle`, which uses `width`. */\n depth?: number;\n};\n\n/**\n * Marks an entity's surface as a valid teleport destination.\n *\n * Teleport is an allow-list, not a physics query: only entities carrying an\n * enabled area can be teleported onto. That keeps destinations deliberate —\n * authors decide where the player may stand rather than discovering that every\n * collider in the scene is walkable.\n *\n * @category Components\n */\nexport class VRTeleportAreaComponent extends Component {\n /** Whether this area currently accepts teleports. */\n enabled: boolean;\n /** Footprint shape. */\n shape: VrTeleportShape;\n /** Full width in metres (diameter for `circle`). */\n width: number;\n /** Full depth in metres (unused for `circle`). */\n depth: number;\n\n constructor(options?: VRTeleportAreaOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n // \"cylinder\" was the pre-release name for this shape; normalize so scenes\n // saved before the rename still resolve to the disc they were authored as.\n const shape = options?.shape as string | undefined;\n this.shape = shape === \"cylinder\" ? \"circle\" : (options?.shape ?? \"plane\");\n this.width = options?.width ?? 10;\n this.depth = options?.depth ?? 10;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * How close the user must be to grab.\n *\n * `physical` requires the hand to actually reach the object — the honest,\n * embodied interaction. `distance` allows grabbing across the room along the\n * pointer ray, which is what makes seated and room-scale play comfortable.\n * `both` accepts either, and is the friendliest default.\n */\nexport type XrGrabReach = \"physical\" | \"distance\" | \"both\";\n\n/**\n * What a distance grab does to the object.\n *\n * `snap` brings it to the hand (Half-Life: Alyx style — good for picking things\n * up). `remote` leaves it where it is and manipulates it at range, which suits\n * large or anchored objects that would look absurd flying into your palm.\n */\nexport type XrDistanceGrabBehavior = \"snap\" | \"remote\";\n\n/**\n * Which gesture grabs the object.\n *\n * `pinch` maps to the primary action (trigger / finger pinch), `full` to the\n * grip squeeze (whole-hand close). Distinguishing them lets a scene mix\n * precise pickups with firm grabs — a chess piece versus a suitcase handle.\n */\nexport type XrGrabGesture = \"any\" | \"pinch\" | \"full\";\n\n/**\n * A hand-hold authored on the object.\n *\n * Without attach points a hand grabs wherever it happens to touch, which is\n * right for a ball and wrong for a rifle — a weapon has a grip and a foregrip,\n * and the hands belong on those exact spots. `role` is what lets an author say\n * \"this is the trigger hand's hold\" so a two-hand grab assembles correctly no\n * matter which hand arrives first.\n */\nexport type XrAttachPoint = {\n /** Stable id; referenced by scripts and by the inspector list. */\n id: string;\n name: string;\n /** Object-local position of the hold (unscaled). */\n position: { x: number; y: number; z: number };\n /** Object-local orientation of the hold, radians. */\n rotation: { x: number; y: number; z: number };\n /** Restrict to one hand, or `any`. */\n hand: \"left\" | \"right\" | \"any\";\n /** Whether this hold is the anchoring hand, the steering hand, or either. */\n role: \"primary\" | \"secondary\" | \"any\";\n};\n\n/**\n * How many hands may hold the object at once, and what a second grab does.\n *\n * `single` is a plain pickup. `handOff` lets the other hand TAKE it — the\n * everyday gesture of passing something between your hands. `two` keeps both\n * hands on it, which is what enables aiming a two-handed weapon and\n * pull-apart scaling.\n */\nexport type XrGrabHands = \"single\" | \"handOff\" | \"two\";\n\n/** How the second hand affects orientation. See `solveTwoHandTransform`. */\nexport type XrTwoHandRotation = \"align\" | \"primary\";\n\n/**\n * What an object does when a pointer lands on it.\n *\n * Hover feedback is what tells the user the ray has actually caught something —\n * without it, aiming at a grabbable object and aiming at empty space look\n * identical.\n */\nexport type XrHoverBehavior = \"none\" | \"color\" | \"scale\" | \"both\";\n\n/** Optional initializer for {@link XRInteractableComponent}. */\nexport type XRInteractableOptions = {\n enabled?: boolean;\n grabbable?: boolean;\n pointable?: boolean;\n grabReach?: XrGrabReach;\n distanceBehavior?: XrDistanceGrabBehavior;\n grabGesture?: XrGrabGesture;\n /** Metres within which a `physical` grab registers. */\n grabRadius?: number;\n /** Where the object sits relative to the hand once held. */\n grabOffsetPosition?: { x: number; y: number; z: number };\n /** Orientation offset, in radians. */\n grabOffsetRotation?: { x: number; y: number; z: number };\n /** How many hands may hold it, and whether a second grab transfers it. */\n grabHands?: XrGrabHands;\n /** Whether the second hand aims the object or only scales it. */\n twoHandRotation?: XrTwoHandRotation;\n /** Let a two-hand grab resize the object by moving the hands apart. */\n allowTwoHandScale?: boolean;\n /** Smallest fraction of its size a single scaling gesture may reach. */\n minScale?: number;\n /** Largest multiple of its size a single scaling gesture may reach. */\n maxScale?: number;\n /** Authored hand-holds. Empty means grab anywhere. */\n attachPoints?: XrAttachPoint[];\n /** Hand the object the velocity it was moving with when released. */\n applyVelocityOnRelease?: boolean;\n /** Scales released velocity; >1 makes throws feel stronger than real life. */\n velocityScale?: number;\n /** Feedback shown while a pointer is on the object. */\n hoverBehavior?: XrHoverBehavior;\n /** Outline colour used by the `color` and `both` behaviours. */\n hoverColor?: string;\n /** Size multiplier used by the `scale` and `both` behaviours. */\n hoverScale?: number;\n};\n\n/**\n * Makes an entity respond to XR pointers and hands.\n *\n * Split into `pointable` and `grabbable` because they are different\n * affordances: a wall panel should receive select events without being\n * liftable, while a physics prop should be both.\n *\n * @category Components\n */\nexport class XRInteractableComponent extends Component {\n enabled: boolean;\n grabbable: boolean;\n pointable: boolean;\n /** Whether the object can be grabbed up close, at range, or either. */\n grabReach: XrGrabReach;\n /** What a distance grab does — bring it here, or manipulate it in place. */\n distanceBehavior: XrDistanceGrabBehavior;\n /** Which gesture grabs it. */\n grabGesture: XrGrabGesture;\n /** Metres within which a physical grab registers. */\n grabRadius: number;\n /** Position offset from the hand while held. */\n grabOffsetPosition: { x: number; y: number; z: number };\n /** Rotation offset (radians) while held. */\n grabOffsetRotation: { x: number; y: number; z: number };\n /** How many hands may hold it, and whether a second grab transfers it. */\n grabHands: XrGrabHands;\n /** Whether the second hand aims the object or only scales it. */\n twoHandRotation: XrTwoHandRotation;\n /** Whether a two-hand grab may resize the object. */\n allowTwoHandScale: boolean;\n /** Scale floor for one gesture, as a fraction of the size at grab time. */\n minScale: number;\n /** Scale ceiling for one gesture, as a multiple of the size at grab time. */\n maxScale: number;\n /** Authored hand-holds; empty means grab anywhere. */\n attachPoints: XrAttachPoint[];\n /**\n * Hand the object the velocity it was moving with when released.\n *\n * Applies to every release, not just a deliberate throw — letting go while\n * your hand drifts should nudge the object, which is why this is not called\n * \"throw\".\n */\n applyVelocityOnRelease: boolean;\n /** Multiplier on released velocity. */\n velocityScale: number;\n /** Feedback shown while a pointer is on the object. */\n hoverBehavior: XrHoverBehavior;\n /** Outline colour for the `color` and `both` behaviours. */\n hoverColor: string;\n /** Size multiplier for the `scale` and `both` behaviours. */\n hoverScale: number;\n\n constructor(options?: XRInteractableOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n this.grabbable = options?.grabbable ?? true;\n this.pointable = options?.pointable ?? true;\n this.grabReach = options?.grabReach ?? \"both\";\n this.distanceBehavior = options?.distanceBehavior ?? \"snap\";\n this.grabGesture = options?.grabGesture ?? \"any\";\n this.grabRadius = options?.grabRadius ?? 0.15;\n this.grabOffsetPosition = options?.grabOffsetPosition ?? {\n x: 0,\n y: 0,\n z: 0,\n };\n this.grabOffsetRotation = options?.grabOffsetRotation ?? {\n x: 0,\n y: 0,\n z: 0,\n };\n this.grabHands = options?.grabHands ?? \"handOff\";\n this.twoHandRotation = options?.twoHandRotation ?? \"align\";\n this.allowTwoHandScale = options?.allowTwoHandScale ?? false;\n this.minScale = options?.minScale ?? 0.25;\n this.maxScale = options?.maxScale ?? 4;\n this.attachPoints = (options?.attachPoints ?? []).map((point) =>\n createAttachPoint(point),\n );\n this.applyVelocityOnRelease = options?.applyVelocityOnRelease ?? true;\n this.velocityScale = options?.velocityScale ?? 1;\n this.hoverBehavior = options?.hoverBehavior ?? \"color\";\n // Matches the teleport arc and pointer ray, so XR feedback reads as one\n // visual language rather than three unrelated accents.\n this.hoverColor = options?.hoverColor ?? \"#4da3ff\";\n this.hoverScale = options?.hoverScale ?? 1.06;\n }\n}\n\n/** An attach point with every field populated, for the editor and AI tools. */\nexport function createAttachPoint(\n partial: Partial<XrAttachPoint> & { id: string },\n): XrAttachPoint {\n return {\n id: partial.id,\n name: partial.name ?? partial.id,\n position: { x: 0, y: 0, z: 0, ...partial.position },\n rotation: { x: 0, y: 0, z: 0, ...partial.rotation },\n hand: partial.hand ?? \"any\",\n role: partial.role ?? \"any\",\n };\n}\n","import { Component } from \"../Component\";\n\n/**\n * Where the headset's origin sits in the scene.\n *\n * `floor` maps to the WebXR `local-floor` reference space: Y=0 is the user's\n * real floor, so content authored standing on the ground lines up naturally.\n * `eye` maps to `local`: Y=0 is wherever the headset was when the session\n * started, which suits seated/cockpit experiences.\n *\n * Getting this wrong is the classic \"I spawned inside/under the geometry\" bug —\n * with `eye`, a scene authored floor-relative places the user's eyes at ground\n * level, sinking them through the floor.\n */\nexport type XrTrackingOrigin = \"floor\" | \"eye\";\n\n/** How the player moves through the scene in an immersive session. */\nexport type XrLocomotionMode = \"teleport\" | \"smooth\" | \"none\";\n\n/** Optional initializer for {@link XRRigComponent}. */\nexport type XRRigOptions = {\n /** Where the headset origin sits. Defaults to `floor`. */\n trackingOrigin?: XrTrackingOrigin;\n /** Movement style. Defaults to `teleport` — the most comfort-safe option. */\n locomotion?: XrLocomotionMode;\n /** Metres/second for `smooth` locomotion. */\n moveSpeed?: number;\n /** Rotate in fixed steps instead of continuously (greatly reduces nausea). */\n snapTurn?: boolean;\n /** Degrees per snap-turn step. */\n snapTurnDegrees?: number;\n /** Height in metres used when the device reports no floor-relative space. */\n fallbackEyeHeight?: number;\n /** Teleport arc colour when it lands somewhere valid. */\n teleportArcColor?: string;\n /** Teleport arc colour when it lands nowhere teleportable. */\n teleportArcInvalidColor?: string;\n /** Teleport arc thickness (diameter), metres. */\n teleportArcThickness?: number;\n};\n\n/**\n * Marks an entity as the XR rig — the player's movable origin.\n *\n * The rig exists because a WebXR headset owns the camera pose absolutely: three\n * composes the render camera as `rig.matrixWorld × headPose`, so the ONLY way\n * to move the player is to move the camera's parent. The camera entity must be\n * a child of this entity.\n *\n * Defaults are deliberately comfort-first — teleport locomotion with snap\n * turning is the combination least likely to cause motion sickness, and is what\n * every platform's design guidance recommends as the baseline.\n *\n * @category Components\n */\nexport class XRRigComponent extends Component {\n /** Where the headset origin sits (floor-relative vs eye-relative). */\n trackingOrigin: XrTrackingOrigin;\n /** Movement style. */\n locomotion: XrLocomotionMode;\n /** Metres/second for `smooth` locomotion. */\n moveSpeed: number;\n /** Rotate in fixed steps rather than continuously. */\n snapTurn: boolean;\n /** Degrees per snap-turn step. */\n snapTurnDegrees: number;\n /** Eye height fallback for devices without a floor-relative reference space. */\n fallbackEyeHeight: number;\n /** Teleport arc colour when it lands somewhere valid. */\n teleportArcColor: string;\n /** Teleport arc colour when it lands nowhere teleportable. */\n teleportArcInvalidColor: string;\n /** Teleport arc thickness (diameter), metres. */\n teleportArcThickness: number;\n\n constructor(options?: XRRigOptions) {\n super();\n this.trackingOrigin = options?.trackingOrigin ?? \"floor\";\n this.locomotion = options?.locomotion ?? \"teleport\";\n this.moveSpeed = options?.moveSpeed ?? 2;\n this.snapTurn = options?.snapTurn ?? true;\n this.snapTurnDegrees = options?.snapTurnDegrees ?? 30;\n this.fallbackEyeHeight = options?.fallbackEyeHeight ?? 1.6;\n this.teleportArcColor = options?.teleportArcColor ?? \"#4da3ff\";\n this.teleportArcInvalidColor = options?.teleportArcInvalidColor ?? \"#ff5a5a\";\n // Thicker than the pointer ray: the arc is viewed at a distance and\n // against the floor, where a thin line disappears.\n this.teleportArcThickness = options?.teleportArcThickness ?? 0.012;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * What is rendered at the user's hands.\n *\n * `both` is the honest default for a cross-device build: a Quest user may put\n * controllers down and switch to hands mid-session, and Android XR leads with\n * hands while Quest/Pico lead with controllers. Rendering whichever the device\n * currently reports avoids shipping a build that shows nothing on half the\n * hardware. `none` hands presentation entirely to the author's own meshes.\n */\n/**\n * When the pointer ray is drawn.\n *\n * `interacting` (default) shows it only while the hand is pointing at something\n * it could act on, so the scene isn't permanently criss-crossed with rays\n * implying everything is clickable. `always` suits scenes built around pointing.\n */\nexport type XrRayVisibility = \"always\" | \"interacting\" | \"never\";\n\nexport type XrInteractorType = \"hands\" | \"controllers\" | \"both\" | \"none\";\n\n/**\n * Look applied to tracked-hand meshes.\n *\n * Presets exist because hand rendering is the single most visible surface of a\n * VR experience and hand-authoring a shader for it is a big ask — but `custom`\n * is always available for authors who want full control.\n */\nexport type XrHandPreset =\n | \"default\"\n | \"ghost\"\n | \"neon\"\n | \"skeleton\"\n | \"custom\";\n\n/** Which hand a child interactor entity follows. */\nexport type XrInteractorSide = \"left\" | \"right\";\n\n/** Optional initializer for {@link XRInteractorComponent}. */\nexport type XRInteractorOptions = {\n /** What to render at the hands. */\n interactorType?: XrInteractorType;\n /** Look for tracked-hand meshes. */\n handPreset?: XrHandPreset;\n /** Tint applied by the preset (and by `custom`). */\n handColor?: string;\n /** 0-1; `ghost` leans on this. */\n handOpacity?: number;\n /** Emissive strength, used by `neon`. */\n handEmissiveIntensity?: number;\n /** Draw the aim ray from each hand. */\n /** When the pointer ray is drawn. */\n rayVisibility?: XrRayVisibility;\n /** Pointer ray colour. */\n rayColor?: string;\n /** Pointer ray thickness (diameter), metres. */\n rayThickness?: number;\n};\n\n/**\n * Configures what the user sees as their hands, and hosts custom hand content.\n *\n * An interactor entity owns two children — a left and a right interactor —\n * whose transforms are driven by the corresponding tracked hand. Anything an\n * author parents under those children renders at that hand, which is how custom\n * tools, gloves, or held props are built without any scripting.\n *\n * @category Components\n */\nexport class XRInteractorComponent extends Component {\n /** What to render at the hands. */\n interactorType: XrInteractorType;\n /** Look for tracked-hand meshes. */\n handPreset: XrHandPreset;\n /** Tint applied by the preset. */\n handColor: string;\n /** 0-1 opacity for translucent presets. */\n handOpacity: number;\n /** Emissive strength for glowing presets. */\n handEmissiveIntensity: number;\n /** Draw the aim ray from each hand. */\n /** When the pointer ray is drawn. */\n rayVisibility: XrRayVisibility;\n /** Pointer ray colour. */\n rayColor: string;\n /** Pointer ray thickness (diameter), metres. */\n rayThickness: number;\n\n constructor(options?: XRInteractorOptions) {\n super();\n this.interactorType = options?.interactorType ?? \"both\";\n this.handPreset = options?.handPreset ?? \"default\";\n this.handColor = options?.handColor ?? \"#e8b48a\";\n this.handOpacity = options?.handOpacity ?? 1;\n this.handEmissiveIntensity = options?.handEmissiveIntensity ?? 0;\n this.rayVisibility = options?.rayVisibility ?? \"interacting\";\n this.rayColor = options?.rayColor ?? \"#4da3ff\";\n // A hairline is nearly invisible on a headset; ~6mm reads clearly without\n // obscuring what it points at.\n this.rayThickness = options?.rayThickness ?? 0.006;\n }\n}\n\n/**\n * Marks an entity as the left or right hand slot of an {@link XRInteractorComponent}.\n *\n * Its transform is driven every frame from the tracked hand, so authored\n * children ride along. Authors never set this by hand — the interactor factory\n * creates both slots.\n *\n * @category Components\n */\nexport class XRInteractorSideComponent extends Component {\n /** Which hand this slot follows. */\n side: XrInteractorSide;\n\n constructor(options?: { side?: XrInteractorSide }) {\n super();\n this.side = options?.side ?? \"left\";\n }\n}\n","import type {\n XrFinger,\n XrFingerTarget,\n XrHandPoseDefinition,\n XrHandPoseOrientation,\n} from \"./handPose\";\n\n/**\n * The stock pose library.\n *\n * Curl targets are anatomical rather than measured — no toolkit publishes its\n * numbers, they live in binary assets — so these are derived from what each\n * finger physically does in the gesture, with tolerances wide enough to survive\n * hand-to-hand variation. They are starting points: every one is editable, and\n * the pose editor exists precisely so a scene can tighten or loosen them.\n *\n * Tolerances follow a simple rule: the extremes (fully extended, fully curled)\n * get generous bands because they are far apart and unambiguous; mid-range\n * targets get tighter ones because that is where poses collide.\n */\n\n/** Comfortable slack for a finger held at an extreme. */\nconst WIDE = 0.35;\n/** Tighter band for mid-range targets, which sit closer to their neighbours. */\nconst NARROW = 0.25;\n\nconst EXTENDED: XrFingerTarget = { curl: 0.05, tolerance: WIDE };\nconst CURLED: XrFingerTarget = { curl: 0.95, tolerance: WIDE };\n/** A thumb tucked across the palm, as in a fist. */\nconst THUMB_TUCKED: XrFingerTarget = { curl: 0.7, tolerance: NARROW + 0.1 };\n/** A thumb resting alongside curled fingers without being wrapped. */\nconst THUMB_RELAXED: XrFingerTarget = { curl: 0.6, tolerance: 0.4 };\n\nfunction fingers(\n thumb: XrFingerTarget,\n index: XrFingerTarget,\n middle: XrFingerTarget,\n ring: XrFingerTarget,\n pinky: XrFingerTarget,\n): Record<XrFinger, XrFingerTarget> {\n return { thumb, index, middle, ring, pinky };\n}\n\nconst THUMB_UP: XrHandPoseOrientation = {\n axis: \"thumb\",\n direction: \"up\",\n toleranceDegrees: 45,\n};\n\nconst THUMB_DOWN: XrHandPoseOrientation = {\n axis: \"thumb\",\n direction: \"down\",\n toleranceDegrees: 45,\n};\n\n/**\n * Built-in poses, keyed by id.\n *\n * The set covers the industry consensus (fist, open palm, point, thumbs up,\n * pinch) plus the widely-requested ones the major toolkits omit — OK sign and\n * gun — and the expressive extras that read well in social VR.\n */\nexport const HAND_POSE_PRESETS: Record<string, XrHandPoseDefinition> = {\n fist: {\n id: \"fist\",\n name: \"Fist\",\n fingers: fingers(THUMB_TUCKED, CURLED, CURLED, CURLED, CURLED),\n },\n\n \"open-palm\": {\n id: \"open-palm\",\n name: \"Open Palm\",\n fingers: fingers(EXTENDED, EXTENDED, EXTENDED, EXTENDED, EXTENDED),\n },\n\n point: {\n id: \"point\",\n name: \"Point\",\n fingers: fingers(THUMB_RELAXED, EXTENDED, CURLED, CURLED, CURLED),\n },\n\n \"thumbs-up\": {\n id: \"thumbs-up\",\n name: \"Thumbs Up\",\n fingers: fingers(EXTENDED, CURLED, CURLED, CURLED, CURLED),\n orientation: THUMB_UP,\n },\n\n \"thumbs-down\": {\n id: \"thumbs-down\",\n name: \"Thumbs Down\",\n fingers: fingers(EXTENDED, CURLED, CURLED, CURLED, CURLED),\n orientation: THUMB_DOWN,\n },\n\n peace: {\n id: \"peace\",\n name: \"Peace\",\n fingers: fingers(THUMB_RELAXED, EXTENDED, EXTENDED, CURLED, CURLED),\n },\n\n pinch: {\n id: \"pinch\",\n name: \"Pinch\",\n // Curl is left loose: what defines a pinch is the tips MEETING, and people\n // pinch with wildly different amounts of finger bend.\n fingers: fingers(\n { curl: 0.5, tolerance: 0.5 },\n { curl: 0.5, tolerance: 0.5 },\n { curl: 0.5, tolerance: 0.5 },\n { curl: 0.5, tolerance: 0.5 },\n { curl: 0.5, tolerance: 0.5 },\n ),\n pinch: { finger: \"index\", target: 1, tolerance: 0.25 },\n },\n\n ok: {\n id: \"ok\",\n name: \"OK Sign\",\n // Thumb and index meet in a ring while the rest stay up — that contrast with\n // a plain pinch is the whole gesture, so the other three are constrained.\n fingers: fingers(\n { curl: 0.5, tolerance: 0.4 },\n { curl: 0.55, tolerance: 0.35 },\n EXTENDED,\n EXTENDED,\n EXTENDED,\n ),\n pinch: { finger: \"index\", target: 1, tolerance: 0.3 },\n },\n\n gun: {\n id: \"gun\",\n name: \"Gun\",\n fingers: fingers(EXTENDED, EXTENDED, CURLED, CURLED, CURLED),\n },\n\n rock: {\n id: \"rock\",\n name: \"Rock Horns\",\n fingers: fingers(THUMB_TUCKED, EXTENDED, CURLED, CURLED, EXTENDED),\n },\n\n shaka: {\n id: \"shaka\",\n name: \"Shaka\",\n fingers: fingers(EXTENDED, CURLED, CURLED, CURLED, EXTENDED),\n },\n\n \"palm-up\": {\n id: \"palm-up\",\n name: \"Palm Up\",\n fingers: fingers(EXTENDED, EXTENDED, EXTENDED, EXTENDED, EXTENDED),\n orientation: {\n axis: \"palm-normal\",\n direction: \"up\",\n toleranceDegrees: 40,\n },\n },\n};\n\n/** Preset ids, in the order the editor lists them. */\nexport const HAND_POSE_PRESET_IDS: readonly string[] =\n Object.keys(HAND_POSE_PRESETS);\n\n/**\n * A deep copy of a preset.\n *\n * Returned by value because scenes edit their poses: handing out the shared\n * object would let one scene's tweak leak into every other pose in the app.\n */\nexport function getHandPosePreset(id: string): XrHandPoseDefinition | null {\n const preset = HAND_POSE_PRESETS[id];\n if (!preset) return null;\n return cloneHandPose(preset);\n}\n\nexport function cloneHandPose(\n definition: XrHandPoseDefinition,\n): XrHandPoseDefinition {\n return {\n ...definition,\n fingers: {\n thumb: { ...definition.fingers.thumb },\n index: { ...definition.fingers.index },\n middle: { ...definition.fingers.middle },\n ring: { ...definition.fingers.ring },\n pinky: { ...definition.fingers.pinky },\n },\n pinch: definition.pinch ? { ...definition.pinch } : undefined,\n orientation: definition.orientation\n ? { ...definition.orientation }\n : undefined,\n };\n}\n\n/**\n * Build a pose from five curl values — the shape the editor's sliders and the\n * AI tools produce.\n */\nexport function handPoseFromCurls(\n id: string,\n name: string,\n curls: Record<XrFinger, number>,\n options?: {\n tolerance?: number;\n pinch?: XrHandPoseDefinition[\"pinch\"];\n orientation?: XrHandPoseOrientation;\n hand?: \"left\" | \"right\";\n },\n): XrHandPoseDefinition {\n const tolerance = options?.tolerance ?? NARROW;\n const target = (curl: number): XrFingerTarget => ({\n curl: Math.min(1, Math.max(0, curl)),\n tolerance,\n });\n\n return {\n id,\n name,\n fingers: {\n thumb: target(curls.thumb),\n index: target(curls.index),\n middle: target(curls.middle),\n ring: target(curls.ring),\n pinky: target(curls.pinky),\n },\n pinch: options?.pinch,\n orientation: options?.orientation,\n hand: options?.hand,\n };\n}\n","import { Component } from \"../Component\";\nimport type {\n XrFinger,\n XrHandPoseDefinition,\n XrHandPoseOrientation,\n} from \"../xr/handPose\";\nimport { handPoseFromCurls } from \"../xr/handPosePresets\";\n\n/**\n * One pose an entity listens for.\n *\n * A pose is either a named PRESET or a CUSTOM set of finger curls. Storing the\n * preset id rather than a copy of its numbers means a preset improved in a later\n * release reaches existing scenes, while custom poses stay pinned to exactly\n * what the author dialled in.\n */\nexport type XrHandPoseEntry = {\n /** Stable id, unique within the component. Used in Behaviour hooks. */\n id: string;\n /** Shown in the inspector and passed to scripts. */\n name: string;\n /** Preset id, or null for a custom pose. */\n preset: string | null;\n /** Per-finger curl targets, 0 extended → 1 curled. Custom poses only. */\n curls: Record<XrFinger, number>;\n /** Slack around each curl target. Larger is easier to perform. */\n tolerance: number;\n /** Which hand may trigger it; null for either. */\n hand: \"left\" | \"right\" | null;\n /** Optional direction requirement. */\n orientation: XrHandPoseOrientation | null;\n /** Seconds the pose must be held before it fires. */\n minHoldSeconds: number;\n enabled: boolean;\n};\n\nexport type XRHandPoseOptions = {\n enabled?: boolean;\n poses?: XrHandPoseEntry[];\n};\n\nexport const DEFAULT_POSE_CURLS: Record<XrFinger, number> = {\n thumb: 0,\n index: 0,\n middle: 0,\n ring: 0,\n pinky: 0,\n};\n\n/** A pose entry with every field populated, for the editor and AI tools. */\nexport function createHandPoseEntry(\n partial: Partial<XrHandPoseEntry> & { id: string },\n): XrHandPoseEntry {\n return {\n id: partial.id,\n name: partial.name ?? partial.id,\n preset: partial.preset ?? null,\n curls: { ...DEFAULT_POSE_CURLS, ...partial.curls },\n tolerance: partial.tolerance ?? 0.25,\n hand: partial.hand ?? null,\n orientation: partial.orientation ?? null,\n minHoldSeconds: partial.minHoldSeconds ?? 0.15,\n enabled: partial.enabled ?? true,\n };\n}\n\n/**\n * Resolve an entry to the definition the matcher consumes.\n *\n * Preset entries defer to the shared library but still honour the entry's own\n * hand restriction and hold time, so a scene can reuse \"thumbs up\" while\n * scoping it to one hand.\n */\nexport function handPoseDefinitionFor(\n entry: XrHandPoseEntry,\n resolvePreset: (id: string) => XrHandPoseDefinition | null,\n): XrHandPoseDefinition | null {\n if (entry.preset) {\n const preset = resolvePreset(entry.preset);\n if (!preset) return null;\n return {\n ...preset,\n id: entry.id,\n name: entry.name,\n hand: entry.hand ?? preset.hand,\n orientation: entry.orientation ?? preset.orientation,\n };\n }\n\n return handPoseFromCurls(entry.id, entry.name, entry.curls, {\n tolerance: entry.tolerance,\n orientation: entry.orientation ?? undefined,\n hand: entry.hand ?? undefined,\n });\n}\n\n/**\n * Listens for hand poses and reports them to the entity's Behaviours.\n *\n * Attached to any entity that wants to react to a gesture — the poses are\n * detected on the user's hands, not on the entity, so this is a subscription\n * rather than a property of the object itself.\n *\n * @category Components\n */\nexport class XRHandPoseComponent extends Component {\n enabled: boolean;\n poses: XrHandPoseEntry[];\n\n constructor(options?: XRHandPoseOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n this.poses = (options?.poses ?? []).map((pose) => createHandPoseEntry(pose));\n }\n}\n","const LOCAL_DRACO_DECODER_RELATIVE_PATH = \"./assets/draco/\";\nexport const DRACO_DECODER_CDN_PATH =\n \"https://www.gstatic.com/draco/versioned/decoders/1.5.7/\";\n\nlet dracoDecoderPathOverride: string | null = null;\n\n/**\n * Override where the DRACO decoder files (draco_wasm_wrapper.js,\n * draco_decoder.wasm, draco_decoder.js) are fetched from. Embedding apps\n * whose bundlers relocate this package's chunks — making the default\n * import.meta.url resolution point at a location that is never populated —\n * should call this before any model loads. The path must end with \"/\".\n * Pass null to restore the default resolution.\n */\nexport function setDracoDecoderPath(path: string | null): void {\n dracoDecoderPathOverride = path;\n}\n\nfunction isBlockedBrowserFileUrl(url: string): boolean {\n return url.startsWith(\"file://\");\n}\n\nexport function resolveDracoDecoderPath(): string {\n if (dracoDecoderPathOverride) {\n return dracoDecoderPathOverride;\n }\n\n try {\n // Prefer vendored decoder assets shipped with this package.\n const resolvedPath = new URL(\n LOCAL_DRACO_DECODER_RELATIVE_PATH,\n import.meta.url,\n ).toString();\n\n // Browser loaders cannot fetch file:// resources from package install paths.\n // Fall back to CDN decoders when bundlers emit file URLs for node_modules assets.\n if (isBlockedBrowserFileUrl(resolvedPath)) {\n return DRACO_DECODER_CDN_PATH;\n }\n\n return resolvedPath;\n } catch {\n // Fallback keeps compatibility in runtimes that cannot resolve package-relative URLs.\n return DRACO_DECODER_CDN_PATH;\n }\n}\n","import * as THREE from \"three\";\nimport { DRACOLoader } from \"three/examples/jsm/loaders/DRACOLoader.js\";\nimport { FBXLoader } from \"three/examples/jsm/loaders/FBXLoader.js\";\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nimport { AnimationComponent, ModelComponent } from \"../components\";\nimport type { AnimationComponentOptions } from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport { resolveDracoDecoderPath } from \"../utils/dracoDecoderPath\";\nimport type { World } from \"../World\";\n\ntype AnimationRuntime = {\n rootUuid: string;\n mixer: THREE.AnimationMixer;\n actions: Map<string, THREE.AnimationAction>;\n clipNameToIds: Map<string, string[]>;\n activeClipId: string | null;\n clipSignature: string;\n sourceSignature: string;\n sourceToken: number;\n importedSourceClips: Map<string, THREE.AnimationClip[]>;\n pendingSources: Set<string>;\n};\n\ntype RuntimeClipEntry = {\n id: string;\n name: string;\n clip: THREE.AnimationClip;\n};\n\ntype PendingHydratedAnimationOptions = Pick<\n AnimationComponentOptions,\n | \"paused\"\n | \"reverse\"\n | \"timeScale\"\n | \"crossFadeDuration\"\n | \"activeState\"\n | \"states\"\n | \"externalClipSources\"\n>;\n\nfunction createClipSourceLoader(): GLTFLoader {\n const loader = new GLTFLoader();\n\n try {\n const dracoLoader = new DRACOLoader();\n dracoLoader.setDecoderPath(resolveDracoDecoderPath());\n loader.setDRACOLoader(dracoLoader);\n } catch (error) {\n console.warn(\"DRACOLoader could not be configured for clip source loading.\", error);\n }\n\n return loader;\n}\n\nfunction normalizeDeltaTime(deltaTime: number): number {\n return Number.isFinite(deltaTime) ? Math.max(0, deltaTime) : 0;\n}\n\nfunction sanitizeTimeScale(timeScale: number): number {\n if (!Number.isFinite(timeScale) || Math.abs(timeScale) < 0.0001) {\n return 1;\n }\n\n return Math.abs(timeScale);\n}\n\nfunction sanitizeCrossFadeDuration(duration: number): number {\n if (!Number.isFinite(duration) || duration < 0) {\n return 0;\n }\n\n return duration;\n}\n\nfunction buildClipSignature(entries: RuntimeClipEntry[]): string {\n return entries\n .map((entry) => entry.id)\n .sort((a, b) => a.localeCompare(b))\n .join(\"|\");\n}\n\nfunction readRuntimeClipEntries(animation: AnimationComponent): RuntimeClipEntry[] {\n if (Array.isArray(animation.clipCatalog) && animation.clipCatalog.length > 0) {\n return animation.clipCatalog.map((entry) => ({\n id: entry.id,\n name: entry.name,\n clip: entry.clip,\n }));\n }\n\n if (!Array.isArray(animation.clips)) {\n return [];\n }\n\n return animation.clips\n .map((clip, index) => {\n const name = typeof clip?.name === \"string\" ? clip.name : \"\";\n if (!name) {\n return null;\n }\n\n return {\n id: `legacy:${index}:${name}`,\n name,\n clip,\n };\n })\n .filter((entry): entry is RuntimeClipEntry => entry !== null);\n}\n\nfunction normalizeClipSources(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const seen = new Set<string>();\n const sources: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\") {\n continue;\n }\n\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n sources.push(trimmed);\n }\n\n return sources;\n}\n\nfunction extractFileExtension(url: string): string {\n const clean = url.split(\"?\")[0]?.split(\"#\")[0] ?? \"\";\n const ext = clean.split(\".\").pop();\n return typeof ext === \"string\" ? ext.toLowerCase() : \"\";\n}\n\nfunction createActions(\n mixer: THREE.AnimationMixer,\n entries: RuntimeClipEntry[],\n): {\n actions: Map<string, THREE.AnimationAction>;\n clipNameToIds: Map<string, string[]>;\n} {\n const actions = new Map<string, THREE.AnimationAction>();\n const clipNameToIds = new Map<string, string[]>();\n\n for (const entry of entries) {\n if (!entry.name) {\n continue;\n }\n\n actions.set(entry.id, mixer.clipAction(entry.clip));\n\n const ids = clipNameToIds.get(entry.name) ?? [];\n ids.push(entry.id);\n clipNameToIds.set(entry.name, ids);\n }\n\n return { actions, clipNameToIds };\n}\n\nfunction stopAllActions(runtime: AnimationRuntime): void {\n runtime.actions.forEach((action) => {\n action.stop();\n });\n runtime.mixer.stopAllAction();\n runtime.activeClipId = null;\n}\n\nfunction transitionToClip(\n runtime: AnimationRuntime,\n nextClipId: string | null,\n crossFadeDuration: number,\n): void {\n if (runtime.activeClipId === nextClipId) {\n return;\n }\n\n const previousAction = runtime.activeClipId\n ? runtime.actions.get(runtime.activeClipId)\n : undefined;\n const nextAction = nextClipId ? runtime.actions.get(nextClipId) : undefined;\n\n if (!nextAction) {\n if (previousAction) {\n previousAction.stop();\n }\n runtime.activeClipId = null;\n return;\n }\n\n if (!previousAction || previousAction === nextAction) {\n nextAction.reset();\n nextAction.play();\n runtime.activeClipId = nextClipId;\n return;\n }\n\n if (crossFadeDuration > 0) {\n nextAction.reset();\n nextAction.play();\n previousAction.crossFadeTo(nextAction, crossFadeDuration, true);\n } else {\n previousAction.stop();\n nextAction.reset();\n nextAction.play();\n }\n\n runtime.activeClipId = nextClipId;\n}\n\nfunction applyActionState(\n action: THREE.AnimationAction,\n component: AnimationComponent,\n paused: boolean,\n shouldLoop: boolean,\n): void {\n const loopMode = shouldLoop ? THREE.LoopRepeat : THREE.LoopOnce;\n const repetitions = shouldLoop ? Infinity : 1;\n action.setLoop(loopMode, repetitions);\n action.clampWhenFinished = !shouldLoop;\n action.paused = paused;\n\n const direction = component.reverse ? -1 : 1;\n action.setEffectiveTimeScale(sanitizeTimeScale(component.timeScale) * direction);\n}\n\nfunction applyPendingHydratedOptions(component: AnimationComponent, runtime?: AnimationRuntime): void {\n const pending = (\n component as AnimationComponent & {\n __pendingHydratedOptions?: PendingHydratedAnimationOptions;\n }\n ).__pendingHydratedOptions;\n\n if (!pending) {\n return;\n }\n\n if (Array.isArray(pending.externalClipSources)) {\n component.setExternalClipSources(pending.externalClipSources);\n }\n\n if (!Array.isArray(component.clips) || component.clips.length === 0) {\n return;\n }\n\n if (runtime && runtime.pendingSources.size > 0) {\n return;\n }\n\n const states = Array.isArray(pending.states) ? pending.states : [];\n if (states.length > 0) {\n component.setStates(states);\n }\n\n if (typeof pending.reverse === \"boolean\") {\n component.reverse = pending.reverse;\n }\n\n if (typeof pending.timeScale === \"number\" && Number.isFinite(pending.timeScale)) {\n component.timeScale = pending.timeScale;\n }\n\n if (\n typeof pending.crossFadeDuration === \"number\" &&\n Number.isFinite(pending.crossFadeDuration)\n ) {\n component.crossFadeDuration = Math.max(0, pending.crossFadeDuration);\n }\n\n if (typeof pending.activeState === \"string\" && pending.activeState.length > 0) {\n component.setActiveState(pending.activeState, !pending.paused);\n }\n\n if (typeof pending.paused === \"boolean\") {\n if (pending.paused) {\n component.pauseState(pending.activeState ?? undefined);\n } else {\n component.playState(pending.activeState ?? undefined);\n }\n }\n\n delete (\n component as AnimationComponent & {\n __pendingHydratedOptions?: PendingHydratedAnimationOptions;\n }\n ).__pendingHydratedOptions;\n}\n\nexport class AnimationSystem implements EcsSystem {\n private readonly runtimeByEntity = new Map<number, AnimationRuntime>();\n private readonly gltfLoader = createClipSourceLoader();\n private readonly fbxLoader = new FBXLoader();\n\n private async loadClipsFromSource(sourceUrl: string): Promise<THREE.AnimationClip[]> {\n const ext = extractFileExtension(sourceUrl);\n\n if (ext === \"fbx\") {\n return new Promise((resolve, reject) => {\n this.fbxLoader.load(\n sourceUrl,\n (object) => {\n const clips = Array.isArray(object.animations) ? object.animations : [];\n resolve(clips);\n },\n undefined,\n reject,\n );\n });\n }\n\n if (ext === \"glb\" || ext === \"gltf\") {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n sourceUrl,\n (gltf) => {\n const clips = Array.isArray(gltf.animations) ? gltf.animations : [];\n resolve(clips);\n },\n undefined,\n reject,\n );\n });\n }\n\n return [];\n }\n\n private refreshExternalClipSources(\n world: World,\n entityId: number,\n animation: AnimationComponent,\n runtime: AnimationRuntime,\n ): void {\n const normalizedSources = normalizeClipSources(animation.externalClipSources);\n const sourceSignature = normalizedSources.join(\"|\");\n\n if (runtime.sourceSignature !== sourceSignature) {\n runtime.sourceSignature = sourceSignature;\n runtime.sourceToken += 1;\n runtime.pendingSources.clear();\n runtime.importedSourceClips.clear();\n animation.setImportedClips([]);\n }\n\n const sourceSet = new Set(normalizedSources);\n for (const loadedSource of runtime.importedSourceClips.keys()) {\n if (!sourceSet.has(loadedSource)) {\n runtime.importedSourceClips.delete(loadedSource);\n }\n }\n\n const mergedLoadedClips = [...runtime.importedSourceClips.values()].flat();\n animation.setImportedClips(\n normalizedSources.flatMap((sourceUrl) => {\n const clipsForSource = runtime.importedSourceClips.get(sourceUrl) ?? [];\n return clipsForSource.map((clip) => ({ clip, sourceUrl }));\n }),\n );\n\n for (const sourceUrl of normalizedSources) {\n if (\n runtime.importedSourceClips.has(sourceUrl) ||\n runtime.pendingSources.has(sourceUrl)\n ) {\n continue;\n }\n\n runtime.pendingSources.add(sourceUrl);\n const sourceToken = runtime.sourceToken;\n\n void this.loadClipsFromSource(sourceUrl)\n .then((clips) => {\n const currentRuntime = this.runtimeByEntity.get(entityId);\n if (!currentRuntime || currentRuntime.sourceToken !== sourceToken) {\n return;\n }\n\n currentRuntime.pendingSources.delete(sourceUrl);\n currentRuntime.importedSourceClips.set(sourceUrl, clips);\n\n const currentAnimation = world.getComponent(entityId, AnimationComponent);\n if (!currentAnimation) {\n return;\n }\n\n currentAnimation.setImportedClips(\n normalizedSources.flatMap((url) => {\n const clipsForSource = currentRuntime.importedSourceClips.get(url) ?? [];\n return clipsForSource.map((clip) => ({ clip, sourceUrl: url }));\n }),\n );\n })\n .catch((error) => {\n const currentRuntime = this.runtimeByEntity.get(entityId);\n if (!currentRuntime || currentRuntime.sourceToken !== sourceToken) {\n return;\n }\n\n currentRuntime.pendingSources.delete(sourceUrl);\n currentRuntime.importedSourceClips.delete(sourceUrl);\n console.warn(`Failed to load animation source: ${sourceUrl}`, error);\n });\n }\n }\n\n private release(entityId: number): void {\n const runtime = this.runtimeByEntity.get(entityId);\n if (!runtime) {\n return;\n }\n\n stopAllActions(runtime);\n this.runtimeByEntity.delete(entityId);\n }\n\n update(world: World, deltaTime: number): void {\n const entityIds = world.query(AnimationComponent, ModelComponent);\n const alive = new Set<number>(entityIds);\n\n for (const trackedEntityId of this.runtimeByEntity.keys()) {\n if (!alive.has(trackedEntityId)) {\n this.release(trackedEntityId);\n }\n }\n\n const step = normalizeDeltaTime(deltaTime);\n\n for (const entityId of entityIds) {\n const animation = world.getComponent(entityId, AnimationComponent);\n const model = world.getComponent(entityId, ModelComponent);\n const root = model?.object ?? null;\n\n if (!animation || !model || !root) {\n this.release(entityId);\n continue;\n }\n\n const existing = this.runtimeByEntity.get(entityId);\n let runtime = existing;\n\n if (!runtime || runtime.rootUuid !== root.uuid) {\n if (runtime) {\n stopAllActions(runtime);\n }\n\n const mixer = new THREE.AnimationMixer(root);\n const entries = readRuntimeClipEntries(animation);\n const indexedActions = createActions(mixer, entries);\n runtime = {\n rootUuid: root.uuid,\n mixer,\n actions: indexedActions.actions,\n clipNameToIds: indexedActions.clipNameToIds,\n activeClipId: null,\n clipSignature: buildClipSignature(entries),\n sourceSignature: \"\",\n sourceToken: 0,\n importedSourceClips: new Map<string, THREE.AnimationClip[]>(),\n pendingSources: new Set<string>(),\n };\n\n this.runtimeByEntity.set(entityId, runtime);\n }\n\n this.refreshExternalClipSources(world, entityId, animation, runtime);\n\n applyPendingHydratedOptions(animation, runtime);\n\n // Skip playback updates for invisible entities. The runtime and clip catalog\n // are still maintained so animation resumes immediately on visibility restore.\n if (!world.isEntityVisible(entityId)) {\n continue;\n }\n\n const entries = readRuntimeClipEntries(animation);\n const clipSignature = buildClipSignature(entries);\n if (runtime.clipSignature !== clipSignature) {\n stopAllActions(runtime);\n const indexedActions = createActions(runtime.mixer, entries);\n runtime.actions = indexedActions.actions;\n runtime.clipNameToIds = indexedActions.clipNameToIds;\n runtime.clipSignature = clipSignature;\n }\n\n if (runtime.actions.size === 0) {\n continue;\n }\n\n const activeState = animation.active;\n const stateClipId =\n typeof activeState?.clipId === \"string\" && activeState.clipId.length > 0\n ? activeState.clipId\n : null;\n const stateClipName = activeState?.clip.name ?? null;\n const fallbackClipId =\n stateClipName && runtime.clipNameToIds.has(stateClipName)\n ? runtime.clipNameToIds.get(stateClipName)?.[0] ?? null\n : null;\n const nextClipId =\n stateClipId && runtime.actions.has(stateClipId)\n ? stateClipId\n : fallbackClipId && runtime.actions.has(fallbackClipId)\n ? fallbackClipId\n : null;\n const hasActiveState = Boolean(activeState);\n const isPaused = hasActiveState\n ? !(activeState?.isPlaying ?? false)\n : animation.paused;\n\n if (hasActiveState) {\n animation.paused = isPaused;\n }\n\n transitionToClip(\n runtime,\n nextClipId,\n sanitizeCrossFadeDuration(animation.crossFadeDuration),\n );\n\n if (!runtime.activeClipId) {\n continue;\n }\n\n const action = runtime.actions.get(runtime.activeClipId);\n if (!action) {\n continue;\n }\n\n applyActionState(action, animation, isPaused, Boolean(activeState?.loop));\n\n if (animation.reverse && action.time <= 0) {\n action.time = action.getClip().duration;\n }\n\n runtime.mixer.update(step);\n\n if (activeState?.isPlaying) {\n activeState.onPlaying();\n }\n }\n }\n\n dispose(): void {\n for (const runtime of this.runtimeByEntity.values()) {\n stopAllActions(runtime);\n }\n\n this.runtimeByEntity.clear();\n }\n}\n","import * as THREE from \"three\";\n\nimport { CameraComponent } from \"../components/Camera\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nconst MIN_NEAR = 0.001;\nconst MIN_FAR_DELTA = 0.001;\nconst MIN_FOV = 1;\nconst MAX_FOV = 179;\nconst MIN_ZOOM = 0.001;\n\nfunction clampNear(value: number): number {\n if (!Number.isFinite(value)) {\n return MIN_NEAR;\n }\n\n return Math.max(MIN_NEAR, value);\n}\n\nfunction clampFar(value: number, near: number): number {\n if (!Number.isFinite(value)) {\n return near + 1000;\n }\n\n return Math.max(near + MIN_FAR_DELTA, value);\n}\n\nfunction clampFov(value: number): number {\n if (!Number.isFinite(value)) {\n return 50;\n }\n\n return Math.min(MAX_FOV, Math.max(MIN_FOV, value));\n}\n\nfunction clampZoom(value: number): number {\n if (!Number.isFinite(value)) {\n return 1;\n }\n\n return Math.max(MIN_ZOOM, value);\n}\n\nfunction normalizeOrthoBounds(component: CameraComponent): void {\n let left = Number.isFinite(component.left) ? component.left : -5;\n let right = Number.isFinite(component.right) ? component.right : 5;\n let top = Number.isFinite(component.top) ? component.top : 5;\n let bottom = Number.isFinite(component.bottom) ? component.bottom : -5;\n\n if (right <= left) {\n right = left + 0.01;\n }\n\n if (top <= bottom) {\n top = bottom + 0.01;\n }\n\n component.left = left;\n component.right = right;\n component.top = top;\n component.bottom = bottom;\n}\n\nfunction isPerspectiveCamera(camera: THREE.Camera): camera is THREE.PerspectiveCamera {\n return camera instanceof THREE.PerspectiveCamera;\n}\n\nfunction isOrthographicCamera(camera: THREE.Camera): camera is THREE.OrthographicCamera {\n return camera instanceof THREE.OrthographicCamera;\n}\n\nfunction readWindowAspect(): number | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const width = window.innerWidth;\n const height = window.innerHeight;\n if (\n Number.isFinite(width) &&\n Number.isFinite(height) &&\n width > 0 &&\n height > 0\n ) {\n return width / height;\n }\n\n return null;\n}\n\nfunction buildSignature(\n component: CameraComponent,\n camera: THREE.Camera,\n windowAspect: number | null,\n): string {\n return [\n component.type,\n component.isDefault,\n component.projection,\n component.fov,\n component.near,\n component.far,\n component.left,\n component.right,\n component.top,\n component.bottom,\n component.zoom,\n windowAspect ?? \"na\",\n camera.uuid,\n ].join(\"|\");\n}\n\nexport class CameraSyncSystem implements EcsSystem {\n private readonly signatures = new Map<number, string>();\n\n update(world: World): void {\n const entityIds = world.query(CameraComponent, Object3DRef);\n const windowAspect = readWindowAspect();\n\n // While an immersive session presents, three owns the render camera's\n // projection: it copies the XR projection matrix onto it and derives `fov`\n // from it every frame. Re-applying the authored fov/aspect here would both\n // fight that and — because the signature includes camera state three keeps\n // changing — invalidate the dirty-check on every single frame.\n // `near`/`far` are still honoured: three READS them off this camera to build\n // the XR render state, so we leave the rest of the sync alone and only skip\n // the camera three has taken over.\n const xrCamera = world.isXrPresenting() ? world.getCamera() : null;\n\n const alive = new Set(entityIds);\n for (const trackedId of this.signatures.keys()) {\n if (!alive.has(trackedId)) {\n this.signatures.delete(trackedId);\n }\n }\n\n for (const entityId of entityIds) {\n const component = world.getComponent(entityId, CameraComponent);\n const objectRef = world.getComponent(entityId, Object3DRef);\n if (!component || !objectRef) {\n continue;\n }\n\n const camera = objectRef.object;\n if (!(camera instanceof THREE.Camera)) {\n continue;\n }\n\n if (xrCamera !== null && camera === xrCamera) {\n continue;\n }\n\n const nextSignature = buildSignature(component, camera, windowAspect);\n if (this.signatures.get(entityId) === nextSignature) {\n continue;\n }\n\n const near = clampNear(component.near);\n const far = clampFar(component.far, near);\n component.near = near;\n component.far = far;\n\n if (isPerspectiveCamera(camera)) {\n camera.fov = clampFov(component.fov);\n component.fov = camera.fov;\n if (windowAspect !== null) {\n camera.aspect = windowAspect;\n }\n camera.near = near;\n camera.far = far;\n camera.updateProjectionMatrix();\n } else if (isOrthographicCamera(camera)) {\n normalizeOrthoBounds(component);\n camera.left = component.left;\n camera.right = component.right;\n camera.top = component.top;\n camera.bottom = component.bottom;\n camera.zoom = clampZoom(component.zoom);\n component.zoom = camera.zoom;\n camera.near = near;\n camera.far = far;\n camera.updateProjectionMatrix();\n }\n\n component.camera = camera;\n this.signatures.set(entityId, buildSignature(component, camera, windowAspect));\n }\n }\n}\n","import { Object3DRef } from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nexport class ObjectVisibilitySystem implements EcsSystem {\n update(world: World): void {\n const entityIds = world.query(Object3DRef);\n\n for (const entityId of entityIds) {\n const objectRef = world.getComponent(entityId, Object3DRef);\n const object = objectRef?.object;\n if (!objectRef || !object) {\n continue;\n }\n\n const targetVisibility = Boolean(objectRef.visibility);\n if (object.visible !== targetVisibility) {\n object.visible = targetVisibility;\n }\n }\n }\n}\n","import * as THREE from \"three\";\n\nimport { Environment } from \"../components/Environment\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nconst MIN_FOG_DELTA = 0.001;\nconst MIN_DENSITY = 0;\n\nfunction createGradientTexture(\n effect: \"radial\" | \"linear\" | \"angular\",\n colors: string[],\n): THREE.Texture {\n if (typeof document === \"undefined\") {\n const pixel = new Uint8Array([30, 30, 30, 255]);\n const fallback = new THREE.DataTexture(pixel, 1, 1, THREE.RGBAFormat);\n fallback.needsUpdate = true;\n return fallback;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = 512;\n canvas.height = 512;\n\n const context = canvas.getContext(\"2d\");\n if (!context) {\n const fallback = new THREE.CanvasTexture(canvas);\n fallback.needsUpdate = true;\n return fallback;\n }\n\n const safeColors = colors.length > 0 ? colors : [\"#0f172a\", \"#334155\"];\n const lastIndex = Math.max(1, safeColors.length - 1);\n\n let gradient: CanvasGradient;\n if (effect === \"radial\") {\n gradient = context.createRadialGradient(256, 256, 16, 256, 256, 320);\n } else if (effect === \"angular\") {\n gradient = context.createLinearGradient(0, 0, 512, 512);\n } else {\n gradient = context.createLinearGradient(0, 0, 0, 512);\n }\n\n for (let index = 0; index < safeColors.length; index += 1) {\n gradient.addColorStop(index / lastIndex, safeColors[index]);\n }\n\n context.fillStyle = gradient;\n context.fillRect(0, 0, 512, 512);\n\n if (effect === \"angular\") {\n context.globalCompositeOperation = \"overlay\";\n const overlay = context.createRadialGradient(256, 256, 32, 256, 256, 340);\n overlay.addColorStop(0, \"rgba(255,255,255,0.25)\");\n overlay.addColorStop(1, \"rgba(0,0,0,0.2)\");\n context.fillStyle = overlay;\n context.fillRect(0, 0, 512, 512);\n context.globalCompositeOperation = \"source-over\";\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.needsUpdate = true;\n return texture;\n}\n\nexport class EnvironmentSyncSystem implements EcsSystem {\n private readonly scene: THREE.Scene;\n private readonly textureLoader = new THREE.TextureLoader();\n private signature: string | null = null;\n private activeTexture: THREE.Texture | null = null;\n private pendingImageUrl: string | null = null;\n\n constructor(scene: THREE.Scene) {\n this.scene = scene;\n }\n\n private disposeActiveTexture(): void {\n if (this.activeTexture) {\n this.activeTexture.dispose();\n this.activeTexture = null;\n }\n }\n\n private applySkybox(component: Environment): void {\n const skybox = component.values.skybox;\n\n if (skybox.type === \"none\") {\n this.disposeActiveTexture();\n this.pendingImageUrl = null;\n this.scene.background = null;\n return;\n }\n\n if (skybox.type === \"color\") {\n this.disposeActiveTexture();\n this.pendingImageUrl = null;\n this.scene.background = new THREE.Color(skybox.color || \"#1e1e1e\");\n return;\n }\n\n if (skybox.type === \"gradient\") {\n this.disposeActiveTexture();\n this.pendingImageUrl = null;\n const texture = createGradientTexture(\n skybox.gradient.effect,\n skybox.gradient.colors,\n );\n this.activeTexture = texture;\n this.scene.background = texture;\n return;\n }\n\n const imageUrl = skybox.imageUrl?.trim() ?? \"\";\n if (!imageUrl) {\n this.disposeActiveTexture();\n this.pendingImageUrl = null;\n this.scene.background = null;\n return;\n }\n\n if (this.pendingImageUrl === imageUrl && this.activeTexture) {\n this.scene.background = this.activeTexture;\n return;\n }\n\n this.disposeActiveTexture();\n this.pendingImageUrl = imageUrl;\n this.textureLoader.load(\n imageUrl,\n (texture) => {\n if (this.pendingImageUrl !== imageUrl) {\n texture.dispose();\n return;\n }\n\n texture.colorSpace = THREE.SRGBColorSpace;\n this.activeTexture = texture;\n this.scene.background = texture;\n },\n undefined,\n () => {\n if (this.pendingImageUrl === imageUrl) {\n this.pendingImageUrl = null;\n this.scene.background = null;\n }\n },\n );\n }\n\n private applyFog(component: Environment): void {\n const fog = component.values.fog;\n\n if (fog.type === \"none\") {\n this.scene.fog = null;\n return;\n }\n\n const fogColor = new THREE.Color(fog.color || \"#1e1e1e\");\n if (fog.type === \"linear\") {\n const near = Number.isFinite(fog.linear.near) ? fog.linear.near : 1;\n const farCandidate = Number.isFinite(fog.linear.far) ? fog.linear.far : near + 10;\n const far = Math.max(near + MIN_FOG_DELTA, farCandidate);\n this.scene.fog = new THREE.Fog(fogColor, near, far);\n return;\n }\n\n const density = Number.isFinite(fog.exponential.density)\n ? Math.max(MIN_DENSITY, fog.exponential.density)\n : 0.002;\n this.scene.fog = new THREE.FogExp2(fogColor, density);\n }\n\n update(world: World): void {\n const entityIds = world.query(Environment);\n if (entityIds.length === 0) {\n if (this.signature !== null) {\n this.signature = null;\n this.pendingImageUrl = null;\n this.disposeActiveTexture();\n this.scene.background = null;\n this.scene.fog = null;\n }\n return;\n }\n\n const entityId = entityIds[0];\n const environment = world.getComponent(entityId, Environment);\n if (!environment) {\n return;\n }\n\n const nextSignature = JSON.stringify(environment.values);\n if (this.signature === nextSignature) {\n return;\n }\n\n this.signature = nextSignature;\n this.applySkybox(environment);\n this.applyFog(environment);\n }\n\n dispose(): void {\n this.pendingImageUrl = null;\n this.disposeActiveTexture();\n }\n}\n","import { Postprocessing } from \"../components/Postprocessing\";\nimport type { PostprocessingState } from \"../components/Postprocessing\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport * as THREE from \"three\";\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/examples/jsm/postprocessing/RenderPass.js\";\nimport { UnrealBloomPass } from \"three/examples/jsm/postprocessing/UnrealBloomPass.js\";\nimport { DotScreenPass } from \"three/examples/jsm/postprocessing/DotScreenPass.js\";\nimport { GlitchPass } from \"three/examples/jsm/postprocessing/GlitchPass.js\";\nimport { FilmPass } from \"three/examples/jsm/postprocessing/FilmPass.js\";\nimport { BokehPass } from \"three/examples/jsm/postprocessing/BokehPass.js\";\nimport { SSAOPass } from \"three/examples/jsm/postprocessing/SSAOPass.js\";\nimport { ShaderPass } from \"three/examples/jsm/postprocessing/ShaderPass.js\";\nimport { OutputPass } from \"three/examples/jsm/postprocessing/OutputPass.js\";\nimport { HueSaturationShader } from \"three/examples/jsm/shaders/HueSaturationShader.js\";\nimport { SepiaShader } from \"three/examples/jsm/shaders/SepiaShader.js\";\nimport { VignetteShader } from \"three/examples/jsm/shaders/VignetteShader.js\";\n\nexport class PostprocessingSyncSystem implements EcsSystem {\n private readonly renderer: THREE.WebGLRenderer;\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private signature: string | null = null;\n private composer: EffectComposer | null = null;\n private composerEnabled = false;\n\n constructor(\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n ) {\n this.renderer = renderer;\n this.scene = scene;\n this.camera = camera;\n }\n\n private setComposerEnabled(enabled: boolean): void {\n this.composerEnabled = enabled;\n this.scene.userData.ecsPostprocessingComposerActive = enabled;\n if (!enabled) {\n delete this.scene.userData.ecsPostprocessingComposer;\n }\n }\n\n private disposeComposer(): void {\n if (!this.composer) {\n this.setComposerEnabled(false);\n return;\n }\n\n const maybeComposer = this.composer as unknown as {\n passes?: Array<{ dispose?: () => void }>;\n dispose?: () => void;\n };\n\n if (Array.isArray(maybeComposer.passes)) {\n for (const pass of maybeComposer.passes) {\n pass.dispose?.();\n }\n }\n\n maybeComposer.dispose?.();\n this.composer = null;\n this.setComposerEnabled(false);\n }\n\n private buildComposer(values: PostprocessingState): void {\n this.disposeComposer();\n\n if (!values.postEnabled) {\n return;\n }\n\n const composer = new EffectComposer(this.renderer);\n composer.addPass(new RenderPass(this.scene, this.camera));\n\n if (values.dof.enabled) {\n composer.addPass(\n new BokehPass(this.scene, this.camera, {\n focus: values.dof.focusDistance,\n aperture: Math.max(0, values.dof.focalLength),\n maxblur: Math.max(0, values.dof.bokehScale),\n }),\n );\n }\n\n if (values.bloom.enabled) {\n const size = this.renderer.getSize(new THREE.Vector2());\n composer.addPass(\n new UnrealBloomPass(\n new THREE.Vector2(size.width, size.height),\n values.bloom.intensity,\n values.bloom.radius,\n values.bloom.threshold,\n ),\n );\n }\n\n if (values.vignette.enabled) {\n const pass = new ShaderPass(VignetteShader);\n const offset = pass.uniforms.offset;\n const darkness = pass.uniforms.darkness;\n if (offset) {\n offset.value = values.vignette.offset;\n }\n if (darkness) {\n darkness.value = values.vignette.darkness;\n }\n composer.addPass(pass);\n }\n\n if (values.hueSaturation.enabled) {\n const pass = new ShaderPass(HueSaturationShader);\n const hue = pass.uniforms.hue;\n const saturation = pass.uniforms.saturation;\n if (hue) {\n hue.value = values.hueSaturation.hue;\n }\n if (saturation) {\n saturation.value = values.hueSaturation.saturation;\n }\n composer.addPass(pass);\n }\n\n if (values.sepia.enabled) {\n const pass = new ShaderPass(SepiaShader);\n const amount = pass.uniforms.amount;\n if (amount) {\n amount.value = values.sepia.intensity;\n }\n composer.addPass(pass);\n }\n\n if (values.noise.enabled) {\n composer.addPass(new FilmPass(values.noise.opacity));\n }\n\n if (values.dotScreen.enabled) {\n composer.addPass(\n new DotScreenPass(\n new THREE.Vector2(0, 0),\n values.dotScreen.angle ?? values.dotScreen.dotScreenAngle,\n values.dotScreen.scale ?? values.dotScreen.dotScreenScale,\n ),\n );\n }\n\n if (values.ssao.enabled) {\n const pass = new SSAOPass(this.scene, this.camera);\n pass.kernelRadius = values.ssao.radius;\n pass.minDistance = 0.001;\n pass.maxDistance = Math.max(0.01, values.ssao.intensity);\n composer.addPass(pass);\n }\n\n if (values.glitch.enabled) {\n const pass = new GlitchPass();\n pass.enabled = true;\n pass.goWild = Boolean(values.glitch.active);\n composer.addPass(pass);\n }\n\n composer.addPass(new OutputPass());\n this.composer = composer;\n this.scene.userData.ecsPostprocessingComposer = composer;\n this.setComposerEnabled(true);\n }\n\n update(world: World): void {\n const entityIds = world.query(Postprocessing);\n if (entityIds.length === 0) {\n if (this.signature !== null) {\n this.signature = null;\n this.disposeComposer();\n delete this.scene.userData.ecsPostprocessing;\n }\n return;\n }\n\n const postprocessing = world.getComponent(entityIds[0], Postprocessing);\n if (!postprocessing) {\n return;\n }\n\n const nextSignature = JSON.stringify(postprocessing.values);\n if (this.signature === nextSignature) {\n return;\n }\n\n this.signature = nextSignature;\n this.buildComposer(postprocessing.values);\n\n this.scene.userData.ecsPostprocessing = postprocessing.values;\n }\n\n dispose(): void {\n this.signature = null;\n this.disposeComposer();\n delete this.scene.userData.ecsPostprocessing;\n delete this.scene.userData.ecsPostprocessingComposerActive;\n delete this.scene.userData.ecsPostprocessingComposer;\n }\n}\n","import * as THREE from \"three\";\n\nimport {\n type ColliderState,\n Environment,\n Object3DRef,\n PhysicsComponent,\n type RigidbodyState,\n setPhysicsLiveRef,\n TransformComponent,\n} from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\ntype RapierModule = typeof import(\"@dimforge/rapier3d-compat\");\n\ntype BodyType = RigidbodyState[\"type\"];\ntype EntityId = number;\ntype TriMeshData = {\n vertices: Float32Array;\n indices: Uint32Array;\n signature: string;\n};\n\nconst MIN_SIZE = 0.0001;\n\nfunction toBodyType(\n RAPIER: RapierModule,\n bodyType: BodyType,\n): import(\"@dimforge/rapier3d-compat\").RigidBodyType {\n switch (bodyType) {\n case \"fixed\":\n return RAPIER.RigidBodyType.Fixed;\n case \"kinematicPosition\":\n return RAPIER.RigidBodyType.KinematicPositionBased;\n case \"kinematicVelocity\":\n return RAPIER.RigidBodyType.KinematicVelocityBased;\n case \"dynamic\":\n default:\n return RAPIER.RigidBodyType.Dynamic;\n }\n}\n\nfunction createRigidBodyDesc(\n RAPIER: RapierModule,\n bodyType: BodyType,\n): import(\"@dimforge/rapier3d-compat\").RigidBodyDesc {\n if (bodyType === \"fixed\") {\n return RAPIER.RigidBodyDesc.fixed();\n }\n\n if (bodyType === \"kinematicPosition\") {\n return RAPIER.RigidBodyDesc.kinematicPositionBased();\n }\n\n if (bodyType === \"kinematicVelocity\") {\n return RAPIER.RigidBodyDesc.kinematicVelocityBased();\n }\n\n return RAPIER.RigidBodyDesc.dynamic();\n}\n\nfunction computeColliderState(\n colliderValues: ColliderState,\n object: THREE.Object3D | null,\n): ColliderState {\n if (!object) {\n return colliderValues;\n }\n\n const scale = new THREE.Vector3();\n object.getWorldScale(scale);\n\n return {\n ...colliderValues,\n size: {\n x: Math.max(MIN_SIZE, colliderValues.size.x * Math.abs(scale.x || 1)),\n y: Math.max(MIN_SIZE, colliderValues.size.y * Math.abs(scale.y || 1)),\n z: Math.max(MIN_SIZE, colliderValues.size.z * Math.abs(scale.z || 1)),\n },\n radius: Math.max(\n MIN_SIZE,\n colliderValues.radius *\n Math.max(Math.abs(scale.x || 1), Math.abs(scale.z || 1), 1),\n ),\n height: Math.max(MIN_SIZE, colliderValues.height * Math.abs(scale.y || 1)),\n };\n}\n\nfunction createColliderDesc(\n RAPIER: RapierModule,\n values: ColliderState,\n triMeshData: TriMeshData | null,\n): import(\"@dimforge/rapier3d-compat\").ColliderDesc {\n let desc: import(\"@dimforge/rapier3d-compat\").ColliderDesc;\n\n if (values.shape === \"trimesh\" && triMeshData) {\n desc = RAPIER.ColliderDesc.trimesh(\n triMeshData.vertices,\n triMeshData.indices,\n );\n } else if (values.shape === \"ball\") {\n desc = RAPIER.ColliderDesc.ball(Math.max(MIN_SIZE, values.radius));\n } else if (values.shape === \"capsule\") {\n desc = RAPIER.ColliderDesc.capsule(\n Math.max(MIN_SIZE, values.height / 2),\n Math.max(MIN_SIZE, values.radius),\n );\n } else if (values.shape === \"cylinder\") {\n desc = RAPIER.ColliderDesc.cylinder(\n Math.max(MIN_SIZE, values.height / 2),\n Math.max(MIN_SIZE, values.radius),\n );\n } else {\n desc = RAPIER.ColliderDesc.cuboid(\n Math.max(MIN_SIZE, values.size.x / 2),\n Math.max(MIN_SIZE, values.size.y / 2),\n Math.max(MIN_SIZE, values.size.z / 2),\n );\n }\n\n desc.setRestitution(Math.max(0, values.restitution));\n desc.setFriction(Math.max(0, values.friction));\n desc.setSensor(values.isSensor);\n\n desc.setTranslation(\n values.offsetPosition.x,\n values.offsetPosition.y,\n values.offsetPosition.z,\n );\n\n const offsetQuaternion = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(\n values.offsetRotation.x,\n values.offsetRotation.y,\n values.offsetRotation.z,\n ),\n );\n desc.setRotation(offsetQuaternion);\n\n return desc;\n}\n\ntype TriMeshPart = {\n positionAttribute: THREE.BufferAttribute | THREE.InterleavedBufferAttribute;\n indexAttribute: THREE.BufferAttribute | null;\n positionCount: number;\n indexCount: number;\n relativeMatrix: THREE.Matrix4;\n signature: string;\n};\n\ntype TriMeshParts = {\n parts: TriMeshPart[];\n scale: { x: number; y: number; z: number };\n signature: string;\n};\n\n/**\n * Gather every mesh under the entity as a trimesh part (relative matrix +\n * geometry refs) plus the entity's world scale. Cheap — no vertex work — so it\n * can run per frame to detect changes; `createTriMeshData` does the heavy\n * merge only when the signature actually changed.\n *\n * Rapier bodies carry position+rotation only (no scale), so the entity's world\n * scale must be BAKED into the trimesh vertices — that is what makes a scaled\n * mesh's collider match what is rendered, and what lets users \"scale\" a\n * trimesh by scaling the entity. Mirrors `computeColliderState`'s abs/zero\n * guards for primitive shapes.\n */\nexport function collectTriMeshParts(\n object: THREE.Object3D | null,\n): TriMeshParts | null {\n if (!object) {\n return null;\n }\n\n object.updateWorldMatrix(true, true);\n\n const worldScale = new THREE.Vector3();\n object.getWorldScale(worldScale);\n const scale = {\n x: Math.abs(worldScale.x) || 1,\n y: Math.abs(worldScale.y) || 1,\n z: Math.abs(worldScale.z) || 1,\n };\n\n const worldToObject = new THREE.Matrix4().copy(object.matrixWorld).invert();\n\n const parts: TriMeshPart[] = [];\n object.traverse((child) => {\n if (!(child instanceof THREE.Mesh) || !child.geometry) {\n return;\n }\n\n const geometry = child.geometry;\n const positionAttribute = geometry.getAttribute(\"position\");\n if (!positionAttribute || positionAttribute.itemSize < 3) {\n return;\n }\n const positionCount = positionAttribute.count;\n if (positionCount < 3) {\n return;\n }\n\n const indexAttribute = geometry.getIndex();\n const indexCount = indexAttribute\n ? indexAttribute.count\n : Math.floor(positionCount / 3) * 3;\n if (indexCount < 3) {\n return;\n }\n\n const relativeMatrix = new THREE.Matrix4().multiplyMatrices(\n worldToObject,\n child.matrixWorld,\n );\n const matrixSignature = relativeMatrix.elements\n .map((value) => value.toFixed(5))\n .join(\",\");\n\n parts.push({\n positionAttribute,\n indexAttribute,\n positionCount,\n indexCount,\n relativeMatrix,\n signature: `${child.uuid}:${geometry.uuid}:${positionCount}:${indexCount}:${matrixSignature}`,\n });\n });\n\n if (parts.length === 0) {\n return null;\n }\n\n // The relative matrices are invariant under the entity's own scale, so the\n // scale must be part of the signature for a rescale to trigger a rebuild.\n const scaleSignature = `${scale.x.toFixed(5)},${scale.y.toFixed(5)},${scale.z.toFixed(5)}`;\n return {\n parts,\n scale,\n signature: `${scaleSignature}|${parts.map((p) => p.signature).join(\"|\")}`,\n };\n}\n\n/** Merge all collected mesh parts into one scaled vertex/index trimesh buffer. */\nexport function createTriMeshData(\n collected: TriMeshParts | null,\n): TriMeshData | null {\n if (!collected) {\n return null;\n }\n\n const { parts, scale } = collected;\n let vertexTotal = 0;\n let indexTotal = 0;\n for (const part of parts) {\n vertexTotal += part.positionCount;\n indexTotal += part.indexCount;\n }\n if (vertexTotal < 3 || indexTotal < 3) {\n return null;\n }\n\n const vertices = new Float32Array(vertexTotal * 3);\n const indices = new Uint32Array(indexTotal);\n const point = new THREE.Vector3();\n let vertexOffset = 0;\n let indexOffset = 0;\n\n for (const part of parts) {\n const { positionAttribute, indexAttribute, relativeMatrix } = part;\n for (let index = 0; index < part.positionCount; index += 1) {\n point\n .set(\n positionAttribute.getX(index),\n positionAttribute.getY(index),\n positionAttribute.getZ(index),\n )\n .applyMatrix4(relativeMatrix);\n\n const outputIndex = (vertexOffset + index) * 3;\n vertices[outputIndex] = point.x * scale.x;\n vertices[outputIndex + 1] = point.y * scale.y;\n vertices[outputIndex + 2] = point.z * scale.z;\n }\n\n if (indexAttribute) {\n for (let index = 0; index < part.indexCount; index += 1) {\n indices[indexOffset + index] = vertexOffset + indexAttribute.getX(index);\n }\n } else {\n for (let index = 0; index < part.indexCount; index += 1) {\n indices[indexOffset + index] = vertexOffset + index;\n }\n }\n\n vertexOffset += part.positionCount;\n indexOffset += part.indexCount;\n }\n\n return { vertices, indices, signature: collected.signature };\n}\n\nfunction syncBodyFromTransform(\n body: import(\"@dimforge/rapier3d-compat\").RigidBody,\n transform: TransformComponent,\n): void {\n const quaternion = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(transform.rotation.x, transform.rotation.y, transform.rotation.z),\n );\n\n body.setTranslation(\n {\n x: transform.position.x,\n y: transform.position.y,\n z: transform.position.z,\n },\n true,\n );\n body.setRotation(\n {\n x: quaternion.x,\n y: quaternion.y,\n z: quaternion.z,\n w: quaternion.w,\n },\n true,\n );\n}\n\nfunction syncTransformFromBody(\n transform: TransformComponent,\n body: import(\"@dimforge/rapier3d-compat\").RigidBody,\n): void {\n const position = body.translation();\n const rotation = body.rotation();\n\n transform.position.x = position.x;\n transform.position.y = position.y;\n transform.position.z = position.z;\n\n const euler = new THREE.Euler().setFromQuaternion(\n new THREE.Quaternion(rotation.x, rotation.y, rotation.z, rotation.w),\n );\n\n transform.rotation.x = euler.x;\n transform.rotation.y = euler.y;\n transform.rotation.z = euler.z;\n}\n\nexport class PhysicsSyncSystem implements EcsSystem {\n private readonly rigidBodyHandles = new Map<EntityId, number>();\n private readonly colliderHandles = new Map<EntityId, number>();\n private readonly rigidBodySignatures = new Map<EntityId, string>();\n private readonly colliderSignatures = new Map<EntityId, string>();\n private readonly isEditorMode: boolean;\n private rapier: RapierModule | null = null;\n private isBootstrappingWorld = false;\n private accumulator = 0;\n\n constructor(options?: { isEditor?: boolean }) {\n this.isEditorMode = options?.isEditor ?? false;\n }\n\n private async ensurePhysicsWorld(world: World): Promise<void> {\n if (this.rapier || this.isBootstrappingWorld) {\n return;\n }\n\n this.isBootstrappingWorld = true;\n try {\n const environmentEntityId = world.query(Environment)[0];\n const environment =\n typeof environmentEntityId === \"number\"\n ? world.getComponent(environmentEntityId, Environment)\n : undefined;\n\n const gravity = environment?.values.gravity;\n const rapierWorld = await world.createPhysicsWorld({\n gravity: {\n x: gravity?.x,\n y: gravity?.y,\n z: gravity?.z,\n },\n });\n if (!rapierWorld) {\n return;\n }\n\n const moduleValue = await world.getRapierModule();\n this.rapier = moduleValue;\n } finally {\n this.isBootstrappingWorld = false;\n }\n }\n\n private removeEntityPhysics(\n physicsWorld: import(\"@dimforge/rapier3d-compat\").World,\n entityId: EntityId,\n ): void {\n const rigidBodyHandle = this.rigidBodyHandles.get(entityId);\n if (typeof rigidBodyHandle === \"number\") {\n const rigidBody = physicsWorld.getRigidBody(rigidBodyHandle);\n if (rigidBody) {\n physicsWorld.removeRigidBody(rigidBody);\n }\n }\n\n this.rigidBodyHandles.delete(entityId);\n this.colliderHandles.delete(entityId);\n this.rigidBodySignatures.delete(entityId);\n this.colliderSignatures.delete(entityId);\n }\n\n update(world: World, deltaTime: number): void {\n if (!this.rapier || !world.getPhysicsWorld()) {\n void this.ensurePhysicsWorld(world);\n return;\n }\n\n const physicsWorld = world.getPhysicsWorld();\n if (!physicsWorld) {\n return;\n }\n\n const entities = world.query(TransformComponent, PhysicsComponent);\n const activeEntities = new Set<EntityId>(entities);\n\n for (const entityId of this.rigidBodyHandles.keys()) {\n if (!activeEntities.has(entityId)) {\n this.removeEntityPhysics(physicsWorld, entityId);\n }\n }\n\n for (const entityId of entities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const physics = world.getComponent(entityId, PhysicsComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object ?? null;\n if (!transform || !physics) {\n continue;\n }\n\n if (!physics.values.rigidbody.enabled) {\n this.removeEntityPhysics(physicsWorld, entityId);\n setPhysicsLiveRef(physics, \"rigidBody\", null);\n setPhysicsLiveRef(physics, \"collider\", null);\n continue;\n }\n\n // Body TYPE is deliberately excluded from the rebuild signature and\n // reconciled on the live body below instead.\n //\n // Recreating a body to change its type destroys its velocity, which broke\n // throwing outright: a grab flips the type to kinematic and a release\n // flips it back, so the velocity applied at release was wiped by the\n // rebuild on the very next tick and every throw became a dead drop.\n const { type: _desiredBodyType, ...rigidBodyRebuildValues } =\n physics.values.rigidbody;\n const rigidBodySignature = JSON.stringify(rigidBodyRebuildValues);\n const previousRigidBodySignature = this.rigidBodySignatures.get(entityId);\n const hasRigidBody = this.rigidBodyHandles.has(entityId);\n const shouldRecreateBody =\n !hasRigidBody || previousRigidBodySignature !== rigidBodySignature;\n\n if (shouldRecreateBody) {\n this.removeEntityPhysics(physicsWorld, entityId);\n\n const lockTranslationX =\n physics.values.rigidbody.lockTranslations || physics.values.rigidbody.lockTranslationX;\n const lockTranslationY =\n physics.values.rigidbody.lockTranslations || physics.values.rigidbody.lockTranslationY;\n const lockTranslationZ =\n physics.values.rigidbody.lockTranslations || physics.values.rigidbody.lockTranslationZ;\n const lockRotationX =\n physics.values.rigidbody.lockRotations || physics.values.rigidbody.lockRotationX;\n const lockRotationY =\n physics.values.rigidbody.lockRotations || physics.values.rigidbody.lockRotationY;\n const lockRotationZ =\n physics.values.rigidbody.lockRotations || physics.values.rigidbody.lockRotationZ;\n\n const bodyType = this.isEditorMode ? \"fixed\" : physics.values.rigidbody.type;\n const bodyDesc = createRigidBodyDesc(this.rapier, bodyType)\n .setLinearDamping(physics.values.rigidbody.linearDamping)\n .setAngularDamping(physics.values.rigidbody.angularDamping)\n .setGravityScale(physics.values.rigidbody.gravityScale)\n .setCanSleep(physics.values.rigidbody.canSleep)\n .setCcdEnabled(physics.values.rigidbody.ccdEnabled)\n .enabledTranslations(\n !lockTranslationX,\n !lockTranslationY,\n !lockTranslationZ,\n )\n .enabledRotations(\n !lockRotationX,\n !lockRotationY,\n !lockRotationZ,\n );\n\n bodyDesc.setTranslation(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n\n const quaternion = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(\n transform.rotation.x,\n transform.rotation.y,\n transform.rotation.z,\n ),\n );\n bodyDesc.setRotation(quaternion);\n\n const body = physicsWorld.createRigidBody(bodyDesc);\n if (!this.isEditorMode && physics.values.rigidbody.type === \"dynamic\") {\n body.setAdditionalMass(physics.values.rigidbody.mass, true);\n }\n\n this.rigidBodyHandles.set(entityId, body.handle);\n this.rigidBodySignatures.set(entityId, rigidBodySignature);\n setPhysicsLiveRef(physics, \"rigidBody\", body);\n }\n\n const rigidBodyHandle = this.rigidBodyHandles.get(entityId);\n if (typeof rigidBodyHandle !== \"number\") {\n continue;\n }\n\n const body = physicsWorld.getRigidBody(rigidBodyHandle);\n if (!body) {\n this.removeEntityPhysics(physicsWorld, entityId);\n setPhysicsLiveRef(physics, \"rigidBody\", null);\n setPhysicsLiveRef(physics, \"collider\", null);\n continue;\n }\n\n setPhysicsLiveRef(physics, \"rigidBody\", body);\n\n // Reconcile the live body's type without rebuilding it, so a grab/release\n // cycle preserves the velocity a throw depends on.\n const desiredBodyType = this.isEditorMode\n ? \"fixed\"\n : physics.values.rigidbody.type;\n const desiredRapierType = toBodyType(this.rapier, desiredBodyType);\n if (body.bodyType() !== desiredRapierType) {\n body.setBodyType(desiredRapierType, true);\n // Mass is only meaningful on a dynamic body, and is applied at creation\n // for bodies that start dynamic — reapply when becoming dynamic later.\n if (!this.isEditorMode && desiredBodyType === \"dynamic\") {\n body.setAdditionalMass(physics.values.rigidbody.mass, true);\n }\n }\n\n // Drain a queued throw now that the body is dynamic again. Applying it at\n // release time would have been ignored — the body was still kinematic.\n const pending = physics.pendingVelocity;\n if (pending) {\n setPhysicsLiveRef(physics, \"pendingVelocity\", null);\n if (!this.isEditorMode && desiredBodyType === \"dynamic\") {\n try {\n body.setLinvel(pending.linear, true);\n body.setAngvel(pending.angular, true);\n } catch {\n // Body removed mid-frame — nothing to throw.\n }\n }\n }\n\n if (this.isEditorMode || physics.values.rigidbody.type !== \"dynamic\") {\n syncBodyFromTransform(body, transform);\n }\n\n const effectiveCollider = computeColliderState(physics.values.collider, object);\n // Cheap per-frame collect (matrices + counts only); the heavy vertex merge\n // runs only when the signature changes (mesh load, edit, entity rescale).\n const triMeshParts =\n effectiveCollider.shape === \"trimesh\" ? collectTriMeshParts(object) : null;\n\n if (!effectiveCollider || !effectiveCollider.enabled) {\n const colliderHandle = this.colliderHandles.get(entityId);\n if (typeof colliderHandle === \"number\") {\n const existingCollider = physicsWorld.getCollider(colliderHandle);\n if (existingCollider) {\n physicsWorld.removeCollider(existingCollider, true);\n }\n }\n this.colliderHandles.delete(entityId);\n this.colliderSignatures.delete(entityId);\n setPhysicsLiveRef(physics, \"collider\", null);\n continue;\n }\n\n const colliderSignature = `${JSON.stringify(effectiveCollider)}:${triMeshParts?.signature ?? \"\"}`;\n const previousColliderSignature = this.colliderSignatures.get(entityId);\n if (\n !this.colliderHandles.has(entityId) ||\n previousColliderSignature !== colliderSignature\n ) {\n const previousColliderHandle = this.colliderHandles.get(entityId);\n if (typeof previousColliderHandle === \"number\") {\n const previousCollider = physicsWorld.getCollider(previousColliderHandle);\n if (previousCollider) {\n physicsWorld.removeCollider(previousCollider, true);\n }\n }\n\n const colliderDesc = createColliderDesc(\n this.rapier,\n effectiveCollider,\n createTriMeshData(triMeshParts),\n );\n const createdCollider = physicsWorld.createCollider(colliderDesc, body);\n this.colliderHandles.set(entityId, createdCollider.handle);\n this.colliderSignatures.set(entityId, colliderSignature);\n setPhysicsLiveRef(physics, \"collider\", createdCollider);\n } else {\n const colliderHandle = this.colliderHandles.get(entityId);\n setPhysicsLiveRef(\n physics,\n \"collider\",\n typeof colliderHandle === \"number\"\n ? (physicsWorld.getCollider(colliderHandle) ?? null)\n : null,\n );\n }\n }\n\n if (!this.isEditorMode) {\n const environmentEntityId = world.query(Environment)[0];\n const environment =\n typeof environmentEntityId === \"number\"\n ? world.getComponent(environmentEntityId, Environment)\n : undefined;\n const fixedTimeStep =\n typeof environment?.values.fixedTimeStep === \"number\" &&\n environment.values.fixedTimeStep > 0\n ? environment.values.fixedTimeStep\n : 0.02;\n\n const clampedDelta =\n Number.isFinite(deltaTime) && deltaTime > 0\n ? Math.min(deltaTime, 0.1)\n : fixedTimeStep;\n\n this.accumulator += clampedDelta;\n\n while (this.accumulator >= fixedTimeStep) {\n physicsWorld.integrationParameters.dt = fixedTimeStep;\n physicsWorld.step();\n this.accumulator -= fixedTimeStep;\n }\n }\n\n for (const entityId of entities) {\n const physics = world.getComponent(entityId, PhysicsComponent);\n const transform = world.getComponent(entityId, TransformComponent);\n if (\n !physics ||\n !transform ||\n this.isEditorMode ||\n physics.values.rigidbody.type !== \"dynamic\"\n ) {\n continue;\n }\n\n const rigidBodyHandle = this.rigidBodyHandles.get(entityId);\n if (typeof rigidBodyHandle !== \"number\") {\n continue;\n }\n\n const body = physicsWorld.getRigidBody(rigidBodyHandle);\n if (!body) {\n continue;\n }\n\n syncTransformFromBody(transform, body);\n }\n }\n\n dispose(world: World): void {\n const physicsWorld = world.getPhysicsWorld();\n if (physicsWorld) {\n for (const entityId of this.rigidBodyHandles.keys()) {\n this.removeEntityPhysics(physicsWorld, entityId);\n }\n }\n\n this.rigidBodyHandles.clear();\n this.colliderHandles.clear();\n this.rigidBodySignatures.clear();\n this.colliderSignatures.clear();\n this.accumulator = 0;\n }\n}\n","export const KeyboardKeys = {\n A: \"a\",\n B: \"b\",\n C: \"c\",\n D: \"d\",\n E: \"e\",\n F: \"f\",\n G: \"g\",\n H: \"h\",\n I: \"i\",\n J: \"j\",\n K: \"k\",\n L: \"l\",\n M: \"m\",\n N: \"n\",\n O: \"o\",\n P: \"p\",\n Q: \"q\",\n R: \"r\",\n S: \"s\",\n T: \"t\",\n U: \"u\",\n V: \"v\",\n W: \"w\",\n X: \"x\",\n Y: \"y\",\n Z: \"z\",\n Digit0: \"0\",\n Digit1: \"1\",\n Digit2: \"2\",\n Digit3: \"3\",\n Digit4: \"4\",\n Digit5: \"5\",\n Digit6: \"6\",\n Digit7: \"7\",\n Digit8: \"8\",\n Digit9: \"9\",\n Space: \" \",\n Enter: \"enter\",\n Escape: \"escape\",\n Tab: \"tab\",\n Backspace: \"backspace\",\n Delete: \"delete\",\n Insert: \"insert\",\n Home: \"home\",\n End: \"end\",\n PageUp: \"pageup\",\n PageDown: \"pagedown\",\n ArrowUp: \"arrowup\",\n ArrowDown: \"arrowdown\",\n ArrowLeft: \"arrowleft\",\n ArrowRight: \"arrowright\",\n Shift: \"shift\",\n ShiftLeft: \"shiftleft\",\n ShiftRight: \"shiftright\",\n Control: \"control\",\n ControlLeft: \"controlleft\",\n ControlRight: \"controlright\",\n Alt: \"alt\",\n Meta: \"meta\",\n CapsLock: \"capslock\",\n NumLock: \"numlock\",\n ScrollLock: \"scrolllock\",\n Pause: \"pause\",\n PrintScreen: \"printscreen\",\n ContextMenu: \"contextmenu\",\n Minus: \"-\",\n Equal: \"=\",\n BracketLeft: \"[\",\n BracketRight: \"]\",\n Backslash: \"\\\\\",\n Semicolon: \";\",\n Quote: \"'\",\n Backquote: \"`\",\n Comma: \",\",\n Period: \".\",\n Slash: \"/\",\n F1: \"f1\",\n F2: \"f2\",\n F3: \"f3\",\n F4: \"f4\",\n F5: \"f5\",\n F6: \"f6\",\n F7: \"f7\",\n F8: \"f8\",\n F9: \"f9\",\n F10: \"f10\",\n F11: \"f11\",\n F12: \"f12\",\n} as const;\n\nexport type KeyboardKey = (typeof KeyboardKeys)[keyof typeof KeyboardKeys];","import type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport type { KeyboardKey } from \"./keyboardKeys\";\n\nfunction normalizeKey(key: KeyboardKey | string): string {\n return key.toLowerCase();\n}\n\nexport type MouseButton = \"left\" | \"middle\" | \"right\";\n\nfunction normalizeMouseButton(button: MouseButton | number | string): number {\n if (typeof button === \"number\") {\n return button;\n }\n\n const normalized = button.toLowerCase();\n if (normalized === \"left\") {\n return 0;\n }\n\n if (normalized === \"middle\" || normalized === \"scroll\") {\n return 1;\n }\n\n if (normalized === \"right\") {\n return 2;\n }\n\n return Number.NaN;\n}\n\nexport class InputSystem implements EcsSystem {\n private readonly held = new Set<string>();\n private readonly down = new Set<string>();\n private readonly up = new Set<string>();\n private readonly pendingDown = new Set<string>();\n private readonly pendingUp = new Set<string>();\n\n private readonly heldMouse = new Set<number>();\n private readonly downMouse = new Set<number>();\n private readonly upMouse = new Set<number>();\n private readonly pendingMouseDown = new Set<number>();\n private readonly pendingMouseUp = new Set<number>();\n\n private scrollDeltaX = 0;\n private scrollDeltaY = 0;\n private pendingScrollDeltaX = 0;\n private pendingScrollDeltaY = 0;\n private mouseDeltaX = 0;\n private mouseDeltaY = 0;\n private pendingMouseDeltaX = 0;\n private pendingMouseDeltaY = 0;\n private mousePosition = { x: 0, y: 0 };\n private pointerLockElement: HTMLElement | null = null;\n private pendingPointerLockRequest = false;\n\n private resolvePointerBounds(): { minX: number; minY: number; maxX: number; maxY: number } {\n const targetElement = this.pointerLockElement;\n if (targetElement) {\n const rect = targetElement.getBoundingClientRect();\n return {\n minX: rect.left,\n minY: rect.top,\n maxX: rect.right,\n maxY: rect.bottom,\n };\n }\n\n return {\n minX: 0,\n minY: 0,\n maxX: typeof window !== \"undefined\" ? window.innerWidth : 0,\n maxY: typeof window !== \"undefined\" ? window.innerHeight : 0,\n };\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n const key = normalizeKey(event.key);\n const code = normalizeKey(event.code);\n\n if (!this.held.has(key)) {\n this.pendingDown.add(key);\n }\n\n this.held.add(key);\n\n // Also track event.code so left/right variants (e.g. ShiftLeft, ControlRight)\n // can be distinguished independently of event.key.\n if (code !== key) {\n if (!this.held.has(code)) {\n this.pendingDown.add(code);\n }\n this.held.add(code);\n }\n };\n\n private onKeyUp = (event: KeyboardEvent): void => {\n const key = normalizeKey(event.key);\n const code = normalizeKey(event.code);\n\n this.held.delete(key);\n this.pendingUp.add(key);\n\n if (code !== key) {\n this.held.delete(code);\n this.pendingUp.add(code);\n }\n };\n\n private onWindowBlur = (): void => {\n this.clearAll();\n };\n\n private onMouseDown = (event: MouseEvent): void => {\n const button = event.button;\n\n if (!this.heldMouse.has(button)) {\n this.pendingMouseDown.add(button);\n }\n\n this.heldMouse.add(button);\n\n // If a behaviour called lockMousePointer() outside a gesture context (e.g. from\n // update()), honour the deferred request now — we are synchronously inside a\n // trusted mousedown event, so Safari will allow the pointer lock.\n if (this.pendingPointerLockRequest) {\n this.pendingPointerLockRequest = false;\n const targetElement = this.pointerLockElement ?? document.body;\n if (targetElement && typeof targetElement.requestPointerLock === \"function\") {\n const result = targetElement.requestPointerLock();\n if (result instanceof Promise) {\n result.catch(() => {});\n }\n }\n }\n };\n\n private onMouseUp = (event: MouseEvent): void => {\n const button = event.button;\n\n this.heldMouse.delete(button);\n this.pendingMouseUp.add(button);\n };\n\n private onMouseWheel = (event: WheelEvent): void => {\n this.pendingScrollDeltaX += event.deltaX;\n this.pendingScrollDeltaY += event.deltaY;\n };\n\n private onMouseMove = (event: MouseEvent): void => {\n if (this.isMousePointerLocked()) {\n this.pendingMouseDeltaX += event.movementX;\n this.pendingMouseDeltaY += event.movementY;\n this.mousePosition = {\n x: this.mousePosition.x + event.movementX,\n y: this.mousePosition.y + event.movementY,\n };\n return;\n }\n\n this.pendingMouseDeltaX += event.movementX;\n this.pendingMouseDeltaY += event.movementY;\n\n this.mousePosition = {\n x: event.clientX,\n y: event.clientY,\n };\n };\n\n private onPointerLockChange = (): void => {\n if (!this.isMousePointerLocked()) {\n return;\n }\n\n const bounds = this.resolvePointerBounds();\n this.mousePosition = {\n x: (bounds.minX + bounds.maxX) / 2,\n y: (bounds.minY + bounds.maxY) / 2,\n };\n };\n\n private onPointerLockError = (): void => {\n // No-op by default; callers can inspect lock state via isMousePointerLocked().\n };\n\n constructor() {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n window.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n document.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"wheel\", this.onMouseWheel, { passive: true });\n window.addEventListener(\"blur\", this.onWindowBlur);\n document.addEventListener(\"pointerlockchange\", this.onPointerLockChange);\n document.addEventListener(\"pointerlockerror\", this.onPointerLockError);\n }\n\n setPointerLockElement(element: HTMLElement | null): void {\n this.pointerLockElement = element;\n }\n\n lockMousePointer(): boolean {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n const targetElement = this.pointerLockElement ?? document.body;\n if (!targetElement || typeof targetElement.requestPointerLock !== \"function\") {\n return false;\n }\n\n try {\n const result = targetElement.requestPointerLock();\n // Modern browsers (including Safari) return a Promise. If it rejects\n // (e.g. called outside a user gesture on Safari), set a flag so the\n // lock is automatically requested on the next mousedown event, which\n // is always a trusted user gesture.\n if (result instanceof Promise) {\n result.catch(() => {\n this.pendingPointerLockRequest = true;\n });\n }\n return true;\n } catch {\n return false;\n }\n }\n\n unlockMousePointer(): boolean {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n // Cancel any deferred lock request so we don't immediately re-lock on next click.\n this.pendingPointerLockRequest = false;\n\n if (!document.pointerLockElement || typeof document.exitPointerLock !== \"function\") {\n return false;\n }\n\n document.exitPointerLock();\n return true;\n }\n\n isMousePointerLocked(): boolean {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n const activePointerLockElement = document.pointerLockElement;\n if (!activePointerLockElement) {\n return false;\n }\n\n if (!this.pointerLockElement) {\n return true;\n }\n\n return activePointerLockElement === this.pointerLockElement;\n }\n\n getKey(key: KeyboardKey | string): boolean {\n return this.held.has(normalizeKey(key));\n }\n\n getKeyDown(key: KeyboardKey | string): boolean {\n return this.down.has(normalizeKey(key));\n }\n\n getKeyUp(key: KeyboardKey | string): boolean {\n return this.up.has(normalizeKey(key));\n }\n\n consumePressed(key: KeyboardKey | string): boolean {\n const normalized = normalizeKey(key);\n if (!this.down.has(normalized)) {\n return false;\n }\n\n this.down.delete(normalized);\n return true;\n }\n\n getMouse(button: MouseButton | number | string): boolean {\n const normalizedButton = normalizeMouseButton(button);\n if (!Number.isInteger(normalizedButton)) {\n return false;\n }\n\n return this.heldMouse.has(normalizedButton);\n }\n\n getMouseDown(button: MouseButton | number | string): boolean {\n const normalizedButton = normalizeMouseButton(button);\n if (!Number.isInteger(normalizedButton)) {\n return false;\n }\n\n return this.downMouse.has(normalizedButton);\n }\n\n getMouseUp(button: MouseButton | number | string): boolean {\n const normalizedButton = normalizeMouseButton(button);\n if (!Number.isInteger(normalizedButton)) {\n return false;\n }\n\n return this.upMouse.has(normalizedButton);\n }\n\n getScrollClick(): boolean {\n return this.getMouse(\"middle\");\n }\n\n getScrollClickDown(): boolean {\n return this.getMouseDown(\"middle\");\n }\n\n getScrollClickUp(): boolean {\n return this.getMouseUp(\"middle\");\n }\n\n getScrollDelta(): { x: number; y: number } {\n return {\n x: this.scrollDeltaX,\n y: this.scrollDeltaY,\n };\n }\n\n consumeScrollDelta(): { x: number; y: number } {\n const delta = this.getScrollDelta();\n this.scrollDeltaX = 0;\n this.scrollDeltaY = 0;\n return delta;\n }\n\n getMousePosition(): { x: number; y: number } {\n return {\n x: this.mousePosition.x,\n y: this.mousePosition.y,\n };\n }\n\n getMouseDelta(): { x: number; y: number } {\n return {\n x: this.mouseDeltaX,\n y: this.mouseDeltaY,\n };\n }\n\n consumeMouseDelta(): { x: number; y: number } {\n const delta = this.getMouseDelta();\n this.mouseDeltaX = 0;\n this.mouseDeltaY = 0;\n return delta;\n }\n\n update(_world: World, _deltaTime: number): void {\n this.down.clear();\n this.up.clear();\n this.downMouse.clear();\n this.upMouse.clear();\n this.scrollDeltaX = this.pendingScrollDeltaX;\n this.scrollDeltaY = this.pendingScrollDeltaY;\n this.mouseDeltaX = this.pendingMouseDeltaX;\n this.mouseDeltaY = this.pendingMouseDeltaY;\n\n for (const key of this.pendingDown) {\n this.down.add(key);\n }\n\n for (const key of this.pendingUp) {\n this.up.add(key);\n }\n\n for (const button of this.pendingMouseDown) {\n this.downMouse.add(button);\n }\n\n for (const button of this.pendingMouseUp) {\n this.upMouse.add(button);\n }\n\n this.pendingDown.clear();\n this.pendingUp.clear();\n this.pendingMouseDown.clear();\n this.pendingMouseUp.clear();\n this.pendingScrollDeltaX = 0;\n this.pendingScrollDeltaY = 0;\n this.pendingMouseDeltaX = 0;\n this.pendingMouseDeltaY = 0;\n }\n\n dispose(): void {\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n window.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n document.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"wheel\", this.onMouseWheel);\n window.removeEventListener(\"blur\", this.onWindowBlur);\n document.removeEventListener(\"pointerlockchange\", this.onPointerLockChange);\n document.removeEventListener(\"pointerlockerror\", this.onPointerLockError);\n }\n\n this.clearAll();\n }\n\n private clearAll(): void {\n this.held.clear();\n this.down.clear();\n this.up.clear();\n this.pendingDown.clear();\n this.pendingUp.clear();\n this.heldMouse.clear();\n this.downMouse.clear();\n this.upMouse.clear();\n this.pendingMouseDown.clear();\n this.pendingMouseUp.clear();\n this.scrollDeltaX = 0;\n this.scrollDeltaY = 0;\n this.pendingScrollDeltaX = 0;\n this.pendingScrollDeltaY = 0;\n this.mouseDeltaX = 0;\n this.mouseDeltaY = 0;\n this.pendingMouseDeltaX = 0;\n this.pendingMouseDeltaY = 0;\n this.mousePosition = { x: 0, y: 0 };\n }\n}\n\n\n","import * as THREE from \"three\";\n\nimport { LightComponent } from \"../components/Light\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nconst MIN_LIGHT_DISTANCE = 0;\nconst MIN_LIGHT_INTENSITY = 0;\nconst MIN_AREA_SIZE = 0.01;\n\nfunction applyLightValues(lightComponent: LightComponent): void {\n const { light, values } = lightComponent;\n\n if (typeof values.color === \"string\") {\n light.color.set(values.color);\n }\n\n if (Number.isFinite(values.intensity)) {\n light.intensity = Math.max(MIN_LIGHT_INTENSITY, values.intensity);\n }\n\n light.frustumCulled = Boolean(values.frustumCulling);\n\n if (\"castShadow\" in light) {\n (light as THREE.Light & { castShadow: boolean }).castShadow = Boolean(\n values.castShadow,\n );\n }\n\n if (light instanceof THREE.PointLight) {\n if (typeof values.distance === \"number\" && Number.isFinite(values.distance)) {\n light.distance = Math.max(MIN_LIGHT_DISTANCE, values.distance);\n }\n\n if (typeof values.decay === \"number\" && Number.isFinite(values.decay)) {\n light.decay = Math.max(0, values.decay);\n }\n }\n\n if (light instanceof THREE.SpotLight) {\n if (typeof values.distance === \"number\" && Number.isFinite(values.distance)) {\n light.distance = Math.max(MIN_LIGHT_DISTANCE, values.distance);\n }\n\n if (typeof values.decay === \"number\" && Number.isFinite(values.decay)) {\n light.decay = Math.max(0, values.decay);\n }\n\n if (typeof values.angle === \"number\" && Number.isFinite(values.angle)) {\n light.angle = Math.max(0, Math.min(Math.PI / 2, values.angle));\n }\n\n if (typeof values.penumbra === \"number\" && Number.isFinite(values.penumbra)) {\n light.penumbra = Math.max(0, Math.min(1, values.penumbra));\n }\n }\n\n if (light instanceof THREE.RectAreaLight) {\n if (typeof values.width === \"number\" && Number.isFinite(values.width)) {\n light.width = Math.max(MIN_AREA_SIZE, values.width);\n }\n\n if (typeof values.height === \"number\" && Number.isFinite(values.height)) {\n light.height = Math.max(MIN_AREA_SIZE, values.height);\n }\n }\n}\n\nexport class LightSyncSystem implements EcsSystem {\n private readonly signatures = new Map<number, string>();\n\n update(world: World): void {\n const entityIds = world.query(LightComponent);\n\n const alive = new Set(entityIds);\n for (const trackedId of this.signatures.keys()) {\n if (!alive.has(trackedId)) {\n this.signatures.delete(trackedId);\n }\n }\n\n for (const entityId of entityIds) {\n const lightComponent = world.getComponent(entityId, LightComponent);\n if (!lightComponent) {\n continue;\n }\n\n const signature = JSON.stringify(lightComponent.values);\n if (this.signatures.get(entityId) === signature) {\n continue;\n }\n\n applyLightValues(lightComponent);\n this.signatures.set(entityId, signature);\n }\n }\n}\n","import * as THREE from \"three\";\n\nimport {\n MaterialComponent,\n type MaterialTypeValue,\n type MaterialValueState,\n Object3DRef,\n type TextureFilteringValue,\n} from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\ntype MaterialWithValues = {\n material: THREE.Material | null;\n materials: THREE.Material[];\n values: MaterialValueState[];\n};\n\nconst materialTextureKeyMap: Record<string, string> = {\n textureMap: \"map\",\n alphaTextureMap: \"alphaMap\",\n};\n\nconst materialTextureSlots = [\n \"map\",\n \"alphaMap\",\n \"normalMap\",\n \"roughnessMap\",\n \"metalnessMap\",\n \"aoMap\",\n \"emissiveMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"lightMap\",\n \"envMap\",\n] as const;\n\nfunction resolveMaterialPropertyKey(key: string): string {\n return materialTextureKeyMap[key] ?? key;\n}\n\nfunction createMaterialByType(type: MaterialTypeValue): THREE.Material {\n if (type === \"basic\") {\n return new THREE.MeshBasicMaterial();\n }\n\n if (type === \"phong\") {\n return new THREE.MeshPhongMaterial();\n }\n\n if (type === \"physical\") {\n return new THREE.MeshPhysicalMaterial();\n }\n\n return new THREE.MeshStandardMaterial();\n}\n\nfunction replaceMaterialAcrossObject(\n object: THREE.Object3D,\n previous: THREE.Material,\n next: THREE.Material,\n): void {\n object.traverse((child) => {\n const mesh = child as THREE.Mesh;\n const currentMaterial = mesh.material;\n if (!currentMaterial) {\n return;\n }\n\n if (Array.isArray(currentMaterial)) {\n let changed = false;\n const updated = currentMaterial.map((material) => {\n if (material === previous) {\n changed = true;\n return next;\n }\n\n return material;\n });\n\n if (changed) {\n mesh.material = updated;\n }\n return;\n }\n\n if (currentMaterial === previous) {\n mesh.material = next;\n }\n });\n}\n\nfunction extractObjectMaterials(object: THREE.Object3D): THREE.Material[] {\n const materials: THREE.Material[] = [];\n\n object.traverse((child) => {\n const mesh = child as THREE.Mesh;\n const currentMaterial = mesh.material;\n if (!currentMaterial) {\n return;\n }\n\n const addMaterial = (material: THREE.Material) => {\n if (!materials.includes(material)) {\n materials.push(material);\n }\n };\n\n if (Array.isArray(currentMaterial)) {\n for (const material of currentMaterial) {\n addMaterial(material);\n }\n return;\n }\n\n addMaterial(currentMaterial);\n });\n\n return materials;\n}\n\nfunction applyTextureFiltering(\n material: THREE.Material,\n filtering: TextureFilteringValue,\n): void {\n const sharp = filtering === \"sharp\";\n const target = material as unknown as Record<string, unknown>;\n\n for (const slot of materialTextureSlots) {\n const texture = target[slot] as THREE.Texture | null | undefined;\n if (!texture || !(texture instanceof THREE.Texture)) {\n continue;\n }\n\n const useMipmaps = texture.generateMipmaps !== false;\n texture.magFilter = sharp ? THREE.NearestFilter : THREE.LinearFilter;\n texture.minFilter = useMipmaps\n ? sharp\n ? THREE.NearestMipmapNearestFilter\n : THREE.LinearMipmapLinearFilter\n : sharp\n ? THREE.NearestFilter\n : THREE.LinearFilter;\n texture.needsUpdate = true;\n }\n\n material.needsUpdate = true;\n}\n\nfunction setTextureMipmaps(material: THREE.Material, enabled: boolean): void {\n const target = material as unknown as Record<string, unknown>;\n\n for (const slot of materialTextureSlots) {\n const texture = target[slot] as THREE.Texture | null | undefined;\n if (!texture || !(texture instanceof THREE.Texture)) {\n continue;\n }\n\n texture.generateMipmaps = enabled;\n\n const sharp = texture.magFilter === THREE.NearestFilter;\n texture.minFilter = enabled\n ? sharp\n ? THREE.NearestMipmapNearestFilter\n : THREE.LinearMipmapLinearFilter\n : sharp\n ? THREE.NearestFilter\n : THREE.LinearFilter;\n\n texture.needsUpdate = true;\n }\n\n material.needsUpdate = true;\n}\n\nfunction assignMaterialTexture(\n material: THREE.Material,\n rawKey: string,\n url: string,\n textureCache: Map<string, THREE.Texture>,\n): void {\n const target = material as unknown as Record<string, unknown>;\n const key = resolveMaterialPropertyKey(rawKey);\n\n let texture = textureCache.get(url);\n if (!texture) {\n texture = new THREE.TextureLoader().load(url);\n textureCache.set(url, texture);\n }\n\n target[key] = texture;\n}\n\nfunction clearMaterialTexture(material: THREE.Material, rawKey: string): void {\n const target = material as unknown as Record<string, unknown>;\n const key = resolveMaterialPropertyKey(rawKey);\n target[key] = null;\n}\n\nfunction applyMaterialState(\n material: THREE.Material,\n value: MaterialValueState,\n textureCache: Map<string, THREE.Texture>,\n): void {\n const target = material as unknown as Record<string, unknown>;\n\n if (\n target.color &&\n typeof (target.color as { set?: (nextValue: string) => void }).set ===\n \"function\"\n ) {\n (target.color as { set: (nextValue: string) => void }).set(value.color);\n }\n\n if (typeof target.roughness === \"number\") {\n target.roughness = value.roughness;\n }\n\n if (typeof target.metalness === \"number\") {\n target.metalness = value.metalness;\n }\n\n if (\n target.normalScale &&\n typeof (target.normalScale as { set?: (x: number, y: number) => void })\n .set === \"function\"\n ) {\n (target.normalScale as { set: (x: number, y: number) => void }).set(\n value.normalScale,\n value.normalScale,\n );\n }\n\n target.opacity = value.opacity;\n\n if (\n target.emissive &&\n typeof (target.emissive as { set?: (nextValue: string) => void }).set ===\n \"function\"\n ) {\n (target.emissive as { set: (nextValue: string) => void }).set(value.emissive);\n }\n\n if (typeof target.emissiveIntensity === \"number\") {\n target.emissiveIntensity = value.emissiveIntensity;\n }\n\n target.side = value.side;\n target.blending = value.blending;\n // three r178+: MultiplyBlending and SubtractiveBlending only produce the\n // correct result when the material is premultiplied. Both are user-selectable\n // in the inspector, so derive the flag instead of leaving it at the default —\n // otherwise every material set to Multiply/Subtract renders wrong.\n target.premultipliedAlpha =\n value.blending === THREE.MultiplyBlending ||\n value.blending === THREE.SubtractiveBlending;\n target.depthTest = value.depthTest;\n target.depthWrite = value.depthWrite;\n target.wireframe = value.wireframe;\n target.transparent = value.transparent;\n\n const textureEntries: Array<[string, string | undefined]> = [\n [\"textureMap\", value.textureMap],\n [\"alphaTextureMap\", value.alphaTextureMap],\n [\"normalMap\", value.normalMap],\n [\"roughnessMap\", value.roughnessMap],\n [\"metalnessMap\", value.metalnessMap],\n [\"aoMap\", value.aoMap],\n [\"emissiveMap\", value.emissiveMap],\n [\"bumpMap\", value.bumpMap],\n [\"displacementMap\", value.displacementMap],\n [\"lightMap\", value.lightMap],\n [\"envMap\", value.envMap],\n ];\n\n for (const [key, url] of textureEntries) {\n if (typeof url === \"string\" && url.length > 0) {\n assignMaterialTexture(material, key, url, textureCache);\n } else {\n clearMaterialTexture(material, key);\n }\n }\n\n applyTextureFiltering(material, value.textureFiltering);\n setTextureMipmaps(material, value.useMipmaps);\n material.needsUpdate = true;\n}\n\nexport class MaterialSyncSystem implements EcsSystem {\n private readonly signatures = new Map<number, string>();\n private readonly textureCache = new Map<string, THREE.Texture>();\n\n update(world: World): void {\n const entityIds = world.query(MaterialComponent);\n\n const alive = new Set(entityIds);\n for (const trackedId of this.signatures.keys()) {\n if (!alive.has(trackedId)) {\n this.signatures.delete(trackedId);\n }\n }\n\n for (const entityId of entityIds) {\n const materialComponent = world.getComponent(\n entityId,\n MaterialComponent,\n ) as MaterialWithValues | undefined;\n if (!materialComponent) {\n continue;\n }\n\n const signature = JSON.stringify(materialComponent.values);\n if (this.signatures.get(entityId) === signature) {\n continue;\n }\n\n const object = world.getComponent(entityId, Object3DRef)?.object;\n const objectMaterials = object ? extractObjectMaterials(object) : [];\n for (let index = 0; index < materialComponent.values.length; index += 1) {\n const value = materialComponent.values[index];\n if (!value) {\n continue;\n }\n\n const previousMaterial = materialComponent.materials[index];\n if (!previousMaterial) {\n continue;\n }\n\n // Undo/redo can restore component material references that differ from\n // what meshes currently hold. Rebind by slot index so subsequent state\n // writes always target the rendered material instance.\n if (object) {\n const currentObjectMaterial = objectMaterials[index];\n if (\n currentObjectMaterial &&\n currentObjectMaterial !== previousMaterial\n ) {\n replaceMaterialAcrossObject(\n object,\n currentObjectMaterial,\n previousMaterial,\n );\n objectMaterials[index] = previousMaterial;\n }\n }\n\n const nextType = createMaterialByType(value.type).type;\n let targetMaterial = previousMaterial;\n\n if (previousMaterial.type !== nextType) {\n const replacement = createMaterialByType(value.type);\n if (object) {\n replaceMaterialAcrossObject(object, previousMaterial, replacement);\n objectMaterials[index] = replacement;\n }\n materialComponent.materials[index] = replacement;\n targetMaterial = replacement;\n if (index === 0) {\n materialComponent.material = replacement;\n }\n previousMaterial.dispose();\n }\n\n applyMaterialState(targetMaterial, value, this.textureCache);\n }\n\n this.signatures.set(entityId, JSON.stringify(materialComponent.values));\n }\n }\n\n dispose(): void {\n for (const texture of this.textureCache.values()) {\n texture.dispose();\n }\n\n this.textureCache.clear();\n this.signatures.clear();\n }\n}\n","import * as THREE from \"three\";\n\nimport {\n type CubeMeshParameters,\n DEFAULT_MESH_GEOMETRY_PARAMETERS,\n type MeshGeometryParameters,\n MeshGeometryComponent,\n Object3DRef,\n type PlaneMeshParameters,\n type RadiusHeightMeshParameters,\n type RadiusMeshParameters,\n} from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nconst MIN_DIMENSION = 0.01;\nconst MIN_RADIUS = 0.001;\n\nfunction sanitizeDimension(value: number): number {\n return Number.isFinite(value)\n ? Math.max(MIN_DIMENSION, value)\n : MIN_DIMENSION;\n}\n\nfunction sanitizeRadius(value: number): number {\n return Number.isFinite(value) ? Math.max(MIN_RADIUS, value) : MIN_RADIUS;\n}\n\nfunction sanitizeMeshParameters(\n component: MeshGeometryComponent,\n): MeshGeometryParameters {\n switch (component.kind) {\n case \"cube\": {\n const params = component.parameters as Partial<CubeMeshParameters>;\n const fallback = DEFAULT_MESH_GEOMETRY_PARAMETERS.cube;\n return {\n width: sanitizeDimension(params.width ?? fallback.width),\n height: sanitizeDimension(params.height ?? fallback.height),\n depth: sanitizeDimension(params.depth ?? fallback.depth),\n };\n }\n case \"plane\": {\n const params = component.parameters as Partial<PlaneMeshParameters>;\n const fallback = DEFAULT_MESH_GEOMETRY_PARAMETERS.plane;\n return {\n width: sanitizeDimension(params.width ?? fallback.width),\n height: sanitizeDimension(params.height ?? fallback.height),\n };\n }\n case \"sphere\": {\n const params = component.parameters as Partial<RadiusMeshParameters>;\n const fallback = DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere;\n return {\n radius: sanitizeRadius(params.radius ?? fallback.radius),\n };\n }\n case \"cylinder\":\n case \"capsule\": {\n const params = component.parameters as Partial<RadiusHeightMeshParameters>;\n const fallback =\n component.kind === \"cylinder\"\n ? DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder\n : DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule;\n return {\n radius: sanitizeRadius(params.radius ?? fallback.radius),\n height: sanitizeDimension(params.height ?? fallback.height),\n };\n }\n case \"model\":\n return {};\n }\n}\n\nfunction resolvePrimaryMesh(object: THREE.Object3D | null): THREE.Mesh | null {\n if (!object) {\n return null;\n }\n\n if (object instanceof THREE.Mesh) {\n return object;\n }\n\n let found: THREE.Mesh | null = null;\n object.traverse((child: THREE.Object3D) => {\n if (!found && child instanceof THREE.Mesh) {\n found = child;\n }\n });\n\n return found;\n}\n\nfunction applyGeometry(component: MeshGeometryComponent): void {\n if (component.kind === \"model\") {\n return;\n }\n\n const mesh = resolvePrimaryMesh(component.object);\n if (!mesh) {\n return;\n }\n\n const sanitized = sanitizeMeshParameters(component);\n component.parameters = sanitized;\n\n let nextGeometry: THREE.BufferGeometry;\n\n switch (component.kind) {\n case \"cube\": {\n const params = sanitized as CubeMeshParameters;\n nextGeometry = new THREE.BoxGeometry(params.width, params.height, params.depth);\n break;\n }\n case \"plane\": {\n const params = sanitized as PlaneMeshParameters;\n nextGeometry = new THREE.PlaneGeometry(params.width, params.height);\n break;\n }\n case \"sphere\": {\n const params = sanitized as RadiusMeshParameters;\n nextGeometry = new THREE.SphereGeometry(params.radius, 24, 24);\n break;\n }\n case \"cylinder\": {\n const params = sanitized as RadiusHeightMeshParameters;\n nextGeometry = new THREE.CylinderGeometry(\n params.radius,\n params.radius,\n params.height,\n 20,\n );\n break;\n }\n case \"capsule\": {\n const params = sanitized as RadiusHeightMeshParameters;\n nextGeometry = new THREE.CapsuleGeometry(params.radius, params.height, 4, 8);\n break;\n }\n default:\n return;\n }\n\n const previousGeometry = mesh.geometry;\n mesh.geometry = nextGeometry;\n previousGeometry.dispose();\n}\n\nfunction applyShadowFlags(component: MeshGeometryComponent): void {\n if (!component.object) {\n return;\n }\n\n component.object.traverse((child: THREE.Object3D) => {\n if (child instanceof THREE.Mesh) {\n child.castShadow = component.castShadow;\n child.receiveShadow = component.receiveShadow;\n }\n });\n}\n\nexport class MeshGeometrySystem implements EcsSystem {\n private readonly geometrySignatures = new Map<number, string>();\n private readonly shadowSignatures = new Map<number, string>();\n\n update(world: World): void {\n const entityIds = world.query(MeshGeometryComponent);\n\n const alive = new Set<number>(entityIds);\n for (const trackedId of this.geometrySignatures.keys()) {\n if (!alive.has(trackedId)) {\n this.geometrySignatures.delete(trackedId);\n this.shadowSignatures.delete(trackedId);\n }\n }\n\n for (const entityId of entityIds) {\n const meshGeometry = world.getComponent(\n entityId,\n MeshGeometryComponent,\n ) as MeshGeometryComponent | undefined;\n if (!meshGeometry) {\n continue;\n }\n\n if (!meshGeometry.object) {\n const objectRef = world.getComponent(entityId, Object3DRef);\n if (objectRef?.object) {\n meshGeometry.object = objectRef.object;\n }\n }\n\n const geometrySignature = `${meshGeometry.kind}:${JSON.stringify(meshGeometry.parameters)}:${meshGeometry.object?.uuid ?? \"\"}`;\n const shadowSignature = `${meshGeometry.castShadow}:${meshGeometry.receiveShadow}:${meshGeometry.object?.uuid ?? \"\"}`;\n\n if (this.geometrySignatures.get(entityId) !== geometrySignature) {\n applyGeometry(meshGeometry);\n this.geometrySignatures.set(\n entityId,\n `${meshGeometry.kind}:${JSON.stringify(meshGeometry.parameters)}:${meshGeometry.object?.uuid ?? \"\"}`,\n );\n }\n\n if (this.shadowSignatures.get(entityId) !== shadowSignature) {\n applyShadowFlags(meshGeometry);\n this.shadowSignatures.set(entityId, shadowSignature);\n }\n }\n }\n}\n","\nimport * as THREE from \"three\";\nimport { DRACOLoader } from \"three/examples/jsm/loaders/DRACOLoader.js\";\nimport { GLTFLoader, type GLTF } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { resolveDracoDecoderPath } from \"./dracoDecoderPath\";\n\nexport const loadGLTF = (path: string): Promise<GLTF> => {\n return new Promise((resolve, reject) => {\n const loader = new GLTFLoader();\n try {\n // Configure DRACOLoader so GLTFLoader can decode DRACO-compressed meshes.\n const dracoLoader = new DRACOLoader();\n // Resolved per call so a setDracoDecoderPath() override made after\n // module load still takes effect.\n dracoLoader.setDecoderPath(resolveDracoDecoderPath());\n loader.setDRACOLoader(dracoLoader);\n } catch (error) {\n // If DRACOLoader isn't available for any reason, proceed without it.\n // GLTFLoader will throw if the file actually contains DRACO-compressed data.\n console.debug(\"DRACOLoader setup failed or unavailable\", error);\n }\n\n loader.load(\n path,\n (gltf: GLTF) => {\n resolve(gltf);\n },\n undefined,\n (error: unknown) => {\n console.debug(\"GLTFLoader failed to load\", error);\n reject(error);\n },\n );\n });\n};\n\nexport const loadAudio = (path: string): Promise<AudioBuffer> => {\n return new Promise((resolve, reject) => {\n const loader = new THREE.AudioLoader();\n loader.load(\n path,\n (buffer: AudioBuffer) => {\n resolve(buffer);\n },\n undefined,\n (error: unknown) => {\n reject(error);\n },\n );\n });\n};\n\nexport const loadVideo = (path: string): Promise<HTMLVideoElement> => {\n return new Promise((resolve, reject) => {\n const video = document.createElement(\"video\");\n video.addEventListener(\"loadedmetadata\", () => {\n video.setAttribute(\"playsinline\", \"\");\n resolve(video);\n });\n video.addEventListener(\"error\", () => {\n reject(new Error(`Failed to load video: ${path}`));\n });\n video.src = path;\n });\n};\n\nexport const loadTexture = (path: string): Promise<THREE.Texture> => {\n return new Promise((resolve, reject) => {\n const loader = new THREE.TextureLoader();\n loader.load(\n path,\n (texture: THREE.Texture) => {\n resolve(texture);\n },\n undefined,\n (error: unknown) => {\n reject(error);\n },\n );\n });\n};\n\nexport const loadTextures = (paths: string[]): Promise<THREE.Texture[]> => {\n const loader = new THREE.TextureLoader();\n const promises: Array<Promise<THREE.Texture>> = [];\n for (let i = 0; i < paths.length; i++) {\n promises.push(\n new Promise((resolve, reject) => {\n loader.load(\n paths[i],\n (texture: THREE.Texture) => {\n resolve(texture);\n },\n undefined,\n (error: unknown) => {\n reject(error);\n },\n );\n }),\n );\n }\n return Promise.all(promises);\n};\n","import * as THREE from \"three\";\n\nimport { Object3DRef, TransformComponent } from \"../components\";\nimport { InstancedMeshComponent } from \"../components/InstancedMesh\";\nimport {\n type CubeMeshParameters,\n type PlaneMeshParameters,\n type RadiusHeightMeshParameters,\n type RadiusMeshParameters,\n} from \"../components/MeshGeometry\";\nimport { loadGLTF } from \"../utils/loader\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\n// ---------------------------------------------------------------------------\n// Geometry helpers (primitive kinds)\n// ---------------------------------------------------------------------------\n\nfunction buildGeometry(component: InstancedMeshComponent): THREE.BufferGeometry {\n const p = component.getSanitizedParameters();\n\n switch (component.meshKind) {\n case \"cube\": {\n const params = p as CubeMeshParameters;\n return new THREE.BoxGeometry(params.width, params.height, params.depth);\n }\n case \"plane\": {\n const params = p as PlaneMeshParameters;\n return new THREE.PlaneGeometry(params.width, params.height);\n }\n case \"sphere\": {\n const params = p as RadiusMeshParameters;\n return new THREE.SphereGeometry(params.radius, 24, 24);\n }\n case \"cylinder\": {\n const params = p as RadiusHeightMeshParameters;\n return new THREE.CylinderGeometry(params.radius, params.radius, params.height, 20);\n }\n case \"capsule\": {\n const params = p as RadiusHeightMeshParameters;\n return new THREE.CapsuleGeometry(params.radius, params.height, 4, 8);\n }\n default:\n return new THREE.BoxGeometry(1, 1, 1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Matrix composition helper\n// ---------------------------------------------------------------------------\n\nconst _position = new THREE.Vector3();\nconst _quaternion = new THREE.Quaternion();\nconst _euler = new THREE.Euler();\nconst _scale = new THREE.Vector3();\nconst _matrix = new THREE.Matrix4();\nconst _modelMatrix = new THREE.Matrix4();\n\nfunction instanceTransformFromComponent(\n transform: TransformComponent,\n out: THREE.Matrix4,\n): void {\n _position.set(transform.position.x, transform.position.y, transform.position.z);\n _euler.set(transform.rotation.x, transform.rotation.y, transform.rotation.z, \"XYZ\");\n _quaternion.setFromEuler(_euler);\n _scale.set(transform.scale.x, transform.scale.y, transform.scale.z);\n out.compose(_position, _quaternion, _scale);\n}\n\n// ---------------------------------------------------------------------------\n// Dispose helpers\n// ---------------------------------------------------------------------------\n\nfunction disposePrimitiveInstancedMesh(mesh: THREE.InstancedMesh): void {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n for (const m of mesh.material) {\n m.dispose();\n }\n } else {\n (mesh.material as THREE.Material).dispose();\n }\n}\n\nfunction disposeModelGroup(group: THREE.Object3D): void {\n group.traverse((child) => {\n const im = child as THREE.InstancedMesh;\n if (im.isInstancedMesh) {\n im.geometry.dispose();\n if (Array.isArray(im.material)) {\n for (const m of im.material) {\n m.dispose();\n }\n } else {\n (im.material as THREE.Material).dispose();\n }\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Per-mesh entry for model kind\n// ---------------------------------------------------------------------------\n\ntype ModelMeshEntry = {\n localMatrix: THREE.Matrix4;\n instancedMesh: THREE.InstancedMesh;\n};\n\n// ---------------------------------------------------------------------------\n// InstancedMeshSystem\n// ---------------------------------------------------------------------------\n\n/**\n * Maintains the runtime geometry for entities with an {@link InstancedMeshComponent}.\n *\n * - **Primitive kinds** (`cube`, `sphere`, `plane`, `cylinder`, `capsule`): creates a single\n * `THREE.InstancedMesh` on the anchor and writes per-instance matrices every frame.\n * - **Model kind** (`model`): asynchronously loads the GLTF/GLB at `comp.modelPath`, traverses\n * the scene to collect all `THREE.Mesh` nodes, and creates one `THREE.InstancedMesh` per mesh\n * (preserving the mesh's local transform and original materials). All sub-meshes are grouped\n * under a `THREE.Group` stored in `comp.instancedMesh`. Per-instance matrices are composed as\n * `instanceTransform × meshLocalMatrix` every frame.\n *\n * Geometry is rebuilt whenever the signature (`meshKind:parameters:instanceCount` for primitives,\n * `model:path:instanceCount` for model kind) changes.\n */\nexport class InstancedMeshSystem implements EcsSystem {\n /** Signature tracking for geometry + instance count changes. */\n private readonly geometrySignatures = new Map<number, string>();\n /** Signature being loaded per entity. Maps entityId → geometrySignature in-flight.\n * Prevents re-dispatching a load every frame while comp.instancedMesh is still null. */\n private readonly loadingSignatures = new Map<number, string>();\n /** Per-mesh data for model kind, populated after GLTF load. */\n private readonly modelMeshEntries = new Map<number, ModelMeshEntry[]>();\n /**\n * System-internal ref to the Three.js mesh/group most recently placed on\n * the anchor by this system. Used for cleanup on rebuild instead of\n * `comp.instancedMesh`, which can be stale (pointing to a disposed mesh)\n * after an undo/redo restores a history snapshot captured at an earlier\n * geometry configuration. Relying on the stale comp ref would skip removal\n * of the current live mesh → ghost mesh in the scene.\n */\n private readonly trackedMeshes = new Map<number, THREE.Object3D>();\n\n update(world: World): void {\n const entityIds = world.query(InstancedMeshComponent);\n\n // Prune stale tracking for destroyed entities.\n const alive = new Set<number>(entityIds);\n for (const trackedId of this.geometrySignatures.keys()) {\n if (!alive.has(trackedId)) this.geometrySignatures.delete(trackedId);\n }\n for (const trackedId of this.loadingSignatures.keys()) {\n if (!alive.has(trackedId)) this.loadingSignatures.delete(trackedId);\n }\n for (const trackedId of this.modelMeshEntries.keys()) {\n if (!alive.has(trackedId)) this.modelMeshEntries.delete(trackedId);\n }\n for (const trackedId of this.trackedMeshes.keys()) {\n if (!alive.has(trackedId)) this.trackedMeshes.delete(trackedId);\n }\n\n for (const entityId of entityIds) {\n const comp = world.getComponent(\n entityId,\n InstancedMeshComponent,\n ) as InstancedMeshComponent | undefined;\n if (!comp) continue;\n\n const objectRef = world.getComponent(entityId, Object3DRef);\n const anchor: THREE.Object3D | null = objectRef?.object ?? null;\n if (!anchor) continue;\n\n const instanceCount = comp.instanceEntityIds.length;\n const geometrySignature =\n comp.meshKind === \"model\"\n ? `model:${comp.modelPath}:${instanceCount}`\n : `${comp.meshKind}:${JSON.stringify(comp.meshParameters)}:${instanceCount}`;\n\n // Re-sync comp.instancedMesh from system tracking when it has been\n // nulled out by an undo/redo snapshot restore (cloneHistoryValue sets it\n // to null to prevent stale Three.js refs in history). Without this the\n // every-frame matrix-update path below would crash on a null ref.\n if (comp.instancedMesh === null) {\n const tracked = this.trackedMeshes.get(entityId);\n if (tracked) {\n comp.instancedMesh = tracked;\n }\n }\n\n // While a load for the current signature is in-flight, instancedMesh stays null\n // but we must NOT treat that as \"needsRebuild\" — doing so would clear loadingSignatures\n // and re-dispatch the load every frame, causing duplicate groups in the scene.\n // Use trackedMeshes (system-internal) instead of comp.instancedMesh: after an\n // undo/redo the component ref is null (cleared by cloneHistoryValue) even when\n // the mesh hasn't changed, so relying on comp.instancedMesh would force a needless\n // rebuild (and disposal/creation cycle) on every transform undo.\n const pendingLoadSignature = this.loadingSignatures.get(entityId);\n const needsRebuild =\n (!this.trackedMeshes.has(entityId) || this.geometrySignatures.get(entityId) !== geometrySignature) &&\n pendingLoadSignature !== geometrySignature;\n\n if (needsRebuild) {\n // Dispose previous container using the system-internal tracked ref.\n // comp.instancedMesh may point to a stale/disposed mesh after an\n // undo/redo restores a snapshot — using it for cleanup would leave the\n // current live mesh in the anchor, producing a ghost.\n const trackedMesh = this.trackedMeshes.get(entityId);\n if (trackedMesh) {\n anchor.remove(trackedMesh);\n if ((trackedMesh as THREE.InstancedMesh).isInstancedMesh) {\n disposePrimitiveInstancedMesh(trackedMesh as THREE.InstancedMesh);\n } else {\n disposeModelGroup(trackedMesh);\n }\n this.trackedMeshes.delete(entityId);\n }\n comp.instancedMesh = null;\n\n // Cancel an in-flight load only when the target signature changed\n // (e.g. user changed path or instance count). Preserve the slot when\n // rebuilding for any other reason to avoid re-dispatching.\n if (pendingLoadSignature !== undefined && pendingLoadSignature !== geometrySignature) {\n this.loadingSignatures.delete(entityId);\n this.modelMeshEntries.delete(entityId);\n }\n\n // No instances — record the empty signature so we don't re-enter every frame,\n // but skip geometry creation (existing mesh already disposed above).\n if (instanceCount === 0) {\n this.geometrySignatures.set(entityId, geometrySignature);\n continue;\n }\n\n if (comp.meshKind === \"model\") {\n // Async GLTF load — skip this entity until the load completes.\n if (comp.modelPath && !this.loadingSignatures.has(entityId)) {\n this.loadingSignatures.set(entityId, geometrySignature);\n const targetSignature = geometrySignature;\n const targetEntityId = entityId;\n\n loadGLTF(comp.modelPath)\n .then((gltf) => {\n // Guard: entity still alive.\n if (!world.hasEntity(targetEntityId)) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n const currentComp = world.getComponent(\n targetEntityId,\n InstancedMeshComponent,\n ) as InstancedMeshComponent | undefined;\n if (!currentComp) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n // Guard: signature unchanged (no path/count change during load).\n const currentSig = `model:${currentComp.modelPath}:${currentComp.instanceEntityIds.length}`;\n if (currentSig !== targetSignature) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n const currentRef = world.getComponent(targetEntityId, Object3DRef);\n const currentAnchor: THREE.Object3D | null = currentRef?.object ?? null;\n if (!currentAnchor) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n // Safety: remove any stale mesh set by a concurrent load that\n // raced to completion before this one.\n if (currentComp.instancedMesh) {\n currentAnchor.remove(currentComp.instancedMesh);\n disposeModelGroup(currentComp.instancedMesh);\n currentComp.instancedMesh = null;\n }\n\n const count = Math.max(1, currentComp.instanceEntityIds.length);\n const entries: ModelMeshEntry[] = [];\n\n // Ensure world matrices are up to date before extracting local transforms.\n gltf.scene.updateWorldMatrix(true, true);\n\n gltf.scene.traverse((child) => {\n const meshChild = child as THREE.Mesh;\n if (!meshChild.isMesh) return;\n\n const geometry = meshChild.geometry.clone();\n const sourceMaterial = Array.isArray(meshChild.material)\n ? (meshChild.material as THREE.Material[]).map((m) => m.clone())\n : (meshChild.material as THREE.Material).clone();\n\n meshChild.updateWorldMatrix(true, false);\n const localMatrix = meshChild.matrixWorld.clone();\n\n const instancedMesh = new THREE.InstancedMesh(\n geometry,\n Array.isArray(sourceMaterial)\n ? (sourceMaterial as THREE.Material[])\n : (sourceMaterial as THREE.Material),\n count,\n );\n instancedMesh.castShadow = currentComp.castShadow;\n instancedMesh.receiveShadow = currentComp.receiveShadow;\n\n for (let i = 0; i < count; i++) {\n const instanceEntityId = currentComp.instanceEntityIds[i];\n const instTransform =\n instanceEntityId !== undefined\n ? (world.getComponent(instanceEntityId, TransformComponent) ?? null)\n : null;\n if (instTransform) {\n instanceTransformFromComponent(instTransform, _matrix);\n } else {\n _matrix.identity();\n }\n _modelMatrix.multiplyMatrices(_matrix, localMatrix);\n instancedMesh.setMatrixAt(i, _modelMatrix);\n }\n instancedMesh.instanceMatrix.needsUpdate = true;\n\n entries.push({ localMatrix, instancedMesh });\n });\n\n if (entries.length === 0) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n const group = new THREE.Group();\n for (const entry of entries) {\n group.add(entry.instancedMesh);\n }\n\n currentAnchor.add(group);\n currentComp.instancedMesh = group;\n this.modelMeshEntries.set(targetEntityId, entries);\n this.geometrySignatures.set(targetEntityId, targetSignature);\n this.trackedMeshes.set(targetEntityId, group);\n this.loadingSignatures.delete(targetEntityId);\n })\n .catch(() => {\n this.loadingSignatures.delete(targetEntityId);\n });\n }\n // Skip synchronous build for model kind — wait for async load.\n continue;\n }\n\n // --- Primitive kinds: synchronous build ---\n const count = instanceCount;\n const geometry = buildGeometry(comp);\n const material = new THREE.MeshStandardMaterial({ color: \"#ffffff\" });\n const instancedMesh = new THREE.InstancedMesh(geometry, material, count);\n instancedMesh.castShadow = comp.castShadow;\n instancedMesh.receiveShadow = comp.receiveShadow;\n\n for (let i = 0; i < count; i++) {\n const instanceEntityId = comp.instanceEntityIds[i];\n const instTransform =\n instanceEntityId !== undefined\n ? (world.getComponent(instanceEntityId, TransformComponent) ?? null)\n : null;\n if (instTransform) {\n instanceTransformFromComponent(instTransform, _matrix);\n } else {\n _matrix.identity();\n }\n instancedMesh.setMatrixAt(i, _matrix);\n }\n instancedMesh.instanceMatrix.needsUpdate = true;\n\n anchor.add(instancedMesh);\n comp.instancedMesh = instancedMesh;\n this.trackedMeshes.set(entityId, instancedMesh);\n this.geometrySignatures.set(entityId, geometrySignature);\n } else {\n // --- Every-frame matrix update ---\n if (comp.meshKind === \"model\") {\n const entries = this.modelMeshEntries.get(entityId);\n if (entries) {\n const count = comp.instanceEntityIds.length;\n for (const entry of entries) {\n for (let i = 0; i < count; i++) {\n const instanceEntityId = comp.instanceEntityIds[i];\n const instTransform =\n instanceEntityId !== undefined\n ? (world.getComponent(instanceEntityId, TransformComponent) ?? null)\n : null;\n if (instTransform) {\n instanceTransformFromComponent(instTransform, _matrix);\n } else {\n _matrix.identity();\n }\n _modelMatrix.multiplyMatrices(_matrix, entry.localMatrix);\n entry.instancedMesh.setMatrixAt(i, _modelMatrix);\n }\n entry.instancedMesh.instanceMatrix.needsUpdate = true;\n entry.instancedMesh.castShadow = comp.castShadow;\n entry.instancedMesh.receiveShadow = comp.receiveShadow;\n }\n }\n } else {\n const im = comp.instancedMesh as THREE.InstancedMesh;\n const count = comp.instanceEntityIds.length;\n for (let i = 0; i < count; i++) {\n const instanceEntityId = comp.instanceEntityIds[i];\n const instTransform =\n instanceEntityId !== undefined\n ? (world.getComponent(instanceEntityId, TransformComponent) ?? null)\n : null;\n if (instTransform) {\n instanceTransformFromComponent(instTransform, _matrix);\n } else {\n _matrix.identity();\n }\n im.setMatrixAt(i, _matrix);\n }\n im.instanceMatrix.needsUpdate = true;\n im.castShadow = comp.castShadow;\n im.receiveShadow = comp.receiveShadow;\n }\n }\n }\n }\n}\n","import type * as THREE from \"three\";\n\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nexport class RenderSystem implements EcsSystem {\n private readonly renderer: THREE.WebGLRenderer;\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private readonly afterRender?: () => void;\n\n constructor(\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n afterRender?: () => void,\n ) {\n this.renderer = renderer;\n this.scene = scene;\n this.camera = camera;\n this.afterRender = afterRender;\n }\n\n update(_world: World): void {\n if (this.scene.userData.ecsPostprocessingComposerActive === true) {\n const composer = this.scene.userData.ecsPostprocessingComposer as\n | {\n setSize: (width: number, height: number) => void;\n render: () => void;\n }\n | undefined;\n\n if (composer) {\n const width = Math.max(1, this.renderer.domElement.clientWidth);\n const height = Math.max(1, this.renderer.domElement.clientHeight);\n composer.setSize(width, height);\n composer.render();\n } else {\n this.renderer.render(this.scene, this.camera);\n }\n\n this.afterRender?.();\n return;\n }\n\n this.renderer.render(this.scene, this.camera);\n this.afterRender?.();\n }\n}\n","import { ParentId } from \"../components\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\n\n/**\n * Collect the given roots plus every descendant, BFS parent-first, using the\n * `ParentId` component edges. Parent-first ordering matters: serialization\n * renumbers ids in this order and instantiation creates entities in file\n * order, so parents always exist before their children are linked.\n */\nexport function collectEntitySubtree(\n world: World,\n rootIds: EntityId[],\n): EntityId[] {\n // Build a parent → children index once instead of scanning per node.\n const childrenByParent = new Map<EntityId, EntityId[]>();\n for (const entityId of world.query(ParentId)) {\n const parentId = world.getComponent(entityId, ParentId)?.value;\n if (parentId === null || parentId === undefined) {\n continue;\n }\n const siblings = childrenByParent.get(parentId);\n if (siblings) {\n siblings.push(entityId);\n } else {\n childrenByParent.set(parentId, [entityId]);\n }\n }\n\n const ordered: EntityId[] = [];\n const seen = new Set<EntityId>();\n const queue = [...rootIds];\n\n while (queue.length > 0) {\n const entityId = queue.shift() as EntityId;\n if (seen.has(entityId)) {\n continue;\n }\n seen.add(entityId);\n ordered.push(entityId);\n\n const children = childrenByParent.get(entityId);\n if (children) {\n queue.push(...children.sort((a, b) => a - b));\n }\n }\n\n return ordered;\n}\n","import type { EcsWorldComponentSnapshot, HydrationPayload } from \"./types\";\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function readString(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n return typeof record.value === \"string\" ? record.value : null;\n}\n\nexport function readTransform(value: unknown): HydrationPayload[\"transform\"] {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n const position = asRecord(record.position);\n const rotation = asRecord(record.rotation);\n const scale = asRecord(record.scale);\n\n return {\n position: position\n ? {\n x: typeof position.x === \"number\" ? position.x : undefined,\n y: typeof position.y === \"number\" ? position.y : undefined,\n z: typeof position.z === \"number\" ? position.z : undefined,\n }\n : undefined,\n rotation: rotation\n ? {\n x: typeof rotation.x === \"number\" ? rotation.x : undefined,\n y: typeof rotation.y === \"number\" ? rotation.y : undefined,\n z: typeof rotation.z === \"number\" ? rotation.z : undefined,\n }\n : undefined,\n scale: scale\n ? {\n x: typeof scale.x === \"number\" ? scale.x : undefined,\n y: typeof scale.y === \"number\" ? scale.y : undefined,\n z: typeof scale.z === \"number\" ? scale.z : undefined,\n }\n : undefined,\n };\n}\n\nexport function readByComponent(\n components: EcsWorldComponentSnapshot[],\n componentName: string,\n): Map<number, unknown> {\n const component = components.find((entry) => entry.component === componentName);\n const map = new Map<number, unknown>();\n\n if (!component) {\n return map;\n }\n\n for (const entry of component.entries) {\n map.set(entry.entityId, entry.value);\n }\n\n return map;\n}\n\nexport function readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n","import type { EcsWorldStateSnapshotLike, ComponentValueMaps } from \"./types\";\nimport { readByComponent } from \"./readers\";\n\nexport function buildComponentValueMaps(\n snapshot: EcsWorldStateSnapshotLike,\n): ComponentValueMaps {\n return {\n object3DRefValues: readByComponent(snapshot.components, \"Object3DRef\"),\n nameValues: readByComponent(snapshot.components, \"Name\"),\n transformValues: readByComponent(snapshot.components, \"TransformComponent\"),\n modelValues: readByComponent(snapshot.components, \"ModelComponent\"),\n imageValues: readByComponent(snapshot.components, \"ImageComponent\"),\n spriteValues: readByComponent(snapshot.components, \"SpriteComponent\"),\n videoValues: readByComponent(snapshot.components, \"VideoComponent\"),\n cameraValues: readByComponent(snapshot.components, \"CameraComponent\"),\n environmentValues: readByComponent(snapshot.components, \"Environment\"),\n postprocessingValues: readByComponent(snapshot.components, \"Postprocessing\"),\n audioValues: readByComponent(snapshot.components, \"AudioComponent\"),\n imageTargetValues: readByComponent(snapshot.components, \"ImageTarget\"),\n lightValues: readByComponent(snapshot.components, \"LightComponent\"),\n materialValues: readByComponent(snapshot.components, \"MaterialComponent\"),\n meshGeometryValues: readByComponent(snapshot.components, \"MeshGeometryComponent\"),\n selectableValues: readByComponent(snapshot.components, \"Selectable\"),\n physicsValues: readByComponent(snapshot.components, \"PhysicsComponent\"),\n animationValues: readByComponent(snapshot.components, \"AnimationComponent\"),\n imageTargetAnchorValues: readByComponent(snapshot.components, \"ImageTargetAnchor\"),\n scriptValues: readByComponent(snapshot.components, \"ScriptComponent\"),\n scriptObjectValues: readByComponent(\n snapshot.components,\n \"ScriptObjectComponent\",\n ),\n xrRigValues: readByComponent(snapshot.components, \"XRRigComponent\"),\n vrTeleportAreaValues: readByComponent(\n snapshot.components,\n \"VRTeleportAreaComponent\",\n ),\n xrInteractableValues: readByComponent(\n snapshot.components,\n \"XRInteractableComponent\",\n ),\n xrInteractorValues: readByComponent(\n snapshot.components,\n \"XRInteractorComponent\",\n ),\n xrHandPoseValues: readByComponent(\n snapshot.components,\n \"XRHandPoseComponent\",\n ),\n xrInteractorSideValues: readByComponent(\n snapshot.components,\n \"XRInteractorSideComponent\",\n ),\n instancedMeshValues: readByComponent(snapshot.components, \"InstancedMeshComponent\"),\n instanceSlotValues: readByComponent(snapshot.components, \"InstanceSlotComponent\"),\n prefabNodeValues: readByComponent(snapshot.components, \"PrefabNode\"),\n prefabInstanceValues: readByComponent(snapshot.components, \"PrefabInstance\"),\n };\n}\n","import type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { EcsWorldStateSnapshotLike } from \"./types\";\nimport { asRecord, readByComponent } from \"./readers\";\n\nexport function applyParentLinks(\n snapshot: EcsWorldStateSnapshotLike,\n idMap: Map<number, number>,\n objectManagementSystem: ObjectManagementSystem,\n world: World,\n): void {\n const parentValues = readByComponent(snapshot.components, \"ParentId\");\n\n for (const [sourceEntityId, parentValue] of parentValues.entries()) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const parentRecord = asRecord(parentValue);\n const sourceParentId =\n parentRecord && typeof parentRecord.value === \"number\"\n ? parentRecord.value\n : null;\n\n if (sourceParentId === null) {\n objectManagementSystem.setParent(world, targetEntityId, null, {\n preserveWorldTransform: false,\n });\n continue;\n }\n\n const mappedParentId = idMap.get(sourceParentId);\n objectManagementSystem.setParent(world, targetEntityId, mappedParentId ?? null, {\n preserveWorldTransform: false,\n });\n }\n}\n","import {\n InstancedMeshComponent,\n Object3DRef,\n ScriptComponent,\n ScriptObjectComponent,\n VRTeleportAreaComponent,\n XRInteractorComponent,\n XRInteractorSideComponent,\n XRHandPoseComponent,\n XRInteractableComponent,\n XRRigComponent,\n} from \"../components\";\nimport { createHandPoseEntry } from \"../components/XRHandPose\";\nimport { createAttachPoint } from \"../components/XRInteractable\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord } from \"./readers\";\n\nfunction remapEntityRefsInScriptData(\n data: Record<string, unknown>,\n idMap: Map<number, number>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.type === \"entity\" && typeof v.value === \"number\") {\n result[key] = { ...v, value: idMap.get(v.value) ?? v.value };\n } else if (\n v.type === \"component\" &&\n v.value !== null &&\n typeof v.value === \"object\" &&\n !Array.isArray(v.value) &&\n typeof (v.value as Record<string, unknown>).entityId === \"number\"\n ) {\n const ref = v.value as Record<string, unknown>;\n result[key] = {\n ...v,\n value: { ...ref, entityId: idMap.get(ref.entityId as number) ?? ref.entityId },\n };\n } else {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function restorePostCreateComponents(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n idMap: Map<number, number>,\n): void {\n const objectRef = world.getComponent(targetEntityId, Object3DRef)?.object ?? null;\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType !== \"audio\") {\n const sourceOptions = asRecord(sourceAudio.options) ?? {};\n\n objectManagementSystem.createComponentNow(\n \"audio\",\n world,\n targetEntityId,\n typeof sourceAudio.path === \"string\" ? sourceAudio.path : \"\",\n sourceOptions,\n {\n object: objectRef,\n listener: objectManagementSystem.getOrCreateAudioListener(),\n isEditor: objectManagementSystem.isEditorMode(),\n },\n );\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType !== \"imageTarget\") {\n objectManagementSystem.createComponentNow(\n \"imageTarget\",\n world,\n targetEntityId,\n {\n targets: Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [],\n compiledTargetUrl:\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined,\n },\n );\n }\n\n const sourceImageTargetAnchor = asRecord(values.imageTargetAnchorValues.get(sourceEntityId));\n if (sourceImageTargetAnchor) {\n // ImageTargetAnchor.targetId references ImageTarget.targets[].id, not an entity id.\n // Preserve the id directly; idMap remapping is only valid for entity references.\n const mappedTargetId =\n typeof sourceImageTargetAnchor.targetId === \"number\" &&\n Number.isFinite(sourceImageTargetAnchor.targetId)\n ? sourceImageTargetAnchor.targetId\n : null;\n\n objectManagementSystem.createComponentNow(\"imageTargetAnchor\", world, targetEntityId, {\n targetId: mappedTargetId,\n targetUrl:\n typeof sourceImageTargetAnchor.targetUrl === \"string\"\n ? sourceImageTargetAnchor.targetUrl\n : undefined,\n });\n }\n\n const sourceScript = asRecord(values.scriptValues.get(sourceEntityId));\n if (sourceScript) {\n const entries = Array.isArray(sourceScript.entries)\n ? sourceScript.entries\n .map((entry) => asRecord(entry))\n .filter((entry): entry is Record<string, unknown> => Boolean(entry))\n .map((entry) => {\n const runtimeState: \"idle\" | \"loading\" | \"ready\" | \"error\" | undefined =\n entry.runtimeState === \"idle\" ||\n entry.runtimeState === \"loading\" ||\n entry.runtimeState === \"ready\" ||\n entry.runtimeState === \"error\"\n ? entry.runtimeState\n : undefined;\n\n return {\n entityId: targetEntityId,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data &&\n typeof entry.data === \"object\" &&\n !Array.isArray(entry.data)\n ? remapEntityRefsInScriptData(entry.data as Record<string, unknown>, idMap)\n : {},\n runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\"\n ? entry.runtimeMessage\n : undefined,\n };\n })\n .filter((entry) => entry.className || entry.scriptUrl)\n : [];\n\n // Skip only the ScriptComponent, never the rest of this pass. This was a\n // bare `return`, which exited the whole function — so an entity carrying a\n // Script component with no script picked yet (the state right after adding\n // one) silently lost every component restored below it, XR included.\n if (entries.length) {\n world.addComponent(targetEntityId, new ScriptComponent(entries));\n }\n }\n\n // Restore ScriptObjectComponent.data (with entity-ref remapping). The factory\n // already created the component with scriptUrl/className/enabled; runtimeState\n // is intentionally left \"idle\" so ScriptObjectSystem loads cleanly.\n const sourceScriptObject = asRecord(values.scriptObjectValues.get(sourceEntityId));\n if (sourceScriptObject) {\n const soc = world.getComponent(targetEntityId, ScriptObjectComponent);\n const data = asRecord(sourceScriptObject.data);\n if (soc && data) {\n soc.data = remapEntityRefsInScriptData(data, idMap);\n }\n }\n\n // Restore the XR authoring components' saved values.\n //\n // The entity factories seed these with DEFAULTS at create time (they only see\n // the create payload, not the snapshot), so without this pass a saved\n // teleport area would come back as a fresh 10×10 plane and the author's\n // width/depth/shape edits would be silently discarded on reload.\n {\n const sourceXrRig = asRecord(values.xrRigValues.get(sourceEntityId));\n const rig = world.getComponent(targetEntityId, XRRigComponent);\n if (sourceXrRig && rig) {\n if (typeof sourceXrRig.locomotion === \"string\") {\n rig.locomotion = sourceXrRig.locomotion as typeof rig.locomotion;\n }\n if (typeof sourceXrRig.moveSpeed === \"number\") {\n rig.moveSpeed = sourceXrRig.moveSpeed;\n }\n if (typeof sourceXrRig.snapTurn === \"boolean\") {\n rig.snapTurn = sourceXrRig.snapTurn;\n }\n if (typeof sourceXrRig.snapTurnDegrees === \"number\") {\n rig.snapTurnDegrees = sourceXrRig.snapTurnDegrees;\n }\n if (typeof sourceXrRig.teleportArcColor === \"string\") {\n rig.teleportArcColor = sourceXrRig.teleportArcColor;\n }\n if (typeof sourceXrRig.teleportArcInvalidColor === \"string\") {\n rig.teleportArcInvalidColor = sourceXrRig.teleportArcInvalidColor;\n }\n if (typeof sourceXrRig.teleportArcThickness === \"number\") {\n rig.teleportArcThickness = sourceXrRig.teleportArcThickness;\n }\n if (typeof sourceXrRig.fallbackEyeHeight === \"number\") {\n rig.fallbackEyeHeight = sourceXrRig.fallbackEyeHeight;\n }\n }\n }\n\n {\n const sourceArea = asRecord(values.vrTeleportAreaValues.get(sourceEntityId));\n const area = world.getComponent(targetEntityId, VRTeleportAreaComponent);\n if (sourceArea && area) {\n if (typeof sourceArea.enabled === \"boolean\") {\n area.enabled = sourceArea.enabled;\n }\n if (typeof sourceArea.shape === \"string\") {\n // \"cylinder\" is the pre-release alias for \"circle\".\n area.shape =\n sourceArea.shape === \"cylinder\"\n ? \"circle\"\n : (sourceArea.shape as typeof area.shape);\n }\n if (typeof sourceArea.width === \"number\") area.width = sourceArea.width;\n if (typeof sourceArea.depth === \"number\") area.depth = sourceArea.depth;\n }\n }\n\n {\n const sourceInteractable = asRecord(\n values.xrInteractableValues.get(sourceEntityId),\n );\n // CREATED HERE WHEN ABSENT. No entity factory produces an\n // XRInteractableComponent — it is only ever added to an existing object —\n // so hydration is the only thing that can put it back. Merely restoring\n // values onto an already-present component silently dropped grabbing from\n // every loaded scene: it worked in the editor, where the component is live\n // in memory, and vanished at runtime.\n let interactable = world.getComponent(\n targetEntityId,\n XRInteractableComponent,\n );\n if (sourceInteractable && !interactable) {\n interactable = new XRInteractableComponent();\n world.addComponent(targetEntityId, interactable);\n }\n if (sourceInteractable && interactable) {\n if (typeof sourceInteractable.enabled === \"boolean\") {\n interactable.enabled = sourceInteractable.enabled;\n }\n if (typeof sourceInteractable.grabbable === \"boolean\") {\n interactable.grabbable = sourceInteractable.grabbable;\n }\n if (typeof sourceInteractable.pointable === \"boolean\") {\n interactable.pointable = sourceInteractable.pointable;\n }\n if (typeof sourceInteractable.grabReach === \"string\") {\n interactable.grabReach =\n sourceInteractable.grabReach as typeof interactable.grabReach;\n }\n if (typeof sourceInteractable.distanceBehavior === \"string\") {\n interactable.distanceBehavior =\n sourceInteractable.distanceBehavior as typeof interactable.distanceBehavior;\n }\n if (typeof sourceInteractable.grabGesture === \"string\") {\n interactable.grabGesture =\n sourceInteractable.grabGesture as typeof interactable.grabGesture;\n }\n if (typeof sourceInteractable.grabRadius === \"number\") {\n interactable.grabRadius = sourceInteractable.grabRadius;\n }\n if (typeof sourceInteractable.grabHands === \"string\") {\n interactable.grabHands =\n sourceInteractable.grabHands as typeof interactable.grabHands;\n }\n if (typeof sourceInteractable.twoHandRotation === \"string\") {\n interactable.twoHandRotation =\n sourceInteractable.twoHandRotation as typeof interactable.twoHandRotation;\n }\n if (typeof sourceInteractable.allowTwoHandScale === \"boolean\") {\n interactable.allowTwoHandScale = sourceInteractable.allowTwoHandScale;\n }\n if (typeof sourceInteractable.minScale === \"number\") {\n interactable.minScale = sourceInteractable.minScale;\n }\n if (typeof sourceInteractable.maxScale === \"number\") {\n interactable.maxScale = sourceInteractable.maxScale;\n }\n if (Array.isArray(sourceInteractable.attachPoints)) {\n // Rebuilt through the factory so a point saved by an older editor gains\n // any field added since, instead of arriving half-populated.\n interactable.attachPoints = sourceInteractable.attachPoints\n .map((point) => asRecord(point))\n .filter(\n (point): point is Record<string, unknown> =>\n point !== null && typeof point.id === \"string\",\n )\n .map((point) =>\n createAttachPoint(\n point as unknown as Parameters<typeof createAttachPoint>[0],\n ),\n );\n }\n // `throwOnRelease`/`throwStrength` are the pre-0.3.11 names, still present\n // in scenes saved by a published build — read them as a fallback so those\n // projects keep their authored values.\n if (typeof sourceInteractable.applyVelocityOnRelease === \"boolean\") {\n interactable.applyVelocityOnRelease =\n sourceInteractable.applyVelocityOnRelease;\n } else if (typeof sourceInteractable.throwOnRelease === \"boolean\") {\n interactable.applyVelocityOnRelease = sourceInteractable.throwOnRelease;\n }\n if (typeof sourceInteractable.velocityScale === \"number\") {\n interactable.velocityScale = sourceInteractable.velocityScale;\n } else if (typeof sourceInteractable.throwStrength === \"number\") {\n interactable.velocityScale = sourceInteractable.throwStrength;\n }\n const grabPos = asRecord(sourceInteractable.grabOffsetPosition);\n if (grabPos) {\n interactable.grabOffsetPosition = {\n x: typeof grabPos.x === \"number\" ? grabPos.x : 0,\n y: typeof grabPos.y === \"number\" ? grabPos.y : 0,\n z: typeof grabPos.z === \"number\" ? grabPos.z : 0,\n };\n }\n const grabRot = asRecord(sourceInteractable.grabOffsetRotation);\n if (grabRot) {\n interactable.grabOffsetRotation = {\n x: typeof grabRot.x === \"number\" ? grabRot.x : 0,\n y: typeof grabRot.y === \"number\" ? grabRot.y : 0,\n z: typeof grabRot.z === \"number\" ? grabRot.z : 0,\n };\n }\n if (typeof sourceInteractable.hoverBehavior === \"string\") {\n interactable.hoverBehavior =\n sourceInteractable.hoverBehavior as typeof interactable.hoverBehavior;\n } else if (sourceInteractable.highlightOnHover === false) {\n // Migration: the old boolean is the only hover setting older scenes\n // carry, and turning it off meant \"no feedback\".\n interactable.hoverBehavior = \"none\";\n }\n if (typeof sourceInteractable.hoverColor === \"string\") {\n interactable.hoverColor = sourceInteractable.hoverColor;\n }\n if (typeof sourceInteractable.hoverScale === \"number\") {\n interactable.hoverScale = sourceInteractable.hoverScale;\n }\n }\n }\n\n {\n const sourceHandPose = asRecord(\n values.xrHandPoseValues.get(sourceEntityId),\n );\n // Created here when absent, for the same reason as XRInteractableComponent\n // above: no entity factory makes one, so hydration is its only way back.\n let handPose = world.getComponent(targetEntityId, XRHandPoseComponent);\n if (sourceHandPose && !handPose) {\n handPose = new XRHandPoseComponent();\n world.addComponent(targetEntityId, handPose);\n }\n if (sourceHandPose && handPose) {\n if (typeof sourceHandPose.enabled === \"boolean\") {\n handPose.enabled = sourceHandPose.enabled;\n }\n if (Array.isArray(sourceHandPose.poses)) {\n // Rebuilt through the factory so a pose saved by an older editor gains\n // any fields added since, rather than arriving half-populated.\n handPose.poses = sourceHandPose.poses\n .map((entry) => asRecord(entry))\n .filter(\n (entry): entry is Record<string, unknown> =>\n entry !== null && typeof entry.id === \"string\",\n )\n .map((entry) =>\n createHandPoseEntry(\n entry as unknown as Parameters<typeof createHandPoseEntry>[0],\n ),\n );\n }\n }\n }\n\n {\n const sourceInteractor = asRecord(\n values.xrInteractorValues.get(sourceEntityId),\n );\n const interactor = world.getComponent(targetEntityId, XRInteractorComponent);\n if (sourceInteractor && interactor) {\n if (typeof sourceInteractor.interactorType === \"string\") {\n interactor.interactorType =\n sourceInteractor.interactorType as typeof interactor.interactorType;\n }\n if (typeof sourceInteractor.handPreset === \"string\") {\n interactor.handPreset =\n sourceInteractor.handPreset as typeof interactor.handPreset;\n }\n if (typeof sourceInteractor.handColor === \"string\") {\n interactor.handColor = sourceInteractor.handColor;\n }\n if (typeof sourceInteractor.handOpacity === \"number\") {\n interactor.handOpacity = sourceInteractor.handOpacity;\n }\n if (typeof sourceInteractor.handEmissiveIntensity === \"number\") {\n interactor.handEmissiveIntensity =\n sourceInteractor.handEmissiveIntensity;\n }\n if (typeof sourceInteractor.rayVisibility === \"string\") {\n interactor.rayVisibility =\n sourceInteractor.rayVisibility as typeof interactor.rayVisibility;\n } else if (typeof sourceInteractor.showRay === \"boolean\") {\n // Migration: `showRay` was the pre-0.3.11 boolean, and its \"on\" state\n // meant exactly today's `interacting`.\n interactor.rayVisibility = sourceInteractor.showRay\n ? \"interacting\"\n : \"never\";\n }\n if (typeof sourceInteractor.rayColor === \"string\") {\n interactor.rayColor = sourceInteractor.rayColor;\n }\n if (typeof sourceInteractor.rayThickness === \"number\") {\n interactor.rayThickness = sourceInteractor.rayThickness;\n }\n }\n }\n\n {\n // The left/right slots are plain `empty` entities, so the factory never\n // creates their side marker — restore it or authored hand content loses\n // track of which hand it belongs to.\n const sourceSide = asRecord(\n values.xrInteractorSideValues.get(sourceEntityId),\n );\n if (sourceSide && typeof sourceSide.side === \"string\") {\n const existing = world.getComponent(\n targetEntityId,\n XRInteractorSideComponent,\n );\n if (existing) {\n existing.side = sourceSide.side as typeof existing.side;\n } else {\n world.addComponent(\n targetEntityId,\n new XRInteractorSideComponent({\n side: sourceSide.side as \"left\" | \"right\",\n }),\n );\n }\n }\n }\n\n // Restore the XR rig's tracking origin alongside its other fields.\n {\n const sourceRigOrigin = asRecord(values.xrRigValues.get(sourceEntityId));\n const rigForOrigin = world.getComponent(targetEntityId, XRRigComponent);\n if (\n sourceRigOrigin &&\n rigForOrigin &&\n typeof sourceRigOrigin.trackingOrigin === \"string\"\n ) {\n rigForOrigin.trackingOrigin =\n sourceRigOrigin.trackingOrigin as typeof rigForOrigin.trackingOrigin;\n }\n }\n\n // Remap InstancedMeshComponent.instanceEntityIds from snapshot IDs → live IDs.\n {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent && imComponent.instanceEntityIds.length > 0) {\n imComponent.instanceEntityIds = imComponent.instanceEntityIds.map(\n (oldId) => idMap.get(oldId) ?? oldId,\n );\n }\n }\n\n // Remap InstanceSlotComponent.groupEntityId from snapshot ID → live ID.\n {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent && slotComponent.groupEntityId !== -1) {\n slotComponent.groupEntityId =\n idMap.get(slotComponent.groupEntityId) ?? slotComponent.groupEntityId;\n }\n }\n}\n","import {\n AnimationComponent,\n type AnimationComponentOptions,\n} from \"../components\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { asRecord, readBoolean, readNumber } from \"./readers\";\n\nfunction readAnimationClipName(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n if (typeof record.name === \"string\") {\n return record.name;\n }\n\n return null;\n}\n\nfunction readAnimationStates(value: unknown): NonNullable<\n AnimationComponentOptions[\"states\"]\n> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const states: NonNullable<AnimationComponentOptions[\"states\"]> = [];\n\n for (const entry of value) {\n const state = asRecord(entry);\n if (!state) {\n continue;\n }\n\n const name = typeof state.name === \"string\" ? state.name : null;\n const clip = readAnimationClipName(state.clip);\n if (!name || !clip) {\n continue;\n }\n\n states.push({\n name,\n clip,\n clipId: typeof state.clipId === \"string\" ? state.clipId : undefined,\n loop: typeof state.loop === \"boolean\" ? state.loop : false,\n });\n }\n\n return states;\n}\n\nfunction readAnimationClipSources(\n value: unknown,\n): NonNullable<AnimationComponentOptions[\"externalClipSources\"]> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const seen = new Set<string>();\n const sources: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\") {\n continue;\n }\n\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n sources.push(trimmed);\n }\n\n return sources;\n}\n\nfunction toAnimationOptions(\n sourceAnimation: Record<string, unknown>,\n): AnimationComponentOptions {\n const paused = readBoolean(sourceAnimation.paused);\n const reverse = readBoolean(sourceAnimation.reverse);\n const timeScale = readNumber(sourceAnimation.timeScale);\n const crossFadeDuration = readNumber(sourceAnimation.crossFadeDuration);\n const states = readAnimationStates(sourceAnimation.states);\n const externalClipSources = readAnimationClipSources(\n sourceAnimation.externalClipSources,\n );\n const activeStateName =\n typeof sourceAnimation.activeStateName === \"string\"\n ? sourceAnimation.activeStateName\n : typeof sourceAnimation.activeState === \"string\"\n ? sourceAnimation.activeState\n : typeof (sourceAnimation.active as { name?: unknown } | undefined)?.name ===\n \"string\"\n ? ((sourceAnimation.active as { name: string }).name ?? null)\n : null;\n\n return {\n paused,\n reverse,\n timeScale,\n crossFadeDuration,\n states,\n externalClipSources,\n activeState: activeStateName,\n };\n}\n\nexport function restoreAnimationComponent(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceAnimation: Record<string, unknown>,\n): void {\n const options = toAnimationOptions(sourceAnimation);\n let animation = world.getComponent(targetEntityId, AnimationComponent);\n\n if (!animation) {\n objectManagementSystem.createComponentNow(\n \"animation\",\n world,\n targetEntityId,\n options,\n );\n animation = world.getComponent(targetEntityId, AnimationComponent);\n }\n\n if (!animation) {\n return;\n }\n\n const availableClips = Array.isArray(sourceAnimation.availableClips)\n ? sourceAnimation.availableClips.filter(\n (clip): clip is string => typeof clip === \"string\" && clip.length > 0,\n )\n : [];\n if (availableClips.length > 0) {\n animation.availableClips = [...availableClips];\n }\n\n if (Array.isArray(options.externalClipSources)) {\n animation.setExternalClipSources(options.externalClipSources);\n }\n\n const states = options.states ?? [];\n const hasClips = Array.isArray(animation.clips) && animation.clips.length > 0;\n if (!hasClips) {\n (\n animation as AnimationComponent & {\n __pendingHydratedOptions?: AnimationComponentOptions;\n }\n ).__pendingHydratedOptions = options;\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.paused === \"boolean\") {\n animation.paused = options.paused;\n }\n\n return;\n }\n\n if (states.length > 0) {\n animation.setStates(states);\n }\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.setActiveState(options.activeState, !options.paused);\n }\n\n if (typeof options.paused === \"boolean\") {\n if (options.paused) {\n animation.pauseState();\n } else if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.playState(options.activeState);\n }\n }\n}\n","import {\n AudioComponent,\n CameraComponent,\n Environment,\n type EnvironmentState,\n ImageComponent,\n ImageTarget,\n InstancedMeshComponent,\n LightComponent,\n MaterialComponent,\n MeshGeometryComponent,\n ModelComponent,\n Name,\n Object3DRef,\n PhysicsComponent,\n Postprocessing,\n PrefabInstance,\n PrefabNode,\n Selectable,\n SpriteComponent,\n TransformComponent,\n VideoComponent,\n} from \"../components\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { restoreAnimationComponent } from \"./animation\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord, readBoolean, readNumber, readString, readTransform } from \"./readers\";\n\nfunction readEnvironmentState(value: unknown): Partial<EnvironmentState> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues as Partial<EnvironmentState>;\n }\n\n return record as Partial<EnvironmentState>;\n}\n\nfunction readPostprocessingState(value: unknown): Record<string, unknown> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues;\n }\n\n return record;\n}\n\nexport function restoreComponentState(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n): void {\n const sourceName = readString(values.nameValues.get(sourceEntityId));\n if (sourceName !== null) {\n const nameComponent = world.getComponent(targetEntityId, Name);\n if (nameComponent) {\n nameComponent.value = sourceName;\n }\n }\n\n const sourceObject3DRef = asRecord(values.object3DRefValues.get(sourceEntityId));\n if (sourceObject3DRef) {\n const object3DRefComponent = world.getComponent(targetEntityId, Object3DRef);\n const visibility = readBoolean(sourceObject3DRef.visibility);\n if (object3DRefComponent && typeof visibility === \"boolean\") {\n object3DRefComponent.visibility = visibility;\n }\n }\n\n const sourceTransform = readTransform(values.transformValues.get(sourceEntityId));\n if (sourceTransform) {\n const transformComponent = world.getComponent(targetEntityId, TransformComponent);\n if (transformComponent) {\n if (typeof sourceTransform.position?.x === \"number\") {\n transformComponent.position.x = sourceTransform.position.x;\n }\n if (typeof sourceTransform.position?.y === \"number\") {\n transformComponent.position.y = sourceTransform.position.y;\n }\n if (typeof sourceTransform.position?.z === \"number\") {\n transformComponent.position.z = sourceTransform.position.z;\n }\n\n if (typeof sourceTransform.rotation?.x === \"number\") {\n transformComponent.rotation.x = sourceTransform.rotation.x;\n }\n if (typeof sourceTransform.rotation?.y === \"number\") {\n transformComponent.rotation.y = sourceTransform.rotation.y;\n }\n if (typeof sourceTransform.rotation?.z === \"number\") {\n transformComponent.rotation.z = sourceTransform.rotation.z;\n }\n\n if (typeof sourceTransform.scale?.x === \"number\") {\n transformComponent.scale.x = sourceTransform.scale.x;\n }\n if (typeof sourceTransform.scale?.y === \"number\") {\n transformComponent.scale.y = sourceTransform.scale.y;\n }\n if (typeof sourceTransform.scale?.z === \"number\") {\n transformComponent.scale.z = sourceTransform.scale.z;\n }\n }\n }\n\n const sourceModel = asRecord(values.modelValues.get(sourceEntityId));\n if (sourceModel) {\n const modelComponent = world.getComponent(targetEntityId, ModelComponent);\n if (modelComponent && typeof sourceModel.path === \"string\") {\n modelComponent.path = sourceModel.path;\n }\n }\n\n const sourceImage = asRecord(values.imageValues.get(sourceEntityId));\n if (sourceImage) {\n const imageComponent = world.getComponent(targetEntityId, ImageComponent);\n if (imageComponent) {\n if (typeof sourceImage.path === \"string\") {\n imageComponent.path = sourceImage.path;\n }\n\n const width = readNumber(sourceImage.width);\n if (typeof width === \"number\") {\n imageComponent.width = width;\n }\n\n const height = readNumber(sourceImage.height);\n if (typeof height === \"number\") {\n imageComponent.height = height;\n }\n }\n }\n\n const sourceSprite = asRecord(values.spriteValues.get(sourceEntityId));\n if (sourceSprite) {\n const spriteComponent = world.getComponent(targetEntityId, SpriteComponent);\n if (spriteComponent) {\n if (typeof sourceSprite.path === \"string\") {\n spriteComponent.path = sourceSprite.path;\n }\n\n const width = readNumber(sourceSprite.width);\n if (typeof width === \"number\") {\n spriteComponent.width = width;\n }\n\n const height = readNumber(sourceSprite.height);\n if (typeof height === \"number\") {\n spriteComponent.height = height;\n }\n }\n }\n\n const sourceVideo = asRecord(values.videoValues.get(sourceEntityId));\n if (sourceVideo) {\n const videoComponent = world.getComponent(targetEntityId, VideoComponent);\n if (videoComponent) {\n if (typeof sourceVideo.path === \"string\") {\n videoComponent.path = sourceVideo.path;\n }\n\n const videoOptions = asRecord(sourceVideo.options);\n if (videoOptions) {\n videoComponent.options = {\n ...videoComponent.options,\n ...videoOptions,\n } as typeof videoComponent.options;\n }\n }\n }\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType === \"audio\") {\n const audioComponent = world.getComponent(targetEntityId, AudioComponent);\n if (audioComponent) {\n if (typeof sourceAudio.path === \"string\") {\n audioComponent.path = sourceAudio.path;\n }\n\n const audioOptions = asRecord(sourceAudio.options);\n if (audioOptions) {\n audioComponent.options = {\n ...audioComponent.options,\n ...audioOptions,\n } as typeof audioComponent.options;\n }\n }\n }\n\n const sourceCamera = asRecord(values.cameraValues.get(sourceEntityId));\n if (sourceCamera) {\n const cameraComponent = world.getComponent(targetEntityId, CameraComponent);\n if (cameraComponent) {\n if (\n sourceCamera.projection === \"orthographic\" ||\n sourceCamera.projection === \"perspective\"\n ) {\n cameraComponent.projection = sourceCamera.projection;\n }\n\n if (\n sourceCamera.type === \"3d\" ||\n sourceCamera.type === \"ar\"\n ) {\n cameraComponent.type = sourceCamera.type;\n }\n\n if (typeof sourceCamera.isDefault === \"boolean\") {\n cameraComponent.isDefault = sourceCamera.isDefault;\n }\n\n const fov = readNumber(sourceCamera.fov);\n if (typeof fov === \"number\") {\n cameraComponent.fov = fov;\n }\n\n const near = readNumber(sourceCamera.near);\n if (typeof near === \"number\") {\n cameraComponent.near = near;\n }\n\n const far = readNumber(sourceCamera.far);\n if (typeof far === \"number\") {\n cameraComponent.far = far;\n }\n\n const left = readNumber(sourceCamera.left);\n if (typeof left === \"number\") {\n cameraComponent.left = left;\n }\n\n const right = readNumber(sourceCamera.right);\n if (typeof right === \"number\") {\n cameraComponent.right = right;\n }\n\n const top = readNumber(sourceCamera.top);\n if (typeof top === \"number\") {\n cameraComponent.top = top;\n }\n\n const bottom = readNumber(sourceCamera.bottom);\n if (typeof bottom === \"number\") {\n cameraComponent.bottom = bottom;\n }\n\n const zoom = readNumber(sourceCamera.zoom);\n if (typeof zoom === \"number\") {\n cameraComponent.zoom = zoom;\n }\n }\n }\n\n const sourceEnvironment = readEnvironmentState(\n values.environmentValues.get(sourceEntityId),\n );\n if (sourceEnvironment) {\n let environmentComponent = world.getComponent(targetEntityId, Environment);\n if (!environmentComponent) {\n objectManagementSystem.createComponentNow(\n \"environment\",\n world,\n targetEntityId,\n sourceEnvironment,\n );\n environmentComponent = world.getComponent(targetEntityId, Environment);\n }\n\n if (environmentComponent) {\n environmentComponent.values = new Environment({\n ...environmentComponent.values,\n ...sourceEnvironment,\n }).values;\n }\n }\n\n const sourcePostprocessing = readPostprocessingState(\n values.postprocessingValues.get(sourceEntityId),\n );\n if (sourcePostprocessing) {\n let postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n if (!postprocessingComponent) {\n objectManagementSystem.createComponentNow(\n \"postprocessing\",\n world,\n targetEntityId,\n sourcePostprocessing,\n );\n postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n }\n\n if (postprocessingComponent) {\n postprocessingComponent.values = new Postprocessing({\n ...postprocessingComponent.values,\n ...sourcePostprocessing,\n }).values;\n }\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType === \"imageTarget\") {\n const imageTargetComponent = world.getComponent(targetEntityId, ImageTarget);\n if (imageTargetComponent) {\n imageTargetComponent.targets = Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [];\n\n imageTargetComponent.compiledTargetUrl =\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined;\n\n imageTargetComponent.compiledTargetDir =\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined;\n }\n }\n\n const sourceLight = asRecord(values.lightValues.get(sourceEntityId));\n if (sourceLight) {\n const lightComponent = world.getComponent(targetEntityId, LightComponent);\n const sourceValues = asRecord(sourceLight.values);\n\n if (lightComponent && sourceValues) {\n lightComponent.values = {\n ...lightComponent.values,\n ...sourceValues,\n } as typeof lightComponent.values;\n }\n }\n\n const sourceMaterial = asRecord(values.materialValues.get(sourceEntityId));\n if (sourceMaterial) {\n const materialComponent = world.getComponent(targetEntityId, MaterialComponent);\n const sourceValues = sourceMaterial.values;\n\n if (materialComponent && Array.isArray(sourceValues)) {\n materialComponent.values = sourceValues as typeof materialComponent.values;\n }\n\n // Restore editor-managed material-asset linkage when present.\n const sourceAssetRefs = sourceMaterial.assetRefs;\n if (materialComponent && Array.isArray(sourceAssetRefs)) {\n materialComponent.assetRefs = sourceAssetRefs as (string | null)[];\n }\n }\n\n const sourceMeshGeometry = asRecord(values.meshGeometryValues.get(sourceEntityId));\n if (sourceMeshGeometry) {\n const meshGeometryComponent = world.getComponent(\n targetEntityId,\n MeshGeometryComponent,\n );\n\n if (meshGeometryComponent) {\n const parameters = asRecord(sourceMeshGeometry.parameters);\n if (parameters) {\n meshGeometryComponent.parameters =\n parameters as typeof meshGeometryComponent.parameters;\n }\n\n if (typeof sourceMeshGeometry.modelName === \"string\") {\n meshGeometryComponent.modelName = sourceMeshGeometry.modelName;\n }\n\n if (typeof sourceMeshGeometry.castShadow === \"boolean\") {\n meshGeometryComponent.castShadow = sourceMeshGeometry.castShadow;\n }\n\n if (typeof sourceMeshGeometry.receiveShadow === \"boolean\") {\n meshGeometryComponent.receiveShadow = sourceMeshGeometry.receiveShadow;\n }\n }\n }\n\n const sourceSelectable = asRecord(values.selectableValues.get(sourceEntityId));\n if (sourceSelectable) {\n const enabled = readBoolean(sourceSelectable.enabled);\n let selectable = world.getComponent(targetEntityId, Selectable);\n\n if (!selectable) {\n objectManagementSystem.createComponentNow(\n \"selectable\",\n world,\n targetEntityId,\n enabled ?? true,\n );\n selectable = world.getComponent(targetEntityId, Selectable);\n }\n\n if (selectable && typeof enabled === \"boolean\") {\n selectable.enabled = enabled;\n }\n }\n\n const sourcePhysics = asRecord(values.physicsValues.get(sourceEntityId));\n if (sourcePhysics) {\n // Unwrap wrapped component snapshot shape: { values: { rigidbody, collider }, rigidBody, collider }\n // Fall back to raw shape for backward compatibility with any plain-shape saves.\n const physicsValues = asRecord(sourcePhysics.values) ?? sourcePhysics;\n\n let physics = world.getComponent(targetEntityId, PhysicsComponent);\n if (!physics) {\n objectManagementSystem.createComponentNow(\n \"physics\",\n world,\n targetEntityId,\n physicsValues,\n );\n physics = world.getComponent(targetEntityId, PhysicsComponent);\n }\n\n if (physics) {\n physics.setValues({\n rigidbody: asRecord(physicsValues.rigidbody) as never ?? {},\n collider: asRecord(physicsValues.collider) as never ?? {},\n });\n }\n }\n\n const sourceAnimation = asRecord(values.animationValues.get(sourceEntityId));\n if (sourceAnimation) {\n restoreAnimationComponent(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceAnimation,\n );\n }\n\n const sourceInstancedMesh = asRecord(values.instancedMeshValues.get(sourceEntityId));\n if (sourceInstancedMesh) {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent) {\n if (typeof sourceInstancedMesh.meshKind === \"string\") {\n imComponent.meshKind = sourceInstancedMesh.meshKind as typeof imComponent.meshKind;\n }\n\n if (typeof sourceInstancedMesh.modelPath === \"string\") {\n imComponent.modelPath = sourceInstancedMesh.modelPath;\n }\n\n const parameters = asRecord(sourceInstancedMesh.meshParameters);\n if (parameters) {\n imComponent.meshParameters = parameters as typeof imComponent.meshParameters;\n }\n\n if (typeof sourceInstancedMesh.castShadow === \"boolean\") {\n imComponent.castShadow = sourceInstancedMesh.castShadow;\n }\n\n if (typeof sourceInstancedMesh.receiveShadow === \"boolean\") {\n imComponent.receiveShadow = sourceInstancedMesh.receiveShadow;\n }\n\n // New format: restore instanceEntityIds (IDs are old snapshot IDs —\n // remapping to live IDs is deferred to restorePostCreateComponents).\n if (Array.isArray(sourceInstancedMesh.instanceEntityIds)) {\n imComponent.instanceEntityIds =\n sourceInstancedMesh.instanceEntityIds as number[];\n }\n // Old format (migration): instanceEntityIds were already created by the\n // factory from the legacy instances[] array — nothing more to do here.\n\n // Force geometry rebuild on next system update by clearing the runtime ref.\n imComponent.instancedMesh = null;\n }\n }\n\n // InstanceSlotComponent: slotIndex is restored here; groupEntityId remapping\n // is deferred to restorePostCreateComponents (needs idMap).\n const sourceInstanceSlot = asRecord(values.instanceSlotValues.get(sourceEntityId));\n if (sourceInstanceSlot) {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent) {\n if (typeof sourceInstanceSlot.slotIndex === \"number\") {\n slotComponent.slotIndex = sourceInstanceSlot.slotIndex;\n }\n // groupEntityId is set from the factory payload and will be remapped in postCreate.\n }\n }\n\n // PrefabNode: stable prefab identity — factories never create it, so re-add\n // directly (same pattern as ScriptComponent in restorePostCreateComponents).\n const sourcePrefabNode = asRecord(values.prefabNodeValues.get(sourceEntityId));\n if (sourcePrefabNode && typeof sourcePrefabNode.nodeId === \"string\") {\n if (!world.getComponent(targetEntityId, PrefabNode)) {\n world.addComponent(targetEntityId, new PrefabNode(sourcePrefabNode.nodeId));\n }\n }\n\n // PrefabInstance: prefab-asset link on instance roots.\n const sourcePrefabInstance = asRecord(\n values.prefabInstanceValues.get(sourceEntityId),\n );\n if (sourcePrefabInstance && typeof sourcePrefabInstance.url === \"string\") {\n if (!world.getComponent(targetEntityId, PrefabInstance)) {\n const overrides = Array.isArray(sourcePrefabInstance.overrides)\n ? sourcePrefabInstance.overrides.filter(\n (entry): entry is string => typeof entry === \"string\",\n )\n : [];\n world.addComponent(\n targetEntityId,\n new PrefabInstance(\n sourcePrefabInstance.url,\n overrides,\n // Preserve the placement identity; the constructor generates a\n // fresh one for legacy snapshots that predate instanceId.\n typeof sourcePrefabInstance.instanceId === \"string\" &&\n sourcePrefabInstance.instanceId.length > 0\n ? sourcePrefabInstance.instanceId\n : undefined,\n ),\n );\n }\n }\n}\n","import type { EcsEntityKind } from \"../types\";\n\nexport type HydrationPayload = {\n /**\n * Suppress default child entities the factory would create.\n *\n * Always set during hydration — the snapshot already contains those children.\n */\n skipDefaultChildren?: boolean;\n name?: string;\n transform?: {\n position?: { x?: number; y?: number; z?: number };\n rotation?: { x?: number; y?: number; z?: number };\n scale?: { x?: number; y?: number; z?: number };\n };\n path?: string;\n options?: Record<string, unknown>;\n useWorldCamera?: boolean;\n};\n\nexport type ComponentValueMaps = {\n object3DRefValues: Map<number, unknown>;\n nameValues: Map<number, unknown>;\n transformValues: Map<number, unknown>;\n modelValues: Map<number, unknown>;\n imageValues: Map<number, unknown>;\n spriteValues: Map<number, unknown>;\n videoValues: Map<number, unknown>;\n cameraValues: Map<number, unknown>;\n environmentValues: Map<number, unknown>;\n postprocessingValues: Map<number, unknown>;\n audioValues: Map<number, unknown>;\n imageTargetValues: Map<number, unknown>;\n lightValues: Map<number, unknown>;\n materialValues: Map<number, unknown>;\n meshGeometryValues: Map<number, unknown>;\n selectableValues: Map<number, unknown>;\n physicsValues: Map<number, unknown>;\n animationValues: Map<number, unknown>;\n imageTargetAnchorValues: Map<number, unknown>;\n scriptValues: Map<number, unknown>;\n scriptObjectValues: Map<number, unknown>;\n xrRigValues: Map<number, unknown>;\n vrTeleportAreaValues: Map<number, unknown>;\n xrInteractableValues: Map<number, unknown>;\n xrInteractorValues: Map<number, unknown>;\n xrHandPoseValues: Map<number, unknown>;\nxrInteractorSideValues: Map<number, unknown>;\n instancedMeshValues: Map<number, unknown>;\n instanceSlotValues: Map<number, unknown>;\n prefabNodeValues: Map<number, unknown>;\n prefabInstanceValues: Map<number, unknown>;\n};\n\nexport type EcsWorldComponentSnapshot = {\n component: string;\n entries: Array<{\n entityId: number;\n value: unknown;\n }>;\n};\n\nexport type EcsWorldStateSnapshotLike = {\n selectedEntityId?: number | null;\n entities: number[];\n components: EcsWorldComponentSnapshot[];\n};\n\nexport type HydrateWorldFromSnapshotResult = {\n restoredCount: number;\n selectedEntityId: number | null;\n /** Snapshot entity id → created live entity id for every hydrated entity. */\n idMap: Map<number, number>;\n};\n\n/**\n * Optional behavior tweaks for {@link hydrateWorldFromSnapshotDetailed}.\n * Defaults preserve the historical full-world-load behavior; prefab/subtree\n * instantiation passes stricter options.\n */\nexport type HydrateOptions = {\n /**\n * When false, no camera in the snapshot is promoted to the world camera.\n * Defaults to true (full scene loads want their default camera active);\n * prefab spawns pass false so a spawned camera never hijacks the view.\n */\n assignPrimaryCamera?: boolean;\n /**\n * \"world\" (default) re-applies local transforms for every entity in the\n * world after parent links restore — correct for full scene loads.\n * \"created\" limits the pass to entities created by THIS hydrate call, so\n * mid-session spawns don't touch unrelated live entities.\n */\n applyTransformsScope?: \"world\" | \"created\";\n};\n\nexport const HYDRATABLE_ENTITY_KINDS = new Set<EcsEntityKind>([\n \"cube\",\n \"sphere\",\n \"plane\",\n \"capsule\",\n \"cylinder\",\n \"empty\",\n \"model\",\n \"image\",\n \"imageTarget\",\n \"sprite\",\n \"audio\",\n \"camera\",\n \"video\",\n \"ambientLight\",\n \"directionalLight\",\n \"pointLight\",\n \"spotLight\",\n \"areaLight\",\n \"instancedMesh\",\n \"instanceSlot\",\n \"scriptObject\",\n \"xrRig\",\n \"xrInteractor\",\n \"teleportArea\",\n]);\n","import { Object3DRef, TransformComponent } from \"../components\";\nimport {\n applyTransform,\n type ObjectManagementSystem,\n} from \"../systems/ObjectManagementSystem\";\nimport type { EcsEntityKind } from \"../types\";\nimport type { World } from \"../World\";\nimport { buildComponentValueMaps } from \"./componentValues\";\nimport { applyParentLinks } from \"./parentLinks\";\nimport { restorePostCreateComponents } from \"./postCreateComponents\";\nimport { restoreComponentState } from \"./restoreComponentState\";\nimport { asRecord, readByComponent, readString, readTransform } from \"./readers\";\nimport {\n HYDRATABLE_ENTITY_KINDS,\n type EcsWorldStateSnapshotLike,\n type HydrateOptions,\n type HydrateWorldFromSnapshotResult,\n type HydrationPayload,\n} from \"./types\";\n\nexport type {\n EcsWorldComponentSnapshot,\n EcsWorldStateSnapshotLike,\n HydrateOptions,\n HydrateWorldFromSnapshotResult,\n} from \"./types\";\nexport { HYDRATABLE_ENTITY_KINDS } from \"./types\";\n\nfunction buildEntityCreationPayload(\n sourceEntityId: number,\n kind: EcsEntityKind,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n): HydrationPayload {\n const payload: HydrationPayload = {\n name: readString(componentValues.nameValues.get(sourceEntityId)) ?? undefined,\n transform: readTransform(componentValues.transformValues.get(sourceEntityId)),\n };\n\n if (kind === \"model\") {\n const model = asRecord(componentValues.modelValues.get(sourceEntityId));\n if (typeof model?.path === \"string\") {\n payload.path = model.path;\n }\n }\n\n if (kind === \"image\") {\n const image = asRecord(componentValues.imageValues.get(sourceEntityId));\n if (typeof image?.path === \"string\") {\n payload.path = image.path;\n }\n }\n\n if (kind === \"sprite\") {\n const sprite = asRecord(componentValues.spriteValues.get(sourceEntityId));\n if (typeof sprite?.path === \"string\") {\n payload.path = sprite.path;\n }\n }\n\n if (kind === \"video\") {\n const video = asRecord(componentValues.videoValues.get(sourceEntityId));\n if (typeof video?.path === \"string\") {\n payload.path = video.path;\n }\n const videoOptions = asRecord(video?.options);\n if (videoOptions) {\n payload.options = videoOptions;\n }\n }\n\n if (kind === \"audio\") {\n const audio = asRecord(componentValues.audioValues.get(sourceEntityId));\n if (typeof audio?.path === \"string\") {\n payload.path = audio.path;\n }\n const audioOptions = asRecord(audio?.options);\n if (audioOptions) {\n payload.options = audioOptions;\n }\n }\n\n if (kind === \"camera\") {\n const camera = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (camera) {\n const projection =\n camera.projection === \"orthographic\" || camera.projection === \"perspective\"\n ? camera.projection\n : undefined;\n const type =\n camera.type === \"3d\" || camera.type === \"ar\"\n ? camera.type\n : undefined;\n\n payload.options = {\n isDefault: typeof camera.isDefault === \"boolean\" ? camera.isDefault : undefined,\n projection,\n type,\n fov: typeof camera.fov === \"number\" ? camera.fov : undefined,\n near: typeof camera.near === \"number\" ? camera.near : undefined,\n far: typeof camera.far === \"number\" ? camera.far : undefined,\n left: typeof camera.left === \"number\" ? camera.left : undefined,\n right: typeof camera.right === \"number\" ? camera.right : undefined,\n top: typeof camera.top === \"number\" ? camera.top : undefined,\n bottom: typeof camera.bottom === \"number\" ? camera.bottom : undefined,\n zoom: typeof camera.zoom === \"number\" ? camera.zoom : undefined,\n };\n }\n }\n\n if (kind === \"imageTarget\") {\n const imageTarget = asRecord(componentValues.imageTargetValues.get(sourceEntityId));\n if (imageTarget) {\n payload.options = {\n targets: Array.isArray(imageTarget.targets) ? imageTarget.targets : [],\n compiledTargetUrl:\n typeof imageTarget.compiledTargetUrl === \"string\"\n ? imageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof imageTarget.compiledTargetDir === \"string\"\n ? imageTarget.compiledTargetDir\n : undefined,\n };\n }\n }\n\n if (kind === \"instancedMesh\") {\n const im = asRecord(componentValues.instancedMeshValues.get(sourceEntityId));\n if (im) {\n payload.options = {\n meshKind: typeof im.meshKind === \"string\" ? im.meshKind : \"cube\",\n modelPath: typeof im.modelPath === \"string\" ? im.modelPath : undefined,\n meshParameters: asRecord(im.meshParameters) ?? undefined,\n castShadow: typeof im.castShadow === \"boolean\" ? im.castShadow : false,\n receiveShadow: typeof im.receiveShadow === \"boolean\" ? im.receiveShadow : false,\n // New format: signal the factory to skip child entity creation.\n // Old format (instances[]): pass through for migration — factory will\n // create slot entities from the legacy InstanceTransform array.\n ...(Array.isArray(im.instanceEntityIds)\n ? { instanceEntityIds: im.instanceEntityIds }\n : Array.isArray(im.instances)\n ? { instances: im.instances }\n : {}),\n };\n }\n }\n\n if (kind === \"instanceSlot\") {\n const slot = asRecord(componentValues.instanceSlotValues.get(sourceEntityId));\n if (slot) {\n payload.options = {\n groupEntityId: typeof slot.groupEntityId === \"number\" ? slot.groupEntityId : -1,\n slotIndex: typeof slot.slotIndex === \"number\" ? slot.slotIndex : 0,\n };\n }\n }\n\n if (kind === \"scriptObject\") {\n const so = asRecord(componentValues.scriptObjectValues.get(sourceEntityId));\n if (so) {\n // Identity pre-linked at creation; `data` (with entity-ref remapping) is\n // restored in the post-create pass where the full idMap exists.\n payload.options = {\n scriptUrl: typeof so.scriptUrl === \"string\" ? so.scriptUrl : null,\n className: typeof so.className === \"string\" ? so.className : null,\n enabled: typeof so.enabled === \"boolean\" ? so.enabled : true,\n };\n }\n }\n\n return payload;\n}\n\nfunction resolvePrimaryCameraSourceEntityId(\n snapshot: EcsWorldStateSnapshotLike,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n entityTypeValues: Map<number, unknown>,\n): number | null {\n let firstCameraSourceEntityId: number | null = null;\n\n for (const sourceEntityId of snapshot.entities) {\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n if (entityType !== \"camera\") {\n continue;\n }\n\n if (firstCameraSourceEntityId === null) {\n firstCameraSourceEntityId = sourceEntityId;\n }\n\n const cameraValue = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (cameraValue?.isDefault === true) {\n return sourceEntityId;\n }\n }\n\n return firstCameraSourceEntityId;\n}\n\nfunction applyLocalTransformsAfterHierarchyRestore(\n world: World,\n scopeEntityIds?: Iterable<number>,\n): void {\n const transformEntities = scopeEntityIds\n ? Array.from(scopeEntityIds)\n : world.query(TransformComponent, Object3DRef);\n\n for (const entityId of transformEntities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!transform || !object) {\n continue;\n }\n\n // Parent links are already resolved, so applying transform now uses correct local space.\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n}\n\nexport function hydrateWorldFromSnapshotDetailed(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n options?: HydrateOptions,\n): HydrateWorldFromSnapshotResult {\n if (!snapshot || !snapshot.entities.length) {\n return {\n restoredCount: 0,\n selectedEntityId: null,\n idMap: new Map(),\n };\n }\n\n const assignPrimaryCamera = options?.assignPrimaryCamera !== false;\n const entityTypeValues = readByComponent(snapshot.components, \"EntityType\");\n const componentValues = buildComponentValueMaps(snapshot);\n const primaryCameraSourceEntityId = assignPrimaryCamera\n ? resolvePrimaryCameraSourceEntityId(\n snapshot,\n componentValues,\n entityTypeValues,\n )\n : null;\n const idMap = new Map<number, number>();\n\n for (const sourceEntityId of snapshot.entities) {\n const entityTypeValue = entityTypeValues.get(sourceEntityId);\n const entityType = readString(entityTypeValue);\n if (!entityType || !HYDRATABLE_ENTITY_KINDS.has(entityType as EcsEntityKind)) {\n continue;\n }\n\n const kind = entityType as EcsEntityKind;\n const payload = buildEntityCreationPayload(sourceEntityId, kind, componentValues);\n\n if (kind === \"camera\" && sourceEntityId === primaryCameraSourceEntityId) {\n payload.useWorldCamera = true;\n\n const options = asRecord(payload.options);\n payload.options = {\n ...(options ?? {}),\n isDefault: true,\n };\n }\n\n // The snapshot carries every entity, including factory-authored children,\n // so factories must not add their own during a restore.\n payload.skipDefaultChildren = true;\n\n const createdEntityId = objectManagementSystem.createNow(kind, world, payload);\n idMap.set(sourceEntityId, createdEntityId);\n }\n\n for (const sourceEntityId of snapshot.entities) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n\n restoreComponentState(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n );\n\n restorePostCreateComponents(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n idMap,\n );\n }\n\n applyParentLinks(snapshot, idMap, objectManagementSystem, world);\n objectManagementSystem.reconcileSceneFromWorld(world);\n applyLocalTransformsAfterHierarchyRestore(\n world,\n options?.applyTransformsScope === \"created\" ? idMap.values() : undefined,\n );\n\n const selectedEntityId =\n typeof snapshot.selectedEntityId === \"number\"\n ? (idMap.get(snapshot.selectedEntityId) ?? null)\n : null;\n\n return {\n restoredCount: idMap.size,\n selectedEntityId,\n idMap,\n };\n}\n\nexport function hydrateWorldFromSnapshot(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n): number {\n return hydrateWorldFromSnapshotDetailed(\n snapshot,\n world,\n objectManagementSystem,\n ).restoredCount;\n}\n","/**\n * Per-property prefab override model — pure JSON-space functions shared by\n * the editor (diff/merge at apply time) and future `.scene` tooling.\n *\n * The core problem: an instance's entity ids differ from the prefab file's\n * ids by construction, so raw values can't be compared. Both sides are first\n * CANONICALIZED into nodeId-space: every entity-id-bearing field (kept in\n * sync with `snapshotIdUtils.ts`) becomes `{ $node: \"<nodeId>\" }` when the id\n * maps to a node inside the same document, or stays a raw id when external.\n * Two canonical values are equal iff they describe the same state relative\n * to their own subtree.\n *\n * Override encoding (stored in `PrefabInstance.overrides`):\n * \"<nodeId>|<ComponentName>|<slash/separated/path>\"\n * \"<nodeId>|<ComponentName>|\" // empty path = whole component overridden\n */\n\nimport {\n ADDED_NODE_MARKER_COMPONENT,\n buildNodeKeyMapsFromSnapshot,\n} from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/** Components that never participate in override diffing/merging. */\nexport const OVERRIDE_DIFF_EXCLUDED_COMPONENTS = new Set([\n \"PrefabNode\",\n \"PrefabInstance\",\n \"EntityType\",\n \"Selectable\",\n \"SelectionTransformState\",\n]);\n\n/**\n * Components excluded ONLY on the instance ROOT node — these are per-instance\n * by definition (where the instance sits in the scene and what it's called).\n */\nexport const OVERRIDE_ROOT_EXCLUDED_COMPONENTS = new Set([\n \"TransformComponent\",\n \"Name\",\n \"ParentId\",\n]);\n\nexport type NodeMaps = {\n idToNode: Map<number, string>;\n nodeToId: Map<string, number>;\n /** nodeId of the subtree root (entity whose ParentId is null/absent). */\n rootNodeId: string | null;\n};\n\ntype Rec = Record<string, unknown>;\n\nconst asRecord = (value: unknown): Rec | null =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Rec)\n : null;\n\nconst clone = <T>(value: T): T =>\n value === undefined ? value : (structuredClone(value) as T);\n\n/** `{ $node: \"<nodeId>\" }` marker — a canonical internal entity reference. */\nconst isNodeRef = (value: unknown): value is { $node: string } => {\n const record = asRecord(value);\n return Boolean(\n record &&\n typeof record.$node === \"string\" &&\n Object.keys(record).length === 1,\n );\n};\n\nconst makeNodeRef = (nodeId: string) => ({ $node: nodeId });\n\n/** Entity ids of entities whose ParentId is null or absent. */\nexport function findSnapshotRootEntityIds(snapshot: SubtreeSnapshot): number[] {\n const parentBlock = snapshot.components.find(\n (block) => block.component === \"ParentId\",\n );\n const parentByEntity = new Map<number, unknown>();\n for (const entry of parentBlock?.entries ?? []) {\n parentByEntity.set(entry.entityId, asRecord(entry.value)?.value ?? null);\n }\n return snapshot.entities.filter(\n (entityId) => typeof parentByEntity.get(entityId) !== \"number\",\n );\n}\n\nexport function buildNodeMapsFromSnapshot(snapshot: SubtreeSnapshot): NodeMaps {\n const idToNode = new Map<number, string>();\n const nodeToId = new Map<string, number>();\n\n const nodeBlock = snapshot.components.find(\n (block) => block.component === \"PrefabNode\",\n );\n for (const entry of nodeBlock?.entries ?? []) {\n const nodeId = asRecord(entry.value)?.nodeId;\n if (typeof nodeId === \"string\" && nodeId.length > 0) {\n idToNode.set(entry.entityId, nodeId);\n nodeToId.set(nodeId, entry.entityId);\n }\n }\n\n const rootEntityId = findSnapshotRootEntityIds(snapshot)[0];\n const rootNodeId =\n rootEntityId !== undefined ? (idToNode.get(rootEntityId) ?? null) : null;\n\n return { idToNode, nodeToId, rootNodeId };\n}\n\n/** Invert the columnar snapshot into entityId → (componentName → value). */\nexport function indexSnapshotByEntity(\n snapshot: SubtreeSnapshot,\n): Map<number, Map<string, unknown>> {\n const byEntity = new Map<number, Map<string, unknown>>();\n for (const block of snapshot.components) {\n for (const entry of block.entries) {\n let componentMap = byEntity.get(entry.entityId);\n if (!componentMap) {\n componentMap = new Map();\n byEntity.set(entry.entityId, componentMap);\n }\n componentMap.set(block.component, entry.value);\n }\n }\n return byEntity;\n}\n\nconst toRefOrRaw = (id: number, idToNode: Map<number, string>): unknown => {\n const nodeId = idToNode.get(id);\n return nodeId !== undefined ? makeNodeRef(nodeId) : id;\n};\n\n/** Canonicalize a script `data` record: EntityInput/ComponentInput ids → `{$node}`. */\nfunction canonicalizeScriptDataFields(\n data: Rec,\n idToNode: Map<number, string>,\n): Rec {\n const canonicalData: Rec = {};\n for (const [key, fieldValue] of Object.entries(data)) {\n const field = asRecord(fieldValue);\n if (field?.type === \"entity\" && typeof field.value === \"number\") {\n canonicalData[key] = {\n ...field,\n value: toRefOrRaw(field.value, idToNode),\n };\n continue;\n }\n const componentRef = asRecord(field?.value);\n if (\n field?.type === \"component\" &&\n componentRef &&\n typeof componentRef.entityId === \"number\"\n ) {\n canonicalData[key] = {\n ...field,\n value: {\n ...componentRef,\n entityId: toRefOrRaw(componentRef.entityId, idToNode),\n },\n };\n continue;\n }\n canonicalData[key] = fieldValue;\n }\n return canonicalData;\n}\n\n/**\n * Canonicalize a serialized component value into nodeId-space:\n * - entity-id fields → `{$node}` (internal) or raw id (external)\n * - ScriptComponent entries keep only `{className, scriptUrl, enabled, data}`\n * (entityId/runtimeState/runtimeMessage are per-instance transients)\n * - ScriptObjectComponent keeps only `{scriptUrl, className, enabled, data}`\n * (runtimeState/runtimeMessage are per-instance transients)\n * - Object3DRef keeps only `{visibility}` (the rest is a live object ref)\n *\n * Keep the id-bearing field list in sync with `snapshotIdUtils.ts`.\n */\nexport function canonicalizeComponentValue(\n componentName: string,\n value: unknown,\n idToNode: Map<number, string>,\n): unknown {\n const cloned = clone(value);\n const record = asRecord(cloned);\n if (!record) {\n return cloned;\n }\n\n if (componentName === \"ParentId\") {\n if (typeof record.value === \"number\") {\n record.value = toRefOrRaw(record.value, idToNode);\n }\n return record;\n }\n\n if (componentName === \"Object3DRef\") {\n return {\n visibility:\n typeof record.visibility === \"boolean\" ? record.visibility : true,\n };\n }\n\n if (componentName === \"ScriptComponent\") {\n const entries = Array.isArray(record.entries) ? record.entries : [];\n return {\n entries: entries.map((rawEntry) => {\n const entry = asRecord(rawEntry);\n if (!entry) {\n return rawEntry;\n }\n return {\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data: canonicalizeScriptDataFields(asRecord(entry.data) ?? {}, idToNode),\n };\n }),\n };\n }\n\n if (componentName === \"ScriptObjectComponent\") {\n return {\n scriptUrl: typeof record.scriptUrl === \"string\" ? record.scriptUrl : null,\n className: typeof record.className === \"string\" ? record.className : null,\n enabled: typeof record.enabled === \"boolean\" ? record.enabled : true,\n data: canonicalizeScriptDataFields(asRecord(record.data) ?? {}, idToNode),\n };\n }\n\n if (componentName === \"InstancedMeshComponent\") {\n if (Array.isArray(record.instanceEntityIds)) {\n record.instanceEntityIds = record.instanceEntityIds.map((id) =>\n typeof id === \"number\" ? toRefOrRaw(id, idToNode) : id,\n );\n }\n return record;\n }\n\n if (componentName === \"InstanceSlotComponent\") {\n if (\n typeof record.groupEntityId === \"number\" &&\n record.groupEntityId !== -1\n ) {\n record.groupEntityId = toRefOrRaw(record.groupEntityId, idToNode);\n }\n return record;\n }\n\n return record;\n}\n\n/**\n * Replace every `{$node}` marker (at any depth) with the mapped entity id\n * from `nodeToId`, or null when the node no longer exists. Exact inverse of\n * canonicalization for the id-bearing positions.\n */\nexport function decanonicalizeComponentValue(\n value: unknown,\n nodeToId: Map<string, number>,\n): unknown {\n if (isNodeRef(value)) {\n return nodeToId.get(value.$node) ?? null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => decanonicalizeComponentValue(item, nodeToId));\n }\n const record = asRecord(value);\n if (record) {\n const result: Rec = {};\n for (const [key, item] of Object.entries(record)) {\n result[key] = decanonicalizeComponentValue(item, nodeToId);\n }\n return result;\n }\n return value;\n}\n\nexport const encodeOverride = (\n nodeId: string,\n componentName: string,\n path: string,\n): string => `${nodeId}|${componentName}|${path}`;\n\nexport function parseOverride(\n encoded: string,\n): { nodeId: string; componentName: string; path: string } | null {\n const firstSep = encoded.indexOf(\"|\");\n if (firstSep <= 0) {\n return null;\n }\n const secondSep = encoded.indexOf(\"|\", firstSep + 1);\n if (secondSep <= firstSep + 1) {\n return null;\n }\n return {\n nodeId: encoded.slice(0, firstSep),\n componentName: encoded.slice(firstSep + 1, secondSep),\n path: encoded.slice(secondSep + 1),\n };\n}\n\n/** nodeId → componentName → set of overridden paths. */\nexport function groupOverridePaths(\n overrides: string[],\n): Map<string, Map<string, Set<string>>> {\n const grouped = new Map<string, Map<string, Set<string>>>();\n for (const encoded of overrides) {\n const parsed = parseOverride(encoded);\n if (!parsed) {\n continue;\n }\n let byComponent = grouped.get(parsed.nodeId);\n if (!byComponent) {\n byComponent = new Map();\n grouped.set(parsed.nodeId, byComponent);\n }\n let paths = byComponent.get(parsed.componentName);\n if (!paths) {\n paths = new Set();\n byComponent.set(parsed.componentName, paths);\n }\n paths.add(parsed.path);\n }\n return grouped;\n}\n\nconst isPrimitive = (value: unknown): boolean =>\n value === null || typeof value !== \"object\";\n\n/**\n * Collect leaf paths where two canonical values differ. Semantics:\n * - `{$node}` refs compare atomically by nodeId\n * - arrays of differing length are ONE atomic override (the array path);\n * equal lengths recurse per index\n * - object key present on one side only marks that key's path\n * - type mismatches mark the current path\n * An empty-string path means the values differ at the top level.\n */\nexport function collectDiffPaths(\n base: unknown,\n current: unknown,\n prefix = \"\",\n out: string[] = [],\n): string[] {\n if (isNodeRef(base) || isNodeRef(current)) {\n const same =\n isNodeRef(base) && isNodeRef(current) && base.$node === current.$node;\n if (!same) {\n out.push(prefix);\n }\n return out;\n }\n\n if (isPrimitive(base) || isPrimitive(current)) {\n if (base !== current) {\n out.push(prefix);\n }\n return out;\n }\n\n const baseIsArray = Array.isArray(base);\n const currentIsArray = Array.isArray(current);\n if (baseIsArray !== currentIsArray) {\n out.push(prefix);\n return out;\n }\n\n if (baseIsArray && currentIsArray) {\n if (base.length !== current.length) {\n out.push(prefix);\n return out;\n }\n base.forEach((item, index) => {\n collectDiffPaths(\n item,\n current[index],\n prefix ? `${prefix}/${index}` : String(index),\n out,\n );\n });\n return out;\n }\n\n const baseRecord = base as Rec;\n const currentRecord = current as Rec;\n const keys = new Set([\n ...Object.keys(baseRecord),\n ...Object.keys(currentRecord),\n ]);\n for (const key of keys) {\n const childPrefix = prefix ? `${prefix}/${key}` : key;\n if (!(key in baseRecord) || !(key in currentRecord)) {\n out.push(childPrefix);\n continue;\n }\n collectDiffPaths(baseRecord[key], currentRecord[key], childPrefix, out);\n }\n return out;\n}\n\n/**\n * Diff a live instance subtree against its prefab base (both as serialized\n * subtree snapshots carrying PrefabNode identity) and return the encoded\n * override list: every path where the instance deviates from the base.\n *\n * Identity is nodeKey-scoped ({@link buildNodeKeyMapsFromSnapshot}), so\n * nested instance regions diff correctly; for nested-free documents the\n * keys degenerate to bare nodeIds (v1 behavior unchanged).\n *\n * Policies: components missing on the instance produce no override (apply\n * re-adds them); components/nodes only on the instance are local additions\n * and produce no override — EXCEPT when `emitAdditionMarkers` is set\n * (file-space callers), which records `\"<key>|+node|\"` for instance nodes\n * absent from the base so pure-JSON patching never deletes host-authored\n * nodes inside nested regions.\n */\nexport function computeInstanceOverrides(\n baseSnapshot: SubtreeSnapshot,\n instanceSnapshot: SubtreeSnapshot,\n options?: { emitAdditionMarkers?: boolean },\n): string[] {\n const baseMaps = buildNodeKeyMapsFromSnapshot(baseSnapshot);\n const instanceMaps = buildNodeKeyMapsFromSnapshot(instanceSnapshot);\n const baseByEntity = indexSnapshotByEntity(baseSnapshot);\n const instanceByEntity = indexSnapshotByEntity(instanceSnapshot);\n\n const overrides: string[] = [];\n\n for (const [nodeKey, instanceEntityId] of instanceMaps.keyToId) {\n const baseEntityId = baseMaps.keyToId.get(nodeKey);\n if (baseEntityId === undefined) {\n // Node only exists on the instance — local addition.\n if (options?.emitAdditionMarkers) {\n overrides.push(\n encodeOverride(nodeKey, ADDED_NODE_MARKER_COMPONENT, \"\"),\n );\n }\n continue;\n }\n\n const baseComponents = baseByEntity.get(baseEntityId);\n const instanceComponents = instanceByEntity.get(instanceEntityId);\n if (!baseComponents) {\n continue;\n }\n\n // Root detection must use the BASE doc: the file root always has a null\n // ParentId, whereas an instance root carries its numeric scene parent.\n const isRoot = nodeKey === baseMaps.rootKey;\n\n for (const [componentName, baseRaw] of baseComponents) {\n if (OVERRIDE_DIFF_EXCLUDED_COMPONENTS.has(componentName)) {\n continue;\n }\n if (isRoot && OVERRIDE_ROOT_EXCLUDED_COMPONENTS.has(componentName)) {\n continue;\n }\n\n const instanceRaw = instanceComponents?.get(componentName);\n if (instanceRaw === undefined) {\n continue; // locally removed — apply re-adds, no override\n }\n\n const baseCanonical = canonicalizeComponentValue(\n componentName,\n baseRaw,\n baseMaps.idToKey,\n );\n const instanceCanonical = canonicalizeComponentValue(\n componentName,\n instanceRaw,\n instanceMaps.idToKey,\n );\n\n for (const path of collectDiffPaths(baseCanonical, instanceCanonical)) {\n overrides.push(encodeOverride(nodeKey, componentName, path));\n }\n }\n }\n\n return overrides;\n}\n\nconst PATH_TOKEN_SPLIT = \"/\";\n\nfunction getAtPath(value: unknown, tokens: string[]): unknown {\n let cursor: unknown = value;\n for (const token of tokens) {\n if (Array.isArray(cursor)) {\n cursor = cursor[Number(token)];\n } else {\n const record = asRecord(cursor);\n if (!record) {\n return undefined;\n }\n cursor = record[token];\n }\n if (cursor === undefined) {\n return undefined;\n }\n }\n return cursor;\n}\n\nfunction setAtPath(target: unknown, tokens: string[], value: unknown): void {\n let cursor: unknown = target;\n for (let i = 0; i < tokens.length - 1; i++) {\n const token = tokens[i];\n if (Array.isArray(cursor)) {\n cursor = cursor[Number(token)];\n } else {\n const record = asRecord(cursor);\n if (!record) {\n return; // container shape changed in the new file — skip gracefully\n }\n cursor = record[token];\n }\n if (cursor === null || typeof cursor !== \"object\") {\n return;\n }\n }\n\n const last = tokens[tokens.length - 1];\n if (Array.isArray(cursor)) {\n cursor[Number(last)] = value;\n } else {\n const record = asRecord(cursor);\n if (record) {\n if (value === undefined) {\n delete record[last];\n } else {\n record[last] = value;\n }\n }\n }\n}\n\n/**\n * Merge a component's NEW canonical file value with an instance's canonical\n * value, preserving the instance side at every overridden path. An empty\n * path (\"\") means the whole component is overridden → instance wins.\n */\nexport function mergeComponentValue(\n newFileCanonical: unknown,\n instanceCanonical: unknown,\n overridePaths: Set<string> | undefined,\n): unknown {\n if (!overridePaths || overridePaths.size === 0) {\n return clone(newFileCanonical);\n }\n if (overridePaths.has(\"\")) {\n return clone(instanceCanonical);\n }\n\n const merged = clone(newFileCanonical);\n for (const path of overridePaths) {\n const tokens = path.split(PATH_TOKEN_SPLIT);\n const instanceValue = getAtPath(instanceCanonical, tokens);\n setAtPath(merged, tokens, clone(instanceValue));\n }\n return merged;\n}\n","import { hydrateWorldFromSnapshotDetailed } from \"../hydration/hydrateWorld\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { findSnapshotRootEntityIds } from \"./overrides\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/**\n * Components a subtree snapshot must never inject into a live world —\n * scene singletons. Nested `PrefabInstance` links are kept (nested prefabs);\n * only an instance link ON THE SNAPSHOT ROOT is dropped (a file claiming to\n * be an instance of another prefab = variant, unsupported — defense in depth\n * for hand-edited files).\n */\nconst INSTANTIATE_EXCLUDED_COMPONENTS = new Set([\n \"Environment\",\n \"Postprocessing\",\n \"SelectionTransformState\",\n]);\n\nexport type InstantiateSubtreeResult = {\n /** Live entity id of the subtree root, or null when nothing hydrated. */\n rootId: EntityId | null;\n /** Snapshot entity id → live entity id. */\n idMap: Map<number, number>;\n};\n\n/**\n * Hydrate a self-contained subtree snapshot (a prefab file's `snapshot`)\n * into a LIVE world: fresh entity ids, internal references remapped, no\n * camera promotion, transform pass scoped to the created entities.\n */\nexport function instantiateSubtree(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n snapshot: SubtreeSnapshot,\n): InstantiateSubtreeResult {\n const snapshotRootIds = new Set(findSnapshotRootEntityIds(snapshot));\n const safeSnapshot: SubtreeSnapshot = {\n entities: snapshot.entities,\n components: snapshot.components\n .filter((block) => !INSTANTIATE_EXCLUDED_COMPONENTS.has(block.component))\n .map((block) =>\n block.component === \"PrefabInstance\"\n ? {\n component: block.component,\n entries: block.entries.filter(\n (entry) => !snapshotRootIds.has(entry.entityId),\n ),\n }\n : block,\n )\n .filter((block) => block.entries.length > 0),\n };\n\n const result = hydrateWorldFromSnapshotDetailed(\n safeSnapshot,\n world,\n objectManagementSystem,\n { assignPrimaryCamera: false, applyTransformsScope: \"created\" },\n );\n\n const rootSourceId = findSnapshotRootEntityIds(safeSnapshot).find(\n (sourceId) => result.idMap.has(sourceId),\n );\n\n return {\n rootId: rootSourceId !== undefined ? (result.idMap.get(rootSourceId) ?? null) : null,\n idMap: result.idMap,\n };\n}\n","import { findTopLevelNestedRegions } from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\nexport const PREFAB_FILE_VERSION = 1;\n/** Written for files containing NESTED instances (parse accepts either). */\nexport const PREFAB_FILE_VERSION_NESTED = 2;\n\n/** File version to write for a given snapshot: 2 iff it nests instances. */\nexport function prefabFileVersionFor(snapshot: SubtreeSnapshot): number {\n return findTopLevelNestedRegions(snapshot).length > 0\n ? PREFAB_FILE_VERSION_NESTED\n : PREFAB_FILE_VERSION;\n}\n\n/**\n * Envelope of a `.prefab` asset file (and, later, `.scene` assets — same\n * shape with `type: \"scene\"`). `snapshot` is the same columnar world-snapshot\n * format `hydrateWorldFromSnapshotDetailed` consumes, with entity ids\n * renumbered 1..N and every entity carrying a `PrefabNode` identity.\n */\nexport type PrefabAsset = {\n version: number;\n type?: \"prefab\" | \"scene\";\n name?: string;\n snapshot: SubtreeSnapshot;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/** Validate untrusted JSON into a `PrefabAsset`, or null when malformed. */\nexport function parsePrefabAsset(json: unknown): PrefabAsset | null {\n if (!isRecord(json)) {\n return null;\n }\n if (typeof json.version !== \"number\" || json.version < 1) {\n return null;\n }\n\n const snapshot = json.snapshot;\n if (!isRecord(snapshot)) {\n return null;\n }\n const entities = snapshot.entities;\n const components = snapshot.components;\n if (!Array.isArray(entities) || !Array.isArray(components)) {\n return null;\n }\n if (!entities.every((id) => typeof id === \"number\")) {\n return null;\n }\n if (\n !components.every(\n (block) =>\n isRecord(block) &&\n typeof block.component === \"string\" &&\n Array.isArray(block.entries),\n )\n ) {\n return null;\n }\n\n return {\n version: json.version,\n type: json.type === \"scene\" ? \"scene\" : \"prefab\",\n name: typeof json.name === \"string\" ? json.name : undefined,\n snapshot: snapshot as unknown as SubtreeSnapshot,\n };\n}\n","import { Object3DRef, PrefabInstance, TransformComponent } from \"../components\";\nimport { applyTransform } from \"../systems/ObjectManagementSystem\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { collectEntitySubtree } from \"./collectEntitySubtree\";\nimport { instantiateSubtree } from \"./instantiateSubtree\";\nimport { parsePrefabAsset, type PrefabAsset } from \"./types\";\n\ntype Vec3Like = { x?: number; y?: number; z?: number };\n\nlet prefabAssetUrlResolver: ((url: string) => string) | null = null;\n\n/**\n * Override how prefab asset URLs (the file URL itself AND every asset URL\n * stored inside prefab files) are resolved before fetching. Published/preview\n * runtimes register a resolver that maps the editor's `localasset://…/assets/x`\n * URLs to `./assets/x`; the editor leaves it unset (identity — the\n * `localasset://` protocol is fetchable there). Same pattern as\n * {@link setDracoDecoderPath}. Pass null to restore identity.\n */\nexport function setPrefabAssetUrlResolver(\n resolver: ((url: string) => string) | null,\n): void {\n prefabAssetUrlResolver = resolver;\n}\n\nconst resolveUrl = (url: string): string =>\n prefabAssetUrlResolver ? prefabAssetUrlResolver(url) : url;\n\n/** Deep-transform every string in a JSON value (arrays/objects walked). */\nfunction transformStringsDeep(value: unknown, fn: (s: string) => string): unknown {\n if (typeof value === \"string\") {\n return fn(value);\n }\n if (Array.isArray(value)) {\n return value.map((item) => transformStringsDeep(item, fn));\n }\n if (value !== null && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n result[key] = transformStringsDeep(item, fn);\n }\n return result;\n }\n return value;\n}\n\n/**\n * Prefab JSON cache: each URL is fetched and parsed once per session; every\n * spawn shares the parsed asset. Failed loads are evicted so a later spawn\n * can retry (same policy as the shared model cache).\n */\nconst prefabCache = new Map<string, Promise<PrefabAsset>>();\n\n/**\n * Fetch + parse (and cache) a `.prefab` asset. All strings inside the\n * snapshot are passed through the registered URL resolver, so asset\n * references load correctly in published/preview builds. Use this from\n * preloaders to warm the same cache `spawnPrefab` reads.\n */\nexport function loadPrefab(url: string): Promise<PrefabAsset> {\n const cached = prefabCache.get(url);\n if (cached) {\n return cached;\n }\n\n const pending = (async () => {\n const response = await fetch(resolveUrl(url));\n if (!response.ok) {\n throw new Error(`Failed to fetch prefab \"${url}\" (${response.status})`);\n }\n const json: unknown = await response.json();\n const parsed = parsePrefabAsset(json);\n if (!parsed) {\n throw new Error(`Invalid prefab file at \"${url}\"`);\n }\n return {\n ...parsed,\n snapshot: transformStringsDeep(\n parsed.snapshot,\n resolveUrl,\n ) as PrefabAsset[\"snapshot\"],\n };\n })();\n\n prefabCache.set(url, pending);\n pending.catch(() => {\n // Evict failed loads so future spawns can retry.\n if (prefabCache.get(url) === pending) {\n prefabCache.delete(url);\n }\n });\n\n return pending;\n}\n\n/** Drop one cached prefab (or all when no url is given). */\nexport function clearPrefabCache(url?: string): void {\n if (typeof url === \"string\") {\n prefabCache.delete(url);\n } else {\n prefabCache.clear();\n }\n}\n\nexport type SpawnPrefabSource =\n | string\n | { path: string; type?: string }\n | PrefabAsset;\n\nexport type SpawnPrefabOptions = {\n /** Parent the spawned root under this entity (default: world root). */\n parentId?: EntityId | null;\n /** Local-space spawn transform for the root (partial axes allowed). */\n position?: Vec3Like;\n rotation?: Vec3Like;\n scale?: Vec3Like;\n};\n\nfunction resolveSource(source: SpawnPrefabSource): {\n url: string;\n asset: Promise<PrefabAsset> | PrefabAsset;\n} {\n if (typeof source === \"string\") {\n return { url: source, asset: loadPrefab(source) };\n }\n if (\"path\" in source && typeof source.path === \"string\") {\n // AssetInput shape from script data: { path, type }.\n return { url: source.path, asset: loadPrefab(source.path) };\n }\n const asset = source as PrefabAsset;\n return { url: asset.name ?? \"\", asset };\n}\n\n/**\n * Instantiate a prefab into a live world at runtime.\n *\n * `source` may be a URL string, a script AssetInput (`{ path, type }`), or an\n * already-loaded {@link PrefabAsset}. Resolves with the root entity id once\n * all entities/components exist — heavyweight assets inside (models,\n * textures, audio) continue loading reactively through their systems, using\n * the shared model cache for repeat spawns.\n */\nexport async function spawnPrefab(\n world: World,\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n): Promise<EntityId> {\n const { url, asset } = resolveSource(source);\n const prefab = await asset;\n\n const objectManagementSystem = world.getObjectManagementSystem();\n const { rootId } = instantiateSubtree(\n world,\n objectManagementSystem,\n prefab.snapshot,\n );\n if (rootId === null) {\n throw new Error(\n `Prefab \"${url || prefab.name || \"unknown\"}\" contained no spawnable entities`,\n );\n }\n\n if (!world.getComponent(rootId, PrefabInstance)) {\n world.addComponent(rootId, new PrefabInstance(url, []));\n }\n\n if (options?.parentId !== undefined && options.parentId !== null) {\n objectManagementSystem.setParent(world, rootId, options.parentId, {\n preserveWorldTransform: false,\n });\n }\n\n const transform = world.getComponent(rootId, TransformComponent);\n if (transform && (options?.position || options?.rotation || options?.scale)) {\n const write = (target: { x: number; y: number; z: number }, src?: Vec3Like) => {\n if (!src) return;\n if (typeof src.x === \"number\") target.x = src.x;\n if (typeof src.y === \"number\") target.y = src.y;\n if (typeof src.z === \"number\") target.z = src.z;\n };\n write(transform.position, options.position);\n write(transform.rotation, options.rotation);\n write(transform.scale, options.scale);\n\n const object = world.getComponent(rootId, Object3DRef)?.object;\n if (object) {\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n }\n\n return rootId;\n}\n\n/**\n * Delete a spawned prefab instance: the root entity plus every descendant\n * (children first). Returns the number of entities removed. `dispose`\n * releases GPU resources not flagged as shared (safe with the model cache).\n */\nexport function despawnPrefab(\n world: World,\n rootId: EntityId,\n dispose = true,\n): number {\n const objectManagementSystem = world.getObjectManagementSystem();\n const subtree = collectEntitySubtree(world, [rootId]).reverse();\n\n let removed = 0;\n for (const entityId of subtree) {\n if (objectManagementSystem.deleteEntity(world, entityId, dispose)) {\n removed += 1;\n }\n }\n return removed;\n}\n","import type { World } from \"./World\";\nimport { Component } from \"./Component\";\nimport {\n despawnPrefab,\n spawnPrefab,\n type SpawnPrefabOptions,\n type SpawnPrefabSource,\n} from \"./prefab/spawnPrefab\";\nimport type { CustomEcsSystem } from \"./CustomEcsSystem\";\nimport type { ComponentClass } from \"./worldSnapshotUtils\";\nimport { Object3DRef, ParentId, TransformComponent } from \"./components\";\nimport type { ParentLookup, WorldEntityView } from \"./types\";\nimport type { XrHandPoseEventDetail } from \"./systems/XRHandPoseSystem\";\nimport type { XrCapabilities, XrInputState } from \"./xr/types\";\nimport type { ScriptObject } from \"./ScriptObject\";\nimport * as THREE from \"three\";\n\n/**\n * Base class for all user-authored scripts attached to an entity through a\n * `ScriptComponent`. Subclass `Behaviour` to drive per-frame logic on a single\n * entity with full access to the {@link World}, the entity's\n * {@link TransformComponent}, and its three.js {@link Object3DRef}.\n *\n * @remarks\n * Scripts are dispatched by `ScriptBehaviourSystem` once per frame in this\n * order: {@link Behaviour.init} (first frame only) → {@link Behaviour.onUpdate}.\n * Override {@link Behaviour.onUpdate} for per-frame logic — never override\n * {@link Behaviour.update}, which is the engine-managed entry point.\n *\n * **Editor vs runtime**: `Behaviour` subclasses run ONLY at preview/runtime —\n * they never execute in the editor. For a visual that must render and animate\n * inside the editor (custom shaders, procedural geometry, grass, anything the\n * object palette can't produce), use {@link ScriptObject} instead.\n *\n * The runtime recognizes a script by its **default export** plus the\n * inherited static marker `__reluBehaviourClass`. Do not override the marker.\n *\n * @example\n * ```ts\n * import { Behaviour, type Component } from \"@relu-interactives/spatial-ecs\";\n *\n *\n * export default class Spinner extends Behaviour {\n * data: {\n * speed: number;\n * axis: \"x\" | \"y\" | \"z\";\n * };\n *\n * init() {\n * this.data.speed ??= 1;\n * this.data.axis ??= \"y\";\n * }\n *\n * onUpdate() {\n * this.transform.rotation[this.data.axis] += this.data.speed * this.deltaTime;\n * }\n * }\n * ```\n *\n * @see {@link World}\n * @see {@link TransformComponent}\n * @see {@link Object3DRef}\n *\n * @category Scripting\n */\nexport class Behaviour implements CustomEcsSystem {\n /**\n * Static marker used by `ScriptBehaviourSystem` to detect `Behaviour`\n * subclasses across bundle-identity splits (esbuild may produce a second\n * copy of the package when scripts are bundled, breaking `instanceof`).\n * Inherited by every subclass via the prototype chain.\n *\n * @internal\n */\n static readonly __reluBehaviourClass = true as const;\n\n /**\n * Inspector-bound payload from the entity's `ScriptComponent`. Override the\n * type on subclasses with `declare data: MyDataShape` to get type safety\n * inside hooks. Saved with the project so values persist across reloads.\n */\n data: Component | Record<string, unknown> = {} as Component;\n\n /** Numeric id of the entity this script is attached to. */\n entityId: number;\n\n /** View of the owning entity (id + components) at construction time. */\n entity: WorldEntityView;\n\n /**\n * Live three.js object wrapper for the entity. May be `null` for entities\n * with no scene presence; helpers on this class return `null` in that case.\n */\n threeRef: Object3DRef;\n\n /**\n * The entity's {@link TransformComponent}. Mutating `position`, `rotation`,\n * or `scale` here is picked up the same frame by `TransformSyncSystem`.\n */\n transform: TransformComponent;\n\n /**\n * The owning {@link World}. Refreshed each frame in {@link Behaviour.update}.\n * Use it to query other entities or components.\n */\n world: World;\n\n /**\n * Seconds elapsed since the last frame. Set by the engine before each\n * {@link Behaviour.onUpdate}.\n */\n deltaTime: number = 0;\n\n /**\n * Engine-managed constructor. Hosts (`ScriptBehaviourSystem`) instantiate\n * subclasses with the owning world, the entity id, and the script's `data`\n * payload. User code should not call this directly.\n *\n * @param world - The owning ECS world.\n * @param entityId - The entity this script is bound to.\n * @param component - The `ScriptComponent.data` payload, or any object that\n * should be exposed to the script as `this.data`.\n */\n constructor(\n world: World,\n entityId: number,\n component: Component | Record<string, unknown>,\n ) {\n this.world = world;\n this.entityId = entityId;\n if (component) this.data = component;\n this.entity = this.getEntity()!;\n this.threeRef = this.getComponent(Object3DRef)!;\n this.transform = this.getComponent(TransformComponent)!;\n }\n\n /**\n * Engine-managed per-frame entry point. Refreshes {@link Behaviour.deltaTime}\n * and delegates to {@link Behaviour.onUpdate}.\n *\n * @remarks Do **not** override this method — override\n * {@link Behaviour.onUpdate} instead.\n *\n * @param world - The owning world (may differ from the constructor world\n * after hot reload).\n * @param deltaTime - Seconds since the last frame.\n */\n update(world: World, deltaTime: number): void {\n this.deltaTime = deltaTime;\n this.world = world;\n this.onUpdate();\n }\n\n /**\n * Optional cleanup hook invoked when the script is detached or the entity\n * is destroyed. Override to release timers, listeners, or other resources.\n *\n * @param world - The owning world at disposal time.\n */\n dispose?(world: World): void {\n // Default cleanup: no-op; override in subclasses if needed\n }\n\n /**\n * Instantiate a prefab asset into the world at runtime.\n *\n * `source` is typically an `AssetInput` field from this script's `data`\n * (drag a `.prefab` from the asset browser onto the field in the editor),\n * a URL string, or a pre-loaded `PrefabAsset`. Resolves with the new root\n * entity id.\n *\n * ```ts\n * data = { enemyPrefab: { path: \"\", type: \"prefab\" } };\n * async onUpdate() {\n * if (shouldSpawn) {\n * const id = await this.spawnPrefab(this.data.enemyPrefab, {\n * position: { x: 0, y: 0, z: -5 },\n * });\n * }\n * }\n * ```\n */\n spawnPrefab(\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n ): Promise<number> {\n return spawnPrefab(this.world, source, options);\n }\n\n /**\n * Remove a spawned prefab instance (the root entity and all descendants).\n * Returns the number of entities removed.\n */\n despawn(rootEntityId: number): number {\n return despawnPrefab(this.world, rootEntityId);\n }\n\n /**\n * Returns the entity's world-space position as a new `THREE.Vector3`, or\n * `null` if the entity has no scene presence.\n */\n getWorldPosition(): THREE.Vector3 | null {\n if (!this.threeRef) {\n return null;\n }\n\n const position = new THREE.Vector3();\n this.threeRef.object.getWorldPosition(position);\n\n return position;\n }\n\n /**\n * Returns the entity's forward direction in world space (the +Z axis of its\n * world matrix), or `null` if the entity has no scene presence.\n */\n getWorldDirection(): THREE.Vector3 | null {\n if (!this.threeRef) {\n return null;\n }\n\n const target = new THREE.Vector3();\n this.threeRef.object.getWorldDirection(target);\n\n return target;\n }\n\n /**\n * Returns a unit vector pointing from this entity toward the given world\n * position, or `null` if the entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n */\n directionTo(targetPosition: THREE.Vector3): THREE.Vector3 | null {\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return null;\n }\n\n return targetPosition.clone().sub(currentPosition).normalize();\n }\n\n /**\n * Returns the world-space distance from this entity to the given position,\n * or `null` if the entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n */\n distanceTo(targetPosition: THREE.Vector3): number | null {\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return null;\n }\n\n return currentPosition.distanceTo(targetPosition);\n }\n\n /**\n * Linearly interpolates the entity's position toward `targetPosition` and\n * writes the result back through {@link TransformComponent}. No-op if the\n * entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n * @param alpha - Interpolation factor in [0, 1]. Multiply by `deltaTime`\n * for frame-rate-independent smoothing.\n */\n lerpTo(targetPosition: THREE.Vector3, alpha: number): void {\n if (!this.threeRef) {\n return;\n }\n\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return;\n }\n\n const newPosition = currentPosition.lerp(targetPosition, alpha);\n this.transform.setPosition(newPosition);\n }\n\n /**\n * Spherically interpolates the entity's rotation toward `targetRotation`\n * and writes the result back through {@link TransformComponent}. No-op if\n * the entity has no scene presence.\n *\n * @param targetRotation - Destination orientation as a quaternion.\n * @param alpha - Interpolation factor in [0, 1].\n */\n slerpTo(targetRotation: THREE.Quaternion, alpha: number): void {\n if (!this.threeRef) {\n return;\n }\n\n const rotation = new THREE.Quaternion();\n\n this.threeRef.object.getWorldQuaternion(rotation);\n rotation.slerp(targetRotation, alpha);\n this.transform.setRotation(rotation);\n }\n\n /**\n * Rotates the entity to face `targetPosition` in world space and writes the\n * resulting orientation back through {@link TransformComponent}. No-op if\n * the entity has no scene presence.\n *\n * @param targetPosition - Point in world space to face.\n */\n lookAt(targetPosition: THREE.Vector3): void {\n if (!this.threeRef) {\n return;\n }\n\n const clone = this.threeRef.object.clone();\n\n const rotation = new THREE.Quaternion();\n clone.lookAt(targetPosition);\n clone.getWorldQuaternion(rotation);\n this.transform.setRotation(rotation);\n }\n\n /** Returns every component currently attached to this entity. */\n getComponents(): Component[] {\n return this.world.getEntityById(this.entityId)?.components ?? [];\n }\n\n /**\n * Returns the entity's component of the given class, or `null` if it has\n * no such component.\n *\n * @typeParam T - Concrete component type.\n * @param componentClass - Component class constructor to look up.\n *\n * @example\n * ```ts\n * const mesh = this.getComponent(MeshComponent);\n * if (mesh) console.log(mesh.geometryRef);\n * ```\n */\n getComponent<T extends Component>(\n componentClass: ComponentClass<T>,\n ): T | null {\n return this.world.getComponent(this.entityId, componentClass) ?? null;\n }\n\n /**\n * Returns the latest {@link WorldEntityView} snapshot for this entity, or\n * `null` if it was destroyed.\n */\n getEntity(): WorldEntityView | null {\n return this.world.getEntityById(this.entityId);\n }\n\n /**\n * Resolves the entity's parent from the {@link ParentId} component, if any.\n *\n * @returns A {@link ParentLookup} with the parent component reference and\n * the parent entity view (or `null` if the entity is at the root).\n */\n getParent(): ParentLookup {\n const parentIdComponent = this.getComponent(ParentId);\n const parentEntityId = parentIdComponent?.value ?? null;\n\n if (parentEntityId === null) {\n return {\n parentIdComponent,\n parent: null,\n };\n }\n\n return {\n parentIdComponent,\n parent: this.world.getEntityById(parentEntityId),\n };\n }\n\n /**\n * Returns every direct child entity of this one (entities whose\n * {@link ParentId} matches `entityId`).\n */\n getChildren(): WorldEntityView[] {\n return this.world.getAllEntities().filter((entity) => {\n const parentIdComponent = entity.components.find(\n (component) => component instanceof ParentId,\n ) as ParentId | undefined;\n\n return parentIdComponent?.value === this.entityId;\n });\n }\n\n /**\n * Called once before the first {@link Behaviour.onUpdate}. Override to\n * default and validate {@link Behaviour.data}, cache references, or set\n * initial state. Runs at preview/runtime only — never in the editor.\n */\n protected init(): void {\n // Override in subclasses to implement custom startup logic\n }\n\n /**\n * Called every frame while the script is enabled. Override with the\n * script's main per-frame logic. Runs at preview/runtime only — never in the\n * editor (use {@link ScriptObject} for editor-visible visuals).\n */\n protected onUpdate(): void {\n // Override in subclasses to implement custom behaviour\n }\n\n /** Called when the editor selects this entity. Optional UX hook. */\n onSelect(): void {\n // Override in subclasses to implement custom logic when this behaviour's entity is selected\n }\n\n /** Called when the editor deselects this entity. Optional UX hook. */\n onDeselect(): void {\n // Override in subclasses to implement custom logic when this behaviour's entity is deselected\n }\n\n /**\n * Called when an image-tracking target this entity depends on becomes\n * visible. Optional AR hook.\n *\n * @param target - The newly-visible target entity view.\n */\n onTargetFound(target: WorldEntityView): void {\n // Override in subclasses to implement custom logic when a target is found\n }\n\n /**\n * Called when an image-tracking target this entity depends on is lost.\n * Optional AR hook.\n *\n * @param target - The target entity view that became invisible.\n */\n onTargetLost(target: WorldEntityView): void {\n // Override in subclasses to implement custom logic when a target is lost\n }\n\n // ─── WebXR (VR / MR) hooks ────────────────────────────────────────────────\n // Dispatched by XRSessionSystem / XRInteractionSystem, following the same\n // pattern as the AR hooks above: public no-op methods that subclasses opt\n // into by overriding. They never fire outside an immersive session.\n\n /**\n * Called once when an immersive session starts. Optional XR hook.\n *\n * Use it to set up XR-only state. Inspect `capabilities` rather than guessing\n * by device: feature support differs sharply per headset (for example Vision\n * Pro grants no passthrough on the web today).\n *\n * @param capabilities - What the session actually granted, read from\n * `XRSession.enabledFeatures`.\n */\n onXRSessionStart(capabilities: XrCapabilities): void {\n // Override in subclasses to react to entering VR/MR\n }\n\n /** Called once when the immersive session ends. Optional XR hook. */\n onXRSessionEnd(): void {\n // Override in subclasses to tear down XR-only state\n }\n\n /**\n * Called when a primary action begins — controller trigger, hand pinch, or\n * Vision Pro gaze-pinch. Optional XR hook.\n *\n * @param input - Normalized state for the source that acted.\n */\n onSelectStart(input: XrInputState): void {\n // Override in subclasses to react to a primary action press\n }\n\n /** Called when the primary action ends. Optional XR hook. */\n onSelectEnd(input: XrInputState): void {\n // Override in subclasses to react to a primary action release\n }\n\n /**\n * Called when this entity is grabbed. Optional XR hook.\n *\n * Only fires for entities carrying an enabled, grabbable\n * `XRInteractableComponent`.\n *\n * @param input - The source doing the grabbing.\n */\n /**\n * A SECOND hand joined a two-hand grab on this entity.\n *\n * The first hand anchors the object and keeps holding it; this fires for the\n * hand that came second — the foregrip on a rifle, say.\n */\n onSecondaryGrab(_input: XrInputState): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** The second hand let go, leaving the object in the first hand alone. */\n onSecondaryRelease(_input: XrInputState): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /**\n * A hand pose declared on this entity started being held.\n *\n * Fires once the pose has been sustained for its hold time, not the instant\n * the fingers pass through it.\n */\n onHandPoseStart(_event: XrHandPoseEventDetail): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A held hand pose ended, or its hand stopped being tracked. */\n onHandPoseEnd(_event: XrHandPoseEventDetail): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n onGrab(input: XrInputState): void {\n // Override in subclasses to react to being picked up\n }\n\n /** Called when this entity is released. Optional XR hook. */\n onRelease(input: XrInputState): void {\n // Override in subclasses to react to being dropped\n }\n}\n","import type { Component } from \"../Component\";\nimport type { World } from \"../World\";\n\n/**\n * Shared infrastructure for the script-hosting systems (`ScriptBehaviourSystem`\n * and `ScriptObjectSystem`): module loading, class resolution, data-envelope\n * merge/resolve/serialize. Extracted verbatim from `ScriptBehaviourSystem` so\n * both systems stay behaviourally identical for the parts they share.\n */\n\n/** Resolves a script URL to its ES module namespace. */\nexport type ModuleLoader = (\n scriptUrl: string,\n) => Promise<Record<string, unknown>>;\n\n/** Default loader — a plain dynamic import (used outside the editor/runtime). */\nexport async function defaultModuleLoader(\n scriptUrl: string,\n): Promise<Record<string, unknown>> {\n return (await import(/* webpackIgnore: true */ scriptUrl)) as Record<\n string,\n unknown\n >;\n}\n\n/** Strip local paths / localasset hosts from an error before surfacing it. */\nexport function toErrorMessage(error: unknown): string {\n const sanitize = (value: string): string =>\n value\n .replace(/localasset:\\/\\/[^/]+\\//g, \"localasset://\")\n .replace(/\\/Users\\/[^\\s)]+/g, \"[local path]\");\n\n if (error instanceof Error && error.message) {\n return sanitize(error.message);\n }\n if (typeof error === \"string\" && error) {\n return sanitize(error);\n }\n return \"Unknown script error.\";\n}\n\n/**\n * Resolve a script class from a loaded module: named export → `default` →\n * static marker fallback. The `instanceof baseClass` check can fail when a\n * bundler ships a second copy of the package into the script blob (identity\n * split); the inherited static marker (e.g. `__reluScriptObjectClass`) survives\n * that, so it's the fallback.\n */\nexport function resolveScriptCtor<TCtor extends abstract new (...args: never) => unknown>(\n moduleValue: Record<string, unknown>,\n className: string,\n options: { baseClass: Function; markerKey: string },\n): TCtor | null {\n const named = moduleValue[className];\n const fallback = moduleValue.default;\n const candidate =\n typeof named === \"function\"\n ? named\n : typeof fallback === \"function\"\n ? fallback\n : null;\n\n if (!candidate) {\n return null;\n }\n\n if (!(candidate.prototype instanceof options.baseClass)) {\n const marker = (candidate as unknown as Record<string, unknown>)[\n options.markerKey\n ];\n if (!marker) {\n return null;\n }\n }\n\n return candidate as unknown as TCtor;\n}\n\nexport function normalizeScriptData(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeValueByDefaultShape(\n defaultValue: unknown,\n currentValue: unknown,\n): unknown {\n if (Array.isArray(defaultValue)) {\n return Array.isArray(currentValue) ? currentValue : defaultValue;\n }\n\n if (isPlainObject(defaultValue)) {\n if (!isPlainObject(currentValue)) {\n return defaultValue;\n }\n\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(defaultValue)) {\n next[key] = mergeValueByDefaultShape(defaultValue[key], currentValue[key]);\n }\n return next;\n }\n\n if (typeof defaultValue === \"number\") {\n return typeof currentValue === \"number\" ? currentValue : defaultValue;\n }\n if (typeof defaultValue === \"string\") {\n return typeof currentValue === \"string\" ? currentValue : defaultValue;\n }\n if (typeof defaultValue === \"boolean\") {\n return typeof currentValue === \"boolean\" ? currentValue : defaultValue;\n }\n if (defaultValue === null) {\n return currentValue !== undefined ? currentValue : null;\n }\n\n return typeof currentValue === \"undefined\" ? defaultValue : currentValue;\n}\n\n/** Merge persisted `current` data over the script's `defaults`, shape-aware. */\nexport function mergeDataByCurrentDefaults(\n defaults: Record<string, unknown>,\n current: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(defaults)) {\n next[key] = mergeValueByDefaultShape(defaults[key], current[key]);\n }\n return next;\n}\n\nfunction isRawEntityInput(\n value: unknown,\n): value is { type: string; value: number | null } {\n if (!isPlainObject(value)) return false;\n return (value as Record<string, unknown>).type === \"entity\";\n}\n\nfunction isRawComponentInput(value: unknown): boolean {\n if (!isPlainObject(value)) return false;\n return (value as Record<string, unknown>).type === \"component\";\n}\n\nfunction findComponentByKind(\n components: Component[],\n componentKind: string,\n): Component | null {\n return (\n components.find(\n (c) =>\n c.constructor.name === `${componentKind}Component` ||\n c.constructor.name === componentKind,\n ) ?? null\n );\n}\n\n/** Replace raw EntityInput/ComponentInput envelopes with live views for the script. */\nexport function resolveInputData(\n world: World,\n rawData: Record<string, unknown>,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = { ...rawData };\n for (const [key, value] of Object.entries(rawData)) {\n if (isRawEntityInput(value)) {\n const entityId = (value as { type: string; value: number | null }).value;\n const entityView =\n typeof entityId === \"number\" ? world.getEntityById(entityId) : null;\n resolved[key] = { ...(value as object), value: entityView };\n } else if (isRawComponentInput(value)) {\n const ref = (value as Record<string, unknown>).value;\n if (\n isPlainObject(ref) &&\n typeof (ref as Record<string, unknown>).entityId === \"number\" &&\n typeof (ref as Record<string, unknown>).componentKind === \"string\"\n ) {\n const { entityId: refEntityId, componentKind } = ref as {\n entityId: number;\n componentKind: string;\n };\n const entityView = world.getEntityById(refEntityId);\n const component = entityView\n ? findComponentByKind(entityView.components, componentKind)\n : null;\n resolved[key] = { ...(value as object), value: component };\n }\n }\n }\n return resolved;\n}\n\n/** Re-serialize instance data for storage, preserving raw entity/component refs. */\nexport function serializeDataForStorage(\n rawData: Record<string, unknown>,\n instanceData: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...instanceData };\n for (const [key, rawValue] of Object.entries(rawData)) {\n if (isRawEntityInput(rawValue) || isRawComponentInput(rawValue)) {\n result[key] = rawValue;\n }\n }\n return result;\n}\n","import * as THREE from \"three\";\nimport { Behaviour } from \"../Behaviour\";\nimport type { Component } from \"../Component\";\nimport { ScriptComponent } from \"../components\";\nimport type { ScriptEntry } from \"../components/ScriptComponent\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport {\n defaultModuleLoader,\n mergeDataByCurrentDefaults,\n type ModuleLoader,\n normalizeScriptData,\n resolveInputData,\n resolveScriptCtor,\n serializeDataForStorage,\n toErrorMessage,\n} from \"./scriptShared\";\n\ntype BehaviourCtor = new (\n world: World,\n entityId: number,\n component: Component | Record<string, unknown>,\n) => Behaviour;\n\ntype ActiveScript = {\n entityId: number;\n scriptComponent: ScriptComponent;\n entryIndex: number;\n scriptEntry: ScriptEntry;\n};\n\ntype ScriptInstanceRecord = {\n entityId: number;\n scriptUrl: string;\n className: string;\n entryIndex: number;\n behaviour: Behaviour;\n rawData: Record<string, unknown>;\n};\n\nfunction buildInstanceKey(entityId: number, scriptUrl: string, className: string): string {\n return `${entityId}:${scriptUrl}:${className}`;\n}\n\n/** Thin wrapper over the shared resolver, pinned to the Behaviour base class. */\nfunction resolveBehaviourCtor(\n moduleValue: Record<string, unknown>,\n className: string,\n): BehaviourCtor | null {\n return resolveScriptCtor<BehaviourCtor>(moduleValue, className, {\n baseClass: Behaviour,\n markerKey: \"__reluBehaviourClass\",\n });\n}\n\nfunction normalizeEntry(\n value: Partial<ScriptEntry> | undefined,\n fallbackEntityId: number,\n): ScriptEntry {\n return {\n entityId: typeof value?.entityId === \"number\" ? value.entityId : fallbackEntityId,\n className: typeof value?.className === \"string\" ? value.className : \"\",\n scriptUrl: typeof value?.scriptUrl === \"string\" ? value.scriptUrl : \"\",\n enabled: typeof value?.enabled === \"boolean\" ? value.enabled : true,\n data: normalizeScriptData(value?.data),\n runtimeState:\n value?.runtimeState === \"idle\" ||\n value?.runtimeState === \"loading\" ||\n value?.runtimeState === \"ready\" ||\n value?.runtimeState === \"error\"\n ? value.runtimeState\n : undefined,\n runtimeMessage: typeof value?.runtimeMessage === \"string\" ? value.runtimeMessage : undefined,\n };\n}\n\nfunction readScriptEntries(component: ScriptComponent, entityId: number): ScriptEntry[] {\n if (Array.isArray(component.entries) && component.entries.length > 0) {\n return component.entries\n .map((entry) => normalizeEntry(entry as Partial<ScriptEntry>, entityId))\n .filter((entry) => entry.className || entry.scriptUrl);\n }\n\n return [];\n}\n\nfunction writeScriptEntries(component: ScriptComponent, entries: ScriptEntry[]): void {\n const normalized = entries.map((entry) => normalizeEntry(entry, entry.entityId));\n component.entries = normalized;\n\n const active = normalized[0];\n if (!active) {\n component.scriptInstance = null;\n }\n}\n\n\n/**\n * Optional context that enables raycast-based onSelect / onDeselect dispatch.\n * When provided, pointer/touch taps on the canvas fire a raycast against the\n * scene. If the hit object (or any ancestor) carries userData.entityId, every\n * Behaviour instance for that entity receives onSelect(); the previously\n * selected entity's instances receive onDeselect().\n */\nexport type SelectionContext = {\n camera: THREE.Camera;\n scene: THREE.Scene;\n domElement: HTMLElement;\n};\n\nexport class ScriptBehaviourSystem implements EcsSystem {\n private instances = new Map<string, ScriptInstanceRecord>();\n private loading = new Map<string, Promise<void>>();\n private readonly moduleLoader: ModuleLoader;\n\n // Raycast-based onSelect / onDeselect support\n private readonly selectionCtx: SelectionContext | null;\n private readonly raycaster: THREE.Raycaster;\n private readonly ndcPointer: THREE.Vector2;\n private selectedEntityId: number | null = null;\n // undefined = nothing queued; null = queued \"deselect all\"; number = queued entity\n private pendingEntityId: number | null | undefined = undefined;\n private pointerDownPos: { x: number; y: number } | null = null;\n private static readonly CLICK_THRESHOLD = 6;\n\n constructor(moduleLoader?: ModuleLoader, selectionContext?: SelectionContext) {\n this.moduleLoader = moduleLoader ?? defaultModuleLoader;\n this.selectionCtx = selectionContext ?? null;\n this.raycaster = new THREE.Raycaster();\n this.ndcPointer = new THREE.Vector2();\n if (this.selectionCtx) {\n this.selectionCtx.domElement.addEventListener(\"pointerdown\", this.onPointerDown);\n this.selectionCtx.domElement.addEventListener(\"pointerup\", this.onPointerUp);\n }\n }\n\n // ── Raycast selection helpers ──────────────────────────────────────────────\n\n /** Walk up the object hierarchy to find the nearest userData.entityId. */\n private resolveEntityId(object: THREE.Object3D): number | null {\n let current: THREE.Object3D | null = object;\n while (current) {\n const id = current.userData?.entityId;\n if (typeof id === \"number\") return id;\n current = current.parent;\n }\n return null;\n }\n\n /** Convert client (screen) coordinates to normalised device coordinates. */\n private toNdc(clientX: number, clientY: number): void {\n if (!this.selectionCtx) return;\n const rect = this.selectionCtx.domElement.getBoundingClientRect();\n this.ndcPointer.x = ((clientX - rect.left) / rect.width) * 2 - 1;\n this.ndcPointer.y = -((clientY - rect.top) / rect.height) * 2 + 1;\n }\n\n /** Fire raycast and queue the result to be dispatched in the next update(). */\n private queueRaycast(clientX: number, clientY: number): void {\n if (!this.selectionCtx) return;\n this.toNdc(clientX, clientY);\n this.raycaster.setFromCamera(this.ndcPointer, this.selectionCtx.camera);\n const hits = this.raycaster.intersectObjects(this.selectionCtx.scene.children, true);\n for (const hit of hits) {\n // Skip editor-only helpers (grid, transform gizmo, etc.)\n if (hit.object.userData?.ecsPreviewHidden) continue;\n const entityId = this.resolveEntityId(hit.object);\n if (entityId !== null) {\n this.pendingEntityId = entityId;\n return;\n }\n }\n // Clicked empty space → queue deselect\n this.pendingEntityId = null;\n }\n\n private onPointerDown = (event: PointerEvent): void => {\n this.pointerDownPos = { x: event.clientX, y: event.clientY };\n };\n\n private onPointerUp = (event: PointerEvent): void => {\n if (!this.pointerDownPos) return;\n const dx = event.clientX - this.pointerDownPos.x;\n const dy = event.clientY - this.pointerDownPos.y;\n this.pointerDownPos = null;\n // Ignore drag gestures — only fire for taps / clicks\n if (Math.sqrt(dx * dx + dy * dy) > ScriptBehaviourSystem.CLICK_THRESHOLD) return;\n this.queueRaycast(event.clientX, event.clientY);\n };\n\n /**\n * Apply a queued selection change.\n * Calls onDeselect() on all behaviours of the previous entity and\n * onSelect() on all behaviours of the newly selected entity.\n */\n private applySelection(nextEntityId: number | null): void {\n if (nextEntityId === this.selectedEntityId) return;\n const prevEntityId = this.selectedEntityId;\n this.selectedEntityId = nextEntityId;\n\n if (prevEntityId !== null) {\n for (const record of this.instances.values()) {\n if (record.entityId === prevEntityId) {\n try {\n record.behaviour.onDeselect();\n } catch {}\n }\n }\n }\n\n if (nextEntityId !== null) {\n for (const record of this.instances.values()) {\n if (record.entityId === nextEntityId) {\n try {\n record.behaviour.onSelect();\n } catch {}\n }\n }\n }\n }\n\n // ── ECS lifecycle ──────────────────────────────────────────────────────────\n\n update(world: World, deltaTime: number): void {\n // Dispatch any queued raycast selection before running behaviour updates\n if (this.pendingEntityId !== undefined) {\n const next = this.pendingEntityId;\n this.pendingEntityId = undefined;\n this.applySelection(next);\n }\n\n const active = new Map<string, ActiveScript>();\n const entityIds = world.query(ScriptComponent);\n\n for (const entityId of entityIds) {\n const scriptComponent = world.getComponent(entityId, ScriptComponent);\n if (!scriptComponent) {\n continue;\n }\n\n const entries = readScriptEntries(scriptComponent, entityId);\n if (entries.length === 0) {\n scriptComponent.scriptInstance = null;\n continue;\n }\n\n const nextEntries = [...entries];\n let hasEnabledScript = false;\n\n for (let entryIndex = 0; entryIndex < nextEntries.length; entryIndex += 1) {\n const entry = nextEntries[entryIndex];\n // Behaviours never run in the editor — they are preview/runtime only.\n // (For visuals that must render in the editor, use ScriptObject.)\n const skipInEditor = world.isEditorMode();\n if (!entry.enabled || !entry.scriptUrl || skipInEditor) {\n nextEntries[entryIndex] = {\n ...entry,\n runtimeState: \"idle\",\n runtimeMessage: undefined,\n };\n continue;\n }\n\n hasEnabledScript = true;\n const key = buildInstanceKey(entityId, entry.scriptUrl, entry.className);\n active.set(key, {\n entityId,\n scriptComponent,\n entryIndex,\n scriptEntry: entry,\n });\n }\n\n writeScriptEntries(scriptComponent, nextEntries);\n if (!hasEnabledScript) {\n scriptComponent.scriptInstance = null;\n }\n }\n\n for (const [key, record] of this.instances.entries()) {\n const script = active.get(key);\n if (!script) {\n const liveComponent = world.getComponent(record.entityId, ScriptComponent);\n if (liveComponent) {\n if (record.entryIndex === 0) {\n liveComponent.scriptInstance = null;\n }\n liveComponent.scriptInstances.delete(record.entryIndex);\n }\n\n record.behaviour.dispose?.(world);\n this.instances.delete(key);\n continue;\n }\n\n const entries = readScriptEntries(script.scriptComponent, script.entityId);\n const liveEntry = entries[script.entryIndex];\n if (!liveEntry) {\n record.behaviour.dispose?.(world);\n this.instances.delete(key);\n continue;\n }\n\n // Skip behaviour update for invisible entities. The instance is kept alive\n // so scripts resume immediately when the entity becomes visible again.\n if (!world.isEntityVisible(record.entityId)) {\n continue;\n }\n\n try {\n script.scriptComponent.scriptInstance =\n script.entryIndex === 0 ? record.behaviour : script.scriptComponent.scriptInstance;\n script.scriptComponent.scriptInstances.set(script.entryIndex, record.behaviour);\n\n entries[script.entryIndex] = {\n ...liveEntry,\n data: serializeDataForStorage(record.rawData, normalizeScriptData(record.behaviour.data)),\n };\n\n record.behaviour.update(world, deltaTime);\n\n entries[script.entryIndex] = {\n ...entries[script.entryIndex],\n data: serializeDataForStorage(record.rawData, normalizeScriptData(record.behaviour.data)),\n runtimeState: \"ready\",\n runtimeMessage: undefined,\n };\n writeScriptEntries(script.scriptComponent, entries);\n } catch (error) {\n entries[script.entryIndex] = {\n ...entries[script.entryIndex],\n runtimeState: \"error\",\n runtimeMessage: toErrorMessage(error),\n };\n writeScriptEntries(script.scriptComponent, entries);\n if (script.entryIndex === 0) {\n script.scriptComponent.scriptInstance = null;\n }\n record.behaviour.dispose?.(world);\n this.instances.delete(key);\n }\n }\n\n // If the selected entity no longer has any loaded behaviour instances,\n // clear the selection so stale state does not persist.\n if (this.selectedEntityId !== null) {\n let stillActive = false;\n for (const record of this.instances.values()) {\n if (record.entityId === this.selectedEntityId) {\n stillActive = true;\n break;\n }\n }\n if (!stillActive) {\n this.selectedEntityId = null;\n }\n }\n\n for (const [key, script] of active.entries()) {\n if (this.instances.has(key) || this.loading.has(key)) {\n continue;\n }\n\n const entries = readScriptEntries(script.scriptComponent, script.entityId);\n const targetEntry = entries[script.entryIndex];\n if (targetEntry) {\n entries[script.entryIndex] = {\n ...targetEntry,\n runtimeState: \"loading\",\n runtimeMessage: undefined,\n };\n writeScriptEntries(script.scriptComponent, entries);\n }\n\n const promise = this.loadBehaviour(world, script)\n .catch((error) => {\n const liveEntries = readScriptEntries(script.scriptComponent, script.entityId);\n const liveEntry = liveEntries[script.entryIndex];\n if (liveEntry) {\n liveEntries[script.entryIndex] = {\n ...liveEntry,\n runtimeState: \"error\",\n runtimeMessage: \"Failed to load script.\",\n };\n writeScriptEntries(script.scriptComponent, liveEntries);\n }\n if (script.entryIndex === 0) {\n script.scriptComponent.scriptInstance = null;\n }\n console.error(\n `[ScriptBehaviourSystem] Failed loading script ${script.scriptEntry.className}`,\n error,\n );\n })\n .finally(() => {\n this.loading.delete(key);\n });\n\n this.loading.set(key, promise);\n }\n\n for (const key of this.loading.keys()) {\n if (active.has(key)) {\n continue;\n }\n\n this.loading.delete(key);\n }\n }\n\n dispose(world: World): void {\n if (this.selectionCtx) {\n this.selectionCtx.domElement.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.selectionCtx.domElement.removeEventListener(\"pointerup\", this.onPointerUp);\n }\n\n for (const record of this.instances.values()) {\n const liveComponent = world.getComponent(record.entityId, ScriptComponent);\n if (liveComponent) {\n if (record.entryIndex === 0) {\n liveComponent.scriptInstance = null;\n }\n liveComponent.scriptInstances.delete(record.entryIndex);\n }\n\n record.behaviour.dispose?.(world);\n }\n\n this.instances.clear();\n this.loading.clear();\n }\n\n private async loadBehaviour(world: World, script: ActiveScript): Promise<void> {\n const { entityId, scriptComponent, entryIndex, scriptEntry } = script;\n const key = buildInstanceKey(\n entityId,\n scriptEntry.scriptUrl,\n scriptEntry.className,\n );\n\n const moduleValue = await this.moduleLoader(scriptEntry.scriptUrl);\n\n const ctor = resolveBehaviourCtor(moduleValue, scriptEntry.className);\n if (!ctor) {\n throw new Error(\n `Missing Behaviour export '${scriptEntry.className}' in ${scriptEntry.scriptUrl}`,\n );\n }\n\n if (!world.hasEntity(entityId)) {\n return;\n }\n\n const liveComponent = world.getComponent(entityId, ScriptComponent);\n\n if (!liveComponent) {\n return;\n }\n\n const liveEntries = readScriptEntries(liveComponent, entityId);\n const liveEntry = liveEntries[entryIndex];\n\n if (\n !liveEntry ||\n !liveEntry.enabled ||\n !liveEntry.scriptUrl ||\n liveEntry.scriptUrl !== scriptEntry.scriptUrl ||\n liveEntry.className !== scriptEntry.className\n ) {\n return;\n }\n\n const currentData = normalizeScriptData(liveEntry.data);\n\n let behaviour: Behaviour;\n try {\n // Prefer undefined so Behaviour does not preempt script class defaults.\n behaviour = new ctor(\n world,\n entityId,\n undefined as unknown as Record<string, unknown>,\n );\n } catch {\n // Fallback for scripts that require a component object in constructor.\n behaviour = new ctor(world, entityId, currentData);\n }\n\n const defaults = normalizeScriptData(behaviour.data);\n const mergedData = mergeDataByCurrentDefaults(defaults, currentData);\n const resolvedData = resolveInputData(world, mergedData);\n\n behaviour.data = resolvedData;\n\n // Behaviours never init in the editor (loads never start there anyway).\n if (!world.isEditorMode()) {\n (behaviour as unknown as { init(): void }).init();\n }\n\n liveEntries[entryIndex] = {\n ...liveEntry,\n data: mergedData,\n runtimeState: \"ready\",\n runtimeMessage: undefined,\n };\n writeScriptEntries(liveComponent, liveEntries);\n if (entryIndex === 0) {\n liveComponent.scriptInstance = behaviour;\n }\n liveComponent.scriptInstances.set(entryIndex, behaviour);\n this.instances.set(key, {\n entityId,\n scriptUrl: scriptEntry.scriptUrl,\n className: scriptEntry.className,\n entryIndex,\n behaviour,\n rawData: mergedData,\n });\n }\n}\n","import type * as THREE from \"three\";\nimport type { World } from \"./World\";\n\n/**\n * Base class for **script objects** — entities whose THREE.js visual is built\n * entirely by user code (procedural geometry, shaders, particle systems,\n * anything the editor can't author natively).\n *\n * The critical difference from {@link Behaviour}: a `ScriptObject` runs in the\n * **editor AND at runtime** — `build()` and `update()` execute identically in\n * both. `ScriptObjectSystem` loads the module, instantiates the class, calls\n * `build()` to get the visual, attaches it under the entity's Object3D, and\n * ticks `update()` every frame. **Do NOT gate anything on\n * `world.isEditorMode()`** — running everywhere is the whole point. Use\n * {@link Behaviour} for gameplay logic that must NOT run in the editor.\n *\n * Subclasses are resolved by the inherited static marker\n * `__reluScriptObjectClass` (survives bundler identity splits). Do not override\n * the marker.\n *\n * @example\n * ```ts\n * import { ScriptObject, type ColorInput } from \"@relu-interactives/spatial-ecs\";\n * import * as THREE from \"three\";\n *\n * export default class GlowOrb extends ScriptObject {\n * declare data: { color: ColorInput };\n * private mat!: THREE.MeshStandardMaterial;\n *\n * build(): THREE.Object3D {\n * this.data.color ??= { type: \"color\", value: \"#66ccff\" };\n * this.mat = new THREE.MeshStandardMaterial({\n * color: this.data.color.value,\n * emissive: this.data.color.value,\n * });\n * return new THREE.Mesh(new THREE.SphereGeometry(0.5, 32, 32), this.mat);\n * }\n *\n * update(dt: number): void {\n * this.mat.emissiveIntensity = 0.5 + 0.5 * Math.sin(performance.now() * 0.002);\n * }\n *\n * dispose(): void {\n * this.mat.dispose();\n * }\n * }\n * ```\n *\n * @category Scripting\n */\nexport class ScriptObject {\n /**\n * Static marker used by `ScriptObjectSystem` to detect `ScriptObject`\n * subclasses even when a bundler ships a second copy of the package into the\n * script blob (breaking `instanceof`). Do NOT override.\n */\n static readonly __reluScriptObjectClass = true as const;\n\n /**\n * The script's data payload (the `ScriptObjectComponent.data`). Declare a\n * concrete shape on subclasses with `declare data: MyShape` for type safety.\n * Use the same typed input envelopes as Behaviours (`ColorInput`,\n * `SliderInput`, `EntityInput`, …) to get inspector fields.\n */\n data: Record<string, unknown> = {};\n\n /** The owning ECS world. */\n world: World;\n\n /** The entity this script object is bound to. */\n entityId: number;\n\n /**\n * The Object3D returned by {@link ScriptObject.build}. Assigned by\n * `ScriptObjectSystem` after `build()` runs; `null` until then.\n */\n root: THREE.Object3D | null = null;\n\n /**\n * Engine-managed constructor. `ScriptObjectSystem` instantiates subclasses\n * with the owning world, the entity id, and the component's `data`. User code\n * should not call this directly.\n */\n constructor(world: World, entityId: number, data?: Record<string, unknown>) {\n this.world = world;\n this.entityId = entityId;\n if (data) this.data = data;\n }\n\n /**\n * REQUIRED — build and return the visual root. Called once by\n * `ScriptObjectSystem` after construction. The returned object is attached\n * under the entity's Object3D (so it inherits the entity transform, selection\n * and visibility). Subclasses MUST override.\n */\n build(): THREE.Object3D {\n throw new Error(\"ScriptObject subclasses must implement build()\");\n }\n\n /**\n * OPTIONAL — per-frame hook. Runs in the editor AND at runtime (e.g. advance\n * a shader time uniform, procedural animation). Keep per-frame work on local\n * THREE state / uniforms — do NOT write ECS components every frame (that\n * churns the editor's undo history).\n */\n update?(deltaTime: number): void;\n\n /**\n * OPTIONAL — free any GPU resources this script created (geometries,\n * materials, textures, render targets). Called by `ScriptObjectSystem` when\n * the object is removed, disabled, or reloaded. THREE `dispose()` is\n * idempotent, so double-dispose is safe.\n */\n dispose?(): void;\n}\n","import * as THREE from \"three\";\nimport { ScriptObject } from \"../ScriptObject\";\nimport { Object3DRef, ScriptObjectComponent } from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport { SHARED_MODEL_RESOURCE_FLAG } from \"../utils/modelCache\";\nimport type { World } from \"../World\";\nimport {\n defaultModuleLoader,\n mergeDataByCurrentDefaults,\n type ModuleLoader,\n normalizeScriptData,\n resolveInputData,\n resolveScriptCtor,\n serializeDataForStorage,\n toErrorMessage,\n} from \"./scriptShared\";\n\n/** Tags the Object3D a script's `build()` returned, so reloads can find/remove it. */\nexport const SCRIPT_OBJECT_ROOT_FLAG = \"__scriptObjectRoot\";\n\ntype ScriptObjectCtor = new (\n world: World,\n entityId: number,\n data?: Record<string, unknown>,\n) => ScriptObject;\n\ntype ScriptObjectRecord = {\n entityId: number;\n scriptUrl: string;\n className: string;\n /** \"error\" records are tombstones — kept so a broken script doesn't reload every frame. */\n status: \"ready\" | \"error\";\n instance: ScriptObject | null;\n root: THREE.Object3D | null;\n /** Serializable merged envelope last resolved. */\n rawData: Record<string, unknown>;\n /** Exact object last written to component.data — reference-equality dirty check. */\n lastWrittenData: Record<string, unknown> | null;\n};\n\nfunction setInstanceRef(component: ScriptObjectComponent, value: unknown): void {\n // Always via defineProperty: a history-restored clone (Object.create walk that\n // drops non-enumerable own props) would otherwise get an ENUMERABLE `instance`\n // that leaks into snapshots.\n Object.defineProperty(component, \"instance\", {\n value,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n}\n\n/** Remove a built subtree from the scene and free its GPU resources. */\nfunction disposeBuiltObject(root: THREE.Object3D): void {\n root.parent?.remove(root);\n root.traverse((node) => {\n const mesh = node as THREE.Mesh;\n const geometry = mesh.geometry as THREE.BufferGeometry | undefined;\n if (\n geometry?.dispose &&\n !geometry.userData?.[SHARED_MODEL_RESOURCE_FLAG]\n ) {\n geometry.dispose();\n }\n const material = mesh.material as\n | THREE.Material\n | THREE.Material[]\n | undefined;\n const materials = Array.isArray(material)\n ? material\n : material\n ? [material]\n : [];\n for (const mat of materials) {\n if (mat.userData?.[SHARED_MODEL_RESOURCE_FLAG]) continue;\n // Dispose textures the material references before the material itself.\n for (const value of Object.values(mat)) {\n if (value instanceof THREE.Texture) value.dispose();\n }\n mat.dispose?.();\n }\n });\n}\n\n/**\n * Builds, ticks, and disposes {@link ScriptObject} scripts. Unlike\n * `ScriptBehaviourSystem`, this runs in the editor AND at runtime — there is NO\n * `isEditorMode` gating anywhere here. A script's `build()` output is attached\n * under the entity's `Object3DRef.object` (so it inherits transform, selection\n * and visibility). `runtimeState` is written on transitions only (never every\n * frame).\n *\n * Construct it and pass it to `World.setup({ systems })`.\n *\n * @category Systems\n */\nexport class ScriptObjectSystem implements EcsSystem {\n private readonly moduleLoader: ModuleLoader;\n private instances = new Map<number, ScriptObjectRecord>();\n private loading = new Map<number, { key: string; promise: Promise<void> }>();\n /** Bumped by invalidate*() so in-flight loads that predate it are discarded. */\n private epoch = 0;\n\n constructor(moduleLoader?: ModuleLoader) {\n this.moduleLoader = moduleLoader ?? defaultModuleLoader;\n }\n\n update(world: World, deltaTime: number): void {\n const active = new Map<number, ScriptObjectComponent>();\n\n for (const entityId of world.query(ScriptObjectComponent)) {\n const component = world.getComponent(entityId, ScriptObjectComponent);\n if (!component) continue;\n\n const wantsRun =\n component.enabled &&\n typeof component.scriptUrl === \"string\" &&\n typeof component.className === \"string\";\n\n if (!wantsRun) {\n // Tear down any live/tombstone record + cancel loads; idle transition only.\n const record = this.instances.get(entityId);\n if (record) this.teardownRecord(world, entityId, record, false);\n this.loading.delete(entityId);\n if (component.runtimeState !== \"idle\") {\n component.runtimeState = \"idle\";\n component.runtimeMessage = undefined;\n }\n continue;\n }\n\n active.set(entityId, component);\n }\n\n // Sweep records whose entity/identity no longer matches.\n for (const [entityId, record] of this.instances) {\n const component = active.get(entityId);\n const identityChanged =\n !component ||\n record.scriptUrl !== component.scriptUrl ||\n record.className !== component.className;\n if (!world.hasEntity(entityId) || identityChanged) {\n this.teardownRecord(world, entityId, record, false);\n }\n }\n\n // Tick ready instances + sync inspector edits.\n for (const [entityId, component] of active) {\n const record = this.instances.get(entityId);\n if (!record || record.status !== \"ready\" || !record.instance) continue;\n if (!world.isEntityVisible(entityId)) continue;\n\n // Dirty-only data sync: the editor/undo installs a NEW object on any edit.\n if (component.data !== record.lastWrittenData) {\n try {\n const merged = mergeDataByCurrentDefaults(\n record.rawData,\n normalizeScriptData(component.data),\n );\n record.rawData = merged;\n record.instance.data = resolveInputData(world, merged);\n const stored = serializeDataForStorage(merged, merged);\n component.data = stored;\n record.lastWrittenData = stored;\n } catch (error) {\n this.markError(world, entityId, component, error);\n continue;\n }\n }\n\n try {\n record.instance.update?.(deltaTime);\n } catch (error) {\n this.markError(world, entityId, component, error);\n }\n }\n\n // Kick loads for active entries with no record and no in-flight load.\n for (const [entityId, component] of active) {\n if (this.instances.has(entityId) || this.loading.has(entityId)) continue;\n const scriptUrl = component.scriptUrl as string;\n const className = component.className as string;\n if (component.runtimeState !== \"loading\") {\n component.runtimeState = \"loading\";\n component.runtimeMessage = undefined;\n }\n const epochAtStart = this.epoch;\n const key = `${epochAtStart}:${scriptUrl}:${className}`;\n const promise = this.loadScriptObject(\n world,\n entityId,\n scriptUrl,\n className,\n key,\n epochAtStart,\n )\n .catch((error) => {\n this.markError(world, entityId, undefined, error);\n console.error(\n `[ScriptObjectSystem] Failed loading ${className} (${scriptUrl})`,\n error,\n );\n })\n .finally(() => {\n if (this.loading.get(entityId)?.key === key) {\n this.loading.delete(entityId);\n }\n });\n this.loading.set(entityId, { key, promise });\n }\n\n // Drop loading entries no longer active.\n for (const entityId of this.loading.keys()) {\n if (!active.has(entityId)) this.loading.delete(entityId);\n }\n }\n\n private async loadScriptObject(\n world: World,\n entityId: number,\n scriptUrl: string,\n className: string,\n key: string,\n epochAtStart: number,\n ): Promise<void> {\n const moduleValue = await this.moduleLoader(scriptUrl);\n\n // Staleness guards after the await.\n if (\n this.loading.get(entityId)?.key !== key ||\n epochAtStart !== this.epoch ||\n !world.hasEntity(entityId)\n ) {\n return;\n }\n const component = world.getComponent(entityId, ScriptObjectComponent);\n if (\n !component ||\n !component.enabled ||\n component.scriptUrl !== scriptUrl ||\n component.className !== className\n ) {\n return;\n }\n\n const ctor = resolveScriptCtor<ScriptObjectCtor>(moduleValue, className, {\n baseClass: ScriptObject,\n markerKey: \"__reluScriptObjectClass\",\n });\n if (!ctor) {\n throw new Error(\n `Missing ScriptObject export '${className}' in ${scriptUrl}`,\n );\n }\n\n const currentData = normalizeScriptData(component.data);\n let instance: ScriptObject;\n try {\n instance = new ctor(world, entityId, undefined);\n } catch {\n instance = new ctor(world, entityId, currentData);\n }\n\n // Defaults from the class's `data = { … }` literal (may carry envelope\n // metadata: sliders, dropdowns, entity/component/asset inputs). A\n // `declare data` class has no runtime initializer, so this is empty and the\n // field schema is discovered AFTER build() below.\n const literalDefaults = normalizeScriptData(instance.data);\n\n // Seed the instance with persisted values (merged over the literal) BEFORE\n // build() so a `this.data.x ??= default` inside build() fills only missing\n // keys and never clobbers a saved edit. For a `declare data` class the seed\n // is just the saved data — build() itself supplies the defaults.\n const seed =\n Object.keys(literalDefaults).length > 0\n ? mergeDataByCurrentDefaults(literalDefaults, currentData)\n : { ...currentData };\n instance.data = resolveInputData(world, seed);\n\n const parent = world.getComponent(entityId, Object3DRef)?.object;\n if (!parent) {\n throw new Error(\"Script object entity has no Object3D to attach to.\");\n }\n\n // Pre-attach sweep: remove any orphaned prior root (survived invalidate/undo).\n for (const child of [...parent.children]) {\n if (child.userData?.[SCRIPT_OBJECT_ROOT_FLAG]) {\n disposeBuiltObject(child);\n }\n }\n\n let built: THREE.Object3D;\n try {\n built = instance.build();\n } catch (error) {\n try {\n instance.dispose?.();\n } catch {\n // best-effort\n }\n throw error;\n }\n if (!built || (built as THREE.Object3D).isObject3D !== true) {\n try {\n instance.dispose?.();\n } catch {\n // best-effort\n }\n throw new Error(\"build() must return a THREE.Object3D.\");\n }\n\n built.userData[SCRIPT_OBJECT_ROOT_FLAG] = true;\n parent.add(built);\n instance.root = built;\n\n // Discover the final field schema. build() may have populated defaults on a\n // `declare data` class (`this.data.x ??= …`) that weren't visible at\n // construction; fold those in UNDER the literal defaults (which keep their\n // envelope shape) so the inspector renders every field the script uses.\n const postBuildData = normalizeScriptData(instance.data);\n const schemaDefaults: Record<string, unknown> = { ...literalDefaults };\n for (const [key, value] of Object.entries(postBuildData)) {\n if (!(key in schemaDefaults)) schemaDefaults[key] = value;\n }\n const merged = mergeDataByCurrentDefaults(schemaDefaults, currentData);\n instance.data = resolveInputData(world, merged);\n\n const stored = serializeDataForStorage(merged, merged);\n component.data = stored;\n component.runtimeState = \"ready\";\n component.runtimeMessage = undefined;\n setInstanceRef(component, instance);\n\n this.instances.set(entityId, {\n entityId,\n scriptUrl,\n className,\n status: \"ready\",\n instance,\n root: built,\n rawData: merged,\n lastWrittenData: stored,\n });\n }\n\n /** Dispose a record's instance + built subtree. `keepTombstone` leaves an error marker. */\n private teardownRecord(\n world: World,\n entityId: number,\n record: ScriptObjectRecord,\n keepTombstone: boolean,\n ): void {\n try {\n record.instance?.dispose?.();\n } catch {\n // best-effort\n }\n if (record.root) disposeBuiltObject(record.root);\n\n const component = world.getComponent(entityId, ScriptObjectComponent);\n if (component) setInstanceRef(component, null);\n\n if (keepTombstone) {\n this.instances.set(entityId, {\n ...record,\n status: \"error\",\n instance: null,\n root: null,\n });\n } else {\n this.instances.delete(entityId);\n }\n }\n\n private markError(\n world: World,\n entityId: number,\n component: ScriptObjectComponent | undefined,\n error: unknown,\n ): void {\n const comp =\n component ?? world.getComponent(entityId, ScriptObjectComponent) ?? null;\n if (comp) {\n comp.runtimeState = \"error\";\n comp.runtimeMessage = toErrorMessage(error);\n }\n const record = this.instances.get(entityId);\n if (record) {\n this.teardownRecord(world, entityId, record, true);\n } else {\n // Error before a record existed (load failure) — plant a tombstone so we\n // don't retry every frame until identity/enabled/invalidate changes.\n this.instances.set(entityId, {\n entityId,\n scriptUrl: comp?.scriptUrl ?? \"\",\n className: comp?.className ?? \"\",\n status: \"error\",\n instance: null,\n root: null,\n rawData: {},\n lastWrittenData: null,\n });\n }\n }\n\n /** Dispose all live instances so the next update() reloads with fresh modules. */\n invalidateAll(): void {\n this.epoch += 1;\n for (const [entityId, record] of [...this.instances]) {\n try {\n record.instance?.dispose?.();\n } catch {\n // best-effort\n }\n if (record.root) disposeBuiltObject(record.root);\n this.instances.delete(entityId);\n }\n this.loading.clear();\n }\n\n /** Invalidate only the entities whose script matches `scriptUrl`. */\n invalidate(scriptUrl: string): void {\n this.epoch += 1;\n for (const [entityId, record] of [...this.instances]) {\n if (record.scriptUrl !== scriptUrl) continue;\n try {\n record.instance?.dispose?.();\n } catch {\n // best-effort\n }\n if (record.root) disposeBuiltObject(record.root);\n this.instances.delete(entityId);\n }\n for (const [entityId, entry] of [...this.loading]) {\n if (entry.key.includes(`:${scriptUrl}:`)) this.loading.delete(entityId);\n }\n }\n\n dispose(world: World): void {\n for (const [entityId, record] of [...this.instances]) {\n this.teardownRecord(world, entityId, record, false);\n }\n this.instances.clear();\n this.loading.clear();\n }\n}\n","import { Object3DRef } from \"../components/Object3DRef\";\nimport { TransformComponent } from \"../components/Transform\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport { applyTransform } from \"./ObjectManagementSystem\";\n\nexport class TransformSyncSystem implements EcsSystem {\n update(world: World): void {\n const entities = world.query(TransformComponent, Object3DRef);\n\n // While an immersive session presents, three writes the headset pose onto\n // the render camera every frame. Writing the authored transform back over\n // it would fight the headset — move the XR rig (the camera's parent)\n // instead. See World.isXrPresenting().\n const xrCamera = world.isXrPresenting() ? world.getCamera() : null;\n\n for (const entityId of entities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n\n if (!transform || !object) {\n continue;\n }\n\n if (xrCamera !== null && object === xrCamera) {\n continue;\n }\n\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n }\n}\n","import * as THREE from \"three\";\n\nimport { AudioComponent } from \"../components/Audio\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\n/** Subset of `AudioComponent.options` that the system syncs to THREE.js every frame. */\ntype TrackedAudioOptions = {\n loop: boolean;\n pitch: number;\n volume: number;\n refDistance: number;\n distanceModel: string;\n rolloffFactor: number;\n};\n\nfunction snapshotOptions(opts: AudioComponent[\"options\"]): TrackedAudioOptions {\n return {\n loop: opts.loop,\n pitch: opts.pitch,\n volume: opts.volume,\n refDistance: opts.refDistance,\n distanceModel: opts.distanceModel,\n rolloffFactor: opts.rolloffFactor,\n };\n}\n\n/**\n * Reconciles `AudioComponent` state with the underlying THREE.js audio objects\n * each frame.\n *\n * **Playback** — drives `play()`, `pause()`, and `stop()` on the THREE.js\n * audio node based on the `isPlaying` / `isPaused` flags set by\n * `AudioComponent.play()`, `.pause()`, and `.stop()`.\n *\n * **Option sync** — detects changes to `loop`, `pitch`, `volume`,\n * `refDistance`, `distanceModel`, and `rolloffFactor` and applies them live.\n * Changes take effect on the next frame, so scripts and inspector edits during\n * runtime are reflected without reloading the scene.\n *\n * Only active in **preview** mode (`isEditor: true` makes every update a\n * no-op so the editor is unaffected).\n *\n * @category Systems\n */\nexport class AudioSystem implements EcsSystem {\n private readonly isEditor: boolean;\n /** THREE.js `isPlaying` state captured at the end of the previous frame. */\n private readonly prevPlayingState = new Map<number, boolean>();\n /** Snapshot of options applied in the previous frame, for change detection. */\n private readonly prevOptions = new Map<number, TrackedAudioOptions>();\n /** Tracks entities that were stopped due to invisibility. */\n private readonly stoppedDueToInvisibility = new Set<number>();\n\n constructor({ isEditor = false }: { isEditor?: boolean } = {}) {\n this.isEditor = isEditor;\n }\n\n update(world: World, _deltaTime: number): void {\n if (this.isEditor) return;\n\n const entities = world.query(AudioComponent);\n\n // Track which entities are still alive so we can prune stale map entries.\n const liveEntityIds = new Set(entities);\n\n for (const entityId of entities) {\n const component = world.getComponent(entityId, AudioComponent);\n if (!component?.audio) continue;\n\n const sound = component.audio;\n\n // Skip audio updates for invisible entities; stop any sound that is\n // currently playing so it does not continue while the entity is hidden.\n // Track that we stopped it so we can resume when visibility is restored.\n if (!world.isEntityVisible(entityId)) {\n if (sound.isPlaying) {\n sound.stop();\n this.stoppedDueToInvisibility.add(entityId);\n }\n continue;\n }\n\n // Entity is visible — if we previously stopped it due to invisibility,\n // resume playback now and clear the flag.\n if (this.stoppedDueToInvisibility.has(entityId)) {\n this.stoppedDueToInvisibility.delete(entityId);\n // If the component still wants to play, restart the audio.\n if (component.isPlaying && !sound.isPlaying && sound.buffer) {\n sound.play();\n }\n }\n\n // --- Option sync ---------------------------------------------------\n this._syncOptions(entityId, component, sound);\n\n // --- Playback reconciliation ----------------------------------------\n const prevWasPlaying = this.prevPlayingState.get(entityId) ?? false;\n\n // Detect natural audio end: THREE.js stopped on its own (e.g. a\n // non-looping clip finished) while the component still believes it is\n // playing. Skip this check if we stopped due to invisibility.\n if (\n prevWasPlaying &&\n !sound.isPlaying &&\n component.isPlaying &&\n !component.isPaused &&\n !this.stoppedDueToInvisibility.has(entityId)\n ) {\n component.isPlaying = false;\n }\n\n if (component.isPlaying && !sound.isPlaying) {\n // Wait for a buffer to be available; the system will retry each frame\n // until it is ready, so autoplay / programmatic play always fires.\n if (sound.buffer) {\n sound.play();\n }\n } else if (!component.isPlaying && sound.isPlaying) {\n if (component.isPaused) {\n sound.pause();\n } else {\n sound.stop();\n }\n }\n\n this.prevPlayingState.set(entityId, sound.isPlaying);\n }\n\n // Remove tracking entries for entities that no longer exist.\n for (const entityId of this.prevPlayingState.keys()) {\n if (!liveEntityIds.has(entityId)) {\n this.prevPlayingState.delete(entityId);\n this.prevOptions.delete(entityId);\n this.stoppedDueToInvisibility.delete(entityId);\n }\n }\n }\n\n /** Apply any changed options from the component to the THREE.js audio node. */\n private _syncOptions(\n entityId: number,\n component: AudioComponent,\n sound: THREE.Audio<GainNode> | THREE.PositionalAudio,\n ): void {\n const opts = component.options;\n const prev = this.prevOptions.get(entityId);\n\n if (!prev || prev.loop !== opts.loop) {\n sound.setLoop(opts.loop);\n }\n\n if (!prev || prev.pitch !== opts.pitch) {\n sound.setPlaybackRate(opts.pitch);\n }\n\n if (!prev || prev.volume !== opts.volume) {\n sound.setVolume(opts.volume);\n }\n\n // Positional-only properties — guarded by both the options flag and the\n // THREE.js class check so neither can cause a spurious call.\n if (opts.positional && sound instanceof THREE.PositionalAudio) {\n if (!prev || prev.refDistance !== opts.refDistance) {\n sound.setRefDistance(opts.refDistance);\n }\n\n if (!prev || prev.distanceModel !== opts.distanceModel) {\n sound.setDistanceModel(opts.distanceModel as DistanceModelType);\n }\n\n if (!prev || prev.rolloffFactor !== opts.rolloffFactor) {\n sound.setRolloffFactor(opts.rolloffFactor);\n }\n }\n\n this.prevOptions.set(entityId, snapshotOptions(opts));\n }\n\n dispose(_world: World): void {\n this.prevPlayingState.clear();\n this.prevOptions.clear();\n this.stoppedDueToInvisibility.clear();\n }\n}\n","import * as THREE from \"three\";\n\nimport { VideoComponent } from \"../components/Video\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\n/** Subset of `VideoComponent.options` the system syncs to the DOM / mesh each frame. */\ntype TrackedVideoOptions = {\n loop: boolean;\n volume: number;\n width: number;\n height: number;\n backgroundColor: string;\n similarity: number;\n smoothness: number;\n spill: number;\n positional: boolean;\n refDistance: number;\n distanceModel: string;\n rolloffFactor: number;\n};\n\n/** Playback intent captured from the previous frame for transition detection. */\ntype PrevVideoIntent = {\n isPlaying: boolean;\n isPaused: boolean;\n};\n\nfunction snapshotOptions(opts: VideoComponent[\"options\"]): TrackedVideoOptions {\n return {\n loop: opts.loop,\n volume: opts.volume,\n width: opts.width,\n height: opts.height,\n backgroundColor: opts.backgroundColor,\n similarity: opts.similarity,\n smoothness: opts.smoothness,\n spill: opts.spill,\n positional: opts.positional,\n refDistance: opts.refDistance,\n distanceModel: opts.distanceModel,\n rolloffFactor: opts.rolloffFactor,\n };\n}\n\n/**\n * Reconciles `VideoComponent` state with the underlying HTML video element\n * and THREE.js mesh/material each frame.\n *\n * **Playback** — drives `play()`, `pause()`, and stop (pause + seek to 0) on\n * the HTML `<video>` element based on the `isPlaying` / `isPaused` flags set\n * by `VideoComponent.play()`, `.pause()`, and `.stop()`.\n *\n * **Option sync** — detects changes to `loop`, `volume`, `width`, `height`,\n * and green-screen shader uniforms (`backgroundColor`, `similarity`,\n * `smoothness`, `spill`) and applies them live without a scene reload.\n *\n * Only active in **preview** mode (`isEditor: true` makes every update a\n * no-op so the editor is unaffected).\n *\n * @category Systems\n */\nexport class VideoSystem implements EcsSystem {\n private readonly isEditor: boolean;\n /** Playback intent captured at the end of the previous frame. */\n private readonly prevIntent = new Map<number, PrevVideoIntent>();\n /** Snapshot of options applied in the previous frame, for change detection. */\n private readonly prevOptions = new Map<number, TrackedVideoOptions>();\n /** Tracks entities that were manually paused due to invisibility. */\n private readonly pausedDueToInvisibility = new Set<number>();\n\n constructor({ isEditor = false }: { isEditor?: boolean } = {}) {\n this.isEditor = isEditor;\n }\n\n update(world: World, _deltaTime: number): void {\n if (this.isEditor) return;\n\n const entities = world.query(VideoComponent);\n\n // Track which entities are still alive so we can prune stale map entries.\n const liveEntityIds = new Set(entities);\n\n for (const entityId of entities) {\n const component = world.getComponent(entityId, VideoComponent);\n if (!component?.videoElement) continue;\n\n const video = component.videoElement;\n\n // Skip video updates for invisible entities; pause playback so the video\n // does not continue running while the entity is hidden. Track that we\n // manually paused it so we can resume when visibility is restored.\n if (!world.isEntityVisible(entityId)) {\n if (!video.paused) {\n video.pause();\n this.pausedDueToInvisibility.add(entityId);\n }\n continue;\n }\n\n // Entity is visible — if we previously paused it due to invisibility,\n // resume playback now and clear the flag.\n if (this.pausedDueToInvisibility.has(entityId)) {\n this.pausedDueToInvisibility.delete(entityId);\n // If the component still wants to play, resume the video element.\n if (component.isPlaying && video.paused) {\n video.play().catch(() => {});\n }\n }\n\n // --- Option sync ---------------------------------------------------\n this._syncOptions(entityId, component, video);\n\n // --- Playback reconciliation ----------------------------------------\n const prev = this.prevIntent.get(entityId) ?? { isPlaying: false, isPaused: false };\n\n // Detect natural video end: the element paused on its own (non-looping\n // clip finished) while the component still believes it is playing.\n // Skip this check if we manually paused due to invisibility.\n if (\n prev.isPlaying &&\n video.paused &&\n !video.seeking &&\n component.isPlaying &&\n !component.isPaused &&\n !this.pausedDueToInvisibility.has(entityId)\n ) {\n component.isPlaying = false;\n }\n\n const isStoppedNow = !component.isPlaying && !component.isPaused;\n const wasStoppedPrev = !prev.isPlaying && !prev.isPaused;\n // True only on the first frame after `stop()` is called — used to reset\n // currentTime exactly once rather than every frame.\n const justStopped = !wasStoppedPrev && isStoppedNow;\n\n if (component.isPlaying) {\n if (video.paused) {\n // play() returns a Promise; browsers may reject it due to autoplay\n // policy. The flag stays true so the system retries next frame.\n video.play().catch(() => {});\n }\n } else if (component.isPaused) {\n if (!video.paused) {\n video.pause();\n }\n } else {\n // Stopped state — pause and reset position.\n if (!video.paused) {\n video.pause();\n }\n if (justStopped) {\n video.currentTime = 0;\n }\n }\n\n this.prevIntent.set(entityId, {\n isPlaying: component.isPlaying,\n isPaused: component.isPaused,\n });\n }\n\n // Remove tracking entries for entities that no longer exist.\n for (const entityId of this.prevIntent.keys()) {\n if (!liveEntityIds.has(entityId)) {\n this.prevIntent.delete(entityId);\n this.prevOptions.delete(entityId);\n this.pausedDueToInvisibility.delete(entityId);\n }\n }\n }\n\n /** Apply any changed options from the component to the video element and mesh. */\n private _syncOptions(\n entityId: number,\n component: VideoComponent,\n video: HTMLVideoElement,\n ): void {\n const opts = component.options;\n const prev = this.prevOptions.get(entityId);\n\n if (!prev || prev.loop !== opts.loop) {\n video.loop = opts.loop;\n }\n\n // Volume: prefer the Web Audio gain node when present so that positional\n // attenuation is applied correctly. Fall back to the HTML element directly\n // when no audio node exists (e.g. in editor mode, should rarely occur here\n // since VideoSystem is a no-op in editor).\n if (!prev || prev.volume !== opts.volume) {\n if (component.audioNode) {\n component.audioNode.setVolume(Math.max(0, Math.min(1, opts.volume)));\n } else {\n video.volume = Math.max(0, Math.min(1, opts.volume));\n }\n }\n\n // Mesh scale for width / height.\n if ((!prev || prev.width !== opts.width || prev.height !== opts.height) && component.object) {\n component.object.scale.set(opts.width, opts.height, 1);\n }\n\n // Green-screen shader uniforms — only when the material is a ShaderMaterial.\n const material = component.material;\n if (material instanceof THREE.ShaderMaterial) {\n if (!prev || prev.backgroundColor !== opts.backgroundColor) {\n (material.uniforms.keyColor.value as THREE.Color).set(opts.backgroundColor);\n }\n\n if (!prev || prev.similarity !== opts.similarity) {\n material.uniforms.similarity.value = opts.similarity;\n }\n\n if (!prev || prev.smoothness !== opts.smoothness) {\n material.uniforms.smoothness.value = opts.smoothness;\n }\n\n if (!prev || prev.spill !== opts.spill) {\n material.uniforms.spill.value = opts.spill;\n }\n }\n\n // Positional audio options — only when the audioNode is a PositionalAudio.\n if (opts.positional && component.audioNode instanceof THREE.PositionalAudio) {\n const posAudio = component.audioNode;\n\n if (!prev || prev.refDistance !== opts.refDistance) {\n posAudio.setRefDistance(opts.refDistance);\n }\n\n if (!prev || prev.distanceModel !== opts.distanceModel) {\n posAudio.setDistanceModel(opts.distanceModel as DistanceModelType);\n }\n\n if (!prev || prev.rolloffFactor !== opts.rolloffFactor) {\n posAudio.setRolloffFactor(opts.rolloffFactor);\n }\n }\n\n this.prevOptions.set(entityId, snapshotOptions(opts));\n }\n\n dispose(_world: World): void {\n this.prevIntent.clear();\n this.prevOptions.clear();\n this.pausedDueToInvisibility.clear();\n }\n}\n","import * as THREE from \"three\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport type { XrHandJointName, XrHandJoints } from \"../xr/handPose\";\nimport type { XrHandedness, XrInputKind, XrInputState } from \"../xr/types\";\n\n/**\n * Normalizes every WebXR input model into one pollable shape.\n *\n * Sources are keyed by their live `XRInputSource` object, NOT by index or\n * handedness: Vision Pro's `transient-pointer` sources are created on pinch and\n * destroyed on release, so index-based caching would attribute one pinch's\n * state to the next. Keying by identity means a released source simply\n * disappears, and `selectEnd` still fires for it on its final frame.\n *\n * Mirrors {@link InputSystem}'s pending→latched contract: event handlers only\n * set `pending*` flags, and `update()` promotes them exactly once per frame so\n * `selectStart`/`selectEnd` are true for a single frame regardless of how many\n * events arrived.\n */\n\ntype SourceRecord = {\n source: XRInputSource;\n state: XrInputState;\n pendingSelectStart: boolean;\n pendingSelectEnd: boolean;\n pendingSqueezeStart: boolean;\n pendingSqueezeEnd: boolean;\n /** Marks sources that vanished this frame so we can emit their final edge. */\n removed: boolean;\n};\n\nfunction handednessOf(source: XRInputSource): XrHandedness {\n const value = source.handedness;\n return value === \"left\" || value === \"right\" ? value : \"none\";\n}\n\n/**\n * Classify a source. `targetRayMode` is the authoritative signal — it is how the\n * spec distinguishes Vision Pro's transient pinch (`transient-pointer`) from a\n * held controller (`tracked-pointer`) — with the presence of `hand` breaking the\n * tie for articulated hands.\n */\nfunction kindOf(source: XRInputSource): XrInputKind {\n const mode = source.targetRayMode as string;\n if (mode === \"transient-pointer\") return \"transient-pointer\";\n if (mode === \"gaze\") return \"gaze\";\n if (source.hand) return \"hand\";\n return \"controller\";\n}\n\nfunction blankState(source: XRInputSource): XrInputState {\n return {\n handedness: handednessOf(source),\n kind: kindOf(source),\n connected: true,\n rayOrigin: new THREE.Vector3(),\n rayDirection: new THREE.Vector3(0, 0, -1),\n gripPosition: null,\n gripQuaternion: null,\n select: false,\n selectStart: false,\n selectEnd: false,\n squeeze: false,\n squeezeStart: false,\n squeezeEnd: false,\n axes: [],\n hasAxes: false,\n buttons: [],\n joints: null,\n };\n}\n\n/** Scratch buffer for `fillPoses`; 25 joints x 16 floats. */\nconst JOINT_MATRIX_BUFFER = new Float32Array(25 * 16);\n\n/**\n * Read a tracked hand's joints into world space.\n *\n * Prefers `fillPoses`, which resolves the whole skeleton in one call — 25\n * separate `getJointPose` calls per hand per frame is a real cost at 90Hz — and\n * falls back to per-joint reads on runtimes that lack it.\n *\n * Vectors are reused across frames so a tracked hand allocates nothing.\n */\nfunction readHandJoints(\n frame: XRFrame,\n hand: XRHand,\n referenceSpace: XRReferenceSpace,\n rigMatrix: THREE.Matrix4,\n existing: XrHandJoints | null,\n): XrHandJoints | null {\n const names: XrHandJointName[] = [];\n const spaces: XRSpace[] = [];\n for (const [name, space] of hand as unknown as Iterable<\n [XrHandJointName, XRSpace]\n >) {\n names.push(name);\n spaces.push(space);\n }\n if (spaces.length === 0) return null;\n\n const target: XrHandJoints = existing ?? {};\n const matrix = new THREE.Matrix4();\n\n const buffer =\n spaces.length * 16 <= JOINT_MATRIX_BUFFER.length\n ? JOINT_MATRIX_BUFFER\n : new Float32Array(spaces.length * 16);\n\n const fillPoses = (\n frame as unknown as {\n fillPoses?: (\n spaces: XRSpace[],\n base: XRReferenceSpace,\n out: Float32Array,\n ) => boolean;\n }\n ).fillPoses;\n\n if (typeof fillPoses === \"function\") {\n let filled = false;\n try {\n filled = fillPoses.call(frame, spaces, referenceSpace, buffer);\n } catch {\n filled = false;\n }\n if (filled) {\n for (let i = 0; i < names.length; i += 1) {\n matrix.fromArray(buffer, i * 16).premultiply(rigMatrix);\n const vector = target[names[i]] ?? new THREE.Vector3();\n vector.setFromMatrixPosition(matrix);\n target[names[i]] = vector;\n }\n return target;\n }\n }\n\n let anyTracked = false;\n for (let i = 0; i < names.length; i += 1) {\n const pose = frame.getJointPose?.(\n spaces[i] as XRJointSpace,\n referenceSpace,\n );\n if (!pose) {\n target[names[i]] = undefined;\n continue;\n }\n matrix.fromArray(pose.transform.matrix).premultiply(rigMatrix);\n const vector = target[names[i]] ?? new THREE.Vector3();\n vector.setFromMatrixPosition(matrix);\n target[names[i]] = vector;\n anyTracked = true;\n }\n\n // The spec guarantees a hand poses all joints or none, so no tracked joint\n // means the hand is genuinely gone rather than partially occluded.\n return anyTracked ? target : null;\n}\n\nexport class XRInputSystem implements EcsSystem {\n private readonly records = new Map<XRInputSource, SourceRecord>();\n /** Reference-space → world matrix, rebuilt each frame from the XR rig. */\n private readonly referenceToWorld = new THREE.Matrix4();\n private session: XRSession | null = null;\n\n private readonly onSelectStart = (event: XRInputSourceEvent) =>\n this.mark(event, \"pendingSelectStart\");\n private readonly onSelectEnd = (event: XRInputSourceEvent) =>\n this.mark(event, \"pendingSelectEnd\");\n private readonly onSqueezeStart = (event: XRInputSourceEvent) =>\n this.mark(event, \"pendingSqueezeStart\");\n private readonly onSqueezeEnd = (event: XRInputSourceEvent) =>\n this.mark(event, \"pendingSqueezeEnd\");\n\n private mark(event: XRInputSourceEvent, flag: keyof SourceRecord): void {\n const record = this.ensureRecord(event.inputSource);\n (record as unknown as Record<string, boolean>)[flag as string] = true;\n }\n\n private ensureRecord(source: XRInputSource): SourceRecord {\n let record = this.records.get(source);\n if (!record) {\n record = {\n source,\n state: blankState(source),\n pendingSelectStart: false,\n pendingSelectEnd: false,\n pendingSqueezeStart: false,\n pendingSqueezeEnd: false,\n removed: false,\n };\n this.records.set(source, record);\n }\n return record;\n }\n\n /** Bind to a session. Called by {@link XRSessionSystem} on session start. */\n attachSession(session: XRSession): void {\n this.detachSession();\n this.session = session;\n session.addEventListener(\"selectstart\", this.onSelectStart as EventListener);\n session.addEventListener(\"selectend\", this.onSelectEnd as EventListener);\n session.addEventListener(\n \"squeezestart\",\n this.onSqueezeStart as EventListener,\n );\n session.addEventListener(\"squeezeend\", this.onSqueezeEnd as EventListener);\n }\n\n /** Unbind and drop all per-source state. */\n detachSession(): void {\n const session = this.session;\n if (session) {\n session.removeEventListener(\n \"selectstart\",\n this.onSelectStart as EventListener,\n );\n session.removeEventListener(\n \"selectend\",\n this.onSelectEnd as EventListener,\n );\n session.removeEventListener(\n \"squeezestart\",\n this.onSqueezeStart as EventListener,\n );\n session.removeEventListener(\n \"squeezeend\",\n this.onSqueezeEnd as EventListener,\n );\n }\n this.session = null;\n this.records.clear();\n }\n\n update(world: World): void {\n // Clear one-frame edges from the previous tick, and retire sources that\n // disconnected then (their final selectEnd has now been observed).\n for (const [source, record] of this.records) {\n if (record.removed) {\n this.records.delete(source);\n continue;\n }\n record.state.selectStart = false;\n record.state.selectEnd = false;\n record.state.squeezeStart = false;\n record.state.squeezeEnd = false;\n }\n\n const session = this.session;\n if (!session || !world.isXrPresenting()) return;\n\n const renderer = world.getRenderer();\n const referenceSpace = renderer.xr.getReferenceSpace();\n const frame = (renderer.xr as { getFrame?: () => XRFrame | null }).getFrame?.();\n const live = new Set<XRInputSource>();\n\n // WebXR reports poses in REFERENCE space, which is the XR rig's space —\n // three relies on the rig being the parent to place its own controller\n // objects. Everything downstream of this system (teleport arcs, interaction\n // raycasts, grab positions) works against WORLD-space scene objects, so the\n // poses must be lifted out of rig space here. They coincide only while the\n // rig sits at the origin, which is why aiming drifted the moment the player\n // teleported or turned.\n const rigMatrix = this.referenceToWorld;\n const rig = world.getCamera().parent;\n if (rig) {\n rig.updateMatrixWorld();\n rigMatrix.copy(rig.matrixWorld);\n } else {\n rigMatrix.identity();\n }\n\n for (const source of session.inputSources) {\n live.add(source);\n const record = this.ensureRecord(source);\n const state = record.state;\n state.connected = true;\n // Re-read each frame: a source can gain a gamepad or hand mid-session.\n state.handedness = handednessOf(source);\n state.kind = kindOf(source);\n\n if (frame && referenceSpace && source.targetRaySpace) {\n const pose = frame.getPose(source.targetRaySpace, referenceSpace);\n if (pose) {\n const m = new THREE.Matrix4()\n .fromArray(pose.transform.matrix)\n .premultiply(rigMatrix);\n state.rayOrigin.setFromMatrixPosition(m);\n state.rayDirection\n .set(0, 0, -1)\n .applyQuaternion(\n new THREE.Quaternion().setFromRotationMatrix(m),\n )\n .normalize();\n }\n }\n\n if (frame && referenceSpace && source.gripSpace) {\n const gripPose = frame.getPose(source.gripSpace, referenceSpace);\n if (gripPose) {\n const m = new THREE.Matrix4()\n .fromArray(gripPose.transform.matrix)\n .premultiply(rigMatrix);\n state.gripPosition ??= new THREE.Vector3();\n state.gripQuaternion ??= new THREE.Quaternion();\n state.gripPosition.setFromMatrixPosition(m);\n state.gripQuaternion.setFromRotationMatrix(m);\n }\n } else {\n // Gaze and transient-pointer have no grip — keep it explicitly null so\n // callers can tell \"no grip\" from \"grip at the origin\".\n state.gripPosition = null;\n state.gripQuaternion = null;\n }\n\n if (frame && referenceSpace && source.hand) {\n state.joints = readHandJoints(\n frame,\n source.hand,\n referenceSpace,\n rigMatrix,\n state.joints,\n );\n } else {\n state.joints = null;\n }\n\n const gamepad = source.gamepad;\n if (gamepad) {\n state.axes = Array.from(gamepad.axes);\n state.hasAxes = gamepad.axes.some((axis) => Number.isFinite(axis));\n state.buttons = gamepad.buttons.map((button) => button.pressed);\n } else {\n state.axes = [];\n state.hasAxes = false;\n state.buttons = [];\n }\n\n }\n\n // Latch pending edges for EVERY record, not just the live ones.\n //\n // This pass must not be folded into the loop above: Vision Pro destroys a\n // transient-pointer source in the SAME frame its `selectend` fires, so by\n // the time we iterate `session.inputSources` the released source is already\n // gone. Latching only live sources silently dropped that release edge — and\n // since teleport commits on release, gaze-pinch teleport never fired at all.\n for (const record of this.records.values()) {\n const state = record.state;\n if (record.pendingSelectStart) {\n state.select = true;\n state.selectStart = true;\n record.pendingSelectStart = false;\n }\n if (record.pendingSelectEnd) {\n state.select = false;\n state.selectEnd = true;\n record.pendingSelectEnd = false;\n }\n if (record.pendingSqueezeStart) {\n state.squeeze = true;\n state.squeezeStart = true;\n record.pendingSqueezeStart = false;\n }\n if (record.pendingSqueezeEnd) {\n state.squeeze = false;\n state.squeezeEnd = true;\n record.pendingSqueezeEnd = false;\n }\n }\n\n // A source that left `inputSources` is gone (a released Vision Pro pinch).\n // Flag it rather than deleting now, so this frame still reports its\n // selectEnd; it is removed at the top of the next tick.\n for (const [source, record] of this.records) {\n if (live.has(source)) continue;\n record.state.connected = false;\n record.removed = true;\n }\n }\n\n /** Every input source active this frame. */\n getInputs(): XrInputState[] {\n return Array.from(this.records.values(), (record) => record.state);\n }\n\n /** The first source for a hand, or null. Prefer this for hand-specific logic. */\n getInput(handedness: XrHandedness): XrInputState | null {\n for (const record of this.records.values()) {\n if (record.state.handedness === handedness) return record.state;\n }\n return null;\n }\n\n /** True while ANY source is selecting — the portable \"is the user acting\" check. */\n isSelecting(): boolean {\n for (const record of this.records.values()) {\n if (record.state.select) return true;\n }\n return false;\n }\n\n dispose(): void {\n this.detachSession();\n }\n}\n","import * as THREE from \"three\";\n\n/**\n * Estimates release velocity for thrown objects.\n *\n * Naively differencing the last two frames produces terrible throws: a single\n * noisy sample (or the tiny decelerating motion as the user opens their hand)\n * lands right on the release frame and the object dribbles out. Real throws are\n * recovered by looking back over a short WINDOW and taking the best of it — the\n * approach every mature VR toolkit converges on.\n *\n * Pure and frame-rate independent so throw feel can be unit-tested without a\n * headset.\n */\n\n/** Samples retained. ~5 frames ≈ 55ms at 90Hz — long enough to smooth noise. */\nexport const VELOCITY_SAMPLES = 5;\n/**\n * Samples older than this are ignored on release.\n *\n * Without it, pausing mid-grab then opening your hand would throw using motion\n * from before the pause.\n */\nexport const MAX_SAMPLE_AGE_SECONDS = 0.2;\n\n/**\n * Fastest hand motion treated as real, in metres/second.\n *\n * Samples are recorded in WORLD space, so anything that moves the XR rig while\n * an object is held — teleport, snap turn — relocates the hand instantly and\n * implies an enormous velocity. Releasing after a teleport would otherwise\n * launch the object out of the world.\n *\n * A very hard human throw is under ~15 m/s; a teleport across a room in one\n * frame is hundreds. The gap is wide enough that one threshold separates them\n * cleanly, and it also absorbs the frame-timing glitches that produce the same\n * artefact on standalone headsets.\n */\nexport const MAX_PLAUSIBLE_SPEED = 20;\n\nexport type VelocitySample = {\n position: THREE.Vector3;\n /** Seconds, monotonically increasing. */\n time: number;\n};\n\n/**\n * Rolling buffer of hand positions used to recover throw velocity.\n *\n * One per active grab; cleared on release.\n */\nexport class ThrowVelocityTracker {\n private readonly samples: VelocitySample[] = [];\n\n /** Record where the hand is now. Call once per frame while held. */\n record(position: THREE.Vector3, time: number): void {\n this.samples.push({ position: position.clone(), time });\n if (this.samples.length > VELOCITY_SAMPLES) {\n this.samples.shift();\n }\n }\n\n /**\n * Velocity to release with, in metres/second.\n *\n * Uses the FASTEST segment inside the window rather than the most recent or\n * the window average. Users decelerate as they open their hand, so the last\n * segment understates the throw and the average washes it out; peak speed is\n * what matches the motion the user actually felt they made.\n */\n computeVelocity(now: number): THREE.Vector3 {\n const fresh = this.samples.filter(\n (sample) => now - sample.time <= MAX_SAMPLE_AGE_SECONDS,\n );\n if (fresh.length < 2) return new THREE.Vector3();\n\n let best = new THREE.Vector3();\n let bestSpeed = 0;\n\n for (let i = 1; i < fresh.length; i += 1) {\n const previous = fresh[i - 1];\n const current = fresh[i];\n const dt = current.time - previous.time;\n // Guard zero/negative dt — duplicate timestamps would divide to Infinity\n // and fling the object out of the world.\n if (dt <= 1e-5) continue;\n\n const velocity = new THREE.Vector3()\n .subVectors(current.position, previous.position)\n .divideScalar(dt);\n const speed = velocity.length();\n // Discard teleport/snap-turn discontinuities rather than clamping them:\n // a clamped spike still points in the jump's direction, so the object\n // would fly the way the player teleported instead of the way they threw.\n if (speed > MAX_PLAUSIBLE_SPEED) continue;\n if (speed > bestSpeed) {\n bestSpeed = speed;\n best = velocity;\n }\n }\n\n return best;\n }\n\n clear(): void {\n this.samples.length = 0;\n }\n}\n\n/**\n * Angular velocity from a rotation delta, as an axis-angle vector (rad/s).\n *\n * Spin makes a thrown ball read as thrown rather than launched, and it is what\n * lets a scene do curve shots or spinning props.\n */\nexport function angularVelocityFrom(\n previous: THREE.Quaternion,\n current: THREE.Quaternion,\n deltaTime: number,\n): THREE.Vector3 {\n if (deltaTime <= 1e-5) return new THREE.Vector3();\n\n const delta = current.clone().multiply(previous.clone().invert());\n // Shortest arc — without this a small rotation can be read as a ~2π spin.\n if (delta.w < 0) {\n delta.set(-delta.x, -delta.y, -delta.z, -delta.w);\n }\n\n const angle = 2 * Math.acos(THREE.MathUtils.clamp(delta.w, -1, 1));\n const sinHalf = Math.sqrt(Math.max(0, 1 - delta.w * delta.w));\n if (sinHalf < 1e-6 || angle < 1e-6) return new THREE.Vector3();\n\n return new THREE.Vector3(delta.x, delta.y, delta.z)\n .divideScalar(sinHalf)\n .multiplyScalar(angle / deltaTime);\n}\n","import * as THREE from \"three\";\n\n/**\n * Solves an object's transform from TWO hands holding it.\n *\n * Two grab points constrain an object almost completely — but not quite. They\n * fix a line and a length, which gives orientation along that line and a scale\n * ratio, yet leave the TWIST about the line undetermined. Every implementation\n * has to pick a reference for that twist; here it comes from the primary hand's\n * own roll — the object keeps tracking that hand and is then swung onto the\n * second one by a shortest-arc correction, which adds no twist of its own. That\n * is what makes a two-handed rifle bank when you rotate your trigger hand.\n *\n * The primary hand is ANCHORED and the secondary steers. That asymmetry is\n * deliberate: for the weapon case the grip stays welded to the dominant hand\n * while the foregrip aims, which is both what users expect and what keeps the\n * object from sliding around under small tracking noise in either hand.\n *\n * Pure and frame-rate independent so two-hand feel can be unit-tested.\n */\n\n/** A hand's world pose. */\nexport type HandPose = {\n position: THREE.Vector3;\n /** Used only to resolve twist about the grab axis. */\n quaternion: THREE.Quaternion;\n};\n\n/**\n * How the second hand affects orientation.\n *\n * `align` points the object's grab axis along the line between the hands — the\n * two-handed weapon/tool behaviour. `primary` leaves rotation entirely to the\n * primary hand and lets the second hand contribute only scale, which suits\n * objects being resized rather than aimed.\n */\nexport type TwoHandRotationMode = \"align\" | \"primary\";\n\n/** Captured once, when the second hand grabs. */\nexport type TwoHandGrabBasis = {\n /** Primary hand's grab anchor, object-local (unscaled). */\n primaryLocal: THREE.Vector3;\n /** Secondary hand's grab anchor, object-local (unscaled). */\n secondaryLocal: THREE.Vector3;\n /** Object scale at the moment the second hand grabbed. */\n initialScale: THREE.Vector3;\n /** Hand separation at the moment the second hand grabbed, metres. */\n initialSeparation: number;\n /**\n * Object rotation relative to the PRIMARY hand at grab time.\n *\n * Lets the two-hand solve continue exactly where the one-hand grab left off,\n * so nothing pops at the instant the second hand lands.\n */\n primaryHandOffset: THREE.Quaternion;\n /** Object rotation at that moment, used as the fallback when degenerate. */\n initialQuaternion: THREE.Quaternion;\n};\n\nexport type TwoHandSolveOptions = {\n rotationMode: TwoHandRotationMode;\n allowScale: boolean;\n /** Smallest fraction of the starting size this gesture may reach. */\n minScale: number;\n /** Largest multiple of the starting size this gesture may reach. */\n maxScale: number;\n};\n\nexport type TwoHandSolveResult = {\n position: THREE.Vector3;\n quaternion: THREE.Quaternion;\n scale: THREE.Vector3;\n /**\n * True when the hands were too close to define a stable axis, so rotation\n * fell back rather than being solved. Callers should hold their previous\n * orientation on these frames.\n */\n degenerate: boolean;\n};\n\n/**\n * Hands closer together than this cannot define a reliable axis.\n *\n * Rotation from two points is a lever: as the separation shrinks, the same\n * millimetre of tracking noise swings the object through a larger angle, and\n * below a few centimetres it becomes violent jitter. Real two-handed grips are\n * never this close, so refusing to solve is strictly better than solving badly.\n */\nexport const MIN_HAND_SEPARATION = 0.06;\n\n/** Anchors closer together than this on the object give the same lever problem. */\nconst MIN_ANCHOR_SEPARATION = 1e-3;\n\n/**\n * Fractional change in hand separation before scale reacts.\n *\n * Hands drift constantly while carrying something with both of them. Without a\n * deadzone an object with scaling enabled would breathe in and out the whole\n * time it was held, which reads as broken rather than responsive.\n */\nexport const SCALE_DEADZONE = 0.05;\n\n/**\n * Solve the object transform for the current hand poses.\n *\n * `primary`/`secondary` must be passed in the same roles used when the basis was\n * captured, or the object will flip.\n */\nexport function solveTwoHandTransform(\n primary: HandPose,\n secondary: HandPose,\n basis: TwoHandGrabBasis,\n options: TwoHandSolveOptions,\n): TwoHandSolveResult {\n const separation = primary.position.distanceTo(secondary.position);\n\n const anchorDelta = new THREE.Vector3().subVectors(\n basis.secondaryLocal,\n basis.primaryLocal,\n );\n const anchorLength = anchorDelta.length();\n\n // ── Scale ────────────────────────────────────────────────────────────────\n // Ratio of current to starting hand separation. Clamped per gesture so a\n // single pull cannot blow the object up unboundedly.\n let factor = 1;\n if (\n options.allowScale &&\n basis.initialSeparation > MIN_ANCHOR_SEPARATION &&\n separation > MIN_ANCHOR_SEPARATION\n ) {\n factor = separation / basis.initialSeparation;\n // Ignore small drift so an object only resizes when the user clearly means\n // to, then rebase so scaling starts smoothly from the edge of the deadzone\n // rather than jumping by the deadzone's width.\n if (Math.abs(factor - 1) <= SCALE_DEADZONE) {\n factor = 1;\n } else {\n factor += factor > 1 ? -SCALE_DEADZONE : SCALE_DEADZONE;\n }\n factor = Math.min(options.maxScale, Math.max(options.minScale, factor));\n }\n // Uniform only: scaling one axis of a held object shears it relative to the\n // hands and there is no sane way to map two points onto three axes.\n const scale = basis.initialScale.clone().multiplyScalar(factor);\n\n // ── Rotation ─────────────────────────────────────────────────────────────\n //\n // Built as \"keep following the primary hand, then swing the grab axis onto the\n // second hand\" rather than by constructing an orientation from scratch.\n //\n // That composition matters for two reasons. It is CONTINUOUS with the one-hand\n // grab, so nothing jumps when the second hand lands. And the correction is a\n // SHORTEST-ARC rotation between two directions, which adds no twist of its\n // own — so the primary hand keeps supplying roll, and there is no up-vector to\n // go degenerate when the grab axis happens to point along it. Building an\n // orthonormal basis instead needs a reference up, and every implementation\n // that does it also needs a blend to escape that singularity plus a\n // hemisphere-flip guard to stop compound rotations snapping 180°.\n const degenerate =\n separation < MIN_HAND_SEPARATION || anchorLength < MIN_ANCHOR_SEPARATION;\n\n // Where the primary hand alone would put the object.\n const base = primary.quaternion.clone().multiply(basis.primaryHandOffset);\n\n let quaternion: THREE.Quaternion;\n\n if (options.rotationMode === \"primary\" || degenerate) {\n // Also the fallback when the axis is unusable, so bringing one hand right up\n // to the other degrades to a stable one-hand hold instead of thrashing.\n quaternion = base;\n } else {\n const axisLocal = anchorDelta.clone().normalize();\n const currentAxis = axisLocal.clone().applyQuaternion(base).normalize();\n const desiredAxis = new THREE.Vector3()\n .subVectors(secondary.position, primary.position)\n .normalize();\n\n // `setFromUnitVectors` picks an orthogonal axis for the antiparallel case,\n // so a fully reversed grab stays finite instead of producing NaN.\n const correction = new THREE.Quaternion().setFromUnitVectors(\n currentAxis,\n desiredAxis,\n );\n // World-space correction applied on top of the hand-tracked base.\n quaternion = correction.multiply(base);\n }\n\n // ── Position ─────────────────────────────────────────────────────────────\n // Place the object so its primary anchor lands exactly on the primary hand.\n const anchorOffset = basis.primaryLocal\n .clone()\n .multiply(scale)\n .applyQuaternion(quaternion);\n const position = primary.position.clone().sub(anchorOffset);\n\n return { position, quaternion, scale, degenerate };\n}\n","import * as THREE from \"three\";\nimport { Behaviour } from \"../Behaviour\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport {\n PhysicsComponent,\n setPhysicsLiveRef,\n} from \"../components/Physics\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport { TransformComponent } from \"../components/Transform\";\nimport {\n type XrAttachPoint,\n XRInteractableComponent,\n} from \"../components/XRInteractable\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport {\n angularVelocityFrom,\n ThrowVelocityTracker,\n} from \"../xr/throwVelocity\";\nimport {\n solveTwoHandTransform,\n type TwoHandGrabBasis,\n} from \"../xr/twoHandTransform\";\nimport type { XrInputState } from \"../xr/types\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\n\n/**\n * Pointer hover, grabbing and throwing for {@link XRInteractableComponent}.\n *\n * Supports both reach models — **physical** (hand within the object's grab\n * radius) and **distance** (along the pointer ray) — and, for distance grabs,\n * either snapping the object to the hand or manipulating it where it stands.\n *\n * Uses the same ray for every input model, so a controller, a tracked hand and\n * a Vision Pro gaze-pinch all drive interaction identically; the differences\n * are absorbed by {@link XRInputSystem}, not repeated here.\n */\n\n/** How far in front of a grip-less source an object is held, in metres. */\nconst RAYLESS_HOLD_DISTANCE = 0.5;\n\n/** Euler-XYZ radians → quaternion. TransformComponent stores Euler. */\nfunction quatFromEulerVec(r: {\n x: number;\n y: number;\n z: number;\n}): THREE.Quaternion {\n return new THREE.Quaternion().setFromEuler(new THREE.Euler(r.x, r.y, r.z));\n}\n\n/** Write a quaternion back into a TransformComponent's Euler rotation. */\nfunction writeEuler(\n target: { x: number; y: number; z: number },\n q: THREE.Quaternion,\n): void {\n const euler = new THREE.Euler().setFromQuaternion(q);\n target.x = euler.x;\n target.y = euler.y;\n target.z = euler.z;\n}\n\ntype GrabRecord = {\n entityId: number;\n /**\n * Anchoring hand vs steering hand.\n *\n * The primary is welded to the object; the secondary only aims and scales it.\n * When the primary lets go, the secondary is PROMOTED rather than the object\n * being dropped.\n */\n role: \"primary\" | \"secondary\";\n /** Authored hold in use, or null for a free grab. */\n attachPointId: string | null;\n /** The authored hold's object-local position, unscaled. */\n attachLocal: THREE.Vector3 | null;\n /** The authored hold's object-local orientation. */\n attachQuaternion: THREE.Quaternion | null;\n /** Object rotation relative to the hand at grab time, for free grabs. */\n handRotationOffset: THREE.Quaternion;\n /** Set on the PRIMARY record once a second hand joins. */\n twoHand: TwoHandGrabBasis | null;\n /** Object position relative to the hand at grab time (hand space). */\n offset: THREE.Vector3;\n /** Object rotation relative to the hand at grab time. */\n rotationOffset: THREE.Quaternion;\n /** Distance along the ray for a `remote` distance grab. */\n remoteDistance: number;\n remote: boolean;\n /** Body type to restore on release. */\n restoreBodyType: string | null;\n tracker: ThrowVelocityTracker;\n lastHandQuaternion: THREE.Quaternion;\n /** Most recent hand spin, released as angular velocity for a natural throw. */\n angularVelocity: THREE.Vector3;\n};\n\n/** One interactable considered this frame. */\ntype InteractableEntry = {\n entityId: number;\n object: THREE.Object3D;\n pointable: boolean;\n};\n\nexport class XRInteractionSystem implements EcsSystem {\n private readonly inputSystem: XRInputSystem;\n private readonly raycaster = new THREE.Raycaster();\n private readonly grabs = new Map<XrInputState, GrabRecord>();\n private hoveredEntityId: number | null = null;\n /** Per-hand hover, with the hit distance so the ray can stop at the surface. */\n private readonly hovers = new Map<\n XrInputState,\n { entityId: number; distance: number }\n >();\n /** Monotonic seconds, accumulated from deltaTime for velocity sampling. */\n private elapsed = 0;\n\n constructor(inputSystem: XRInputSystem) {\n this.inputSystem = inputSystem;\n }\n\n update(world: World, deltaTime: number): void {\n if (!world.isXrPresenting()) {\n this.releaseAll(world);\n return;\n }\n\n this.elapsed += Math.max(0, deltaTime);\n const inputs = this.inputSystem.getInputs();\n const interactables = this.collectInteractables(world);\n this.hoveredEntityId = null;\n this.hovers.clear();\n\n for (const input of inputs) {\n // A source that vanished mid-grab (released Vision Pro pinch) must drop\n // whatever it held, or the object is stranded in mid-air.\n if (!input.connected) {\n this.release(world, input);\n continue;\n }\n\n const held = this.grabs.get(input);\n if (held) {\n if (this.wantsRelease(world, input, held)) {\n this.release(world, input);\n }\n continue;\n }\n\n const candidate = this.findGrabCandidate(world, input, interactables);\n if (candidate === null) continue;\n\n if (this.hoveredEntityId === null) {\n this.hoveredEntityId = candidate.entityId;\n }\n this.hovers.set(input, {\n entityId: candidate.entityId,\n distance: candidate.distance,\n });\n\n const interactable = world.getComponent(\n candidate.entityId,\n XRInteractableComponent,\n );\n if (\n interactable?.grabbable &&\n this.gestureMatches(input, interactable, /* starting */ true)\n ) {\n this.tryGrab(world, input, candidate.entityId, candidate.viaDistance);\n }\n }\n\n // Move held objects only AFTER every grab and release has settled, and once\n // per ENTITY rather than once per hand. A two-hand hold is a single solve;\n // driving it from each hand in turn would have them fight each other.\n this.moveAllHeld(world, deltaTime);\n }\n\n /** Hands currently holding an entity. */\n private holdersOf(\n entityId: number,\n ): Array<{ input: XrInputState; record: GrabRecord }> {\n const holders: Array<{ input: XrInputState; record: GrabRecord }> = [];\n for (const [input, record] of this.grabs) {\n if (record.entityId === entityId) holders.push({ input, record });\n }\n return holders;\n }\n\n /**\n * Route a new grab: first hand, hand-off, or second hand.\n *\n * Which of those happens is the object's choice (`grabHands`), not the\n * hand's — a ball should pass between hands, a rifle should be held by both,\n * and a lever should stay with whoever grabbed it first.\n */\n private tryGrab(\n world: World,\n input: XrInputState,\n entityId: number,\n viaDistance: boolean,\n ): void {\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n if (!interactable) return;\n\n const holders = this.holdersOf(entityId);\n if (holders.length === 0) {\n this.grab(world, input, entityId, viaDistance, \"primary\");\n return;\n }\n if (holders.some((holder) => holder.input === input)) return;\n\n if (interactable.grabHands === \"single\") return;\n\n if (interactable.grabHands === \"handOff\") {\n // TRANSFER, not release-then-grab: going through release() would restore\n // the body to dynamic and hurl it with the old hand's velocity. Moving\n // the record keeps physics suspended and the object in hand.\n const previous = holders[0];\n this.grabs.delete(previous.input);\n const record = previous.record;\n record.role = \"primary\";\n record.twoHand = null;\n this.reanchor(world, input, record, interactable);\n this.grabs.set(input, record);\n this.dispatch(world, entityId, (b) => b.onGrab(input));\n return;\n }\n\n if (holders.length >= 2) return;\n this.grab(world, input, entityId, viaDistance, \"secondary\");\n this.beginTwoHand(world, entityId);\n }\n\n /**\n * Re-derive a record's hold from where the object is NOW.\n *\n * Used on hand-off and on promotion after the primary lets go. Without it the\n * object snaps to whatever offset the previous hand had, which reads as the\n * object jumping out of your grip at the moment you take it.\n */\n private reanchor(\n world: World,\n input: XrInputState,\n record: GrabRecord,\n interactable: XRInteractableComponent,\n ): void {\n const transform = world.getComponent(record.entityId, TransformComponent);\n if (!transform) return;\n\n const hand = this.handPosition(input);\n const handQuaternion = this.handQuaternion(input);\n const objectQuaternion = quatFromEulerVec(transform.rotation);\n\n record.offset = new THREE.Vector3(\n transform.position.x - hand.x,\n transform.position.y - hand.y,\n transform.position.z - hand.z,\n ).applyQuaternion(handQuaternion.clone().invert());\n record.handRotationOffset = handQuaternion\n .clone()\n .invert()\n .multiply(objectQuaternion);\n record.remote = false;\n record.tracker.clear();\n record.tracker.record(hand, this.elapsed);\n record.lastHandQuaternion = handQuaternion.clone();\n // An authored hold stays authored across a transfer; a free grab re-derives\n // from the current pose, which is what the offset above just captured.\n if (record.attachLocal && interactable.attachPoints.length === 0) {\n record.attachLocal = null;\n record.attachQuaternion = null;\n record.attachPointId = null;\n }\n }\n\n /** Capture the two-hand basis once both hands are on the object. */\n private beginTwoHand(world: World, entityId: number): void {\n const holders = this.holdersOf(entityId);\n if (holders.length !== 2) return;\n\n const primary = holders.find((h) => h.record.role === \"primary\");\n const secondary = holders.find((h) => h.record.role === \"secondary\");\n if (!primary || !secondary) return;\n\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) return;\n\n const primaryHand = this.handPosition(primary.input);\n const secondaryHand = this.handPosition(secondary.input);\n\n // Anchors are the authored holds when the object has them, and otherwise\n // wherever each hand happens to be on the object — so a plain box can still\n // be grabbed with two hands and scaled.\n const primaryLocal =\n primary.record.attachLocal?.clone() ??\n this.objectLocalPoint(transform, primaryHand);\n const secondaryLocal =\n secondary.record.attachLocal?.clone() ??\n this.objectLocalPoint(transform, secondaryHand);\n\n primary.record.twoHand = {\n primaryLocal,\n secondaryLocal,\n initialScale: new THREE.Vector3(\n transform.scale.x,\n transform.scale.y,\n transform.scale.z,\n ),\n initialSeparation: primaryHand.distanceTo(secondaryHand),\n // How the object sits relative to the anchoring hand right now, so the\n // two-hand solve picks up exactly where the one-hand hold left off.\n primaryHandOffset: this.handQuaternion(primary.input)\n .invert()\n .multiply(quatFromEulerVec(transform.rotation)),\n initialQuaternion: quatFromEulerVec(transform.rotation),\n };\n\n this.dispatch(world, entityId, (b) => b.onSecondaryGrab(secondary.input));\n }\n\n /** World point → the object's UNSCALED local space. */\n private objectLocalPoint(\n transform: TransformComponent,\n worldPoint: THREE.Vector3,\n ): THREE.Vector3 {\n const local = worldPoint\n .clone()\n .sub(\n new THREE.Vector3(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n ),\n )\n .applyQuaternion(quatFromEulerVec(transform.rotation).invert());\n // Divide out scale so the anchor stays valid when the object is resized.\n local.x /= transform.scale.x || 1;\n local.y /= transform.scale.y || 1;\n local.z /= transform.scale.z || 1;\n return local;\n }\n\n /** Whether the grab gesture for this object is currently starting. */\n private gestureMatches(\n input: XrInputState,\n interactable: XRInteractableComponent,\n starting: boolean,\n ): boolean {\n const pinch = starting ? input.selectStart : input.select;\n const full = starting ? input.squeezeStart : input.squeeze;\n switch (interactable.grabGesture) {\n case \"pinch\":\n return pinch;\n case \"full\":\n return full;\n default:\n return pinch || full;\n }\n }\n\n /** True once the gesture that started the grab has ended. */\n private wantsRelease(\n world: World,\n input: XrInputState,\n held: GrabRecord,\n ): boolean {\n const interactable = world.getComponent(\n held.entityId,\n XRInteractableComponent,\n );\n if (!interactable) return true;\n switch (interactable.grabGesture) {\n case \"pinch\":\n return input.selectEnd || !input.select;\n case \"full\":\n return input.squeezeEnd || !input.squeeze;\n default:\n return !input.select && !input.squeeze;\n }\n }\n\n /**\n * Find what this hand would grab: a physically-reachable object first, then\n * one along the pointer ray.\n *\n * Proximity wins over the ray so that reaching for something you are touching\n * never picks up a distant object behind it, which feels broken.\n */\n private findGrabCandidate(\n world: World,\n input: XrInputState,\n interactables: InteractableEntry[],\n ): { entityId: number; viaDistance: boolean; distance: number } | null {\n const hand = this.handPosition(input);\n\n let nearestId: number | null = null;\n let nearestDistance = Number.POSITIVE_INFINITY;\n for (const entry of interactables) {\n const interactable = world.getComponent(\n entry.entityId,\n XRInteractableComponent,\n );\n if (!interactable) continue;\n if (interactable.grabReach === \"distance\") continue;\n\n const position = new THREE.Vector3();\n entry.object.getWorldPosition(position);\n const distance = position.distanceTo(hand);\n if (distance <= interactable.grabRadius && distance < nearestDistance) {\n nearestDistance = distance;\n nearestId = entry.entityId;\n }\n }\n if (nearestId !== null) {\n return {\n entityId: nearestId,\n viaDistance: false,\n distance: nearestDistance,\n };\n }\n\n const hit = this.raycast(input, interactables);\n if (hit === null) return null;\n const hitId = hit.entityId;\n\n const interactable = world.getComponent(hitId, XRInteractableComponent);\n // Physical-only objects still HOVER at range (so the ray highlights them),\n // but cannot be grabbed until the user actually reaches them.\n const viaDistanceAllowed =\n interactable?.grabReach === \"distance\" ||\n interactable?.grabReach === \"both\";\n return {\n entityId: hitId,\n viaDistance: viaDistanceAllowed,\n distance: hit.distance,\n };\n }\n\n private collectInteractables(world: World): InteractableEntry[] {\n const out: InteractableEntry[] = [];\n for (const entityId of world.query(XRInteractableComponent, Object3DRef)) {\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n if (!interactable?.enabled) continue;\n if (!world.isEntityVisible(entityId)) continue;\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) {\n out.push({ entityId, object, pointable: interactable.pointable });\n }\n }\n return out;\n }\n\n /** Entity id of the nearest pointable hit along this source's ray, or null. */\n private raycast(\n input: XrInputState,\n interactables: InteractableEntry[],\n ): { entityId: number; distance: number } | null {\n if (interactables.length === 0) return null;\n this.raycaster.set(input.rayOrigin, input.rayDirection);\n this.raycaster.far = Number.POSITIVE_INFINITY;\n\n let nearestId: number | null = null;\n let nearestDistance = Number.POSITIVE_INFINITY;\n for (const entry of interactables) {\n // `pointable: false` means \"not reachable by the ray\" — a physics prop you\n // must actually walk up to. It was being ignored here, so clearing the\n // flag had no effect on ray targeting.\n if (!entry.pointable) continue;\n const hit = this.raycaster.intersectObject(entry.object, true)[0];\n if (!hit) continue;\n if (hit.distance < nearestDistance) {\n nearestDistance = hit.distance;\n nearestId = entry.entityId;\n }\n }\n return nearestId === null\n ? null\n : { entityId: nearestId, distance: nearestDistance };\n }\n\n /**\n * Pick the authored hold this hand should take.\n *\n * Filters by hand and by role — that is what makes \"the trigger hand goes on\n * the grip\" hold regardless of which hand reaches first — then takes the\n * nearest remaining one so grabbing near the foregrip picks the foregrip.\n */\n private chooseAttachPoint(\n world: World,\n input: XrInputState,\n entityId: number,\n interactable: XRInteractableComponent,\n role: \"primary\" | \"secondary\",\n ): XrAttachPoint | null {\n if (interactable.attachPoints.length === 0) return null;\n\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) return null;\n\n const taken = new Set(\n this.holdersOf(entityId)\n .map((holder) => holder.record.attachPointId)\n .filter((id): id is string => id !== null),\n );\n\n const hand = this.handPosition(input);\n const objectPosition = new THREE.Vector3(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n const objectQuaternion = quatFromEulerVec(transform.rotation);\n const scale = new THREE.Vector3(\n transform.scale.x,\n transform.scale.y,\n transform.scale.z,\n );\n\n let best: XrAttachPoint | null = null;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (const point of interactable.attachPoints) {\n if (taken.has(point.id)) continue;\n if (point.hand !== \"any\" && point.hand !== input.handedness) continue;\n if (point.role !== \"any\" && point.role !== role) continue;\n\n const world3 = new THREE.Vector3(\n point.position.x,\n point.position.y,\n point.position.z,\n )\n .multiply(scale)\n .applyQuaternion(objectQuaternion)\n .add(objectPosition);\n\n const distance = world3.distanceTo(hand);\n if (distance < bestDistance) {\n bestDistance = distance;\n best = point;\n }\n }\n\n return best;\n }\n\n private grab(\n world: World,\n input: XrInputState,\n entityId: number,\n viaDistance: boolean,\n role: \"primary\" | \"secondary\",\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n if (!transform || !interactable) return;\n\n const hand = this.handPosition(input);\n const handQuaternion = this.handQuaternion(input);\n const remote =\n viaDistance && interactable.distanceBehavior === \"remote\";\n\n let offset: THREE.Vector3;\n let remoteDistance = 0;\n\n if (remote) {\n // Keep it where it is and carry it along the ray at the same range.\n const position = new THREE.Vector3(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n remoteDistance = position.distanceTo(input.rayOrigin);\n offset = new THREE.Vector3();\n } else if (viaDistance) {\n // Snap: the object comes to the hand, positioned by the authored offset\n // so it sits where the author intended rather than at the wrist pivot.\n offset = new THREE.Vector3(\n interactable.grabOffsetPosition.x,\n interactable.grabOffsetPosition.y,\n interactable.grabOffsetPosition.z,\n );\n } else {\n // Physical: preserve the relative pose so it doesn't jump on contact.\n //\n // Stored in HAND space, not world space. A world-space offset stays put\n // as the wrist turns, so the object spun on the spot at a fixed distance\n // instead of swinging around the hand — which is why a directly-grabbed\n // object could not be turned over to inspect it, while a distance grab\n // (whose offset is ~zero) felt correct.\n offset = new THREE.Vector3(\n transform.position.x - hand.x,\n transform.position.y - hand.y,\n transform.position.z - hand.z,\n ).applyQuaternion(handQuaternion.clone().invert());\n }\n\n // Suspend simulation while held so the body follows the hand exactly\n // instead of fighting gravity; restored (and thrown) on release.\n const physics = world.getComponent(entityId, PhysicsComponent);\n let restoreBodyType: string | null = null;\n if (physics) {\n restoreBodyType = physics.values.rigidbody.type;\n physics.values.rigidbody.type = \"kinematicPosition\";\n }\n\n const tracker = new ThrowVelocityTracker();\n tracker.record(hand, this.elapsed);\n\n const attachPoint = this.chooseAttachPoint(\n world,\n input,\n entityId,\n interactable,\n role,\n );\n\n // Preserve the object's rotation relative to the hand, so it turns with the\n // wrist instead of staying stubbornly axis-aligned.\n const objectQuaternion = quatFromEulerVec(transform.rotation);\n const handRotationOffset = handQuaternion\n .clone()\n .invert()\n .multiply(objectQuaternion);\n\n this.grabs.set(input, {\n entityId,\n role,\n attachPointId: attachPoint?.id ?? null,\n attachLocal: attachPoint\n ? new THREE.Vector3(\n attachPoint.position.x,\n attachPoint.position.y,\n attachPoint.position.z,\n )\n : null,\n attachQuaternion: attachPoint\n ? quatFromEulerVec(attachPoint.rotation)\n : null,\n handRotationOffset,\n twoHand: null,\n offset,\n rotationOffset: new THREE.Quaternion().setFromEuler(\n new THREE.Euler(\n interactable.grabOffsetRotation.x,\n interactable.grabOffsetRotation.y,\n interactable.grabOffsetRotation.z,\n ),\n ),\n remoteDistance,\n remote,\n restoreBodyType,\n tracker,\n lastHandQuaternion: handQuaternion.clone(),\n angularVelocity: new THREE.Vector3(),\n });\n\n if (role === \"primary\") {\n this.dispatch(world, entityId, (b) => b.onGrab(input));\n }\n }\n\n /** Drive every held object, once each, after grabs and releases settle. */\n private moveAllHeld(world: World, deltaTime: number): void {\n const done = new Set<number>();\n for (const [input, record] of this.grabs) {\n if (done.has(record.entityId)) continue;\n done.add(record.entityId);\n\n const holders = this.holdersOf(record.entityId);\n if (holders.length >= 2) {\n this.moveTwoHand(world, record.entityId, holders, deltaTime);\n } else {\n this.moveHeld(world, input, record, deltaTime);\n }\n }\n }\n\n /** Solve and apply a two-hand hold. */\n private moveTwoHand(\n world: World,\n entityId: number,\n holders: Array<{ input: XrInputState; record: GrabRecord }>,\n deltaTime: number,\n ): void {\n const primary = holders.find((h) => h.record.role === \"primary\");\n const secondary = holders.find((h) => h.record.role === \"secondary\");\n const transform = world.getComponent(entityId, TransformComponent);\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n const basis = primary?.record.twoHand ?? null;\n\n // Missing basis means the second hand arrived without beginTwoHand running;\n // fall back to a one-hand hold rather than freezing the object.\n if (!primary || !secondary || !transform || !interactable || !basis) {\n if (primary) {\n this.moveHeld(world, primary.input, primary.record, deltaTime);\n }\n return;\n }\n\n const primaryHand = this.handPosition(primary.input);\n const primaryQuaternion = this.handQuaternion(primary.input);\n\n const solved = solveTwoHandTransform(\n { position: primaryHand, quaternion: primaryQuaternion },\n {\n position: this.handPosition(secondary.input),\n quaternion: this.handQuaternion(secondary.input),\n },\n basis,\n {\n rotationMode: interactable.twoHandRotation,\n allowScale: interactable.allowTwoHandScale,\n minScale: interactable.minScale,\n maxScale: interactable.maxScale,\n },\n );\n\n transform.position.x = solved.position.x;\n transform.position.y = solved.position.y;\n transform.position.z = solved.position.z;\n writeEuler(transform.rotation, solved.quaternion);\n\n if (interactable.allowTwoHandScale) {\n transform.scale.x = solved.scale.x;\n transform.scale.y = solved.scale.y;\n transform.scale.z = solved.scale.z;\n }\n\n // Throw velocity tracks the PRIMARY hand: releasing a two-hand hold should\n // throw the way the anchoring hand was moving, not some blend that matches\n // neither hand.\n primary.record.tracker.record(primaryHand, this.elapsed);\n primary.record.angularVelocity = angularVelocityFrom(\n primary.record.lastHandQuaternion,\n primaryQuaternion,\n deltaTime,\n );\n primary.record.lastHandQuaternion = primaryQuaternion.clone();\n }\n\n private moveHeld(\n world: World,\n input: XrInputState,\n held: GrabRecord,\n deltaTime: number,\n ): void {\n const transform = world.getComponent(held.entityId, TransformComponent);\n if (!transform) return;\n\n const hand = this.handPosition(input);\n const handQuaternion = this.handQuaternion(input);\n\n // Rotation: an authored hold aligns its own frame to the hand; a free grab\n // keeps the relative rotation it was picked up with. Nothing wrote rotation\n // at all before, so held objects could not be aimed and the authored\n // rotation offset had no effect.\n const objectQuaternion = held.attachQuaternion\n ? handQuaternion\n .clone()\n .multiply(held.rotationOffset)\n .multiply(held.attachQuaternion.clone().invert())\n : handQuaternion.clone().multiply(held.handRotationOffset);\n\n if (held.remote) {\n // Ride the ray at the distance it was grabbed from.\n const target = new THREE.Vector3()\n .copy(input.rayDirection)\n .multiplyScalar(held.remoteDistance)\n .add(input.rayOrigin);\n transform.position.x = target.x;\n transform.position.y = target.y;\n transform.position.z = target.z;\n writeEuler(transform.rotation, objectQuaternion);\n } else if (held.attachLocal) {\n // Place the object so its authored hold sits exactly on the hand.\n const anchor = held.attachLocal\n .clone()\n .multiply(\n new THREE.Vector3(\n transform.scale.x,\n transform.scale.y,\n transform.scale.z,\n ),\n )\n .applyQuaternion(objectQuaternion);\n transform.position.x = hand.x - anchor.x;\n transform.position.y = hand.y - anchor.y;\n transform.position.z = hand.z - anchor.z;\n writeEuler(transform.rotation, objectQuaternion);\n } else {\n // Hand-space offset rotated back into the world, so the object rides the\n // wrist rigidly rather than hovering at a fixed world displacement.\n const carried = held.offset.clone().applyQuaternion(handQuaternion);\n transform.position.x = hand.x + carried.x;\n transform.position.y = hand.y + carried.y;\n transform.position.z = hand.z + carried.z;\n writeEuler(transform.rotation, objectQuaternion);\n }\n\n // Sample for the throw, and track hand spin for angular release.\n held.tracker.record(\n held.remote\n ? new THREE.Vector3(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n )\n : hand,\n this.elapsed,\n );\n // Track hand spin so a thrown object tumbles instead of sliding flat.\n held.angularVelocity = angularVelocityFrom(\n held.lastHandQuaternion,\n handQuaternion,\n deltaTime,\n );\n held.lastHandQuaternion = handQuaternion;\n }\n\n private release(world: World, input: XrInputState): void {\n const held = this.grabs.get(input);\n if (!held) return;\n this.grabs.delete(input);\n\n const interactable = world.getComponent(\n held.entityId,\n XRInteractableComponent,\n );\n\n // ── Still held by the other hand? Then this is not a drop. ──────────────\n //\n // Letting go with one hand of a two-hand hold must leave the object in the\n // remaining hand. Restoring physics or throwing here would rip it away\n // mid-grip — the object would launch out of the hand still holding it.\n const remaining = this.holdersOf(held.entityId);\n if (remaining.length > 0 && interactable) {\n if (held.role === \"secondary\") {\n // The steering hand let go; the anchoring hand keeps it. Drop the\n // two-hand basis and re-derive the one-hand hold from where the object\n // ended up, so it does not snap back to its pre-scale pose.\n const primary = remaining.find((h) => h.record.role === \"primary\");\n if (primary) {\n primary.record.twoHand = null;\n this.reanchor(world, primary.input, primary.record, interactable);\n }\n this.dispatch(world, held.entityId, (b) =>\n b.onSecondaryRelease(input),\n );\n } else {\n // The anchoring hand let go: PROMOTE the other hand rather than\n // dropping the object, which is what a real hand-over-hand regrip does.\n const next = remaining[0];\n next.record.role = \"primary\";\n next.record.twoHand = null;\n // The promoted hand inherits the throw bookkeeping, so a two-hand hold\n // released one hand at a time can still be thrown.\n next.record.restoreBodyType = held.restoreBodyType;\n this.reanchor(world, next.input, next.record, interactable);\n this.dispatch(world, held.entityId, (b) => b.onRelease(input));\n }\n held.tracker.clear();\n return;\n }\n const physics = world.getComponent(held.entityId, PhysicsComponent);\n\n if (held.restoreBodyType !== null && physics) {\n physics.values.rigidbody.type =\n held.restoreBodyType as typeof physics.values.rigidbody.type;\n\n // Hand the object the momentum it was moving with. Without this a thrown\n // ball simply drops at the release point, which is the difference between\n // \"put down\" and \"throw\" — and the whole point of physics grabs.\n const dynamic = held.restoreBodyType === \"dynamic\";\n if (dynamic && interactable?.applyVelocityOnRelease) {\n const velocity = held.tracker\n .computeVelocity(this.elapsed)\n .multiplyScalar(interactable.velocityScale);\n const spin = held.angularVelocity;\n // QUEUED rather than applied here: the body is still kinematic at this\n // instant and Rapier ignores velocity on kinematic bodies. PhysicsSync\n // applies it in the same tick it turns the body dynamic again.\n setPhysicsLiveRef(physics, \"pendingVelocity\", {\n linear: { x: velocity.x, y: velocity.y, z: velocity.z },\n angular: { x: spin.x, y: spin.y, z: spin.z },\n });\n }\n }\n\n held.tracker.clear();\n this.dispatch(world, held.entityId, (b) => b.onRelease(input));\n }\n\n private releaseAll(world: World): void {\n for (const input of Array.from(this.grabs.keys())) {\n this.release(world, input);\n }\n }\n\n /**\n * Where the \"hand\" is. Controllers and tracked hands report a grip pose;\n * gaze and transient-pointer sources have none, so we hold the object a fixed\n * distance along the ray instead — which is what makes Vision Pro work.\n */\n private handPosition(input: XrInputState): THREE.Vector3 {\n if (input.gripPosition) return input.gripPosition;\n return new THREE.Vector3()\n .copy(input.rayDirection)\n .multiplyScalar(RAYLESS_HOLD_DISTANCE)\n .add(input.rayOrigin);\n }\n\n /**\n * Hand orientation. Grip-less sources (gaze / transient-pointer) have none,\n * so we derive one from the aim direction — enough for spin on release.\n */\n private handQuaternion(input: XrInputState): THREE.Quaternion {\n if (input.gripQuaternion) return input.gripQuaternion.clone();\n return new THREE.Quaternion().setFromUnitVectors(\n new THREE.Vector3(0, 0, -1),\n input.rayDirection.clone().normalize(),\n );\n }\n\n private dispatch(\n world: World,\n entityId: number,\n visit: (behaviour: Behaviour) => void,\n ): void {\n const script = world.getComponent(entityId, ScriptComponent);\n const instances = script?.scriptInstances;\n if (!instances) return;\n for (const instance of instances.values()) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n visit(instance);\n } catch (error) {\n console.error(\"[XRInteractionSystem] Behaviour hook failed:\", error);\n }\n }\n }\n\n /** Entity currently under a pointer this frame, or null. */\n getHoveredEntityId(): number | null {\n return this.hoveredEntityId;\n }\n\n /**\n * What this hand is pointing at, with the distance to it.\n *\n * The distance is what lets the pointer ray stop at the surface instead of\n * passing through the object.\n */\n getHoverFor(\n handedness: XrInputState[\"handedness\"],\n ): { entityId: number; distance: number } | null {\n for (const [input, hover] of this.hovers) {\n if (input.handedness === handedness) return hover;\n }\n return null;\n }\n\n /** Every entity under a pointer this frame — drives hover feedback. */\n getHoveredEntityIds(): Set<number> {\n const ids = new Set<number>();\n for (const hover of this.hovers.values()) ids.add(hover.entityId);\n return ids;\n }\n\n /** Entities currently held, so hover feedback can skip them. */\n getHeldEntityIds(): Set<number> {\n const ids = new Set<number>();\n for (const record of this.grabs.values()) ids.add(record.entityId);\n return ids;\n }\n\n /** True when any source is holding something. */\n isGrabbing(): boolean {\n return this.grabs.size > 0;\n }\n\n /**\n * Whether this input's primary action is committed to interaction.\n *\n * True while the source holds something, and also while it merely HOVERS a\n * grabbable — because the pinch that is about to grab must not be read as a\n * teleport by the locomotion system. Without the hover half, the first pinch\n * of a grab teleports the player, and so does the pinch that takes an object\n * from the other hand.\n *\n * Keyed on the INPUT SOURCE rather than handedness. Vision Pro reports\n * `handedness: \"none\"` for every gaze-pinch (it is hard-coded in WebKit), so a\n * handedness-keyed check silently never matched there and each pinch both\n * grabbed and teleported.\n */\n isSourceBusy(world: World, input: XrInputState): boolean {\n if (this.grabs.has(input)) return true;\n\n const hover = this.hovers.get(input);\n if (!hover) return false;\n\n const interactable = world.getComponent(\n hover.entityId,\n XRInteractableComponent,\n );\n return Boolean(interactable?.enabled && interactable.grabbable);\n }\n\n /** True when THIS hand is holding something. */\n isGrabbingWith(handedness: XrInputState[\"handedness\"]): boolean {\n for (const input of this.grabs.keys()) {\n if (input.handedness === handedness) return true;\n }\n return false;\n }\n\n /**\n * How an entity is currently held.\n *\n * Exposed for scripts: a Behaviour can poll this in `onUpdate` to drive\n * two-hand-specific behaviour — showing a bipod when both hands are on a\n * weapon, reading the live hand separation to gate a gesture, or reacting to\n * the scale a pull-apart produced. Returns null when nothing holds it.\n */\n getGrabInfo(entityId: number): {\n hands: number;\n primaryHandedness: XrInputState[\"handedness\"] | null;\n secondaryHandedness: XrInputState[\"handedness\"] | null;\n /** Metres between the hands, or null unless two hands are on it. */\n handSeparation: number | null;\n /** The attach point ids in use, in holder order. */\n attachPointIds: Array<string | null>;\n } | null {\n const holders = this.holdersOf(entityId);\n if (holders.length === 0) return null;\n\n const primary = holders.find((h) => h.record.role === \"primary\");\n const secondary = holders.find((h) => h.record.role === \"secondary\");\n\n return {\n hands: holders.length,\n primaryHandedness: primary?.input.handedness ?? null,\n secondaryHandedness: secondary?.input.handedness ?? null,\n handSeparation:\n primary && secondary\n ? this.handPosition(primary.input).distanceTo(\n this.handPosition(secondary.input),\n )\n : null,\n attachPointIds: holders.map((h) => h.record.attachPointId),\n };\n }\n}\n","import * as THREE from \"three\";\n\n/**\n * Projectile-arc sampling for teleport aiming.\n *\n * A straight ray makes distance impossible to judge in VR — it gives the eye no\n * cue about where it meets the floor, so users consistently over- or\n * under-shoot. A ballistic arc reads as a thrown object: the apex and the\n * downward approach tell you exactly where it lands. Every mature VR locomotion\n * implementation uses one.\n *\n * Pure and side-effect free so the curve can be unit-tested without a headset.\n */\n\n/** Downward acceleration applied to the aim curve, m/s². */\nexport const ARC_GRAVITY = 9.8;\n/** Launch speed of the virtual projectile, m/s. Tuned for ~5-8m reach. */\nexport const ARC_SPEED = 7;\n/** Samples along the curve. Enough to look smooth without wasting raycasts. */\nexport const ARC_STEPS = 24;\n/** Seconds of flight to simulate before giving up on finding ground. */\nexport const ARC_MAX_TIME = 2;\n\n/**\n * Sample a ballistic curve starting at `origin` heading along `direction`.\n *\n * Returns points in world space, oldest first. The caller raycasts consecutive\n * pairs to find where the arc meets a teleport surface — sampling and\n * intersection are kept separate so this stays testable.\n */\nexport function sampleTeleportArc(\n origin: THREE.Vector3,\n direction: THREE.Vector3,\n out: THREE.Vector3[] = [],\n options?: { speed?: number; gravity?: number; steps?: number; maxTime?: number },\n): THREE.Vector3[] {\n const speed = options?.speed ?? ARC_SPEED;\n const gravity = options?.gravity ?? ARC_GRAVITY;\n const steps = Math.max(2, options?.steps ?? ARC_STEPS);\n const maxTime = options?.maxTime ?? ARC_MAX_TIME;\n\n // Reuse the caller's array so aiming every frame doesn't churn the heap.\n out.length = 0;\n\n const velocity = direction.clone().normalize().multiplyScalar(speed);\n for (let i = 0; i < steps; i += 1) {\n const t = (i / (steps - 1)) * maxTime;\n out.push(\n new THREE.Vector3(\n origin.x + velocity.x * t,\n origin.y + velocity.y * t - 0.5 * gravity * t * t,\n origin.z + velocity.z * t,\n ),\n );\n }\n return out;\n}\n\n/**\n * Where a sampled arc first crosses `groundY` going downward, or null.\n *\n * Used as a cheap pre-check before raycasting: if the curve never descends to\n * the floor plane there is nothing to hit, so we can skip the per-segment\n * intersection work entirely.\n */\nexport function arcGroundCrossing(\n points: THREE.Vector3[],\n groundY: number,\n): THREE.Vector3 | null {\n for (let i = 1; i < points.length; i += 1) {\n const previous = points[i - 1];\n const current = points[i];\n if (previous.y >= groundY && current.y <= groundY) {\n const span = previous.y - current.y;\n // Guard the degenerate flat segment so we never divide by ~0.\n const alpha = span > 1e-6 ? (previous.y - groundY) / span : 0;\n return new THREE.Vector3().lerpVectors(previous, current, alpha);\n }\n }\n return null;\n}\n","/**\n * Decides when a teleport may actually commit.\n *\n * Teleport commits on RELEASE so the user can cancel by aiming away — the\n * standard interaction. The trap is that a release edge alone is not evidence\n * of intent: on hand tracking the SAME pinch drives grabbing, so the release\n * that drops an object looks identical to the release that ends a teleport aim.\n * Without this gate, letting go of a grabbed object teleports the player\n * whenever the arc happens to land somewhere valid — and passing an object\n * between hands does it too.\n *\n * The rule is simply: a release only commits if this source engaged an aim\n * first, and going busy (grabbing) discards any aim it had engaged.\n *\n * Keyed per input source so the two hands are independent.\n */\nexport class TeleportAimGate {\n private readonly aiming = new WeakSet<object>();\n\n /**\n * Feed one frame for one source.\n *\n * @returns whether the teleport should commit this frame.\n */\n update(source: object, aiming: boolean, releasing: boolean): boolean {\n const hadAim = this.aiming.has(source);\n if (aiming) this.aiming.add(source);\n\n if (!releasing) return false;\n\n this.aiming.delete(source);\n // `aiming` counts on the release frame too. A Vision Pro gaze-pinch is a\n // quick tap whose start and end can land in the SAME animation frame, and\n // requiring the aim to be strictly earlier made that gesture unable to\n // teleport at all. A grab release still cannot commit, because by then the\n // pinch is over — `aiming` is false and any earlier aim was cancelled when\n // the hand went busy.\n return hadAim || aiming;\n }\n\n /** True if this source currently has an aim engaged. */\n isAiming(source: object): boolean {\n return this.aiming.has(source);\n }\n\n /**\n * Drop a source's aim without committing.\n *\n * Called when a hand starts interacting, so the release that ends the grab\n * cannot cash in an aim engaged before it.\n *\n * @returns whether an aim was actually discarded.\n */\n cancel(source: object): boolean {\n return this.aiming.delete(source);\n }\n}\n","import * as THREE from \"three\";\nimport { CameraComponent } from \"../components/Camera\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { ParentId } from \"../components/ParentId\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { VRTeleportAreaComponent } from \"../components/VRTeleportArea\";\nimport { XRRigComponent } from \"../components/XRRig\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport { sampleTeleportArc } from \"../xr/teleportArc\";\nimport type { XrInputState } from \"../xr/types\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\nimport { TeleportAimGate } from \"../xr/teleportAimGate\";\nimport type { XRInteractionSystem } from \"./XRInteractionSystem\";\n\n/**\n * Moves the player through the scene.\n *\n * Writes to the RIG's `TransformComponent`, never the camera's: three composes\n * the render camera as `rig.matrixWorld × headPose`, so the rig is the only\n * movable handle. (`TransformSyncSystem` deliberately skips the XR camera for\n * the same reason — see `World.isXrPresenting`.)\n *\n * Teleport aims along a ballistic ARC rather than a straight ray, because a\n * straight line gives the eye no cue about where it meets the floor. The arc is\n * raycast segment-by-segment against {@link VRTeleportAreaComponent} surfaces,\n * so destinations remain an explicit allow-list.\n */\n\nconst UP = new THREE.Vector3(0, 1, 0);\n/** Deadzone below which stick noise is ignored. */\nconst AXIS_DEADZONE = 0.5;\n\nexport class XRLocomotionSystem implements EcsSystem {\n private readonly inputSystem: XRInputSystem;\n private readonly raycaster = new THREE.Raycaster();\n /** Per-source latch so one stick push yields exactly one snap turn. */\n private readonly turnLatched = new WeakSet<object>();\n /** Reused arc buffer — aiming runs every frame. */\n private readonly arcPoints: THREE.Vector3[] = [];\n /** Curve up to the landing point, for the visual system. Empty when not aiming. */\n private aimCurve: THREE.Vector3[] = [];\n private landingPoint: THREE.Vector3 | null = null;\n /** True when the current aim lands somewhere the player may actually stand. */\n private aimValid = false;\n /** Sources currently aiming via thumbstick (hysteresis, so it doesn't chatter). */\n private readonly stickAiming = new WeakSet<object>();\n /** One-time warning when a committed teleport found nowhere to land. */\n private warnedNoLanding = false;\n /** Gates teleport commits on a prior aim. See {@link TeleportAimGate}. */\n private readonly teleportAim = new TeleportAimGate();\n /** True once we've tried to self-heal camera parenting for this session. */\n private parentingChecked = false;\n\n /**\n * Optional; when wired, hands busy grabbing are excluded from teleport.\n *\n * On hand tracking the SAME pinch drives both grabbing and teleport aiming,\n * so without this a user who picks something up is teleported at the same\n * moment.\n */\n private interactionSystem: XRInteractionSystem | null = null;\n\n /** Wire the interaction system so grabs suppress teleport on that hand. */\n setInteractionSystem(interactionSystem: XRInteractionSystem | null): void {\n this.interactionSystem = interactionSystem;\n }\n\n constructor(inputSystem: XRInputSystem) {\n this.inputSystem = inputSystem;\n }\n\n update(world: World, deltaTime: number): void {\n this.aimCurve = [];\n this.landingPoint = null;\n this.aimValid = false;\n\n if (!world.isXrPresenting()) {\n this.parentingChecked = false;\n return;\n }\n\n if (!this.parentingChecked) {\n this.parentingChecked = true;\n this.ensureCameraUnderRig(world);\n this.warnOnIncompleteSetup(world);\n }\n\n const rigEntityId = world.query(XRRigComponent, TransformComponent)[0];\n if (typeof rigEntityId !== \"number\") return;\n\n const rig = world.getComponent(rigEntityId, XRRigComponent);\n const rigTransform = world.getComponent(rigEntityId, TransformComponent);\n if (!rig || !rigTransform) return;\n\n const inputs = this.inputSystem.getInputs();\n if (inputs.length === 0) return;\n\n if (rig.snapTurn) {\n this.applySnapTurn(rig, rigTransform, inputs);\n }\n\n if (rig.locomotion === \"teleport\") {\n this.applyTeleport(world, rigTransform, inputs);\n } else if (rig.locomotion === \"smooth\") {\n this.applySmoothMove(world, rig, rigTransform, inputs, deltaTime);\n }\n }\n\n /**\n * Name what is missing, once per session.\n *\n * Inside a headset there is no console and no inspector, so a scene that\n * simply cannot move gives the author nothing to go on. These messages are\n * visible over remote debugging and say exactly which entity to add.\n */\n private warnOnIncompleteSetup(world: World): void {\n if (typeof world.query(XRRigComponent)[0] !== \"number\") {\n console.warn(\n \"[XRLocomotion] No XR Rig in this scene — the player cannot move. \" +\n \"Add one via Add Object → VR → XR Rig (the scene camera is parented to it automatically).\",\n );\n return;\n }\n if (world.query(VRTeleportAreaComponent).length === 0) {\n console.warn(\n \"[XRLocomotion] No Teleport Area in this scene — teleport has nowhere to land. \" +\n \"Add one via Add Object → VR → Teleport Area, or add a Teleport Area component to an existing floor.\",\n );\n }\n }\n\n /**\n * Guarantee the render camera is a CHILD of the rig.\n *\n * Locomotion moves the rig, and three composes the head pose against\n * `camera.parent` — so if the camera sits at the scene root instead, moving\n * the rig does nothing at all and the player is frozen in place. Scenes\n * authored before the rig existed (or with the camera re-parented by hand)\n * would otherwise silently fail to move, which is exactly the symptom that is\n * hardest to diagnose from inside a headset. Repairing it via `ParentId` lets\n * `ObjectManagementSystem` reconcile the scene graph normally.\n */\n private ensureCameraUnderRig(world: World): void {\n const rigEntityId = world.query(XRRigComponent)[0];\n if (typeof rigEntityId !== \"number\") return;\n\n const activeCamera = world.getCamera();\n for (const entityId of world.query(CameraComponent, Object3DRef)) {\n if (world.getComponent(entityId, Object3DRef)?.object !== activeCamera) {\n continue;\n }\n\n const parent = world.getComponent(entityId, ParentId);\n if (parent) {\n if (parent.value !== rigEntityId) parent.value = rigEntityId;\n } else {\n world.addComponent(entityId, new ParentId(rigEntityId));\n }\n return;\n }\n }\n\n /**\n * Snap turning, not smooth turning — rotating the view continuously is the\n * single biggest cause of VR nausea, so the comfort-safe option is what's\n * wired to the stick.\n */\n private applySnapTurn(\n rig: XRRigComponent,\n transform: TransformComponent,\n inputs: XrInputState[],\n ): void {\n for (const input of inputs) {\n if (!input.hasAxes || input.axes.length < 3) continue;\n // WebXR standard mapping: axes[2] is thumbstick X.\n const x = input.axes[2] ?? 0;\n const source = input as unknown as object;\n\n if (Math.abs(x) < AXIS_DEADZONE) {\n this.turnLatched.delete(source);\n continue;\n }\n if (this.turnLatched.has(source)) continue;\n\n this.turnLatched.add(source);\n transform.rotation.y -= Math.sign(x) * THREE.MathUtils.degToRad(rig.snapTurnDegrees);\n }\n }\n\n private applySmoothMove(\n world: World,\n rig: XRRigComponent,\n transform: TransformComponent,\n inputs: XrInputState[],\n deltaTime: number,\n ): void {\n for (const input of inputs) {\n if (!input.hasAxes || input.axes.length < 2) continue;\n const x = input.axes[0] ?? 0;\n const y = input.axes[1] ?? 0;\n if (Math.abs(x) < 0.15 && Math.abs(y) < 0.15) continue;\n\n // Move relative to where the user is LOOKING, which is what players\n // expect, rather than relative to the rig's own yaw.\n const camera = world.getCamera();\n const forward = new THREE.Vector3();\n camera.getWorldDirection(forward);\n forward.y = 0;\n if (forward.lengthSq() < 1e-6) continue;\n forward.normalize();\n\n const right = new THREE.Vector3().crossVectors(forward, UP).normalize();\n const step = rig.moveSpeed * Math.max(0, deltaTime);\n\n transform.position.x += (forward.x * -y + right.x * x) * step;\n transform.position.z += (forward.z * -y + right.z * x) * step;\n }\n }\n\n private applyTeleport(\n world: World,\n transform: TransformComponent,\n inputs: XrInputState[],\n ): void {\n const targets = this.collectTeleportTargets(world);\n // NOTE: deliberately NOT early-returning on an empty target list. A scene\n // with no teleport area is the most common setup mistake, and bailing here\n // would show nothing at all — indistinguishable from broken input. Falling\n // through renders an invalid arc instead, which points straight at the fix.\n\n for (const input of inputs) {\n // A hand that is grabbing — or about to — owns its own pinch. Reading it\n // as teleport too would move the player every time they pick something\n // up, or pass an object from one hand to the other.\n const source = input as unknown as object;\n\n // Per SOURCE, not per handedness: Vision Pro reports `handedness: \"none\"`\n // for every gaze-pinch, so a handedness-keyed check never matched and each\n // pinch both grabbed and teleported.\n if (this.interactionSystem?.isSourceBusy(world, input)) {\n // Forget any aim this hand had engaged before it went to grab, so the\n // eventual release of that grab cannot commit a stale teleport.\n if (this.teleportAim.cancel(source)) {\n this.aimCurve = [];\n this.landingPoint = null;\n this.aimValid = false;\n }\n continue;\n }\n\n const stick = this.readStickAim(input, source);\n\n // Aim on either the primary action (trigger / pinch / gaze-pinch) or a\n // forward push on the thumbstick. Quest and Pico users reach for the\n // stick by convention, so supporting only the trigger reads as \"teleport\n // is broken\" on the very devices most likely to be tested first.\n // `selectStart` counts as aiming even when `select` was already cleared\n // by a same-frame `selectend` — a Vision Pro tap can do exactly that.\n const aiming = input.select || input.selectStart || stick.aiming;\n\n // A transient source — Vision Pro's gaze-pinch — is DESTROYED at the end\n // of the gesture, and its `selectend` has to be latched from a source that\n // has already left `session.inputSources`. Treating the disappearance of a\n // source that WAS aiming as a release as well means the teleport still\n // commits even if that edge is missed, which is exactly the failure where\n // the arc appears but releasing does nothing. Held controllers stay\n // connected, so this never fires on Quest.\n const vanished = !input.connected && this.teleportAim.isAiming(source);\n const releasing = input.selectEnd || stick.released || vanished;\n\n // Only a release that FOLLOWS an aim may teleport. Without this, any\n // stray release — most importantly the one that ends a grab — commits a\n // teleport as long as the arc happens to land somewhere valid.\n const commit = this.teleportAim.update(source, aiming, releasing);\n\n if (!aiming && !commit) continue;\n\n const points = sampleTeleportArc(\n input.rayOrigin,\n input.rayDirection,\n this.arcPoints,\n );\n const hit = this.raycastArc(points, targets);\n\n // Always publish the curve while aiming, even when it lands nowhere\n // valid. Hiding it entirely leaves the user unable to tell a missing\n // teleport area from broken input — showing an INVALID arc makes the\n // scene-setup problem obvious instead of silent.\n this.aimCurve = hit\n ? points.slice(0, hit.segmentIndex + 1).concat(hit.point)\n : points.slice();\n this.landingPoint = hit ? hit.point : null;\n this.aimValid = hit !== null;\n\n // Commit on RELEASE so the user can cancel by aiming away — the standard\n // teleport interaction.\n if (commit && hit) {\n transform.position.x = hit.point.x;\n transform.position.y = hit.point.y;\n transform.position.z = hit.point.z;\n this.aimCurve = [];\n this.landingPoint = null;\n this.aimValid = false;\n } else if (commit) {\n // Released with a real aim, but the arc landed on nothing teleportable.\n // Saying so separates a scene-setup problem (no Teleport Area under the\n // arc) from an input problem, which are indistinguishable on a headset.\n if (!this.warnedNoLanding) {\n this.warnedNoLanding = true;\n console.warn(\n \"[XRLocomotionSystem] Teleport released but the arc did not land on a Teleport Area. \" +\n \"Add a teleportArea entity where the player should be able to go.\",\n );\n }\n this.aimCurve = [];\n this.aimValid = false;\n }\n }\n }\n\n /**\n * Thumbstick-forward aiming with hysteresis.\n *\n * Engaging at 0.6 and releasing at 0.3 stops a stick resting near the\n * threshold from flickering the arc on and off — and the release edge is what\n * commits the teleport, so chatter there would teleport the player randomly.\n */\n private readStickAim(\n input: XrInputState,\n source: object,\n ): { aiming: boolean; released: boolean } {\n if (!input.hasAxes || input.axes.length < 4) {\n return { aiming: false, released: false };\n }\n // xr-standard mapping: axes[3] is thumbstick Y, negative = pushed forward.\n const forward = -(input.axes[3] ?? 0);\n const wasAiming = this.stickAiming.has(source);\n\n if (!wasAiming && forward > 0.6) {\n this.stickAiming.add(source);\n return { aiming: true, released: false };\n }\n if (wasAiming && forward < 0.3) {\n this.stickAiming.delete(source);\n return { aiming: false, released: true };\n }\n return { aiming: wasAiming, released: false };\n }\n\n /** Walk the arc segment-by-segment, returning the first surface hit. */\n private raycastArc(\n points: THREE.Vector3[],\n targets: THREE.Object3D[],\n ): { point: THREE.Vector3; segmentIndex: number } | null {\n if (targets.length === 0) return null;\n for (let i = 1; i < points.length; i += 1) {\n const from = points[i - 1];\n const to = points[i];\n const delta = new THREE.Vector3().subVectors(to, from);\n const distance = delta.length();\n if (distance < 1e-6) continue;\n\n this.raycaster.set(from, delta.divideScalar(distance));\n this.raycaster.far = distance;\n const hit = this.raycaster.intersectObjects(targets, true)[0];\n if (hit) {\n return { point: hit.point.clone(), segmentIndex: i - 1 };\n }\n }\n return null;\n }\n\n private collectTeleportTargets(world: World): THREE.Object3D[] {\n const objects: THREE.Object3D[] = [];\n for (const entityId of world.query(VRTeleportAreaComponent, Object3DRef)) {\n const area = world.getComponent(entityId, VRTeleportAreaComponent);\n if (!area?.enabled) continue;\n if (!world.isEntityVisible(entityId)) continue;\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) objects.push(object);\n }\n return objects;\n }\n\n /** Arc points up to the landing spot this frame; empty when not aiming. */\n getAimCurve(): THREE.Vector3[] {\n return this.aimCurve;\n }\n\n /** True when the aim lands on a valid teleport area. */\n isAimValid(): boolean {\n return this.aimValid;\n }\n\n /** Where the arc currently lands, or null when not aiming at a valid area. */\n getLandingPoint(): THREE.Vector3 | null {\n return this.landingPoint;\n }\n}\n","import type * as THREE from \"three\";\nimport type { XrHandJoints } from \"./handPose\";\n\n/**\n * Shared vocabulary for the WebXR layer.\n *\n * The single most important design constraint here: **the three target\n * platforms expose fundamentally different input models**, and a runtime that\n * hard-codes one of them silently excludes the others.\n *\n * - Meta Quest / Pico → motion controllers (trigger, grip, thumbstick) and,\n * optionally, tracked hands.\n * - Android XR → tracked hands are the PRIMARY input.\n * - Apple Vision Pro → no controllers at all. Input arrives as\n * `transient-pointer` sources that exist ONLY for the duration of a\n * gaze-and-pinch, appearing on pinch-start and disappearing on release.\n *\n * {@link XrInputState} normalizes all three into one shape so gameplay code and\n * Behaviours are written once. Anything platform-specific is expressed as a\n * capability (`kind`, `hasAxes`) rather than a branch on device name — we never\n * sniff the user agent, per the WebXR guidance from every vendor.\n */\n\n/** Which hand an input source belongs to (`none` for gaze / single-source devices). */\nexport type XrHandedness = \"left\" | \"right\" | \"none\";\n\n/**\n * How an input source is physically driven.\n *\n * `transient-pointer` is the Vision Pro case: the source is EPHEMERAL — it is\n * created when the user pinches and destroyed when they release, so it must\n * never be cached across frames by identity.\n */\nexport type XrInputKind = \"controller\" | \"hand\" | \"transient-pointer\" | \"gaze\";\n\n/**\n * One frame of normalized input for a single source.\n *\n * Boolean actions follow the same pending→latched contract as the desktop\n * `InputSystem`: `select` is the held state, while `selectStart` / `selectEnd`\n * are true for exactly one frame. This lets Behaviours poll (`if (select)`) or\n * edge-detect (`if (selectStart)`) without subscribing to events.\n */\nexport type XrInputState = {\n handedness: XrHandedness;\n kind: XrInputKind;\n /** False once the source disconnects (a released pinch on Vision Pro). */\n connected: boolean;\n /** Pointing ray in WORLD space, from the source's `targetRaySpace`. */\n rayOrigin: THREE.Vector3;\n rayDirection: THREE.Vector3;\n /** Physical grip pose. Null for gaze and transient-pointer, which have no grip. */\n gripPosition: THREE.Vector3 | null;\n gripQuaternion: THREE.Quaternion | null;\n /** Primary action: controller trigger, hand pinch, or Vision Pro gaze-pinch. */\n select: boolean;\n selectStart: boolean;\n selectEnd: boolean;\n /** Secondary action: controller grip squeeze. Never fires for hands/gaze. */\n squeeze: boolean;\n squeezeStart: boolean;\n squeezeEnd: boolean;\n /** Thumbstick / trackpad axes in [-1, 1]. Empty when {@link hasAxes} is false. */\n axes: number[];\n /** True only for sources with a physical stick — gates stick-driven locomotion. */\n hasAxes: boolean;\n /** Raw gamepad button pressed-states, when the source exposes a gamepad. */\n buttons: boolean[];\n\n /**\n * Tracked hand joint positions, world space, or null for controllers.\n *\n * Positions only — pose matching is position-based so it works identically\n * against WebXR, a simulator, or a recorded hand.\n */\n joints: XrHandJoints | null;\n};\n\n/**\n * What the ACTIVE session actually granted us.\n *\n * Always derived from `XRSession.enabledFeatures` — never from the device name.\n * A feature being requested is not a promise it was granted, and support varies\n * sharply per platform (e.g. Vision Pro grants no `immersive-ar` at all today).\n */\nexport type XrCapabilities = {\n /** The session's mode. `immersive-ar` implies passthrough / mixed reality. */\n mode: \"immersive-vr\" | \"immersive-ar\" | \"inline\";\n /** Tracked-hand joint data is available. */\n handTracking: boolean;\n /** Real-world plane detection (incubating; effectively Quest-only today). */\n planeDetection: boolean;\n /** Real-world mesh detection (draft spec; Quest-only today). */\n meshDetection: boolean;\n /** Per-frame depth buffer (Android XR stereo, Quest experimental). */\n depthSensing: boolean;\n /** Spatial anchors. */\n anchors: boolean;\n /** Ray-against-real-world hit testing. */\n hitTest: boolean;\n /** Everything the UA reported, verbatim, for diagnostics. */\n enabledFeatures: string[];\n};\n\n/** Capabilities for \"no session running\" — every feature off. */\nexport const NO_XR_CAPABILITIES: XrCapabilities = {\n mode: \"inline\",\n handTracking: false,\n planeDetection: false,\n meshDetection: false,\n depthSensing: false,\n anchors: false,\n hitTest: false,\n enabledFeatures: [],\n};\n\n/**\n * Read granted features off a live session.\n *\n * `enabledFeatures` is optional in the spec and missing on some UAs; when it is\n * absent we report nothing as granted rather than optimistically assuming\n * support, so callers degrade instead of calling an API that will throw.\n */\nexport function readXrCapabilities(\n session: XRSession | null,\n mode: XrCapabilities[\"mode\"] = \"immersive-vr\",\n): XrCapabilities {\n if (!session) return NO_XR_CAPABILITIES;\n\n const raw = (session as { enabledFeatures?: readonly string[] })\n .enabledFeatures;\n const features = Array.isArray(raw) ? Array.from(raw) : [];\n const has = (name: string) => features.includes(name);\n\n return {\n mode,\n handTracking: has(\"hand-tracking\"),\n planeDetection: has(\"plane-detection\"),\n meshDetection: has(\"mesh-detection\"),\n depthSensing: has(\"depth-sensing\"),\n anchors: has(\"anchors\"),\n hitTest: has(\"hit-test\"),\n enabledFeatures: features,\n };\n}\n","import { Behaviour } from \"../Behaviour\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { XRRigComponent } from \"../components/XRRig\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport {\n NO_XR_CAPABILITIES,\n readXrCapabilities,\n type XrCapabilities,\n type XrInputState,\n} from \"../xr/types\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\n\n/**\n * Owns the immersive-session lifecycle and fans XR events out to Behaviours.\n *\n * Detects session start/end by polling `renderer.xr.isPresenting` rather than\n * binding to `sessionstart`/`sessionend`: the session may already be running\n * before this system is registered (the consumer owns the entry button), and\n * polling a boolean makes the system correct regardless of construction order.\n *\n * Hook dispatch mirrors `ImageTargetAnchorSystem`'s AR precedent — walk live\n * `ScriptComponent.scriptInstances` and call the public no-op hook — so XR and\n * AR extend `Behaviour` the same way.\n */\nexport class XRSessionSystem implements EcsSystem {\n private presenting = false;\n private capabilities: XrCapabilities = NO_XR_CAPABILITIES;\n private readonly inputSystem: XRInputSystem | null;\n /** Y compensation applied when a floor-relative space was requested but not granted. */\n private appliedOriginOffset = 0;\n\n constructor(inputSystem?: XRInputSystem) {\n this.inputSystem = inputSystem ?? null;\n }\n\n update(world: World): void {\n const presenting = world.isXrPresenting();\n\n if (presenting !== this.presenting) {\n this.presenting = presenting;\n if (presenting) {\n this.handleSessionStart(world);\n } else {\n this.handleSessionEnd(world);\n }\n }\n\n if (presenting) {\n this.dispatchInputEdges(world);\n }\n }\n\n private handleSessionStart(world: World): void {\n const session = world.getRenderer().xr.getSession();\n // `immersive-ar` means passthrough; the session's own mode is the only\n // reliable signal, since a device can support both.\n const mode =\n session && (session as { environmentBlendMode?: string })\n .environmentBlendMode !== \"opaque\"\n ? \"immersive-ar\"\n : \"immersive-vr\";\n this.capabilities = readXrCapabilities(session ?? null, mode);\n\n if (session && this.inputSystem) {\n this.inputSystem.attachSession(session);\n }\n\n this.applyTrackingOrigin(world, session ?? null);\n\n this.forEachBehaviour(world, (behaviour) => {\n behaviour.onXRSessionStart(this.capabilities);\n });\n }\n\n /**\n * Apply the rig's authored tracking origin, and compensate when the device\n * cannot honour it.\n *\n * `floor` (`local-floor`) puts Y=0 on the user's real floor, which is what a\n * scene authored standing on the ground expects. `eye` (`local`) puts Y=0 at\n * the headset, for seated experiences.\n *\n * The compensation matters: `local-floor` is only ever REQUESTED as an\n * optional feature (requiring it would make `requestSession` reject outright\n * on devices that lack it). When it isn't granted, the runtime silently falls\n * back to `local` — the origin jumps to head height and a floor-authored\n * scene swallows the user, which is exactly the \"I'm standing under the\n * building\" symptom. Offsetting the rig down by the eye height restores the\n * intended floor relationship instead of leaving it broken.\n */\n private applyTrackingOrigin(world: World, session: XRSession | null): void {\n const rigEntityId = world.query(XRRigComponent, TransformComponent)[0];\n if (typeof rigEntityId !== \"number\") return;\n\n const rig = world.getComponent(rigEntityId, XRRigComponent);\n const transform = world.getComponent(rigEntityId, TransformComponent);\n if (!rig || !transform) return;\n\n const renderer = world.getRenderer();\n const wantsFloor = rig.trackingOrigin === \"floor\";\n\n try {\n renderer.xr.setReferenceSpaceType(wantsFloor ? \"local-floor\" : \"local\");\n } catch {\n // Older/limited UAs — fall through to the offset compensation below.\n }\n\n // `enabledFeatures` is the only trustworthy signal that a floor-relative\n // space was actually granted; never infer it from the device name.\n const granted = (session as { enabledFeatures?: readonly string[] } | null)\n ?.enabledFeatures;\n const floorGranted = Array.isArray(granted)\n ? granted.includes(\"local-floor\")\n : // No report at all: trust the request, since a wrong offset is worse\n // than none on devices that did honour it.\n true;\n\n this.appliedOriginOffset =\n wantsFloor && !floorGranted ? rig.fallbackEyeHeight : 0;\n\n if (this.appliedOriginOffset !== 0) {\n transform.position.y -= this.appliedOriginOffset;\n }\n }\n\n private handleSessionEnd(world: World): void {\n // Restore the authored rig height — the offset is a session-time\n // compensation, not a scene edit.\n if (this.appliedOriginOffset !== 0) {\n const rigEntityId = world.query(XRRigComponent, TransformComponent)[0];\n if (typeof rigEntityId === \"number\") {\n const transform = world.getComponent(rigEntityId, TransformComponent);\n if (transform) transform.position.y += this.appliedOriginOffset;\n }\n this.appliedOriginOffset = 0;\n }\n\n this.capabilities = NO_XR_CAPABILITIES;\n this.inputSystem?.detachSession();\n this.forEachBehaviour(world, (behaviour) => {\n behaviour.onXRSessionEnd();\n });\n }\n\n /**\n * Relay this frame's one-frame select edges. Polling the latched state (rather\n * than dispatching from the DOM event) keeps hook delivery on the ECS tick, so\n * a Behaviour's `onSelectStart` always observes the same world state its\n * `onUpdate` would.\n */\n private dispatchInputEdges(world: World): void {\n const inputs = this.inputSystem?.getInputs();\n if (!inputs || inputs.length === 0) return;\n\n for (const input of inputs) {\n if (input.selectStart) {\n this.forEachBehaviour(world, (b) => b.onSelectStart(input));\n }\n if (input.selectEnd) {\n this.forEachBehaviour(world, (b) => b.onSelectEnd(input));\n }\n }\n }\n\n private forEachBehaviour(\n world: World,\n visit: (behaviour: Behaviour) => void,\n ): void {\n for (const entityId of world.query(ScriptComponent)) {\n const script = world.getComponent(entityId, ScriptComponent);\n const instances = script?.scriptInstances;\n if (!instances) continue;\n\n for (const instance of instances.values()) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n visit(instance);\n } catch (error) {\n // One misbehaving script must never abort the dispatch loop.\n console.error(\"[XRSessionSystem] Behaviour hook failed:\", error);\n }\n }\n }\n }\n\n /** What the active session granted. `NO_XR_CAPABILITIES` when not presenting. */\n getCapabilities(): XrCapabilities {\n return this.capabilities;\n }\n\n /** True while an immersive session is presenting. */\n isPresenting(): boolean {\n return this.presenting;\n }\n\n /** Convenience passthrough so consumers need only hold this system. */\n getInputs(): XrInputState[] {\n return this.inputSystem?.getInputs() ?? [];\n }\n}\n","import * as THREE from \"three\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { VRTeleportAreaComponent } from \"../components/VRTeleportArea\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\n/**\n * Keeps a teleport area's visible mesh in step with its authored shape/size.\n *\n * Without this the geometry would be whatever the factory built at create time,\n * so switching `plane` → `circle` (or resizing) in the inspector would change\n * where the player can teleport while still DRAWING the old footprint — the\n * guide would lie about the destination.\n *\n * Rebuilds are gated on a cheap signature so an idle scene does no work, the\n * same approach `PhysicsColliderDebugSystem` uses.\n */\n\nfunction buildGeometry(\n area: VRTeleportAreaComponent,\n): THREE.BufferGeometry {\n if (area.shape === \"circle\") {\n // `width` is the DIAMETER for a circle; the mesh is a flat disc, so the\n // player teleports onto its top face.\n const radius = Math.max(0.005, area.width / 2);\n return new THREE.CircleGeometry(radius, 48);\n }\n return new THREE.PlaneGeometry(\n Math.max(0.01, area.width),\n Math.max(0.01, area.depth),\n );\n}\n\nfunction signatureOf(area: VRTeleportAreaComponent): string {\n return `${area.shape}:${area.width}:${area.depth}`;\n}\n\nexport class VRTeleportAreaSystem implements EcsSystem {\n private readonly signatures = new Map<number, string>();\n\n update(world: World): void {\n const entityIds = world.query(VRTeleportAreaComponent, Object3DRef);\n\n // Drop bookkeeping for entities that no longer exist.\n const alive = new Set(entityIds);\n for (const tracked of this.signatures.keys()) {\n if (!alive.has(tracked)) this.signatures.delete(tracked);\n }\n\n for (const entityId of entityIds) {\n const area = world.getComponent(entityId, VRTeleportAreaComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!area || !(object instanceof THREE.Mesh)) continue;\n\n const signature = signatureOf(area);\n if (this.signatures.get(entityId) === signature) continue;\n this.signatures.set(entityId, signature);\n\n // Dispose the outgoing geometry — these rebuild on every inspector edit,\n // so leaking one per keystroke would add up fast.\n object.geometry?.dispose?.();\n object.geometry = buildGeometry(area);\n }\n }\n}\n","import * as THREE from \"three\";\nimport type { XrHandPreset } from \"../components/XRInteractor\";\n\n/**\n * Materials for tracked-hand meshes.\n *\n * three's `XRHandModelFactory` builds the joint geometry but gives it a plain\n * default material, so hands look identical in every experience. These presets\n * let an author pick a look in one click, with `custom` deferring entirely to\n * the colour/opacity/emissive fields.\n */\n\nexport type HandMaterialOptions = {\n color: string;\n opacity: number;\n emissiveIntensity: number;\n};\n\n/**\n * Build the material for a preset.\n *\n * Returns a fresh material each call — hands are per-session and disposed with\n * the interactor, and sharing one instance across presets would make switching\n * leak state between them.\n */\nexport function createHandMaterial(\n preset: XrHandPreset,\n options: HandMaterialOptions,\n): THREE.Material {\n const color = new THREE.Color(options.color);\n\n switch (preset) {\n case \"ghost\":\n // Translucent and unlit so it reads as a presence rather than an object,\n // and never occludes what the user is reaching for.\n return new THREE.MeshBasicMaterial({\n color,\n transparent: true,\n opacity: Math.min(1, Math.max(0.05, options.opacity * 0.45)),\n depthWrite: false,\n side: THREE.DoubleSide,\n });\n\n case \"neon\":\n // Emissive so it glows in dark scenes without needing a light nearby.\n return new THREE.MeshStandardMaterial({\n color,\n emissive: color,\n emissiveIntensity: Math.max(0.5, options.emissiveIntensity || 2),\n roughness: 0.35,\n metalness: 0,\n transparent: options.opacity < 1,\n opacity: options.opacity,\n });\n\n case \"skeleton\":\n // Wireframe over the joint mesh — reads as a rig, and is genuinely useful\n // for debugging hand tracking.\n return new THREE.MeshBasicMaterial({\n color,\n wireframe: true,\n transparent: true,\n opacity: options.opacity,\n });\n\n case \"custom\":\n case \"default\":\n return new THREE.MeshStandardMaterial({\n color,\n roughness: 0.85,\n metalness: 0,\n emissive: color,\n emissiveIntensity: Math.max(0, options.emissiveIntensity),\n transparent: options.opacity < 1,\n opacity: options.opacity,\n side: THREE.DoubleSide,\n });\n\n default: {\n // Exhaustiveness guard — a new preset must be handled explicitly rather\n // than silently rendering as the default.\n const _never: never = preset;\n void _never;\n return new THREE.MeshStandardMaterial({ color });\n }\n }\n}\n\n/** Apply a preset material to every mesh under a hand model. */\nexport function applyHandMaterial(\n root: THREE.Object3D,\n material: THREE.Material,\n): void {\n root.traverse((child) => {\n const mesh = child as THREE.Mesh;\n if (!mesh.isMesh) return;\n // The factory's own material is replaced wholesale; disposing it here would\n // break other hands sharing the cached model.\n mesh.material = material;\n });\n}\n","import * as THREE from \"three\";\nimport { XRControllerModelFactory } from \"three/examples/jsm/webxr/XRControllerModelFactory.js\";\nimport { XRHandModelFactory } from \"three/examples/jsm/webxr/XRHandModelFactory.js\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport {\n XRInteractorComponent,\n XRInteractorSideComponent,\n} from \"../components/XRInteractor\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport { applyHandMaterial, createHandMaterial } from \"../xr/handPresets\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\nimport type { XRInteractionSystem } from \"./XRInteractionSystem\";\n\n/**\n * Renders what the user sees as their hands, driven by\n * {@link XRInteractorComponent}.\n *\n * Three presentation layers, independently controllable:\n * - **controller models** on the grip space (Quest/Pico),\n * - **tracked-hand meshes** on the hand space (Android XR, Quest hands,\n * Vision Pro), styled by the interactor's preset,\n * - **author content** — anything parented under the left/right interactor\n * entities, re-attached to the tracked spaces so custom tools and gloves\n * ride along with no scripting.\n *\n * `interactorType` gates the first two, so an author can hide the stock visuals\n * entirely and present only their own meshes.\n */\n\n/** How long the aim ray is drawn, in metres. */\nconst RAY_LENGTH = 5;\n\n/** Base cylinder radius; the authored thickness scales against this. */\nconst RAY_RADIUS = 0.003;\n/** WebXR reports the primary hands on slots 0 and 1. */\nconst SLOTS: Array<{ index: number; side: \"left\" | \"right\" }> = [\n { index: 0, side: \"left\" },\n { index: 1, side: \"right\" },\n];\n\ntype SlotVisuals = {\n controller: THREE.Object3D;\n grip: THREE.Object3D;\n hand: THREE.Object3D;\n ray: THREE.Mesh;\n controllerModel: THREE.Object3D;\n handModel: THREE.Object3D;\n /** Author content re-parented onto the grip space, if any. */\n attachedCustom: THREE.Object3D | null;\n};\n\nexport class XRControllerVisualSystem implements EcsSystem {\n private readonly controllerModelFactory = new XRControllerModelFactory();\n private readonly handModelFactory = new XRHandModelFactory();\n private readonly group = new THREE.Group();\n /** Reused so a per-frame colour compare allocates nothing. */\n private readonly rayColorScratch = new THREE.Color();\n private readonly slots = new Map<number, SlotVisuals>();\n private readonly interactionSystem: XRInteractionSystem | null;\n /** Optional — lets each visual follow the source that is ACTUALLY live. */\n private readonly inputSystem: XRInputSystem | null;\n private attachedTo: THREE.Object3D | null = null;\n /** Last applied preset signature, so materials rebuild only on real change. */\n private handStyleSignature = \"\";\n private handMaterial: THREE.Material | null = null;\n\n constructor(options?: {\n interactionSystem?: XRInteractionSystem;\n inputSystem?: XRInputSystem;\n }) {\n this.interactionSystem = options?.interactionSystem ?? null;\n this.inputSystem = options?.inputSystem ?? null;\n this.group.name = \"XRControllerVisuals\";\n // Never captured in editor screenshots or the project thumbnail.\n this.group.userData.ecsPreviewHidden = true;\n }\n\n update(world: World): void {\n const renderer = world.getRenderer();\n if (!renderer.xr?.enabled) return;\n\n this.ensureAttached(world);\n this.ensureSlots(world);\n\n const interactor = this.resolveInteractor(world);\n // No interactor entity authored — fall back to showing everything, so a\n // scene without one still has visible hands rather than nothing.\n const type = interactor?.interactorType ?? \"both\";\n const showControllers = type === \"controllers\" || type === \"both\";\n const showHands = type === \"hands\" || type === \"both\";\n\n this.syncHandMaterial(interactor);\n\n for (const { index, side } of SLOTS) {\n const visuals = this.slots.get(index);\n if (!visuals) continue;\n\n // Only show the visual whose source is actually live for this hand.\n //\n // With \"both\" selected and no controller picked up, the grip space never\n // receives a pose, so a controller model left visible sits frozen at the\n // rig origin — the phantom second pair. Picking a controller up gave it a\n // pose and \"fixed\" it, which is exactly the reported behaviour. Driving\n // visibility from the live source kind means each hand shows one thing.\n const liveKind = this.liveKindFor(side);\n const hasController = liveKind === null || liveKind === \"controller\";\n const hasHand = liveKind === null || liveKind === \"hand\";\n\n visuals.controllerModel.visible = showControllers && hasController;\n visuals.handModel.visible = showHands && hasHand;\n visuals.ray.visible = this.shouldShowRay(interactor, side);\n this.fitRayToHover(visuals.ray, side);\n this.applyRayStyle(visuals.ray, interactor);\n\n if (showHands && this.handMaterial) {\n applyHandMaterial(visuals.handModel, this.handMaterial);\n }\n\n this.syncCustomContent(world, visuals, side);\n }\n }\n\n /**\n * What kind of source is currently driving this hand, or null when we cannot\n * tell (no input system wired) — in which case callers fall back to showing\n * everything rather than hiding the user's hands entirely.\n */\n private liveKindFor(side: \"left\" | \"right\"): string | null {\n if (!this.inputSystem) return null;\n const inputs = this.inputSystem.getInputs();\n if (inputs.length === 0) return null;\n for (const input of inputs) {\n if (input.handedness === side && input.connected) return input.kind;\n }\n // A connected session with no source for this hand: show nothing for it.\n return \"none\";\n }\n\n /** The scene's interactor config, if one was authored. */\n private resolveInteractor(world: World): XRInteractorComponent | null {\n const entityId = world.query(XRInteractorComponent)[0];\n if (typeof entityId !== \"number\") return null;\n return world.getComponent(entityId, XRInteractorComponent) ?? null;\n }\n\n /**\n * Re-parent the author's left/right interactor content onto the tracked grip\n * space so it follows the hand.\n *\n * `ObjectManagementSystem` reconciles ECS objects back under their ParentId\n * every frame, so this re-attach has to be re-asserted — the same coexistence\n * dance the AR anchor system performs.\n */\n private syncCustomContent(\n world: World,\n visuals: SlotVisuals,\n side: \"left\" | \"right\",\n ): void {\n let content: THREE.Object3D | null = null;\n for (const entityId of world.query(\n XRInteractorSideComponent,\n Object3DRef,\n )) {\n const slot = world.getComponent(entityId, XRInteractorSideComponent);\n if (slot?.side !== side) continue;\n content = world.getComponent(entityId, Object3DRef)?.object ?? null;\n break;\n }\n\n if (!content) {\n visuals.attachedCustom = null;\n return;\n }\n if (content.parent !== visuals.grip) {\n visuals.grip.add(content);\n }\n visuals.attachedCustom = content;\n }\n\n /** Rebuild the hand material only when the authored style actually changes. */\n private syncHandMaterial(interactor: XRInteractorComponent | null): void {\n const preset = interactor?.handPreset ?? \"default\";\n const color = interactor?.handColor ?? \"#e8b48a\";\n const opacity = interactor?.handOpacity ?? 1;\n const emissive = interactor?.handEmissiveIntensity ?? 0;\n const signature = `${preset}:${color}:${opacity}:${emissive}`;\n if (signature === this.handStyleSignature && this.handMaterial) return;\n\n this.handStyleSignature = signature;\n this.handMaterial?.dispose();\n this.handMaterial = createHandMaterial(preset, {\n color,\n opacity,\n emissiveIntensity: emissive,\n });\n }\n\n /**\n * The ray is meaningful only when it points at something. Authors can turn it\n * off entirely; otherwise it appears on hover/grab so it isn't permanent\n * clutter implying the whole scene is clickable.\n */\n private shouldShowRay(\n interactor: XRInteractorComponent | null,\n side: \"left\" | \"right\",\n ): boolean {\n const visibility = interactor?.rayVisibility ?? \"interacting\";\n if (visibility === \"never\") return false;\n if (visibility === \"always\") return true;\n if (!this.interactionSystem) return true;\n\n // Per-HAND, not scene-wide. Reading the global hover lit up both rays as\n // soon as either hand pointed at something, so the idle hand grew a ray\n // pointing at nothing.\n //\n // Hidden once the hand actually HOLDS something: the ray has done its job\n // at that point, and leaving it on draws a line through the object the user\n // is now carrying.\n if (this.interactionSystem.isGrabbingWith(side)) return false;\n return this.interactionSystem.getHoverFor(side) !== null;\n }\n\n /** Push the author's ray colour and thickness onto the mesh. */\n private applyRayStyle(\n ray: THREE.Mesh,\n interactor: XRInteractorComponent | null,\n ): void {\n if (!interactor) return;\n\n const material = ray.material as THREE.MeshBasicMaterial;\n if (material?.color && !material.color.equals(this.rayColorScratch.set(interactor.rayColor))) {\n material.color.copy(this.rayColorScratch);\n }\n\n // Radius lives in X/Y after the geometry was rotated onto -Z, so thickness\n // and length scale independently.\n const radius = Math.max(0.0005, interactor.rayThickness / 2) / RAY_RADIUS;\n if (ray.scale.x !== radius) {\n ray.scale.x = radius;\n ray.scale.y = radius;\n }\n }\n\n /**\n * Stop the ray at whatever it is pointing at.\n *\n * A fixed-length ray drawn with depth testing off punches straight through the\n * object, so the user cannot tell where the pointer actually lands. Scaling it\n * to the hit distance turns it into a pointer that meets the surface.\n */\n private fitRayToHover(ray: THREE.Mesh, side: \"left\" | \"right\"): void {\n const hover = this.interactionSystem?.getHoverFor(side) ?? null;\n // Falls back to full length when nothing is hit, which is also what a\n // grab-in-progress wants.\n const length =\n hover && Number.isFinite(hover.distance) && hover.distance > 0\n ? Math.min(hover.distance, RAY_LENGTH)\n : RAY_LENGTH;\n // The geometry is UNIT length along -Z, so this is metres directly.\n ray.scale.z = length;\n }\n\n /** Lazily build per-slot visuals; the device reports profiles late. */\n private ensureSlots(world: World): void {\n const renderer = world.getRenderer();\n for (const { index } of SLOTS) {\n if (this.slots.has(index)) continue;\n\n const controller = renderer.xr.getController(index);\n const grip = renderer.xr.getControllerGrip(index);\n const hand = renderer.xr.getHand(index);\n if (!controller || !grip || !hand) continue;\n\n const ray = this.createRay();\n controller.add(ray);\n\n const controllerModel =\n this.controllerModelFactory.createControllerModel(grip);\n grip.add(controllerModel);\n\n const handModel = this.handModelFactory.createHandModel(hand, \"mesh\");\n hand.add(handModel);\n\n this.group.add(controller, grip, hand);\n this.slots.set(index, {\n controller,\n grip,\n hand,\n ray,\n controllerModel,\n handModel,\n attachedCustom: null,\n });\n }\n }\n\n /**\n * Parent the visuals to the XR rig when there is one, so locomotion moves the\n * hands with the player. Falls back to the scene root.\n */\n private ensureAttached(world: World): void {\n const camera = world.getCamera();\n const target = camera.parent ?? world.getScene();\n if (this.attachedTo === target) return;\n target.add(this.group);\n this.attachedTo = target;\n }\n\n /**\n * The pointer ray.\n *\n * A cylinder rather than a `THREE.Line`, because WebGL ignores `linewidth` —\n * every line renders one pixel wide regardless, which is nearly invisible on a\n * headset. A thin mesh is the only way to get a ray with real thickness\n * without pulling in a line-rendering extension.\n */\n private createRay(): THREE.Mesh {\n // Unit length along -Z, so `scale.z` is the ray's length in metres.\n const geometry = new THREE.CylinderGeometry(RAY_RADIUS, RAY_RADIUS, 1, 8, 1);\n geometry.rotateX(-Math.PI / 2);\n geometry.translate(0, 0, -0.5);\n\n const material = new THREE.MeshBasicMaterial({\n color: \"#4da3ff\",\n transparent: true,\n opacity: 0.75,\n depthTest: false,\n depthWrite: false,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = \"XRPointerRay\";\n mesh.renderOrder = 999;\n mesh.visible = false;\n // The ray must never be a grab target itself.\n mesh.raycast = () => {};\n return mesh;\n }\n\n dispose(): void {\n this.group.removeFromParent();\n this.group.traverse((child) => {\n const mesh = child as Partial<THREE.Mesh>;\n mesh.geometry?.dispose?.();\n const material = mesh.material;\n if (Array.isArray(material)) {\n for (const entry of material) entry.dispose?.();\n } else {\n material?.dispose?.();\n }\n });\n this.group.clear();\n this.slots.clear();\n this.handMaterial?.dispose();\n this.handMaterial = null;\n this.handStyleSignature = \"\";\n this.attachedTo = null;\n }\n}\n","import * as THREE from \"three\";\nimport { XRRigComponent } from \"../components/XRRig\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport type { XRLocomotionSystem } from \"./XRLocomotionSystem\";\n\n/**\n * Draws the teleport aim arc and its landing marker.\n *\n * Shown only while the user is AIMING — an always-on curve reads as clutter.\n * While aiming, the arc is always drawn: blue with a landing ring when it lands\n * on a teleport area, red and marker-less when it does not. Rendering the\n * blocked state (rather than nothing) is what distinguishes \"there is nowhere\n * to land here\" from \"teleport is broken\", which is otherwise impossible to\n * tell apart from inside a headset.\n *\n * The arc fades from opaque at the hand to transparent at the far end and the\n * marker is a soft ring plus a centre dot, so the landing spot is unambiguous\n * against a busy floor without dominating the scene.\n */\n\n/** Radius of the landing ring, in metres. */\nconst MARKER_RADIUS = 0.28;\nconst ACCENT = new THREE.Color(\"#4da3ff\");\n/** The cylinder's baked axis. */\nconst SEGMENT_AXIS = new THREE.Vector3(0, 1, 0);\n\n/**\n * How far from the head the drawn arc starts, in metres.\n *\n * Vision Pro's target ray begins between the eyes, so without this the arc is\n * drawn through the user's own view. Controllers sit further out than this, so\n * their arcs are unaffected.\n */\nconst HEAD_CLEARANCE = 0.25;\n\nexport class XRTeleportVisualSystem implements EcsSystem {\n private readonly locomotionSystem: XRLocomotionSystem;\n private readonly group = new THREE.Group();\n /** Holds the segment chain that draws the arc. */\n private readonly arc = new THREE.Group();\n /**\n * Unit cylinder along +Y, reused by every segment.\n *\n * The arc was a `THREE.Line`, which WebGL always renders one pixel wide —\n * effectively invisible on a headset, and not thickenable at all. A chain of\n * scaled cylinders gives real thickness while rebuilding no geometry: each\n * frame only moves, rotates and scales meshes that already exist.\n */\n private readonly segmentGeometry = new THREE.CylinderGeometry(1, 1, 1, 6, 1);\n private readonly segments: THREE.Mesh[] = [];\n private readonly marker = new THREE.Group();\n private attached = false;\n private readonly scratchDirection = new THREE.Vector3();\n private readonly scratchHead = new THREE.Vector3();\n private readonly validColor = new THREE.Color();\n private readonly invalidColor = new THREE.Color();\n\n constructor(locomotionSystem: XRLocomotionSystem) {\n this.locomotionSystem = locomotionSystem;\n this.group.name = \"XRTeleportVisuals\";\n // Keep it out of editor screenshots and the project thumbnail.\n this.group.userData.ecsPreviewHidden = true;\n\n this.arc.name = \"XRTeleportArc\";\n this.group.add(this.arc);\n\n this.marker.add(this.createRing(), this.createDot());\n this.marker.renderOrder = 999;\n this.group.add(this.marker);\n\n this.setVisible(false);\n }\n\n update(world: World): void {\n if (!this.attached) {\n world.getScene().add(this.group);\n this.attached = true;\n }\n\n const raw = this.locomotionSystem.getAimCurve();\n const landing = this.locomotionSystem.getLandingPoint();\n const valid = this.locomotionSystem.isAimValid();\n\n if (raw.length < 2) {\n this.setVisible(false);\n return;\n }\n\n // Drop the stretch nearest the head. Vision Pro's target ray ORIGINATES\n // between the user's eyes, so an arc drawn from its true start passes\n // straight through their face. Trimming by distance to the head rather\n // than by a fixed count leaves controller arcs — which begin at the hand,\n // already clear of the head — untouched.\n const curve = this.trimNearHead(world, raw);\n if (curve.length < 2) {\n this.setVisible(false);\n return;\n }\n\n const rig = this.resolveRig(world);\n const thickness = Math.min(\n 0.1,\n Math.max(0.001, rig?.teleportArcThickness ?? 0.012),\n );\n const tint = valid\n ? this.validColor.set(rig?.teleportArcColor ?? \"#4da3ff\")\n : this.invalidColor.set(rig?.teleportArcInvalidColor ?? \"#ff5a5a\");\n\n // Show the arc whenever the user is aiming — red when it lands nowhere\n // valid. Hiding it in that case is what makes a missing teleport area feel\n // like broken input rather than a scene-setup problem.\n this.updateArcGeometry(curve, tint, thickness);\n\n if (valid && landing) {\n // Marker follows the authored arc colour, so the two never disagree.\n this.tintMarker(tint);\n this.marker.position.copy(landing);\n // Lift fractionally off the surface so the ring never z-fights the floor.\n this.marker.position.y += 0.01;\n this.marker.visible = true;\n } else {\n this.marker.visible = false;\n }\n this.setVisible(true);\n }\n\n private updateArcGeometry(\n curve: THREE.Vector3[],\n tint: THREE.Color,\n thickness: number,\n ): void {\n const needed = curve.length - 1;\n this.ensureSegments(needed);\n\n const radius = thickness / 2;\n\n for (let i = 0; i < this.segments.length; i += 1) {\n const segment = this.segments[i];\n if (i >= needed) {\n segment.visible = false;\n continue;\n }\n\n const from = curve[i];\n const to = curve[i + 1];\n this.scratchDirection.subVectors(to, from);\n const length = this.scratchDirection.length();\n if (length < 1e-6) {\n segment.visible = false;\n continue;\n }\n\n segment.visible = true;\n segment.position.copy(from).addScaledVector(this.scratchDirection, 0.5);\n segment.quaternion.setFromUnitVectors(\n SEGMENT_AXIS,\n this.scratchDirection.divideScalar(length),\n );\n segment.scale.set(radius, length, radius);\n\n // Brightest at the hand, fading along the flight — reads as motion and\n // keeps the far end from competing with the landing marker.\n const t = needed > 1 ? i / (needed - 1) : 0;\n const fade = 1 - t * 0.75;\n (segment.material as THREE.MeshBasicMaterial).color\n .copy(tint)\n .multiplyScalar(fade);\n }\n }\n\n /** Grow the segment pool to cover the current arc. */\n private ensureSegments(count: number): void {\n while (this.segments.length < count) {\n // One material per segment so each can carry its own point on the fade;\n // they are created once and recoloured in place from then on.\n const material = new THREE.MeshBasicMaterial({\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n const mesh = new THREE.Mesh(this.segmentGeometry, material);\n mesh.frustumCulled = false;\n mesh.renderOrder = 998;\n mesh.raycast = () => {};\n this.segments.push(mesh);\n this.arc.add(mesh);\n }\n }\n\n /** Drop leading points that sit too close to the viewer's head. */\n private trimNearHead(\n world: World,\n curve: THREE.Vector3[],\n ): THREE.Vector3[] {\n world.getCamera().getWorldPosition(this.scratchHead);\n\n let start = 0;\n while (\n start < curve.length - 2 &&\n curve[start].distanceTo(this.scratchHead) < HEAD_CLEARANCE\n ) {\n start += 1;\n }\n\n return start === 0 ? curve : curve.slice(start);\n }\n\n private resolveRig(world: World): XRRigComponent | null {\n const entityId = world.query(XRRigComponent)[0];\n if (typeof entityId !== \"number\") return null;\n return world.getComponent(entityId, XRRigComponent) ?? null;\n }\n\n private createRing(): THREE.Mesh {\n const geometry = new THREE.RingGeometry(\n MARKER_RADIUS * 0.72,\n MARKER_RADIUS,\n 48,\n );\n // RingGeometry is authored in XY; lay it flat on the ground.\n geometry.rotateX(-Math.PI / 2);\n return new THREE.Mesh(\n geometry,\n new THREE.MeshBasicMaterial({\n color: ACCENT,\n transparent: true,\n opacity: 0.9,\n side: THREE.DoubleSide,\n depthTest: false,\n }),\n );\n }\n\n private createDot(): THREE.Mesh {\n const geometry = new THREE.CircleGeometry(MARKER_RADIUS * 0.16, 24);\n geometry.rotateX(-Math.PI / 2);\n return new THREE.Mesh(\n geometry,\n new THREE.MeshBasicMaterial({\n color: ACCENT,\n transparent: true,\n opacity: 0.55,\n side: THREE.DoubleSide,\n depthTest: false,\n }),\n );\n }\n\n /** Recolour the landing marker to match the arc. */\n private tintMarker(color: THREE.Color): void {\n this.marker.traverse((child) => {\n const material = (child as Partial<THREE.Mesh>).material;\n if (material && !Array.isArray(material)) {\n (material as THREE.MeshBasicMaterial).color?.copy(color);\n }\n });\n }\n\n private setVisible(visible: boolean): void {\n this.group.visible = visible;\n }\n\n dispose(): void {\n this.group.removeFromParent();\n this.group.traverse((child) => {\n const mesh = child as Partial<THREE.Mesh>;\n mesh.geometry?.dispose?.();\n const material = mesh.material;\n if (Array.isArray(material)) {\n for (const entry of material) entry.dispose?.();\n } else {\n material?.dispose?.();\n }\n });\n this.attached = false;\n }\n}\n","import * as THREE from \"three\";\n\n/**\n * Hand pose metrics and matching.\n *\n * The problem this solves: a raw hand is 25 joint positions, and no two users'\n * hands are the same size. Comparing joint positions directly would mean a pose\n * authored by an adult never matches a child. So we reduce the hand to a handful\n * of SCALE-INVARIANT scalars — how curled each finger is, how spread, how close\n * the tips are to the thumb — and match against those.\n *\n * Two conventions borrowed from the mature toolkits, both load-bearing:\n *\n * 1. Every distance threshold is expressed as a RATIO OF PALM WIDTH, never in\n * metres. This is what makes a pose authored once work for every hand.\n * 2. Curl is split into BASE (knuckle) and TIP (outer joints). A single curl\n * number cannot tell a hook (base straight, tip curled) from a fist (both\n * curled) from a flat bent hand (base curled, tip straight).\n *\n * Everything here is pure and position-only — no quaternions, no WebXR types —\n * so poses can be unit-tested without a headset and fed from any joint source.\n */\n\n/** The 25 joints of the WebXR hand skeleton. */\nexport type XrHandJointName =\n | \"wrist\"\n | \"thumb-metacarpal\"\n | \"thumb-phalanx-proximal\"\n | \"thumb-phalanx-distal\"\n | \"thumb-tip\"\n | \"index-finger-metacarpal\"\n | \"index-finger-phalanx-proximal\"\n | \"index-finger-phalanx-intermediate\"\n | \"index-finger-phalanx-distal\"\n | \"index-finger-tip\"\n | \"middle-finger-metacarpal\"\n | \"middle-finger-phalanx-proximal\"\n | \"middle-finger-phalanx-intermediate\"\n | \"middle-finger-phalanx-distal\"\n | \"middle-finger-tip\"\n | \"ring-finger-metacarpal\"\n | \"ring-finger-phalanx-proximal\"\n | \"ring-finger-phalanx-intermediate\"\n | \"ring-finger-phalanx-distal\"\n | \"ring-finger-tip\"\n | \"pinky-finger-metacarpal\"\n | \"pinky-finger-phalanx-proximal\"\n | \"pinky-finger-phalanx-intermediate\"\n | \"pinky-finger-phalanx-distal\"\n | \"pinky-finger-tip\";\n\nexport type XrFinger = \"thumb\" | \"index\" | \"middle\" | \"ring\" | \"pinky\";\n\nexport const XR_FINGERS: readonly XrFinger[] = [\n \"thumb\",\n \"index\",\n \"middle\",\n \"ring\",\n \"pinky\",\n];\n\n/** Fingers that can oppose the thumb. The thumb cannot pinch itself. */\nexport const PINCH_FINGERS: readonly Exclude<XrFinger, \"thumb\">[] = [\n \"index\",\n \"middle\",\n \"ring\",\n \"pinky\",\n];\n\n/**\n * Joint positions, in world space.\n *\n * Partial because tracking drops joints, and because non-WebXR sources (a\n * simulator, a recorded pose) may supply fewer.\n */\nexport type XrHandJoints = Partial<Record<XrHandJointName, THREE.Vector3>>;\n\n/**\n * Joint chains, wrist-outward.\n *\n * The thumb is deliberately one joint shorter — it has NO intermediate phalanx.\n * That asymmetry is in the WebXR spec and every implementation has to special\n * case it; here it falls out of the chain length automatically.\n */\nconst FINGER_CHAINS: Record<XrFinger, readonly XrHandJointName[]> = {\n thumb: [\n \"thumb-metacarpal\",\n \"thumb-phalanx-proximal\",\n \"thumb-phalanx-distal\",\n \"thumb-tip\",\n ],\n index: [\n \"index-finger-metacarpal\",\n \"index-finger-phalanx-proximal\",\n \"index-finger-phalanx-intermediate\",\n \"index-finger-phalanx-distal\",\n \"index-finger-tip\",\n ],\n middle: [\n \"middle-finger-metacarpal\",\n \"middle-finger-phalanx-proximal\",\n \"middle-finger-phalanx-intermediate\",\n \"middle-finger-phalanx-distal\",\n \"middle-finger-tip\",\n ],\n ring: [\n \"ring-finger-metacarpal\",\n \"ring-finger-phalanx-proximal\",\n \"ring-finger-phalanx-intermediate\",\n \"ring-finger-phalanx-distal\",\n \"ring-finger-tip\",\n ],\n pinky: [\n \"pinky-finger-metacarpal\",\n \"pinky-finger-phalanx-proximal\",\n \"pinky-finger-phalanx-intermediate\",\n \"pinky-finger-phalanx-distal\",\n \"pinky-finger-tip\",\n ],\n};\n\nconst TIP_JOINTS: Record<XrFinger, XrHandJointName> = {\n thumb: \"thumb-tip\",\n index: \"index-finger-tip\",\n middle: \"middle-finger-tip\",\n ring: \"ring-finger-tip\",\n pinky: \"pinky-finger-tip\",\n};\n\nconst METACARPAL_JOINTS: Record<XrFinger, XrHandJointName> = {\n thumb: \"thumb-metacarpal\",\n index: \"index-finger-metacarpal\",\n middle: \"middle-finger-metacarpal\",\n ring: \"ring-finger-metacarpal\",\n pinky: \"pinky-finger-metacarpal\",\n};\n\n/** Fallback palm width when the hand is too poorly tracked to measure. */\nexport const FALLBACK_HAND_SCALE = 0.08;\n\n/**\n * Straightness normalization.\n *\n * Adjacent bone directions are compared by dot product (cheaper than `acos` and\n * monotonic, which is all we need). A dot at or above {@link STRAIGHT_COS} reads\n * as perfectly straight; at or below {@link CURLED_COS} (~57°) as fully curled.\n */\nexport const STRAIGHT_COS = 0.95;\nexport const CURLED_COS = 0.55;\n\nfunction clamp01(value: number): number {\n return value < 0 ? 0 : value > 1 ? 1 : value;\n}\n\n/** Normalized bone directions along a finger, or null if too few joints track. */\nfunction boneDirections(\n joints: XrHandJoints,\n finger: XrFinger,\n): THREE.Vector3[] | null {\n const chain = FINGER_CHAINS[finger];\n const directions: THREE.Vector3[] = [];\n\n for (let i = 1; i < chain.length; i += 1) {\n const from = joints[chain[i - 1]];\n const to = joints[chain[i]];\n if (!from || !to) return null;\n\n const direction = new THREE.Vector3().subVectors(to, from);\n // A zero-length bone means duplicated/degenerate joints; normalizing would\n // produce NaN and poison every downstream metric.\n if (direction.lengthSq() < 1e-12) return null;\n directions.push(direction.normalize());\n }\n\n return directions.length >= 2 ? directions : null;\n}\n\n/** Per-joint bend, 0 = straight, 1 = fully curled. */\nfunction bendAmounts(directions: THREE.Vector3[]): number[] {\n const bends: number[] = [];\n for (let i = 1; i < directions.length; i += 1) {\n const cos = directions[i - 1].dot(directions[i]);\n const straightness = clamp01((cos - CURLED_COS) / (STRAIGHT_COS - CURLED_COS));\n bends.push(1 - straightness);\n }\n return bends;\n}\n\nfunction average(values: number[]): number {\n if (values.length === 0) return 0;\n let sum = 0;\n for (const value of values) sum += value;\n return sum / values.length;\n}\n\n/** How curled one finger is. */\nexport type XrFingerCurl = {\n /** Knuckle bend alone — 0 straight, 1 bent square to the palm. */\n baseCurl: number;\n /** The outer joints — distinguishes a hook from a fist. */\n tipCurl: number;\n /** Whole-finger curl. The value a simple pose editor exposes. */\n curl: number;\n};\n\n/**\n * Curl for one finger, or null when the finger isn't tracked well enough.\n *\n * The thumb yields only two bend angles to the fingers' three, so `baseCurl` and\n * `tipCurl` are its first and second bends respectively.\n */\nexport function computeFingerCurl(\n joints: XrHandJoints,\n finger: XrFinger,\n): XrFingerCurl | null {\n const directions = boneDirections(joints, finger);\n if (!directions) return null;\n\n const bends = bendAmounts(directions);\n if (bends.length === 0) return null;\n\n return {\n baseCurl: bends[0],\n tipCurl: average(bends.slice(1)) || bends[bends.length - 1],\n curl: average(bends),\n };\n}\n\n/** Distance across the knuckles — our unit of hand size. */\nexport function computePalmWidth(joints: XrHandJoints): number | null {\n const index = joints[\"index-finger-metacarpal\"];\n const pinky = joints[\"pinky-finger-metacarpal\"];\n if (!index || !pinky) return null;\n const width = index.distanceTo(pinky);\n return width > 1e-6 ? width : null;\n}\n\n/**\n * Characteristic hand size in metres.\n *\n * Every distance threshold in this module is a multiple of this, which is what\n * lets one authored pose match hands of any size.\n */\nexport function estimateHandScale(joints: XrHandJoints): number {\n const measurements: number[] = [];\n\n const width = computePalmWidth(joints);\n if (width !== null) measurements.push(width);\n\n const wrist = joints.wrist;\n const middleTip = joints[\"middle-finger-tip\"];\n if (wrist && middleTip) {\n // Wrist-to-middle-tip is roughly twice palm width on a real hand; halve it\n // so both measurements live on the same scale before averaging.\n const span = wrist.distanceTo(middleTip);\n if (span > 1e-6) measurements.push(span * 0.5);\n }\n\n if (measurements.length === 0) return FALLBACK_HAND_SCALE;\n return average(measurements);\n}\n\n/**\n * How close a fingertip is to the thumb tip. 1 = touching, 0 = far apart.\n *\n * Scaled by hand size, so \"pinching\" means the same gesture on every hand\n * rather than the same number of millimetres.\n */\nexport function computePinch(\n joints: XrHandJoints,\n finger: Exclude<XrFinger, \"thumb\">,\n): number | null {\n const thumbTip = joints[\"thumb-tip\"];\n const fingerTip = joints[TIP_JOINTS[finger]];\n if (!thumbTip || !fingerTip) return null;\n\n const scale = estimateHandScale(joints);\n const distance = thumbTip.distanceTo(fingerTip);\n return clamp01(1 - distance / (scale * 0.7));\n}\n\n/**\n * Angular separation between two fingers. 0 = parallel, 1 = splayed wide.\n *\n * Measured on metacarpal→tip direction, which stays meaningful even when the\n * fingers are partly curled.\n */\nexport function computeSpread(\n joints: XrHandJoints,\n a: XrFinger,\n b: XrFinger,\n): number | null {\n const aBase = joints[METACARPAL_JOINTS[a]];\n const aTip = joints[TIP_JOINTS[a]];\n const bBase = joints[METACARPAL_JOINTS[b]];\n const bTip = joints[TIP_JOINTS[b]];\n if (!aBase || !aTip || !bBase || !bTip) return null;\n\n const dirA = new THREE.Vector3().subVectors(aTip, aBase);\n const dirB = new THREE.Vector3().subVectors(bTip, bBase);\n if (dirA.lengthSq() < 1e-12 || dirB.lengthSq() < 1e-12) return null;\n\n return clamp01((1 - dirA.normalize().dot(dirB.normalize())) / 0.45);\n}\n\n/** An orthonormal frame attached to the palm. */\nexport type XrPalmPose = {\n center: THREE.Vector3;\n /** Outward from the front of the palm. */\n normal: THREE.Vector3;\n /** Across the palm, thumb-ward. */\n right: THREE.Vector3;\n /** Along the fingers. */\n up: THREE.Vector3;\n width: number;\n};\n\n/**\n * Palm frame, used for orientation conditions (\"palm up\", \"thumb toward face\").\n *\n * Handedness matters: the same cross product points opposite ways on left and\n * right hands, so the left is mirrored to keep `normal` meaning \"out of the\n * front of the palm\" on both.\n */\nexport function computePalmPose(\n joints: XrHandJoints,\n handedness: \"left\" | \"right\",\n): XrPalmPose | null {\n const wrist = joints.wrist;\n const indexBase = joints[\"index-finger-metacarpal\"];\n const pinkyBase = joints[\"pinky-finger-metacarpal\"];\n if (!wrist || !indexBase || !pinkyBase) return null;\n\n const u = new THREE.Vector3().subVectors(indexBase, wrist);\n const v = new THREE.Vector3().subVectors(pinkyBase, wrist);\n const normal = new THREE.Vector3().crossVectors(u, v);\n if (normal.lengthSq() < 1e-12) return null;\n normal.normalize();\n if (handedness === \"left\") normal.multiplyScalar(-1);\n\n const right = new THREE.Vector3().subVectors(indexBase, pinkyBase);\n if (right.lengthSq() < 1e-12) return null;\n right.normalize();\n if (handedness === \"left\") right.multiplyScalar(-1);\n\n const up = new THREE.Vector3().crossVectors(normal, right).normalize();\n const center = new THREE.Vector3()\n .add(wrist)\n .add(indexBase)\n .add(pinkyBase)\n .divideScalar(3);\n\n return {\n center,\n normal,\n right,\n up,\n width: computePalmWidth(joints) ?? FALLBACK_HAND_SCALE,\n };\n}\n\n/** Everything a pose is matched against, derived once per hand per frame. */\nexport type XrHandShape = {\n handedness: \"left\" | \"right\";\n fingers: Record<XrFinger, XrFingerCurl>;\n /** Thumb-opposition per finger. */\n pinch: Record<Exclude<XrFinger, \"thumb\">, number>;\n spread: {\n thumbIndex: number;\n indexMiddle: number;\n middleRing: number;\n ringPinky: number;\n };\n palm: XrPalmPose | null;\n /** Characteristic hand size, metres. */\n scale: number;\n /** Direction the thumb points, world space. */\n thumbDirection: THREE.Vector3 | null;\n};\n\n/**\n * Reduce tracked joints to the matchable shape.\n *\n * Returns null when the hand is too poorly tracked for ANY finger to be\n * measured — better to report \"no pose\" than to match against garbage.\n */\nexport function computeHandShape(\n joints: XrHandJoints,\n handedness: \"left\" | \"right\",\n): XrHandShape | null {\n const fingers = {} as Record<XrFinger, XrFingerCurl>;\n let tracked = 0;\n\n for (const finger of XR_FINGERS) {\n const curl = computeFingerCurl(joints, finger);\n if (curl) {\n fingers[finger] = curl;\n tracked += 1;\n } else {\n // An untracked finger reads as neutral rather than absent, so a pose that\n // does not constrain it still matches.\n fingers[finger] = { baseCurl: 0, tipCurl: 0, curl: 0 };\n }\n }\n\n if (tracked === 0) return null;\n\n const pinch = {} as Record<Exclude<XrFinger, \"thumb\">, number>;\n for (const finger of PINCH_FINGERS) {\n pinch[finger] = computePinch(joints, finger) ?? 0;\n }\n\n const thumbBase = joints[\"thumb-metacarpal\"];\n const thumbTip = joints[\"thumb-tip\"];\n let thumbDirection: THREE.Vector3 | null = null;\n if (thumbBase && thumbTip) {\n const direction = new THREE.Vector3().subVectors(thumbTip, thumbBase);\n if (direction.lengthSq() > 1e-12) thumbDirection = direction.normalize();\n }\n\n return {\n handedness,\n fingers,\n pinch,\n spread: {\n thumbIndex: computeSpread(joints, \"thumb\", \"index\") ?? 0,\n indexMiddle: computeSpread(joints, \"index\", \"middle\") ?? 0,\n middleRing: computeSpread(joints, \"middle\", \"ring\") ?? 0,\n ringPinky: computeSpread(joints, \"ring\", \"pinky\") ?? 0,\n },\n palm: computePalmPose(joints, handedness),\n scale: estimateHandScale(joints),\n thumbDirection,\n };\n}\n\n/* ------------------------------------------------------------------ *\n * Pose definitions\n * ------------------------------------------------------------------ */\n\n/** Target curl for one finger, with the slack allowed around it. */\nexport type XrFingerTarget = {\n /** 0 = extended, 1 = fully curled. */\n curl: number;\n /** Half-width of the accepted band. Larger = easier to perform. */\n tolerance: number;\n /** Optional knuckle constraint, for poses where whole-finger curl is ambiguous. */\n baseCurl?: number;\n /** Optional outer-joint constraint. */\n tipCurl?: number;\n};\n\n/** Which way something on the hand must point for the pose to count. */\nexport type XrHandPoseAxis = \"palm-normal\" | \"fingers\" | \"thumb\";\n\nexport type XrHandPoseDirection =\n | \"up\"\n | \"down\"\n | \"forward\"\n | \"back\"\n | \"left\"\n | \"right\"\n | \"toward-head\"\n | \"away-from-head\";\n\nexport type XrHandPoseOrientation = {\n axis: XrHandPoseAxis;\n direction: XrHandPoseDirection;\n /** How far off it may point and still match. */\n toleranceDegrees: number;\n};\n\n/**\n * A matchable hand pose.\n *\n * Shape (finger curls) is kept separate from orientation deliberately: thumbs-up\n * and thumbs-down are the SAME hand shape and differ only in where the thumb\n * points. Folding orientation into the curl targets would force two nearly\n * duplicate definitions and make neither editable in isolation.\n */\nexport type XrHandPoseDefinition = {\n id: string;\n name: string;\n fingers: Record<XrFinger, XrFingerTarget>;\n /** Optional thumb-to-finger contact requirement. */\n pinch?: {\n finger: Exclude<XrFinger, \"thumb\">;\n /** 1 = touching. */\n target: number;\n tolerance: number;\n };\n orientation?: XrHandPoseOrientation;\n /** Restrict to one hand; omit to match either. */\n hand?: \"left\" | \"right\";\n};\n\n/** Confidence falls to zero this far outside a target's tolerance band. */\nexport const MATCH_FALLOFF = 0.25;\n\nexport type XrHandPoseMatch = {\n /** Every constraint inside its tolerance. */\n matched: boolean;\n /** 0..1. Degrades smoothly outside tolerance, for live editor feedback. */\n confidence: number;\n /** The constraint furthest out of range — what to show the user when it fails. */\n worstConstraint: string | null;\n};\n\nconst NO_MATCH: XrHandPoseMatch = {\n matched: false,\n confidence: 0,\n worstConstraint: null,\n};\n\n/** Score one scalar against a target band. 1 inside tolerance, decaying outside. */\nfunction scoreAgainst(\n actual: number,\n target: number,\n tolerance: number,\n): number {\n const error = Math.abs(actual - target);\n if (error <= tolerance) return 1;\n return clamp01(1 - (error - tolerance) / MATCH_FALLOFF);\n}\n\nconst WORLD_DIRECTIONS: Record<\n Exclude<XrHandPoseDirection, \"toward-head\" | \"away-from-head\">,\n THREE.Vector3\n> = {\n up: new THREE.Vector3(0, 1, 0),\n down: new THREE.Vector3(0, -1, 0),\n forward: new THREE.Vector3(0, 0, -1),\n back: new THREE.Vector3(0, 0, 1),\n left: new THREE.Vector3(-1, 0, 0),\n right: new THREE.Vector3(1, 0, 0),\n};\n\n/** Extra world context needed only by head-relative orientation conditions. */\nexport type XrHandPoseContext = {\n headPosition?: THREE.Vector3;\n};\n\nfunction axisVector(\n shape: XrHandShape,\n axis: XrHandPoseAxis,\n): THREE.Vector3 | null {\n if (axis === \"thumb\") return shape.thumbDirection;\n if (!shape.palm) return null;\n return axis === \"palm-normal\" ? shape.palm.normal : shape.palm.up;\n}\n\nfunction resolveDirection(\n direction: XrHandPoseDirection,\n shape: XrHandShape,\n context?: XrHandPoseContext,\n): THREE.Vector3 | null {\n if (direction !== \"toward-head\" && direction !== \"away-from-head\") {\n return WORLD_DIRECTIONS[direction];\n }\n\n const head = context?.headPosition;\n const origin = shape.palm?.center;\n // Head-relative conditions are unanswerable without both points; treat as\n // unmatched rather than silently succeeding.\n if (!head || !origin) return null;\n\n const toHead = new THREE.Vector3().subVectors(head, origin);\n if (toHead.lengthSq() < 1e-12) return null;\n toHead.normalize();\n return direction === \"toward-head\" ? toHead : toHead.multiplyScalar(-1);\n}\n\n/**\n * Score a live hand against a pose.\n *\n * Confidence is the MINIMUM across constraints, not the average — a soft AND.\n * Averaging lets three perfect fingers outvote one badly wrong one, which is how\n * a fist ends up firing as a thumbs-up.\n */\nexport function matchHandPose(\n shape: XrHandShape,\n definition: XrHandPoseDefinition,\n context?: XrHandPoseContext,\n): XrHandPoseMatch {\n if (definition.hand && definition.hand !== shape.handedness) return NO_MATCH;\n\n let confidence = 1;\n let worstScore = 1;\n let worstConstraint: string | null = null;\n\n const consider = (score: number, label: string) => {\n if (score < confidence) confidence = score;\n if (score < worstScore) {\n worstScore = score;\n worstConstraint = label;\n }\n };\n\n for (const finger of XR_FINGERS) {\n const target = definition.fingers[finger];\n if (!target) continue;\n const actual = shape.fingers[finger];\n\n consider(scoreAgainst(actual.curl, target.curl, target.tolerance), finger);\n\n if (target.baseCurl !== undefined) {\n consider(\n scoreAgainst(actual.baseCurl, target.baseCurl, target.tolerance),\n `${finger} knuckle`,\n );\n }\n if (target.tipCurl !== undefined) {\n consider(\n scoreAgainst(actual.tipCurl, target.tipCurl, target.tolerance),\n `${finger} tip`,\n );\n }\n }\n\n if (definition.pinch) {\n const { finger, target, tolerance } = definition.pinch;\n consider(\n scoreAgainst(shape.pinch[finger], target, tolerance),\n `${finger} pinch`,\n );\n }\n\n if (definition.orientation) {\n const { axis, direction, toleranceDegrees } = definition.orientation;\n const handAxis = axisVector(shape, axis);\n const wanted = resolveDirection(direction, shape, context);\n\n if (!handAxis || !wanted) {\n consider(0, \"orientation\");\n } else {\n const angle = THREE.MathUtils.radToDeg(\n Math.acos(THREE.MathUtils.clamp(handAxis.dot(wanted), -1, 1)),\n );\n // Reuse the curl falloff by mapping degrees onto the same 0..1 scale:\n // fully out of tolerance at twice the allowed angle.\n const normalizedError = Math.max(0, angle - toleranceDegrees) / 90;\n consider(clamp01(1 - normalizedError / MATCH_FALLOFF), \"orientation\");\n }\n }\n\n return {\n matched: confidence >= 1,\n confidence,\n worstConstraint: confidence >= 1 ? null : worstConstraint,\n };\n}\n\n/* ------------------------------------------------------------------ *\n * Detection state machine\n * ------------------------------------------------------------------ */\n\nexport type XrHandPoseEvent = \"start\" | \"end\" | null;\n\nexport type HandPoseTrackerOptions = {\n /** Confidence needed to begin holding. */\n enterConfidence?: number;\n /** Confidence below which an active pose ends. Must be < enter. */\n exitConfidence?: number;\n /** Seconds the pose must be held before it fires. */\n minHoldSeconds?: number;\n /** Grace period before tracking loss ends an active pose. */\n lostGraceSeconds?: number;\n};\n\nexport const DEFAULT_ENTER_CONFIDENCE = 0.8;\nexport const DEFAULT_EXIT_CONFIDENCE = 0.55;\nexport const DEFAULT_MIN_HOLD_SECONDS = 0.15;\nexport const DEFAULT_LOST_GRACE_SECONDS = 0.25;\n\n/**\n * Turns a stream of per-frame confidences into clean start/end events.\n *\n * Two mechanisms, both necessary:\n *\n * - HYSTERESIS. A single threshold makes confidence hovering at the boundary\n * emit start/end at frame rate. Entering high and exiting low kills that.\n * - HOLD TIME. Fingers pass through many shapes on the way to the intended one;\n * without a hold requirement a fist fires \"point\" en route.\n *\n * Tracking loss gets a grace period rather than ending immediately, because\n * hands drop out for a frame or two constantly at the edge of the camera FOV.\n */\nexport class HandPoseTracker {\n private readonly enterConfidence: number;\n private readonly exitConfidence: number;\n private readonly minHoldSeconds: number;\n private readonly lostGraceSeconds: number;\n\n private active = false;\n private holdingSince: number | null = null;\n private lostSince: number | null = null;\n\n constructor(options?: HandPoseTrackerOptions) {\n this.enterConfidence = options?.enterConfidence ?? DEFAULT_ENTER_CONFIDENCE;\n const exit = options?.exitConfidence ?? DEFAULT_EXIT_CONFIDENCE;\n // Exit must sit strictly below enter or the hysteresis band collapses and\n // the chatter it exists to prevent comes straight back.\n this.exitConfidence = Math.min(exit, this.enterConfidence - 1e-3);\n this.minHoldSeconds = options?.minHoldSeconds ?? DEFAULT_MIN_HOLD_SECONDS;\n this.lostGraceSeconds =\n options?.lostGraceSeconds ?? DEFAULT_LOST_GRACE_SECONDS;\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n /** Feed this frame's confidence. Returns an event on a transition. */\n update(confidence: number, now: number): XrHandPoseEvent {\n this.lostSince = null;\n\n if (this.active) {\n if (confidence < this.exitConfidence) {\n this.active = false;\n this.holdingSince = null;\n return \"end\";\n }\n return null;\n }\n\n if (confidence >= this.enterConfidence) {\n if (this.holdingSince === null) this.holdingSince = now;\n if (now - this.holdingSince >= this.minHoldSeconds) {\n this.active = true;\n return \"start\";\n }\n return null;\n }\n\n this.holdingSince = null;\n return null;\n }\n\n /** Feed a frame where the hand isn't tracked at all. */\n miss(now: number): XrHandPoseEvent {\n this.holdingSince = null;\n if (!this.active) return null;\n\n if (this.lostSince === null) this.lostSince = now;\n if (now - this.lostSince < this.lostGraceSeconds) return null;\n\n this.active = false;\n this.lostSince = null;\n return \"end\";\n }\n\n reset(): void {\n this.active = false;\n this.holdingSince = null;\n this.lostSince = null;\n }\n}\n","import * as THREE from \"three\";\nimport { Behaviour } from \"../Behaviour\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport {\n handPoseDefinitionFor,\n XRHandPoseComponent,\n type XrHandPoseEntry,\n} from \"../components/XRHandPose\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport {\n computeHandShape,\n HandPoseTracker,\n matchHandPose,\n type XrHandPoseContext,\n type XrHandShape,\n} from \"../xr/handPose\";\nimport { getHandPosePreset } from \"../xr/handPosePresets\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\n\n/**\n * Detects hand poses and reports them to the scene.\n *\n * Runs after {@link XRInputSystem} so it reads the same latched joint data every\n * other system sees this tick.\n *\n * The hand shape is computed ONCE PER HAND PER FRAME and shared by every\n * listening entity. Recomputing it per entity would make the cost scale with\n * scene size for no benefit — the user has two hands regardless of how many\n * objects are watching them.\n */\n\n/** Pose detection state, keyed hand-then-pose. */\ntype HandTrackers = Map<string, HandPoseTracker>;\n\nexport type XrHandPoseEventDetail = {\n /** The entry's id. */\n poseId: string;\n poseName: string;\n handedness: \"left\" | \"right\";\n /** 0..1 at the moment of the transition. */\n confidence: number;\n};\n\nexport class XRHandPoseSystem implements EcsSystem {\n private readonly inputSystem: XRInputSystem;\n private readonly trackers = new Map<\"left\" | \"right\", HandTrackers>();\n private readonly shapes = new Map<\"left\" | \"right\", XrHandShape | null>();\n /** Reused so head-relative orientation checks allocate nothing per frame. */\n private readonly headPosition = new THREE.Vector3();\n private elapsed = 0;\n\n constructor(inputSystem: XRInputSystem) {\n this.inputSystem = inputSystem;\n }\n\n update(world: World, deltaTime: number): void {\n if (!world.isXrPresenting()) {\n // Leaving XR must not strand a pose in the \"active\" state, or re-entering\n // would never fire its start again.\n this.resetAll();\n return;\n }\n\n this.elapsed += deltaTime;\n this.refreshShapes();\n\n const entries = this.collectEntries(world);\n if (entries.length === 0) return;\n\n world.getCamera().getWorldPosition(this.headPosition);\n const context: XrHandPoseContext = { headPosition: this.headPosition };\n\n for (const { entityId, entry } of entries) {\n const definition = handPoseDefinitionFor(entry, getHandPosePreset);\n if (!definition) continue;\n\n for (const handedness of [\"left\", \"right\"] as const) {\n if (entry.hand && entry.hand !== handedness) continue;\n\n const key = `${entityId}:${entry.id}`;\n const trackers = this.trackersFor(handedness);\n let tracker = trackers.get(key);\n if (!tracker) {\n tracker = new HandPoseTracker({\n minHoldSeconds: entry.minHoldSeconds,\n });\n trackers.set(key, tracker);\n }\n\n const shape = this.shapes.get(handedness) ?? null;\n if (!shape) {\n if (tracker.miss(this.elapsed) === \"end\") {\n this.dispatch(world, entityId, \"end\", {\n poseId: entry.id,\n poseName: entry.name,\n handedness,\n confidence: 0,\n });\n }\n continue;\n }\n\n const match = matchHandPose(shape, definition, context);\n const event = tracker.update(match.confidence, this.elapsed);\n if (event) {\n this.dispatch(world, entityId, event, {\n poseId: entry.id,\n poseName: entry.name,\n handedness,\n confidence: match.confidence,\n });\n }\n }\n }\n }\n\n /** Derive each hand's shape once for the whole frame. */\n private refreshShapes(): void {\n for (const handedness of [\"left\", \"right\"] as const) {\n const input = this.inputSystem.getInput(handedness);\n const joints = input?.joints ?? null;\n this.shapes.set(\n handedness,\n joints ? computeHandShape(joints, handedness) : null,\n );\n }\n }\n\n private collectEntries(\n world: World,\n ): { entityId: number; entry: XrHandPoseEntry }[] {\n const collected: { entityId: number; entry: XrHandPoseEntry }[] = [];\n\n for (const entityId of world.query(XRHandPoseComponent)) {\n const component = world.getComponent(entityId, XRHandPoseComponent);\n if (!component?.enabled) continue;\n\n for (const entry of component.poses) {\n if (entry.enabled) collected.push({ entityId, entry });\n }\n }\n\n return collected;\n }\n\n private trackersFor(handedness: \"left\" | \"right\"): HandTrackers {\n let trackers = this.trackers.get(handedness);\n if (!trackers) {\n trackers = new Map();\n this.trackers.set(handedness, trackers);\n }\n return trackers;\n }\n\n /**\n * Deliver to the entity's own Behaviours.\n *\n * Scoped to the entity that declared the pose rather than broadcast, so two\n * objects listening for the same gesture stay independent.\n */\n private dispatch(\n world: World,\n entityId: number,\n event: \"start\" | \"end\",\n detail: XrHandPoseEventDetail,\n ): void {\n const script = world.getComponent(entityId, ScriptComponent);\n const instances = script?.scriptInstances;\n if (!instances) return;\n\n for (const instance of instances.values()) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n if (event === \"start\") instance.onHandPoseStart(detail);\n else instance.onHandPoseEnd(detail);\n } catch (error) {\n // One misbehaving script must never abort the dispatch loop.\n console.error(\"[XRHandPoseSystem] Behaviour hook failed:\", error);\n }\n }\n }\n\n private resetAll(): void {\n for (const trackers of this.trackers.values()) {\n for (const tracker of trackers.values()) tracker.reset();\n }\n this.shapes.clear();\n }\n\n /** Live shape for a hand — powers the editor's pose readout. */\n getHandShape(handedness: \"left\" | \"right\"): XrHandShape | null {\n return this.shapes.get(handedness) ?? null;\n }\n\n /** Whether a given entity's pose is currently held. */\n isPoseActive(\n entityId: number,\n poseId: string,\n handedness: \"left\" | \"right\",\n ): boolean {\n return (\n this.trackers.get(handedness)?.get(`${entityId}:${poseId}`)?.isActive() ??\n false\n );\n }\n}\n","import * as THREE from \"three\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { XRInteractableComponent } from \"../components/XRInteractable\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport type { XRInteractionSystem } from \"./XRInteractionSystem\";\n\n/**\n * Hover feedback for XR interactables.\n *\n * Without it, aiming the pointer at a grabbable object and aiming at empty space\n * look identical, so users cannot tell what they are about to pick up.\n *\n * The colour effect is drawn as a SEPARATE shell mesh rather than by tinting the\n * object's materials. Materials are frequently shared between entities (every\n * instance of a loaded model points at the same one), so tinting on hover would\n * light up every copy in the scene and would have to be perfectly unwound on\n * un-hover to avoid leaving objects permanently stained. A shell owns its own\n * material, can be removed wholesale, and cannot corrupt anything.\n */\n\n/** Marks shell meshes so they are never mistaken for scene content. */\nexport const XR_HOVER_SHELL_FLAG = \"__xrHoverShell\";\n\n/** How far outside the surface the outline sits, as a fraction of size. */\nconst SHELL_INFLATE = 1.04;\n\n/**\n * Seconds for the scale effect to substantially complete.\n *\n * Instant scaling reads as a glitch rather than a response; anything much slower\n * than this feels laggy when sweeping the pointer across several objects.\n */\nconst SCALE_SMOOTH_SECONDS = 0.09;\n\ntype HoverRecord = {\n /** The shell added for the colour effect, if any. */\n shell: THREE.Object3D | null;\n /** Authored scale, restored exactly when hover ends. */\n baseScale: THREE.Vector3;\n /** Current interpolation, 0 = authored size, 1 = fully hovered. */\n progress: number;\n /** False once hover ends, so the effect can animate back out. */\n active: boolean;\n};\n\nexport class XRHoverVisualSystem implements EcsSystem {\n private readonly interactionSystem: XRInteractionSystem;\n private readonly records = new Map<number, HoverRecord>();\n\n constructor(interactionSystem: XRInteractionSystem) {\n this.interactionSystem = interactionSystem;\n }\n\n update(world: World, deltaTime: number): void {\n if (!world.isXrPresenting()) {\n this.clearAll(world);\n return;\n }\n\n const hovered = this.interactionSystem.getHoveredEntityIds();\n // A held object is not \"hovered\" — the feedback exists to say what you are\n // ABOUT to grab, and scaling something already in your hand fights the grab.\n const held = this.interactionSystem.getHeldEntityIds();\n\n for (const entityId of hovered) {\n if (held.has(entityId)) continue;\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n if (!interactable?.enabled) continue;\n if (interactable.hoverBehavior === \"none\") continue;\n this.begin(world, entityId, interactable);\n }\n\n for (const [entityId, record] of this.records) {\n if (!hovered.has(entityId) || held.has(entityId)) {\n record.active = false;\n }\n }\n\n this.animate(world, deltaTime);\n }\n\n private begin(\n world: World,\n entityId: number,\n interactable: XRInteractableComponent,\n ): void {\n const existing = this.records.get(entityId);\n if (existing) {\n existing.active = true;\n return;\n }\n\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) return;\n\n const wantsColor =\n interactable.hoverBehavior === \"color\" ||\n interactable.hoverBehavior === \"both\";\n\n this.records.set(entityId, {\n shell: wantsColor ? this.addShell(world, entityId, interactable) : null,\n baseScale: new THREE.Vector3(\n transform.scale.x,\n transform.scale.y,\n transform.scale.z,\n ),\n progress: 0,\n active: true,\n });\n }\n\n /** Build an inflated back-face copy of the object's meshes. */\n private addShell(\n world: World,\n entityId: number,\n interactable: XRInteractableComponent,\n ): THREE.Object3D | null {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!object) return null;\n\n const material = new THREE.MeshBasicMaterial({\n color: new THREE.Color(interactable.hoverColor),\n // Back faces only, so the shell shows just outside the silhouette instead\n // of covering the object.\n side: THREE.BackSide,\n transparent: true,\n opacity: 0.85,\n depthWrite: false,\n });\n\n const group = new THREE.Group();\n group.name = \"XRHoverShell\";\n group.userData[XR_HOVER_SHELL_FLAG] = true;\n group.renderOrder = 998;\n\n object.traverse((child) => {\n if (!(child instanceof THREE.Mesh) || !child.geometry) return;\n // Never copy another shell — nested hovers would compound.\n if (child.userData[XR_HOVER_SHELL_FLAG]) return;\n\n const clone = new THREE.Mesh(child.geometry, material);\n // Position the copy where the source mesh sits relative to the entity\n // root, so multi-mesh models outline correctly rather than collapsing.\n child.updateWorldMatrix(true, false);\n object.updateWorldMatrix(true, false);\n clone.matrixAutoUpdate = false;\n clone.matrix\n .copy(object.matrixWorld)\n .invert()\n .multiply(child.matrixWorld)\n .scale(new THREE.Vector3(SHELL_INFLATE, SHELL_INFLATE, SHELL_INFLATE));\n clone.userData[XR_HOVER_SHELL_FLAG] = true;\n clone.raycast = () => {\n // The shell must be invisible to grab raycasts or it would shadow the\n // very object it is highlighting.\n };\n group.add(clone);\n });\n\n if (group.children.length === 0) {\n material.dispose();\n return null;\n }\n\n object.add(group);\n return group;\n }\n\n private animate(world: World, deltaTime: number): void {\n // Exponential approach — frame-rate independent, and settles without the\n // overshoot a spring would add.\n const step =\n SCALE_SMOOTH_SECONDS <= 0\n ? 1\n : 1 - Math.exp(-Math.max(0, deltaTime) / SCALE_SMOOTH_SECONDS);\n\n for (const [entityId, record] of Array.from(this.records)) {\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n const target = record.active ? 1 : 0;\n record.progress += (target - record.progress) * step;\n\n const wantsScale =\n interactable?.hoverBehavior === \"scale\" ||\n interactable?.hoverBehavior === \"both\";\n\n if (wantsScale) {\n const transform = world.getComponent(entityId, TransformComponent);\n if (transform) {\n const factor =\n 1 + (interactable.hoverScale - 1) * Math.min(1, record.progress);\n transform.scale.x = record.baseScale.x * factor;\n transform.scale.y = record.baseScale.y * factor;\n transform.scale.z = record.baseScale.z * factor;\n }\n }\n\n if (!record.active && record.progress < 0.01) {\n this.finish(world, entityId, record);\n }\n }\n }\n\n /** Remove the effect and restore the authored scale exactly. */\n private finish(\n world: World,\n entityId: number,\n record: HoverRecord,\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n if (transform) {\n // Written exactly rather than left at the tail of the interpolation, so\n // hovering an object repeatedly cannot drift its authored size.\n transform.scale.x = record.baseScale.x;\n transform.scale.y = record.baseScale.y;\n transform.scale.z = record.baseScale.z;\n }\n this.disposeShell(record.shell);\n this.records.delete(entityId);\n }\n\n private disposeShell(shell: THREE.Object3D | null): void {\n if (!shell) return;\n shell.parent?.remove(shell);\n shell.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n const material = child.material;\n // Geometry is SHARED with the source mesh — disposing it would destroy\n // the object being highlighted.\n if (Array.isArray(material)) {\n for (const entry of material) entry.dispose();\n } else {\n material?.dispose();\n }\n }\n });\n }\n\n private clearAll(world: World): void {\n for (const [entityId, record] of Array.from(this.records)) {\n this.finish(world, entityId, record);\n }\n }\n\n dispose(): void {\n for (const record of this.records.values()) {\n this.disposeShell(record.shell);\n }\n this.records.clear();\n }\n}\n"]}
1
+ {"version":3,"sources":["../../core/Component.ts","../../core/components/Object3DRef.ts","../../core/components/ParentId.ts","../../core/components/Transform.ts","../../core/utils/modelCache.ts","../../core/systems/ObjectManagementSystem.ts","../../core/AnimationStateMachine.ts","../../core/components/Animation.ts","../../core/components/Camera.ts","../../core/components/Audio.ts","../../core/components/Environment.ts","../../core/components/Postprocessing.ts","../../core/components/MeshGeometry.ts","../../core/components/InstancedMesh.ts","../../core/components/InstanceSlotComponent.ts","../../core/components/Physics.ts","../../core/components/Image.ts","../../core/components/ImageTarget.ts","../../core/components/Light.ts","../../core/components/Material.ts","../../core/components/Model.ts","../../core/components/Name.ts","../../core/components/PrefabInstance.ts","../../core/components/PrefabNode.ts","../../core/components/ScriptComponent.ts","../../core/components/ScriptObjectComponent.ts","../../core/components/Selectable.ts","../../core/components/Sprite.ts","../../core/components/Video.ts","../../core/components/VRTeleportArea.ts","../../core/components/XRInteractable.ts","../../core/components/XRRig.ts","../../core/components/XRInteractor.ts","../../core/xr/handPosePresets.ts","../../core/components/XRHandPose.ts","../../core/utils/dracoDecoderPath.ts","../../core/systems/AnimationSystem.ts","../../core/systems/CameraSyncSystem.ts","../../core/systems/ObjectVisibilitySystem.ts","../../core/systems/EnvironmentSyncSystem.ts","../../core/systems/PostprocessingSyncSystem.ts","../../core/systems/PhysicsSyncSystem.ts","../../core/systems/keyboardKeys.ts","../../core/systems/InputSystem.ts","../../core/systems/LightSyncSystem.ts","../../core/systems/MaterialSyncSystem.ts","../../core/systems/MeshGeometrySystem.ts","../../core/utils/loader.ts","../../core/systems/InstancedMeshSystem.ts","../../core/systems/RenderSystem.ts","../../core/prefab/collectEntitySubtree.ts","../../core/hydration/readers.ts","../../core/hydration/componentValues.ts","../../core/hydration/parentLinks.ts","../../core/hydration/postCreateComponents.ts","../../core/hydration/animation.ts","../../core/hydration/restoreComponentState.ts","../../core/hydration/types.ts","../../core/hydration/hydrateWorld.ts","../../core/prefab/overrides.ts","../../core/prefab/instantiateSubtree.ts","../../core/prefab/types.ts","../../core/prefab/spawnPrefab.ts","../../core/Behaviour.ts","../../core/systems/scriptShared.ts","../../core/systems/ScriptBehaviourSystem.ts","../../core/ScriptObject.ts","../../core/systems/ScriptObjectSystem.ts","../../core/systems/TransformSyncSystem.ts","../../core/systems/AudioSystem.ts","../../core/systems/VideoSystem.ts","../../core/systems/XRInputSystem.ts","../../core/xr/throwVelocity.ts","../../core/xr/twoHandTransform.ts","../../core/systems/XRInteractionSystem.ts","../../core/xr/teleportArc.ts","../../core/xr/teleportAimGate.ts","../../core/systems/XRLocomotionSystem.ts","../../core/xr/types.ts","../../core/systems/XRSessionSystem.ts","../../core/systems/VRTeleportAreaSystem.ts","../../core/xr/handPresets.ts","../../core/systems/XRControllerVisualSystem.ts","../../core/systems/XRTeleportVisualSystem.ts","../../core/xr/handPose.ts","../../core/systems/XRHandPoseSystem.ts","../../core/systems/XRHoverVisualSystem.ts"],"names":["Vector3","Euler","Quaternion","THREE2","THREE3","THREE4","toFiniteNumber","asRecord","toBoolean","THREE6","toHexColor","THREE7","GLTFLoader","DRACOLoader","THREE8","FBXLoader","entries","THREE9","THREE10","EffectComposer","RenderPass","BokehPass","THREE11","UnrealBloomPass","ShaderPass","VignetteShader","HueSaturationShader","SepiaShader","FilmPass","DotScreenPass","SSAOPass","GlitchPass","OutputPass","THREE12","body","THREE13","THREE14","THREE15","THREE17","count","geometry","instancedMesh","options","THREE18","THREE19","THREE20","key","THREE21","snapshotOptions","THREE22","THREE23","THREE24","THREE25","THREE26","interactable","THREE27","THREE28","buildGeometry","THREE29","THREE30","XRControllerModelFactory","XRHandModelFactory","THREE31","THREE32","THREE33","fingers","THREE34","THREE35"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,IAAM,UAAA,GAAN,MAAM,UAAA,CAAU;AAAC,CAAA;AAAD,MAAA,CAAA,UAAA,EAAA,WAAA,CAAA;AAAhB,IAAM,SAAA,GAAN,UAAA;;;ACIA,IAAM,YAAA,GAAN,MAAM,YAAA,SAAoB,SAAA,CAAU;AAAA,EAMzC,WAAA,CAAY,QAAwB,UAAA,EAAsB;AACxD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aACH,OAAO,UAAA,KAAe,YAAY,UAAA,GAAa,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,EACzE;AACF,CAAA;AAZ2C,MAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAApC,IAAM,WAAA,GAAN,YAAA;;;ACLA,IAAM,SAAA,GAAN,MAAM,SAAA,SAAiB,SAAA,CAAU;AAAA,EAItC,WAAA,CAAY,QAAyB,IAAA,EAAM;AACzC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF,CAAA;AARwC,MAAA,CAAA,SAAA,EAAA,UAAA,CAAA;AAAjC,IAAM,QAAA,GAAN,SAAA;ACoBP,SAAS,QAAQ,KAAA,EAA6B;AAC5C,EAAA,OAAO;AAAA,IACL,GAAG,KAAA,CAAM,CAAA;AAAA,IACT,GAAG,KAAA,CAAM,CAAA;AAAA,IACT,GAAG,KAAA,CAAM;AAAA,GACX;AACF;AANS,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAmBF,IAAM,mBAAA,GAAN,MAAM,mBAAA,SAA2B,SAAA,CAAU;AAAA,EAQhD,WAAA,CAAY,IAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,KAAA,EAAM;AAEN,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAE7B,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA;AAAA,MACjB,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA;AAAA,MACjB,CAAA,EAAG,SAAS,CAAA,IAAK;AAAA,KACnB;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA;AAAA,MACjB,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA;AAAA,MACjB,CAAA,EAAG,SAAS,CAAA,IAAK;AAAA,KACnB;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,CAAA,EAAG,MAAM,CAAA,IAAK,CAAA;AAAA,MACd,CAAA,EAAG,MAAM,CAAA,IAAK,CAAA;AAAA,MACd,CAAA,EAAG,MAAM,CAAA,IAAK;AAAA,KAChB;AAAA,EACF;AAAA,EAEA,iBAAA,CAAkB,MAAA,GAAS,IAAIA,eAAA,EAAQ,EAAY;AACjD,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,KAAK,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAAA,EACrE;AAAA,EAEA,gBACE,MAAA,GAAS,IAAIC,aAAA,EAAM,EACnB,QAAoB,KAAA,EACb;AACP,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,KAAK,CAAA;AAAA,EAC5E;AAAA,EAEA,qBACE,MAAA,GAAS,IAAIC,kBAAA,EAAW,EACxB,QAAoB,KAAA,EACR;AACZ,IAAA,MAAM,QAAQ,IAAID,aAAA;AAAA,MAChB,KAAK,QAAA,CAAS,CAAA;AAAA,MACd,KAAK,QAAA,CAAS,CAAA;AAAA,MACd,KAAK,QAAA,CAAS,CAAA;AAAA,MACd;AAAA,KACF;AACA,IAAA,OAAO,MAAA,CAAO,aAAa,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,cAAA,CAAe,MAAA,GAAS,IAAID,eAAA,EAAQ,EAAY;AAC9C,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,YAAY,KAAA,EAA6B;AACvC,IAAA,MAAM,IAAA,GAAO,QAAQ,KAAK,CAAA;AAC1B,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,CAAK,CAAA;AACvB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,CAAK,CAAA;AACvB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,CAAK,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,KAAA,EAA6B;AACpC,IAAA,MAAM,IAAA,GAAO,QAAQ,KAAK,CAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,CAAA;AACpB,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,CAAA;AACpB,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,CAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,CAAY,KAAA,EAAuB,KAAA,GAAoB,KAAA,EAAa;AAClE,IAAA,IAAI,iBAAiBE,kBAAA,EAAY;AAC/B,MAAA,MAAM,QAAQ,IAAID,aAAA,EAAM,CAAE,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACxD,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,KAAA,CAAM,CAAA;AACxB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,KAAA,CAAM,CAAA;AACxB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,KAAA,CAAM,CAAA;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,QAAQ,KAAK,CAAA;AAC1B,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,CAAK,CAAA;AACvB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,CAAK,CAAA;AACvB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,CAAK,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AA7FkD,MAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAA3C,IAAM,kBAAA,GAAN,mBAAA;ACxCA,IAAM,0BAAA,GAA6B,+BAAA;;;AC+EnC,SAAS,cAAA,CACd,QACA,SAAA,EACM;AACN,EAAA,MAAA,CAAO,QAAA,CAAS,GAAA;AAAA,IACd,UAAU,QAAA,CAAS,CAAA;AAAA,IACnB,UAAU,QAAA,CAAS,CAAA;AAAA,IACnB,UAAU,QAAA,CAAS;AAAA,GACrB;AACA,EAAA,MAAA,CAAO,QAAA,CAAS,GAAA;AAAA,IACd,UAAU,QAAA,CAAS,CAAA;AAAA,IACnB,UAAU,QAAA,CAAS,CAAA;AAAA,IACnB,UAAU,QAAA,CAAS;AAAA,GACrB;AACA,EAAA,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,UAAU,KAAA,CAAM,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA;AAC1E;AAfgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAiBT,IAAM,uBAAA,GAAN,MAAM,uBAAA,CAA4C;AAAA,EAWvD,WAAA,CACE,KAAA,EACA,MAAA,EACA,QAAA,GAAW,KAAA,EACX;AAXF,IAAA,IAAA,CAAiB,QAAA,uBAAe,GAAA,EAAkC;AAClE,IAAA,IAAA,CAAiB,iBAAA,uBAAwB,GAAA,EAGvC;AACF,IAAA,IAAA,CAAiB,cAA+B,EAAC;AAO/C,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,QAAA,CAAS,MAAqB,OAAA,EAA8B;AAC1D,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAAA,EACjC;AAAA,EAEA,wBAAA,CACE,MACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAAA,EAC1C;AAAA,EAEA,wBAAA,GAAgD;AAC9C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,gBAAA;AACtC,IAAA,IAAI,oBAA0BE,kBAAA,CAAA,aAAA,EAAe;AAC3C,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,aAAA,EAAc;AACzC,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,QAAQ,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,gBAAA,GAAmB,QAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,YAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,oBAAoB,IAAA,EAAwD;AAC1E,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EAC7C;AAAA,EAEA,kBAAA,CACE,IAAA,EACA,KAAA,EACA,QAAA,EAAA,GACG,IAAA,EACM;AACT,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAU,GAAG,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,aAAA,CACE,IAAA,EACA,OAAA,GAAyB,IACzB,SAAA,EACM;AACN,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,WAAW,CAAA;AAAA,EACpD;AAAA,EAEA,SAAA,CACE,IAAA,EACA,KAAA,EACA,OAAA,GAAyB,EAAC,EAChB;AACV,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,WAAW,OAAA,CAAQ;AAAA,MACvB,KAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA;AAAA,MACA,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,SAAS,OAAA,GAAU,IAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,MAAA,KAAA,CAAM,aAAa,QAAA,EAAU,IAAI,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,YAAA,CAAa,KAAA,EAAc,QAAA,EAAoB,OAAA,GAAU,KAAA,EAAgB;AACvE,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC5D,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,QAAA,CAAS,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,QAAA,CAAS,QAAA,CAAS,CAAC,KAAA,KAAU;AAC3B,QAAA,IAAI,iBAAuBA,kBAAA,CAAA,IAAA,EAAM;AAG/B,UAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,QAAA,GAAW,0BAA0B,CAAA,EAAG;AAC3D,YAAA,KAAA,CAAM,UAAU,OAAA,EAAQ;AAAA,UAC1B;AACA,UAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAC1C,KAAA,CAAM,QAAA,GACN,CAAC,KAAA,CAAM,QAAQ,CAAA;AACnB,UAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,YAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,QAAA,GAAW,0BAA0B,CAAA,EAAG;AACtD,cAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,CAAM,cAAc,QAAQ,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CACE,KAAA,EACA,QAAA,EACA,QAAA,EACA,OAAA,EAGS;AACT,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,aAAa,IAAA,IAAQ,CAAC,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA,EAAG;AACnD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,GAAW,QAAA;AACf,IAAA,OAAO,aAAa,IAAA,EAAM;AACxB,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,QAAA,GAAW,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,QAAQ,GAAG,KAAA,IAAS,IAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,QAAQ,CAAA;AAC7D,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,IAAI,eAAA,CAAgB,UAAU,QAAA,EAAU;AACtC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,eAAA,CAAgB,KAAA,GAAQ,QAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,IAAI,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,sBAAA,GAAyB,SAAS,sBAAA,IAA0B,IAAA;AAClE,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,MAAA,MAAM,YAAA,GACJ,aAAa,IAAA,GACT,KAAA,CAAM,aAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA,IAAU,IAAA,GACrD,IAAA;AAEN,MAAA,IAAI,MAAA,EAAQ;AAEV,QAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,IAAI,CAAA;AAEjC,QAAA,IAAI,YAAA,IAAgB,iBAAiB,MAAA,EAAQ;AAC3C,UAAA,YAAA,CAAa,OAAO,MAAM,CAAA;AAAA,QAC5B,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,QAC1B;AAEA,QAAA,MAAA,CAAO,kBAAkB,IAAI,CAAA;AAC7B,QAAA,IAAA,CAAK,gCAAA,CAAiC,KAAA,EAAO,QAAA,EAAU,MAAM,CAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,gCAAA,CACN,KAAA,EACA,QAAA,EACA,MAAA,EACM;AACN,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AACvC,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AACvC,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AAEvC,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AACvC,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AACvC,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AAEvC,IAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA;AACjC,IAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA;AACjC,IAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA;AAAA,EACnC;AAAA,EAEA,wBAAwB,KAAA,EAAoB;AAC1C,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAA8B;AACvD,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AAEzC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,GAAA,CAAI,UAAU,MAAM,CAAA;AAAA,IACnC;AAEA,IAAA,KAAA,MAAW,SAAS,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC5C,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,EAAU,QAAA;AACjC,MAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,CAAC,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA,EAAG;AAC9D,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,CAAA,IAAK,YAAA,CAAa,SAAQ,EAAG;AACvD,MAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,QAAQ,CAAA,EAAG,KAAA;AAC/D,MAAA,MAAM,eACJ,OAAO,cAAA,KAAmB,WACtB,YAAA,CAAa,GAAA,CAAI,cAAc,CAAA,GAC/B,MAAA;AAEN,MAAA,IAAI,YAAA,IAAgB,iBAAiB,MAAA,EAAQ;AAC3C,QAAA,IAAI,MAAA,CAAO,WAAW,YAAA,EAAc;AAElC,UAAA,YAAA,CAAa,IAAI,MAAM,CAAA;AACvB,UAAA,MAAA,CAAO,kBAAkB,IAAI,CAAA;AAAA,QAC/B;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,KAAA,EAAO;AAEhC,QAAA,IAAA,CAAK,KAAA,CAAM,IAAI,MAAM,CAAA;AACrB,QAAA,MAAA,CAAO,kBAAkB,IAAI,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,EAAoB;AACzB,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,EAAG;AAChD,MAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAO,CAAA;AACpE,MAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAAA,EACpC;AACF,CAAA;AA9SyD,MAAA,CAAA,uBAAA,EAAA,wBAAA,CAAA;AAAlD,IAAM,sBAAA,GAAN;;;AClFA,IAAM,sBAAA,GAAN,MAAM,sBAAA,CAA8C;AAAA,EASvD,WAAA,CACI,MACA,IAAA,EACA,SAAA,GAAqC,EAAC,EACtC,IAAA,GAAO,KAAA,EACP,MAAA,GAAwB,IAAA,EAC1B;AAVF,IAAA,IAAA,CAAA,SAAA,GAAY,KAAA;AACZ,IAAA,IAAA,CAAA,QAAA,GAAW,KAAA;AAUP,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACb,OAAA,EAAS,SAAA,CAAU,OAAA,KAAY,MAAM;AAAA,MAAC,CAAA,CAAA;AAAA,MACtC,SAAA,EAAW,SAAA,CAAU,SAAA,KAAc,MAAM;AAAA,MAAC,CAAA,CAAA;AAAA,MAC1C,KAAA,EAAO,SAAA,CAAU,KAAA,KAAU,MAAM;AAAA,MAAC,CAAA;AAAA,KACtC;AAAA,EACJ;AAAA,EAEA,aAAa,SAAA,EAA0C;AACnD,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACb,OAAA,EAAS,SAAA,CAAU,OAAA,IAAW,IAAA,CAAK,SAAA,CAAU,OAAA;AAAA,MAC7C,SAAA,EAAW,SAAA,CAAU,SAAA,IAAa,IAAA,CAAK,SAAA,CAAU,SAAA;AAAA,MACjD,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU;AAAA,KAC7C;AAAA,EACJ;AAAA,EAEA,QAAQ,IAAA,EAAqB;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EAChB;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EAC3B;AAAA,EAEA,SAAA,GAAkB;AACd,IAAA,IAAA,CAAK,UAAU,SAAA,EAAU;AAAA,EAC7B;AAAA,EAEA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAEhB,IAAA,IAAI,CAAC,UAAA,EAAY;AACb,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACnB;AAAA,EAEA,KAAA,GAAc;AACV,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACjB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,QAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAEhB,IAAA,IAAI,eAAA,EAAiB;AACjB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACf;AAAA,EACJ;AACJ,CAAA;AAjF2D,MAAA,CAAA,sBAAA,EAAA,uBAAA,CAAA;AAApD,IAAM,qBAAA,GAAN,sBAAA;AAmFA,IAAM,sBAAA,GAAN,MAAM,sBAAA,CAAsB;AAAA,EAA5B,WAAA,GAAA;AACH,IAAA,IAAA,CAAiB,MAAA,uBAAa,GAAA,EAAmC;AACjE,IAAA,IAAA,CAAQ,WAAA,GAA4C,IAAA;AAAA,EAAA;AAAA,EAEpD,SAAS,KAAA,EAAqD;AAC1D,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AACjC,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,WAAA,CACI,MACA,IAAA,EACA,SAAA,GAAqC,EAAC,EACtC,IAAA,GAAO,KAAA,EACP,MAAA,GAAwB,IAAA,EACH;AACrB,IAAA,MAAM,QAAQ,IAAI,qBAAA,CAAsB,MAAM,IAAA,EAAM,SAAA,EAAW,MAAM,MAAM,CAAA;AAC3E,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAC3B,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,YAAY,IAAA,EAAuB;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,IAAA,KAAS,IAAA,EAAM;AACjC,MAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AACtB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACvB;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,SAAS,IAAA,EAA4C;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EACpC;AAAA,EAEA,SAAS,IAAA,EAAuB;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,UAAA,GAAsC;AAClC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,cAAA,GAA+C;AAC3C,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA,EAEA,WAAA,CAAY,IAAA,EAAc,QAAA,GAAW,IAAA,EAAoC;AACrE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,KAAgB,IAAA,EAAM;AAC/C,MAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,IAC1B;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,UAAU,IAAA,EAAwB;AAC9B,IAAA,MAAM,QAAQ,IAAA,GAAO,IAAA,CAAK,YAAY,IAAA,EAAM,KAAK,IAAI,IAAA,CAAK,WAAA;AAC1D,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,KAAA,CAAM,IAAA,EAAK;AACX,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,WAAW,IAAA,EAAwB;AAC/B,IAAA,MAAM,QAAQ,IAAA,GAAO,IAAA,CAAK,OAAO,GAAA,CAAI,IAAI,IAAI,IAAA,CAAK,WAAA;AAClD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,UAAU,IAAA,EAAwB;AAC9B,IAAA,MAAM,QAAQ,IAAA,GAAO,IAAA,CAAK,OAAO,GAAA,CAAI,IAAI,IAAI,IAAA,CAAK,WAAA;AAClD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,KAAA,CAAM,IAAA,EAAK;AACX,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAa,SAAS,IAAA,EAAM;AAC1C,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACvB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACvB;AACJ,CAAA;AA5GmC,MAAA,CAAA,sBAAA,EAAA,uBAAA,CAAA;AAA5B,IAAM,qBAAA,GAAN,sBAAA;;;ACpCA,IAAM,mBAAA,GAAN,MAAM,mBAAA,SAA2B,SAAA,CAAU;AAAA,EA+BhD,WAAA,CAAY,OAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,GAAI,CAAC,GAAG,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAC;AACvE,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,QAAA,uBAAe,GAAA,EAAiC;AACrD,IAAA,IAAA,CAAK,eAAA,uBAAsB,GAAA,EAAuC;AAClE,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,sBAAsB,EAAC;AAE5B,IAAA,IAAA,CAAK,sBAAA,CAAuB,OAAA,CAAQ,mBAAA,IAAuB,EAAE,CAAA;AAC7D,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAExB,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AAChC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,KAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,CAAA;AACtC,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,CAAA;AAEtD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,qBAAA,EAAsB;AAC9C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,UAAA,EAAW;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,cAAA,EAAe;AAC/C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,MAAA,EAAQ,IAAA,IAAQ,IAAA;AAE5C,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,CAAQ,MAAM,KAAK,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC9D,MAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,QAAA,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA,EAAM,MAAM,IAAA,EAAM,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAOA,IAAA,IAAI,OAAO,OAAA,CAAQ,WAAA,KAAgB,YAAY,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AAC7E,MAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,WAAA,EAAa,CAAC,KAAK,MAAM,CAAA;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,MAAM,UAAuC,EAAC;AAC9C,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAiC;AACtD,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAuC;AAEnE,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,KAAK,IAAA,CAAK,UAAA,CAAW,SAAQ,EAAG;AACrD,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAC9D,IAAA,CAAK,IAAA,GACL,CAAA,KAAA,EAAQ,QAAQ,CAAC,CAAA,CAAA;AACrB,MAAA,MAAM,EAAA,GAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACjC,MAAA,MAAM,KAAA,GAAA,CAAS,UAAA,CAAW,GAAA,CAAI,IAAI,KAAK,CAAA,IAAK,CAAA;AAC5C,MAAA,UAAA,CAAW,GAAA,CAAI,MAAM,KAAK,CAAA;AAE1B,MAAA,MAAM,KAAA,GAAmC;AAAA,QACvC,EAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAO,KAAA,GAAQ,CAAA,GAAI,GAAG,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAA,GAAM,IAAA;AAAA,QAC1C,IAAA;AAAA,QACA,MAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACb;AAEA,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,IAAI,CAAA;AACrB,MAAA,eAAA,CAAgB,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,IAC/B;AAEA,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,IAAA,CAAK,aAAA,CAAc,SAAQ,EAAG;AAC5D,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAC9D,IAAA,CAAK,IAAA,GACL,CAAA,KAAA,EAAQ,QAAQ,CAAC,CAAA,CAAA;AACrB,MAAA,MAAM,YAAY,QAAA,CAAS,SAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACpC,MAAA,MAAM,KAAA,GAAA,CAAS,UAAA,CAAW,GAAA,CAAI,IAAI,KAAK,CAAA,IAAK,CAAA;AAC5C,MAAA,UAAA,CAAW,GAAA,CAAI,MAAM,KAAK,CAAA;AAE1B,MAAA,MAAM,YAAA,GAAe,YACjB,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,MAAS,SAAA,GAC9B,UAAA;AAEJ,MAAA,MAAM,KAAA,GAAmC;AAAA,QACvC,EAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA,EACE,KAAA,GAAQ,CAAA,GACJ,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,SAAA,EAAO,YAAY,CAAA,CAAA,GACpC,CAAA,EAAG,IAAI,WAAM,YAAY,CAAA,CAAA;AAAA,QAC/B,IAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR;AAAA,OACF;AAEA,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,IAAI,CAAA;AACrB,MAAA,eAAA,CAAgB,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAAA,EACzD;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,UAAA,EAAW;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,cAAA,EAAe;AAC/C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,MAAA,EAAQ,IAAA,IAAQ,IAAA;AAAA,EAC9C;AAAA,EAEQ,eAAe,OAAA,EAAmE;AACxF,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,IACnC;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,OAAO,CAAA;AACtE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EAC5C;AAAA,EAEA,cAAc,KAAA,EAAoC;AAChD,IAAA,IAAA,CAAK,UAAA,GAAa,MAAM,OAAA,CAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,CAAA,GAAI,EAAC;AACvD,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAEA,iBACE,KAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA,CAClB,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,MAAA,IAAI,iBAAuBC,kBAAA,CAAA,aAAA,EAAe;AACxC,QAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,IAAA,EAAK;AAAA,MACxC;AAEA,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,SAAA,GAAY,KAAA;AAClB,MAAA,IAAI,EAAE,SAAA,CAAU,IAAA,YAAsBA,kBAAA,CAAA,aAAA,CAAA,EAAgB;AACpD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,SAAA,EACE,OAAO,SAAA,CAAU,SAAA,KAAc,QAAA,IAAY,UAAU,SAAA,CAAU,MAAA,GAAS,CAAA,GACpE,SAAA,CAAU,SAAA,GACV;AAAA,OACR;AAAA,IACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,KAAA,KAAsC,UAAU,IAAI,CAAA;AAE/D,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAEA,uBAAuB,OAAA,EAAyB;AAC9C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,sBAAsB,EAAC;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,MAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,MAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,mBAAA,GAAsB,UAAA;AAAA,EAC7B;AAAA,EAEA,QAAA,CAAS,IAAA,EAAc,OAAA,EAAiB,IAAA,GAAO,KAAA,EAAqC;AAClF,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAC5C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,EAAC,EAAG,IAAA,EAAM,QAAA,CAAS,EAAE,CAAA;AACtF,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsF;AAC9F,IAAA,MAAM,iBAAiB,IAAA,CAAK,eAAA;AAC5B,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAExB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,EAAG;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,YAAA,GAA6C,IAAA;AAEjD,MAAA,IAAI,OAAO,MAAM,MAAA,KAAW,QAAA,IAAY,MAAM,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,EAAG;AACtE,QAAA,YAAA,GAAe,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA,EAAM,MAAM,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,MAC5E;AAEA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,IAAA,CAAK,QAAA,CAAS,MAAM,IAAA,EAAM,KAAA,CAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,cAAA,EAAgB,CAAC,KAAK,MAAM,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA,EAEA,eAAA,GAA+F;AAC7F,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACjC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,IAAA,EAAM,MAAM,IAAA,CAAK,IAAA;AAAA,MACjB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,MAAM,KAAA,CAAM;AAAA,KACd,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,cAAA,CAAe,IAAA,EAAqB,QAAA,GAAW,IAAA,EAAe;AAC5D,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAA,EAAU;AAC5C,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEA,YAAY,IAAA,EAAuB;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,IAAI,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,WAAA,CAAY,IAAA,EAAc,QAAA,GAAW,IAAA,EAAe;AAClD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,MAAM,QAAQ,CAAA;AAC1D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAA,CAAM,SAAA;AACrB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,IAAA,EAAwB;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,IAAA,EAAwB;AACjC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,IAAA,EAAwB;AAChC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,IAAI,CAAA;AAChD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAvVkD,MAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAA3C,IAAM,kBAAA,GAAN,mBAAA;AC7BP,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAM,mBAAA,GAAsB,CAAA;AAC5B,IAAM,iBAAA,GAAoB,CAAA;AAC1B,IAAM,oBAAA,GAAuB,EAAA;AAC7B,IAAM,YAAA,GAAe,CAAA;AAErB,SAAS,gBAAgB,MAAA,EAAoD;AAC3E,EAAA,IAAI,kBAAwBC,kBAAA,CAAA,kBAAA,EAAoB;AAC9C,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,OAAO,aAAA;AACT;AANS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAQT,SAAS,eAAe,MAAA,EAAiD;AACvE,EAAA,IACE,MAAA,IACA,MAAA,IAAU,MAAA,IACV,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IACvB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,EAC3B;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,IAAA;AACT;AAXS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAaT,SAAS,cAAc,MAAA,EAAiD;AACtE,EAAA,IACE,MAAA,IACA,KAAA,IAAS,MAAA,IACT,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,IACtB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,EAC1B;AACA,IAAA,OAAO,MAAA,CAAO,GAAA;AAAA,EAChB;AAEA,EAAA,OAAO,IAAA;AACT;AAXS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAaT,SAAS,SAAS,MAAA,EAA0C;AAC1D,EAAA,IAAI,kBAAwBA,kBAAA,CAAA,iBAAA,IAAqB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,EAAG;AAC5E,IAAA,OAAO,MAAA,CAAO,GAAA;AAAA,EAChB;AAEA,EAAA,OAAO,WAAA;AACT;AANS,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAQT,SAAS,UAAU,MAAA,EAA0C;AAC3D,EAAA,MAAM,IAAA,GAAO,eAAe,MAAM,CAAA;AAClC,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,YAAA;AACT;AAPS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAST,SAAS,SAAS,MAAA,EAA0C;AAC1D,EAAA,MAAM,GAAA,GAAM,cAAc,MAAM,CAAA;AAChC,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,WAAA;AACT;AAPS,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAST,SAAS,eAAe,MAAA,EAA0C;AAChE,EAAA,IAAI,kBAAwBA,kBAAA,CAAA,kBAAA,IAAsB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9E,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,kBAAA;AACT;AANS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAQT,SAAS,gBAAgB,MAAA,EAA0C;AACjE,EAAA,IAAI,kBAAwBA,kBAAA,CAAA,kBAAA,IAAsB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,EAAG;AAC/E,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AAEA,EAAA,OAAO,mBAAA;AACT;AANS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAQT,SAAS,cAAc,MAAA,EAA0C;AAC/D,EAAA,IAAI,kBAAwBA,kBAAA,CAAA,kBAAA,IAAsB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,EAAG;AAC7E,IAAA,OAAO,MAAA,CAAO,GAAA;AAAA,EAChB;AAEA,EAAA,OAAO,iBAAA;AACT;AANS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAQT,SAAS,iBAAiB,MAAA,EAA0C;AAClE,EAAA,IAAI,kBAAwBA,kBAAA,CAAA,kBAAA,IAAsB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG;AAChF,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAEA,EAAA,OAAO,oBAAA;AACT;AANS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAQT,SAAS,UAAU,MAAA,EAA0C;AAC3D,EAAA,IACE,MAAA,IACA,MAAA,IAAU,MAAA,IACV,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IACvB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,EAC3B;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,YAAA;AACT;AAXS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAqBF,IAAM,gBAAA,GAAN,MAAM,gBAAA,SAAwB,SAAA,CAAU;AAAA,EA0B7C,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAUA,kBAAA,CAAA,iBAAA,EAAkB;AAC5D,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,IAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,OAAO,OAAA,CAAQ,SAAA,KAAc,SAAA,GAAY,QAAQ,SAAA,GAAY,KAAA;AAC9E,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,eAAA,CAAgB,QAAQ,MAAM,CAAA;AACtE,IAAA,IAAA,CAAK,GAAA,GACH,OAAO,OAAA,CAAQ,GAAA,KAAQ,YAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,GAC1D,OAAA,CAAQ,GAAA,GACR,QAAA,CAAS,QAAQ,MAAM,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GACH,OAAO,OAAA,CAAQ,IAAA,KAAS,YAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,GAC9D,OAAA,CAAQ,IAAA,GACR,SAAA,CAAU,QAAQ,MAAM,CAAA;AAC5B,IAAA,IAAA,CAAK,GAAA,GACH,OAAO,OAAA,CAAQ,GAAA,KAAQ,YAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,GAC1D,OAAA,CAAQ,GAAA,GACR,QAAA,CAAS,QAAQ,MAAM,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GACH,OAAO,OAAA,CAAQ,IAAA,KAAS,YAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,GAC5D,OAAA,CAAQ,IAAA,GACR,cAAA,CAAe,QAAQ,MAAM,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GACH,OAAO,OAAA,CAAQ,KAAA,KAAU,YAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAC9D,OAAA,CAAQ,KAAA,GACR,eAAA,CAAgB,QAAQ,MAAM,CAAA;AACpC,IAAA,IAAA,CAAK,GAAA,GACH,OAAO,OAAA,CAAQ,GAAA,KAAQ,YAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,GAC1D,OAAA,CAAQ,GAAA,GACR,aAAA,CAAc,QAAQ,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,GACH,OAAO,OAAA,CAAQ,MAAA,KAAW,YAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA,GAChE,OAAA,CAAQ,MAAA,GACR,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,GACH,OAAO,OAAA,CAAQ,IAAA,KAAS,YAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,GAC5D,OAAA,CAAQ,IAAA,GACR,SAAA,CAAU,QAAQ,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAlE+C,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAAxC,IAAM,eAAA,GAAN,gBAAA;;;AC5JP,IAAM,qBAAA,GAAwB;AAAA,EAC5B,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM,KAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,UAAA,EAAY,KAAA;AAAA,EACZ,WAAA,EAAa,CAAA;AAAA,EACb,aAAA,EAAe,SAAA;AAAA,EACf,aAAA,EAAe;AACjB,CAAA;AAUO,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,SAAA,CAAU;AAAA,EAqC5C,WAAA,CACE,IAAA,EACA,OAAA,GAAiD,EAAC,EAClD;AACA,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,GAAG,qBAAA;AAAA,MACH,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAIb,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,WAAA,EAAa;AAAA,MACvC,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,UAAA,EAAY;AAAA,MACtC,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AACF,CAAA;AA9F8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAvC,IAAM,cAAA,GAAN,eAAA;;;AC8CA,IAAM,yBAAA,GAA8C;AAAA,EACzD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,SAAS,CAAA;AAAA,MACxC,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,GAAA,EAAK;AAAA,KACP;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG,KAAA;AAAA,IACH,CAAA,EAAG;AAAA,GACL;AAAA,EACA,aAAA,EAAe;AACjB,CAAA;AAEA,SAAS,gBAAgB,MAAA,EAA2B;AAClD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAO,CAAC,GAAG,yBAAA,CAA0B,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,aAAa,MAAA,CAAO,MAAA;AAAA,IACxB,CAAC,KAAA,KAA2B,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,MAAA,GAAS;AAAA,GAC1E;AACA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,CAAC,GAAG,yBAAA,CAA0B,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,UAAA;AACT;AAbS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAeT,SAAS,wBAAwB,KAAA,EAA2C;AAC1E,EAAA,IAAI,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,QAAA,IAAY,UAAU,SAAA,EAAW;AACnE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,yBAAA,CAA0B,OAAO,QAAA,CAAS,MAAA;AACnD;AANS,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AAQT,SAAS,oBAAoB,KAAA,EAAuC;AAClE,EAAA,IAAI,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,OAAA,IAAW,UAAU,MAAA,EAAQ;AACjE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,OAAA,EAAS;AAC1C,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,0BAA0B,MAAA,CAAO,IAAA;AAC1C;AAVS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAYT,SAAS,iBAAiB,KAAA,EAAoC;AAC5D,EAAA,IAAI,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,aAAA,IAAiB,UAAU,MAAA,EAAQ;AACrE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,0BAA0B,GAAA,CAAI,IAAA;AACvC;AANS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAQT,SAAS,cAAA,CAAe,OAAgB,QAAA,EAA0B;AAChE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACxD,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AANS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAmBF,IAAM,YAAA,GAAN,MAAM,YAAA,SAAoB,SAAA,CAAU;AAAA,EAIzC,YAAY,MAAA,EAAoC;AAC9C,IAAA,KAAA,EAAM;AAEN,IAAA,MAAM,SAAS,MAAA,EAAQ,MAAA;AACvB,IAAA,MAAM,MAAM,MAAA,EAAQ,GAAA;AACpB,IAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,mBAAA,CAAoB,MAAA,EAAQ,IAAI,CAAA;AAAA,QACtC,KAAA,EACE,OAAO,MAAA,EAAQ,KAAA,KAAU,WACrB,MAAA,CAAO,KAAA,GACP,0BAA0B,MAAA,CAAO,KAAA;AAAA,QACvC,QAAA,EACE,OAAO,MAAA,EAAQ,QAAA,KAAa,WACxB,MAAA,CAAO,QAAA,GACP,0BAA0B,MAAA,CAAO,QAAA;AAAA,QACvC,QAAA,EAAU;AAAA,UACR,MAAA,EAAQ,eAAA,CAAgB,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,UAChD,MAAA,EAAQ,uBAAA,CAAwB,MAAA,EAAQ,QAAA,EAAU,MAAM;AAAA;AAC1D,OACF;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,gBAAA,CAAiB,GAAA,EAAK,IAAI,CAAA;AAAA,QAChC,KAAA,EACE,OAAO,GAAA,EAAK,KAAA,KAAU,WAClB,GAAA,CAAI,KAAA,GACJ,0BAA0B,GAAA,CAAI,KAAA;AAAA,QACpC,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,cAAA;AAAA,YACJ,KAAK,MAAA,EAAQ,IAAA;AAAA,YACb,yBAAA,CAA0B,IAAI,MAAA,CAAO;AAAA,WACvC;AAAA,UACA,GAAA,EAAK,cAAA;AAAA,YACH,KAAK,MAAA,EAAQ,GAAA;AAAA,YACb,yBAAA,CAA0B,IAAI,MAAA,CAAO;AAAA;AACvC,SACF;AAAA,QACA,WAAA,EAAa;AAAA,UACX,OAAA,EAAS,cAAA;AAAA,YACP,KAAK,WAAA,EAAa,OAAA;AAAA,YAClB,yBAAA,CAA0B,IAAI,WAAA,CAAY;AAAA;AAC5C;AACF,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,cAAA,CAAe,OAAA,EAAS,CAAA,EAAG,yBAAA,CAA0B,QAAQ,CAAC,CAAA;AAAA,QACjE,GAAG,cAAA,CAAe,OAAA,EAAS,CAAA,EAAG,yBAAA,CAA0B,QAAQ,CAAC,CAAA;AAAA,QACjE,GAAG,cAAA,CAAe,OAAA,EAAS,CAAA,EAAG,yBAAA,CAA0B,QAAQ,CAAC;AAAA,OACnE;AAAA,MACA,aAAA,EAAe,cAAA;AAAA,QACb,MAAA,EAAQ,aAAA;AAAA,QACR,yBAAA,CAA0B;AAAA;AAC5B,KACF;AAAA,EACF;AACF,CAAA;AA5D2C,MAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAApC,IAAM,WAAA,GAAN,YAAA;;;ACtBA,IAAM,4BAAA,GAAoD;AAAA,EAC/D,WAAA,EAAa,KAAA;AAAA,EACb,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,WAAA,EAAa,KAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW,GAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,KAAA;AAAA,IACT,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,GAAA,EAAK,IAAA;AAAA,IACL,UAAA,EAAY;AAAA,GACd;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,KAAA;AAAA,IACT,SAAA,EAAW,GAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,KAAA;AAAA,IACT,cAAA,EAAgB,GAAA;AAAA,IAChB,cAAA,EAAgB,IAAA;AAAA,IAGhB,aAAA,EAAe,MAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe,MAAA;AAAA,IAEf,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,MAAA;AAAA,IAEV,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,MAER;AACF,CAAA;AAEA,SAAS,SAAS,KAAA,EAAgD;AAChE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AANS,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAQT,SAASC,eAAAA,CAAe,OAAgB,QAAA,EAA0B;AAChE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACxD,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AANS,MAAA,CAAAA,eAAAA,EAAA,gBAAA,CAAA;AAQT,SAAS,SAAA,CAAU,OAAgB,QAAA,EAA4B;AAC7D,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AANS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAQT,SAAS,qBAAqB,KAAA,EAA8C;AAC1E,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IACE,OAAO,MAAM,CAAC,CAAA,KAAM,YACpB,CAAC,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,KACzB,OAAO,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,IACpB,CAAC,OAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA,EACzB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5B;AAfS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAiBT,SAAS,wBACP,KAAA,EACqB;AACrB,EAAA,MAAM,cAAA,GAAiB,SAAS,KAAK,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,4BAAA;AAEjB,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,cAAA,EAAgB,GAAG,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,cAAA,EAAgB,KAAK,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,EAAgB,QAAQ,CAAA;AAClD,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,cAAA,EAAgB,eAAe,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,cAAA,EAAgB,KAAK,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,cAAA,EAAgB,UAAU,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,cAAA,EAAgB,WAAW,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,cAAA,EAAgB,aAAa,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,cAAA,EAAgB,KAAK,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,cAAA,EAAgB,IAAI,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,cAAA,EAAgB,IAAI,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,cAAA,EAAgB,SAAS,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,cAAA,EAAgB,MAAM,CAAA;AAC9C,EAAA,MAAM,+BAAA,GAAkC,QAAA;AAAA,IACtC,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,MAAA,EAAQ,QAAQ,CAAA;AAEhD,EAAA,MAAM,cAAA,GAAiBA,eAAAA;AAAA,IACrB,SAAA,EAAW,cAAA;AAAA,IACX,SAAS,SAAA,CAAU;AAAA,GACrB;AACA,EAAA,MAAM,cAAA,GAAiBA,eAAAA;AAAA,IACrB,SAAA,EAAW,cAAA;AAAA,IACX,SAAS,SAAA,CAAU;AAAA,GACrB;AAEA,EAAA,MAAM,2BACJ,OAAO,MAAA,EAAQ,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,GACnE,OAAO,QAAA,GACP,cAAA,IACE,OAAO,cAAA,CAAe,CAAA,KAAM,YAC5B,MAAA,CAAO,QAAA,CAAS,cAAA,CAAe,CAAC,KAChC,OAAO,cAAA,CAAe,CAAA,KAAM,QAAA,IAC5B,OAAO,QAAA,CAAS,cAAA,CAAe,CAAC,CAAA,GAChC,EAAE,CAAA,EAAG,cAAA,CAAe,GAAG,CAAA,EAAG,cAAA,CAAe,GAAE,GAC3C,MAAA;AAER,EAAA,MAAM,yCAAA,GACJ,qBAAqB,MAAA,EAAQ,yBAAyB,MACrD,+BAAA,IACD,OAAO,+BAAA,CAAgC,CAAA,KAAM,QAAA,IAC7C,MAAA,CAAO,SAAS,+BAAA,CAAgC,CAAC,CAAA,IACjD,OAAO,+BAAA,CAAgC,CAAA,KAAM,YAC7C,MAAA,CAAO,QAAA,CAAS,+BAAA,CAAgC,CAAC,CAAA,GAC7C;AAAA,IACE,GAAG,+BAAA,CAAgC,CAAA;AAAA,IACnC,GAAG,+BAAA,CAAgC;AAAA,GACrC,GACA,MAAA,CAAA;AAEN,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,SAAA,CAAU,cAAA,EAAgB,WAAA,EAAa,SAAS,WAAW,CAAA;AAAA,IACxE,GAAA,EAAK;AAAA,MACH,SAAS,SAAA,CAAU,GAAA,EAAK,OAAA,EAAS,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,MACrD,eAAeA,eAAAA,CAAe,GAAA,EAAK,aAAA,EAAe,QAAA,CAAS,IAAI,aAAa,CAAA;AAAA,MAC5E,aAAaA,eAAAA,CAAe,GAAA,EAAK,WAAA,EAAa,QAAA,CAAS,IAAI,WAAW,CAAA;AAAA,MACtE,YAAYA,eAAAA,CAAe,GAAA,EAAK,UAAA,EAAY,QAAA,CAAS,IAAI,UAAU;AAAA,KACrE;AAAA,IACA,KAAA,EAAO;AAAA,MACL,SAAS,SAAA,CAAU,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,MAAM,OAAO,CAAA;AAAA,MACzD,WAAWA,eAAAA,CAAe,KAAA,EAAO,SAAA,EAAW,QAAA,CAAS,MAAM,SAAS,CAAA;AAAA,MACpE,WAAWA,eAAAA,CAAe,KAAA,EAAO,SAAA,EAAW,QAAA,CAAS,MAAM,SAAS,CAAA;AAAA,MACpE,QAAQA,eAAAA,CAAe,KAAA,EAAO,MAAA,EAAQ,QAAA,CAAS,MAAM,MAAM;AAAA,KAC7D;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAS,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,MAC/D,QAAQA,eAAAA,CAAe,QAAA,EAAU,MAAA,EAAQ,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,MACjE,UAAUA,eAAAA,CAAe,QAAA,EAAU,QAAA,EAAU,QAAA,CAAS,SAAS,QAAQ;AAAA,KACzE;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,SAAS,SAAA,CAAU,eAAA,EAAiB,OAAA,EAAS,QAAA,CAAS,gBAAgB,OAAO,CAAA;AAAA,MAC7E,SAASA,eAAAA,CAAe,eAAA,EAAiB,OAAA,EAAS,QAAA,CAAS,gBAAgB,OAAO,CAAA;AAAA,MAClF,SAASA,eAAAA,CAAe,eAAA,EAAiB,OAAA,EAAS,QAAA,CAAS,gBAAgB,OAAO;AAAA,KACpF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,SAAS,SAAA,CAAU,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,MAAM,OAAO,CAAA;AAAA,MACzD,SAASA,eAAAA,CAAe,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,MAAM,OAAO;AAAA,KAChE;AAAA,IACA,UAAA,EAAY;AAAA,MACV,SAAS,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,MACnE,aAAaA,eAAAA,CAAe,UAAA,EAAY,WAAA,EAAa,QAAA,CAAS,WAAW,WAAW;AAAA,KACtF;AAAA,IACA,WAAA,EAAa;AAAA,MACX,SAAS,SAAA,CAAU,WAAA,EAAa,OAAA,EAAS,QAAA,CAAS,YAAY,OAAO,CAAA;AAAA,MACrE,UAAUA,eAAAA,CAAe,WAAA,EAAa,QAAA,EAAU,QAAA,CAAS,YAAY,QAAQ;AAAA,KAC/E;AAAA,IACA,aAAA,EAAe;AAAA,MACb,SAAS,SAAA,CAAU,aAAA,EAAe,OAAA,EAAS,QAAA,CAAS,cAAc,OAAO,CAAA;AAAA,MACzE,KAAKA,eAAAA,CAAe,aAAA,EAAe,GAAA,EAAK,QAAA,CAAS,cAAc,GAAG,CAAA;AAAA,MAClE,UAAA,EAAYA,eAAAA;AAAA,QACV,aAAA,EAAe,UAAA;AAAA,QACf,SAAS,aAAA,CAAc;AAAA;AACzB,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,SAAS,SAAA,CAAU,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,MAAM,OAAO,CAAA;AAAA,MACzD,WAAWA,eAAAA,CAAe,KAAA,EAAO,SAAA,EAAW,QAAA,CAAS,MAAM,SAAS;AAAA,KACtE;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAS,SAAA,CAAU,IAAA,EAAM,OAAA,EAAS,QAAA,CAAS,KAAK,OAAO;AAAA,KACzD;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAS,SAAA,CAAU,IAAA,EAAM,OAAA,EAAS,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,MACvD,WAAWA,eAAAA,CAAe,IAAA,EAAM,SAAA,EAAW,QAAA,CAAS,KAAK,SAAS,CAAA;AAAA,MAClE,QAAQA,eAAAA,CAAe,IAAA,EAAM,MAAA,EAAQ,QAAA,CAAS,KAAK,MAAM;AAAA,KAC3D;AAAA,IACA,SAAA,EAAW;AAAA,MACT,SAAS,SAAA,CAAU,SAAA,EAAW,OAAA,EAAS,QAAA,CAAS,UAAU,OAAO,CAAA;AAAA,MACjE,cAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA,EAAOA,eAAAA,CAAe,SAAA,EAAW,KAAA,EAAO,cAAc,CAAA;AAAA,MACtD,KAAA,EAAOA,eAAAA,CAAe,SAAA,EAAW,KAAA,EAAO,cAAc,CAAA;AAAA,MACtD,aAAA,EACE,OAAO,SAAA,EAAW,aAAA,KAAkB,QAAA,IACpC,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,aAAa,CAAA,GACnC,SAAA,CAAU,aAAA,GACV,SAAS,SAAA,CAAU,aAAA;AAAA,MACzB,OAAA,EACE,OAAO,SAAA,EAAW,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,OAAO,CAAA,GACvE,SAAA,CAAU,OAAA,GACV,SAAS,SAAA,CAAU;AAAA,KAC3B;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAS,SAAA,CAAU,MAAA,EAAQ,OAAA,EAAS,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,MAC3D,aAAA,EACE,OAAO,MAAA,EAAQ,aAAA,KAAkB,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,aAAa,CAAA,GAC7E,MAAA,CAAO,aAAA,GACP,SAAS,MAAA,CAAO,aAAA;AAAA,MACtB,yBAAA,EACE,yCAAA;AAAA,MACF,OAAO,oBAAA,CAAqB,MAAA,EAAQ,KAAK,CAAA,IAAK,SAAS,MAAA,CAAO,KAAA;AAAA,MAC9D,UAAU,oBAAA,CAAqB,MAAA,EAAQ,QAAQ,CAAA,IAAK,SAAS,MAAA,CAAO,QAAA;AAAA,MACpE,QAAA,EAAU,wBAAA;AAAA,MACV,MAAA,EACE,OAAO,MAAA,EAAQ,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,GAC/D,MAAA,CAAO,MAAA,GACP,SAAS,MAAA,CAAO,MAAA;AAAA,MACtB,OAAA,EACE,OAAO,MAAA,EAAQ,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,GACjE,MAAA,CAAO,OAAA,GACP,SAAS,MAAA,CAAO,OAAA;AAAA,MACtB,KAAA,EACE,OAAO,MAAA,EAAQ,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,GAC7D,MAAA,CAAO,KAAA,GACP,SAAS,MAAA,CAAO,KAAA;AAAA,MACtB,IAAA,EAAM,OAAO,MAAA,EAAQ,IAAA,KAAS,WAAW,MAAA,CAAO,IAAA,GAAO,SAAS,MAAA,CAAO,IAAA;AAAA,MACvE,QAAQ,SAAA,CAAU,MAAA,EAAQ,QAAkC,KAAK;AAAA;AACnE,GACF;AACF;AA5JS,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AA2KF,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,SAAA,CAAU;AAAA,EAI5C,YAAY,MAAA,EAAuC;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,wBAAwB,MAAM,CAAA;AAAA,EAC9C;AACF,CAAA;AAR8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAvC,IAAM,cAAA,GAAN,eAAA;ACjXA,IAAM,gCAAA,GAAiE;AAAA,EAC5E,OAAA,EAAS,EAAE,MAAA,EAAQ,GAAA,EAAK,QAAQ,CAAA,EAAE;AAAA,EAClC,MAAM,EAAE,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,EACtC,QAAA,EAAU,EAAE,MAAA,EAAQ,GAAA,EAAK,QAAQ,CAAA,EAAE;AAAA,EAEnC,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EACjC,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAA;AACpB,CAAA;AAEA,IAAM,qBAAA,GAAgE;AAAA,EACpE,OAAA,EAAS,iBAAA;AAAA,EACT,IAAA,EAAM,aAAA;AAAA,EACN,QAAA,EAAU,kBAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAUO,IAAM,sBAAA,GAAN,MAAM,sBAAA,SAA8B,SAAA,CAAU;AAAA,EAgBnD,WAAA,CACE,IAAA,EACA,MAAA,EACA,UAAA,EACA,OAAA,EAKA;AACA,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,sBAAsB,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,EAAA;AACvC,IAAA,IAAA,CAAK,UAAA,GAAa,SAAS,UAAA,IAAc,KAAA;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiB,KAAA;AAE/C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,MAAA;AACH,QAAA,IAAA,CAAK,UAAA,GAAa;AAAA,UAChB,GAAG,gCAAA,CAAiC,IAAA;AAAA,UACpC,GAAI;AAAA,SACN;AACA,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,UAAA,GAAa;AAAA,UAChB,GAAG,gCAAA,CAAiC,KAAA;AAAA,UACpC,GAAI;AAAA,SACN;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAA,CAAK,UAAA,GAAa;AAAA,UAChB,GAAG,gCAAA,CAAiC,MAAA;AAAA,UACpC,GAAI;AAAA,SACN;AACA,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAA,CAAK,UAAA,GAAa;AAAA,UAChB,GAAG,gCAAA,CAAiC,QAAA;AAAA,UACpC,GAAI;AAAA,SACN;AACA,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,IAAA,CAAK,UAAA,GAAa;AAAA,UAChB,GAAG,gCAAA,CAAiC,OAAA;AAAA,UACpC,GAAI;AAAA,SACN;AACA,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,aAAa,EAAC;AACnB,QAAA;AAAA;AACJ,EACF;AACF,CAAA;AAvEqD,MAAA,CAAA,sBAAA,EAAA,uBAAA,CAAA;AAA9C,IAAM,qBAAA,GAAN,sBAAA;;;AC/CA,IAAM,iCAAA,GAGT;AAAA,EACF,SAAS,gCAAA,CAAiC,OAAA;AAAA,EAC1C,MAAM,gCAAA,CAAiC,IAAA;AAAA,EACvC,UAAU,gCAAA,CAAiC,QAAA;AAAA,EAC3C,OAAO,gCAAA,CAAiC,IAAA;AAAA,EACxC,OAAO,gCAAA,CAAiC,KAAA;AAAA,EACxC,QAAQ,gCAAA,CAAiC;AAC3C,CAAA;AAaO,IAAM,uBAAA,GAAN,MAAM,uBAAA,SAA+B,SAAA,CAAU;AAAA,EA6BpD,WAAA,CACE,QAAA,GAA8B,MAAA,EAC9B,cAAA,EACA,OAAA,EAMA;AACA,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,EAAA;AACvC,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,GAAG,kCAAkC,QAAQ,CAAA;AAAA,MAC7C,GAAI,kBAAkB;AAAC,KACzB;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,SAAS,UAAA,IAAc,KAAA;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiB,KAAA;AAC/C,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAA,EAAS,iBAAA,IAAqB,EAAC;AACxD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,EACvB;AAAA;AAAA,EAGA,sBAAA,GAAiD;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,QAAA,mBAAW,MAAA,CAAA,CAAC,CAAA,EAAW,GAAA,KAC3B,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAC,IAAI,GAAA,EADzB,UAAA,CAAA;AAGjB,IAAA,QAAQ,KAAK,QAAA;AAAU,MACrB,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,IAAA,CAAK,cAAA;AACf,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAAA,UAChC,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,UAClC,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO;AAAA,SAClC;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,IAAA,CAAK,cAAA;AACf,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAAA,UAChC,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,OAAO;AAAA,SACpC;AAAA,MACF;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,IAAA,CAAK,cAAA;AACf,QAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,MAC/C;AAAA,MACA,KAAK,UAAA;AAAA,MACL,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,IAAA,CAAK,cAAA;AACf,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,UAClC,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,OAAO;AAAA,SACpC;AAAA,MACF;AAAA,MACA,KAAK,OAAA;AAEH,QAAA,OAAO,gCAAA,CAAiC,IAAA;AAAA;AAC5C,EACF;AACF,CAAA;AA5FsD,MAAA,CAAA,uBAAA,EAAA,wBAAA,CAAA;AAA/C,IAAM,sBAAA,GAAN,uBAAA;;;ACnDA,IAAM,sBAAA,GAAN,MAAM,sBAAA,SAA8B,SAAA,CAAU;AAAA,EAMnD,WAAA,CAAY,eAAuB,SAAA,EAAmB;AACpD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AACF,CAAA;AAXqD,MAAA,CAAA,sBAAA,EAAA,uBAAA,CAAA;AAA9C,IAAM,qBAAA,GAAN,sBAAA;;;AC8CA,IAAM,uBAAA,GAA0C;AAAA,EACrD,OAAA,EAAS,IAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,aAAA,EAAe,CAAA;AAAA,EACf,cAAA,EAAgB,CAAA;AAAA,EAChB,YAAA,EAAc,CAAA;AAAA,EACd,QAAA,EAAU,IAAA;AAAA,EACV,UAAA,EAAY,KAAA;AAAA,EACZ,gBAAA,EAAkB,KAAA;AAAA,EAIlB,aAAA,EAAe,KAIjB,CAAA;AA2DO,IAAM,sBAAA,GAAwC;AAAA,EACnD,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,cAAA,EAAgB;AAAA,IACd,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG;AAAA,GACL;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG;AAAA,GACL;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG;AAAA,GACL;AAAA,EACA,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,CAAA;AAAA,EACR,WAAA,EAAa,CAAA;AAAA,EACb,QAAA,EAAU,GAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAuBA,SAASC,UAAS,KAAA,EAAgD;AAChE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AALS,MAAA,CAAAA,SAAAA,EAAA,UAAA,CAAA;AAOT,SAASD,eAAAA,CAAe,OAAgB,QAAA,EAA0B;AAChE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACxD,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AALS,MAAA,CAAAA,eAAAA,EAAA,gBAAA,CAAA;AAOT,SAASE,UAAAA,CAAU,OAAgB,QAAA,EAA4B;AAC7D,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AALS,MAAA,CAAAA,UAAAA,EAAA,WAAA,CAAA;AAOT,SAAS,eAAA,CAAgB,OAAgB,QAAA,EAAwC;AAC/E,EAAA,IACE,UAAU,SAAA,IACV,KAAA,KAAU,WACV,KAAA,KAAU,mBAAA,IACV,UAAU,mBAAA,EACV;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA;AACT;AAVS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAYT,SAAS,eAAA,CAAgB,OAAgB,QAAA,EAAwC;AAC/E,EAAA,IACE,KAAA,KAAU,YACV,KAAA,KAAU,MAAA,IACV,UAAU,SAAA,IACV,KAAA,KAAU,UAAA,IACV,KAAA,KAAU,SAAA,EACV;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA;AACT;AAXS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAaT,SAAS,wBACP,KAAA,EACgB;AAChB,EAAA,MAAM,MAAA,GAASD,UAAS,KAAK,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,uBAAA;AAEjB,EAAA,MAAM,sBAAA,GAAyBC,UAAAA;AAAA,IAC7B,MAAA,EAAQ,gBAAA;AAAA,IACR,QAAA,CAAS;AAAA,GACX;AACA,EAAA,MAAM,mBAAA,GAAsBA,UAAAA;AAAA,IAC1B,MAAA,EAAQ,aAAA;AAAA,IACR,QAAA,CAAS;AAAA,GACX;AAEA,EAAA,MAAM,gBAAA,GAAmBA,UAAAA;AAAA,IACvB,MAAA,EAAQ,gBAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,gBAAA,GAAmBA,UAAAA;AAAA,IACvB,MAAA,EAAQ,gBAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,gBAAA,GAAmBA,UAAAA;AAAA,IACvB,MAAA,EAAQ,gBAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,aAAA,GAAgBA,UAAAA,CAAU,MAAA,EAAQ,aAAA,EAAe,mBAAmB,CAAA;AAC1E,EAAA,MAAM,aAAA,GAAgBA,UAAAA,CAAU,MAAA,EAAQ,aAAA,EAAe,mBAAmB,CAAA;AAC1E,EAAA,MAAM,aAAA,GAAgBA,UAAAA,CAAU,MAAA,EAAQ,aAAA,EAAe,mBAAmB,CAAA;AAE1E,EAAA,OAAO;AAAA,IACL,OAAA,EAASA,UAAAA,CAAU,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,IACpD,IAAA,EAAM,eAAA,CAAgB,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAI,CAAA;AAAA,IACjD,IAAA,EAAM,KAAK,GAAA,CAAI,IAAA,EAAQF,gBAAe,MAAA,EAAQ,IAAA,EAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAClE,eAAe,IAAA,CAAK,GAAA;AAAA,MAClB,CAAA;AAAA,MACAA,eAAAA,CAAe,MAAA,EAAQ,aAAA,EAAe,QAAA,CAAS,aAAa;AAAA,KAC9D;AAAA,IACA,gBAAgB,IAAA,CAAK,GAAA;AAAA,MACnB,CAAA;AAAA,MACAA,eAAAA,CAAe,MAAA,EAAQ,cAAA,EAAgB,QAAA,CAAS,cAAc;AAAA,KAChE;AAAA,IACA,YAAA,EAAcA,eAAAA,CAAe,MAAA,EAAQ,YAAA,EAAc,SAAS,YAAY,CAAA;AAAA,IACxE,QAAA,EAAUE,UAAAA,CAAU,MAAA,EAAQ,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,IACvD,UAAA,EAAYA,UAAAA,CAAU,MAAA,EAAQ,UAAA,EAAY,SAAS,UAAU,CAAA;AAAA,IAC7D,gBAAA,EAAkB,sBAAA;AAAA,IAClB,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA,EAAe,mBAAA;AAAA,IACf,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAvDS,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AAyDT,SAAS,uBACP,KAAA,EACe;AACf,EAAA,MAAM,MAAA,GAASD,UAAS,KAAK,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,sBAAA;AACjB,EAAA,MAAM,cAAA,GAAiBA,SAAAA,CAAS,MAAA,EAAQ,cAAc,CAAA;AACtD,EAAA,MAAM,cAAA,GAAiBA,SAAAA,CAAS,MAAA,EAAQ,cAAc,CAAA;AACtD,EAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,MAAA,EAAQ,IAAI,CAAA;AAElC,EAAA,OAAO;AAAA,IACL,OAAA,EAASC,UAAAA,CAAU,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,IACpD,KAAA,EAAO,eAAA,CAAgB,MAAA,EAAQ,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,IACpD,cAAA,EAAgB;AAAA,MACd,GAAGF,eAAAA,CAAe,cAAA,EAAgB,CAAA,EAAG,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,MAC9D,GAAGA,eAAAA,CAAe,cAAA,EAAgB,CAAA,EAAG,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,MAC9D,GAAGA,eAAAA,CAAe,cAAA,EAAgB,CAAA,EAAG,QAAA,CAAS,eAAe,CAAC;AAAA,KAChE;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,GAAGA,eAAAA,CAAe,cAAA,EAAgB,CAAA,EAAG,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,MAC9D,GAAGA,eAAAA,CAAe,cAAA,EAAgB,CAAA,EAAG,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,MAC9D,GAAGA,eAAAA,CAAe,cAAA,EAAgB,CAAA,EAAG,QAAA,CAAS,eAAe,CAAC;AAAA,KAChE;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,EAAQA,eAAAA,CAAe,MAAM,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAC5D,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,EAAQA,eAAAA,CAAe,MAAM,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAC5D,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,EAAQA,eAAAA,CAAe,MAAM,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC;AAAA,KAC9D;AAAA,IACA,MAAA,EAAQ,KAAK,GAAA,CAAI,IAAA,EAAQA,gBAAe,MAAA,EAAQ,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IACxE,MAAA,EAAQ,KAAK,GAAA,CAAI,IAAA,EAAQA,gBAAe,MAAA,EAAQ,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IACxE,WAAA,EAAa,KAAK,GAAA,CAAI,CAAA,EAAGA,gBAAe,MAAA,EAAQ,WAAA,EAAa,QAAA,CAAS,WAAW,CAAC,CAAA;AAAA,IAClF,QAAA,EAAU,KAAK,GAAA,CAAI,CAAA,EAAGA,gBAAe,MAAA,EAAQ,QAAA,EAAU,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,IACzE,QAAA,EAAUE,UAAAA,CAAU,MAAA,EAAQ,QAAA,EAAU,SAAS,QAAQ;AAAA,GACzD;AACF;AAjCS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAmCF,SAAS,sBACd,KAAA,EACc;AACd,EAAA,MAAM,MAAA,GAASD,UAAS,KAAK,CAAA;AAC7B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,uBAAA;AAAA,MACR,QAAQ,SAAA,IAAyC;AAAA,KACpD;AAAA,IACA,QAAA,EAAU,sBAAA;AAAA,MACP,QAAQ,QAAA,IAAuC;AAAA;AAClD,GACF;AACF;AAZgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAmDT,SAAS,iBAAA,CACd,SAAA,EACA,GAAA,EACA,KAAA,EAKM;AACN,EAAA,MAAA,CAAO,cAAA,CAAe,WAAW,GAAA,EAAK;AAAA,IACpC,KAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,YAAA,EAAc,IAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACb,CAAA;AACH;AAfgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAiBT,IAAM,iBAAA,GAAN,MAAM,iBAAA,SAAyB,SAAA,CAAU;AAAA,EAkB9C,YAAY,MAAA,EAAqF;AAC/F,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,sBAAsB,MAAM,CAAA;AAC1C,IAAA,iBAAA,CAAkB,IAAA,EAAM,aAAa,IAAI,CAAA;AACzC,IAAA,iBAAA,CAAkB,IAAA,EAAM,YAAY,IAAI,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,KAAA,EAAyF;AACjG,IAAA,IAAA,CAAK,SAAS,qBAAA,CAAsB;AAAA,MAClC,SAAA,EAAW,EAAE,GAAG,IAAA,CAAK,MAAA,CAAO,WAAW,GAAI,KAAA,CAAM,SAAA,IAAa,EAAC,EAAG;AAAA,MAClE,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,MAAA,CAAO,UAAU,GAAI,KAAA,CAAM,QAAA,IAAY,EAAC;AAAG,KAChE,CAAA;AAAA,EACH;AACF,CAAA;AAnCgD,MAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAAzC,IAAM,gBAAA,GAAN,iBAAA;;;ACtXA,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,SAAA,CAAU;AAAA,EAY5C,WAAA,CAAY,IAAA,EAAc,KAAA,GAAgB,CAAA,EAAG,SAAiB,CAAA,EAAG;AAC/D,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AACF,CAAA;AApB8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAvC,IAAM,cAAA,GAAN,eAAA;;;ACgBA,IAAM,YAAA,GAAN,MAAM,YAAA,SAAoB,SAAA,CAAU;AAAA,EAYzC,WAAA,CAAY,OAAA,EAIT,OAAA,EAAyB,MAAA,EAAyB;AACnD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,EAAS,OAAA,IAAW,EAAC;AACpC,IAAA,IAAA,CAAK,oBAAoB,OAAA,EAAS,iBAAA;AAClC,IAAA,IAAA,CAAK,oBAAoB,OAAA,EAAS,iBAAA;AAClC,IAAA,IAAA,CAAK,UAAU,OAAA,IAAW,IAAA;AAC1B,IAAA,IAAA,CAAK,SAAS,MAAA,IAAU,IAAA;AAAA,EAC1B;AACF,CAAA;AAxB2C,MAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAApC,IAAM,WAAA,GAAN,YAAA;ACAP,SAAS,WAAW,KAAA,EAA4B;AAC9C,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,YAAA,EAAc,CAAA,CAAA;AACjC;AAFS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAIT,SAAS,iBAAiB,KAAA,EAAqC;AAC7D,EAAA,MAAM,IAAA,GAAwB;AAAA,IAC5B,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AAAA,IAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,UAAA,EAAa,MAAiD,UAAA,IAAc,KAAA;AAAA,IAC5E,gBAAgB,KAAA,CAAM;AAAA,GACxB;AAEA,EAAA,IAAI,iBAAuBE,kBAAA,CAAA,UAAA,EAAY;AACrC,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAAA,EACrB,CAAA,MAAA,IAAW,iBAAuBA,kBAAA,CAAA,SAAA,EAAW;AAC3C,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AACnB,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AAAA,EACxB,CAAA,MAAA,IAAW,iBAAuBA,kBAAA,CAAA,aAAA,EAAe;AAC/C,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AACnB,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,MAAA;AAAA,EACtB;AAEA,EAAA,OAAO,IAAA;AACT;AAtBS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAgCF,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,SAAA,CAAU;AAAA,EAQ5C,YAAY,KAAA,EAAoB;AAC9B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,iBAAiB,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,UAAU,KAAA,EAAuC;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,GAAG;AAAA,KACL;AAAA,EACF;AACF,CAAA;AArB8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAvC,IAAM,cAAA,GAAN,eAAA;ACGP,SAASC,WAAAA,CAAW,OAAgB,QAAA,EAA0B;AAC5D,EAAA,IACE,SACA,OAAO,KAAA,KAAU,YACjB,OAAQ,KAAA,CAA0C,iBAChD,UAAA,EACF;AACA,IAAA,IAAI;AACF,MAAA,OAAO,CAAA,CAAA,EAAK,KAAA,CAAyC,YAAA,EAAc,CAAA,CAAA;AAAA,IACrE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAfS,MAAA,CAAAA,WAAAA,EAAA,YAAA,CAAA;AAiBT,SAAS,gBAAgB,QAAA,EAA6C;AACpE,EAAA,IAAI,oBAA0BC,kBAAA,CAAA,oBAAA,EAAsB;AAClD,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,IAAI,oBAA0BA,kBAAA,CAAA,iBAAA,EAAmB;AAC/C,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,oBAA0BA,kBAAA,CAAA,iBAAA,EAAmB;AAC/C,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,UAAA;AACT;AAdS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AA0BT,SAAS,gBACP,OAAA,EACoB;AACpB,EAAA,MAAM,GAAA,GAAO,SAAS,KAAA,EAAwC,GAAA;AAC9D,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,MAAA;AACzC;AALS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAYT,SAAS,iBACP,OAAA,EACoB;AACpB,EAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,MAAA,EACP,IAAA,EAAM,UAAA;AACT,EAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,EAAY;AAChD,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,OAAO,gBAAgB,OAAO,CAAA;AAChC;AAbS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAeT,SAAS,oBAAoB,QAAA,EAA8C;AACzE,EAAA,MAAM,cAAA,GAAiB,QAAA;AACvB,EAAA,MAAM,cAAc,cAAA,CAAe,WAAA;AAGnC,EAAA,MAAM,MAAM,cAAA,CAAe,GAAA;AAE3B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAgB,QAAQ,CAAA;AAAA,IAC9B,KAAA,EAAOD,WAAAA,CAAW,cAAA,CAAe,KAAA,EAAO,SAAS,CAAA;AAAA,IACjD,WACE,OAAO,cAAA,CAAe,SAAA,KAAc,QAAA,GAAW,eAAe,SAAA,GAAY,GAAA;AAAA,IAC5E,WACE,OAAO,cAAA,CAAe,SAAA,KAAc,QAAA,GAAW,eAAe,SAAA,GAAY,GAAA;AAAA,IAC5E,aACE,OAAO,WAAA,EAAa,CAAA,KAAM,QAAA,GAAW,YAAY,CAAA,GAAI,CAAA;AAAA,IACvD,SAAS,OAAO,cAAA,CAAe,OAAA,KAAY,QAAA,GAAW,eAAe,OAAA,GAAU,CAAA;AAAA,IAC/E,QAAA,EAAUA,WAAAA,CAAW,cAAA,CAAe,QAAA,EAAU,SAAS,CAAA;AAAA,IACvD,mBACE,OAAO,cAAA,CAAe,iBAAA,KAAsB,QAAA,GACxC,eAAe,iBAAA,GACf,CAAA;AAAA,IACN,MAAM,OAAO,cAAA,CAAe,IAAA,KAAS,QAAA,GAAW,eAAe,IAAA,GAAaC,kBAAA,CAAA,SAAA;AAAA,IAC5E,UACE,OAAO,cAAA,CAAe,QAAA,KAAa,QAAA,GAC/B,eAAe,QAAA,GACTA,kBAAA,CAAA,cAAA;AAAA,IACZ,SAAA,EAAW,eAAe,SAAA,KAAc,KAAA;AAAA,IACxC,UAAA,EAAY,eAAe,UAAA,KAAe,KAAA;AAAA,IAC1C,SAAA,EAAW,OAAA,CAAQ,cAAA,CAAe,SAAS,CAAA;AAAA,IAC3C,WAAA,EAAa,OAAA,CAAQ,cAAA,CAAe,WAAW,CAAA;AAAA,IAC/C,UAAA,EAAY,iBAAiB,GAAG,CAAA;AAAA,IAChC,eAAA,EAAiB,eAAA;AAAA,MACf,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,SAAA,EAAW,eAAA;AAAA,MACT,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,YAAA,EAAc,eAAA;AAAA,MACZ,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,YAAA,EAAc,eAAA;AAAA,MACZ,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,KAAA,EAAO,eAAA,CAAgB,cAAA,CAAe,KAAkC,CAAA;AAAA,IACxE,WAAA,EAAa,eAAA;AAAA,MACX,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,OAAA,EAAS,eAAA;AAAA,MACP,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,eAAA,EAAiB,eAAA;AAAA,MACf,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,QAAA,EAAU,eAAA;AAAA,MACR,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,MAAA,EAAQ,eAAA,CAAgB,cAAA,CAAe,MAAmC,CAAA;AAAA,IAC1E,gBAAA,EACE,GAAA,EAAK,SAAA,KAAoBA,kBAAA,CAAA,aAAA,GAAgB,OAAA,GAAU,QAAA;AAAA,IACrD,UAAA,EAAY,KAAK,eAAA,KAAoB;AAAA,GACvC;AACF;AA9DS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAgEF,SAAS,oBAAA,GAA2C;AACzD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW,GAAA;AAAA,IACX,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,SAAA;AAAA,IACV,iBAAA,EAAmB,CAAA;AAAA,IACnB,IAAA,EAAYA,kBAAA,CAAA,SAAA;AAAA,IACZ,QAAA,EAAgBA,kBAAA,CAAA,cAAA;AAAA,IAChB,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,KAAA;AAAA,IACX,WAAA,EAAa,KAAA;AAAA,IACb,gBAAA,EAAkB,QAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AACF;AAnBgB,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAmCT,IAAM,kBAAA,GAAN,MAAM,kBAAA,SAA0B,SAAA,CAAU;AAAA,EAiB/C,WAAA,CAAY,mBAAA,GAAyD,EAAC,EAAG;AACvE,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,aAAa,mBAAmB,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,WAAA,CAAY,OAAe,GAAA,EAA0B;AACnD,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,IAAU,KAAA,EAAO;AACrC,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,GAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,YAAY,KAAA,EAA8B;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,IAAK,IAAA;AAAA,EAClC;AAAA,EAEA,YAAA,CACE,mBAAA,GAAyD,EAAC,EACpD;AACN,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,mBAAmB,CAAA,GAC9C,mBAAA,CAAoB,MAAA,CAAO,OAAO,CAAA,GAClC,mBAAA,GACE,CAAC,mBAAmB,IACpB,EAAC;AAEP,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,IAAK,IAAA;AACrC,IAAA,IAAA,CAAK,SACH,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,GACpB,KAAK,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa,oBAAoB,QAAQ,CAAC,CAAA,GAC9D,CAAC,sBAAsB,CAAA;AAAA,EAC/B;AAAA,EAEA,WAAA,CAAY,OAAe,KAAA,EAA0C;AACnE,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,KAAA,EAAO;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,CAAA;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,GAAI;AAAA,MACnB,GAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MACpB,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEA,WAAW,KAAA,EAAqB;AAC9B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,KAAA,EAAO;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAK,GAAG,IAAA,IAAQ,UAAA;AACzC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,GAAI;AAAA,MACnB,GAAG,oBAAA,EAAqB;AAAA,MACxB;AAAA,KACF;AAAA,EACF;AAAA,EAEA,eAAA,CAAgB,OAAe,IAAA,EAA+B;AAC5D,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAA,EAClC;AAAA,EAEA,mBAAA,CAAoB,OAAe,SAAA,EAAwC;AACzE,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,EAAE,gBAAA,EAAkB,WAAW,CAAA;AAAA,EACzD;AAAA,EAEA,aAAA,CAAc,OAAe,OAAA,EAAwB;AACnD,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,EAAE,UAAA,EAAY,SAAS,CAAA;AAAA,EACjD;AACF,CAAA;AArGiD,MAAA,CAAA,kBAAA,EAAA,mBAAA,CAAA;AAA1C,IAAM,iBAAA,GAAN,kBAAA;;;AChOA,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,SAAA,CAAU;AAAA,EAM5C,YAAY,IAAA,EAAc;AACxB,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AACF,CAAA;AAX8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAvC,IAAM,cAAA,GAAN,eAAA;;;ACJA,IAAM,KAAA,GAAN,MAAM,KAAA,SAAa,SAAA,CAAU;AAAA,EAIlC,YAAY,KAAA,EAAe;AACzB,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF,CAAA;AARoC,MAAA,CAAA,KAAA,EAAA,MAAA,CAAA;AAA7B,IAAM,IAAA,GAAN,KAAA;;;ACNP,IAAM,qCAAqB,MAAA,CAAA,MAAc;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAG,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAAA,EAC/E;AACF,CAAA,EAP2B,oBAAA,CAAA;AA0CpB,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,SAAA,CAAU;AAAA,EAY5C,WAAA,CAAY,GAAA,EAAa,SAAA,GAAsB,IAAI,UAAA,EAAqB;AACtE,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GACH,OAAO,UAAA,KAAe,QAAA,IAAY,WAAW,MAAA,GAAS,CAAA,GAClD,aACA,kBAAA,EAAmB;AAAA,EAC3B;AACF,CAAA;AArB8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAvC,IAAM,cAAA,GAAN,eAAA;;;AC5BA,IAAM,WAAA,GAAN,MAAM,WAAA,SAAmB,SAAA,CAAU;AAAA,EAIxC,YAAY,MAAA,EAAgB;AAC1B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF,CAAA;AAR0C,MAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAAnC,IAAM,UAAA,GAAN,WAAA;;;ACkBA,IAAM,gBAAA,GAAN,MAAM,gBAAA,SAAwB,SAAA,CAAU;AAAA,EAQ7C,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACrC,UAAU,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,GAAW,MAAM,QAAA,GAAW,CAAA;AAAA,MAChE,WAAW,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GAAW,MAAM,SAAA,GAAY,EAAA;AAAA,MACnE,WAAW,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GAAW,MAAM,SAAA,GAAY,EAAA;AAAA,MACnE,SAAS,OAAO,KAAA,CAAM,OAAA,KAAY,SAAA,GAAY,MAAM,OAAA,GAAU,IAAA;AAAA,MAC9D,IAAA,EACE,KAAA,CAAM,IAAA,IAAQ,OAAO,MAAM,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,KAAA,CAAM,IAAI,CAAA,GACpE,KAAA,CAAM,OACP,EAAC;AAAA,MACP,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,gBACE,OAAO,KAAA,CAAM,cAAA,KAAmB,QAAA,GAAW,MAAM,cAAA,GAAiB;AAAA,KACtE,CAAE,CAAA;AAIF,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,gBAAA,EAAkB;AAAA,MAC5C,KAAA,EAAO,IAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AAID,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,iBAAA,EAAmB;AAAA,MAC7C,KAAA,sBAAW,GAAA,EAAqB;AAAA,MAChC,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AACF,CAAA;AA3C+C,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAAxC,IAAM,eAAA,GAAN,gBAAA;;;ACLA,IAAM,sBAAA,GAAN,MAAM,sBAAA,SAA8B,SAAA,CAAU;AAAA,EAUnD,WAAA,CAAY,KAAA,GAAoC,EAAC,EAAG;AAClD,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,SAAA,GACH,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAAY,MAAM,SAAA,CAAU,MAAA,GAAS,CAAA,GAC5D,KAAA,CAAM,SAAA,GACN,IAAA;AACN,IAAA,IAAA,CAAK,SAAA,GACH,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAAY,MAAM,SAAA,CAAU,MAAA,GAAS,CAAA,GAC5D,KAAA,CAAM,SAAA,GACN,IAAA;AACN,IAAA,IAAA,CAAK,UAAU,OAAO,KAAA,CAAM,OAAA,KAAY,SAAA,GAAY,MAAM,OAAA,GAAU,IAAA;AACpE,IAAA,IAAA,CAAK,IAAA,GACH,KAAA,CAAM,IAAA,IAAQ,OAAO,MAAM,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,KAAA,CAAM,IAAI,CAAA,GACpE,KAAA,CAAM,OACP,EAAC;AACP,IAAA,IAAA,CAAK,YAAA,GACH,KAAA,CAAM,YAAA,KAAiB,MAAA,IACvB,MAAM,YAAA,KAAiB,SAAA,IACvB,KAAA,CAAM,YAAA,KAAiB,OAAA,IACvB,KAAA,CAAM,YAAA,KAAiB,OAAA,GACnB,MAAM,YAAA,GACN,MAAA;AACN,IAAA,IAAA,CAAK,iBACH,OAAO,KAAA,CAAM,cAAA,KAAmB,QAAA,GAAW,MAAM,cAAA,GAAiB,MAAA;AAIpE,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,UAAA,EAAY;AAAA,MACtC,KAAA,EAAO,IAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AACF,CAAA;AA7CqD,MAAA,CAAA,sBAAA,EAAA,uBAAA,CAAA;AAA9C,IAAM,qBAAA,GAAN,sBAAA;;;ACrBA,IAAM,WAAA,GAAN,MAAM,WAAA,SAAmB,SAAA,CAAU;AAAA,EAIxC,WAAA,CAAY,UAAU,IAAA,EAAM;AAC1B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF,CAAA;AAR0C,MAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAAnC,IAAM,UAAA,GAAN,WAAA;;;ACEA,IAAM,gBAAA,GAAN,MAAM,gBAAA,SAAwB,SAAA,CAAU;AAAA,EAY7C,WAAA,CAAY,IAAA,EAAc,KAAA,GAAgB,CAAA,EAAG,SAAiB,CAAA,EAAG;AAC/D,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AACF,CAAA;AApB+C,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAAxC,IAAM,eAAA,GAAN,gBAAA;;;ACHP,IAAM,qBAAA,GAAwB;AAAA,EAC5B,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,aAAA,EAAe,KAAA;AAAA,EACf,eAAA,EAAiB,SAAA;AAAA,EACjB,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY,IAAA;AAAA,EACZ,KAAA,EAAO,IAAA;AAAA;AAAA,EAEP,UAAA,EAAY,KAAA;AAAA;AAAA,EAEZ,WAAA,EAAa,CAAA;AAAA;AAAA,EAEb,aAAA,EAAe,SAAA;AAAA;AAAA,EAEf,aAAA,EAAe;AACjB,CAAA;AAUO,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,SAAA,CAAU;AAAA,EAqD5C,WAAA,CACE,IAAA,EACA,OAAA,GAAiD,EAAC,EAClD;AACA,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,GAAG,qBAAA;AAAA,MACH,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAIjB,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,WAAA,EAAa;AAAA,MACvC,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,UAAA,EAAY;AAAA,MACtC,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AACF,CAAA;AAjH8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAvC,IAAM,cAAA,GAAN,eAAA;;;ACTA,IAAM,wBAAA,GAAN,MAAM,wBAAA,SAAgC,SAAA,CAAU;AAAA,EAUrD,YAAY,OAAA,EAAiC;AAC3C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,SAAS,OAAA,IAAW,IAAA;AAGnC,IAAA,MAAM,QAAQ,OAAA,EAAS,KAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA,KAAU,UAAA,GAAa,QAAA,GAAY,SAAS,KAAA,IAAS,OAAA;AAClE,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,EAAA;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,EAAA;AAAA,EACjC;AACF,CAAA;AApBuD,MAAA,CAAA,wBAAA,EAAA,yBAAA,CAAA;AAAhD,IAAM,uBAAA,GAAN,wBAAA;;;AC+FA,IAAM,wBAAA,GAAN,MAAM,wBAAA,SAAgC,SAAA,CAAU;AAAA,EA6CrD,YAAY,OAAA,EAAiC;AAC3C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,SAAS,OAAA,IAAW,IAAA;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,IAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,IAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,MAAA;AACvC,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAS,gBAAA,IAAoB,MAAA;AACrD,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,KAAA;AAC3C,IAAA,IAAA,CAAK,UAAA,GAAa,SAAS,UAAA,IAAc,IAAA;AACzC,IAAA,IAAA,CAAK,kBAAA,GAAqB,SAAS,kBAAA,IAAsB;AAAA,MACvD,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,kBAAA,GAAqB,SAAS,kBAAA,IAAsB;AAAA,MACvD,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,SAAA;AACvC,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAS,eAAA,IAAmB,OAAA;AACnD,IAAA,IAAA,CAAK,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,KAAA;AACvD,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,IAAA;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,CAAA;AACrC,IAAA,IAAA,CAAK,YAAA,GAAA,CAAgB,OAAA,EAAS,YAAA,IAAgB,EAAC,EAAG,GAAA;AAAA,MAAI,CAAC,KAAA,KACrD,iBAAA,CAAkB,KAAK;AAAA,KACzB;AACA,IAAA,IAAA,CAAK,sBAAA,GAAyB,SAAS,sBAAA,IAA0B,IAAA;AACjE,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiB,CAAA;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiB,OAAA;AAG/C,IAAA,IAAA,CAAK,UAAA,GAAa,SAAS,UAAA,IAAc,SAAA;AACzC,IAAA,IAAA,CAAK,UAAA,GAAa,SAAS,UAAA,IAAc,IAAA;AAAA,EAC3C;AACF,CAAA;AAhFuD,MAAA,CAAA,wBAAA,EAAA,yBAAA,CAAA;AAAhD,IAAM,uBAAA,GAAN,wBAAA;AAmFA,SAAS,kBACd,OAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,EAAA;AAAA,IAC9B,QAAA,EAAU,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,OAAA,CAAQ,QAAA,EAAS;AAAA,IAClD,QAAA,EAAU,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,OAAA,CAAQ,QAAA,EAAS;AAAA,IAClD,IAAA,EAAM,QAAQ,IAAA,IAAQ,KAAA;AAAA,IACtB,IAAA,EAAM,QAAQ,IAAA,IAAQ;AAAA,GACxB;AACF;AAXgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;;;ACtJT,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,SAAA,CAAU;AAAA,EAoB5C,YAAY,OAAA,EAAwB;AAClC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,cAAA,IAAkB,OAAA;AACjD,IAAA,IAAA,CAAK,UAAA,GAAa,SAAS,UAAA,IAAc,UAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,CAAA;AACvC,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,IAAA;AACrC,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAS,eAAA,IAAmB,EAAA;AACnD,IAAA,IAAA,CAAK,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,GAAA;AACvD,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAS,gBAAA,IAAoB,SAAA;AACrD,IAAA,IAAA,CAAK,uBAAA,GAA0B,SAAS,uBAAA,IAA2B,SAAA;AAGnE,IAAA,IAAA,CAAK,oBAAA,GAAuB,SAAS,oBAAA,IAAwB,KAAA;AAAA,EAC/D;AACF,CAAA;AAlC8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAvC,IAAM,cAAA,GAAN,eAAA;;;ACeA,IAAM,sBAAA,GAAN,MAAM,sBAAA,SAA8B,SAAA,CAAU;AAAA,EAmBnD,YAAY,OAAA,EAA+B;AACzC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,cAAA,IAAkB,MAAA;AACjD,IAAA,IAAA,CAAK,UAAA,GAAa,SAAS,UAAA,IAAc,SAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,SAAA;AACvC,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,CAAA;AAC3C,IAAA,IAAA,CAAK,qBAAA,GAAwB,SAAS,qBAAA,IAAyB,CAAA;AAC/D,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiB,aAAA;AAC/C,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,SAAA;AAGrC,IAAA,IAAA,CAAK,YAAA,GAAe,SAAS,YAAA,IAAgB,IAAA;AAAA,EAC/C;AACF,CAAA;AAhCqD,MAAA,CAAA,sBAAA,EAAA,uBAAA,CAAA;AAA9C,IAAM,qBAAA,GAAN,sBAAA;AA2CA,IAAM,0BAAA,GAAN,MAAM,0BAAA,SAAkC,SAAA,CAAU;AAAA,EAIvD,YAAY,OAAA,EAAuC;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,IAAA,GAAO,SAAS,IAAA,IAAQ,MAAA;AAAA,EAC/B;AACF,CAAA;AARyD,MAAA,CAAA,0BAAA,EAAA,2BAAA,CAAA;AAAlD,IAAM,yBAAA,GAAN,0BAAA;;;AC1FP,IAAM,IAAA,GAAO,IAAA;AAEb,IAAM,MAAA,GAAS,IAAA;AAEf,IAAM,QAAA,GAA2B,EAAE,IAAA,EAAM,IAAA,EAAM,WAAW,IAAA,EAAK;AAC/D,IAAM,MAAA,GAAyB,EAAE,IAAA,EAAM,IAAA,EAAM,WAAW,IAAA,EAAK;AAE7D,IAAM,eAA+B,EAAE,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,SAAS,GAAA,EAAI;AAE1E,IAAM,aAAA,GAAgC,EAAE,IAAA,EAAM,GAAA,EAAK,WAAW,GAAA,EAAI;AAElE,SAAS,OAAA,CACP,KAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,KAAA,EACkC;AAClC,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,KAAA,EAAM;AAC7C;AARS,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAUT,IAAM,QAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,OAAA;AAAA,EACN,SAAA,EAAW,IAAA;AAAA,EACX,gBAAA,EAAkB;AACpB,CAAA;AAEA,IAAM,UAAA,GAAoC;AAAA,EACxC,IAAA,EAAM,OAAA;AAAA,EACN,SAAA,EAAW,MAAA;AAAA,EACX,gBAAA,EAAkB;AACpB,CAAA;AASO,IAAM,iBAAA,GAA0D;AAAA,EACrE,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,SAAS,OAAA,CAAQ,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM;AAAA,GAC/D;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,SAAS,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,UAAU,QAAQ;AAAA,GACnE;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,SAAS,OAAA,CAAQ,aAAA,EAAe,QAAA,EAAU,MAAA,EAAQ,QAAQ,MAAM;AAAA,GAClE;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,SAAS,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,IACzD,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,SAAS,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,IACzD,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,SAAS,OAAA,CAAQ,aAAA,EAAe,QAAA,EAAU,QAAA,EAAU,QAAQ,MAAM;AAAA,GACpE;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA;AAAA;AAAA,IAGN,OAAA,EAAS,OAAA;AAAA,MACP,EAAE,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI;AAAA,MAC5B,EAAE,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI;AAAA,MAC5B,EAAE,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI;AAAA,MAC5B,EAAE,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI;AAAA,MAC5B,EAAE,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,GAAA;AAAI,KAC9B;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,SAAS,MAAA,EAAQ,CAAA,EAAG,WAAW,IAAA;AAAK,GACvD;AAAA,EAEA,EAAA,EAAI;AAAA,IACF,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA;AAAA;AAAA,IAGN,OAAA,EAAS,OAAA;AAAA,MACP,EAAE,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI;AAAA,MAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,IAAA,EAAK;AAAA,MAC9B,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,SAAS,MAAA,EAAQ,CAAA,EAAG,WAAW,GAAA;AAAI,GACtD;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,SAAS,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,QAAQ,MAAM;AAAA,GAC7D;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,SAAS,OAAA,CAAQ,YAAA,EAAc,QAAA,EAAU,MAAA,EAAQ,QAAQ,QAAQ;AAAA,GACnE;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,SAAS,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,QAAQ,QAAQ;AAAA,GAC7D;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,SAAS,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,UAAU,QAAQ,CAAA;AAAA,IACjE,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,aAAA;AAAA,MACN,SAAA,EAAW,IAAA;AAAA,MACX,gBAAA,EAAkB;AAAA;AACpB;AAEJ,CAAA;AAYO,SAAS,kBAAkB,EAAA,EAAyC;AACzE,EAAA,MAAM,MAAA,GAAS,kBAAkB,EAAE,CAAA;AACnC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;AAJgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAMhB,SAAS,YAAY,MAAA,EAAwC;AAC3D,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,GAAI,MAAA,CAAO,UAAA,GAAa,EAAE,UAAA,EAAY,CAAC,GAAG,MAAA,CAAO,UAAU,CAAA,EAAE,GAAI;AAAC,GACpE;AACF;AALS,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAOF,SAAS,cACd,UAAA,EACsB;AACtB,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,WAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC3C,KAAA,EAAO,WAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC3C,MAAA,EAAQ,WAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC7C,IAAA,EAAM,WAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AAAA,MACzC,KAAA,EAAO,WAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,KAAK;AAAA,KAC7C;AAAA,IACA,OAAO,UAAA,CAAW,KAAA,GAAQ,EAAE,GAAG,UAAA,CAAW,OAAM,GAAI,MAAA;AAAA,IACpD,aAAa,UAAA,CAAW,WAAA,GACpB,EAAE,GAAG,UAAA,CAAW,aAAY,GAC5B;AAAA,GACN;AACF;AAjBgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAuBT,SAAS,iBAAA,CACd,EAAA,EACA,IAAA,EACA,KAAA,EACA,OAAA,EASsB;AACtB,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,MAAA;AACxC,EAAA,MAAM,MAAA,mBAAS,MAAA,CAAA,CAAC,MAAA,EAAkB,IAAA,KAAiC;AACjE,IAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,GAAa,MAAM,CAAA;AAC/C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,MACnC,SAAA;AAAA,MACA,GAAI,cAAc,UAAA,CAAW,MAAA,GAAS,IAAI,EAAE,UAAA,KAAe;AAAC,KAC9D;AAAA,EACF,CAAA,EAPe,QAAA,CAAA;AASf,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AAAA,MAClC,KAAA,EAAO,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AAAA,MAClC,MAAA,EAAQ,MAAA,CAAO,QAAA,EAAU,KAAA,CAAM,MAAM,CAAA;AAAA,MACrC,IAAA,EAAM,MAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,MAC/B,KAAA,EAAO,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,KAAK;AAAA,KACpC;AAAA,IACA,OAAO,OAAA,EAAS,KAAA;AAAA,IAChB,aAAa,OAAA,EAAS,WAAA;AAAA,IACtB,2BAA2B,OAAA,EAAS,yBAAA;AAAA,IACpC,MAAM,OAAA,EAAS;AAAA,GACjB;AACF;AAvCgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;;;AC7JT,IAAM,kBAAA,GAA+C;AAAA,EAC1D,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAYO,SAAS,oBACd,OAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,EAAA;AAAA,IAC9B,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA;AAAA,IAC1B,OAAO,EAAE,GAAG,kBAAA,EAAoB,GAAG,QAAQ,KAAA,EAAM;AAAA,IACjD,SAAA,EAAW,QAAQ,SAAA,IAAa,IAAA;AAAA,IAChC,UAAA,EAAY;AAAA,MACV,OAAO,CAAC,GAAI,QAAQ,UAAA,EAAY,KAAA,IAAS,EAAG,CAAA;AAAA,MAC5C,OAAO,CAAC,GAAI,QAAQ,UAAA,EAAY,KAAA,IAAS,EAAG,CAAA;AAAA,MAC5C,QAAQ,CAAC,GAAI,QAAQ,UAAA,EAAY,MAAA,IAAU,EAAG,CAAA;AAAA,MAC9C,MAAM,CAAC,GAAI,QAAQ,UAAA,EAAY,IAAA,IAAQ,EAAG,CAAA;AAAA,MAC1C,OAAO,CAAC,GAAI,QAAQ,UAAA,EAAY,KAAA,IAAS,EAAG;AAAA,KAC9C;AAAA,IACA,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,EAAA;AAAA,IAClD,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,IACtB,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,cAAA,EAAgB,QAAQ,cAAA,IAAkB,IAAA;AAAA,IAC1C,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,GAC9B;AACF;AAtBgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AA+BT,SAAS,qBAAA,CACd,OACA,aAAA,EAC6B;AAC7B,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,MAAA,CAAO,IAAA;AAAA,MAC3B,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,MAAA,CAAO;AAAA,KAC3C;AAAA,EACF;AAEA,EAAA,OAAO,kBAAkB,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,IAAA,EAAM,MAAM,KAAA,EAAO;AAAA,IAC1D,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,WAAA,EAAa,MAAM,WAAA,IAAe,MAAA;AAAA,IAClC,IAAA,EAAM,MAAM,IAAA,IAAQ,MAAA;AAAA,IACpB,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,2BAA2B,KAAA,CAAM;AAAA,GAClC,CAAA;AACH;AAvBgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAkCT,IAAM,oBAAA,GAAN,MAAM,oBAAA,SAA4B,SAAA,CAAU;AAAA,EAIjD,YAAY,OAAA,EAA6B;AACvC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,SAAS,OAAA,IAAW,IAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAA,CAAS,OAAA,EAAS,KAAA,IAAS,EAAC,EAAG,IAAI,CAAC,IAAA,KAAS,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,EAC7E;AACF,CAAA;AATmD,MAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAA5C,IAAM,mBAAA,GAAN,oBAAA;;;ACtIP,IAAM,iCAAA,GAAoC,iBAAA;AACnC,IAAM,sBAAA,GACX,yDAAA;AAgBF,SAAS,wBAAwB,GAAA,EAAsB;AACrD,EAAA,OAAO,GAAA,CAAI,WAAW,SAAS,CAAA;AACjC;AAFS,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AAIF,SAAS,uBAAA,GAAkC;AAKhD,EAAA,IAAI;AAEF,IAAA,MAAM,eAAe,IAAI,GAAA;AAAA,MACvB,iCAAA;AAAA,MACA;AAAY,MACZ,QAAA,EAAS;AAIX,IAAA,IAAI,uBAAA,CAAwB,YAAY,CAAA,EAAG;AACzC,MAAA,OAAO,sBAAA;AAAA,IACT;AAEA,IAAA,OAAO,YAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,sBAAA;AAAA,EACT;AACF;AAvBgB,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;;;ACmBhB,SAAS,sBAAA,GAAqC;AAC5C,EAAA,MAAM,MAAA,GAAS,IAAIC,wBAAA,EAAW;AAE9B,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,IAAIC,0BAAA,EAAY;AACpC,IAAA,WAAA,CAAY,cAAA,CAAe,yBAAyB,CAAA;AACpD,IAAA,MAAA,CAAO,eAAe,WAAW,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,gEAAgE,KAAK,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,MAAA;AACT;AAZS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAcT,SAAS,mBAAmB,SAAA,EAA2B;AACrD,EAAA,OAAO,MAAA,CAAO,SAAS,SAAS,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,GAAI,CAAA;AAC/D;AAFS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAIT,SAAS,kBAAkB,SAAA,EAA2B;AACpD,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,SAAS,KAAK,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA,EAAQ;AAC/D,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAC3B;AANS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAQT,SAAS,0BAA0B,QAAA,EAA0B;AAC3D,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,WAAW,CAAA,EAAG;AAC9C,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA;AACT;AANS,MAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AAQT,SAAS,mBAAmB,OAAA,EAAqC;AAC/D,EAAA,OAAO,QACJ,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,CAAA,CACvB,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA,CACjC,KAAK,GAAG,CAAA;AACb;AALS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAOT,SAAS,uBAAuB,SAAA,EAAmD;AACjF,EAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,CAAU,WAAW,KAAK,SAAA,CAAU,WAAA,CAAY,SAAS,CAAA,EAAG;AAC5E,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC3C,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM;AAAA,KACd,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,EAAG;AACnC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,SAAA,CAAU,KAAA,CACd,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AACpB,IAAA,MAAM,OAAO,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,EAAA;AAC1D,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC3B,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,KAAA,KAAqC,UAAU,IAAI,CAAA;AAChE;AA3BS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AA6BT,SAAS,qBAAqB,KAAA,EAA0B;AACtD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO,OAAA;AACT;AAtBS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAwBT,SAAS,qBAAqB,GAAA,EAAqB;AACjD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAClD,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI;AACjC,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,CAAI,aAAY,GAAI,EAAA;AACvD;AAJS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAMT,SAAS,aAAA,CACP,OACA,OAAA,EAIA;AACA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAmC;AACvD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAEhD,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAI,KAAA,CAAM,EAAA,EAAI,MAAM,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAElD,IAAA,MAAM,MAAM,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,IAAI,KAAK,EAAC;AAC9C,IAAA,GAAA,CAAI,IAAA,CAAK,MAAM,EAAE,CAAA;AACjB,IAAA,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,EAAE,SAAS,aAAA,EAAc;AAClC;AAvBS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAyBT,SAAS,eAAe,OAAA,EAAiC;AACvD,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAClC,IAAA,MAAA,CAAO,IAAA,EAAK;AAAA,EACd,CAAC,CAAA;AACD,EAAA,OAAA,CAAQ,MAAM,aAAA,EAAc;AAC5B,EAAA,OAAA,CAAQ,YAAA,GAAe,IAAA;AACzB;AANS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAQT,SAAS,gBAAA,CACP,OAAA,EACA,UAAA,EACA,iBAAA,EACM;AACN,EAAA,IAAI,OAAA,CAAQ,iBAAiB,UAAA,EAAY;AACvC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,QAAQ,YAAA,GAC3B,OAAA,CAAQ,QAAQ,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA,GACxC,MAAA;AACJ,EAAA,MAAM,aAAa,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,GAAI,MAAA;AAElE,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,cAAA,CAAe,IAAA,EAAK;AAAA,IACtB;AACA,IAAA,OAAA,CAAQ,YAAA,GAAe,IAAA;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,KAAmB,UAAA,EAAY;AACpD,IAAA,UAAA,CAAW,KAAA,EAAM;AACjB,IAAA,UAAA,CAAW,IAAA,EAAK;AAChB,IAAA,OAAA,CAAQ,YAAA,GAAe,UAAA;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,IAAA,UAAA,CAAW,KAAA,EAAM;AACjB,IAAA,UAAA,CAAW,IAAA,EAAK;AAChB,IAAA,cAAA,CAAe,WAAA,CAAY,UAAA,EAAY,iBAAA,EAAmB,IAAI,CAAA;AAAA,EAChE,CAAA,MAAO;AACL,IAAA,cAAA,CAAe,IAAA,EAAK;AACpB,IAAA,UAAA,CAAW,KAAA,EAAM;AACjB,IAAA,UAAA,CAAW,IAAA,EAAK;AAAA,EAClB;AAEA,EAAA,OAAA,CAAQ,YAAA,GAAe,UAAA;AACzB;AAxCS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AA0CT,SAAS,gBAAA,CACP,MAAA,EACA,SAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,aAAmBC,kBAAA,CAAA,UAAA,GAAmBA,kBAAA,CAAA,QAAA;AACvD,EAAA,MAAM,WAAA,GAAc,aAAa,QAAA,GAAW,CAAA;AAC5C,EAAA,MAAA,CAAO,OAAA,CAAQ,UAAU,WAAW,CAAA;AACpC,EAAA,MAAA,CAAO,oBAAoB,CAAC,UAAA;AAC5B,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAEhB,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,OAAA,GAAU,EAAA,GAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,qBAAA,CAAsB,iBAAA,CAAkB,SAAA,CAAU,SAAS,IAAI,SAAS,CAAA;AACjF;AAdS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAgBT,SAAS,2BAAA,CAA4B,WAA+B,OAAA,EAAkC;AACpG,EAAA,MAAM,UACJ,SAAA,CAGA,wBAAA;AAEF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AAC9C,IAAA,SAAA,CAAU,sBAAA,CAAuB,QAAQ,mBAAmB,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,IAAK,SAAA,CAAU,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACnE,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,cAAA,CAAe,IAAA,GAAO,CAAA,EAAG;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAA,CAAQ,SAAS,EAAC;AACjE,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,SAAA,CAAU,UAAU,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,KAAY,SAAA,EAAW;AACxC,IAAA,SAAA,CAAU,UAAU,OAAA,CAAQ,OAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,OAAO,QAAQ,SAAA,KAAc,QAAA,IAAY,OAAO,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC/E,IAAA,SAAA,CAAU,YAAY,OAAA,CAAQ,SAAA;AAAA,EAChC;AAEA,EAAA,IACE,OAAO,QAAQ,iBAAA,KAAsB,QAAA,IACrC,OAAO,QAAA,CAAS,OAAA,CAAQ,iBAAiB,CAAA,EACzC;AACA,IAAA,SAAA,CAAU,iBAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,iBAAiB,CAAA;AAAA,EACrE;AAEA,EAAA,IAAI,OAAO,OAAA,CAAQ,WAAA,KAAgB,YAAY,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AAC7E,IAAA,SAAA,CAAU,cAAA,CAAe,OAAA,CAAQ,WAAA,EAAa,CAAC,QAAQ,MAAM,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACvC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,SAAA,CAAU,UAAA,CAAW,OAAA,CAAQ,WAAA,IAAe,MAAS,CAAA;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,SAAA,CAAU,OAAA,CAAQ,WAAA,IAAe,MAAS,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,OACE,SAAA,CAGA,wBAAA;AACJ;AA5DS,MAAA,CAAA,2BAAA,EAAA,6BAAA,CAAA;AA8DF,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAqC;AAAA,EAA3C,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,eAAA,uBAAsB,GAAA,EAA8B;AACrE,IAAA,IAAA,CAAiB,aAAa,sBAAA,EAAuB;AACrD,IAAA,IAAA,CAAiB,SAAA,GAAY,IAAIC,sBAAA,EAAU;AAAA,EAAA;AAAA,EAE3C,MAAc,oBAAoB,SAAA,EAAmD;AACnF,IAAA,MAAM,GAAA,GAAM,qBAAqB,SAAS,CAAA;AAE1C,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,IAAA,CAAK,SAAA,CAAU,IAAA;AAAA,UACb,SAAA;AAAA,UACA,CAAC,MAAA,KAAW;AACV,YAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,GAAI,MAAA,CAAO,aAAa,EAAC;AACtE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,UACf,CAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,MAAA,EAAQ;AACnC,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,UACd,SAAA;AAAA,UACA,CAAC,IAAA,KAAS;AACR,YAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA,CAAK,aAAa,EAAC;AAClE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,UACf,CAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEQ,0BAAA,CACN,KAAA,EACA,QAAA,EACA,SAAA,EACA,OAAA,EACM;AACN,IAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,SAAA,CAAU,mBAAmB,CAAA;AAC5E,IAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,IAAA,CAAK,GAAG,CAAA;AAElD,IAAA,IAAI,OAAA,CAAQ,oBAAoB,eAAA,EAAiB;AAC/C,MAAA,OAAA,CAAQ,eAAA,GAAkB,eAAA;AAC1B,MAAA,OAAA,CAAQ,WAAA,IAAe,CAAA;AACvB,MAAA,OAAA,CAAQ,eAAe,KAAA,EAAM;AAC7B,MAAA,OAAA,CAAQ,oBAAoB,KAAA,EAAM;AAClC,MAAA,SAAA,CAAU,gBAAA,CAAiB,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,iBAAiB,CAAA;AAC3C,IAAA,KAAA,MAAW,YAAA,IAAgB,OAAA,CAAQ,mBAAA,CAAoB,IAAA,EAAK,EAAG;AAC7D,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA,EAAG;AAChC,QAAA,OAAA,CAAQ,mBAAA,CAAoB,OAAO,YAAY,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAA0B,CAAC,GAAG,OAAA,CAAQ,oBAAoB,MAAA,EAAQ,EAAE,IAAA;AACpE,IAAA,SAAA,CAAU,gBAAA;AAAA,MACR,iBAAA,CAAkB,OAAA,CAAQ,CAAC,SAAA,KAAc;AACvC,QAAA,MAAM,iBAAiB,OAAA,CAAQ,mBAAA,CAAoB,GAAA,CAAI,SAAS,KAAK,EAAC;AACtE,QAAA,OAAO,eAAe,GAAA,CAAI,CAAC,UAAU,EAAE,IAAA,EAAM,WAAU,CAAE,CAAA;AAAA,MAC3D,CAAC;AAAA,KACH;AAEA,IAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACzC,MAAA,IACE,OAAA,CAAQ,oBAAoB,GAAA,CAAI,SAAS,KACzC,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,EACpC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,cAAA,CAAe,IAAI,SAAS,CAAA;AACpC,MAAA,MAAM,cAAc,OAAA,CAAQ,WAAA;AAE5B,MAAA,KAAK,KAAK,mBAAA,CAAoB,SAAS,CAAA,CACpC,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AACxD,QAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,CAAe,WAAA,KAAgB,WAAA,EAAa;AACjE,UAAA;AAAA,QACF;AAEA,QAAA,cAAA,CAAe,cAAA,CAAe,OAAO,SAAS,CAAA;AAC9C,QAAA,cAAA,CAAe,mBAAA,CAAoB,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAEvD,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACxE,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA;AAAA,QACF;AAEA,QAAA,gBAAA,CAAiB,gBAAA;AAAA,UACf,iBAAA,CAAkB,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACjC,YAAA,MAAM,iBAAiB,cAAA,CAAe,mBAAA,CAAoB,GAAA,CAAI,GAAG,KAAK,EAAC;AACvE,YAAA,OAAO,cAAA,CAAe,IAAI,CAAC,IAAA,MAAU,EAAE,IAAA,EAAM,SAAA,EAAW,KAAI,CAAE,CAAA;AAAA,UAChE,CAAC;AAAA,SACH;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AACxD,QAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,CAAe,WAAA,KAAgB,WAAA,EAAa;AACjE,UAAA;AAAA,QACF;AAEA,QAAA,cAAA,CAAe,cAAA,CAAe,OAAO,SAAS,CAAA;AAC9C,QAAA,cAAA,CAAe,mBAAA,CAAoB,OAAO,SAAS,CAAA;AACnD,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,MACrE,CAAC,CAAA;AAAA,IACL;AAAA,EACF;AAAA,EAEQ,QAAQ,QAAA,EAAwB;AACtC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,CAAe,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,QAAQ,CAAA;AAAA,EACtC;AAAA,EAEA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAC5C,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,kBAAA,EAAoB,cAAc,CAAA;AAChE,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAY,SAAS,CAAA;AAEvC,IAAA,KAAA,MAAW,eAAA,IAAmB,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAK,EAAG;AACzD,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,eAAe,CAAA,EAAG;AAC/B,QAAA,IAAA,CAAK,QAAQ,eAAe,CAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,mBAAmB,SAAS,CAAA;AAEzC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,cAAc,CAAA;AACzD,MAAA,MAAM,IAAA,GAAO,OAAO,MAAA,IAAU,IAAA;AAE9B,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM;AACjC,QAAA,IAAA,CAAK,QAAQ,QAAQ,CAAA;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAClD,MAAA,IAAI,OAAA,GAAU,QAAA;AAEd,MAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,QAAA,KAAa,KAAK,IAAA,EAAM;AAC9C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,cAAA,CAAe,OAAO,CAAA;AAAA,QACxB;AAEA,QAAA,MAAM,KAAA,GAAQ,IAAUD,kBAAA,CAAA,cAAA,CAAe,IAAI,CAAA;AAC3C,QAAA,MAAME,QAAAA,GAAU,uBAAuB,SAAS,CAAA;AAChD,QAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,EAAOA,QAAO,CAAA;AACnD,QAAA,OAAA,GAAU;AAAA,UACR,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,KAAA;AAAA,UACA,SAAS,cAAA,CAAe,OAAA;AAAA,UACxB,eAAe,cAAA,CAAe,aAAA;AAAA,UAC9B,YAAA,EAAc,IAAA;AAAA,UACd,aAAA,EAAe,mBAAmBA,QAAO,CAAA;AAAA,UACzC,eAAA,EAAiB,EAAA;AAAA,UACjB,WAAA,EAAa,CAAA;AAAA,UACb,mBAAA,sBAAyB,GAAA,EAAmC;AAAA,UAC5D,cAAA,sBAAoB,GAAA;AAAY,SAClC;AAEA,QAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AAAA,MAC5C;AAEA,MAAA,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA;AAEnE,MAAA,2BAAA,CAA4B,WAAW,OAAO,CAAA;AAI9C,MAAA,IAAI,CAAC,KAAA,CAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACpC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,uBAAuB,SAAS,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,mBAAmB,OAAO,CAAA;AAChD,MAAA,IAAI,OAAA,CAAQ,kBAAkB,aAAA,EAAe;AAC3C,QAAA,cAAA,CAAe,OAAO,CAAA;AACtB,QAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA;AAC3D,QAAA,OAAA,CAAQ,UAAU,cAAA,CAAe,OAAA;AACjC,QAAA,OAAA,CAAQ,gBAAgB,cAAA,CAAe,aAAA;AACvC,QAAA,OAAA,CAAQ,aAAA,GAAgB,aAAA;AAAA,MAC1B;AAEA,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AAC9B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAc,SAAA,CAAU,MAAA;AAC9B,MAAA,MAAM,WAAA,GACJ,OAAO,WAAA,EAAa,MAAA,KAAW,QAAA,IAAY,YAAY,MAAA,CAAO,MAAA,GAAS,CAAA,GACnE,WAAA,CAAY,MAAA,GACZ,IAAA;AACN,MAAA,MAAM,aAAA,GAAgB,WAAA,EAAa,IAAA,CAAK,IAAA,IAAQ,IAAA;AAChD,MAAA,MAAM,cAAA,GACJ,aAAA,IAAiB,OAAA,CAAQ,aAAA,CAAc,IAAI,aAAa,CAAA,GACpD,OAAA,CAAQ,aAAA,CAAc,GAAA,CAAI,aAAa,CAAA,GAAI,CAAC,KAAK,IAAA,GACjD,IAAA;AACN,MAAA,MAAM,UAAA,GACJ,WAAA,IAAe,OAAA,CAAQ,OAAA,CAAQ,IAAI,WAAW,CAAA,GAC1C,WAAA,GACA,cAAA,IAAkB,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,cAAc,IAClD,cAAA,GACA,IAAA;AACR,MAAA,MAAM,cAAA,GAAiB,QAAQ,WAAW,CAAA;AAC1C,MAAA,MAAM,WAAW,cAAA,GACb,EAAE,WAAA,EAAa,SAAA,IAAa,SAC5B,SAAA,CAAU,MAAA;AAEd,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,SAAA,CAAU,MAAA,GAAS,QAAA;AAAA,MACrB;AAEA,MAAA,gBAAA;AAAA,QACE,OAAA;AAAA,QACA,UAAA;AAAA,QACA,yBAAA,CAA0B,UAAU,iBAAiB;AAAA,OACvD;AAEA,MAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,YAAY,CAAA;AACvD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA;AAAA,MACF;AAEA,MAAA,gBAAA,CAAiB,QAAQ,SAAA,EAAW,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAC,CAAA;AAExE,MAAA,IAAI,SAAA,CAAU,OAAA,IAAW,MAAA,CAAO,IAAA,IAAQ,CAAA,EAAG;AACzC,QAAA,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,QAAA;AAAA,MACjC;AAEA,MAAA,OAAA,CAAQ,KAAA,CAAM,OAAO,IAAI,CAAA;AAEzB,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,WAAA,CAAY,SAAA,EAAU;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAO,EAAG;AACnD,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,EAC7B;AACF,CAAA;AArQkD,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAA3C,IAAM,eAAA,GAAN;AC/RP,IAAM,QAAA,GAAW,IAAA;AACjB,IAAM,aAAA,GAAgB,IAAA;AACtB,IAAM,OAAA,GAAU,CAAA;AAChB,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,QAAA,GAAW,IAAA;AAEjB,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AACjC;AANS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAQT,SAAS,QAAA,CAAS,OAAe,IAAA,EAAsB;AACrD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA,GAAO,GAAA;AAAA,EAChB;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,aAAA,EAAe,KAAK,CAAA;AAC7C;AANS,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAQT,SAAS,SAAS,KAAA,EAAuB;AACvC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAK,GAAA,CAAI,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA,EAAS,KAAK,CAAC,CAAA;AACnD;AANS,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAQT,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AACjC;AANS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAQT,SAAS,qBAAqB,SAAA,EAAkC;AAC9D,EAAA,IAAI,OAAO,MAAA,CAAO,QAAA,CAAS,UAAU,IAAI,CAAA,GAAI,UAAU,IAAA,GAAO,EAAA;AAC9D,EAAA,IAAI,QAAQ,MAAA,CAAO,QAAA,CAAS,UAAU,KAAK,CAAA,GAAI,UAAU,KAAA,GAAQ,CAAA;AACjE,EAAA,IAAI,MAAM,MAAA,CAAO,QAAA,CAAS,UAAU,GAAG,CAAA,GAAI,UAAU,GAAA,GAAM,CAAA;AAC3D,EAAA,IAAI,SAAS,MAAA,CAAO,QAAA,CAAS,UAAU,MAAM,CAAA,GAAI,UAAU,MAAA,GAAS,EAAA;AAEpE,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,KAAA,GAAQ,IAAA,GAAO,IAAA;AAAA,EACjB;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,GAAA,GAAM,MAAA,GAAS,IAAA;AAAA,EACjB;AAEA,EAAA,SAAA,CAAU,IAAA,GAAO,IAAA;AACjB,EAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,EAAA,SAAA,CAAU,GAAA,GAAM,GAAA;AAChB,EAAA,SAAA,CAAU,MAAA,GAAS,MAAA;AACrB;AAlBS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAoBT,SAAS,oBAAoB,MAAA,EAAyD;AACpF,EAAA,OAAO,MAAA,YAAwBC,kBAAA,CAAA,iBAAA;AACjC;AAFS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAIT,SAAS,qBAAqB,MAAA,EAA0D;AACtF,EAAA,OAAO,MAAA,YAAwBA,kBAAA,CAAA,kBAAA;AACjC;AAFS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAIT,SAAS,gBAAA,GAAkC;AACzC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,UAAA;AACrB,EAAA,MAAM,SAAS,MAAA,CAAO,WAAA;AACtB,EAAA,IACE,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IACrB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IACtB,KAAA,GAAQ,CAAA,IACR,MAAA,GAAS,CAAA,EACT;AACA,IAAA,OAAO,KAAA,GAAQ,MAAA;AAAA,EACjB;AAEA,EAAA,OAAO,IAAA;AACT;AAjBS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAmBT,SAAS,cAAA,CACP,SAAA,EACA,MAAA,EACA,YAAA,EACQ;AACR,EAAA,OAAO;AAAA,IACL,SAAA,CAAU,IAAA;AAAA,IACV,SAAA,CAAU,SAAA;AAAA,IACV,SAAA,CAAU,UAAA;AAAA,IACV,SAAA,CAAU,GAAA;AAAA,IACV,SAAA,CAAU,IAAA;AAAA,IACV,SAAA,CAAU,GAAA;AAAA,IACV,SAAA,CAAU,IAAA;AAAA,IACV,SAAA,CAAU,KAAA;AAAA,IACV,SAAA,CAAU,GAAA;AAAA,IACV,SAAA,CAAU,MAAA;AAAA,IACV,SAAA,CAAU,IAAA;AAAA,IACV,YAAA,IAAgB,IAAA;AAAA,IAChB,MAAA,CAAO;AAAA,GACT,CAAE,KAAK,GAAG,CAAA;AACZ;AApBS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAsBF,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAsC;AAAA,EAA5C,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAAoB;AAAA,EAAA;AAAA,EAEtD,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,eAAA,EAAiB,WAAW,CAAA;AAC1D,IAAA,MAAM,eAAe,gBAAA,EAAiB;AAUtC,IAAA,MAAM,WAAW,KAAA,CAAM,cAAA,EAAe,GAAI,KAAA,CAAM,WAAU,GAAI,IAAA;AAE9D,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,SAAS,CAAA;AAC/B,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,EAAG;AAC9C,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,eAAe,CAAA;AAC9D,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA;AAC1D,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,EAAW;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,MAAA,IAAI,EAAE,kBAAwBA,kBAAA,CAAA,MAAA,CAAA,EAAS;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,MAAA,KAAW,QAAA,EAAU;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,SAAA,EAAW,MAAA,EAAQ,YAAY,CAAA;AACpE,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,MAAM,aAAA,EAAe;AACnD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,IAAI,CAAA;AACxC,MAAA,SAAA,CAAU,IAAA,GAAO,IAAA;AACjB,MAAA,SAAA,CAAU,GAAA,GAAM,GAAA;AAEhB,MAAA,IAAI,mBAAA,CAAoB,MAAM,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA;AACnC,QAAA,SAAA,CAAU,MAAM,MAAA,CAAO,GAAA;AACvB,QAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,UAAA,MAAA,CAAO,MAAA,GAAS,YAAA;AAAA,QAClB;AACA,QAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AACd,QAAA,MAAA,CAAO,GAAA,GAAM,GAAA;AACb,QAAA,MAAA,CAAO,sBAAA,EAAuB;AAAA,MAChC,CAAA,MAAA,IAAW,oBAAA,CAAqB,MAAM,CAAA,EAAG;AACvC,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAC9B,QAAA,MAAA,CAAO,OAAO,SAAA,CAAU,IAAA;AACxB,QAAA,MAAA,CAAO,QAAQ,SAAA,CAAU,KAAA;AACzB,QAAA,MAAA,CAAO,MAAM,SAAA,CAAU,GAAA;AACvB,QAAA,MAAA,CAAO,SAAS,SAAA,CAAU,MAAA;AAC1B,QAAA,MAAA,CAAO,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACtC,QAAA,SAAA,CAAU,OAAO,MAAA,CAAO,IAAA;AACxB,QAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AACd,QAAA,MAAA,CAAO,GAAA,GAAM,GAAA;AACb,QAAA,MAAA,CAAO,sBAAA,EAAuB;AAAA,MAChC;AAEA,MAAA,SAAA,CAAU,MAAA,GAAS,MAAA;AACnB,MAAA,IAAA,CAAK,WAAW,GAAA,CAAI,QAAA,EAAU,eAAe,SAAA,EAAW,MAAA,EAAQ,YAAY,CAAC,CAAA;AAAA,IAC/E;AAAA,EACF;AACF,CAAA;AA5EmD,MAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAA5C,IAAM,gBAAA,GAAN;;;AC9GA,IAAM,uBAAA,GAAN,MAAM,uBAAA,CAA4C;AAAA,EACvD,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AAEzC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA;AAC1D,MAAA,MAAM,SAAS,SAAA,EAAW,MAAA;AAC1B,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AACrD,MAAA,IAAI,MAAA,CAAO,YAAY,gBAAA,EAAkB;AACvC,QAAA,MAAA,CAAO,OAAA,GAAU,gBAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAjByD,MAAA,CAAA,uBAAA,EAAA,wBAAA,CAAA;AAAlD,IAAM,sBAAA,GAAN;ACEP,IAAM,aAAA,GAAgB,IAAA;AACtB,IAAM,WAAA,GAAc,CAAA;AAEpB,SAAS,qBAAA,CACP,QACA,MAAA,EACe;AACf,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,CAAC,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAC9C,IAAA,MAAM,WAAW,IAAUC,kBAAA,CAAA,WAAA,CAAY,KAAA,EAAO,CAAA,EAAG,GAASA,kBAAA,CAAA,UAAU,CAAA;AACpE,IAAA,QAAA,CAAS,WAAA,GAAc,IAAA;AACvB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,GAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,GAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,aAAA,CAAc,MAAM,CAAA;AAC/C,IAAA,QAAA,CAAS,WAAA,GAAc,IAAA;AACvB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,MAAA,CAAO,MAAA,GAAS,IAAI,MAAA,GAAS,CAAC,WAAW,SAAS,CAAA;AACrE,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAA,CAAW,SAAS,CAAC,CAAA;AAEnD,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,QAAA,GAAW,QAAQ,oBAAA,CAAqB,GAAA,EAAK,KAAK,EAAA,EAAI,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,EACrE,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,IAAA,QAAA,GAAW,OAAA,CAAQ,oBAAA,CAAqB,CAAA,EAAG,CAAA,EAAG,KAAK,GAAG,CAAA;AAAA,EACxD,CAAA,MAAO;AACL,IAAA,QAAA,GAAW,OAAA,CAAQ,oBAAA,CAAqB,CAAA,EAAG,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,EACtD;AAEA,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,SAAS,CAAA,EAAG;AACzD,IAAA,QAAA,CAAS,YAAA,CAAa,KAAA,GAAQ,SAAA,EAAW,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAA,CAAQ,SAAA,GAAY,QAAA;AACpB,EAAA,OAAA,CAAQ,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAE/B,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,OAAA,CAAQ,wBAAA,GAA2B,SAAA;AACnC,IAAA,MAAM,OAAA,GAAU,QAAQ,oBAAA,CAAqB,GAAA,EAAK,KAAK,EAAA,EAAI,GAAA,EAAK,KAAK,GAAG,CAAA;AACxE,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAG,wBAAwB,CAAA;AAChD,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAG,iBAAiB,CAAA;AACzC,IAAA,OAAA,CAAQ,SAAA,GAAY,OAAA;AACpB,IAAA,OAAA,CAAQ,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAC/B,IAAA,OAAA,CAAQ,wBAAA,GAA2B,aAAA;AAAA,EACrC;AAEA,EAAA,MAAM,OAAA,GAAU,IAAUA,kBAAA,CAAA,aAAA,CAAc,MAAM,CAAA;AAC9C,EAAA,OAAA,CAAQ,UAAA,GAAmBA,kBAAA,CAAA,cAAA;AAC3B,EAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AACtB,EAAA,OAAO,OAAA;AACT;AAvDS,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAyDF,IAAM,sBAAA,GAAN,MAAM,sBAAA,CAA2C;AAAA,EAOtD,YAAY,KAAA,EAAoB;AALhC,IAAA,IAAA,CAAiB,aAAA,GAAgB,IAAUA,kBAAA,CAAA,aAAA,EAAc;AACzD,IAAA,IAAA,CAAQ,SAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,aAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AAGvC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,cAAc,OAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,YAAY,SAAA,EAA8B;AAChD,IAAA,MAAM,MAAA,GAAS,UAAU,MAAA,CAAO,MAAA;AAEhC,IAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,MAAM,UAAA,GAAa,IAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,MAAM,UAAA,GAAa,IAAUA,kBAAA,CAAA,KAAA,CAAM,MAAA,CAAO,SAAS,SAAS,CAAA;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC9B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,MAAM,OAAA,GAAU,qBAAA;AAAA,QACd,OAAO,QAAA,CAAS,MAAA;AAAA,QAChB,OAAO,QAAA,CAAS;AAAA,OAClB;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AACrB,MAAA,IAAA,CAAK,MAAM,UAAA,GAAa,OAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA;AAC5C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,MAAM,UAAA,GAAa,IAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,QAAA,IAAY,IAAA,CAAK,aAAA,EAAe;AAC3D,MAAA,IAAA,CAAK,KAAA,CAAM,aAAa,IAAA,CAAK,aAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AACvB,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACjB,QAAA;AAAA,MACA,CAAC,OAAA,KAAY;AACX,QAAA,IAAI,IAAA,CAAK,oBAAoB,QAAA,EAAU;AACrC,UAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,UAAA,GAAmBA,kBAAA,CAAA,cAAA;AAC3B,QAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AACrB,QAAA,IAAA,CAAK,MAAM,UAAA,GAAa,OAAA;AAAA,MAC1B,CAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAM;AACJ,QAAA,IAAI,IAAA,CAAK,oBAAoB,QAAA,EAAU;AACrC,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,UAAA,IAAA,CAAK,MAAM,UAAA,GAAa,IAAA;AAAA,QAC1B;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,SAAS,SAAA,EAA8B;AAC7C,IAAA,MAAM,GAAA,GAAM,UAAU,MAAA,CAAO,GAAA;AAE7B,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,MAAM,GAAA,GAAM,IAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,KAAA,CAAM,GAAA,CAAI,SAAS,SAAS,CAAA;AACvD,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,GAAA,CAAI,OAAO,IAAI,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,CAAA;AAClE,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAA,GAAM,IAAA,GAAO,EAAA;AAC/E,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,eAAe,YAAY,CAAA;AACvD,MAAA,IAAA,CAAK,MAAM,GAAA,GAAM,IAAUA,kBAAA,CAAA,GAAA,CAAI,QAAA,EAAU,MAAM,GAAG,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,OAAO,CAAA,GACnD,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,GAAA,CAAI,WAAA,CAAY,OAAO,CAAA,GAC7C,IAAA;AACJ,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAUA,kBAAA,CAAA,OAAA,CAAQ,UAAU,OAAO,CAAA;AAAA,EACtD;AAAA,EAEA,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AACzC,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AAC3B,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,QAAA,IAAA,CAAK,MAAM,UAAA,GAAa,IAAA;AACxB,QAAA,IAAA,CAAK,MAAM,GAAA,GAAM,IAAA;AAAA,MACnB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA;AAC5D,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,MAAM,CAAA;AACvD,IAAA,IAAI,IAAA,CAAK,cAAc,aAAA,EAAe;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,aAAA;AACjB,IAAA,IAAA,CAAK,YAAY,WAAW,CAAA;AAC5B,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AAAA,EAC3B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AACF,CAAA;AA5IwD,MAAA,CAAA,sBAAA,EAAA,uBAAA,CAAA;AAAjD,IAAM,qBAAA,GAAN;AC/CA,IAAM,yBAAA,GAAN,MAAM,yBAAA,CAA8C;AAAA,EAQzD,WAAA,CACE,QAAA,EACA,KAAA,EACA,MAAA,EACA;AARF,IAAA,IAAA,CAAQ,SAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,QAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,eAAA,GAAkB,KAAA;AAOxB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEQ,mBAAmB,OAAA,EAAwB;AACjD,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA;AACvB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,+BAAA,GAAkC,OAAA;AACtD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA,CAAK,MAAM,QAAA,CAAS,yBAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAgB,IAAA,CAAK,QAAA;AAK3B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA,EAAG;AACvC,MAAA,KAAA,MAAW,IAAA,IAAQ,cAAc,MAAA,EAAQ;AACvC,QAAA,IAAA,CAAK,OAAA,IAAU;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,OAAA,IAAU;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,EAC/B;AAAA,EAEQ,cAAc,MAAA,EAAmC;AACvD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAIC,gCAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AACjD,IAAA,QAAA,CAAS,QAAQ,IAAIC,wBAAA,CAAW,KAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAExD,IAAA,IAAI,MAAA,CAAO,IAAI,OAAA,EAAS;AACtB,MAAA,QAAA,CAAS,OAAA;AAAA,QACP,IAAIC,sBAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAK,MAAA,EAAQ;AAAA,UACrC,KAAA,EAAO,OAAO,GAAA,CAAI,aAAA;AAAA,UAClB,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,WAAW,CAAA;AAAA,UAC5C,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,UAAU;AAAA,SAC3C;AAAA,OACH;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,MAAM,OAAA,EAAS;AACxB,MAAA,MAAM,OAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAUC,4BAAS,CAAA;AACtD,MAAA,QAAA,CAAS,OAAA;AAAA,QACP,IAAIC,kCAAA;AAAA,UACF,IAAUD,kBAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,UACzC,OAAO,KAAA,CAAM,SAAA;AAAA,UACb,OAAO,KAAA,CAAM,MAAA;AAAA,UACb,OAAO,KAAA,CAAM;AAAA;AACf,OACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,IAAA,GAAO,IAAIE,wBAAA,CAAWC,gCAAc,CAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,MAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,QAAA;AAC/B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAA,GAAQ,OAAO,QAAA,CAAS,MAAA;AAAA,MACjC;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,KAAA,GAAQ,OAAO,QAAA,CAAS,QAAA;AAAA,MACnC;AACA,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAA,CAAO,cAAc,OAAA,EAAS;AAChC,MAAA,MAAM,IAAA,GAAO,IAAID,wBAAA,CAAWE,0CAAmB,CAAA;AAC/C,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,CAAS,GAAA;AAC1B,MAAA,MAAM,UAAA,GAAa,KAAK,QAAA,CAAS,UAAA;AACjC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,GAAA,CAAI,KAAA,GAAQ,OAAO,aAAA,CAAc,GAAA;AAAA,MACnC;AACA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,CAAW,KAAA,GAAQ,OAAO,aAAA,CAAc,UAAA;AAAA,MAC1C;AACA,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAA,CAAO,MAAM,OAAA,EAAS;AACxB,MAAA,MAAM,IAAA,GAAO,IAAIF,wBAAA,CAAWG,0BAAW,CAAA;AACvC,MAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,MAAA;AAC7B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAA,GAAQ,OAAO,KAAA,CAAM,SAAA;AAAA,MAC9B;AACA,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAA,CAAO,MAAM,OAAA,EAAS;AACxB,MAAA,QAAA,CAAS,QAAQ,IAAIC,oBAAA,CAAS,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,MAAA,CAAO,UAAU,OAAA,EAAS;AAC5B,MAAA,QAAA,CAAS,OAAA;AAAA,QACP,IAAIC,8BAAA;AAAA,UACF,IAAUP,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,UACtB,MAAA,CAAO,SAAA,CAAU,KAAA,IAAS,MAAA,CAAO,SAAA,CAAU,cAAA;AAAA,UAC3C,MAAA,CAAO,SAAA,CAAU,KAAA,IAAS,MAAA,CAAO,SAAA,CAAU;AAAA;AAC7C,OACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,OAAO,IAAIQ,oBAAA,CAAS,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AACjD,MAAA,IAAA,CAAK,YAAA,GAAe,OAAO,IAAA,CAAK,MAAA;AAChC,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,cAAc,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,KAAK,SAAS,CAAA;AACvD,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAA,CAAO,OAAO,OAAA,EAAS;AACzB,MAAA,MAAM,IAAA,GAAO,IAAIC,wBAAA,EAAW;AAC5B,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAC1C,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,IAAIC,wBAAA,EAAY,CAAA;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,yBAAA,GAA4B,QAAA;AAChD,IAAA,IAAA,CAAK,mBAAmB,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAC5C,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AAC3B,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,QAAA,OAAO,IAAA,CAAK,MAAM,QAAA,CAAS,iBAAA;AAAA,MAC7B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAiB,KAAA,CAAM,YAAA,CAAa,SAAA,CAAU,CAAC,GAAG,cAAc,CAAA;AACtE,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,MAAM,CAAA;AAC1D,IAAA,IAAI,IAAA,CAAK,cAAc,aAAA,EAAe;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,aAAA;AACjB,IAAA,IAAA,CAAK,aAAA,CAAc,eAAe,MAAM,CAAA;AAExC,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,iBAAA,GAAoB,cAAA,CAAe,MAAA;AAAA,EACzD;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAM,QAAA,CAAS,iBAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAM,QAAA,CAAS,+BAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAM,QAAA,CAAS,yBAAA;AAAA,EAC7B;AACF,CAAA;AAxL2D,MAAA,CAAA,yBAAA,EAAA,0BAAA,CAAA;AAApD,IAAM,wBAAA,GAAN;ACKP,IAAM,QAAA,GAAW,IAAA;AAEjB,SAAS,UAAA,CACP,QACA,QAAA,EACmD;AACnD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAO,OAAO,aAAA,CAAc,KAAA;AAAA,IAC9B,KAAK,mBAAA;AACH,MAAA,OAAO,OAAO,aAAA,CAAc,sBAAA;AAAA,IAC9B,KAAK,mBAAA;AACH,MAAA,OAAO,OAAO,aAAA,CAAc,sBAAA;AAAA,IAC9B,KAAK,SAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAO,aAAA,CAAc,OAAA;AAAA;AAElC;AAfS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAiBT,SAAS,mBAAA,CACP,QACA,QAAA,EACmD;AACnD,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,OAAO,MAAA,CAAO,cAAc,KAAA,EAAM;AAAA,EACpC;AAEA,EAAA,IAAI,aAAa,mBAAA,EAAqB;AACpC,IAAA,OAAO,MAAA,CAAO,cAAc,sBAAA,EAAuB;AAAA,EACrD;AAEA,EAAA,IAAI,aAAa,mBAAA,EAAqB;AACpC,IAAA,OAAO,MAAA,CAAO,cAAc,sBAAA,EAAuB;AAAA,EACrD;AAEA,EAAA,OAAO,MAAA,CAAO,cAAc,OAAA,EAAQ;AACtC;AAjBS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAmBT,SAAS,oBAAA,CACP,gBACA,MAAA,EACe;AACf,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAUC,kBAAA,CAAA,OAAA,EAAQ;AAChC,EAAA,MAAA,CAAO,cAAc,KAAK,CAAA;AAE1B,EAAA,OAAO;AAAA,IACL,GAAG,cAAA;AAAA,IACH,IAAA,EAAM;AAAA,MACJ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAA,CAAe,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,IAAK,CAAC,CAAC,CAAA;AAAA,MACpE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAA,CAAe,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,IAAK,CAAC,CAAC,CAAA;AAAA,MACpE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAA,CAAe,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,IAAK,CAAC,CAAC;AAAA,KACtE;AAAA,IACA,QAAQ,IAAA,CAAK,GAAA;AAAA,MACX,QAAA;AAAA,MACA,eAAe,MAAA,GACb,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,CAAM,CAAA,IAAK,CAAC,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,CAAM,CAAA,IAAK,CAAC,GAAG,CAAC;AAAA,KAC9D;AAAA,IACA,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAA,CAAe,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,IAAK,CAAC,CAAC;AAAA,GAC3E;AACF;AAzBS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AA2BT,SAAS,kBAAA,CACP,MAAA,EACA,MAAA,EACA,WAAA,EACkD;AAClD,EAAA,IAAI,IAAA;AAEJ,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,SAAA,IAAa,WAAA,EAAa;AAC7C,IAAA,IAAA,GAAO,OAAO,YAAA,CAAa,OAAA;AAAA,MACzB,WAAA,CAAY,QAAA;AAAA,MACZ,WAAA,CAAY;AAAA,KACd;AAAA,EACF,CAAA,MAAA,IAAW,MAAA,CAAO,KAAA,KAAU,MAAA,EAAQ;AAClC,IAAA,IAAA,GAAO,MAAA,CAAO,aAAa,IAAA,CAAK,IAAA,CAAK,IAAI,QAAA,EAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EACnE,CAAA,MAAA,IAAW,MAAA,CAAO,KAAA,KAAU,SAAA,EAAW;AACrC,IAAA,IAAA,GAAO,OAAO,YAAA,CAAa,OAAA;AAAA,MACzB,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,MACpC,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,MAAM;AAAA,KAClC;AAAA,EACF,CAAA,MAAA,IAAW,MAAA,CAAO,KAAA,KAAU,UAAA,EAAY;AACtC,IAAA,IAAA,GAAO,OAAO,YAAA,CAAa,QAAA;AAAA,MACzB,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,MACpC,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,MAAM;AAAA,KAClC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,OAAO,YAAA,CAAa,MAAA;AAAA,MACzB,KAAK,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACpC,KAAK,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACpC,KAAK,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,WAAW,CAAC,CAAA;AACnD,EAAA,IAAA,CAAK,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAC,CAAA;AAC7C,EAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAE9B,EAAA,IAAA,CAAK,cAAA;AAAA,IACH,OAAO,cAAA,CAAe,CAAA;AAAA,IACtB,OAAO,cAAA,CAAe,CAAA;AAAA,IACtB,OAAO,cAAA,CAAe;AAAA,GACxB;AAEA,EAAA,MAAM,gBAAA,GAAmB,IAAUA,kBAAA,CAAA,UAAA,EAAW,CAAE,YAAA;AAAA,IAC9C,IAAUA,kBAAA,CAAA,KAAA;AAAA,MACR,OAAO,cAAA,CAAe,CAAA;AAAA,MACtB,OAAO,cAAA,CAAe,CAAA;AAAA,MACtB,OAAO,cAAA,CAAe;AAAA;AACxB,GACF;AACA,EAAA,IAAA,CAAK,YAAY,gBAAgB,CAAA;AAEjC,EAAA,OAAO,IAAA;AACT;AApDS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAiFF,SAAS,oBACd,MAAA,EACqB;AACrB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAA,CAAO,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAEnC,EAAA,MAAM,UAAA,GAAa,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACrC,EAAA,MAAA,CAAO,cAAc,UAAU,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAAA,IAC7B,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAAA,IAC7B,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,IAAK;AAAA,GAC/B;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,KAAK,MAAA,CAAO,WAAW,EAAE,MAAA,EAAO;AAE1E,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,MAAA,CAAO,QAAA,CAAS,CAAC,KAAA,KAAU;AACzB,IAAA,IAAI,EAAE,KAAA,YAAuBA,kBAAA,CAAA,IAAA,CAAA,IAAS,CAAC,MAAM,QAAA,EAAU;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,IAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,YAAA,CAAa,UAAU,CAAA;AAC1D,IAAA,IAAI,CAAC,iBAAA,IAAqB,iBAAA,CAAkB,QAAA,GAAW,CAAA,EAAG;AACxD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,gBAAgB,iBAAA,CAAkB,KAAA;AACxC,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,SAAS,QAAA,EAAS;AACzC,IAAA,MAAM,UAAA,GAAa,iBACf,cAAA,CAAe,KAAA,GACf,KAAK,KAAA,CAAM,aAAA,GAAgB,CAAC,CAAA,GAAI,CAAA;AACpC,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,gBAAA;AAAA,MACzC,aAAA;AAAA,MACA,KAAA,CAAM;AAAA,KACR;AACA,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,QAAA,CACpC,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC/B,IAAA,CAAK,GAAG,CAAA;AAEX,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA,EAAW,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAI,eAAe,CAAA;AAAA,KAC5F,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,MAAM,iBAAiB,CAAA,EAAG,KAAA,CAAM,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AACxF,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,EAAW,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,GACzE;AACF;AAzEgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AA4ET,SAAS,kBACd,SAAA,EACoB;AACpB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,SAAA;AACzB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,WAAA,IAAe,IAAA,CAAK,aAAA;AACpB,IAAA,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,EACrB;AACA,EAAA,IAAI,WAAA,GAAc,CAAA,IAAK,UAAA,GAAa,CAAA,EAAG;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,YAAA,CAAa,WAAA,GAAc,CAAC,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY,UAAU,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAChC,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAE,iBAAA,EAAmB,cAAA,EAAgB,cAAA,EAAe,GAAI,IAAA;AAC9D,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA,CAAK,aAAA,EAAe,SAAS,CAAA,EAAG;AAC1D,MAAA,KAAA,CACG,GAAA;AAAA,QACC,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAAA,QAC5B,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAAA,QAC5B,iBAAA,CAAkB,KAAK,KAAK;AAAA,OAC9B,CACC,aAAa,cAAc,CAAA;AAE9B,MAAA,MAAM,WAAA,GAAA,CAAe,eAAe,KAAA,IAAS,CAAA;AAC7C,MAAA,QAAA,CAAS,WAAW,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,CAAA;AACxC,MAAA,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,GAAI,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA;AAC5C,MAAA,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,GAAI,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA,EAAG;AACvD,QAAA,OAAA,CAAQ,cAAc,KAAK,CAAA,GAAI,YAAA,GAAe,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,MACzE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA,EAAG;AACvD,QAAA,OAAA,CAAQ,WAAA,GAAc,KAAK,CAAA,GAAI,YAAA,GAAe,KAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,YAAA,IAAgB,IAAA,CAAK,aAAA;AACrB,IAAA,WAAA,IAAe,IAAA,CAAK,UAAA;AAAA,EACtB;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,UAAU,SAAA,EAAU;AAC7D;AAxDgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AA0DhB,SAAS,qBAAA,CACP,MACA,SAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,IAAUA,kBAAA,CAAA,UAAA,EAAW,CAAE,YAAA;AAAA,IACxC,IAAUA,kBAAA,CAAA,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,UAAU,QAAA,CAAS,CAAA,EAAG,SAAA,CAAU,QAAA,CAAS,CAAC;AAAA,GAClF;AAEA,EAAA,IAAA,CAAK,cAAA;AAAA,IACH;AAAA,MACE,CAAA,EAAG,UAAU,QAAA,CAAS,CAAA;AAAA,MACtB,CAAA,EAAG,UAAU,QAAA,CAAS,CAAA;AAAA,MACtB,CAAA,EAAG,UAAU,QAAA,CAAS;AAAA,KACxB;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAA,CAAK,WAAA;AAAA,IACH;AAAA,MACE,GAAG,UAAA,CAAW,CAAA;AAAA,MACd,GAAG,UAAA,CAAW,CAAA;AAAA,MACd,GAAG,UAAA,CAAW,CAAA;AAAA,MACd,GAAG,UAAA,CAAW;AAAA,KAChB;AAAA,IACA;AAAA,GACF;AACF;AAzBS,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AA2BT,SAAS,qBAAA,CACP,WACA,IAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,EAAS;AAE/B,EAAA,SAAA,CAAU,QAAA,CAAS,IAAI,QAAA,CAAS,CAAA;AAChC,EAAA,SAAA,CAAU,QAAA,CAAS,IAAI,QAAA,CAAS,CAAA;AAChC,EAAA,SAAA,CAAU,QAAA,CAAS,IAAI,QAAA,CAAS,CAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,IAAUA,kBAAA,CAAA,KAAA,EAAM,CAAE,iBAAA;AAAA,IAC9B,IAAUA,8BAAW,QAAA,CAAS,CAAA,EAAG,SAAS,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,CAAC;AAAA,GACrE;AAEA,EAAA,SAAA,CAAU,QAAA,CAAS,IAAI,KAAA,CAAM,CAAA;AAC7B,EAAA,SAAA,CAAU,QAAA,CAAS,IAAI,KAAA,CAAM,CAAA;AAC7B,EAAA,SAAA,CAAU,QAAA,CAAS,IAAI,KAAA,CAAM,CAAA;AAC/B;AAlBS,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAoBF,IAAM,kBAAA,GAAN,MAAM,kBAAA,CAAuC;AAAA,EAUlD,YAAY,OAAA,EAAkC;AAT9C,IAAA,IAAA,CAAiB,gBAAA,uBAAuB,GAAA,EAAsB;AAC9D,IAAA,IAAA,CAAiB,eAAA,uBAAsB,GAAA,EAAsB;AAC7D,IAAA,IAAA,CAAiB,mBAAA,uBAA0B,GAAA,EAAsB;AACjE,IAAA,IAAA,CAAiB,kBAAA,uBAAyB,GAAA,EAAsB;AAEhE,IAAA,IAAA,CAAQ,MAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,oBAAA,GAAuB,KAAA;AAC/B,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAA;AAGpB,IAAA,IAAA,CAAK,YAAA,GAAe,SAAS,QAAA,IAAY,KAAA;AAAA,EAC3C;AAAA,EAEA,MAAc,mBAAmB,KAAA,EAA6B;AAC5D,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,oBAAA,EAAsB;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,KAAA,CAAM,WAAW,EAAE,CAAC,CAAA;AACtD,MAAA,MAAM,WAAA,GACJ,OAAO,mBAAA,KAAwB,QAAA,GAC3B,MAAM,YAAA,CAAa,mBAAA,EAAqB,WAAW,CAAA,GACnD,KAAA,CAAA;AAEN,MAAA,MAAM,OAAA,GAAU,aAAa,MAAA,CAAO,OAAA;AACpC,MAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,kBAAA,CAAmB;AAAA,QACjD,OAAA,EAAS;AAAA,UACP,GAAG,OAAA,EAAS,CAAA;AAAA,UACZ,GAAG,OAAA,EAAS,CAAA;AAAA,UACZ,GAAG,OAAA,EAAS;AAAA;AACd,OACD,CAAA;AACD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,eAAA,EAAgB;AAChD,MAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AAAA,IAChB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,oBAAA,GAAuB,KAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,mBAAA,CACN,cACA,QAAA,EACM;AACN,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAC1D,IAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,YAAA,CAAa,eAAe,CAAA;AAC3D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,gBAAgB,SAAS,CAAA;AAAA,MACxC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AACrC,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,QAAQ,CAAA;AACpC,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,QAAQ,CAAA;AACxC,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAA,CAAM,iBAAgB,EAAG;AAC5C,MAAA,KAAK,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,eAAA,EAAgB;AAC3C,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,kBAAA,EAAoB,gBAAgB,CAAA;AACjE,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAc,QAAQ,CAAA;AAEjD,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAK,EAAG;AACnD,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjC,QAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,QAAQ,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,gBAAgB,CAAA;AAC7D,MAAA,MAAM,SAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,GAAG,MAAA,IAAU,IAAA;AACpE,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,OAAA,EAAS;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,OAAA,EAAS;AACrC,QAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,QAAQ,CAAA;AAC/C,QAAA,iBAAA,CAAkB,OAAA,EAAS,aAAa,IAAI,CAAA;AAC5C,QAAA,iBAAA,CAAkB,OAAA,EAAS,YAAY,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AASA,MAAA,MAAM,EAAE,IAAA,EAAM,gBAAA,EAAkB,GAAG,sBAAA,EAAuB,GACxD,QAAQ,MAAA,CAAO,SAAA;AACjB,MAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,SAAA,CAAU,sBAAsB,CAAA;AAChE,MAAA,MAAM,0BAAA,GAA6B,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,QAAQ,CAAA;AACxE,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AACvD,MAAA,MAAM,kBAAA,GACJ,CAAC,YAAA,IAAgB,0BAAA,KAA+B,kBAAA;AAElD,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,QAAQ,CAAA;AAE/C,QAAA,MAAM,mBACJ,OAAA,CAAQ,MAAA,CAAO,UAAU,gBAAA,IAAoB,OAAA,CAAQ,OAAO,SAAA,CAAU,gBAAA;AACxE,QAAA,MAAM,mBACJ,OAAA,CAAQ,MAAA,CAAO,UAAU,gBAAA,IAAoB,OAAA,CAAQ,OAAO,SAAA,CAAU,gBAAA;AACxE,QAAA,MAAM,mBACJ,OAAA,CAAQ,MAAA,CAAO,UAAU,gBAAA,IAAoB,OAAA,CAAQ,OAAO,SAAA,CAAU,gBAAA;AACxE,QAAA,MAAM,gBACJ,OAAA,CAAQ,MAAA,CAAO,UAAU,aAAA,IAAiB,OAAA,CAAQ,OAAO,SAAA,CAAU,aAAA;AACrE,QAAA,MAAM,gBACJ,OAAA,CAAQ,MAAA,CAAO,UAAU,aAAA,IAAiB,OAAA,CAAQ,OAAO,SAAA,CAAU,aAAA;AACrE,QAAA,MAAM,gBACJ,OAAA,CAAQ,MAAA,CAAO,UAAU,aAAA,IAAiB,OAAA,CAAQ,OAAO,SAAA,CAAU,aAAA;AAErE,QAAA,MAAM,WAAW,IAAA,CAAK,YAAA,GAAe,OAAA,GAAU,OAAA,CAAQ,OAAO,SAAA,CAAU,IAAA;AACxE,QAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA,CACvD,gBAAA,CAAiB,OAAA,CAAQ,MAAA,CAAO,UAAU,aAAa,CAAA,CACvD,iBAAA,CAAkB,OAAA,CAAQ,OAAO,SAAA,CAAU,cAAc,CAAA,CACzD,eAAA,CAAgB,QAAQ,MAAA,CAAO,SAAA,CAAU,YAAY,CAAA,CACrD,YAAY,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,QAAQ,EAC7C,aAAA,CAAc,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA,CACjD,mBAAA;AAAA,UACC,CAAC,gBAAA;AAAA,UACD,CAAC,gBAAA;AAAA,UACD,CAAC;AAAA,SACH,CACC,gBAAA;AAAA,UACC,CAAC,aAAA;AAAA,UACD,CAAC,aAAA;AAAA,UACD,CAAC;AAAA,SACH;AAEF,QAAA,QAAA,CAAS,cAAA;AAAA,UACP,UAAU,QAAA,CAAS,CAAA;AAAA,UACnB,UAAU,QAAA,CAAS,CAAA;AAAA,UACnB,UAAU,QAAA,CAAS;AAAA,SACrB;AAEA,QAAA,MAAM,UAAA,GAAa,IAAUA,kBAAA,CAAA,UAAA,EAAW,CAAE,YAAA;AAAA,UACxC,IAAUA,kBAAA,CAAA,KAAA;AAAA,YACR,UAAU,QAAA,CAAS,CAAA;AAAA,YACnB,UAAU,QAAA,CAAS,CAAA;AAAA,YACnB,UAAU,QAAA,CAAS;AAAA;AACrB,SACF;AACA,QAAA,QAAA,CAAS,YAAY,UAAU,CAAA;AAE/B,QAAA,MAAMC,KAAAA,GAAO,YAAA,CAAa,eAAA,CAAgB,QAAQ,CAAA;AAClD,QAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,QAAQ,MAAA,CAAO,SAAA,CAAU,SAAS,SAAA,EAAW;AACrE,UAAAA,MAAK,iBAAA,CAAkB,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,QAC5D;AAEA,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAUA,KAAAA,CAAK,MAAM,CAAA;AAC/C,QAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,QAAA,EAAU,kBAAkB,CAAA;AACzD,QAAA,iBAAA,CAAkB,OAAA,EAAS,aAAaA,KAAI,CAAA;AAAA,MAC9C;AAEA,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAC1D,MAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,YAAA,CAAa,eAAe,CAAA;AACtD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,QAAQ,CAAA;AAC/C,QAAA,iBAAA,CAAkB,OAAA,EAAS,aAAa,IAAI,CAAA;AAC5C,QAAA,iBAAA,CAAkB,OAAA,EAAS,YAAY,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AAEA,MAAA,iBAAA,CAAkB,OAAA,EAAS,aAAa,IAAI,CAAA;AAI5C,MAAA,MAAM,kBAAkB,IAAA,CAAK,YAAA,GACzB,OAAA,GACA,OAAA,CAAQ,OAAO,SAAA,CAAU,IAAA;AAC7B,MAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,eAAe,CAAA;AACjE,MAAA,IAAI,IAAA,CAAK,QAAA,EAAS,KAAM,iBAAA,EAAmB;AACzC,QAAA,IAAA,CAAK,WAAA,CAAY,mBAAmB,IAAI,CAAA;AAGxC,QAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,eAAA,KAAoB,SAAA,EAAW;AACvD,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,QAC5D;AAAA,MACF;AAIA,MAAA,MAAM,UAAU,OAAA,CAAQ,eAAA;AACxB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,iBAAA,CAAkB,OAAA,EAAS,mBAAmB,IAAI,CAAA;AAClD,QAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,eAAA,KAAoB,SAAA,EAAW;AACvD,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AACnC,YAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,UACtC,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,YAAA,IAAgB,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,SAAS,SAAA,EAAW;AACpE,QAAA,qBAAA,CAAsB,MAAM,SAAS,CAAA;AAAA,MACvC;AAEA,MAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,OAAA,CAAQ,MAAA,CAAO,UAAU,MAAM,CAAA;AAG9E,MAAA,MAAM,eACJ,iBAAA,CAAkB,KAAA,KAAU,SAAA,GAAY,mBAAA,CAAoB,MAAM,CAAA,GAAI,IAAA;AAExE,MAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,iBAAA,CAAkB,OAAA,EAAS;AACpD,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AACxD,QAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AACtC,UAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,WAAA,CAAY,cAAc,CAAA;AAChE,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,YAAA,CAAa,cAAA,CAAe,kBAAkB,IAAI,CAAA;AAAA,UACpD;AAAA,QACF;AACA,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,QAAQ,CAAA;AACpC,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,QAAQ,CAAA;AACvC,QAAA,iBAAA,CAAkB,OAAA,EAAS,YAAY,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,iBAAA,GAAoB,GAAG,IAAA,CAAK,SAAA,CAAU,iBAAiB,CAAC,CAAA,CAAA,EAAI,YAAA,EAAc,SAAA,IAAa,EAAE,CAAA,CAAA;AAC/F,MAAA,MAAM,yBAAA,GAA4B,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA;AACtE,MAAA,IACE,CAAC,IAAA,CAAK,eAAA,CAAgB,IAAI,QAAQ,CAAA,IAClC,8BAA8B,iBAAA,EAC9B;AACA,QAAA,MAAM,sBAAA,GAAyB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAChE,QAAA,IAAI,OAAO,2BAA2B,QAAA,EAAU;AAC9C,UAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,WAAA,CAAY,sBAAsB,CAAA;AACxE,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,YAAA,CAAa,cAAA,CAAe,kBAAkB,IAAI,CAAA;AAAA,UACpD;AAAA,QACF;AAEA,QAAA,MAAM,YAAA,GAAe,kBAAA;AAAA,UACnB,IAAA,CAAK,MAAA;AAAA,UACL,iBAAA;AAAA,UACA,kBAAkB,YAAY;AAAA,SAChC;AACA,QAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,cAAA,CAAe,YAAA,EAAc,IAAI,CAAA;AACtE,QAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAA,EAAU,eAAA,CAAgB,MAAM,CAAA;AACzD,QAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,iBAAiB,CAAA;AACvD,QAAA,iBAAA,CAAkB,OAAA,EAAS,YAAY,eAAe,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AACxD,QAAA,iBAAA;AAAA,UACE,OAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAO,cAAA,KAAmB,QAAA,GACrB,aAAa,WAAA,CAAY,cAAc,KAAK,IAAA,GAC7C;AAAA,SACN;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,KAAA,CAAM,WAAW,EAAE,CAAC,CAAA;AACtD,MAAA,MAAM,WAAA,GACJ,OAAO,mBAAA,KAAwB,QAAA,GAC3B,MAAM,YAAA,CAAa,mBAAA,EAAqB,WAAW,CAAA,GACnD,MAAA;AACN,MAAA,MAAM,aAAA,GACJ,OAAO,WAAA,EAAa,MAAA,CAAO,aAAA,KAAkB,QAAA,IAC7C,WAAA,CAAY,MAAA,CAAO,aAAA,GAAgB,CAAA,GAC/B,WAAA,CAAY,MAAA,CAAO,aAAA,GACnB,IAAA;AAEN,MAAA,MAAM,YAAA,GACJ,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,SAAA,GAAY,CAAA,GACtC,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA,GACvB,aAAA;AAEN,MAAA,IAAA,CAAK,WAAA,IAAe,YAAA;AAEpB,MAAA,OAAO,IAAA,CAAK,eAAe,aAAA,EAAe;AACxC,QAAA,YAAA,CAAa,sBAAsB,EAAA,GAAK,aAAA;AACxC,QAAA,YAAA,CAAa,IAAA,EAAK;AAClB,QAAA,IAAA,CAAK,WAAA,IAAe,aAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,gBAAgB,CAAA;AAC7D,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,MAAA,IACE,CAAC,OAAA,IACD,CAAC,SAAA,IACD,IAAA,CAAK,gBACL,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,IAAA,KAAS,SAAA,EAClC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAC1D,MAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,YAAA,CAAa,eAAe,CAAA;AACtD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA;AAAA,MACF;AAEA,MAAA,qBAAA,CAAsB,WAAW,IAAI,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,QAAQ,KAAA,EAAoB;AAC1B,IAAA,MAAM,YAAA,GAAe,MAAM,eAAA,EAAgB;AAC3C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAK,EAAG;AACnD,QAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,QAAQ,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAC/B,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AACF,CAAA;AAvVoD,MAAA,CAAA,kBAAA,EAAA,mBAAA,CAAA;AAA7C,IAAM,iBAAA,GAAN;;;AC/VA,IAAM,YAAA,GAAe;AAAA,EAC1B,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAO,GAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,aAAA;AAAA,EACb,YAAA,EAAc,cAAA;AAAA,EACd,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,KAAA,EAAO,OAAA;AAAA,EACP,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO,GAAA;AAAA,EACP,KAAA,EAAO,GAAA;AAAA,EACP,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,SAAA,EAAW,IAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,KAAA,EAAO,GAAA;AAAA,EACP,SAAA,EAAW,GAAA;AAAA,EACX,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAO,GAAA;AAAA,EACP,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK;AACP;;;ACrFA,SAAS,aAAa,GAAA,EAAmC;AACvD,EAAA,OAAO,IAAI,WAAA,EAAY;AACzB;AAFS,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAMT,SAAS,qBAAqB,MAAA,EAA+C;AAC3E,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,WAAA,EAAY;AACtC,EAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,QAAA,EAAU;AACtD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,GAAA;AAChB;AAnBS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAqBF,IAAM,YAAA,GAAN,MAAM,YAAA,CAAiC;AAAA,EA0J5C,WAAA,GAAc;AAzJd,IAAA,IAAA,CAAiB,IAAA,uBAAW,GAAA,EAAY;AACxC,IAAA,IAAA,CAAiB,IAAA,uBAAW,GAAA,EAAY;AACxC,IAAA,IAAA,CAAiB,EAAA,uBAAS,GAAA,EAAY;AACtC,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAY;AAC/C,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAAY;AAE7C,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAAY;AAC7C,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAAY;AAC7C,IAAA,IAAA,CAAiB,OAAA,uBAAc,GAAA,EAAY;AAC3C,IAAA,IAAA,CAAiB,gBAAA,uBAAuB,GAAA,EAAY;AACpD,IAAA,IAAA,CAAiB,cAAA,uBAAqB,GAAA,EAAY;AAElD,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAA;AACvB,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAA;AACvB,IAAA,IAAA,CAAQ,mBAAA,GAAsB,CAAA;AAC9B,IAAA,IAAA,CAAQ,mBAAA,GAAsB,CAAA;AAC9B,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,IAAA,CAAQ,kBAAA,GAAqB,CAAA;AAC7B,IAAA,IAAA,CAAQ,kBAAA,GAAqB,CAAA;AAC7B,IAAA,IAAA,CAAQ,aAAA,GAAgB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AACrC,IAAA,IAAA,CAAQ,kBAAA,GAAyC,IAAA;AACjD,IAAA,IAAA,CAAQ,yBAAA,GAA4B,KAAA;AAsBpC,IAAA,IAAA,CAAQ,SAAA,2BAAa,KAAA,KAA+B;AAClD,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAEpC,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,WAAA,CAAY,IAAI,GAAG,CAAA;AAAA,MAC1B;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,GAAG,CAAA;AAIjB,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACxB,UAAA,IAAA,CAAK,WAAA,CAAY,IAAI,IAAI,CAAA;AAAA,QAC3B;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA,EAlBoB,WAAA,CAAA;AAoBpB,IAAA,IAAA,CAAQ,OAAA,2BAAW,KAAA,KAA+B;AAChD,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAEpC,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAEtB,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,IAAA,CAAK,IAAA,CAAK,OAAO,IAAI,CAAA;AACrB,QAAA,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,EAXkB,SAAA,CAAA;AAalB,IAAA,IAAA,CAAQ,+BAAe,MAAA,CAAA,MAAY;AACjC,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAA,EAFuB,cAAA,CAAA;AAIvB,IAAA,IAAA,CAAQ,WAAA,2BAAe,KAAA,KAA4B;AACjD,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAErB,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,EAAG;AAC/B,QAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,MAAM,CAAA;AAAA,MAClC;AAEA,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,MAAM,CAAA;AAKzB,MAAA,IAAI,KAAK,yBAAA,EAA2B;AAClC,QAAA,IAAA,CAAK,yBAAA,GAA4B,KAAA;AACjC,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,IAAsB,QAAA,CAAS,IAAA;AAC1D,QAAA,IAAI,aAAA,IAAiB,OAAO,aAAA,CAAc,kBAAA,KAAuB,UAAA,EAAY;AAC3E,UAAA,MAAM,MAAA,GAAS,cAAc,kBAAA,EAAmB;AAChD,UAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,YAAA,MAAA,CAAO,MAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,EAtBsB,aAAA,CAAA;AAwBtB,IAAA,IAAA,CAAQ,SAAA,2BAAa,KAAA,KAA4B;AAC/C,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAErB,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,MAAM,CAAA;AAC5B,MAAA,IAAA,CAAK,cAAA,CAAe,IAAI,MAAM,CAAA;AAAA,IAChC,CAAA,EALoB,WAAA,CAAA;AAOpB,IAAA,IAAA,CAAQ,YAAA,2BAAgB,KAAA,KAA4B;AAClD,MAAA,IAAA,CAAK,uBAAuB,KAAA,CAAM,MAAA;AAClC,MAAA,IAAA,CAAK,uBAAuB,KAAA,CAAM,MAAA;AAAA,IACpC,CAAA,EAHuB,cAAA,CAAA;AAKvB,IAAA,IAAA,CAAQ,WAAA,2BAAe,KAAA,KAA4B;AACjD,MAAA,IAAI,IAAA,CAAK,sBAAqB,EAAG;AAC/B,QAAA,IAAA,CAAK,sBAAsB,KAAA,CAAM,SAAA;AACjC,QAAA,IAAA,CAAK,sBAAsB,KAAA,CAAM,SAAA;AACjC,QAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,UACnB,CAAA,EAAG,IAAA,CAAK,aAAA,CAAc,CAAA,GAAI,KAAA,CAAM,SAAA;AAAA,UAChC,CAAA,EAAG,IAAA,CAAK,aAAA,CAAc,CAAA,GAAI,KAAA,CAAM;AAAA,SAClC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,sBAAsB,KAAA,CAAM,SAAA;AACjC,MAAA,IAAA,CAAK,sBAAsB,KAAA,CAAM,SAAA;AAEjC,MAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,QACnB,GAAG,KAAA,CAAM,OAAA;AAAA,QACT,GAAG,KAAA,CAAM;AAAA,OACX;AAAA,IACF,CAAA,EAlBsB,aAAA,CAAA;AAoBtB,IAAA,IAAA,CAAQ,sCAAsB,MAAA,CAAA,MAAY;AACxC,MAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,EAAqB,EAAG;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,KAAK,oBAAA,EAAqB;AACzC,MAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,QACnB,CAAA,EAAA,CAAI,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,CAAA;AAAA,QACjC,CAAA,EAAA,CAAI,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ;AAAA,OACnC;AAAA,IACF,CAAA,EAV8B,qBAAA,CAAA;AAY9B,IAAA,IAAA,CAAQ,qCAAqB,MAAA,CAAA,MAAY;AAAA,IAEzC,CAAA,EAF6B,oBAAA,CAAA;AAK3B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACjD,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAC7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACrD,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACjD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACvD,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,IAAA,CAAK,cAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AACrE,IAAA,MAAA,CAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,YAAY,CAAA;AACjD,IAAA,QAAA,CAAS,gBAAA,CAAiB,mBAAA,EAAqB,IAAA,CAAK,mBAAmB,CAAA;AACvE,IAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,kBAAkB,CAAA;AAAA,EACvE;AAAA,EA/IQ,oBAAA,GAAmF;AACzF,IAAA,MAAM,gBAAgB,IAAA,CAAK,kBAAA;AAC3B,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,IAAA,GAAO,cAAc,qBAAA,EAAsB;AACjD,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,GAAA;AAAA,QACX,MAAM,IAAA,CAAK,KAAA;AAAA,QACX,MAAM,IAAA,CAAK;AAAA,OACb;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,UAAA,GAAa,CAAA;AAAA,MAC1D,IAAA,EAAM,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,WAAA,GAAc;AAAA,KAC7D;AAAA,EACF;AAAA,EA+HA,sBAAsB,OAAA,EAAmC;AACvD,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAA;AAAA,EAC5B;AAAA,EAEA,gBAAA,GAA4B;AAC1B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,IAAsB,QAAA,CAAS,IAAA;AAC1D,IAAA,IAAI,CAAC,aAAA,IAAiB,OAAO,aAAA,CAAc,uBAAuB,UAAA,EAAY;AAC5E,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,cAAc,kBAAA,EAAmB;AAKhD,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,MAAA,CAAO,MAAM,MAAM;AACjB,UAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AAAA,QACnC,CAAC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,kBAAA,GAA8B;AAC5B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,yBAAA,GAA4B,KAAA;AAEjC,IAAA,IAAI,CAAC,QAAA,CAAS,kBAAA,IAAsB,OAAO,QAAA,CAAS,oBAAoB,UAAA,EAAY;AAClF,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,QAAA,CAAS,eAAA,EAAgB;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,oBAAA,GAAgC;AAC9B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,2BAA2B,QAAA,CAAS,kBAAA;AAC1C,IAAA,IAAI,CAAC,wBAAA,EAA0B;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,KAAK,kBAAA,EAAoB;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,6BAA6B,IAAA,CAAK,kBAAA;AAAA,EAC3C;AAAA,EAEA,OAAO,GAAA,EAAoC;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,EACxC;AAAA,EAEA,WAAW,GAAA,EAAoC;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,EACxC;AAAA,EAEA,SAAS,GAAA,EAAoC;AAC3C,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,EACtC;AAAA,EAEA,eAAe,GAAA,EAAoC;AACjD,IAAA,MAAM,UAAA,GAAa,aAAa,GAAG,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,UAAU,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,MAAA,EAAgD;AACvD,IAAA,MAAM,gBAAA,GAAmB,qBAAqB,MAAM,CAAA;AACpD,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,gBAAgB,CAAA,EAAG;AACvC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,gBAAgB,CAAA;AAAA,EAC5C;AAAA,EAEA,aAAa,MAAA,EAAgD;AAC3D,IAAA,MAAM,gBAAA,GAAmB,qBAAqB,MAAM,CAAA;AACpD,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,gBAAgB,CAAA,EAAG;AACvC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,gBAAgB,CAAA;AAAA,EAC5C;AAAA,EAEA,WAAW,MAAA,EAAgD;AACzD,IAAA,MAAM,gBAAA,GAAmB,qBAAqB,MAAM,CAAA;AACpD,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,gBAAgB,CAAA,EAAG;AACvC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAAA,EAC1C;AAAA,EAEA,cAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,EAC/B;AAAA,EAEA,kBAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,gBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,EACjC;AAAA,EAEA,cAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL,GAAG,IAAA,CAAK,YAAA;AAAA,MACR,GAAG,IAAA,CAAK;AAAA,KACV;AAAA,EACF;AAAA,EAEA,kBAAA,GAA+C;AAC7C,IAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,EAAe;AAClC,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,gBAAA,GAA6C;AAC3C,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,KAAK,aAAA,CAAc,CAAA;AAAA,MACtB,CAAA,EAAG,KAAK,aAAA,CAAc;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,aAAA,GAA0C;AACxC,IAAA,OAAO;AAAA,MACL,GAAG,IAAA,CAAK,WAAA;AAAA,MACR,GAAG,IAAA,CAAK;AAAA,KACV;AAAA,EACF;AAAA,EAEA,iBAAA,GAA8C;AAC5C,IAAA,MAAM,KAAA,GAAQ,KAAK,aAAA,EAAc;AACjC,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,QAAe,UAAA,EAA0B;AAC9C,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,mBAAA;AACzB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,mBAAA;AACzB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,kBAAA;AACxB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,kBAAA;AAExB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,EAAA,CAAG,IAAI,GAAG,CAAA;AAAA,IACjB;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,gBAAA,EAAkB;AAC1C,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,MAAM,CAAA;AAAA,IAC3B;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,cAAA,EAAgB;AACxC,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,mBAAA,GAAsB,CAAA;AAC3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,CAAA;AAC3B,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAAA,EAC5B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACpD,MAAA,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACxD,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACpD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AAC1D,MAAA,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,YAAY,CAAA;AACrD,MAAA,MAAA,CAAO,mBAAA,CAAoB,MAAA,EAAQ,IAAA,CAAK,YAAY,CAAA;AACpD,MAAA,QAAA,CAAS,mBAAA,CAAoB,mBAAA,EAAqB,IAAA,CAAK,mBAAmB,CAAA;AAC1E,MAAA,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,kBAAkB,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,mBAAA,GAAsB,CAAA;AAC3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,CAAA;AAC3B,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAgB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EACpC;AACF,CAAA;AAnZ8C,MAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAAvC,IAAM,WAAA,GAAN;ACzBP,IAAM,kBAAA,GAAqB,CAAA;AAC3B,IAAM,mBAAA,GAAsB,CAAA;AAC5B,IAAM,aAAA,GAAgB,IAAA;AAEtB,SAAS,iBAAiB,cAAA,EAAsC;AAC9D,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,cAAA;AAE1B,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,EAAU;AACpC,IAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA,EAAG;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,OAAO,SAAS,CAAA;AAAA,EAClE;AAEA,EAAA,KAAA,CAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,cAAc,CAAA;AAEnD,EAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,IAAC,MAAgD,UAAA,GAAa,OAAA;AAAA,MAC5D,MAAA,CAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,IAAI,iBAAuBC,kBAAA,CAAA,UAAA,EAAY;AACrC,IAAA,IAAI,OAAO,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC3E,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,OAAO,QAAQ,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,EAAG;AACrE,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,IAAI,iBAAuBA,kBAAA,CAAA,SAAA,EAAW;AACpC,IAAA,IAAI,OAAO,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC3E,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,OAAO,QAAQ,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,EAAG;AACrE,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,EAAG;AACrE,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAO,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC3E,MAAA,KAAA,CAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,IAAI,iBAAuBA,kBAAA,CAAA,aAAA,EAAe;AACxC,IAAA,IAAI,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,EAAG;AACrE,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,OAAO,KAAK,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,OAAO,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG;AACvE,MAAA,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,OAAO,MAAM,CAAA;AAAA,IACtD;AAAA,EACF;AACF;AAxDS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AA0DF,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAqC;AAAA,EAA3C,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAAoB;AAAA,EAAA;AAAA,EAEtD,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAE5C,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,SAAS,CAAA;AAC/B,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,EAAG;AAC9C,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,cAAc,CAAA;AAClE,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,MAAM,CAAA;AACtD,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,MAAM,SAAA,EAAW;AAC/C,QAAA;AAAA,MACF;AAEA,MAAA,gBAAA,CAAiB,cAAc,CAAA;AAC/B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,EAAU,SAAS,CAAA;AAAA,IACzC;AAAA,EACF;AACF,CAAA;AA5BkD,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAA3C,IAAM,eAAA,GAAN;AClDP,IAAM,qBAAA,GAAgD;AAAA,EACpD,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,KAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,2BAA2B,GAAA,EAAqB;AACvD,EAAA,OAAO,qBAAA,CAAsB,GAAG,CAAA,IAAK,GAAA;AACvC;AAFS,MAAA,CAAA,0BAAA,EAAA,4BAAA,CAAA;AAIT,SAAS,qBAAqB,IAAA,EAAyC;AACrE,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,IAAUC,kBAAA,CAAA,iBAAA,EAAkB;AAAA,EACrC;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,IAAUA,kBAAA,CAAA,iBAAA,EAAkB;AAAA,EACrC;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,OAAO,IAAUA,kBAAA,CAAA,oBAAA,EAAqB;AAAA,EACxC;AAEA,EAAA,OAAO,IAAUA,kBAAA,CAAA,oBAAA,EAAqB;AACxC;AAdS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAgBT,SAAS,2BAAA,CACP,MAAA,EACA,QAAA,EACA,IAAA,EACM;AACN,EAAA,MAAA,CAAO,QAAA,CAAS,CAAC,KAAA,KAAU;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AAClC,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,GAAA,CAAI,CAAC,QAAA,KAAa;AAChD,QAAA,IAAI,aAAa,QAAA,EAAU;AACzB,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,MAClB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,oBAAoB,QAAA,EAAU;AAChC,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AAAA,EACF,CAAC,CAAA;AACH;AAjCS,MAAA,CAAA,2BAAA,EAAA,6BAAA,CAAA;AAmCT,SAAS,uBAAuB,MAAA,EAA0C;AACxE,EAAA,MAAM,YAA8B,EAAC;AAErC,EAAA,MAAA,CAAO,QAAA,CAAS,CAAC,KAAA,KAAU;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,2BAAe,QAAA,KAA6B;AAChD,MAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AACjC,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,EAJoB,aAAA,CAAA;AAMpB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AAClC,MAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,QAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,MACtB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,eAAe,CAAA;AAAA,EAC7B,CAAC,CAAA;AAED,EAAA,OAAO,SAAA;AACT;AA3BS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AA6BT,SAAS,qBAAA,CACP,UACA,SAAA,EACM;AACN,EAAA,MAAM,QAAQ,SAAA,KAAc,OAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,QAAA;AAEf,EAAA,KAAA,MAAW,QAAQ,oBAAA,EAAsB;AACvC,IAAA,MAAM,OAAA,GAAU,OAAO,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,EAAE,OAAA,YAAyBA,kBAAA,CAAA,OAAA,CAAA,EAAU;AACnD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,QAAQ,eAAA,KAAoB,KAAA;AAC/C,IAAA,OAAA,CAAQ,SAAA,GAAY,QAAcA,kBAAA,CAAA,aAAA,GAAsBA,kBAAA,CAAA,YAAA;AACxD,IAAA,OAAA,CAAQ,YAAY,UAAA,GAChB,KAAA,GACQA,kBAAA,CAAA,0BAAA,GACAA,kBAAA,CAAA,wBAAA,GACR,QACQA,kBAAA,CAAA,aAAA,GACAA,kBAAA,CAAA,YAAA;AACZ,IAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AAAA,EACxB;AAEA,EAAA,QAAA,CAAS,WAAA,GAAc,IAAA;AACzB;AA1BS,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AA4BT,SAAS,iBAAA,CAAkB,UAA0B,OAAA,EAAwB;AAC3E,EAAA,MAAM,MAAA,GAAS,QAAA;AAEf,EAAA,KAAA,MAAW,QAAQ,oBAAA,EAAsB;AACvC,IAAA,MAAM,OAAA,GAAU,OAAO,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,EAAE,OAAA,YAAyBA,kBAAA,CAAA,OAAA,CAAA,EAAU;AACnD,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,eAAA,GAAkB,OAAA;AAE1B,IAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,KAAoBA,kBAAA,CAAA,aAAA;AAC1C,IAAA,OAAA,CAAQ,YAAY,OAAA,GAChB,KAAA,GACQA,kBAAA,CAAA,0BAAA,GACAA,kBAAA,CAAA,wBAAA,GACR,QACQA,kBAAA,CAAA,aAAA,GACAA,kBAAA,CAAA,YAAA;AAEZ,IAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AAAA,EACxB;AAEA,EAAA,QAAA,CAAS,WAAA,GAAc,IAAA;AACzB;AAxBS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AA0BT,SAAS,qBAAA,CACP,QAAA,EACA,MAAA,EACA,GAAA,EACA,YAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,QAAA;AACf,EAAA,MAAM,GAAA,GAAM,2BAA2B,MAAM,CAAA;AAE7C,EAAA,IAAI,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,IAAUA,kBAAA,CAAA,aAAA,EAAc,CAAE,IAAA,CAAK,GAAG,CAAA;AAC5C,IAAA,YAAA,CAAa,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAA,CAAO,GAAG,CAAA,GAAI,OAAA;AAChB;AAhBS,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAkBT,SAAS,oBAAA,CAAqB,UAA0B,MAAA,EAAsB;AAC5E,EAAA,MAAM,MAAA,GAAS,QAAA;AACf,EAAA,MAAM,GAAA,GAAM,2BAA2B,MAAM,CAAA;AAC7C,EAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAChB;AAJS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAMT,SAAS,kBAAA,CACP,QAAA,EACA,KAAA,EACA,YAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,QAAA;AAEf,EAAA,IACE,OAAO,KAAA,IACP,OAAQ,MAAA,CAAO,KAAA,CAAgD,QAC7D,UAAA,EACF;AACA,IAAC,MAAA,CAAO,KAAA,CAA+C,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,EAAU;AACxC,IAAA,MAAA,CAAO,YAAY,KAAA,CAAM,SAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,EAAU;AACxC,IAAA,MAAA,CAAO,YAAY,KAAA,CAAM,SAAA;AAAA,EAC3B;AAEA,EAAA,IACE,OAAO,WAAA,IACP,OAAQ,MAAA,CAAO,WAAA,CACZ,QAAQ,UAAA,EACX;AACA,IAAC,OAAO,WAAA,CAAwD,GAAA;AAAA,MAC9D,KAAA,CAAM,WAAA;AAAA,MACN,KAAA,CAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,KAAA,CAAM,OAAA;AAEvB,EAAA,IACE,OAAO,QAAA,IACP,OAAQ,MAAA,CAAO,QAAA,CAAmD,QAChE,UAAA,EACF;AACA,IAAC,MAAA,CAAO,QAAA,CAAkD,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAAA,EAC9E;AAEA,EAAA,IAAI,OAAO,MAAA,CAAO,iBAAA,KAAsB,QAAA,EAAU;AAChD,IAAA,MAAA,CAAO,oBAAoB,KAAA,CAAM,iBAAA;AAAA,EACnC;AAEA,EAAA,MAAA,CAAO,OAAO,KAAA,CAAM,IAAA;AACpB,EAAA,MAAA,CAAO,WAAW,KAAA,CAAM,QAAA;AAKxB,EAAA,MAAA,CAAO,kBAAA,GACL,KAAA,CAAM,QAAA,KAAmBA,kBAAA,CAAA,gBAAA,IACzB,MAAM,QAAA,KAAmBA,kBAAA,CAAA,mBAAA;AAC3B,EAAA,MAAA,CAAO,YAAY,KAAA,CAAM,SAAA;AACzB,EAAA,MAAA,CAAO,aAAa,KAAA,CAAM,UAAA;AAC1B,EAAA,MAAA,CAAO,YAAY,KAAA,CAAM,SAAA;AACzB,EAAA,MAAA,CAAO,cAAc,KAAA,CAAM,WAAA;AAE3B,EAAA,MAAM,cAAA,GAAsD;AAAA,IAC1D,CAAC,YAAA,EAAc,KAAA,CAAM,UAAU,CAAA;AAAA,IAC/B,CAAC,iBAAA,EAAmB,KAAA,CAAM,eAAe,CAAA;AAAA,IACzC,CAAC,WAAA,EAAa,KAAA,CAAM,SAAS,CAAA;AAAA,IAC7B,CAAC,cAAA,EAAgB,KAAA,CAAM,YAAY,CAAA;AAAA,IACnC,CAAC,cAAA,EAAgB,KAAA,CAAM,YAAY,CAAA;AAAA,IACnC,CAAC,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AAAA,IACrB,CAAC,aAAA,EAAe,KAAA,CAAM,WAAW,CAAA;AAAA,IACjC,CAAC,SAAA,EAAW,KAAA,CAAM,OAAO,CAAA;AAAA,IACzB,CAAC,iBAAA,EAAmB,KAAA,CAAM,eAAe,CAAA;AAAA,IACzC,CAAC,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC3B,CAAC,QAAA,EAAU,KAAA,CAAM,MAAM;AAAA,GACzB;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,cAAA,EAAgB;AACvC,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7C,MAAA,qBAAA,CAAsB,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,YAAY,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,oBAAA,CAAqB,UAAU,GAAG,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,qBAAA,CAAsB,QAAA,EAAU,MAAM,gBAAgB,CAAA;AACtD,EAAA,iBAAA,CAAkB,QAAA,EAAU,MAAM,UAAU,CAAA;AAC5C,EAAA,QAAA,CAAS,WAAA,GAAc,IAAA;AACzB;AAvFS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAyFF,IAAM,mBAAA,GAAN,MAAM,mBAAA,CAAwC;AAAA,EAA9C,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAAoB;AACtD,IAAA,IAAA,CAAiB,YAAA,uBAAmB,GAAA,EAA2B;AAAA,EAAA;AAAA,EAE/D,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,iBAAiB,CAAA;AAE/C,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,SAAS,CAAA;AAC/B,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,EAAG;AAC9C,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,oBAAoB,KAAA,CAAM,YAAA;AAAA,QAC9B,QAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,MAAM,CAAA;AACzD,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,MAAM,SAAA,EAAW;AAC/C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,MAAA,MAAM,eAAA,GAAkB,MAAA,GAAS,sBAAA,CAAuB,MAAM,IAAI,EAAC;AACnE,MAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,kBAAkB,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA,EAAG;AACvE,QAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA;AAC5C,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,SAAA,CAAU,KAAK,CAAA;AAC1D,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA;AAAA,QACF;AAKA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,qBAAA,GAAwB,gBAAgB,KAAK,CAAA;AACnD,UAAA,IACE,qBAAA,IACA,0BAA0B,gBAAA,EAC1B;AACA,YAAA,2BAAA;AAAA,cACE,MAAA;AAAA,cACA,qBAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,eAAA,CAAgB,KAAK,CAAA,GAAI,gBAAA;AAAA,UAC3B;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA;AAClD,QAAA,IAAI,cAAA,GAAiB,gBAAA;AAErB,QAAA,IAAI,gBAAA,CAAiB,SAAS,QAAA,EAAU;AACtC,UAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,KAAA,CAAM,IAAI,CAAA;AACnD,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,2BAAA,CAA4B,MAAA,EAAQ,kBAAkB,WAAW,CAAA;AACjE,YAAA,eAAA,CAAgB,KAAK,CAAA,GAAI,WAAA;AAAA,UAC3B;AACA,UAAA,iBAAA,CAAkB,SAAA,CAAU,KAAK,CAAA,GAAI,WAAA;AACrC,UAAA,cAAA,GAAiB,WAAA;AACjB,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,iBAAA,CAAkB,QAAA,GAAW,WAAA;AAAA,UAC/B;AACA,UAAA,gBAAA,CAAiB,OAAA,EAAQ;AAAA,QAC3B;AAEA,QAAA,kBAAA,CAAmB,cAAA,EAAgB,KAAA,EAAO,IAAA,CAAK,YAAY,CAAA;AAAA,MAC7D;AAEA,MAAA,IAAA,CAAK,WAAW,GAAA,CAAI,QAAA,EAAU,KAAK,SAAA,CAAU,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,YAAA,CAAa,MAAA,EAAO,EAAG;AAChD,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AACF,CAAA;AA3FqD,MAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAA9C,IAAM,kBAAA,GAAN;ACjRP,IAAM,aAAA,GAAgB,IAAA;AACtB,IAAM,UAAA,GAAa,IAAA;AAEnB,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA,GACxB,KAAK,GAAA,CAAI,aAAA,EAAe,KAAK,CAAA,GAC7B,aAAA;AACN;AAJS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAMT,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA,GAAI,KAAK,GAAA,CAAI,UAAA,EAAY,KAAK,CAAA,GAAI,UAAA;AAChE;AAFS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAIT,SAAS,uBACP,SAAA,EACwB;AACxB,EAAA,QAAQ,UAAU,IAAA;AAAM,IACtB,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,SAAS,SAAA,CAAU,UAAA;AACzB,MAAA,MAAM,WAAW,gCAAA,CAAiC,IAAA;AAClD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,iBAAA,CAAkB,MAAA,CAAO,KAAA,IAAS,SAAS,KAAK,CAAA;AAAA,QACvD,MAAA,EAAQ,iBAAA,CAAkB,MAAA,CAAO,MAAA,IAAU,SAAS,MAAM,CAAA;AAAA,QAC1D,KAAA,EAAO,iBAAA,CAAkB,MAAA,CAAO,KAAA,IAAS,SAAS,KAAK;AAAA,OACzD;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,SAAS,SAAA,CAAU,UAAA;AACzB,MAAA,MAAM,WAAW,gCAAA,CAAiC,KAAA;AAClD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,iBAAA,CAAkB,MAAA,CAAO,KAAA,IAAS,SAAS,KAAK,CAAA;AAAA,QACvD,MAAA,EAAQ,iBAAA,CAAkB,MAAA,CAAO,MAAA,IAAU,SAAS,MAAM;AAAA,OAC5D;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,SAAS,SAAA,CAAU,UAAA;AACzB,MAAA,MAAM,WAAW,gCAAA,CAAiC,MAAA;AAClD,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,cAAA,CAAe,MAAA,CAAO,MAAA,IAAU,SAAS,MAAM;AAAA,OACzD;AAAA,IACF;AAAA,IACA,KAAK,UAAA;AAAA,IACL,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,SAAS,SAAA,CAAU,UAAA;AACzB,MAAA,MAAM,WACJ,SAAA,CAAU,IAAA,KAAS,UAAA,GACf,gCAAA,CAAiC,WACjC,gCAAA,CAAiC,OAAA;AACvC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,cAAA,CAAe,MAAA,CAAO,MAAA,IAAU,SAAS,MAAM,CAAA;AAAA,QACvD,MAAA,EAAQ,iBAAA,CAAkB,MAAA,CAAO,MAAA,IAAU,SAAS,MAAM;AAAA,OAC5D;AAAA,IACF;AAAA,IACA,KAAK,OAAA;AACH,MAAA,OAAO,EAAC;AAAA;AAEd;AA3CS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AA6CT,SAAS,mBAAmB,MAAA,EAAkD;AAC5E,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,kBAAwBC,kBAAA,CAAA,IAAA,EAAM;AAChC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,GAA2B,IAAA;AAC/B,EAAA,MAAA,CAAO,QAAA,CAAS,CAAC,KAAA,KAA0B;AACzC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,YAAuBA,kBAAA,CAAA,IAAA,EAAM;AACzC,MAAA,KAAA,GAAQ,KAAA;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,KAAA;AACT;AAjBS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAmBT,SAAS,cAAc,SAAA,EAAwC;AAC7D,EAAA,IAAI,SAAA,CAAU,SAAS,OAAA,EAAS;AAC9B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,SAAA,CAAU,MAAM,CAAA;AAChD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,uBAAuB,SAAS,CAAA;AAClD,EAAA,SAAA,CAAU,UAAA,GAAa,SAAA;AAEvB,EAAA,IAAI,YAAA;AAEJ,EAAA,QAAQ,UAAU,IAAA;AAAM,IACtB,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,MAAA,GAAS,SAAA;AACf,MAAA,YAAA,GAAe,IAAUA,kBAAA,CAAA,WAAA,CAAY,MAAA,CAAO,OAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,KAAK,CAAA;AAC9E,MAAA;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,MAAA,GAAS,SAAA;AACf,MAAA,YAAA,GAAe,IAAUA,kBAAA,CAAA,aAAA,CAAc,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAClE,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,MAAA,GAAS,SAAA;AACf,MAAA,YAAA,GAAe,IAAUA,kBAAA,CAAA,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,IAAI,EAAE,CAAA;AAC7D,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,MAAA,GAAS,SAAA;AACf,MAAA,YAAA,GAAe,IAAUA,kBAAA,CAAA,gBAAA;AAAA,QACvB,MAAA,CAAO,MAAA;AAAA,QACP,MAAA,CAAO,MAAA;AAAA,QACP,MAAA,CAAO,MAAA;AAAA,QACP;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,MAAA,GAAS,SAAA;AACf,MAAA,YAAA,GAAe,IAAUA,kBAAA,CAAA,eAAA,CAAgB,MAAA,CAAO,QAAQ,MAAA,CAAO,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC3E,MAAA;AAAA,IACF;AAAA,IACA;AACE,MAAA;AAAA;AAGJ,EAAA,MAAM,mBAAmB,IAAA,CAAK,QAAA;AAC9B,EAAA,IAAA,CAAK,QAAA,GAAW,YAAA;AAChB,EAAA,gBAAA,CAAiB,OAAA,EAAQ;AAC3B;AArDS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAuDT,SAAS,iBAAiB,SAAA,EAAwC;AAChE,EAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,IAAA;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,MAAA,CAAO,QAAA,CAAS,CAAC,KAAA,KAA0B;AACnD,IAAA,IAAI,iBAAuBA,kBAAA,CAAA,IAAA,EAAM;AAC/B,MAAA,KAAA,CAAM,aAAa,SAAA,CAAU,UAAA;AAC7B,MAAA,KAAA,CAAM,gBAAgB,SAAA,CAAU,aAAA;AAAA,IAClC;AAAA,EACF,CAAC,CAAA;AACH;AAXS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAaF,IAAM,mBAAA,GAAN,MAAM,mBAAA,CAAwC;AAAA,EAA9C,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,kBAAA,uBAAyB,GAAA,EAAoB;AAC9D,IAAA,IAAA,CAAiB,gBAAA,uBAAuB,GAAA,EAAoB;AAAA,EAAA;AAAA,EAE5D,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,qBAAqB,CAAA;AAEnD,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAY,SAAS,CAAA;AACvC,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAK,EAAG;AACtD,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,SAAS,CAAA;AACxC,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,MACxC;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAAA,QACzB,QAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,aAAa,MAAA,EAAQ;AACxB,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA;AAC1D,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,YAAA,CAAa,SAAS,SAAA,CAAU,MAAA;AAAA,QAClC;AAAA,MACF;AAEA,MAAA,MAAM,iBAAA,GAAoB,CAAA,EAAG,YAAA,CAAa,IAAI,IAAI,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,UAAU,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,MAAA,EAAQ,QAAQ,EAAE,CAAA,CAAA;AAC5H,MAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,YAAA,CAAa,UAAU,CAAA,CAAA,EAAI,YAAA,CAAa,aAAa,CAAA,CAAA,EAAI,YAAA,CAAa,MAAA,EAAQ,IAAA,IAAQ,EAAE,CAAA,CAAA;AAEnH,MAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAQ,MAAM,iBAAA,EAAmB;AAC/D,QAAA,aAAA,CAAc,YAAY,CAAA;AAC1B,QAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA;AAAA,UACtB,QAAA;AAAA,UACA,CAAA,EAAG,YAAA,CAAa,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,UAAU,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,MAAA,EAAQ,QAAQ,EAAE,CAAA;AAAA,SACpG;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,MAAM,eAAA,EAAiB;AAC3D,QAAA,gBAAA,CAAiB,YAAY,CAAA;AAC7B,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,eAAe,CAAA;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAhDqD,MAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAA9C,IAAM,kBAAA,GAAN;AC1JA,IAAM,QAAA,2BAAY,IAAA,KAAgC;AACvD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,MAAA,GAAS,IAAIzB,wBAAAA,EAAW;AAC9B,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,IAAIC,0BAAAA,EAAY;AAGpC,MAAA,WAAA,CAAY,cAAA,CAAe,yBAAyB,CAAA;AACpD,MAAA,MAAA,CAAO,eAAe,WAAW,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AAGd,MAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAAA,IAChE;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA;AAAA,MACA,CAAC,IAAA,KAAe;AACd,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd,CAAA;AAAA,MACA,MAAA;AAAA,MACA,CAAC,KAAA,KAAmB;AAClB,QAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH,CAAA,EA5BwB,UAAA,CAAA;;;ACYxB,SAAS,cAAc,SAAA,EAAyD;AAC9E,EAAA,MAAM,CAAA,GAAI,UAAU,sBAAA,EAAuB;AAE3C,EAAA,QAAQ,UAAU,QAAA;AAAU,IAC1B,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,MAAA,GAAS,CAAA;AACf,MAAA,OAAO,IAAUyB,kBAAA,CAAA,WAAA,CAAY,MAAA,CAAO,OAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,KAAK,CAAA;AAAA,IACxE;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,MAAA,GAAS,CAAA;AACf,MAAA,OAAO,IAAUA,kBAAA,CAAA,aAAA,CAAc,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA,IAC5D;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,MAAA,GAAS,CAAA;AACf,MAAA,OAAO,IAAUA,kBAAA,CAAA,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,IAAI,EAAE,CAAA;AAAA,IACvD;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,MAAA,GAAS,CAAA;AACf,MAAA,OAAO,IAAUA,oCAAiB,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,IACnF;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,MAAA,GAAS,CAAA;AACf,MAAA,OAAO,IAAUA,kBAAA,CAAA,eAAA,CAAgB,MAAA,CAAO,QAAQ,MAAA,CAAO,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,IACrE;AAAA,IACA;AACE,MAAA,OAAO,IAAUA,kBAAA,CAAA,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA;AAE1C;AA3BS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAiCT,IAAM,SAAA,GAAY,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACpC,IAAM,WAAA,GAAc,IAAUA,kBAAA,CAAA,UAAA,EAAW;AACzC,IAAM,MAAA,GAAS,IAAUA,kBAAA,CAAA,KAAA,EAAM;AAC/B,IAAM,MAAA,GAAS,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACjC,IAAM,OAAA,GAAU,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAClC,IAAM,YAAA,GAAe,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAEvC,SAAS,8BAAA,CACP,WACA,GAAA,EACM;AACN,EAAA,SAAA,CAAU,GAAA,CAAI,UAAU,QAAA,CAAS,CAAA,EAAG,UAAU,QAAA,CAAS,CAAA,EAAG,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA;AAC9E,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,SAAA,CAAU,SAAS,CAAA,EAAG,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,KAAK,CAAA;AAClF,EAAA,WAAA,CAAY,aAAa,MAAM,CAAA;AAC/B,EAAA,MAAA,CAAO,GAAA,CAAI,UAAU,KAAA,CAAM,CAAA,EAAG,UAAU,KAAA,CAAM,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA;AAClE,EAAA,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,WAAA,EAAa,MAAM,CAAA;AAC5C;AATS,MAAA,CAAA,8BAAA,EAAA,gCAAA,CAAA;AAeT,SAAS,8BAA8B,IAAA,EAAiC;AACtE,EAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChC,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,MAAA,CAAA,CAAE,OAAA,EAAQ;AAAA,IACZ;AAAA,EACF,CAAA,MAAO;AACL,IAAC,IAAA,CAAK,SAA4B,OAAA,EAAQ;AAAA,EAC5C;AACF;AATS,MAAA,CAAA,6BAAA,EAAA,+BAAA,CAAA;AAWT,SAAS,kBAAkB,KAAA,EAA6B;AACtD,EAAA,KAAA,CAAM,QAAA,CAAS,CAAC,KAAA,KAAU;AACxB,IAAA,MAAM,EAAA,GAAK,KAAA;AACX,IAAA,IAAI,GAAG,eAAA,EAAiB;AACtB,MAAA,EAAA,CAAG,SAAS,OAAA,EAAQ;AACpB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,QAAQ,CAAA,EAAG;AAC9B,QAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,UAAA,CAAA,CAAE,OAAA,EAAQ;AAAA,QACZ;AAAA,MACF,CAAA,MAAO;AACL,QAAC,EAAA,CAAG,SAA4B,OAAA,EAAQ;AAAA,MAC1C;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAdS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AA2CF,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAAyC;AAAA,EAA/C,WAAA,GAAA;AAEL;AAAA,IAAA,IAAA,CAAiB,kBAAA,uBAAyB,GAAA,EAAoB;AAG9D;AAAA;AAAA,IAAA,IAAA,CAAiB,iBAAA,uBAAwB,GAAA,EAAoB;AAE7D;AAAA,IAAA,IAAA,CAAiB,gBAAA,uBAAuB,GAAA,EAA8B;AAStE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAiB,aAAA,uBAAoB,GAAA,EAA4B;AAAA,EAAA;AAAA,EAEjE,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,sBAAsB,CAAA;AAGpD,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAY,SAAS,CAAA;AACvC,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAK,EAAG;AACtD,MAAA,IAAI,CAAC,MAAM,GAAA,CAAI,SAAS,GAAG,IAAA,CAAK,kBAAA,CAAmB,OAAO,SAAS,CAAA;AAAA,IACrE;AACA,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAK,EAAG;AACrD,MAAA,IAAI,CAAC,MAAM,GAAA,CAAI,SAAS,GAAG,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAAA,IACpE;AACA,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAK,EAAG;AACpD,MAAA,IAAI,CAAC,MAAM,GAAA,CAAI,SAAS,GAAG,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,IACnE;AACA,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,aAAA,CAAc,IAAA,EAAK,EAAG;AACjD,MAAA,IAAI,CAAC,MAAM,GAAA,CAAI,SAAS,GAAG,IAAA,CAAK,aAAA,CAAc,OAAO,SAAS,CAAA;AAAA,IAChE;AAEA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AAAA,QACjB,QAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAgC,WAAW,MAAA,IAAU,IAAA;AAC3D,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,aAAA,GAAgB,KAAK,iBAAA,CAAkB,MAAA;AAC7C,MAAA,MAAM,iBAAA,GACJ,KAAK,QAAA,KAAa,OAAA,GACd,SAAS,IAAA,CAAK,SAAS,IAAI,aAAa,CAAA,CAAA,GACxC,GAAG,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,KAAK,cAAc,CAAC,IAAI,aAAa,CAAA,CAAA;AAM9E,MAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC/C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AAAA,QACvB;AAAA,MACF;AASA,MAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA;AAChE,MAAA,MAAM,YAAA,GAAA,CACH,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA,KAAM,sBAChF,oBAAA,KAAyB,iBAAA;AAE3B,MAAA,IAAI,YAAA,EAAc;AAKhB,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACnD,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAA,CAAO,OAAO,WAAW,CAAA;AACzB,UAAA,IAAK,YAAoC,eAAA,EAAiB;AACxD,YAAA,6BAAA,CAA8B,WAAkC,CAAA;AAAA,UAClE,CAAA,MAAO;AACL,YAAA,iBAAA,CAAkB,WAAW,CAAA;AAAA,UAC/B;AACA,UAAA,IAAA,CAAK,aAAA,CAAc,OAAO,QAAQ,CAAA;AAAA,QACpC;AACA,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAKrB,QAAA,IAAI,oBAAA,KAAyB,MAAA,IAAa,oBAAA,KAAyB,iBAAA,EAAmB;AACpF,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,QAAQ,CAAA;AACtC,UAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,QACvC;AAIA,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,UAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,iBAAiB,CAAA;AACvD,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,IAAA,CAAK,aAAa,OAAA,EAAS;AAE7B,UAAA,IAAI,KAAK,SAAA,IAAa,CAAC,KAAK,iBAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3D,YAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,QAAA,EAAU,iBAAiB,CAAA;AACtD,YAAA,MAAM,eAAA,GAAkB,iBAAA;AACxB,YAAA,MAAM,cAAA,GAAiB,QAAA;AAEvB,YAAA,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,CACpB,IAAA,CAAK,CAAC,IAAA,KAAS;AAEd,cAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,cAAc,CAAA,EAAG;AACpC,gBAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,cAAc,CAAA;AAC5C,gBAAA;AAAA,cACF;AAEA,cAAA,MAAM,cAAc,KAAA,CAAM,YAAA;AAAA,gBACxB,cAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,IAAI,CAAC,WAAA,EAAa;AAChB,gBAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,cAAc,CAAA;AAC5C,gBAAA;AAAA,cACF;AAGA,cAAA,MAAM,aAAa,CAAA,MAAA,EAAS,WAAA,CAAY,SAAS,CAAA,CAAA,EAAI,WAAA,CAAY,kBAAkB,MAAM,CAAA,CAAA;AACzF,cAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,gBAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,cAAc,CAAA;AAC5C,gBAAA;AAAA,cACF;AAEA,cAAA,MAAM,UAAA,GAAa,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,WAAW,CAAA;AACjE,cAAA,MAAM,aAAA,GAAuC,YAAY,MAAA,IAAU,IAAA;AACnE,cAAA,IAAI,CAAC,aAAA,EAAe;AAClB,gBAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,cAAc,CAAA;AAC5C,gBAAA;AAAA,cACF;AAIA,cAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,gBAAA,aAAA,CAAc,MAAA,CAAO,YAAY,aAAa,CAAA;AAC9C,gBAAA,iBAAA,CAAkB,YAAY,aAAa,CAAA;AAC3C,gBAAA,WAAA,CAAY,aAAA,GAAgB,IAAA;AAAA,cAC9B;AAEA,cAAA,MAAMC,SAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,kBAAkB,MAAM,CAAA;AAC9D,cAAA,MAAM,UAA4B,EAAC;AAGnC,cAAA,IAAA,CAAK,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAI,CAAA;AAEvC,cAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,KAAA,KAAU;AAC7B,gBAAA,MAAM,SAAA,GAAY,KAAA;AAClB,gBAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AAEvB,gBAAA,MAAMC,SAAAA,GAAW,SAAA,CAAU,QAAA,CAAS,KAAA,EAAM;AAC1C,gBAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,IAClD,SAAA,CAAU,QAAA,CAA8B,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,KAAA,EAAO,CAAA,GAC5D,SAAA,CAAU,SAA4B,KAAA,EAAM;AAEjD,gBAAA,SAAA,CAAU,iBAAA,CAAkB,MAAM,KAAK,CAAA;AACvC,gBAAA,MAAM,WAAA,GAAc,SAAA,CAAU,WAAA,CAAY,KAAA,EAAM;AAEhD,gBAAA,MAAMC,iBAAgB,IAAUH,kBAAA,CAAA,aAAA;AAAA,kBAC9BE,SAAAA;AAAA,kBACA,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,GACvB,cAAA,GACA,cAAA;AAAA,kBACLD;AAAA,iBACF;AACA,gBAAAE,cAAAA,CAAc,aAAa,WAAA,CAAY,UAAA;AACvC,gBAAAA,cAAAA,CAAc,gBAAgB,WAAA,CAAY,aAAA;AAE1C,gBAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIF,MAAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,kBAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,iBAAA,CAAkB,CAAC,CAAA;AACxD,kBAAA,MAAM,aAAA,GACJ,qBAAqB,MAAA,GAChB,KAAA,CAAM,aAAa,gBAAA,EAAkB,kBAAkB,KAAK,IAAA,GAC7D,IAAA;AACN,kBAAA,IAAI,aAAA,EAAe;AACjB,oBAAA,8BAAA,CAA+B,eAAe,OAAO,CAAA;AAAA,kBACvD,CAAA,MAAO;AACL,oBAAA,OAAA,CAAQ,QAAA,EAAS;AAAA,kBACnB;AACA,kBAAA,YAAA,CAAa,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAClD,kBAAAE,cAAAA,CAAc,WAAA,CAAY,CAAA,EAAG,YAAY,CAAA;AAAA,gBAC3C;AACA,gBAAAA,cAAAA,CAAc,eAAe,WAAA,GAAc,IAAA;AAE3C,gBAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,WAAA,EAAa,aAAA,EAAAA,gBAAe,CAAA;AAAA,cAC7C,CAAC,CAAA;AAED,cAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,gBAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,cAAc,CAAA;AAC5C,gBAAA;AAAA,cACF;AAEA,cAAA,MAAM,KAAA,GAAQ,IAAUH,kBAAA,CAAA,KAAA,EAAM;AAC9B,cAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,gBAAA,KAAA,CAAM,GAAA,CAAI,MAAM,aAAa,CAAA;AAAA,cAC/B;AAEA,cAAA,aAAA,CAAc,IAAI,KAAK,CAAA;AACvB,cAAA,WAAA,CAAY,aAAA,GAAgB,KAAA;AAC5B,cAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,cAAA,EAAgB,OAAO,CAAA;AACjD,cAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,cAAA,EAAgB,eAAe,CAAA;AAC3D,cAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,cAAA,EAAgB,KAAK,CAAA;AAC5C,cAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,cAAc,CAAA;AAAA,YAC9C,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,cAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,cAAc,CAAA;AAAA,YAC9C,CAAC,CAAA;AAAA,UACL;AAEA,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,KAAA,GAAQ,aAAA;AACd,QAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,QAAA,MAAM,WAAW,IAAUA,kBAAA,CAAA,oBAAA,CAAqB,EAAE,KAAA,EAAO,WAAW,CAAA;AACpE,QAAA,MAAM,aAAA,GAAgB,IAAUA,kBAAA,CAAA,aAAA,CAAc,QAAA,EAAU,UAAU,KAAK,CAAA;AACvE,QAAA,aAAA,CAAc,aAAa,IAAA,CAAK,UAAA;AAChC,QAAA,aAAA,CAAc,gBAAgB,IAAA,CAAK,aAAA;AAEnC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,UAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAA;AACjD,UAAA,MAAM,aAAA,GACJ,qBAAqB,MAAA,GAChB,KAAA,CAAM,aAAa,gBAAA,EAAkB,kBAAkB,KAAK,IAAA,GAC7D,IAAA;AACN,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,8BAAA,CAA+B,eAAe,OAAO,CAAA;AAAA,UACvD,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,QAAA,EAAS;AAAA,UACnB;AACA,UAAA,aAAA,CAAc,WAAA,CAAY,GAAG,OAAO,CAAA;AAAA,QACtC;AACA,QAAA,aAAA,CAAc,eAAe,WAAA,GAAc,IAAA;AAE3C,QAAA,MAAA,CAAO,IAAI,aAAa,CAAA;AACxB,QAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,aAAa,CAAA;AAC9C,QAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,iBAAiB,CAAA;AAAA,MACzD,CAAA,MAAO;AAEL,QAAA,IAAI,IAAA,CAAK,aAAa,OAAA,EAAS;AAC7B,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAClD,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,CAAkB,MAAA;AACrC,YAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,cAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,gBAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAA;AACjD,gBAAA,MAAM,aAAA,GACJ,qBAAqB,MAAA,GAChB,KAAA,CAAM,aAAa,gBAAA,EAAkB,kBAAkB,KAAK,IAAA,GAC7D,IAAA;AACN,gBAAA,IAAI,aAAA,EAAe;AACjB,kBAAA,8BAAA,CAA+B,eAAe,OAAO,CAAA;AAAA,gBACvD,CAAA,MAAO;AACL,kBAAA,OAAA,CAAQ,QAAA,EAAS;AAAA,gBACnB;AACA,gBAAA,YAAA,CAAa,gBAAA,CAAiB,OAAA,EAAS,KAAA,CAAM,WAAW,CAAA;AACxD,gBAAA,KAAA,CAAM,aAAA,CAAc,WAAA,CAAY,CAAA,EAAG,YAAY,CAAA;AAAA,cACjD;AACA,cAAA,KAAA,CAAM,aAAA,CAAc,eAAe,WAAA,GAAc,IAAA;AACjD,cAAA,KAAA,CAAM,aAAA,CAAc,aAAa,IAAA,CAAK,UAAA;AACtC,cAAA,KAAA,CAAM,aAAA,CAAc,gBAAgB,IAAA,CAAK,aAAA;AAAA,YAC3C;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,KAAK,IAAA,CAAK,aAAA;AAChB,UAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,CAAkB,MAAA;AACrC,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,YAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAA;AACjD,YAAA,MAAM,aAAA,GACJ,qBAAqB,MAAA,GAChB,KAAA,CAAM,aAAa,gBAAA,EAAkB,kBAAkB,KAAK,IAAA,GAC7D,IAAA;AACN,YAAA,IAAI,aAAA,EAAe;AACjB,cAAA,8BAAA,CAA+B,eAAe,OAAO,CAAA;AAAA,YACvD,CAAA,MAAO;AACL,cAAA,OAAA,CAAQ,QAAA,EAAS;AAAA,YACnB;AACA,YAAA,EAAA,CAAG,WAAA,CAAY,GAAG,OAAO,CAAA;AAAA,UAC3B;AACA,UAAA,EAAA,CAAG,eAAe,WAAA,GAAc,IAAA;AAChC,UAAA,EAAA,CAAG,aAAa,IAAA,CAAK,UAAA;AACrB,UAAA,EAAA,CAAG,gBAAgB,IAAA,CAAK,aAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAA;AA9SsD,MAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAA/C,IAAM,mBAAA,GAAN;;;AC1HA,IAAM,aAAA,GAAN,MAAM,aAAA,CAAkC;AAAA,EAM7C,WAAA,CACE,QAAA,EACA,KAAA,EACA,MAAA,EACA,WAAA,EACA;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EAEA,OAAO,MAAA,EAAqB;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,+BAAA,KAAoC,IAAA,EAAM;AAChE,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,yBAAA;AAOrC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,QAAA,CAAS,WAAW,WAAW,CAAA;AAC9D,QAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,QAAA,CAAS,WAAW,YAAY,CAAA;AAChE,QAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,MAAM,CAAA;AAC9B,QAAA,QAAA,CAAS,MAAA,EAAO;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,MAC9C;AAEA,MAAA,IAAA,CAAK,WAAA,IAAc;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,WAAA,IAAc;AAAA,EACrB;AACF,CAAA;AA3C+C,MAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAxC,IAAM,YAAA,GAAN;;;ACKA,SAAS,oBAAA,CACd,OACA,OAAA,EACY;AAEZ,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAA0B;AACvD,EAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC5C,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,QAAQ,CAAA,EAAG,KAAA;AACzD,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAC9C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,CAAC,QAAQ,CAAC,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAc;AAC/B,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAO,CAAA;AAEzB,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,EAAM;AAC7B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,IAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAErB,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAC9C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAtCgB,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;;;ACRT,SAAS/B,UAAS,KAAA,EAAgD;AACvE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AANgB,MAAA,CAAAA,SAAAA,EAAA,UAAA,CAAA;AAQT,SAAS,WAAW,KAAA,EAA+B;AACxD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAASA,UAAS,KAAK,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,GAAW,OAAO,KAAA,GAAQ,IAAA;AAC3D;AAXgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAaT,SAAS,cAAc,KAAA,EAA+C;AAC3E,EAAA,MAAM,MAAA,GAASA,UAAS,KAAK,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAWA,SAAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AACzC,EAAA,MAAM,QAAA,GAAWA,SAAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQA,SAAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,UAAU,QAAA,GACN;AAAA,MACE,GAAG,OAAO,QAAA,CAAS,CAAA,KAAM,QAAA,GAAW,SAAS,CAAA,GAAI,MAAA;AAAA,MACjD,GAAG,OAAO,QAAA,CAAS,CAAA,KAAM,QAAA,GAAW,SAAS,CAAA,GAAI,MAAA;AAAA,MACjD,GAAG,OAAO,QAAA,CAAS,CAAA,KAAM,QAAA,GAAW,SAAS,CAAA,GAAI;AAAA,KACnD,GACA,MAAA;AAAA,IACJ,UAAU,QAAA,GACN;AAAA,MACE,GAAG,OAAO,QAAA,CAAS,CAAA,KAAM,QAAA,GAAW,SAAS,CAAA,GAAI,MAAA;AAAA,MACjD,GAAG,OAAO,QAAA,CAAS,CAAA,KAAM,QAAA,GAAW,SAAS,CAAA,GAAI,MAAA;AAAA,MACjD,GAAG,OAAO,QAAA,CAAS,CAAA,KAAM,QAAA,GAAW,SAAS,CAAA,GAAI;AAAA,KACnD,GACA,MAAA;AAAA,IACJ,OAAO,KAAA,GACH;AAAA,MACE,GAAG,OAAO,KAAA,CAAM,CAAA,KAAM,QAAA,GAAW,MAAM,CAAA,GAAI,MAAA;AAAA,MAC3C,GAAG,OAAO,KAAA,CAAM,CAAA,KAAM,QAAA,GAAW,MAAM,CAAA,GAAI,MAAA;AAAA,MAC3C,GAAG,OAAO,KAAA,CAAM,CAAA,KAAM,QAAA,GAAW,MAAM,CAAA,GAAI;AAAA,KAC7C,GACA;AAAA,GACN;AACF;AAjCgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAmCT,SAAS,eAAA,CACd,YACA,aAAA,EACsB;AACtB,EAAA,MAAM,YAAY,UAAA,CAAW,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,cAAc,aAAa,CAAA;AAC9E,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAqB;AAErC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,UAAU,OAAA,EAAS;AACrC,IAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,GAAA;AACT;AAhBgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAkBT,SAAS,YAAY,KAAA,EAAqC;AAC/D,EAAA,OAAO,OAAO,KAAA,KAAU,SAAA,GAAY,KAAA,GAAQ,MAAA;AAC9C;AAFgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAIT,SAAS,WAAW,KAAA,EAAoC;AAC7D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAFgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;;;AC7ET,SAAS,wBACd,QAAA,EACoB;AACpB,EAAA,OAAO;AAAA,IACL,iBAAA,EAAmB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,aAAa,CAAA;AAAA,IACrE,UAAA,EAAY,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IACvD,eAAA,EAAiB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,oBAAoB,CAAA;AAAA,IAC1E,WAAA,EAAa,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,gBAAgB,CAAA;AAAA,IAClE,WAAA,EAAa,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,gBAAgB,CAAA;AAAA,IAClE,YAAA,EAAc,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,iBAAiB,CAAA;AAAA,IACpE,WAAA,EAAa,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,gBAAgB,CAAA;AAAA,IAClE,YAAA,EAAc,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,iBAAiB,CAAA;AAAA,IACpE,iBAAA,EAAmB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,aAAa,CAAA;AAAA,IACrE,oBAAA,EAAsB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,gBAAgB,CAAA;AAAA,IAC3E,WAAA,EAAa,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,gBAAgB,CAAA;AAAA,IAClE,iBAAA,EAAmB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,aAAa,CAAA;AAAA,IACrE,WAAA,EAAa,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,gBAAgB,CAAA;AAAA,IAClE,cAAA,EAAgB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,mBAAmB,CAAA;AAAA,IACxE,kBAAA,EAAoB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,uBAAuB,CAAA;AAAA,IAChF,gBAAA,EAAkB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,YAAY,CAAA;AAAA,IACnE,aAAA,EAAe,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,kBAAkB,CAAA;AAAA,IACtE,eAAA,EAAiB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,oBAAoB,CAAA;AAAA,IAC1E,uBAAA,EAAyB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,mBAAmB,CAAA;AAAA,IACjF,YAAA,EAAc,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,iBAAiB,CAAA;AAAA,IACpE,kBAAA,EAAoB,eAAA;AAAA,MAClB,QAAA,CAAS,UAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA,WAAA,EAAa,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,gBAAgB,CAAA;AAAA,IAClE,oBAAA,EAAsB,eAAA;AAAA,MACpB,QAAA,CAAS,UAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA,oBAAA,EAAsB,eAAA;AAAA,MACpB,QAAA,CAAS,UAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA,kBAAA,EAAoB,eAAA;AAAA,MAClB,QAAA,CAAS,UAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB,eAAA;AAAA,MAChB,QAAA,CAAS,UAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA,sBAAA,EAAwB,eAAA;AAAA,MACtB,QAAA,CAAS,UAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA,mBAAA,EAAqB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,wBAAwB,CAAA;AAAA,IAClF,kBAAA,EAAoB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,uBAAuB,CAAA;AAAA,IAChF,gBAAA,EAAkB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,YAAY,CAAA;AAAA,IACnE,oBAAA,EAAsB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,gBAAgB;AAAA,GAC7E;AACF;AAtDgB,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;;;ACET,SAAS,gBAAA,CACd,QAAA,EACA,KAAA,EACA,sBAAA,EACA,KAAA,EACM;AACN,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,UAAU,CAAA;AAEpE,EAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,WAAW,CAAA,IAAK,YAAA,CAAa,SAAQ,EAAG;AAClE,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,cAAc,CAAA;AAC/C,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAeA,UAAS,WAAW,CAAA;AACzC,IAAA,MAAM,iBACJ,YAAA,IAAgB,OAAO,aAAa,KAAA,KAAU,QAAA,GAC1C,aAAa,KAAA,GACb,IAAA;AAEN,IAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,MAAA,sBAAA,CAAuB,SAAA,CAAU,KAAA,EAAO,cAAA,EAAgB,IAAA,EAAM;AAAA,QAC5D,sBAAA,EAAwB;AAAA,OACzB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,cAAc,CAAA;AAC/C,IAAA,sBAAA,CAAuB,SAAA,CAAU,KAAA,EAAO,cAAA,EAAgB,cAAA,IAAkB,IAAA,EAAM;AAAA,MAC9E,sBAAA,EAAwB;AAAA,KACzB,CAAA;AAAA,EACH;AACF;AAhCgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;;;ACehB,SAAS,2BAAA,CACP,MACA,KAAA,EACyB;AACzB,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxE,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,IAAI,EAAE,IAAA,KAAS,QAAA,IAAY,OAAO,CAAA,CAAE,UAAU,QAAA,EAAU;AACtD,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA,CAAE,KAAA,EAAM;AAAA,MAC7D,CAAA,MAAA,IACE,EAAE,IAAA,KAAS,WAAA,IACX,EAAE,KAAA,KAAU,IAAA,IACZ,OAAO,CAAA,CAAE,KAAA,KAAU,YACnB,CAAC,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAK,KACtB,OAAQ,CAAA,CAAE,KAAA,CAAkC,QAAA,KAAa,QAAA,EACzD;AACA,QAAA,MAAM,MAAM,CAAA,CAAE,KAAA;AACd,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI;AAAA,UACZ,GAAG,CAAA;AAAA,UACH,KAAA,EAAO,EAAE,GAAG,GAAA,EAAK,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,QAAkB,CAAA,IAAK,GAAA,CAAI,QAAA;AAAS,SAC/E;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AA9BS,MAAA,CAAA,2BAAA,EAAA,6BAAA,CAAA;AAgCF,SAAS,4BACd,KAAA,EACA,sBAAA,EACA,gBACA,cAAA,EACA,UAAA,EACA,QACA,KAAA,EACM;AACN,EAAA,MAAM,YAAY,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,WAAW,GAAG,MAAA,IAAU,IAAA;AAE7E,EAAA,MAAM,cAAcA,SAAAA,CAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACnE,EAAA,IAAI,WAAA,IAAe,eAAe,OAAA,EAAS;AACzC,IAAA,MAAM,aAAA,GAAgBA,SAAAA,CAAS,WAAA,CAAY,OAAO,KAAK,EAAC;AAExD,IAAA,sBAAA,CAAuB,kBAAA;AAAA,MACrB,OAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAO,WAAA,CAAY,IAAA,KAAS,QAAA,GAAW,YAAY,IAAA,GAAO,EAAA;AAAA,MAC1D,aAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,uBAAuB,wBAAA,EAAyB;AAAA,QAC1D,QAAA,EAAU,uBAAuB,YAAA;AAAa;AAChD,KACF;AAAA,EACF;AAEA,EAAA,MAAM,oBAAoBA,SAAAA,CAAS,MAAA,CAAO,iBAAA,CAAkB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC/E,EAAA,IAAI,iBAAA,IAAqB,eAAe,aAAA,EAAe;AACrD,IAAA,sBAAA,CAAuB,kBAAA;AAAA,MACrB,aAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,MAAM,OAAA,CAAQ,iBAAA,CAAkB,OAAO,CAAA,GAC5C,iBAAA,CAAkB,UAClB,EAAC;AAAA,QACL,mBACE,OAAO,iBAAA,CAAkB,iBAAA,KAAsB,QAAA,GAC3C,kBAAkB,iBAAA,GAClB,MAAA;AAAA,QACN,mBACE,OAAO,iBAAA,CAAkB,iBAAA,KAAsB,QAAA,GAC3C,kBAAkB,iBAAA,GAClB;AAAA;AACR,KACF;AAAA,EACF;AAEA,EAAA,MAAM,0BAA0BA,SAAAA,CAAS,MAAA,CAAO,uBAAA,CAAwB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC3F,EAAA,IAAI,uBAAA,EAAyB;AAG3B,IAAA,MAAM,cAAA,GACJ,OAAO,uBAAA,CAAwB,QAAA,KAAa,QAAA,IAC5C,MAAA,CAAO,QAAA,CAAS,uBAAA,CAAwB,QAAQ,CAAA,GAC5C,uBAAA,CAAwB,QAAA,GACxB,IAAA;AAEN,IAAA,sBAAA,CAAuB,kBAAA,CAAmB,mBAAA,EAAqB,KAAA,EAAO,cAAA,EAAgB;AAAA,MACpF,QAAA,EAAU,cAAA;AAAA,MACV,WACE,OAAO,uBAAA,CAAwB,SAAA,KAAc,QAAA,GACzC,wBAAwB,SAAA,GACxB;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,eAAeA,SAAAA,CAAS,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,cAAc,CAAC,CAAA;AACrE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,IAC9C,YAAA,CAAa,OAAA,CACV,GAAA,CAAI,CAAC,KAAA,KAAUA,SAAAA,CAAS,KAAK,CAAC,CAAA,CAC9B,MAAA,CAAO,CAAC,KAAA,KAA4C,OAAA,CAAQ,KAAK,CAAC,CAAA,CAClE,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,MAAA,MAAM,YAAA,GACJ,KAAA,CAAM,YAAA,KAAiB,MAAA,IACvB,MAAM,YAAA,KAAiB,SAAA,IACvB,KAAA,CAAM,YAAA,KAAiB,OAAA,IACvB,KAAA,CAAM,YAAA,KAAiB,OAAA,GACnB,MAAM,YAAA,GACN,MAAA;AAEN,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,cAAA;AAAA,QACV,WAAW,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GAAW,MAAM,SAAA,GAAY,EAAA;AAAA,QACnE,WAAW,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GAAW,MAAM,SAAA,GAAY,EAAA;AAAA,QACnE,SAAS,OAAO,KAAA,CAAM,OAAA,KAAY,SAAA,GAAY,MAAM,OAAA,GAAU,IAAA;AAAA,QAC9D,MACE,KAAA,CAAM,IAAA,IACN,OAAO,KAAA,CAAM,IAAA,KAAS,YACtB,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GACrB,2BAAA,CAA4B,MAAM,IAAA,EAAiC,KAAK,IACxE,EAAC;AAAA,QACP,YAAA;AAAA,QACA,gBACE,OAAO,KAAA,CAAM,cAAA,KAAmB,QAAA,GAC5B,MAAM,cAAA,GACN;AAAA,OACR;AAAA,IACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,KAAA,KAAU,MAAM,SAAA,IAAa,KAAA,CAAM,SAAS,CAAA,GACvD,EAAC;AAML,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,IAAI,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,IACjE;AAAA,EACF;AAKA,EAAA,MAAM,qBAAqBA,SAAAA,CAAS,MAAA,CAAO,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAC,CAAA;AACjF,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,qBAAqB,CAAA;AACpE,IAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,kBAAA,CAAmB,IAAI,CAAA;AAC7C,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,GAAA,CAAI,IAAA,GAAO,2BAAA,CAA4B,IAAA,EAAM,KAAK,CAAA;AAAA,IACpD;AAAA,EACF;AAQA,EAAA;AACE,IAAA,MAAM,cAAcA,SAAAA,CAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACnE,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AAC7D,IAAA,IAAI,eAAe,GAAA,EAAK;AACtB,MAAA,IAAI,OAAO,WAAA,CAAY,UAAA,KAAe,QAAA,EAAU;AAC9C,QAAA,GAAA,CAAI,aAAa,WAAA,CAAY,UAAA;AAAA,MAC/B;AACA,MAAA,IAAI,OAAO,WAAA,CAAY,SAAA,KAAc,QAAA,EAAU;AAC7C,QAAA,GAAA,CAAI,YAAY,WAAA,CAAY,SAAA;AAAA,MAC9B;AACA,MAAA,IAAI,OAAO,WAAA,CAAY,QAAA,KAAa,SAAA,EAAW;AAC7C,QAAA,GAAA,CAAI,WAAW,WAAA,CAAY,QAAA;AAAA,MAC7B;AACA,MAAA,IAAI,OAAO,WAAA,CAAY,eAAA,KAAoB,QAAA,EAAU;AACnD,QAAA,GAAA,CAAI,kBAAkB,WAAA,CAAY,eAAA;AAAA,MACpC;AACA,MAAA,IAAI,OAAO,WAAA,CAAY,gBAAA,KAAqB,QAAA,EAAU;AACpD,QAAA,GAAA,CAAI,mBAAmB,WAAA,CAAY,gBAAA;AAAA,MACrC;AACA,MAAA,IAAI,OAAO,WAAA,CAAY,uBAAA,KAA4B,QAAA,EAAU;AAC3D,QAAA,GAAA,CAAI,0BAA0B,WAAA,CAAY,uBAAA;AAAA,MAC5C;AACA,MAAA,IAAI,OAAO,WAAA,CAAY,oBAAA,KAAyB,QAAA,EAAU;AACxD,QAAA,GAAA,CAAI,uBAAuB,WAAA,CAAY,oBAAA;AAAA,MACzC;AACA,MAAA,IAAI,OAAO,WAAA,CAAY,iBAAA,KAAsB,QAAA,EAAU;AACrD,QAAA,GAAA,CAAI,oBAAoB,WAAA,CAAY,iBAAA;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,EAAA;AACE,IAAA,MAAM,aAAaA,SAAAA,CAAS,MAAA,CAAO,oBAAA,CAAqB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,uBAAuB,CAAA;AACvE,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,IAAI,OAAO,UAAA,CAAW,OAAA,KAAY,SAAA,EAAW;AAC3C,QAAA,IAAA,CAAK,UAAU,UAAA,CAAW,OAAA;AAAA,MAC5B;AACA,MAAA,IAAI,OAAO,UAAA,CAAW,KAAA,KAAU,QAAA,EAAU;AAExC,QAAA,IAAA,CAAK,KAAA,GACH,UAAA,CAAW,KAAA,KAAU,UAAA,GACjB,WACC,UAAA,CAAW,KAAA;AAAA,MACpB;AACA,MAAA,IAAI,OAAO,UAAA,CAAW,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,QAAQ,UAAA,CAAW,KAAA;AAClE,MAAA,IAAI,OAAO,UAAA,CAAW,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,QAAQ,UAAA,CAAW,KAAA;AAAA,IACpE;AAAA,EACF;AAEA,EAAA;AACE,IAAA,MAAM,kBAAA,GAAqBA,SAAAA;AAAA,MACzB,MAAA,CAAO,oBAAA,CAAqB,GAAA,CAAI,cAAc;AAAA,KAChD;AAOA,IAAA,IAAI,eAAe,KAAA,CAAM,YAAA;AAAA,MACvB,cAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,kBAAA,IAAsB,CAAC,YAAA,EAAc;AACvC,MAAA,YAAA,GAAe,IAAI,uBAAA,EAAwB;AAC3C,MAAA,KAAA,CAAM,YAAA,CAAa,gBAAgB,YAAY,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,sBAAsB,YAAA,EAAc;AACtC,MAAA,IAAI,OAAO,kBAAA,CAAmB,OAAA,KAAY,SAAA,EAAW;AACnD,QAAA,YAAA,CAAa,UAAU,kBAAA,CAAmB,OAAA;AAAA,MAC5C;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,SAAA,KAAc,SAAA,EAAW;AACrD,QAAA,YAAA,CAAa,YAAY,kBAAA,CAAmB,SAAA;AAAA,MAC9C;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,SAAA,KAAc,SAAA,EAAW;AACrD,QAAA,YAAA,CAAa,YAAY,kBAAA,CAAmB,SAAA;AAAA,MAC9C;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,SAAA,KAAc,QAAA,EAAU;AACpD,QAAA,YAAA,CAAa,YACX,kBAAA,CAAmB,SAAA;AAAA,MACvB;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,gBAAA,KAAqB,QAAA,EAAU;AAC3D,QAAA,YAAA,CAAa,mBACX,kBAAA,CAAmB,gBAAA;AAAA,MACvB;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,WAAA,KAAgB,QAAA,EAAU;AACtD,QAAA,YAAA,CAAa,cACX,kBAAA,CAAmB,WAAA;AAAA,MACvB;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,UAAA,KAAe,QAAA,EAAU;AACrD,QAAA,YAAA,CAAa,aAAa,kBAAA,CAAmB,UAAA;AAAA,MAC/C;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,SAAA,KAAc,QAAA,EAAU;AACpD,QAAA,YAAA,CAAa,YACX,kBAAA,CAAmB,SAAA;AAAA,MACvB;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,eAAA,KAAoB,QAAA,EAAU;AAC1D,QAAA,YAAA,CAAa,kBACX,kBAAA,CAAmB,eAAA;AAAA,MACvB;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,iBAAA,KAAsB,SAAA,EAAW;AAC7D,QAAA,YAAA,CAAa,oBAAoB,kBAAA,CAAmB,iBAAA;AAAA,MACtD;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,QAAA,KAAa,QAAA,EAAU;AACnD,QAAA,YAAA,CAAa,WAAW,kBAAA,CAAmB,QAAA;AAAA,MAC7C;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,QAAA,KAAa,QAAA,EAAU;AACnD,QAAA,YAAA,CAAa,WAAW,kBAAA,CAAmB,QAAA;AAAA,MAC7C;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,kBAAA,CAAmB,YAAY,CAAA,EAAG;AAGlD,QAAA,YAAA,CAAa,YAAA,GAAe,mBAAmB,YAAA,CAC5C,GAAA,CAAI,CAAC,KAAA,KAAUA,SAAAA,CAAS,KAAK,CAAC,CAAA,CAC9B,MAAA;AAAA,UACC,CAAC,KAAA,KACC,KAAA,KAAU,IAAA,IAAQ,OAAO,MAAM,EAAA,KAAO;AAAA,SAC1C,CACC,GAAA;AAAA,UAAI,CAAC,KAAA,KACJ,iBAAA;AAAA,YACE;AAAA;AACF,SACF;AAAA,MACJ;AAIA,MAAA,IAAI,OAAO,kBAAA,CAAmB,sBAAA,KAA2B,SAAA,EAAW;AAClE,QAAA,YAAA,CAAa,yBACX,kBAAA,CAAmB,sBAAA;AAAA,MACvB,CAAA,MAAA,IAAW,OAAO,kBAAA,CAAmB,cAAA,KAAmB,SAAA,EAAW;AACjE,QAAA,YAAA,CAAa,yBAAyB,kBAAA,CAAmB,cAAA;AAAA,MAC3D;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,aAAA,KAAkB,QAAA,EAAU;AACxD,QAAA,YAAA,CAAa,gBAAgB,kBAAA,CAAmB,aAAA;AAAA,MAClD,CAAA,MAAA,IAAW,OAAO,kBAAA,CAAmB,aAAA,KAAkB,QAAA,EAAU;AAC/D,QAAA,YAAA,CAAa,gBAAgB,kBAAA,CAAmB,aAAA;AAAA,MAClD;AACA,MAAA,MAAM,OAAA,GAAUA,SAAAA,CAAS,kBAAA,CAAmB,kBAAkB,CAAA;AAC9D,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,kBAAA,GAAqB;AAAA,UAChC,GAAG,OAAO,OAAA,CAAQ,CAAA,KAAM,QAAA,GAAW,QAAQ,CAAA,GAAI,CAAA;AAAA,UAC/C,GAAG,OAAO,OAAA,CAAQ,CAAA,KAAM,QAAA,GAAW,QAAQ,CAAA,GAAI,CAAA;AAAA,UAC/C,GAAG,OAAO,OAAA,CAAQ,CAAA,KAAM,QAAA,GAAW,QAAQ,CAAA,GAAI;AAAA,SACjD;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAUA,SAAAA,CAAS,kBAAA,CAAmB,kBAAkB,CAAA;AAC9D,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,kBAAA,GAAqB;AAAA,UAChC,GAAG,OAAO,OAAA,CAAQ,CAAA,KAAM,QAAA,GAAW,QAAQ,CAAA,GAAI,CAAA;AAAA,UAC/C,GAAG,OAAO,OAAA,CAAQ,CAAA,KAAM,QAAA,GAAW,QAAQ,CAAA,GAAI,CAAA;AAAA,UAC/C,GAAG,OAAO,OAAA,CAAQ,CAAA,KAAM,QAAA,GAAW,QAAQ,CAAA,GAAI;AAAA,SACjD;AAAA,MACF;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,aAAA,KAAkB,QAAA,EAAU;AACxD,QAAA,YAAA,CAAa,gBACX,kBAAA,CAAmB,aAAA;AAAA,MACvB,CAAA,MAAA,IAAW,kBAAA,CAAmB,gBAAA,KAAqB,KAAA,EAAO;AAGxD,QAAA,YAAA,CAAa,aAAA,GAAgB,MAAA;AAAA,MAC/B;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,UAAA,KAAe,QAAA,EAAU;AACrD,QAAA,YAAA,CAAa,aAAa,kBAAA,CAAmB,UAAA;AAAA,MAC/C;AACA,MAAA,IAAI,OAAO,kBAAA,CAAmB,UAAA,KAAe,QAAA,EAAU;AACrD,QAAA,YAAA,CAAa,aAAa,kBAAA,CAAmB,UAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,EAAA;AACE,IAAA,MAAM,cAAA,GAAiBA,SAAAA;AAAA,MACrB,MAAA,CAAO,gBAAA,CAAiB,GAAA,CAAI,cAAc;AAAA,KAC5C;AAGA,IAAA,IAAI,QAAA,GAAW,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,mBAAmB,CAAA;AACrE,IAAA,IAAI,cAAA,IAAkB,CAAC,QAAA,EAAU;AAC/B,MAAA,QAAA,GAAW,IAAI,mBAAA,EAAoB;AACnC,MAAA,KAAA,CAAM,YAAA,CAAa,gBAAgB,QAAQ,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,MAAA,IAAI,OAAO,cAAA,CAAe,OAAA,KAAY,SAAA,EAAW;AAC/C,QAAA,QAAA,CAAS,UAAU,cAAA,CAAe,OAAA;AAAA,MACpC;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA,EAAG;AAGvC,QAAA,QAAA,CAAS,KAAA,GAAQ,eAAe,KAAA,CAC7B,GAAA,CAAI,CAAC,KAAA,KAAUA,SAAAA,CAAS,KAAK,CAAC,CAAA,CAC9B,MAAA;AAAA,UACC,CAAC,KAAA,KACC,KAAA,KAAU,IAAA,IAAQ,OAAO,MAAM,EAAA,KAAO;AAAA,SAC1C,CACC,GAAA;AAAA,UAAI,CAAC,KAAA,KACJ,mBAAA;AAAA,YACE;AAAA;AACF,SACF;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,EAAA;AACE,IAAA,MAAM,gBAAA,GAAmBA,SAAAA;AAAA,MACvB,MAAA,CAAO,kBAAA,CAAmB,GAAA,CAAI,cAAc;AAAA,KAC9C;AACA,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,qBAAqB,CAAA;AAC3E,IAAA,IAAI,oBAAoB,UAAA,EAAY;AAClC,MAAA,IAAI,OAAO,gBAAA,CAAiB,cAAA,KAAmB,QAAA,EAAU;AACvD,QAAA,UAAA,CAAW,iBACT,gBAAA,CAAiB,cAAA;AAAA,MACrB;AACA,MAAA,IAAI,OAAO,gBAAA,CAAiB,UAAA,KAAe,QAAA,EAAU;AACnD,QAAA,UAAA,CAAW,aACT,gBAAA,CAAiB,UAAA;AAAA,MACrB;AACA,MAAA,IAAI,OAAO,gBAAA,CAAiB,SAAA,KAAc,QAAA,EAAU;AAClD,QAAA,UAAA,CAAW,YAAY,gBAAA,CAAiB,SAAA;AAAA,MAC1C;AACA,MAAA,IAAI,OAAO,gBAAA,CAAiB,WAAA,KAAgB,QAAA,EAAU;AACpD,QAAA,UAAA,CAAW,cAAc,gBAAA,CAAiB,WAAA;AAAA,MAC5C;AACA,MAAA,IAAI,OAAO,gBAAA,CAAiB,qBAAA,KAA0B,QAAA,EAAU;AAC9D,QAAA,UAAA,CAAW,wBACT,gBAAA,CAAiB,qBAAA;AAAA,MACrB;AACA,MAAA,IAAI,OAAO,gBAAA,CAAiB,aAAA,KAAkB,QAAA,EAAU;AACtD,QAAA,UAAA,CAAW,gBACT,gBAAA,CAAiB,aAAA;AAAA,MACrB,CAAA,MAAA,IAAW,OAAO,gBAAA,CAAiB,OAAA,KAAY,SAAA,EAAW;AAGxD,QAAA,UAAA,CAAW,aAAA,GAAgB,gBAAA,CAAiB,OAAA,GACxC,aAAA,GACA,OAAA;AAAA,MACN;AACA,MAAA,IAAI,OAAO,gBAAA,CAAiB,QAAA,KAAa,QAAA,EAAU;AACjD,QAAA,UAAA,CAAW,WAAW,gBAAA,CAAiB,QAAA;AAAA,MACzC;AACA,MAAA,IAAI,OAAO,gBAAA,CAAiB,YAAA,KAAiB,QAAA,EAAU;AACrD,QAAA,UAAA,CAAW,eAAe,gBAAA,CAAiB,YAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,EAAA;AAIE,IAAA,MAAM,UAAA,GAAaA,SAAAA;AAAA,MACjB,MAAA,CAAO,sBAAA,CAAuB,GAAA,CAAI,cAAc;AAAA,KAClD;AACA,IAAA,IAAI,UAAA,IAAc,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,EAAU;AACrD,MAAA,MAAM,WAAW,KAAA,CAAM,YAAA;AAAA,QACrB,cAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,OAAO,UAAA,CAAW,IAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,YAAA;AAAA,UACJ,cAAA;AAAA,UACA,IAAI,yBAAA,CAA0B;AAAA,YAC5B,MAAM,UAAA,CAAW;AAAA,WAClB;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,kBAAkBA,SAAAA,CAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACvE,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AACtE,IAAA,IACE,eAAA,IACA,YAAA,IACA,OAAO,eAAA,CAAgB,mBAAmB,QAAA,EAC1C;AACA,MAAA,YAAA,CAAa,iBACX,eAAA,CAAgB,cAAA;AAAA,IACpB;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,sBAAsB,CAAA;AAC7E,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;AAC3D,MAAA,WAAA,CAAY,iBAAA,GAAoB,YAAY,iBAAA,CAAkB,GAAA;AAAA,QAC5D,CAAC,KAAA,KAAU,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,IAAK;AAAA,OACjC;AAAA,IACF;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,qBAAqB,CAAA;AAC9E,IAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,aAAA,KAAkB,EAAA,EAAI;AACvD,MAAA,aAAA,CAAc,gBACZ,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,aAAa,KAAK,aAAA,CAAc,aAAA;AAAA,IAC5D;AAAA,EACF;AACF;AAtbgB,MAAA,CAAA,2BAAA,EAAA,6BAAA,CAAA;;;AC5ChB,SAAS,sBAAsB,KAAA,EAA+B;AAC5D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAASA,UAAS,KAAK,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACnC,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,IAAA;AACT;AAfS,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAiBT,SAAS,oBAAoB,KAAA,EAE3B;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAA2D,EAAC;AAElE,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,MAAM,KAAA,GAAQA,UAAS,KAAK,CAAA;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,IAAA;AAC3D,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,KAAA,CAAM,IAAI,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAQ,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,MAAM,MAAA,GAAS,MAAA;AAAA,MAC1D,MAAM,OAAO,KAAA,CAAM,IAAA,KAAS,SAAA,GAAY,MAAM,IAAA,GAAO;AAAA,KACtD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AA9BS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAgCT,SAAS,yBACP,KAAA,EAC+D;AAC/D,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO,OAAA;AACT;AAxBS,MAAA,CAAA,wBAAA,EAAA,0BAAA,CAAA;AA0BT,SAAS,mBACP,eAAA,EAC2B;AAC3B,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,eAAA,CAAgB,MAAM,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,eAAA,CAAgB,OAAO,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,eAAA,CAAgB,SAAS,CAAA;AACtD,EAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,eAAA,CAAgB,iBAAiB,CAAA;AACtE,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,eAAA,CAAgB,MAAM,CAAA;AACzD,EAAA,MAAM,mBAAA,GAAsB,wBAAA;AAAA,IAC1B,eAAA,CAAgB;AAAA,GAClB;AACA,EAAA,MAAM,eAAA,GACJ,OAAO,eAAA,CAAgB,eAAA,KAAoB,WACvC,eAAA,CAAgB,eAAA,GAChB,OAAO,eAAA,CAAgB,WAAA,KAAgB,WACrC,eAAA,CAAgB,WAAA,GAChB,OAAQ,eAAA,CAAgB,MAAA,EAA2C,SAC/D,QAAA,GACA,eAAA,CAAgB,MAAA,CAA4B,IAAA,IAAQ,IAAA,GACtD,IAAA;AAEV,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA,mBAAA;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AACF;AA9BS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAgCF,SAAS,yBAAA,CACd,KAAA,EACA,sBAAA,EACA,cAAA,EACA,eAAA,EACM;AACN,EAAA,MAAM,OAAA,GAAU,mBAAmB,eAAe,CAAA;AAClD,EAAA,IAAI,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,kBAAkB,CAAA;AAErE,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,sBAAA,CAAuB,kBAAA;AAAA,MACrB,WAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,kBAAkB,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA,CAAQ,gBAAgB,cAAc,CAAA,GAC/D,gBAAgB,cAAA,CAAe,MAAA;AAAA,IAC7B,CAAC,IAAA,KAAyB,OAAO,IAAA,KAAS,QAAA,IAAY,KAAK,MAAA,GAAS;AAAA,MAEtE,EAAC;AACL,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,SAAA,CAAU,cAAA,GAAiB,CAAC,GAAG,cAAc,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AAC9C,IAAA,SAAA,CAAU,sBAAA,CAAuB,QAAQ,mBAAmB,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,IAAK,SAAA,CAAU,MAAM,MAAA,GAAS,CAAA;AAC5E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IACE,UAGA,wBAAA,GAA2B,OAAA;AAE7B,IAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,KAAY,SAAA,EAAW;AACxC,MAAA,SAAA,CAAU,UAAU,OAAA,CAAQ,OAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,EAAU;AACzC,MAAA,SAAA,CAAU,YAAY,OAAA,CAAQ,SAAA;AAAA,IAChC;AAEA,IAAA,IAAI,OAAO,OAAA,CAAQ,iBAAA,KAAsB,QAAA,EAAU;AACjD,MAAA,SAAA,CAAU,oBAAoB,OAAA,CAAQ,iBAAA;AAAA,IACxC;AAEA,IAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACvC,MAAA,SAAA,CAAU,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC7B;AAEA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,SAAA,CAAU,UAAU,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,KAAY,SAAA,EAAW;AACxC,IAAA,SAAA,CAAU,UAAU,OAAA,CAAQ,OAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,EAAU;AACzC,IAAA,SAAA,CAAU,YAAY,OAAA,CAAQ,SAAA;AAAA,EAChC;AAEA,EAAA,IAAI,OAAO,OAAA,CAAQ,iBAAA,KAAsB,QAAA,EAAU;AACjD,IAAA,SAAA,CAAU,oBAAoB,OAAA,CAAQ,iBAAA;AAAA,EACxC;AAEA,EAAA,IAAI,OAAO,OAAA,CAAQ,WAAA,KAAgB,YAAY,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AAC7E,IAAA,SAAA,CAAU,cAAA,CAAe,OAAA,CAAQ,WAAA,EAAa,CAAC,QAAQ,MAAM,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACvC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,SAAA,CAAU,UAAA,EAAW;AAAA,IACvB,CAAA,MAAA,IAAW,OAAO,OAAA,CAAQ,WAAA,KAAgB,YAAY,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AACpF,MAAA,SAAA,CAAU,SAAA,CAAU,QAAQ,WAAW,CAAA;AAAA,IACzC;AAAA,EACF;AACF;AA3FgB,MAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;;;ACrFhB,SAAS,qBAAqB,KAAA,EAAkD;AAC9E,EAAA,MAAM,MAAA,GAASA,UAAS,KAAK,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAeA,SAAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAC3C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAZS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAcT,SAAS,wBAAwB,KAAA,EAAgD;AAC/E,EAAA,MAAM,MAAA,GAASA,UAAS,KAAK,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAeA,SAAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAC3C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAZS,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AAcF,SAAS,sBACd,KAAA,EACA,sBAAA,EACA,cAAA,EACA,cAAA,EACA,YACA,MAAA,EACM;AACN,EAAA,MAAM,aAAa,UAAA,CAAW,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,cAAc,CAAC,CAAA;AACnE,EAAA,IAAI,eAAe,IAAA,EAAM;AACvB,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,IAAI,CAAA;AAC7D,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,KAAA,GAAQ,UAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,oBAAoBA,SAAAA,CAAS,MAAA,CAAO,iBAAA,CAAkB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC/E,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,WAAW,CAAA;AAC3E,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,iBAAA,CAAkB,UAAU,CAAA;AAC3D,IAAA,IAAI,oBAAA,IAAwB,OAAO,UAAA,KAAe,SAAA,EAAW;AAC3D,MAAA,oBAAA,CAAqB,UAAA,GAAa,UAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,aAAA,CAAc,MAAA,CAAO,eAAA,CAAgB,GAAA,CAAI,cAAc,CAAC,CAAA;AAChF,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,kBAAkB,CAAA;AAChF,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,IAAI,OAAO,eAAA,CAAgB,QAAA,EAAU,CAAA,KAAM,QAAA,EAAU;AACnD,QAAA,kBAAA,CAAmB,QAAA,CAAS,CAAA,GAAI,eAAA,CAAgB,QAAA,CAAS,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,OAAO,eAAA,CAAgB,QAAA,EAAU,CAAA,KAAM,QAAA,EAAU;AACnD,QAAA,kBAAA,CAAmB,QAAA,CAAS,CAAA,GAAI,eAAA,CAAgB,QAAA,CAAS,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,OAAO,eAAA,CAAgB,QAAA,EAAU,CAAA,KAAM,QAAA,EAAU;AACnD,QAAA,kBAAA,CAAmB,QAAA,CAAS,CAAA,GAAI,eAAA,CAAgB,QAAA,CAAS,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,OAAO,eAAA,CAAgB,QAAA,EAAU,CAAA,KAAM,QAAA,EAAU;AACnD,QAAA,kBAAA,CAAmB,QAAA,CAAS,CAAA,GAAI,eAAA,CAAgB,QAAA,CAAS,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,OAAO,eAAA,CAAgB,QAAA,EAAU,CAAA,KAAM,QAAA,EAAU;AACnD,QAAA,kBAAA,CAAmB,QAAA,CAAS,CAAA,GAAI,eAAA,CAAgB,QAAA,CAAS,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,OAAO,eAAA,CAAgB,QAAA,EAAU,CAAA,KAAM,QAAA,EAAU;AACnD,QAAA,kBAAA,CAAmB,QAAA,CAAS,CAAA,GAAI,eAAA,CAAgB,QAAA,CAAS,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,OAAO,eAAA,CAAgB,KAAA,EAAO,CAAA,KAAM,QAAA,EAAU;AAChD,QAAA,kBAAA,CAAmB,KAAA,CAAM,CAAA,GAAI,eAAA,CAAgB,KAAA,CAAM,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,OAAO,eAAA,CAAgB,KAAA,EAAO,CAAA,KAAM,QAAA,EAAU;AAChD,QAAA,kBAAA,CAAmB,KAAA,CAAM,CAAA,GAAI,eAAA,CAAgB,KAAA,CAAM,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,OAAO,eAAA,CAAgB,KAAA,EAAO,CAAA,KAAM,QAAA,EAAU;AAChD,QAAA,kBAAA,CAAmB,KAAA,CAAM,CAAA,GAAI,eAAA,CAAgB,KAAA,CAAM,CAAA;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,cAAcA,SAAAA,CAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACnE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AACxE,IAAA,IAAI,cAAA,IAAkB,OAAO,WAAA,CAAY,IAAA,KAAS,QAAA,EAAU;AAC1D,MAAA,cAAA,CAAe,OAAO,WAAA,CAAY,IAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,MAAM,cAAcA,SAAAA,CAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACnE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AACxE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAI,OAAO,WAAA,CAAY,IAAA,KAAS,QAAA,EAAU;AACxC,QAAA,cAAA,CAAe,OAAO,WAAA,CAAY,IAAA;AAAA,MACpC;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,WAAA,CAAY,KAAK,CAAA;AAC1C,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,cAAA,CAAe,KAAA,GAAQ,KAAA;AAAA,MACzB;AAEA,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,WAAA,CAAY,MAAM,CAAA;AAC5C,MAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,QAAA,cAAA,CAAe,MAAA,GAAS,MAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,eAAeA,SAAAA,CAAS,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,cAAc,CAAC,CAAA;AACrE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,eAAe,CAAA;AAC1E,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,IAAI,OAAO,YAAA,CAAa,IAAA,KAAS,QAAA,EAAU;AACzC,QAAA,eAAA,CAAgB,OAAO,YAAA,CAAa,IAAA;AAAA,MACtC;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,eAAA,CAAgB,KAAA,GAAQ,KAAA;AAAA,MAC1B;AAEA,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAC7C,MAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,QAAA,eAAA,CAAgB,MAAA,GAAS,MAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,cAAcA,SAAAA,CAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACnE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AACxE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAI,OAAO,WAAA,CAAY,IAAA,KAAS,QAAA,EAAU;AACxC,QAAA,cAAA,CAAe,OAAO,WAAA,CAAY,IAAA;AAAA,MACpC;AAEA,MAAA,MAAM,YAAA,GAAeA,SAAAA,CAAS,WAAA,CAAY,OAAO,CAAA;AACjD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,cAAA,CAAe,OAAA,GAAU;AAAA,UACvB,GAAG,cAAA,CAAe,OAAA;AAAA,UAClB,GAAG;AAAA,SACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,cAAcA,SAAAA,CAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACnE,EAAA,IAAI,WAAA,IAAe,eAAe,OAAA,EAAS;AACzC,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AACxE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAI,OAAO,WAAA,CAAY,IAAA,KAAS,QAAA,EAAU;AACxC,QAAA,cAAA,CAAe,OAAO,WAAA,CAAY,IAAA;AAAA,MACpC;AAEA,MAAA,MAAM,YAAA,GAAeA,SAAAA,CAAS,WAAA,CAAY,OAAO,CAAA;AACjD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,cAAA,CAAe,OAAA,GAAU;AAAA,UACvB,GAAG,cAAA,CAAe,OAAA;AAAA,UAClB,GAAG;AAAA,SACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,eAAeA,SAAAA,CAAS,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,cAAc,CAAC,CAAA;AACrE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,eAAe,CAAA;AAC1E,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,IACE,YAAA,CAAa,UAAA,KAAe,cAAA,IAC5B,YAAA,CAAa,eAAe,aAAA,EAC5B;AACA,QAAA,eAAA,CAAgB,aAAa,YAAA,CAAa,UAAA;AAAA,MAC5C;AAEA,MAAA,IACE,YAAA,CAAa,IAAA,KAAS,IAAA,IACtB,YAAA,CAAa,SAAS,IAAA,EACtB;AACA,QAAA,eAAA,CAAgB,OAAO,YAAA,CAAa,IAAA;AAAA,MACtC;AAEA,MAAA,IAAI,OAAO,YAAA,CAAa,SAAA,KAAc,SAAA,EAAW;AAC/C,QAAA,eAAA,CAAgB,YAAY,YAAA,CAAa,SAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,YAAA,CAAa,GAAG,CAAA;AACvC,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,eAAA,CAAgB,GAAA,GAAM,GAAA;AAAA,MACxB;AAEA,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AACzC,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,eAAA,CAAgB,IAAA,GAAO,IAAA;AAAA,MACzB;AAEA,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,YAAA,CAAa,GAAG,CAAA;AACvC,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,eAAA,CAAgB,GAAA,GAAM,GAAA;AAAA,MACxB;AAEA,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AACzC,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,eAAA,CAAgB,IAAA,GAAO,IAAA;AAAA,MACzB;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,eAAA,CAAgB,KAAA,GAAQ,KAAA;AAAA,MAC1B;AAEA,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,YAAA,CAAa,GAAG,CAAA;AACvC,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,eAAA,CAAgB,GAAA,GAAM,GAAA;AAAA,MACxB;AAEA,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAC7C,MAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,QAAA,eAAA,CAAgB,MAAA,GAAS,MAAA;AAAA,MAC3B;AAEA,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AACzC,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,eAAA,CAAgB,IAAA,GAAO,IAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,iBAAA,GAAoB,oBAAA;AAAA,IACxB,MAAA,CAAO,iBAAA,CAAkB,GAAA,CAAI,cAAc;AAAA,GAC7C;AACA,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,IAAI,oBAAA,GAAuB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,WAAW,CAAA;AACzE,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,sBAAA,CAAuB,kBAAA;AAAA,QACrB,aAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,oBAAA,GAAuB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,WAAW,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,oBAAA,CAAqB,MAAA,GAAS,IAAI,WAAA,CAAY;AAAA,QAC5C,GAAG,oBAAA,CAAqB,MAAA;AAAA,QACxB,GAAG;AAAA,OACJ,CAAA,CAAE,MAAA;AAAA,IACL;AAAA,EACF;AAEA,EAAA,MAAM,oBAAA,GAAuB,uBAAA;AAAA,IAC3B,MAAA,CAAO,oBAAA,CAAqB,GAAA,CAAI,cAAc;AAAA,GAChD;AACA,EAAA,IAAI,oBAAA,EAAsB;AACxB,IAAA,IAAI,uBAAA,GAA0B,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AAC/E,IAAA,IAAI,CAAC,uBAAA,EAAyB;AAC5B,MAAA,sBAAA,CAAuB,kBAAA;AAAA,QACrB,gBAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,uBAAA,GAA0B,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AAAA,IAC7E;AAEA,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,uBAAA,CAAwB,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,QAClD,GAAG,uBAAA,CAAwB,MAAA;AAAA,QAC3B,GAAG;AAAA,OACJ,CAAA,CAAE,MAAA;AAAA,IACL;AAAA,EACF;AAEA,EAAA,MAAM,oBAAoBA,SAAAA,CAAS,MAAA,CAAO,iBAAA,CAAkB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC/E,EAAA,IAAI,iBAAA,IAAqB,eAAe,aAAA,EAAe;AACrD,IAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,WAAW,CAAA;AAC3E,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,oBAAA,CAAqB,OAAA,GAAU,MAAM,OAAA,CAAQ,iBAAA,CAAkB,OAAO,CAAA,GAClE,iBAAA,CAAkB,UAClB,EAAC;AAEL,MAAA,oBAAA,CAAqB,oBACnB,OAAO,iBAAA,CAAkB,iBAAA,KAAsB,QAAA,GAC3C,kBAAkB,iBAAA,GAClB,MAAA;AAEN,MAAA,oBAAA,CAAqB,oBACnB,OAAO,iBAAA,CAAkB,iBAAA,KAAsB,QAAA,GAC3C,kBAAkB,iBAAA,GAClB,MAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,MAAM,cAAcA,SAAAA,CAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACnE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA;AACxE,IAAA,MAAM,YAAA,GAAeA,SAAAA,CAAS,WAAA,CAAY,MAAM,CAAA;AAEhD,IAAA,IAAI,kBAAkB,YAAA,EAAc;AAClC,MAAA,cAAA,CAAe,MAAA,GAAS;AAAA,QACtB,GAAG,cAAA,CAAe,MAAA;AAAA,QAClB,GAAG;AAAA,OACL;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,iBAAiBA,SAAAA,CAAS,MAAA,CAAO,cAAA,CAAe,GAAA,CAAI,cAAc,CAAC,CAAA;AACzE,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,iBAAiB,CAAA;AAC9E,IAAA,MAAM,eAAe,cAAA,CAAe,MAAA;AAEpC,IAAA,IAAI,iBAAA,IAAqB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AACpD,MAAA,iBAAA,CAAkB,MAAA,GAAS,YAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,kBAAkB,cAAA,CAAe,SAAA;AACvC,IAAA,IAAI,iBAAA,IAAqB,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AACvD,MAAA,iBAAA,CAAkB,SAAA,GAAY,eAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,MAAM,qBAAqBA,SAAAA,CAAS,MAAA,CAAO,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAC,CAAA;AACjF,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,wBAAwB,KAAA,CAAM,YAAA;AAAA,MAClC,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,MAAM,UAAA,GAAaA,SAAAA,CAAS,kBAAA,CAAmB,UAAU,CAAA;AACzD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,qBAAA,CAAsB,UAAA,GACpB,UAAA;AAAA,MACJ;AAEA,MAAA,IAAI,OAAO,kBAAA,CAAmB,SAAA,KAAc,QAAA,EAAU;AACpD,QAAA,qBAAA,CAAsB,YAAY,kBAAA,CAAmB,SAAA;AAAA,MACvD;AAEA,MAAA,IAAI,OAAO,kBAAA,CAAmB,UAAA,KAAe,SAAA,EAAW;AACtD,QAAA,qBAAA,CAAsB,aAAa,kBAAA,CAAmB,UAAA;AAAA,MACxD;AAEA,MAAA,IAAI,OAAO,kBAAA,CAAmB,aAAA,KAAkB,SAAA,EAAW;AACzD,QAAA,qBAAA,CAAsB,gBAAgB,kBAAA,CAAmB,aAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,mBAAmBA,SAAAA,CAAS,MAAA,CAAO,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC7E,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,gBAAA,CAAiB,OAAO,CAAA;AACpD,IAAA,IAAI,UAAA,GAAa,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,UAAU,CAAA;AAE9D,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,sBAAA,CAAuB,kBAAA;AAAA,QACrB,YAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,IAAW;AAAA,OACb;AACA,MAAA,UAAA,GAAa,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,UAAU,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,UAAA,IAAc,OAAO,OAAA,KAAY,SAAA,EAAW;AAC9C,MAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,MAAM,gBAAgBA,SAAAA,CAAS,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,cAAc,CAAC,CAAA;AACvE,EAAA,IAAI,aAAA,EAAe;AAGjB,IAAA,MAAM,aAAA,GAAgBA,SAAAA,CAAS,aAAA,CAAc,MAAM,CAAA,IAAK,aAAA;AAExD,IAAA,IAAI,OAAA,GAAU,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,gBAAgB,CAAA;AACjE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,sBAAA,CAAuB,kBAAA;AAAA,QACrB,SAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAA,GAAU,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,gBAAgB,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,QAChB,SAAA,EAAWA,SAAAA,CAAS,aAAA,CAAc,SAAS,KAAc,EAAC;AAAA,QAC1D,QAAA,EAAUA,SAAAA,CAAS,aAAA,CAAc,QAAQ,KAAc;AAAC,OACzD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkBA,SAAAA,CAAS,MAAA,CAAO,eAAA,CAAgB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC3E,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,yBAAA;AAAA,MACE,KAAA;AAAA,MACA,sBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,sBAAsBA,SAAAA,CAAS,MAAA,CAAO,mBAAA,CAAoB,GAAA,CAAI,cAAc,CAAC,CAAA;AACnF,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,sBAAsB,CAAA;AAC7E,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI,OAAO,mBAAA,CAAoB,QAAA,KAAa,QAAA,EAAU;AACpD,QAAA,WAAA,CAAY,WAAW,mBAAA,CAAoB,QAAA;AAAA,MAC7C;AAEA,MAAA,IAAI,OAAO,mBAAA,CAAoB,SAAA,KAAc,QAAA,EAAU;AACrD,QAAA,WAAA,CAAY,YAAY,mBAAA,CAAoB,SAAA;AAAA,MAC9C;AAEA,MAAA,MAAM,UAAA,GAAaA,SAAAA,CAAS,mBAAA,CAAoB,cAAc,CAAA;AAC9D,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,WAAA,CAAY,cAAA,GAAiB,UAAA;AAAA,MAC/B;AAEA,MAAA,IAAI,OAAO,mBAAA,CAAoB,UAAA,KAAe,SAAA,EAAW;AACvD,QAAA,WAAA,CAAY,aAAa,mBAAA,CAAoB,UAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,OAAO,mBAAA,CAAoB,aAAA,KAAkB,SAAA,EAAW;AAC1D,QAAA,WAAA,CAAY,gBAAgB,mBAAA,CAAoB,aAAA;AAAA,MAClD;AAIA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,mBAAA,CAAoB,iBAAiB,CAAA,EAAG;AACxD,QAAA,WAAA,CAAY,oBACV,mBAAA,CAAoB,iBAAA;AAAA,MACxB;AAKA,MAAA,WAAA,CAAY,aAAA,GAAgB,IAAA;AAAA,IAC9B;AAAA,EACF;AAIA,EAAA,MAAM,qBAAqBA,SAAAA,CAAS,MAAA,CAAO,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAC,CAAA;AACjF,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,qBAAqB,CAAA;AAC9E,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAI,OAAO,kBAAA,CAAmB,SAAA,KAAc,QAAA,EAAU;AACpD,QAAA,aAAA,CAAc,YAAY,kBAAA,CAAmB,SAAA;AAAA,MAC/C;AAAA,IAEF;AAAA,EACF;AAIA,EAAA,MAAM,mBAAmBA,SAAAA,CAAS,MAAA,CAAO,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC7E,EAAA,IAAI,gBAAA,IAAoB,OAAO,gBAAA,CAAiB,MAAA,KAAW,QAAA,EAAU;AACnE,IAAA,IAAI,CAAC,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,UAAU,CAAA,EAAG;AACnD,MAAA,KAAA,CAAM,aAAa,cAAA,EAAgB,IAAI,UAAA,CAAW,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAAA,IAC5E;AAAA,EACF;AAGA,EAAA,MAAM,oBAAA,GAAuBA,SAAAA;AAAA,IAC3B,MAAA,CAAO,oBAAA,CAAqB,GAAA,CAAI,cAAc;AAAA,GAChD;AACA,EAAA,IAAI,oBAAA,IAAwB,OAAO,oBAAA,CAAqB,GAAA,KAAQ,QAAA,EAAU;AACxE,IAAA,IAAI,CAAC,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,cAAc,CAAA,EAAG;AACvD,MAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,qBAAqB,SAAS,CAAA,GAC1D,qBAAqB,SAAA,CAAU,MAAA;AAAA,QAC7B,CAAC,KAAA,KAA2B,OAAO,KAAA,KAAU;AAAA,UAE/C,EAAC;AACL,MAAA,KAAA,CAAM,YAAA;AAAA,QACJ,cAAA;AAAA,QACA,IAAI,cAAA;AAAA,UACF,oBAAA,CAAqB,GAAA;AAAA,UACrB,SAAA;AAAA;AAAA;AAAA,UAGA,OAAO,qBAAqB,UAAA,KAAe,QAAA,IAC3C,qBAAqB,UAAA,CAAW,MAAA,GAAS,CAAA,GACrC,oBAAA,CAAqB,UAAA,GACrB;AAAA;AACN,OACF;AAAA,IACF;AAAA,EACF;AACF;AA1dgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;;;ACsCT,IAAM,uBAAA,uBAA8B,GAAA,CAAmB;AAAA,EAC5D,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;;;AC7FD,SAAS,0BAAA,CACP,cAAA,EACA,IAAA,EACA,eAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAA4B;AAAA,IAChC,MAAM,UAAA,CAAW,eAAA,CAAgB,WAAW,GAAA,CAAI,cAAc,CAAC,CAAA,IAAK,MAAA;AAAA,IACpE,WAAW,aAAA,CAAc,eAAA,CAAgB,eAAA,CAAgB,GAAA,CAAI,cAAc,CAAC;AAAA,GAC9E;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,QAAQA,SAAAA,CAAS,eAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACtE,IAAA,IAAI,OAAO,KAAA,EAAO,IAAA,KAAS,QAAA,EAAU;AACnC,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,QAAQA,SAAAA,CAAS,eAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACtE,IAAA,IAAI,OAAO,KAAA,EAAO,IAAA,KAAS,QAAA,EAAU;AACnC,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,SAASA,SAAAA,CAAS,eAAA,CAAgB,YAAA,CAAa,GAAA,CAAI,cAAc,CAAC,CAAA;AACxE,IAAA,IAAI,OAAO,MAAA,EAAQ,IAAA,KAAS,QAAA,EAAU;AACpC,MAAA,OAAA,CAAQ,OAAO,MAAA,CAAO,IAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,QAAQA,SAAAA,CAAS,eAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACtE,IAAA,IAAI,OAAO,KAAA,EAAO,IAAA,KAAS,QAAA,EAAU;AACnC,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AAAA,IACvB;AACA,IAAA,MAAM,YAAA,GAAeA,SAAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAC5C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,CAAQ,OAAA,GAAU,YAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,QAAQA,SAAAA,CAAS,eAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,cAAc,CAAC,CAAA;AACtE,IAAA,IAAI,OAAO,KAAA,EAAO,IAAA,KAAS,QAAA,EAAU;AACnC,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AAAA,IACvB;AACA,IAAA,MAAM,YAAA,GAAeA,SAAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAC5C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,CAAQ,OAAA,GAAU,YAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,SAASA,SAAAA,CAAS,eAAA,CAAgB,YAAA,CAAa,GAAA,CAAI,cAAc,CAAC,CAAA;AACxE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,UAAA,GACJ,OAAO,UAAA,KAAe,cAAA,IAAkB,OAAO,UAAA,KAAe,aAAA,GAC1D,OAAO,UAAA,GACP,MAAA;AACN,MAAA,MAAM,IAAA,GACJ,OAAO,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,IAAA,GACpC,OAAO,IAAA,GACP,MAAA;AAEN,MAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,QAChB,WAAW,OAAO,MAAA,CAAO,SAAA,KAAc,SAAA,GAAY,OAAO,SAAA,GAAY,MAAA;AAAA,QACtE,UAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAK,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,GAAW,OAAO,GAAA,GAAM,MAAA;AAAA,QACnD,MAAM,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,MAAA;AAAA,QACtD,KAAK,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,GAAW,OAAO,GAAA,GAAM,MAAA;AAAA,QACnD,MAAM,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,MAAA;AAAA,QACtD,OAAO,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,GAAW,OAAO,KAAA,GAAQ,MAAA;AAAA,QACzD,KAAK,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,GAAW,OAAO,GAAA,GAAM,MAAA;AAAA,QACnD,QAAQ,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,GAAW,OAAO,MAAA,GAAS,MAAA;AAAA,QAC5D,MAAM,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO;AAAA,OACxD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,IAAA,MAAM,cAAcA,SAAAA,CAAS,eAAA,CAAgB,iBAAA,CAAkB,GAAA,CAAI,cAAc,CAAC,CAAA;AAClF,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,QAChB,OAAA,EAAS,MAAM,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA,GAAI,WAAA,CAAY,UAAU,EAAC;AAAA,QACrE,mBACE,OAAO,WAAA,CAAY,iBAAA,KAAsB,QAAA,GACrC,YAAY,iBAAA,GACZ,MAAA;AAAA,QACN,mBACE,OAAO,WAAA,CAAY,iBAAA,KAAsB,QAAA,GACrC,YAAY,iBAAA,GACZ;AAAA,OACR;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,IAAA,MAAM,KAAKA,SAAAA,CAAS,eAAA,CAAgB,mBAAA,CAAoB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC3E,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,QAChB,UAAU,OAAO,EAAA,CAAG,QAAA,KAAa,QAAA,GAAW,GAAG,QAAA,GAAW,MAAA;AAAA,QAC1D,WAAW,OAAO,EAAA,CAAG,SAAA,KAAc,QAAA,GAAW,GAAG,SAAA,GAAY,MAAA;AAAA,QAC7D,cAAA,EAAgBA,SAAAA,CAAS,EAAA,CAAG,cAAc,CAAA,IAAK,MAAA;AAAA,QAC/C,YAAY,OAAO,EAAA,CAAG,UAAA,KAAe,SAAA,GAAY,GAAG,UAAA,GAAa,KAAA;AAAA,QACjE,eAAe,OAAO,EAAA,CAAG,aAAA,KAAkB,SAAA,GAAY,GAAG,aAAA,GAAgB,KAAA;AAAA;AAAA;AAAA;AAAA,QAI1E,GAAI,MAAM,OAAA,CAAQ,EAAA,CAAG,iBAAiB,CAAA,GAClC,EAAE,mBAAmB,EAAA,CAAG,iBAAA,KACxB,KAAA,CAAM,OAAA,CAAQ,GAAG,SAAS,CAAA,GACxB,EAAE,SAAA,EAAW,EAAA,CAAG,SAAA,EAAU,GAC1B;AAAC,OACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,MAAM,OAAOA,SAAAA,CAAS,eAAA,CAAgB,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC5E,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,QAChB,eAAe,OAAO,IAAA,CAAK,aAAA,KAAkB,QAAA,GAAW,KAAK,aAAA,GAAgB,EAAA;AAAA,QAC7E,WAAW,OAAO,IAAA,CAAK,SAAA,KAAc,QAAA,GAAW,KAAK,SAAA,GAAY;AAAA,OACnE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,MAAM,KAAKA,SAAAA,CAAS,eAAA,CAAgB,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAC,CAAA;AAC1E,IAAA,IAAI,EAAA,EAAI;AAGN,MAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,QAChB,WAAW,OAAO,EAAA,CAAG,SAAA,KAAc,QAAA,GAAW,GAAG,SAAA,GAAY,IAAA;AAAA,QAC7D,WAAW,OAAO,EAAA,CAAG,SAAA,KAAc,QAAA,GAAW,GAAG,SAAA,GAAY,IAAA;AAAA,QAC7D,SAAS,OAAO,EAAA,CAAG,OAAA,KAAY,SAAA,GAAY,GAAG,OAAA,GAAU;AAAA,OAC1D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AA/IS,MAAA,CAAA,0BAAA,EAAA,4BAAA,CAAA;AAiJT,SAAS,kCAAA,CACP,QAAA,EACA,eAAA,EACA,gBAAA,EACe;AACf,EAAA,IAAI,yBAAA,GAA2C,IAAA;AAE/C,EAAA,KAAA,MAAW,cAAA,IAAkB,SAAS,QAAA,EAAU;AAC9C,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAC,CAAA;AAClE,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,8BAA8B,IAAA,EAAM;AACtC,MAAA,yBAAA,GAA4B,cAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,cAAcA,SAAAA,CAAS,eAAA,CAAgB,YAAA,CAAa,GAAA,CAAI,cAAc,CAAC,CAAA;AAC7E,IAAA,IAAI,WAAA,EAAa,cAAc,IAAA,EAAM;AACnC,MAAA,OAAO,cAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,yBAAA;AACT;AAxBS,MAAA,CAAA,kCAAA,EAAA,oCAAA,CAAA;AA0BT,SAAS,yCAAA,CACP,OACA,cAAA,EACM;AACN,EAAA,MAAM,iBAAA,GAAoB,iBACtB,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,GACzB,KAAA,CAAM,KAAA,CAAM,kBAAA,EAAoB,WAAW,CAAA;AAE/C,EAAA,KAAA,MAAW,YAAY,iBAAA,EAAmB;AACxC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ;AACzB,MAAA;AAAA,IACF;AAGA,IAAA,cAAA,CAAe,QAAQ,SAAS,CAAA;AAChC,IAAA,MAAA,CAAO,kBAAkB,IAAI,CAAA;AAAA,EAC/B;AACF;AAnBS,MAAA,CAAA,yCAAA,EAAA,2CAAA,CAAA;AAqBF,SAAS,gCAAA,CACd,QAAA,EACA,KAAA,EACA,sBAAA,EACA,OAAA,EACgC;AAChC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC1C,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,CAAA;AAAA,MACf,gBAAA,EAAkB,IAAA;AAAA,MAClB,KAAA,sBAAW,GAAA;AAAI,KACjB;AAAA,EACF;AAEA,EAAA,MAAM,mBAAA,GAAsB,SAAS,mBAAA,KAAwB,KAAA;AAC7D,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,QAAA,CAAS,UAAA,EAAY,YAAY,CAAA;AAC1E,EAAA,MAAM,eAAA,GAAkB,wBAAwB,QAAQ,CAAA;AACxD,EAAA,MAAM,8BAA8B,mBAAA,GAChC,kCAAA;AAAA,IACE,QAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,GACA,IAAA;AACJ,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AAEtC,EAAA,KAAA,MAAW,cAAA,IAAkB,SAAS,QAAA,EAAU;AAC9C,IAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAa,WAAW,eAAe,CAAA;AAC7C,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,uBAAA,CAAwB,GAAA,CAAI,UAA2B,CAAA,EAAG;AAC5E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,UAAA;AACb,IAAA,MAAM,OAAA,GAAU,0BAAA,CAA2B,cAAA,EAAgB,IAAA,EAAM,eAAe,CAAA;AAEhF,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,cAAA,KAAmB,2BAAA,EAA6B;AACvE,MAAA,OAAA,CAAQ,cAAA,GAAiB,IAAA;AAEzB,MAAA,MAAMmC,QAAAA,GAAUnC,SAAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AACxC,MAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,QAChB,GAAImC,YAAW,EAAC;AAAA,QAChB,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAIA,IAAA,OAAA,CAAQ,mBAAA,GAAsB,IAAA;AAE9B,IAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,SAAA,CAAU,IAAA,EAAM,OAAO,OAAO,CAAA;AAC7E,IAAA,KAAA,CAAM,GAAA,CAAI,gBAAgB,eAAe,CAAA;AAAA,EAC3C;AAEA,EAAA,KAAA,MAAW,cAAA,IAAkB,SAAS,QAAA,EAAU;AAC9C,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,cAAc,CAAA;AAC/C,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAC,CAAA;AAElE,IAAA,qBAAA;AAAA,MACE,KAAA;AAAA,MACA,sBAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,2BAAA;AAAA,MACE,KAAA;AAAA,MACA,sBAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,gBAAA,CAAiB,QAAA,EAAU,KAAA,EAAO,sBAAA,EAAwB,KAAK,CAAA;AAC/D,EAAA,sBAAA,CAAuB,wBAAwB,KAAK,CAAA;AACpD,EAAA,yCAAA;AAAA,IACE,KAAA;AAAA,IACA,OAAA,EAAS,oBAAA,KAAyB,SAAA,GAAY,KAAA,CAAM,QAAO,GAAI;AAAA,GACjE;AAEA,EAAA,MAAM,gBAAA,GACJ,OAAO,QAAA,CAAS,gBAAA,KAAqB,QAAA,GAChC,MAAM,GAAA,CAAI,QAAA,CAAS,gBAAgB,CAAA,IAAK,IAAA,GACzC,IAAA;AAEN,EAAA,OAAO;AAAA,IACL,eAAe,KAAA,CAAM,IAAA;AAAA,IACrB,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAnGgB,MAAA,CAAA,gCAAA,EAAA,kCAAA,CAAA;;;ACzKhB,IAAMnC,SAAAA,mBAAW,MAAA,CAAA,CAAC,KAAA,KAChB,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAC9D,QACD,IAAA,EAHW,UAAA,CAAA;AAqBV,SAAS,0BAA0B,QAAA,EAAqC;AAC7E,EAAA,MAAM,WAAA,GAAc,SAAS,UAAA,CAAW,IAAA;AAAA,IACtC,CAAC,KAAA,KAAU,KAAA,CAAM,SAAA,KAAc;AAAA,GACjC;AACA,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAqB;AAChD,EAAA,KAAA,MAAW,KAAA,IAAS,WAAA,EAAa,OAAA,IAAW,EAAC,EAAG;AAC9C,IAAA,cAAA,CAAe,GAAA,CAAI,MAAM,QAAA,EAAUA,SAAAA,CAAS,MAAM,KAAK,CAAA,EAAG,SAAS,IAAI,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,SAAS,QAAA,CAAS,MAAA;AAAA,IACvB,CAAC,QAAA,KAAa,OAAO,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,KAAM;AAAA,GACxD;AACF;AAXgB,MAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;;;AC1DhB,IAAM,+BAAA,uBAAsC,GAAA,CAAI;AAAA,EAC9C,aAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAcM,SAAS,kBAAA,CACd,KAAA,EACA,sBAAA,EACA,QAAA,EAC0B;AAC1B,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,yBAAA,CAA0B,QAAQ,CAAC,CAAA;AACnE,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,UAAU,QAAA,CAAS,QAAA;AAAA,IACnB,UAAA,EAAY,QAAA,CAAS,UAAA,CAClB,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,+BAAA,CAAgC,GAAA,CAAI,KAAA,CAAM,SAAS,CAAC,CAAA,CACvE,GAAA;AAAA,MAAI,CAAC,KAAA,KACJ,KAAA,CAAM,SAAA,KAAc,gBAAA,GAChB;AAAA,QACE,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,UACrB,CAAC,KAAA,KAAU,CAAC,eAAA,CAAgB,GAAA,CAAI,MAAM,QAAQ;AAAA;AAChD,OACF,GACA;AAAA,MAEL,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAC;AAAA,GAC/C;AAEA,EAAA,MAAM,MAAA,GAAS,gCAAA;AAAA,IACb,YAAA;AAAA,IACA,KAAA;AAAA,IACA,sBAAA;AAAA,IACA,EAAE,mBAAA,EAAqB,KAAA,EAAO,oBAAA,EAAsB,SAAA;AAAU,GAChE;AAEA,EAAA,MAAM,YAAA,GAAe,yBAAA,CAA0B,YAAY,CAAA,CAAE,IAAA;AAAA,IAC3D,CAAC,QAAA,KAAa,MAAA,CAAO,KAAA,CAAM,IAAI,QAAQ;AAAA,GACzC;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,iBAAiB,MAAA,GAAa,MAAA,CAAO,MAAM,GAAA,CAAI,YAAY,KAAK,IAAA,GAAQ,IAAA;AAAA,IAChF,OAAO,MAAA,CAAO;AAAA,GAChB;AACF;AAtCgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;;;ACLhB,IAAM,QAAA,mBAAW,MAAA,CAAA,CAAC,KAAA,KAChB,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EADpD,UAAA,CAAA;AAIV,SAAS,iBAAiB,IAAA,EAAmC;AAClE,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,IAAA,CAAK,UAAU,CAAA,EAAG;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAC1B,EAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,QAAQ,KAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,SAAS,KAAA,CAAM,CAAC,OAAO,OAAO,EAAA,KAAO,QAAQ,CAAA,EAAG;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IACE,CAAC,UAAA,CAAW,KAAA;AAAA,IACV,CAAC,KAAA,KACC,QAAA,CAAS,KAAK,CAAA,IACd,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAO;AAAA,GAC/B,EACA;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,IAAA,EAAM,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,OAAA,GAAU,QAAA;AAAA,IACxC,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,MAAA;AAAA,IAClD;AAAA,GACF;AACF;AArCgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;ACLhB,IAAM,6BAAa,MAAA,CAAA,CAAC,GAAA,KACqC,GAAA,EADtC,YAAA,CAAA;AAInB,SAAS,oBAAA,CAAqB,OAAgB,EAAA,EAAoC;AAChF,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,GAAG,KAAK,CAAA;AAAA,EACjB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,SAAS,oBAAA,CAAqB,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC1E,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,oBAAA,CAAqB,IAAA,EAAM,EAAE,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAfS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAsBT,IAAM,WAAA,uBAAkB,GAAA,EAAkC;AAQnD,SAAS,WAAW,GAAA,EAAmC;AAC5D,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAW,YAAY;AAC3B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,CAAC,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,GAAA,EAAM,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACxE;AACA,IAAA,MAAM,IAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC1C,IAAA,MAAM,MAAA,GAAS,iBAAiB,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACnD;AACA,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,QAAA,EAAU,oBAAA;AAAA,QACR,MAAA,CAAO,QAAA;AAAA,QACP;AAAA;AACF,KACF;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,WAAA,CAAY,GAAA,CAAI,KAAK,OAAO,CAAA;AAC5B,EAAA,OAAA,CAAQ,MAAM,MAAM;AAElB,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,KAAM,OAAA,EAAS;AACpC,MAAA,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IACxB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAlCgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AA2DhB,SAAS,cAAc,MAAA,EAGrB;AACA,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,UAAA,CAAW,MAAM,CAAA,EAAE;AAAA,EAClD;AACA,EAAA,IAAI,MAAA,IAAU,MAAA,IAAU,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAEvD,IAAA,OAAO,EAAE,KAAK,MAAA,CAAO,IAAA,EAAM,OAAO,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,EAC5D;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA;AACd,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,CAAM,IAAA,IAAQ,IAAI,KAAA,EAAM;AACxC;AAbS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAwBT,eAAsB,WAAA,CACpB,KAAA,EACA,MAAA,EACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,cAAc,MAAM,CAAA;AAC3C,EAAA,MAAM,SAAS,MAAM,KAAA;AAErB,EAAA,MAAM,sBAAA,GAAyB,MAAM,yBAAA,EAA0B;AAC/D,EAAA,MAAM,EAAE,QAAO,GAAI,kBAAA;AAAA,IACjB,KAAA;AAAA,IACA,sBAAA;AAAA,IACA,MAAA,CAAO;AAAA,GACT;AACA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,QAAA,EAAW,GAAA,IAAO,MAAA,CAAO,IAAA,IAAQ,SAAS,CAAA,iCAAA;AAAA,KAC5C;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,YAAA,CAAa,MAAA,EAAQ,cAAc,CAAA,EAAG;AAC/C,IAAA,KAAA,CAAM,aAAa,MAAA,EAAQ,IAAI,eAAe,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,aAAa,IAAA,EAAM;AAChE,IAAA,sBAAA,CAAuB,SAAA,CAAU,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,QAAA,EAAU;AAAA,MAChE,sBAAA,EAAwB;AAAA,KACzB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,MAAA,EAAQ,kBAAkB,CAAA;AAC/D,EAAA,IAAI,cAAc,OAAA,EAAS,QAAA,IAAY,OAAA,EAAS,QAAA,IAAY,SAAS,KAAA,CAAA,EAAQ;AAC3E,IAAA,MAAM,KAAA,mBAAQ,MAAA,CAAA,CAAC,MAAA,EAA6C,GAAA,KAAmB;AAC7E,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,OAAO,GAAA,CAAI,CAAA,KAAM,QAAA,EAAU,MAAA,CAAO,IAAI,GAAA,CAAI,CAAA;AAC9C,MAAA,IAAI,OAAO,GAAA,CAAI,CAAA,KAAM,QAAA,EAAU,MAAA,CAAO,IAAI,GAAA,CAAI,CAAA;AAC9C,MAAA,IAAI,OAAO,GAAA,CAAI,CAAA,KAAM,QAAA,EAAU,MAAA,CAAO,IAAI,GAAA,CAAI,CAAA;AAAA,IAChD,CAAA,EALc,OAAA,CAAA;AAMd,IAAA,KAAA,CAAM,SAAA,CAAU,QAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA;AAC1C,IAAA,KAAA,CAAM,SAAA,CAAU,QAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA;AAC1C,IAAA,KAAA,CAAM,SAAA,CAAU,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA;AAEpC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,MAAA,EAAQ,WAAW,CAAA,EAAG,MAAA;AACxD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,cAAA,CAAe,QAAQ,SAAS,CAAA;AAChC,MAAA,MAAA,CAAO,kBAAkB,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAlDsB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAyDf,SAAS,aAAA,CACd,KAAA,EACA,MAAA,EACA,OAAA,GAAU,IAAA,EACF;AACR,EAAA,MAAM,sBAAA,GAAyB,MAAM,yBAAA,EAA0B;AAC/D,EAAA,MAAM,UAAU,oBAAA,CAAqB,KAAA,EAAO,CAAC,MAAM,CAAC,EAAE,OAAA,EAAQ;AAE9D,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,YAAY,OAAA,EAAS;AAC9B,IAAA,IAAI,sBAAA,CAAuB,YAAA,CAAa,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,EAAG;AACjE,MAAA,OAAA,IAAW,CAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAfgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;ACvIT,IAAM,UAAA,GAAN,MAAM,UAAA,CAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0DhD,WAAA,CACE,KAAA,EACA,QAAA,EACA,SAAA,EACA;AA9CF;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAA,IAAA,GAA4C,EAAC;AA8B7C;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAA,SAAA,GAAoB,CAAA;AAiBlB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAI,SAAA,OAAgB,IAAA,GAAO,SAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,SAAA,EAAU;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,kBAAkB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAS,KAAA,EAAoB;AAAA,EAE7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,WAAA,CACE,QACA,OAAA,EACiB;AACjB,IAAA,OAAO,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,YAAA,EAA8B;AACpC,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,YAAY,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAyC;AACvC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,IAAUoC,kBAAA,CAAA,OAAA,EAAQ;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,gBAAA,CAAiB,QAAQ,CAAA;AAE9C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAA0C;AACxC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACjC,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,iBAAA,CAAkB,MAAM,CAAA;AAE7C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,cAAA,EAAqD;AAC/D,IAAA,MAAM,eAAA,GAAkB,KAAK,gBAAA,EAAiB;AAC9C,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,eAAe,KAAA,EAAM,CAAE,GAAA,CAAI,eAAe,EAAE,SAAA,EAAU;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,cAAA,EAA8C;AACvD,IAAA,MAAM,eAAA,GAAkB,KAAK,gBAAA,EAAiB;AAC9C,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,eAAA,CAAgB,WAAW,cAAc,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAA,CAAO,gBAA+B,KAAA,EAAqB;AACzD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkB,KAAK,gBAAA,EAAiB;AAC9C,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,IAAA,CAAK,cAAA,EAAgB,KAAK,CAAA;AAC9D,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,WAAW,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA,CAAQ,gBAAkC,KAAA,EAAqB;AAC7D,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,UAAA,EAAW;AAEtC,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,kBAAA,CAAmB,QAAQ,CAAA;AAChD,IAAA,QAAA,CAAS,KAAA,CAAM,gBAAgB,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,QAAQ,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,cAAA,EAAqC;AAC1C,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAA,EAAM;AAEzC,IAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,UAAA,EAAW;AACtC,IAAA,KAAA,CAAM,OAAO,cAAc,CAAA;AAC3B,IAAA,KAAA,CAAM,mBAAmB,QAAQ,CAAA;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,QAAQ,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,aAAA,GAA6B;AAC3B,IAAA,OAAO,KAAK,KAAA,CAAM,aAAA,CAAc,KAAK,QAAQ,CAAA,EAAG,cAAc,EAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,aACE,cAAA,EACU;AACV,IAAA,OAAO,KAAK,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,cAAc,CAAA,IAAK,IAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,GAA0B;AACxB,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACpD,IAAA,MAAM,cAAA,GAAiB,mBAAmB,KAAA,IAAS,IAAA;AAEnD,IAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,MAAA,OAAO;AAAA,QACL,iBAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,iBAAA;AAAA,MACA,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,cAAc;AAAA,KACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,GAAiC;AAC/B,IAAA,OAAO,KAAK,KAAA,CAAM,cAAA,EAAe,CAAE,MAAA,CAAO,CAAC,MAAA,KAAW;AACpD,MAAA,MAAM,iBAAA,GAAoB,OAAO,UAAA,CAAW,IAAA;AAAA,QAC1C,CAAC,cAAc,SAAA,YAAqB;AAAA,OACtC;AAEA,MAAA,OAAO,iBAAA,EAAmB,UAAU,IAAA,CAAK,QAAA;AAAA,IAC3C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,IAAA,GAAa;AAAA,EAEvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,QAAA,GAAiB;AAAA,EAE3B;AAAA;AAAA,EAGA,QAAA,GAAiB;AAAA,EAEjB;AAAA;AAAA,EAGA,UAAA,GAAmB;AAAA,EAEnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,MAAA,EAA+B;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,MAAA,EAA+B;AAAA,EAE5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,iBAAiB,YAAA,EAAoC;AAAA,EAErD;AAAA;AAAA,EAGA,cAAA,GAAuB;AAAA,EAEvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,KAAA,EAA2B;AAAA,EAEzC;AAAA;AAAA,EAGA,YAAY,KAAA,EAA2B;AAAA,EAEvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,gBAAgB,MAAA,EAA4B;AAAA,EAE5C;AAAA;AAAA,EAGA,mBAAmB,MAAA,EAA4B;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,MAAA,EAAqC;AAAA,EAErD;AAAA;AAAA,EAGA,cAAc,MAAA,EAAqC;AAAA,EAEnD;AAAA,EAEA,OAAO,KAAA,EAA2B;AAAA,EAElC;AAAA;AAAA,EAGA,UAAU,KAAA,EAA2B;AAAA,EAErC;AACF,CAAA;AAzckD,MAAA,CAAA,UAAA,EAAA,WAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAArC,UAAA,CASK,oBAAA,GAAuB,IAAA;AATlC,IAAM,SAAA,GAAN,UAAA;;;ACjDP,eAAsB,oBACpB,SAAA,EACkC;AAClC,EAAA,OAAQ,MAAM;AAAA;AAAA,IAAiC;AAAA,GAAA;AAIjD;AAPsB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAUf,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,MAAM,QAAA,mBAAW,MAAA,CAAA,CAAC,KAAA,KAChB,KAAA,CACG,OAAA,CAAQ,yBAAA,EAA2B,eAAe,CAAA,CAClD,OAAA,CAAQ,mBAAA,EAAqB,cAAc,CAAA,EAH/B,UAAA,CAAA;AAKjB,EAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,EAAS;AAC3C,IAAA,OAAO,QAAA,CAAS,MAAM,OAAO,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,EAAO;AACtC,IAAA,OAAO,SAAS,KAAK,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,uBAAA;AACT;AAbgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAsBT,SAAS,iBAAA,CACd,WAAA,EACA,SAAA,EACA,OAAA,EACc;AACd,EAAA,MAAM,KAAA,GAAQ,YAAY,SAAS,CAAA;AACnC,EAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,EAAA,MAAM,SAAA,GACJ,OAAO,KAAA,KAAU,UAAA,GACb,QACA,OAAO,QAAA,KAAa,aAClB,QAAA,GACA,IAAA;AAER,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,EAAE,SAAA,CAAU,SAAA,YAAqB,OAAA,CAAQ,SAAA,CAAA,EAAY;AACvD,IAAA,MAAM,MAAA,GAAU,SAAA,CACd,OAAA,CAAQ,SACV,CAAA;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AA5BgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AA8BT,SAAS,oBAAoB,KAAA,EAAyC;AAC3E,EAAA,OAAO,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,KAAK,CAAA,GAC5D,KAAA,GACD,EAAC;AACP;AAJgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAMhB,SAAS,cAAc,KAAA,EAAkD;AACvE,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC5E;AAFS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAIT,SAAS,wBAAA,CACP,cACA,YAAA,EACS;AACT,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/B,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,YAAA,GAAe,YAAA;AAAA,EACtD;AAEA,EAAA,IAAI,aAAA,CAAc,YAAY,CAAA,EAAG;AAC/B,IAAA,IAAI,CAAC,aAAA,CAAc,YAAY,CAAA,EAAG;AAChC,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,GAAG,IAAI,wBAAA,CAAyB,YAAA,CAAa,GAAG,CAAA,EAAG,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,OAAO,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,YAAA;AAAA,EAC3D;AACA,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,OAAO,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,YAAA;AAAA,EAC3D;AACA,EAAA,IAAI,OAAO,iBAAiB,SAAA,EAAW;AACrC,IAAA,OAAO,OAAO,YAAA,KAAiB,SAAA,GAAY,YAAA,GAAe,YAAA;AAAA,EAC5D;AACA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,YAAA,KAAiB,SAAY,YAAA,GAAe,IAAA;AAAA,EACrD;AAEA,EAAA,OAAO,OAAO,YAAA,KAAiB,WAAA,GAAc,YAAA,GAAe,YAAA;AAC9D;AAlCS,MAAA,CAAA,wBAAA,EAAA,0BAAA,CAAA;AAqCF,SAAS,0BAAA,CACd,UACA,OAAA,EACyB;AACzB,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,IAAA,IAAA,CAAK,GAAG,IAAI,wBAAA,CAAyB,QAAA,CAAS,GAAG,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,IAAA;AACT;AATgB,MAAA,CAAA,0BAAA,EAAA,4BAAA,CAAA;AAWhB,SAAS,iBACP,KAAA,EACiD;AACjD,EAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,OAAQ,MAAkC,IAAA,KAAS,QAAA;AACrD;AALS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAOT,SAAS,oBAAoB,KAAA,EAAyB;AACpD,EAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,OAAQ,MAAkC,IAAA,KAAS,WAAA;AACrD;AAHS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAKT,SAAS,mBAAA,CACP,YACA,aAAA,EACkB;AAClB,EAAA,OACE,UAAA,CAAW,IAAA;AAAA,IACT,CAAC,CAAA,KACC,CAAA,CAAE,WAAA,CAAY,IAAA,KAAS,GAAG,aAAa,CAAA,SAAA,CAAA,IACvC,CAAA,CAAE,WAAA,CAAY,IAAA,KAAS;AAAA,GAC3B,IAAK,IAAA;AAET;AAXS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAcF,SAAS,gBAAA,CACd,OACA,OAAA,EACyB;AACzB,EAAA,MAAM,QAAA,GAAoC,EAAE,GAAG,OAAA,EAAQ;AACvD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,MAAA,MAAM,WAAY,KAAA,CAAiD,KAAA;AACnE,MAAA,MAAM,aACJ,OAAO,QAAA,KAAa,WAAW,KAAA,CAAM,aAAA,CAAc,QAAQ,CAAA,GAAI,IAAA;AACjE,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,EAAE,GAAI,KAAA,EAAkB,OAAO,UAAA,EAAW;AAAA,IAC5D,CAAA,MAAA,IAAW,mBAAA,CAAoB,KAAK,CAAA,EAAG;AACrC,MAAA,MAAM,MAAO,KAAA,CAAkC,KAAA;AAC/C,MAAA,IACE,aAAA,CAAc,GAAG,CAAA,IACjB,OAAQ,GAAA,CAAgC,aAAa,QAAA,IACrD,OAAQ,GAAA,CAAgC,aAAA,KAAkB,QAAA,EAC1D;AACA,QAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,aAAA,EAAc,GAAI,GAAA;AAIjD,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,aAAA,CAAc,WAAW,CAAA;AAClD,QAAA,MAAM,YAAY,UAAA,GACd,mBAAA,CAAoB,UAAA,CAAW,UAAA,EAAY,aAAa,CAAA,GACxD,IAAA;AACJ,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,EAAE,GAAI,KAAA,EAAkB,OAAO,SAAA,EAAU;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AA/BgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAkCT,SAAS,uBAAA,CACd,SACA,YAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,YAAA,EAAa;AAC1D,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrD,IAAA,IAAI,gBAAA,CAAiB,QAAQ,CAAA,IAAK,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AAC/D,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,QAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAXgB,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;;;AC5JhB,SAAS,gBAAA,CAAiB,QAAA,EAAkB,SAAA,EAAmB,SAAA,EAA2B;AACxF,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,IAAI,SAAS,CAAA,CAAA;AAC9C;AAFS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAKT,SAAS,oBAAA,CACP,aACA,SAAA,EACsB;AACtB,EAAA,OAAO,iBAAA,CAAiC,aAAa,SAAA,EAAW;AAAA,IAC9D,SAAA,EAAW,SAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AARS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAUT,SAAS,cAAA,CACP,OACA,gBAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,UAAU,OAAO,KAAA,EAAO,QAAA,KAAa,QAAA,GAAW,MAAM,QAAA,GAAW,gBAAA;AAAA,IACjE,WAAW,OAAO,KAAA,EAAO,SAAA,KAAc,QAAA,GAAW,MAAM,SAAA,GAAY,EAAA;AAAA,IACpE,WAAW,OAAO,KAAA,EAAO,SAAA,KAAc,QAAA,GAAW,MAAM,SAAA,GAAY,EAAA;AAAA,IACpE,SAAS,OAAO,KAAA,EAAO,OAAA,KAAY,SAAA,GAAY,MAAM,OAAA,GAAU,IAAA;AAAA,IAC/D,IAAA,EAAM,mBAAA,CAAoB,KAAA,EAAO,IAAI,CAAA;AAAA,IACrC,YAAA,EACE,KAAA,EAAO,YAAA,KAAiB,MAAA,IACxB,OAAO,YAAA,KAAiB,SAAA,IACxB,KAAA,EAAO,YAAA,KAAiB,OAAA,IACxB,KAAA,EAAO,YAAA,KAAiB,OAAA,GACpB,MAAM,YAAA,GACN,MAAA;AAAA,IACN,gBAAgB,OAAO,KAAA,EAAO,cAAA,KAAmB,QAAA,GAAW,MAAM,cAAA,GAAiB;AAAA,GACrF;AACF;AAnBS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAqBT,SAAS,iBAAA,CAAkB,WAA4B,QAAA,EAAiC;AACtF,EAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,CAAU,OAAO,KAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpE,IAAA,OAAO,UAAU,OAAA,CACd,GAAA,CAAI,CAAC,KAAA,KAAU,eAAe,KAAA,EAA+B,QAAQ,CAAC,CAAA,CACtE,OAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAA,IAAa,MAAM,SAAS,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,EAAC;AACV;AARS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAUT,SAAS,kBAAA,CAAmB,WAA4B,OAAA,EAA8B;AACpF,EAAA,MAAM,UAAA,GAAa,QAAQ,GAAA,CAAI,CAAC,UAAU,cAAA,CAAe,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AAC/E,EAAA,SAAA,CAAU,OAAA,GAAU,UAAA;AAEpB,EAAA,MAAM,MAAA,GAAS,WAAW,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,SAAA,CAAU,cAAA,GAAiB,IAAA;AAAA,EAC7B;AACF;AARS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAwBF,IAAM,sBAAA,GAAN,MAAM,sBAAA,CAA2C;AAAA,EAetD,WAAA,CAAY,cAA6B,gBAAA,EAAqC;AAd9E,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAkC;AAC1D,IAAA,IAAA,CAAQ,OAAA,uBAAc,GAAA,EAA2B;AAOjD,IAAA,IAAA,CAAQ,gBAAA,GAAkC,IAAA;AAE1C;AAAA,IAAA,IAAA,CAAQ,eAAA,GAA6C,MAAA;AACrD,IAAA,IAAA,CAAQ,cAAA,GAAkD,IAAA;AAsD1D,IAAA,IAAA,CAAQ,aAAA,2BAAiB,KAAA,KAA8B;AACrD,MAAA,IAAA,CAAK,iBAAiB,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,CAAA,EAAG,MAAM,OAAA,EAAQ;AAAA,IAC7D,CAAA,EAFwB,eAAA,CAAA;AAIxB,IAAA,IAAA,CAAQ,WAAA,2BAAe,KAAA,KAA8B;AACnD,MAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,CAAA;AAC/C,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,CAAA;AAC/C,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAEtB,MAAA,IAAI,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA,GAAI,uBAAsB,eAAA,EAAiB;AAC1E,MAAA,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAAA,IAChD,CAAA,EARsB,aAAA,CAAA;AAtDpB,IAAA,IAAA,CAAK,eAAe,YAAA,IAAgB,mBAAA;AACpC,IAAA,IAAA,CAAK,eAAe,gBAAA,IAAoB,IAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAUC,kBAAA,CAAA,SAAA,EAAU;AACrC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,gBAAA,CAAiB,aAAA,EAAe,KAAK,aAAa,CAAA;AAC/E,MAAA,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,gBAAA,CAAiB,WAAA,EAAa,KAAK,WAAW,CAAA;AAAA,IAC7E;AAAA,EACF;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAA,EAAuC;AAC7D,IAAA,IAAI,OAAA,GAAiC,MAAA;AACrC,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,MAAM,EAAA,GAAK,QAAQ,QAAA,EAAU,QAAA;AAC7B,MAAA,IAAI,OAAO,EAAA,KAAO,QAAA,EAAU,OAAO,EAAA;AACnC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,KAAA,CAAM,SAAiB,OAAA,EAAuB;AACpD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,qBAAA,EAAsB;AAChE,IAAA,IAAA,CAAK,WAAW,CAAA,GAAA,CAAM,OAAA,GAAU,KAAK,IAAA,IAAQ,IAAA,CAAK,QAAS,CAAA,GAAI,CAAA;AAC/D,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,EAAA,CAAG,OAAA,GAAU,KAAK,GAAA,IAAO,IAAA,CAAK,UAAU,CAAA,GAAI,CAAA;AAAA,EAClE;AAAA;AAAA,EAGQ,YAAA,CAAa,SAAiB,OAAA,EAAuB;AAC3D,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,OAAO,CAAA;AAC3B,IAAA,IAAA,CAAK,UAAU,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,aAAa,MAAM,CAAA;AACtE,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,gBAAA,CAAiB,KAAK,YAAA,CAAa,KAAA,CAAM,UAAU,IAAI,CAAA;AACnF,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AAEtB,MAAA,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,gBAAA,EAAkB;AAC3C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAChD,MAAA,IAAI,aAAa,IAAA,EAAM;AACrB,QAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AACvB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBQ,eAAe,YAAA,EAAmC;AACxD,IAAA,IAAI,YAAA,KAAiB,KAAK,gBAAA,EAAkB;AAC5C,IAAA,MAAM,eAAe,IAAA,CAAK,gBAAA;AAC1B,IAAA,IAAA,CAAK,gBAAA,GAAmB,YAAA;AAExB,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC5C,QAAA,IAAI,MAAA,CAAO,aAAa,YAAA,EAAc;AACpC,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,UAAU,UAAA,EAAW;AAAA,UAC9B,CAAA,CAAA,MAAQ;AAAA,UAAC;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC5C,QAAA,IAAI,MAAA,CAAO,aAAa,YAAA,EAAc;AACpC,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,UAAU,QAAA,EAAS;AAAA,UAC5B,CAAA,CAAA,MAAQ;AAAA,UAAC;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAE5C,IAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAW;AACtC,MAAA,MAAM,OAAO,IAAA,CAAK,eAAA;AAClB,MAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,MAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA;AAE7C,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,eAAe,CAAA;AACpE,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,eAAA,EAAiB,QAAQ,CAAA;AAC3D,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,eAAA,CAAgB,cAAA,GAAiB,IAAA;AACjC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,OAAO,CAAA;AAC/B,MAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,MAAA,KAAA,IAAS,aAAa,CAAA,EAAG,UAAA,GAAa,WAAA,CAAY,MAAA,EAAQ,cAAc,CAAA,EAAG;AACzE,QAAA,MAAM,KAAA,GAAQ,YAAY,UAAU,CAAA;AAGpC,QAAA,MAAM,YAAA,GAAe,MAAM,YAAA,EAAa;AACxC,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,aAAa,YAAA,EAAc;AACtD,UAAA,WAAA,CAAY,UAAU,CAAA,GAAI;AAAA,YACxB,GAAG,KAAA;AAAA,YACH,YAAA,EAAc,MAAA;AAAA,YACd,cAAA,EAAgB;AAAA,WAClB;AACA,UAAA;AAAA,QACF;AAEA,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA,MAAM,MAAM,gBAAA,CAAiB,QAAA,EAAU,KAAA,CAAM,SAAA,EAAW,MAAM,SAAS,CAAA;AACvE,QAAA,MAAA,CAAO,IAAI,GAAA,EAAK;AAAA,UACd,QAAA;AAAA,UACA,eAAA;AAAA,UACA,UAAA;AAAA,UACA,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AAEA,MAAA,kBAAA,CAAmB,iBAAiB,WAAW,CAAA;AAC/C,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,eAAA,CAAgB,cAAA,GAAiB,IAAA;AAAA,MACnC;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,IAAA,CAAK,SAAA,CAAU,SAAQ,EAAG;AACpD,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC7B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,YAAA,CAAa,MAAA,CAAO,UAAU,eAAe,CAAA;AACzE,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,IAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAC3B,YAAA,aAAA,CAAc,cAAA,GAAiB,IAAA;AAAA,UACjC;AACA,UAAA,aAAA,CAAc,eAAA,CAAgB,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,QACxD;AAEA,QAAA,MAAA,CAAO,SAAA,CAAU,UAAU,KAAK,CAAA;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,CAAO,eAAA,EAAiB,OAAO,QAAQ,CAAA;AACzE,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAC3C,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAA,CAAO,SAAA,CAAU,UAAU,KAAK,CAAA;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AACzB,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,CAAC,KAAA,CAAM,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC3C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,eAAA,CAAgB,iBACrB,MAAA,CAAO,UAAA,KAAe,IAAI,MAAA,CAAO,SAAA,GAAY,OAAO,eAAA,CAAgB,cAAA;AACtE,QAAA,MAAA,CAAO,gBAAgB,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY,OAAO,SAAS,CAAA;AAE9E,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,GAAI;AAAA,UAC3B,GAAG,SAAA;AAAA,UACH,IAAA,EAAM,wBAAwB,MAAA,CAAO,OAAA,EAAS,oBAAoB,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC;AAAA,SAC1F;AAEA,QAAA,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA;AAExC,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,GAAI;AAAA,UAC3B,GAAG,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAAA,UAC5B,IAAA,EAAM,wBAAwB,MAAA,CAAO,OAAA,EAAS,oBAAoB,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,UACxF,YAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAgB,KAAA;AAAA,SAClB;AACA,QAAA,kBAAA,CAAmB,MAAA,CAAO,iBAAiB,OAAO,CAAA;AAAA,MACpD,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,GAAI;AAAA,UAC3B,GAAG,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAAA,UAC5B,YAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAgB,eAAe,KAAK;AAAA,SACtC;AACA,QAAA,kBAAA,CAAmB,MAAA,CAAO,iBAAiB,OAAO,CAAA;AAClD,QAAA,IAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAC3B,UAAA,MAAA,CAAO,gBAAgB,cAAA,GAAiB,IAAA;AAAA,QAC1C;AACA,QAAA,MAAA,CAAO,SAAA,CAAU,UAAU,KAAK,CAAA;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,MAC3B;AAAA,IACF;AAIA,IAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,MAAA,IAAI,WAAA,GAAc,KAAA;AAClB,MAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC5C,QAAA,IAAI,MAAA,CAAO,QAAA,KAAa,IAAA,CAAK,gBAAA,EAAkB;AAC7C,UAAA,WAAA,GAAc,IAAA;AACd,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,MAAA,CAAO,SAAQ,EAAG;AAC5C,MAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,GAAG,KAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACpD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,CAAO,eAAA,EAAiB,OAAO,QAAQ,CAAA;AACzE,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAC7C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,GAAI;AAAA,UAC3B,GAAG,WAAA;AAAA,UACH,YAAA,EAAc,SAAA;AAAA,UACd,cAAA,EAAgB;AAAA,SAClB;AACA,QAAA,kBAAA,CAAmB,MAAA,CAAO,iBAAiB,OAAO,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,OAAA,GAAU,KAAK,aAAA,CAAc,KAAA,EAAO,MAAM,CAAA,CAC7C,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,QAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,MAAA,CAAO,eAAA,EAAiB,OAAO,QAAQ,CAAA;AAC7E,QAAA,MAAM,SAAA,GAAY,WAAA,CAAY,MAAA,CAAO,UAAU,CAAA;AAC/C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,WAAA,CAAY,MAAA,CAAO,UAAU,CAAA,GAAI;AAAA,YAC/B,GAAG,SAAA;AAAA,YACH,YAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAgB;AAAA,WAClB;AACA,UAAA,kBAAA,CAAmB,MAAA,CAAO,iBAAiB,WAAW,CAAA;AAAA,QACxD;AACA,QAAA,IAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAC3B,UAAA,MAAA,CAAO,gBAAgB,cAAA,GAAiB,IAAA;AAAA,QAC1C;AACA,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,8CAAA,EAAiD,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,CAAA;AAAA,UAC7E;AAAA,SACF;AAAA,MACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,MACzB,CAAC,CAAA;AAEH,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AACrC,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,QAAQ,KAAA,EAAoB;AAC1B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,mBAAA,CAAoB,aAAA,EAAe,KAAK,aAAa,CAAA;AAClF,MAAA,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,mBAAA,CAAoB,WAAA,EAAa,KAAK,WAAW,CAAA;AAAA,IAChF;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC5C,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,YAAA,CAAa,MAAA,CAAO,UAAU,eAAe,CAAA;AACzE,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAC3B,UAAA,aAAA,CAAc,cAAA,GAAiB,IAAA;AAAA,QACjC;AACA,QAAA,aAAA,CAAc,eAAA,CAAgB,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,MACxD;AAEA,MAAA,MAAA,CAAO,SAAA,CAAU,UAAU,KAAK,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,MAAc,aAAA,CAAc,KAAA,EAAc,MAAA,EAAqC;AAC7E,IAAA,MAAM,EAAE,QAAA,EAAU,eAAA,EAAiB,UAAA,EAAY,aAAY,GAAI,MAAA;AAC/D,IAAA,MAAM,GAAA,GAAM,gBAAA;AAAA,MACV,QAAA;AAAA,MACA,WAAA,CAAY,SAAA;AAAA,MACZ,WAAA,CAAY;AAAA,KACd;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,YAAY,SAAS,CAAA;AAEjE,IAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,WAAA,EAAa,WAAA,CAAY,SAAS,CAAA;AACpE,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,WAAA,CAAY,SAAS,CAAA,KAAA,EAAQ,YAAY,SAAS,CAAA;AAAA,OACjF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,eAAe,CAAA;AAElE,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,aAAA,EAAe,QAAQ,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,YAAY,UAAU,CAAA;AAExC,IAAA,IACE,CAAC,SAAA,IACD,CAAC,SAAA,CAAU,WACX,CAAC,SAAA,CAAU,SAAA,IACX,SAAA,CAAU,cAAc,WAAA,CAAY,SAAA,IACpC,SAAA,CAAU,SAAA,KAAc,YAAY,SAAA,EACpC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,SAAA,CAAU,IAAI,CAAA;AAEtD,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AAEF,MAAA,SAAA,GAAY,IAAI,IAAA;AAAA,QACd,KAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,WAAW,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,SAAA,CAAU,IAAI,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,0BAAA,CAA2B,QAAA,EAAU,WAAW,CAAA;AACnE,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AAEvD,IAAA,SAAA,CAAU,IAAA,GAAO,YAAA;AAGjB,IAAA,IAAI,CAAC,KAAA,CAAM,YAAA,EAAa,EAAG;AACzB,MAAC,UAA0C,IAAA,EAAK;AAAA,IAClD;AAEA,IAAA,WAAA,CAAY,UAAU,CAAA,GAAI;AAAA,MACxB,GAAG,SAAA;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,YAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,kBAAA,CAAmB,eAAe,WAAW,CAAA;AAC7C,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,aAAA,CAAc,cAAA,GAAiB,SAAA;AAAA,IACjC;AACA,IAAA,aAAA,CAAc,eAAA,CAAgB,GAAA,CAAI,UAAA,EAAY,SAAS,CAAA;AACvD,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,GAAA,EAAK;AAAA,MACtB,QAAA;AAAA,MACA,WAAW,WAAA,CAAY,SAAA;AAAA,MACvB,WAAW,WAAA,CAAY,SAAA;AAAA,MACvB,UAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACF,CAAA;AAxZwD,MAAA,CAAA,sBAAA,EAAA,uBAAA,CAAA;AAA3C,sBAAA,CAaa,eAAA,GAAkB,CAAA;AAbrC,IAAM,qBAAA,GAAN;;;AC5DA,IAAM,aAAA,GAAN,MAAM,aAAA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCxB,WAAA,CAAY,KAAA,EAAc,QAAA,EAAkB,IAAA,EAAgC;AAnB5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAA,IAAA,GAAgC,EAAC;AAYjC;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAA,IAAA,GAA8B,IAAA;AAQ5B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAI,IAAA,OAAW,IAAA,GAAO,IAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAwB;AACtB,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AAiBF,CAAA;AAhE0B,MAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAb,aAAA,CAMK,uBAAA,GAA0B,IAAA;AANrC,IAAM,YAAA,GAAN,aAAA;;;AChCA,IAAM,uBAAA,GAA0B;AAsBvC,SAAS,cAAA,CAAe,WAAkC,KAAA,EAAsB;AAI9E,EAAA,MAAA,CAAO,cAAA,CAAe,WAAW,UAAA,EAAY;AAAA,IAC3C,KAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,YAAA,EAAc,IAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACb,CAAA;AACH;AAVS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAaT,SAAS,mBAAmB,IAAA,EAA4B;AACtD,EAAA,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAI,CAAA;AACxB,EAAA,IAAA,CAAK,QAAA,CAAS,CAAC,IAAA,KAAS;AACtB,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IACE,UAAU,OAAA,IACV,CAAC,QAAA,CAAS,QAAA,GAAW,0BAA0B,CAAA,EAC/C;AACA,MAAA,QAAA,CAAS,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAItB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GACpC,WACA,QAAA,GACE,CAAC,QAAQ,CAAA,GACT,EAAC;AACP,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,IAAI,GAAA,CAAI,QAAA,GAAW,0BAA0B,CAAA,EAAG;AAEhD,MAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,EAAG;AACtC,QAAA,IAAI,KAAA,YAAuBC,kBAAA,CAAA,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ;AAAA,MACpD;AACA,MAAA,GAAA,CAAI,OAAA,IAAU;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACH;AA7BS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2CF,IAAM,mBAAA,GAAN,MAAM,mBAAA,CAAwC;AAAA,EAOnD,YAAY,YAAA,EAA6B;AALzC,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAgC;AACxD,IAAA,IAAA,CAAQ,OAAA,uBAAc,GAAA,EAAqD;AAE3E;AAAA,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAA;AAGd,IAAA,IAAA,CAAK,eAAe,YAAA,IAAgB,mBAAA;AAAA,EACtC;AAAA,EAEA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAC5C,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAmC;AAEtD,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,qBAAqB,CAAA,EAAG;AACzD,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,qBAAqB,CAAA;AACpE,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,QAAA,GACJ,UAAU,OAAA,IACV,OAAO,UAAU,SAAA,KAAc,QAAA,IAC/B,OAAO,SAAA,CAAU,SAAA,KAAc,QAAA;AAEjC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEb,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAC1C,QAAA,IAAI,QAAQ,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,QAAQ,KAAK,CAAA;AAC9D,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAC5B,QAAA,IAAI,SAAA,CAAU,iBAAiB,MAAA,EAAQ;AACrC,UAAA,SAAA,CAAU,YAAA,GAAe,MAAA;AACzB,UAAA,SAAA,CAAU,cAAA,GAAiB,MAAA;AAAA,QAC7B;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,GAAA,CAAI,UAAU,SAAS,CAAA;AAAA,IAChC;AAGA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,CAAA,IAAK,KAAK,SAAA,EAAW;AAC/C,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACrC,MAAA,MAAM,eAAA,GACJ,CAAC,SAAA,IACD,MAAA,CAAO,cAAc,SAAA,CAAU,SAAA,IAC/B,MAAA,CAAO,SAAA,KAAc,SAAA,CAAU,SAAA;AACjC,MAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,QAAQ,KAAK,eAAA,EAAiB;AACjD,QAAA,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AAAA,MACpD;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,SAAS,CAAA,IAAK,MAAA,EAAQ;AAC1C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAC1C,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,WAAW,OAAA,IAAW,CAAC,OAAO,QAAA,EAAU;AAC9D,MAAA,IAAI,CAAC,KAAA,CAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAGtC,MAAA,IAAI,SAAA,CAAU,IAAA,KAAS,MAAA,CAAO,eAAA,EAAiB;AAC7C,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,0BAAA;AAAA,YACb,MAAA,CAAO,OAAA;AAAA,YACP,mBAAA,CAAoB,UAAU,IAAI;AAAA,WACpC;AACA,UAAA,MAAA,CAAO,OAAA,GAAU,MAAA;AACjB,UAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,gBAAA,CAAiB,KAAA,EAAO,MAAM,CAAA;AACrD,UAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,MAAA,EAAQ,MAAM,CAAA;AACrD,UAAA,SAAA,CAAU,IAAA,GAAO,MAAA;AACjB,UAAA,MAAA,CAAO,eAAA,GAAkB,MAAA;AAAA,QAC3B,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAChD,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,QAAA,CAAS,SAAS,SAAS,CAAA;AAAA,MACpC,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAAA,MAClD;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,SAAS,CAAA,IAAK,MAAA,EAAQ;AAC1C,MAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,QAAQ,KAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChE,MAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAC5B,MAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAC5B,MAAA,IAAI,SAAA,CAAU,iBAAiB,SAAA,EAAW;AACxC,QAAA,SAAA,CAAU,YAAA,GAAe,SAAA;AACzB,QAAA,SAAA,CAAU,cAAA,GAAiB,MAAA;AAAA,MAC7B;AACA,MAAA,MAAM,eAAe,IAAA,CAAK,KAAA;AAC1B,MAAA,MAAM,MAAM,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,SAAS,IAAI,SAAS,CAAA,CAAA;AACrD,MAAA,MAAM,UAAU,IAAA,CAAK,gBAAA;AAAA,QACnB,KAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF,CACG,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,QAAA,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,QAAA,EAAU,MAAA,EAAW,KAAK,CAAA;AAChD,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,oCAAA,EAAuC,SAAS,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,CAAA;AAAA,UAC9D;AAAA,SACF;AAAA,MACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,IAAI,KAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG,QAAQ,GAAA,EAAK;AAC3C,UAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA,QAC9B;AAAA,MACF,CAAC,CAAA;AACH,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,QAAA,EAAU,EAAE,GAAA,EAAK,SAAS,CAAA;AAAA,IAC7C;AAGA,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AAC1C,MAAA,IAAI,CAAC,OAAO,GAAA,CAAI,QAAQ,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,CACZ,KAAA,EACA,UACA,SAAA,EACA,SAAA,EACA,KACA,YAAA,EACe;AACf,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAGrD,IAAA,IACE,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,GAAA,KAAQ,GAAA,IACpC,YAAA,KAAiB,IAAA,CAAK,KAAA,IACtB,CAAC,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA,EACzB;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,qBAAqB,CAAA;AACpE,IAAA,IACE,CAAC,SAAA,IACD,CAAC,SAAA,CAAU,OAAA,IACX,UAAU,SAAA,KAAc,SAAA,IACxB,SAAA,CAAU,SAAA,KAAc,SAAA,EACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAoC,WAAA,EAAa,SAAA,EAAW;AAAA,MACvE,SAAA,EAAW,YAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,6BAAA,EAAgC,SAAS,CAAA,KAAA,EAAQ,SAAS,CAAA;AAAA,OAC5D;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,SAAA,CAAU,IAAI,CAAA;AACtD,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,IAAI,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,KAAA,CAAS,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,GAAW,IAAI,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,WAAW,CAAA;AAAA,IAClD;AAMA,IAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA;AAMzD,IAAA,MAAM,IAAA,GACJ,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAAE,MAAA,GAAS,CAAA,GAClC,0BAAA,CAA2B,eAAA,EAAiB,WAAW,CAAA,GACvD,EAAE,GAAG,WAAA,EAAY;AACvB,IAAA,QAAA,CAAS,IAAA,GAAO,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AAE5C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA,EAAG;AACxC,MAAA,IAAI,KAAA,CAAM,QAAA,GAAW,uBAAuB,CAAA,EAAG;AAC7C,QAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,SAAS,KAAA,EAAM;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,OAAA,IAAU;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,IAAI,CAAC,KAAA,IAAU,KAAA,CAAyB,UAAA,KAAe,IAAA,EAAM;AAC3D,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,OAAA,IAAU;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,KAAA,CAAM,QAAA,CAAS,uBAAuB,CAAA,GAAI,IAAA;AAC1C,IAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAChB,IAAA,QAAA,CAAS,IAAA,GAAO,KAAA;AAMhB,IAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA;AACvD,IAAA,MAAM,cAAA,GAA0C,EAAE,GAAG,eAAA,EAAgB;AACrE,IAAA,KAAA,MAAW,CAACC,IAAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACxD,MAAA,IAAI,EAAEA,IAAAA,IAAO,cAAA,CAAA,EAAiB,cAAA,CAAeA,IAAG,CAAA,GAAI,KAAA;AAAA,IACtD;AACA,IAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,cAAA,EAAgB,WAAW,CAAA;AACrE,IAAA,QAAA,CAAS,IAAA,GAAO,gBAAA,CAAiB,KAAA,EAAO,MAAM,CAAA;AAE9C,IAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,MAAA,EAAQ,MAAM,CAAA;AACrD,IAAA,SAAA,CAAU,IAAA,GAAO,MAAA;AACjB,IAAA,SAAA,CAAU,YAAA,GAAe,OAAA;AACzB,IAAA,SAAA,CAAU,cAAA,GAAiB,MAAA;AAC3B,IAAA,cAAA,CAAe,WAAW,QAAQ,CAAA;AAElC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAA,EAAU;AAAA,MAC3B,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,EAAQ,OAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,eAAA,EAAiB;AAAA,KAClB,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,cAAA,CACN,KAAA,EACA,QAAA,EACA,MAAA,EACA,aAAA,EACM;AACN,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,UAAU,OAAA,IAAU;AAAA,IAC7B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,EAAM,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAA;AAE/C,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,qBAAqB,CAAA;AACpE,IAAA,IAAI,SAAA,EAAW,cAAA,CAAe,SAAA,EAAW,IAAI,CAAA;AAE7C,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAA,EAAU;AAAA,QAC3B,GAAG,MAAA;AAAA,QACH,MAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,SAAA,CACN,KAAA,EACA,QAAA,EACA,SAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,OACJ,SAAA,IAAa,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,qBAAqB,CAAA,IAAK,IAAA;AACtE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,MAAA,IAAA,CAAK,cAAA,GAAiB,eAAe,KAAK,CAAA;AAAA,IAC5C;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAC1C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AAAA,IACnD,CAAA,MAAO;AAGL,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAA,EAAU;AAAA,QAC3B,QAAA;AAAA,QACA,SAAA,EAAW,MAAM,SAAA,IAAa,EAAA;AAAA,QAC9B,SAAA,EAAW,MAAM,SAAA,IAAa,EAAA;AAAA,QAC9B,MAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,IAAA;AAAA,QACN,SAAS,EAAC;AAAA,QACV,eAAA,EAAiB;AAAA,OAClB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,KAAA,IAAS,CAAA;AACd,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA,EAAG;AACpD,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,UAAU,OAAA,IAAU;AAAA,MAC7B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,EAAM,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAA;AAC/C,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA;AAAA,EAGA,WAAW,SAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,KAAA,IAAS,CAAA;AACd,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA,EAAG;AACpD,MAAA,IAAI,MAAA,CAAO,cAAc,SAAA,EAAW;AACpC,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,UAAU,OAAA,IAAU;AAAA,MAC7B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,EAAM,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAA;AAC/C,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC;AACA,IAAA,KAAA,MAAW,CAAC,UAAU,KAAK,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG;AACjD,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,CAAA,CAAA,EAAI,SAAS,GAAG,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,QAAQ,KAAA,EAAoB;AAC1B,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA,EAAG;AACpD,MAAA,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF,CAAA;AA7VqD,MAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAA9C,IAAM,kBAAA,GAAN;;;AC1FA,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAAyC;AAAA,EACpD,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,kBAAA,EAAoB,WAAW,CAAA;AAM5D,IAAA,MAAM,WAAW,KAAA,CAAM,cAAA,EAAe,GAAI,KAAA,CAAM,WAAU,GAAI,IAAA;AAE9D,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAE1D,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,MAAA,KAAW,QAAA,EAAU;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,cAAA,CAAe,QAAQ,SAAS,CAAA;AAChC,MAAA,MAAA,CAAO,kBAAkB,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AACF,CAAA;AA1BsD,MAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAA/C,IAAM,mBAAA,GAAN;ACUP,SAAS,gBAAgB,IAAA,EAAsD;AAC7E,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,eAAe,IAAA,CAAK;AAAA,GACtB;AACF;AATS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AA6BF,IAAM,YAAA,GAAN,MAAM,YAAA,CAAiC;AAAA,EAS5C,YAAY,EAAE,QAAA,GAAW,KAAA,EAAM,GAA4B,EAAC,EAAG;AAN/D;AAAA,IAAA,IAAA,CAAiB,gBAAA,uBAAuB,GAAA,EAAqB;AAE7D;AAAA,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAiC;AAEpE;AAAA,IAAA,IAAA,CAAiB,wBAAA,uBAA+B,GAAA,EAAY;AAG1D,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,MAAA,CAAO,OAAc,UAAA,EAA0B;AAC7C,IAAA,IAAI,KAAK,QAAA,EAAU;AAEnB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAG3C,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,QAAQ,CAAA;AAEtC,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,cAAc,CAAA;AAC7D,MAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AAEvB,MAAA,MAAM,QAAQ,SAAA,CAAU,KAAA;AAKxB,MAAA,IAAI,CAAC,KAAA,CAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACpC,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,KAAA,CAAM,IAAA,EAAK;AACX,UAAA,IAAA,CAAK,wBAAA,CAAyB,IAAI,QAAQ,CAAA;AAAA,QAC5C;AACA,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/C,QAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,QAAQ,CAAA;AAE7C,QAAA,IAAI,UAAU,SAAA,IAAa,CAAC,KAAA,CAAM,SAAA,IAAa,MAAM,MAAA,EAAQ;AAC3D,UAAA,KAAA,CAAM,IAAA,EAAK;AAAA,QACb;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAG5C,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,IAAK,KAAA;AAK9D,MAAA,IACE,cAAA,IACA,CAAC,KAAA,CAAM,SAAA,IACP,UAAU,SAAA,IACV,CAAC,SAAA,CAAU,QAAA,IACX,CAAC,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,QAAQ,CAAA,EAC3C;AACA,QAAA,SAAA,CAAU,SAAA,GAAY,KAAA;AAAA,MACxB;AAEA,MAAA,IAAI,SAAA,CAAU,SAAA,IAAa,CAAC,KAAA,CAAM,SAAA,EAAW;AAG3C,QAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,UAAA,KAAA,CAAM,IAAA,EAAK;AAAA,QACb;AAAA,MACF,CAAA,MAAA,IAAW,CAAC,SAAA,CAAU,SAAA,IAAa,MAAM,SAAA,EAAW;AAClD,QAAA,IAAI,UAAU,QAAA,EAAU;AACtB,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QACd,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,IAAA,EAAK;AAAA,QACb;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,KAAA,CAAM,SAAS,CAAA;AAAA,IACrD;AAGA,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAK,EAAG;AACnD,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChC,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AACrC,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAChC,QAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,QAAQ,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAA,CACN,QAAA,EACA,SAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,OAAO,SAAA,CAAU,OAAA;AACvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAE1C,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,KAAK,IAAA,EAAM;AACpC,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,KAAK,KAAA,EAAO;AACtC,MAAA,KAAA,CAAM,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,KAAK,MAAA,EAAQ;AACxC,MAAA,KAAA,CAAM,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,IAC7B;AAIA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,KAAA,YAAuBC,kBAAA,CAAA,eAAA,EAAiB;AAC7D,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAA,KAAgB,KAAK,WAAA,EAAa;AAClD,QAAA,KAAA,CAAM,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,MACvC;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,aAAA,KAAkB,KAAK,aAAA,EAAe;AACtD,QAAA,KAAA,CAAM,gBAAA,CAAiB,KAAK,aAAkC,CAAA;AAAA,MAChE;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,aAAA,KAAkB,KAAK,aAAA,EAAe;AACtD,QAAA,KAAA,CAAM,gBAAA,CAAiB,KAAK,aAAa,CAAA;AAAA,MAC3C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,QAAQ,MAAA,EAAqB;AAC3B,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,yBAAyB,KAAA,EAAM;AAAA,EACtC;AACF,CAAA;AA3I8C,MAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAAvC,IAAM,WAAA,GAAN;ACjBP,SAASC,iBAAgB,IAAA,EAAsD;AAC7E,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,eAAe,IAAA,CAAK;AAAA,GACtB;AACF;AAfS,MAAA,CAAAA,gBAAAA,EAAA,iBAAA,CAAA;AAkCF,IAAM,YAAA,GAAN,MAAM,YAAA,CAAiC;AAAA,EAS5C,YAAY,EAAE,QAAA,GAAW,KAAA,EAAM,GAA4B,EAAC,EAAG;AAN/D;AAAA,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAA6B;AAE/D;AAAA,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAiC;AAEpE;AAAA,IAAA,IAAA,CAAiB,uBAAA,uBAA8B,GAAA,EAAY;AAGzD,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,MAAA,CAAO,OAAc,UAAA,EAA0B;AAC7C,IAAA,IAAI,KAAK,QAAA,EAAU;AAEnB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAG3C,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,QAAQ,CAAA;AAEtC,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,cAAc,CAAA;AAC7D,MAAA,IAAI,CAAC,WAAW,YAAA,EAAc;AAE9B,MAAA,MAAM,QAAQ,SAAA,CAAU,YAAA;AAKxB,MAAA,IAAI,CAAC,KAAA,CAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACpC,QAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,UAAA,KAAA,CAAM,KAAA,EAAM;AACZ,UAAA,IAAA,CAAK,uBAAA,CAAwB,IAAI,QAAQ,CAAA;AAAA,QAC3C;AACA,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9C,QAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,QAAQ,CAAA;AAE5C,QAAA,IAAI,SAAA,CAAU,SAAA,IAAa,KAAA,CAAM,MAAA,EAAQ;AACvC,UAAA,KAAA,CAAM,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QAC7B;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAG5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,KAAK,EAAE,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AAKlF,MAAA,IACE,KAAK,SAAA,IACL,KAAA,CAAM,MAAA,IACN,CAAC,MAAM,OAAA,IACP,SAAA,CAAU,SAAA,IACV,CAAC,UAAU,QAAA,IACX,CAAC,KAAK,uBAAA,CAAwB,GAAA,CAAI,QAAQ,CAAA,EAC1C;AACA,QAAA,SAAA,CAAU,SAAA,GAAY,KAAA;AAAA,MACxB;AAEA,MAAA,MAAM,YAAA,GAAe,CAAC,SAAA,CAAU,SAAA,IAAa,CAAC,SAAA,CAAU,QAAA;AACxD,MAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,QAAA;AAGhD,MAAA,MAAM,WAAA,GAAc,CAAC,cAAA,IAAkB,YAAA;AAEvC,MAAA,IAAI,UAAU,SAAA,EAAW;AACvB,QAAA,IAAI,MAAM,MAAA,EAAQ;AAGhB,UAAA,KAAA,CAAM,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA,MAAA,IAAW,UAAU,QAAA,EAAU;AAC7B,QAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QACd;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QACd;AACA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,KAAA,CAAM,WAAA,GAAc,CAAA;AAAA,QACtB;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,UAAA,CAAW,IAAI,QAAA,EAAU;AAAA,QAC5B,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,UAAU,SAAA,CAAU;AAAA,OACrB,CAAA;AAAA,IACH;AAGA,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,EAAG;AAC7C,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChC,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,QAAQ,CAAA;AAC/B,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAChC,QAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,QAAQ,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAA,CACN,QAAA,EACA,SAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,OAAO,SAAA,CAAU,OAAA;AACvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAE1C,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,KAAK,IAAA,EAAM;AACpC,MAAA,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAAA,IACpB;AAMA,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,KAAK,MAAA,EAAQ;AACxC,MAAA,IAAI,UAAU,SAAA,EAAW;AACvB,QAAA,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MACrD;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,CAAC,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ;AAC3F,MAAA,SAAA,CAAU,OAAO,KAAA,CAAM,GAAA,CAAI,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,IACvD;AAGA,IAAA,MAAM,WAAW,SAAA,CAAU,QAAA;AAC3B,IAAA,IAAI,oBAA0BC,kBAAA,CAAA,cAAA,EAAgB;AAC5C,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,eAAA,KAAoB,KAAK,eAAA,EAAiB;AAC1D,QAAC,SAAS,QAAA,CAAS,QAAA,CAAS,KAAA,CAAsB,GAAA,CAAI,KAAK,eAAe,CAAA;AAAA,MAC5E;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,KAAe,KAAK,UAAA,EAAY;AAChD,QAAA,QAAA,CAAS,QAAA,CAAS,UAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,UAAA;AAAA,MAC5C;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,KAAe,KAAK,UAAA,EAAY;AAChD,QAAA,QAAA,CAAS,QAAA,CAAS,UAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,UAAA;AAAA,MAC5C;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,KAAK,KAAA,EAAO;AACtC,QAAA,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA;AAAA,MACvC;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,SAAA,CAAU,SAAA,YAA2BA,kBAAA,CAAA,eAAA,EAAiB;AAC3E,MAAA,MAAM,WAAW,SAAA,CAAU,SAAA;AAE3B,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAA,KAAgB,KAAK,WAAA,EAAa;AAClD,QAAA,QAAA,CAAS,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,MAC1C;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,aAAA,KAAkB,KAAK,aAAA,EAAe;AACtD,QAAA,QAAA,CAAS,gBAAA,CAAiB,KAAK,aAAkC,CAAA;AAAA,MACnE;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,aAAA,KAAkB,KAAK,aAAA,EAAe;AACtD,QAAA,QAAA,CAAS,gBAAA,CAAiB,KAAK,aAAa,CAAA;AAAA,MAC9C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAUD,gBAAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,QAAQ,MAAA,EAAqB;AAC3B,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,wBAAwB,KAAA,EAAM;AAAA,EACrC;AACF,CAAA;AAzL8C,MAAA,CAAA,YAAA,EAAA,aAAA,CAAA;AAAvC,IAAM,WAAA,GAAN;AC9BP,SAAS,aAAa,MAAA,EAAqC;AACzD,EAAA,MAAM,QAAQ,MAAA,CAAO,UAAA;AACrB,EAAA,OAAO,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,OAAA,GAAU,KAAA,GAAQ,MAAA;AACzD;AAHS,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAWT,SAAS,OAAO,MAAA,EAAoC;AAClD,EAAA,MAAM,OAAO,MAAA,CAAO,aAAA;AACpB,EAAA,IAAI,IAAA,KAAS,qBAAqB,OAAO,mBAAA;AACzC,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,MAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,MAAM,OAAO,MAAA;AACxB,EAAA,OAAO,YAAA;AACT;AANS,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;AAQT,SAAS,WAAW,MAAA,EAAqC;AACvD,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,aAAa,MAAM,CAAA;AAAA,IAC/B,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,IACnB,SAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW,IAAUE,kBAAA,CAAA,OAAA,EAAQ;AAAA,IAC7B,YAAA,EAAc,IAAUA,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,EAAE,CAAA;AAAA,IACxC,YAAA,EAAc,IAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,MAAA,EAAQ,KAAA;AAAA,IACR,WAAA,EAAa,KAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,KAAA;AAAA,IACT,YAAA,EAAc,KAAA;AAAA,IACd,UAAA,EAAY,KAAA;AAAA,IACZ,MAAM,EAAC;AAAA,IACP,OAAA,EAAS,KAAA;AAAA,IACT,SAAS,EAAC;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AACF;AApBS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAuBT,IAAM,mBAAA,GAAsB,IAAI,YAAA,CAAa,EAAA,GAAK,EAAE,CAAA;AAWpD,SAAS,cAAA,CACP,KAAA,EACA,IAAA,EACA,cAAA,EACA,WACA,QAAA,EACqB;AACrB,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,IAAA,EAEzB;AACD,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,MAAA,GAAuB,YAAY,EAAC;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAEjC,EAAA,MAAM,MAAA,GACJ,MAAA,CAAO,MAAA,GAAS,EAAA,IAAM,mBAAA,CAAoB,MAAA,GACtC,mBAAA,GACA,IAAI,YAAA,CAAa,MAAA,CAAO,MAAA,GAAS,EAAE,CAAA;AAEzC,EAAA,MAAM,YACJ,KAAA,CAOA,SAAA;AAEF,EAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACnC,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,gBAAgB,MAAM,CAAA;AAAA,IAC/D,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,KAAA;AAAA,IACX;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,QAAA,MAAA,CAAO,UAAU,MAAA,EAAQ,CAAA,GAAI,EAAE,CAAA,CAAE,YAAY,SAAS,CAAA;AACtD,QAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACrD,QAAA,MAAA,CAAO,sBAAsB,MAAM,CAAA;AACnC,QAAA,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,MAAA;AAAA,MACrB;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AAAA,MACjB,OAAO,CAAC,CAAA;AAAA,MACR;AAAA,KACF;AACA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,MAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAE,YAAY,SAAS,CAAA;AAC7D,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACrD,IAAA,MAAA,CAAO,sBAAsB,MAAM,CAAA;AACnC,IAAA,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,MAAA;AACnB,IAAA,UAAA,GAAa,IAAA;AAAA,EACf;AAIA,EAAA,OAAO,aAAa,MAAA,GAAS,IAAA;AAC/B;AAzES,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AA2EF,IAAM,cAAA,GAAN,MAAM,cAAA,CAAmC;AAAA,EAAzC,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,OAAA,uBAAc,GAAA,EAAiC;AAEhE;AAAA,IAAA,IAAA,CAAiB,gBAAA,GAAmB,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACtD,IAAA,IAAA,CAAQ,OAAA,GAA4B,IAAA;AAEpC,IAAA,IAAA,CAAiB,gCAAgB,MAAA,CAAA,CAAC,KAAA,KAChC,KAAK,IAAA,CAAK,KAAA,EAAO,oBAAoB,CAAA,EADN,eAAA,CAAA;AAEjC,IAAA,IAAA,CAAiB,8BAAc,MAAA,CAAA,CAAC,KAAA,KAC9B,KAAK,IAAA,CAAK,KAAA,EAAO,kBAAkB,CAAA,EADN,aAAA,CAAA;AAE/B,IAAA,IAAA,CAAiB,iCAAiB,MAAA,CAAA,CAAC,KAAA,KACjC,KAAK,IAAA,CAAK,KAAA,EAAO,qBAAqB,CAAA,EADN,gBAAA,CAAA;AAElC,IAAA,IAAA,CAAiB,+BAAe,MAAA,CAAA,CAAC,KAAA,KAC/B,KAAK,IAAA,CAAK,KAAA,EAAO,mBAAmB,CAAA,EADN,cAAA,CAAA;AAAA,EAAA;AAAA,EAGxB,IAAA,CAAK,OAA2B,IAAA,EAAgC;AACtE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,WAAW,CAAA;AAClD,IAAC,MAAA,CAA8C,IAAc,CAAA,GAAI,IAAA;AAAA,EACnE;AAAA,EAEQ,aAAa,MAAA,EAAqC;AACxD,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS;AAAA,QACP,MAAA;AAAA,QACA,KAAA,EAAO,WAAW,MAAM,CAAA;AAAA,QACxB,kBAAA,EAAoB,KAAA;AAAA,QACpB,gBAAA,EAAkB,KAAA;AAAA,QAClB,mBAAA,EAAqB,KAAA;AAAA,QACrB,iBAAA,EAAmB,KAAA;AAAA,QACnB,OAAA,EAAS;AAAA,OACX;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,OAAA,EAA0B;AACtC,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,OAAA,CAAQ,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,aAA8B,CAAA;AAC3E,IAAA,OAAA,CAAQ,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,WAA4B,CAAA;AACvE,IAAA,OAAA,CAAQ,gBAAA;AAAA,MACN,cAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AACA,IAAA,OAAA,CAAQ,gBAAA,CAAiB,YAAA,EAAc,IAAA,CAAK,YAA6B,CAAA;AAAA,EAC3E;AAAA;AAAA,EAGA,aAAA,GAAsB;AACpB,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,mBAAA;AAAA,QACN,aAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AACA,MAAA,OAAA,CAAQ,mBAAA;AAAA,QACN,WAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AACA,MAAA,OAAA,CAAQ,mBAAA;AAAA,QACN,cAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AACA,MAAA,OAAA,CAAQ,mBAAA;AAAA,QACN,YAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,OAAO,KAAA,EAAoB;AAGzB,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AAC3C,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,MAAM,CAAA;AAC1B,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,MAAM,WAAA,GAAc,KAAA;AAC3B,MAAA,MAAA,CAAO,MAAM,SAAA,GAAY,KAAA;AACzB,MAAA,MAAA,CAAO,MAAM,YAAA,GAAe,KAAA;AAC5B,MAAA,MAAA,CAAO,MAAM,UAAA,GAAa,KAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,CAAM,gBAAe,EAAG;AAEzC,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,EAAA,CAAG,iBAAA,EAAkB;AACrD,IAAA,MAAM,KAAA,GAAS,QAAA,CAAS,EAAA,CAA2C,QAAA,IAAW;AAC9E,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAmB;AASpC,IAAA,MAAM,YAAY,IAAA,CAAK,gBAAA;AACvB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,SAAA,EAAU,CAAE,MAAA;AAC9B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,iBAAA,EAAkB;AACtB,MAAA,SAAA,CAAU,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,QAAA,EAAS;AAAA,IACrB;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,YAAA,EAAc;AACzC,MAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACvC,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAElB,MAAA,KAAA,CAAM,UAAA,GAAa,aAAa,MAAM,CAAA;AACtC,MAAA,KAAA,CAAM,IAAA,GAAO,OAAO,MAAM,CAAA;AAE1B,MAAA,IAAI,KAAA,IAAS,cAAA,IAAkB,MAAA,CAAO,cAAA,EAAgB;AACpD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,gBAAgB,cAAc,CAAA;AAChE,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,CAAA,GAAI,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CACzB,SAAA,CAAU,KAAK,SAAA,CAAU,MAAM,CAAA,CAC/B,WAAA,CAAY,SAAS,CAAA;AACxB,UAAA,KAAA,CAAM,SAAA,CAAU,sBAAsB,CAAC,CAAA;AACvC,UAAA,KAAA,CAAM,YAAA,CACH,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,CACZ,eAAA;AAAA,YACC,IAAUA,kBAAA,CAAA,UAAA,EAAW,CAAE,qBAAA,CAAsB,CAAC;AAAA,YAE/C,SAAA,EAAU;AAAA,QACf;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,IAAS,cAAA,IAAkB,MAAA,CAAO,SAAA,EAAW;AAC/C,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,WAAW,cAAc,CAAA;AAC/D,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,CAAA,GAAI,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CACzB,SAAA,CAAU,SAAS,SAAA,CAAU,MAAM,CAAA,CACnC,WAAA,CAAY,SAAS,CAAA;AACxB,UAAA,KAAA,CAAM,YAAA,KAAN,KAAA,CAAM,YAAA,GAAiB,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAA;AACzC,UAAA,KAAA,CAAM,cAAA,KAAN,KAAA,CAAM,cAAA,GAAmB,IAAUA,kBAAA,CAAA,UAAA,EAAW,CAAA;AAC9C,UAAA,KAAA,CAAM,YAAA,CAAa,sBAAsB,CAAC,CAAA;AAC1C,UAAA,KAAA,CAAM,cAAA,CAAe,sBAAsB,CAAC,CAAA;AAAA,QAC9C;AAAA,MACF,CAAA,MAAO;AAGL,QAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,QAAA,KAAA,CAAM,cAAA,GAAiB,IAAA;AAAA,MACzB;AAEA,MAAA,IAAI,KAAA,IAAS,cAAA,IAAkB,MAAA,CAAO,IAAA,EAAM;AAC1C,QAAA,KAAA,CAAM,MAAA,GAAS,cAAA;AAAA,UACb,KAAA;AAAA,UACA,MAAA,CAAO,IAAA;AAAA,UACP,cAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAA,CAAM;AAAA,SACR;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AAAA,MACjB;AAEA,MAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AACpC,QAAA,KAAA,CAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,KAAS,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA;AACjE,QAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,MAAA,KAAW,OAAO,OAAO,CAAA;AAAA,MAChE,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,OAAO,EAAC;AACd,QAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,QAAA,KAAA,CAAM,UAAU,EAAC;AAAA,MACnB;AAAA,IAEF;AASA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,QAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,QAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,QAAA,MAAA,CAAO,kBAAA,GAAqB,KAAA;AAAA,MAC9B;AACA,MAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,QAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,QAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,QAAA,MAAA,CAAO,gBAAA,GAAmB,KAAA;AAAA,MAC5B;AACA,MAAA,IAAI,OAAO,mBAAA,EAAqB;AAC9B,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,QAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,QAAA,MAAA,CAAO,mBAAA,GAAsB,KAAA;AAAA,MAC/B;AACA,MAAA,IAAI,OAAO,iBAAA,EAAmB;AAC5B,QAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,QAAA,KAAA,CAAM,UAAA,GAAa,IAAA;AACnB,QAAA,MAAA,CAAO,iBAAA,GAAoB,KAAA;AAAA,MAC7B;AAAA,IACF;AAKA,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AAC3C,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,MAAM,SAAA,GAAY,KAAA;AACzB,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,GAA4B;AAC1B,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,QAAO,EAAG,CAAC,MAAA,KAAW,MAAA,CAAO,KAAK,CAAA;AAAA,EACnE;AAAA;AAAA,EAGA,SAAS,UAAA,EAA+C;AACtD,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,UAAA,KAAe,UAAA,SAAmB,MAAA,CAAO,KAAA;AAAA,IAC5D;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,WAAA,GAAuB;AACrB,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAAA,IAClC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AACF,CAAA;AAtPgD,MAAA,CAAA,cAAA,EAAA,eAAA,CAAA;AAAzC,IAAM,aAAA,GAAN;AChJA,IAAM,gBAAA,GAAmB,CAAA;AAOzB,IAAM,sBAAA,GAAyB,GAAA;AAe/B,IAAM,mBAAA,GAAsB,EAAA;AAa5B,IAAM,qBAAA,GAAN,MAAM,qBAAA,CAAqB;AAAA,EAA3B,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,UAA4B,EAAC;AAAA,EAAA;AAAA;AAAA,EAG9C,MAAA,CAAO,UAAyB,IAAA,EAAoB;AAClD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,EAAE,QAAA,EAAU,SAAS,KAAA,EAAM,EAAG,MAAM,CAAA;AACtD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,gBAAA,EAAkB;AAC1C,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgB,GAAA,EAA4B;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,MACzB,CAAC,MAAA,KAAW,GAAA,GAAM,MAAA,CAAO,IAAA,IAAQ;AAAA,KACnC;AACA,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAUC,kBAAA,CAAA,OAAA,EAAQ;AAE/C,IAAA,IAAI,IAAA,GAAO,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAC7B,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,IAAA,GAAO,QAAA,CAAS,IAAA;AAGnC,MAAA,IAAI,MAAM,IAAA,EAAM;AAEhB,MAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAChC,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU,QAAA,CAAS,QAAQ,CAAA,CAC9C,YAAA,CAAa,EAAE,CAAA;AAClB,MAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,EAAO;AAI9B,MAAA,IAAI,QAAQ,mBAAA,EAAqB;AACjC,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAA,GAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,CAAA;AAAA,EACxB;AACF,CAAA;AAxDkC,MAAA,CAAA,qBAAA,EAAA,sBAAA,CAAA;AAA3B,IAAM,oBAAA,GAAN,qBAAA;AAgEA,SAAS,mBAAA,CACd,QAAA,EACA,OAAA,EACA,SAAA,EACe;AACf,EAAA,IAAI,SAAA,IAAa,IAAA,EAAM,OAAO,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAEhD,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,EAAM,CAAE,SAAS,QAAA,CAAS,KAAA,EAAM,CAAE,MAAA,EAAQ,CAAA;AAEhE,EAAA,IAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACf,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,CAAM,CAAA,EAAG,CAAC,KAAA,CAAM,CAAA,EAAG,CAAC,KAAA,CAAM,CAAA,EAAG,CAAC,KAAA,CAAM,CAAC,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,IAAA,CAAWA,kBAAA,CAAA,SAAA,CAAU,MAAM,KAAA,CAAM,CAAA,EAAG,EAAA,EAAI,CAAC,CAAC,CAAA;AACjE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5D,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,GAAQ,IAAA,EAAM,OAAO,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAE7D,EAAA,OAAO,IAAUA,kBAAA,CAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,CAC/C,YAAA,CAAa,OAAO,CAAA,CACpB,cAAA,CAAe,QAAQ,SAAS,CAAA;AACrC;AApBgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AC3BT,IAAM,mBAAA,GAAsB,IAAA;AAGnC,IAAM,qBAAA,GAAwB,IAAA;AASvB,IAAM,cAAA,GAAiB,IAAA;AAQvB,SAAS,qBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,QAAA,CAAS,UAAA,CAAW,UAAU,QAAQ,CAAA;AAEjE,EAAA,MAAM,WAAA,GAAc,IAAUC,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA;AAAA,IACtC,KAAA,CAAM,cAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AACA,EAAA,MAAM,YAAA,GAAe,YAAY,MAAA,EAAO;AAKxC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IACE,QAAQ,UAAA,IACR,KAAA,CAAM,iBAAA,GAAoB,qBAAA,IAC1B,aAAa,qBAAA,EACb;AACA,IAAA,MAAA,GAAS,aAAa,KAAA,CAAM,iBAAA;AAI5B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAC,KAAK,cAAA,EAAgB;AAC1C,MAAA,MAAA,GAAS,CAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,MAAA,IAAU,MAAA,GAAS,CAAA,GAAI,CAAC,cAAA,GAAiB,cAAA;AAAA,IAC3C;AACA,IAAA,MAAA,GAAS,IAAA,CAAK,IAAI,OAAA,CAAQ,QAAA,EAAU,KAAK,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,EACxE;AAGA,EAAA,MAAM,QAAQ,KAAA,CAAM,YAAA,CAAa,KAAA,EAAM,CAAE,eAAe,MAAM,CAAA;AAe9D,EAAA,MAAM,UAAA,GACJ,UAAA,GAAa,mBAAA,IAAuB,YAAA,GAAe,qBAAA;AAGrD,EAAA,MAAM,OAAO,OAAA,CAAQ,UAAA,CAAW,OAAM,CAAE,QAAA,CAAS,MAAM,iBAAiB,CAAA;AAExE,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,SAAA,IAAa,UAAA,EAAY;AAGpD,IAAA,UAAA,GAAa,IAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAM,CAAE,SAAA,EAAU;AAChD,IAAA,MAAM,cAAc,SAAA,CAAU,KAAA,GAAQ,eAAA,CAAgB,IAAI,EAAE,SAAA,EAAU;AACtE,IAAA,MAAM,WAAA,GAAc,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CACnC,UAAA,CAAW,UAAU,QAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA,CAC/C,SAAA,EAAU;AAIb,IAAA,MAAM,UAAA,GAAa,IAAUA,kBAAA,CAAA,UAAA,EAAW,CAAE,kBAAA;AAAA,MACxC,WAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,UAAA,GAAa,UAAA,CAAW,SAAS,IAAI,CAAA;AAAA,EACvC;AAIA,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CACxB,KAAA,GACA,QAAA,CAAS,KAAK,CAAA,CACd,eAAA,CAAgB,UAAU,CAAA;AAC7B,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA,CAAS,KAAA,EAAM,CAAE,IAAI,YAAY,CAAA;AAE1D,EAAA,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AACnD;AAzFgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;;;ACrEhB,IAAM,qBAAA,GAAwB,GAAA;AAG9B,SAAS,iBAAiB,CAAA,EAIL;AACnB,EAAA,OAAO,IAAUC,kBAAA,CAAA,UAAA,EAAW,CAAE,YAAA,CAAa,IAAUA,kBAAA,CAAA,KAAA,CAAM,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAC3E;AANS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAST,SAAS,UAAA,CACP,QACA,CAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,IAAUA,kBAAA,CAAA,KAAA,EAAM,CAAE,kBAAkB,CAAC,CAAA;AACnD,EAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA;AACjB,EAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA;AACjB,EAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA;AACnB;AARS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAoDF,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAAyC;AAAA,EAapD,YAAY,WAAA,EAA4B;AAXxC,IAAA,IAAA,CAAiB,SAAA,GAAY,IAAUA,kBAAA,CAAA,SAAA,EAAU;AACjD,IAAA,IAAA,CAAiB,KAAA,uBAAY,GAAA,EAA8B;AAC3D,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AAEzC;AAAA,IAAA,IAAA,CAAiB,MAAA,uBAAa,GAAA,EAG5B;AAEF;AAAA,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAA;AAGhB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EAEA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAC5C,IAAA,IAAI,CAAC,KAAA,CAAM,cAAA,EAAe,EAAG;AAC3B,MAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AACrC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,SAAA,EAAU;AAC1C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,oBAAA,CAAqB,KAAK,CAAA;AACrD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAElB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAG1B,MAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AACjC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,IAAI,CAAA,EAAG;AACzC,UAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,QAC3B;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,OAAO,aAAa,CAAA;AACpE,MAAA,IAAI,cAAc,IAAA,EAAM;AAExB,MAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AACjC,QAAA,IAAA,CAAK,kBAAkB,SAAA,CAAU,QAAA;AAAA,MACnC;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,UAAU,SAAA,CAAU;AAAA,OACrB,CAAA;AAED,MAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAAA,QACzB,SAAA,CAAU,QAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,IACE,YAAA,EAAc,aACd,IAAA,CAAK,cAAA;AAAA,QAAe,KAAA;AAAA,QAAO,YAAA;AAAA;AAAA,QAA6B;AAAA,OAAI,EAC5D;AACA,QAAA,IAAA,CAAK,QAAQ,KAAA,EAAO,KAAA,EAAO,SAAA,CAAU,QAAA,EAAU,UAAU,WAAW,CAAA;AAAA,MACtE;AAAA,IACF;AAKA,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,SAAS,CAAA;AAAA,EACnC;AAAA;AAAA,EAGQ,UACN,QAAA,EACoD;AACpD,IAAA,MAAM,UAA8D,EAAC;AACrE,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,MAAM,CAAA,IAAK,KAAK,KAAA,EAAO;AACxC,MAAA,IAAI,MAAA,CAAO,aAAa,QAAA,EAAU,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,OAAA,CACN,KAAA,EACA,KAAA,EACA,QAAA,EACA,WAAA,EACM;AACN,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,uBAAuB,CAAA;AACzE,IAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AACvC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,aAAa,SAAS,CAAA;AACxD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,KAAA,KAAU,KAAK,CAAA,EAAG;AAEtD,IAAA,IAAI,YAAA,CAAa,cAAc,QAAA,EAAU;AAEzC,IAAA,IAAI,YAAA,CAAa,cAAc,SAAA,EAAW;AAIxC,MAAA,MAAM,QAAA,GAAW,QAAQ,CAAC,CAAA;AAC1B,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAChC,MAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,MAAA,MAAA,CAAO,IAAA,GAAO,SAAA;AACd,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,MAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,YAAY,CAAA;AAChD,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAC5B,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,QAAA,EAAU,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACzB,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,aAAa,WAAW,CAAA;AAC1D,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,QAAA,CACN,KAAA,EACA,KAAA,EACA,MAAA,EACA,YAAA,EACM;AACN,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,MAAA,CAAO,UAAU,kBAAkB,CAAA;AACxE,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAChD,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,SAAA,CAAU,QAAQ,CAAA;AAE5D,IAAA,MAAA,CAAO,SAAS,IAAUA,kBAAA,CAAA,OAAA;AAAA,MACxB,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA;AAAA,MAC5B,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA;AAAA,MAC5B,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK;AAAA,MAC5B,eAAA,CAAgB,cAAA,CAAe,KAAA,EAAM,CAAE,QAAQ,CAAA;AACjD,IAAA,MAAA,CAAO,qBAAqB,cAAA,CACzB,KAAA,GACA,MAAA,EAAO,CACP,SAAS,gBAAgB,CAAA;AAC5B,IAAA,MAAA,CAAO,MAAA,GAAS,KAAA;AAChB,IAAA,MAAA,CAAO,QAAQ,KAAA,EAAM;AACrB,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA;AACxC,IAAA,MAAA,CAAO,kBAAA,GAAqB,eAAe,KAAA,EAAM;AAGjD,IAAA,IAAI,MAAA,CAAO,WAAA,IAAe,YAAA,CAAa,YAAA,CAAa,WAAW,CAAA,EAAG;AAChE,MAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AACrB,MAAA,MAAA,CAAO,gBAAA,GAAmB,IAAA;AAC1B,MAAA,MAAA,CAAO,aAAA,GAAgB,IAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAGQ,YAAA,CAAa,OAAc,QAAA,EAAwB;AACzD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AACvC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,SAAS,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,WAAW,CAAA;AACnE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,SAAA,EAAW;AAE5B,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACnD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,KAAK,CAAA;AAKvD,IAAA,MAAM,YAAA,GACJ,QAAQ,MAAA,CAAO,WAAA,EAAa,OAAM,IAClC,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,WAAW,CAAA;AAC9C,IAAA,MAAM,cAAA,GACJ,UAAU,MAAA,CAAO,WAAA,EAAa,OAAM,IACpC,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,aAAa,CAAA;AAEhD,IAAA,OAAA,CAAQ,OAAO,OAAA,GAAU;AAAA,MACvB,YAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAc,IAAUA,kBAAA,CAAA,OAAA;AAAA,QACtB,UAAU,KAAA,CAAM,CAAA;AAAA,QAChB,UAAU,KAAA,CAAM,CAAA;AAAA,QAChB,UAAU,KAAA,CAAM;AAAA,OAClB;AAAA,MACA,iBAAA,EAAmB,WAAA,CAAY,UAAA,CAAW,aAAa,CAAA;AAAA;AAAA;AAAA,MAGvD,iBAAA,EAAmB,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA,CACjD,MAAA,EAAO,CACP,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,MAChD,iBAAA,EAAmB,gBAAA,CAAiB,SAAA,CAAU,QAAQ;AAAA,KACxD;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,QAAA,EAAU,CAAC,MAAM,CAAA,CAAE,eAAA,CAAgB,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC1E;AAAA;AAAA,EAGQ,gBAAA,CACN,WACA,UAAA,EACe;AACf,IAAA,MAAM,KAAA,GAAQ,UAAA,CACX,KAAA,EAAM,CACN,GAAA;AAAA,MACC,IAAUA,kBAAA,CAAA,OAAA;AAAA,QACR,UAAU,QAAA,CAAS,CAAA;AAAA,QACnB,UAAU,QAAA,CAAS,CAAA;AAAA,QACnB,UAAU,QAAA,CAAS;AAAA;AACrB,MAED,eAAA,CAAgB,gBAAA,CAAiB,UAAU,QAAQ,CAAA,CAAE,QAAQ,CAAA;AAEhE,IAAA,KAAA,CAAM,CAAA,IAAK,SAAA,CAAU,KAAA,CAAM,CAAA,IAAK,CAAA;AAChC,IAAA,KAAA,CAAM,CAAA,IAAK,SAAA,CAAU,KAAA,CAAM,CAAA,IAAK,CAAA;AAChC,IAAA,KAAA,CAAM,CAAA,IAAK,SAAA,CAAU,KAAA,CAAM,CAAA,IAAK,CAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGQ,cAAA,CACN,KAAA,EACA,YAAA,EACA,QAAA,EACS;AACT,IAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,MAAA;AACnD,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,KAAA,CAAM,YAAA,GAAe,KAAA,CAAM,OAAA;AACnD,IAAA,QAAQ,aAAa,WAAA;AAAa,MAChC,KAAK,OAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,IAAA;AAAA,MACT;AACE,QAAA,OAAO,KAAA,IAAS,IAAA;AAAA;AACpB,EACF;AAAA;AAAA,EAGQ,YAAA,CACN,KAAA,EACA,KAAA,EACA,IAAA,EACS;AACT,IAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAAA,MACzB,IAAA,CAAK,QAAA;AAAA,MACL;AAAA,KACF;AACA,IAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAC1B,IAAA,QAAQ,aAAa,WAAA;AAAa,MAChC,KAAK,OAAA;AACH,QAAA,OAAO,KAAA,CAAM,SAAA,IAAa,CAAC,KAAA,CAAM,MAAA;AAAA,MACnC,KAAK,MAAA;AACH,QAAA,OAAO,KAAA,CAAM,UAAA,IAAc,CAAC,KAAA,CAAM,OAAA;AAAA,MACpC;AACE,QAAA,OAAO,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,KAAA,CAAM,OAAA;AAAA;AACnC,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,iBAAA,CACN,KAAA,EACA,KAAA,EACA,aAAA,EACqE;AACrE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAEpC,IAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,IAAA,IAAI,kBAAkB,MAAA,CAAO,iBAAA;AAC7B,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,MAAMC,gBAAe,KAAA,CAAM,YAAA;AAAA,QACzB,KAAA,CAAM,QAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,IAAI,CAACA,aAAAA,EAAc;AACnB,MAAA,IAAIA,aAAAA,CAAa,cAAc,UAAA,EAAY;AAE3C,MAAA,MAAM,QAAA,GAAW,IAAUD,kBAAA,CAAA,OAAA,EAAQ;AACnC,MAAA,KAAA,CAAM,MAAA,CAAO,iBAAiB,QAAQ,CAAA;AACtC,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AACzC,MAAA,IAAI,QAAA,IAAYC,aAAAA,CAAa,UAAA,IAAc,QAAA,GAAW,eAAA,EAAiB;AACrE,QAAA,eAAA,GAAkB,QAAA;AAClB,QAAA,SAAA,GAAY,KAAA,CAAM,QAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,SAAA;AAAA,QACV,WAAA,EAAa,KAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,aAAa,CAAA;AAC7C,IAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,IAAA;AACzB,IAAA,MAAM,QAAQ,GAAA,CAAI,QAAA;AAElB,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,KAAA,EAAO,uBAAuB,CAAA;AAGtE,IAAA,MAAM,kBAAA,GACJ,YAAA,EAAc,SAAA,KAAc,UAAA,IAC5B,cAAc,SAAA,KAAc,MAAA;AAC9B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAA;AAAA,MACV,WAAA,EAAa,kBAAA;AAAA,MACb,UAAU,GAAA,CAAI;AAAA,KAChB;AAAA,EACF;AAAA,EAEQ,qBAAqB,KAAA,EAAmC;AAC9D,IAAA,MAAM,MAA2B,EAAC;AAClC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,uBAAA,EAAyB,WAAW,CAAA,EAAG;AACxE,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,uBAAuB,CAAA;AACzE,MAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC5B,MAAA,IAAI,CAAC,KAAA,CAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACtC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,GAAA,CAAI,KAAK,EAAE,QAAA,EAAU,QAAQ,SAAA,EAAW,YAAA,CAAa,WAAW,CAAA;AAAA,MAClE;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGQ,OAAA,CACN,OACA,aAAA,EAC+C;AAC/C,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACvC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,MAAM,YAAY,CAAA;AACtD,IAAA,IAAA,CAAK,SAAA,CAAU,MAAM,MAAA,CAAO,iBAAA;AAE5B,IAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,IAAA,IAAI,kBAAkB,MAAA,CAAO,iBAAA;AAC7B,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AAIjC,MAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACtB,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,eAAA,CAAgB,MAAM,MAAA,EAAQ,IAAI,EAAE,CAAC,CAAA;AAChE,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,GAAA,CAAI,WAAW,eAAA,EAAiB;AAClC,QAAA,eAAA,GAAkB,GAAA,CAAI,QAAA;AACtB,QAAA,SAAA,GAAY,KAAA,CAAM,QAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,OAAO,cAAc,IAAA,GACjB,IAAA,GACA,EAAE,QAAA,EAAU,SAAA,EAAW,UAAU,eAAA,EAAgB;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,iBAAA,CACN,KAAA,EACA,KAAA,EACA,QAAA,EACA,cACA,IAAA,EACsB;AACtB,IAAA,IAAI,YAAA,CAAa,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEnD,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,IAAA,MAAM,QAAQ,IAAI,GAAA;AAAA,MAChB,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CACpB,IAAI,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAC3C,MAAA,CAAO,CAAC,EAAA,KAAqB,OAAO,IAAI;AAAA,KAC7C;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACpC,IAAA,MAAM,iBAAiB,IAAUD,kBAAA,CAAA,OAAA;AAAA,MAC/B,UAAU,QAAA,CAAS,CAAA;AAAA,MACnB,UAAU,QAAA,CAAS,CAAA;AAAA,MACnB,UAAU,QAAA,CAAS;AAAA,KACrB;AACA,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,SAAA,CAAU,QAAQ,CAAA;AAC5D,IAAA,MAAM,QAAQ,IAAUA,kBAAA,CAAA,OAAA;AAAA,MACtB,UAAU,KAAA,CAAM,CAAA;AAAA,MAChB,UAAU,KAAA,CAAM,CAAA;AAAA,MAChB,UAAU,KAAA,CAAM;AAAA,KAClB;AAEA,IAAA,IAAI,IAAA,GAA6B,IAAA;AACjC,IAAA,IAAI,eAAe,MAAA,CAAO,iBAAA;AAE1B,IAAA,KAAA,MAAW,KAAA,IAAS,aAAa,YAAA,EAAc;AAC7C,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACzB,MAAA,IAAI,MAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAM,UAAA,EAAY;AAC7D,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,SAAS,IAAA,EAAM;AAEjD,MAAA,MAAM,SAAS,IAAUA,kBAAA,CAAA,OAAA;AAAA,QACvB,MAAM,QAAA,CAAS,CAAA;AAAA,QACf,MAAM,QAAA,CAAS,CAAA;AAAA,QACf,MAAM,QAAA,CAAS;AAAA,OACjB,CACG,SAAS,KAAK,CAAA,CACd,gBAAgB,gBAAgB,CAAA,CAChC,IAAI,cAAc,CAAA;AAErB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACvC,MAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,QAAA,YAAA,GAAe,QAAA;AACf,QAAA,IAAA,GAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,IAAA,CACN,KAAA,EACA,KAAA,EACA,QAAA,EACA,aACA,IAAA,EACM;AACN,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,uBAAuB,CAAA;AACzE,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,YAAA,EAAc;AAEjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAChD,IAAA,MAAM,MAAA,GACJ,WAAA,IAAe,YAAA,CAAa,gBAAA,KAAqB,QAAA;AAEnD,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,MAAM,WAAW,IAAUA,kBAAA,CAAA,OAAA;AAAA,QACzB,UAAU,QAAA,CAAS,CAAA;AAAA,QACnB,UAAU,QAAA,CAAS,CAAA;AAAA,QACnB,UAAU,QAAA,CAAS;AAAA,OACrB;AACA,MAAA,cAAA,GAAiB,QAAA,CAAS,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA;AACpD,MAAA,MAAA,GAAS,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAAA,IAC7B,WAAW,WAAA,EAAa;AAGtB,MAAA,MAAA,GAAS,IAAUA,kBAAA,CAAA,OAAA;AAAA,QACjB,aAAa,kBAAA,CAAmB,CAAA;AAAA,QAChC,aAAa,kBAAA,CAAmB,CAAA;AAAA,QAChC,aAAa,kBAAA,CAAmB;AAAA,OAClC;AAAA,IACF,CAAA,MAAO;AAQL,MAAA,MAAA,GAAS,IAAUA,kBAAA,CAAA,OAAA;AAAA,QACjB,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA;AAAA,QAC5B,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA;AAAA,QAC5B,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK;AAAA,QAC5B,eAAA,CAAgB,cAAA,CAAe,KAAA,EAAM,CAAE,QAAQ,CAAA;AAAA,IACnD;AAIA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,gBAAgB,CAAA;AAC7D,IAAA,IAAI,eAAA,GAAiC,IAAA;AACrC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,eAAA,GAAkB,OAAA,CAAQ,OAAO,SAAA,CAAU,IAAA;AAC3C,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,IAAA,GAAO,mBAAA;AAAA,IAClC;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,EAAqB;AACzC,IAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA;AAEjC,IAAA,MAAM,cAAc,IAAA,CAAK,iBAAA;AAAA,MACvB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAIA,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,SAAA,CAAU,QAAQ,CAAA;AAC5D,IAAA,MAAM,qBAAqB,cAAA,CACxB,KAAA,GACA,MAAA,EAAO,CACP,SAAS,gBAAgB,CAAA;AAE5B,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,KAAA,EAAO;AAAA,MACpB,QAAA;AAAA,MACA,IAAA;AAAA,MACA,aAAA,EAAe,aAAa,EAAA,IAAM,IAAA;AAAA,MAClC,WAAA,EAAa,cACT,IAAUA,kBAAA,CAAA,OAAA;AAAA,QACR,YAAY,QAAA,CAAS,CAAA;AAAA,QACrB,YAAY,QAAA,CAAS,CAAA;AAAA,QACrB,YAAY,QAAA,CAAS;AAAA,OACvB,GACA,IAAA;AAAA,MACJ,gBAAA,EAAkB,WAAA,GACd,gBAAA,CAAiB,WAAA,CAAY,QAAQ,CAAA,GACrC,IAAA;AAAA,MACJ,kBAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA,MACT,MAAA;AAAA,MACA,cAAA,EAAgB,IAAUA,kBAAA,CAAA,UAAA,EAAW,CAAE,YAAA;AAAA,QACrC,IAAUA,kBAAA,CAAA,KAAA;AAAA,UACR,aAAa,kBAAA,CAAmB,CAAA;AAAA,UAChC,aAAa,kBAAA,CAAmB,CAAA;AAAA,UAChC,aAAa,kBAAA,CAAmB;AAAA;AAClC,OACF;AAAA,MACA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA;AAAA,MACA,kBAAA,EAAoB,eAAe,KAAA,EAAM;AAAA,MACzC,eAAA,EAAiB,IAAUA,kBAAA,CAAA,OAAA;AAAQ,KACpC,CAAA;AAED,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,QAAA,EAAU,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAAA;AAAA,EAGQ,WAAA,CAAY,OAAc,SAAA,EAAyB;AACzD,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,MAAM,CAAA,IAAK,KAAK,KAAA,EAAO;AACxC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,QAAQ,CAAA;AAExB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAC9C,MAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,QAAA,EAAU,SAAS,SAAS,CAAA;AAAA,MAC7D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,WAAA,CACN,KAAA,EACA,QAAA,EACA,OAAA,EACA,SAAA,EACM;AACN,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,SAAS,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,WAAW,CAAA;AACnE,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,uBAAuB,CAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,IAAA;AAIzC,IAAA,IAAI,CAAC,WAAW,CAAC,SAAA,IAAa,CAAC,SAAA,IAAa,CAAC,YAAA,IAAgB,CAAC,KAAA,EAAO;AACnE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,SAAS,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,QAAQ,SAAS,CAAA;AAAA,MAC/D;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACnD,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAE3D,IAAA,MAAM,MAAA,GAAS,qBAAA;AAAA,MACb,EAAE,QAAA,EAAU,WAAA,EAAa,UAAA,EAAY,iBAAA,EAAkB;AAAA,MACvD;AAAA,QACE,QAAA,EAAU,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,KAAK,CAAA;AAAA,QAC3C,UAAA,EAAY,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,KAAK;AAAA,OACjD;AAAA,MACA,KAAA;AAAA,MACA;AAAA,QACE,cAAc,YAAA,CAAa,eAAA;AAAA,QAC3B,YAAY,YAAA,CAAa,iBAAA;AAAA,QACzB,UAAU,YAAA,CAAa,QAAA;AAAA,QACvB,UAAU,YAAA,CAAa;AAAA;AACzB,KACF;AAEA,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AACvC,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AACvC,IAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA;AACvC,IAAA,UAAA,CAAW,SAAA,CAAU,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AAEhD,IAAA,IAAI,aAAa,iBAAA,EAAmB;AAClC,MAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA;AACjC,MAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA;AACjC,MAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA;AAAA,IACnC;AAKA,IAAA,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAa,KAAK,OAAO,CAAA;AACvD,IAAA,OAAA,CAAQ,OAAO,eAAA,GAAkB,mBAAA;AAAA,MAC/B,QAAQ,MAAA,CAAO,kBAAA;AAAA,MACf,iBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,kBAAA,GAAqB,iBAAA,CAAkB,KAAA,EAAM;AAAA,EAC9D;AAAA,EAEQ,QAAA,CACN,KAAA,EACA,KAAA,EACA,IAAA,EACA,SAAA,EACM;AACN,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,UAAU,kBAAkB,CAAA;AACtE,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAMhD,IAAA,MAAM,gBAAA,GAAmB,KAAK,gBAAA,GAC1B,cAAA,CACG,OAAM,CACN,QAAA,CAAS,IAAA,CAAK,cAAc,CAAA,CAC5B,QAAA,CAAS,KAAK,gBAAA,CAAiB,KAAA,EAAM,CAAE,MAAA,EAAQ,CAAA,GAClD,eAAe,KAAA,EAAM,CAAE,QAAA,CAAS,IAAA,CAAK,kBAAkB,CAAA;AAE3D,IAAA,IAAI,KAAK,MAAA,EAAQ;AAEf,MAAA,MAAM,MAAA,GAAS,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAC9B,KAAK,KAAA,CAAM,YAAY,CAAA,CACvB,cAAA,CAAe,IAAA,CAAK,cAAc,CAAA,CAClC,GAAA,CAAI,MAAM,SAAS,CAAA;AACtB,MAAA,SAAA,CAAU,QAAA,CAAS,IAAI,MAAA,CAAO,CAAA;AAC9B,MAAA,SAAA,CAAU,QAAA,CAAS,IAAI,MAAA,CAAO,CAAA;AAC9B,MAAA,SAAA,CAAU,QAAA,CAAS,IAAI,MAAA,CAAO,CAAA;AAC9B,MAAA,UAAA,CAAW,SAAA,CAAU,UAAU,gBAAgB,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,KAAK,WAAA,EAAa;AAE3B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CACjB,KAAA,EAAM,CACN,QAAA;AAAA,QACC,IAAUA,kBAAA,CAAA,OAAA;AAAA,UACR,UAAU,KAAA,CAAM,CAAA;AAAA,UAChB,UAAU,KAAA,CAAM,CAAA;AAAA,UAChB,UAAU,KAAA,CAAM;AAAA;AAClB,OACF,CACC,gBAAgB,gBAAgB,CAAA;AACnC,MAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,CAAA;AACvC,MAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,CAAA;AACvC,MAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,CAAA;AACvC,MAAA,UAAA,CAAW,SAAA,CAAU,UAAU,gBAAgB,CAAA;AAAA,IACjD,CAAA,MAAO;AAGL,MAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM,CAAE,gBAAgB,cAAc,CAAA;AAClE,MAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,OAAA,CAAQ,CAAA;AACxC,MAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,OAAA,CAAQ,CAAA;AACxC,MAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,OAAA,CAAQ,CAAA;AACxC,MAAA,UAAA,CAAW,SAAA,CAAU,UAAU,gBAAgB,CAAA;AAAA,IACjD;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA;AAAA,MACX,IAAA,CAAK,SACD,IAAUA,kBAAA,CAAA,OAAA;AAAA,QACR,UAAU,QAAA,CAAS,CAAA;AAAA,QACnB,UAAU,QAAA,CAAS,CAAA;AAAA,QACnB,UAAU,QAAA,CAAS;AAAA,OACrB,GACA,IAAA;AAAA,MACJ,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,mBAAA;AAAA,MACrB,IAAA,CAAK,kBAAA;AAAA,MACL,cAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,kBAAA,GAAqB,cAAA;AAAA,EAC5B;AAAA,EAEQ,OAAA,CAAQ,OAAc,KAAA,EAA2B;AACvD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AACjC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAEvB,IAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAAA,MACzB,IAAA,CAAK,QAAA;AAAA,MACL;AAAA,KACF;AAOA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA;AAC9C,IAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,YAAA,EAAc;AACxC,MAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAI7B,QAAA,MAAM,OAAA,GAAU,UAAU,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,SAAS,CAAA;AACjE,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,OAAO,OAAA,GAAU,IAAA;AACzB,UAAA,IAAA,CAAK,SAAS,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,QAAQ,YAAY,CAAA;AAAA,QAClE;AACA,QAAA,IAAA,CAAK,QAAA;AAAA,UAAS,KAAA;AAAA,UAAO,IAAA,CAAK,QAAA;AAAA,UAAU,CAAC,CAAA,KACnC,CAAA,CAAE,kBAAA,CAAmB,KAAK;AAAA,SAC5B;AAAA,MACF,CAAA,MAAO;AAGL,QAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,QAAA,IAAA,CAAK,OAAO,IAAA,GAAO,SAAA;AACnB,QAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AAGtB,QAAA,IAAA,CAAK,MAAA,CAAO,kBAAkB,IAAA,CAAK,eAAA;AACnC,QAAA,IAAA,CAAK,SAAS,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,YAAY,CAAA;AAC1D,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MAC/D;AACA,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,UAAU,gBAAgB,CAAA;AAElE,IAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,IAAA,IAAQ,OAAA,EAAS;AAC5C,MAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,IAAA,GACvB,IAAA,CAAK,eAAA;AAKP,MAAA,MAAM,OAAA,GAAU,KAAK,eAAA,KAAoB,SAAA;AACzC,MAAA,IAAI,OAAA,IAAW,cAAc,sBAAA,EAAwB;AACnD,QAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CACnB,eAAA,CAAgB,KAAK,OAAO,CAAA,CAC5B,cAAA,CAAe,YAAA,CAAa,aAAa,CAAA;AAC5C,QAAA,MAAM,OAAO,IAAA,CAAK,eAAA;AAIlB,QAAA,iBAAA,CAAkB,SAAS,iBAAA,EAAmB;AAAA,UAC5C,MAAA,EAAQ,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAE;AAAA,UACtD,OAAA,EAAS,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,GAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA;AAAE,SAC5C,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC/D;AAAA,EAEQ,WAAW,KAAA,EAAoB;AACrC,IAAA,KAAA,MAAW,SAAS,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AACjD,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAa,KAAA,EAAoC;AACvD,IAAA,IAAI,KAAA,CAAM,YAAA,EAAc,OAAO,KAAA,CAAM,YAAA;AACrC,IAAA,OAAO,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CACtB,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,CACvB,cAAA,CAAe,qBAAqB,CAAA,CACpC,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,KAAA,EAAuC;AAC5D,IAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,OAAO,KAAA,CAAM,eAAe,KAAA,EAAM;AAC5D,IAAA,OAAO,IAAUA,+BAAW,CAAE,kBAAA;AAAA,MAC5B,IAAUA,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA;AAAA,MAC1B,KAAA,CAAM,YAAA,CAAa,KAAA,EAAM,CAAE,SAAA;AAAU,KACvC;AAAA,EACF;AAAA,EAEQ,QAAA,CACN,KAAA,EACA,QAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,eAAe,CAAA;AAC3D,IAAA,MAAM,YAAY,MAAA,EAAQ,eAAA;AAC1B,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,KAAA,MAAW,QAAA,IAAY,SAAA,CAAU,MAAA,EAAO,EAAG;AACzC,MAAA,IAAI,EAAE,oBAAoB,SAAA,CAAA,EAAY;AACtC,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,gDAAgD,KAAK,CAAA;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,kBAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YACE,UAAA,EAC+C;AAC/C,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,KAAK,MAAA,EAAQ;AACxC,MAAA,IAAI,KAAA,CAAM,UAAA,KAAe,UAAA,EAAY,OAAO,KAAA;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,mBAAA,GAAmC;AACjC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,CAAO,MAAA,IAAU,GAAA,CAAI,GAAA,CAAI,MAAM,QAAQ,CAAA;AAChE,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAA,GAAgC;AAC9B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,KAAA,CAAM,MAAA,IAAU,GAAA,CAAI,GAAA,CAAI,OAAO,QAAQ,CAAA;AACjE,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,YAAA,CAAa,OAAc,KAAA,EAA8B;AACvD,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,GAAG,OAAO,IAAA;AAElC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,IAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAAA,MACzB,KAAA,CAAM,QAAA;AAAA,MACN;AAAA,KACF;AACA,IAAA,OAAO,OAAA,CAAQ,YAAA,EAAc,OAAA,IAAW,YAAA,CAAa,SAAS,CAAA;AAAA,EAChE;AAAA;AAAA,EAGA,eAAe,UAAA,EAAiD;AAC9D,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACrC,MAAA,IAAI,KAAA,CAAM,UAAA,KAAe,UAAA,EAAY,OAAO,IAAA;AAAA,IAC9C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,QAAA,EAQH;AACP,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AACvC,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,SAAS,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,WAAW,CAAA;AAEnE,IAAA,OAAO;AAAA,MACL,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,iBAAA,EAAmB,OAAA,EAAS,KAAA,CAAM,UAAA,IAAc,IAAA;AAAA,MAChD,mBAAA,EAAqB,SAAA,EAAW,KAAA,CAAM,UAAA,IAAc,IAAA;AAAA,MACpD,gBACE,OAAA,IAAW,SAAA,GACP,KAAK,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA,CAAE,UAAA;AAAA,QAC/B,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,KAAK;AAAA,OACnC,GACA,IAAA;AAAA,MACN,gBAAgB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,aAAa;AAAA,KAC3D;AAAA,EACF;AACF,CAAA;AAp7BsD,MAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAA/C,IAAM,mBAAA,GAAN;ACxFA,IAAM,WAAA,GAAc,GAAA;AAEpB,IAAM,SAAA,GAAY,CAAA;AAElB,IAAM,SAAA,GAAY,EAAA;AAElB,IAAM,YAAA,GAAe,CAAA;AASrB,SAAS,kBACd,MAAA,EACA,SAAA,EACA,GAAA,GAAuB,IACvB,OAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,SAAA;AAChC,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,WAAA;AACpC,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,EAAS,SAAS,SAAS,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,YAAA;AAGpC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAA;AAEb,EAAA,MAAM,WAAW,SAAA,CAAU,KAAA,GAAQ,SAAA,EAAU,CAAE,eAAe,KAAK,CAAA;AACnE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,KAAK,CAAA,EAAG;AACjC,IAAA,MAAM,CAAA,GAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,CAAA,GAAM,OAAA;AAC9B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,IAAUE,kBAAA,CAAA,OAAA;AAAA,QACR,MAAA,CAAO,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI,CAAA;AAAA,QACxB,OAAO,CAAA,GAAI,QAAA,CAAS,IAAI,CAAA,GAAI,GAAA,GAAM,UAAU,CAAA,GAAI,CAAA;AAAA,QAChD,MAAA,CAAO,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI;AAAA;AAC1B,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AA1BgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;;;ACdT,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,MAAA,uBAAa,OAAA,EAAgB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9C,MAAA,CAAO,MAAA,EAAgB,MAAA,EAAiB,SAAA,EAA6B;AACnE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACrC,IAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAElC,IAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AAEvB,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,MAAM,CAAA;AAOzB,IAAA,OAAO,MAAA,IAAU,MAAA;AAAA,EACnB;AAAA;AAAA,EAGA,SAAS,MAAA,EAAyB;AAChC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,MAAA,EAAyB;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,EAClC;AACF,CAAA;AAxC6B,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAAtB,IAAM,eAAA,GAAN,gBAAA;;;ACaP,IAAM,EAAA,GAAK,IAAUC,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAEpC,IAAM,aAAA,GAAgB,GAAA;AAEf,IAAM,mBAAA,GAAN,MAAM,mBAAA,CAAwC;AAAA,EAmCnD,YAAY,WAAA,EAA4B;AAjCxC,IAAA,IAAA,CAAiB,SAAA,GAAY,IAAUA,kBAAA,CAAA,SAAA,EAAU;AAEjD;AAAA,IAAA,IAAA,CAAiB,WAAA,uBAAkB,OAAA,EAAgB;AAEnD;AAAA,IAAA,IAAA,CAAiB,YAA6B,EAAC;AAE/C;AAAA,IAAA,IAAA,CAAQ,WAA4B,EAAC;AACrC,IAAA,IAAA,CAAQ,YAAA,GAAqC,IAAA;AAE7C;AAAA,IAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AAEnB;AAAA,IAAA,IAAA,CAAiB,WAAA,uBAAkB,OAAA,EAAgB;AAEnD;AAAA,IAAA,IAAA,CAAQ,eAAA,GAAkB,KAAA;AAE1B;AAAA,IAAA,IAAA,CAAiB,WAAA,GAAc,IAAI,eAAA,EAAgB;AAEnD;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAS3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,iBAAA,GAAgD,IAAA;AAQtD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA;AAAA,EANA,qBAAqB,iBAAA,EAAqD;AACxE,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AAAA,EAC3B;AAAA,EAMA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAC5C,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAEhB,IAAA,IAAI,CAAC,KAAA,CAAM,cAAA,EAAe,EAAG;AAC3B,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,MAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAC/B,MAAA,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,cAAc,KAAA,CAAM,KAAA,CAAM,cAAA,EAAgB,kBAAkB,EAAE,CAAC,CAAA;AACrE,IAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AAErC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,cAAc,CAAA;AAC1D,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,kBAAkB,CAAA;AACvE,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,YAAA,EAAc;AAE3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,SAAA,EAAU;AAC1C,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,IAAA,IAAI,IAAI,QAAA,EAAU;AAChB,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,YAAA,EAAc,MAAM,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,GAAA,CAAI,eAAe,UAAA,EAAY;AACjC,MAAA,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,YAAA,EAAc,MAAM,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,KAAe,QAAA,EAAU;AACtC,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,GAAA,EAAK,YAAA,EAAc,QAAQ,SAAS,CAAA;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,sBAAsB,KAAA,EAAoB;AAChD,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA,CAAE,CAAC,MAAM,QAAA,EAAU;AACtD,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OAEF;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,uBAAuB,CAAA,CAAE,WAAW,CAAA,EAAG;AACrD,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OAEF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,qBAAqB,KAAA,EAAoB;AAC/C,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,cAAc,EAAE,CAAC,CAAA;AACjD,IAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AAErC,IAAA,MAAM,YAAA,GAAe,MAAM,SAAA,EAAU;AACrC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,eAAA,EAAiB,WAAW,CAAA,EAAG;AAChE,MAAA,IAAI,MAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,WAAW,YAAA,EAAc;AACtE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,QAAQ,CAAA;AACpD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,MAAA,CAAO,KAAA,KAAU,WAAA,EAAa,MAAA,CAAO,KAAA,GAAQ,WAAA;AAAA,MACnD,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,IAAI,QAAA,CAAS,WAAW,CAAC,CAAA;AAAA,MACxD;AACA,MAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAA,CACN,GAAA,EACA,SAAA,EACA,MAAA,EACM;AACN,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AAE7C,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,KAAA;AAEf,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,aAAA,EAAe;AAC/B,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAC9B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA,EAAG;AAElC,MAAA,IAAA,CAAK,WAAA,CAAY,IAAI,MAAM,CAAA;AAC3B,MAAA,SAAA,CAAU,QAAA,CAAS,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAUA,kBAAA,CAAA,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,eAAe,CAAA;AAAA,IACrF;AAAA,EACF;AAAA,EAEQ,eAAA,CACN,KAAA,EACA,GAAA,EACA,SAAA,EACA,QACA,SAAA,EACM;AACN,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AAC3B,MAAA,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,EAAM;AAI9C,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,MAAM,OAAA,GAAU,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AAClC,MAAA,MAAA,CAAO,kBAAkB,OAAO,CAAA;AAChC,MAAA,OAAA,CAAQ,CAAA,GAAI,CAAA;AACZ,MAAA,IAAI,OAAA,CAAQ,QAAA,EAAS,GAAI,IAAA,EAAM;AAC/B,MAAA,OAAA,CAAQ,SAAA,EAAU;AAElB,MAAA,MAAM,KAAA,GAAQ,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,aAAa,OAAA,EAAS,EAAE,EAAE,SAAA,EAAU;AACtE,MAAA,MAAM,OAAO,GAAA,CAAI,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA;AAElD,MAAA,SAAA,CAAU,QAAA,CAAS,MAAM,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,GAAI,KAAA,CAAM,IAAI,CAAA,IAAK,IAAA;AACzD,MAAA,SAAA,CAAU,QAAA,CAAS,MAAM,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,GAAI,KAAA,CAAM,IAAI,CAAA,IAAK,IAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,aAAA,CACN,KAAA,EACA,SAAA,EACA,MAAA,EACM;AACN,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,sBAAA,CAAuB,KAAK,CAAA;AAMjD,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAI1B,MAAA,MAAM,MAAA,GAAS,KAAA;AAKf,MAAA,IAAI,IAAA,CAAK,iBAAA,EAAmB,YAAA,CAAa,KAAA,EAAO,KAAK,CAAA,EAAG;AAGtD,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA,EAAG;AACnC,UAAA,IAAA,CAAK,WAAW,EAAC;AACjB,UAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,UAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,MAAM,CAAA;AAQ7C,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,eAAe,KAAA,CAAM,MAAA;AAS1D,MAAA,MAAM,WAAW,CAAC,KAAA,CAAM,aAAa,IAAA,CAAK,WAAA,CAAY,SAAS,MAAM,CAAA;AACrE,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,QAAA,IAAY,QAAA;AAKvD,MAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,QAAQ,SAAS,CAAA;AAEhE,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ;AAExB,MAAA,MAAM,MAAA,GAAS,iBAAA;AAAA,QACb,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM,YAAA;AAAA,QACN,IAAA,CAAK;AAAA,OACP;AACA,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAA;AAM3C,MAAA,IAAA,CAAK,QAAA,GAAW,GAAA,GACZ,MAAA,CAAO,KAAA,CAAM,GAAG,GAAA,CAAI,YAAA,GAAe,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GACtD,OAAO,KAAA,EAAM;AACjB,MAAA,IAAA,CAAK,YAAA,GAAe,GAAA,GAAM,GAAA,CAAI,KAAA,GAAQ,IAAA;AACtC,MAAA,IAAA,CAAK,WAAW,GAAA,KAAQ,IAAA;AAIxB,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAA;AACjC,QAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAA;AACjC,QAAA,SAAA,CAAU,QAAA,CAAS,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAA;AACjC,QAAA,IAAA,CAAK,WAAW,EAAC;AACjB,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,MAClB,WAAW,MAAA,EAAQ;AAIjB,QAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN;AAAA,WAEF;AAAA,QACF;AACA,QAAA,IAAA,CAAK,WAAW,EAAC;AACjB,QAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,YAAA,CACN,OACA,MAAA,EACwC;AACxC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AAAA,IAC1C;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA,CAAA;AACnC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AAE7C,IAAA,IAAI,CAAC,SAAA,IAAa,OAAA,GAAU,GAAA,EAAK;AAC/B,MAAA,IAAA,CAAK,WAAA,CAAY,IAAI,MAAM,CAAA;AAC3B,MAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AAAA,IACzC;AACA,IAAA,IAAI,SAAA,IAAa,UAAU,GAAA,EAAK;AAC9B,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAC9B,MAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK;AAAA,IACzC;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,KAAA,EAAM;AAAA,EAC9C;AAAA;AAAA,EAGQ,UAAA,CACN,QACA,OAAA,EACuD;AACvD,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,MAAA,MAAM,QAAQ,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,IAAI,IAAI,CAAA;AACrD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAO;AAC9B,MAAA,IAAI,WAAW,IAAA,EAAM;AAErB,MAAA,IAAA,CAAK,UAAU,GAAA,CAAI,IAAA,EAAM,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAC,CAAA;AACrD,MAAA,IAAA,CAAK,UAAU,GAAA,GAAM,QAAA;AACrB,MAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,iBAAiB,OAAA,EAAS,IAAI,EAAE,CAAC,CAAA;AAC5D,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,OAAO,EAAE,OAAO,GAAA,CAAI,KAAA,CAAM,OAAM,EAAG,YAAA,EAAc,IAAI,CAAA,EAAE;AAAA,MACzD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,uBAAuB,KAAA,EAAgC;AAC7D,IAAA,MAAM,UAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,uBAAA,EAAyB,WAAW,CAAA,EAAG;AACxE,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,uBAAuB,CAAA;AACjE,MAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AACpB,MAAA,IAAI,CAAC,KAAA,CAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACtC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,WAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,eAAA,GAAwC;AACtC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AACF,CAAA;AA9WqD,MAAA,CAAA,mBAAA,EAAA,oBAAA,CAAA;AAA9C,IAAM,kBAAA,GAAN;;;ACwEA,IAAM,kBAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,QAAA;AAAA,EACN,YAAA,EAAc,KAAA;AAAA,EACd,cAAA,EAAgB,KAAA;AAAA,EAChB,aAAA,EAAe,KAAA;AAAA,EACf,YAAA,EAAc,KAAA;AAAA,EACd,OAAA,EAAS,KAAA;AAAA,EACT,OAAA,EAAS,KAAA;AAAA,EACT,iBAAiB;AACnB,CAAA;AASO,SAAS,kBAAA,CACd,OAAA,EACA,IAAA,GAA+B,cAAA,EACf;AAChB,EAAA,IAAI,CAAC,SAAS,OAAO,kBAAA;AAErB,EAAA,MAAM,MAAO,OAAA,CACV,eAAA;AACH,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAG,IAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,EAAC;AACzD,EAAA,MAAM,sBAAM,MAAA,CAAA,CAAC,IAAA,KAAiB,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAxC,KAAA,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,YAAA,EAAc,IAAI,eAAe,CAAA;AAAA,IACjC,cAAA,EAAgB,IAAI,iBAAiB,CAAA;AAAA,IACrC,aAAA,EAAe,IAAI,gBAAgB,CAAA;AAAA,IACnC,YAAA,EAAc,IAAI,eAAe,CAAA;AAAA,IACjC,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,IACtB,OAAA,EAAS,IAAI,UAAU,CAAA;AAAA,IACvB,eAAA,EAAiB;AAAA,GACnB;AACF;AArBgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;;;ACjGT,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAqC;AAAA,EAOhD,YAAY,WAAA,EAA6B;AANzC,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,YAAA,GAA+B,kBAAA;AAGvC;AAAA,IAAA,IAAA,CAAQ,mBAAA,GAAsB,CAAA;AAG5B,IAAA,IAAA,CAAK,cAAc,WAAA,IAAe,IAAA;AAAA,EACpC;AAAA,EAEA,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AAExC,IAAA,IAAI,UAAA,KAAe,KAAK,UAAA,EAAY;AAClC,MAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,mBAAmB,KAAA,EAAoB;AAC7C,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,EAAY,CAAE,GAAG,UAAA,EAAW;AAGlD,IAAA,MAAM,IAAA,GACJ,OAAA,IAAY,OAAA,CACP,oBAAA,KAAyB,WAC1B,cAAA,GACA,cAAA;AACN,IAAA,IAAA,CAAK,YAAA,GAAe,kBAAA,CAAmB,OAAA,IAAW,IAAA,EAAM,IAAI,CAAA;AAE5D,IAAA,IAAI,OAAA,IAAW,KAAK,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,WAAA,CAAY,cAAc,OAAO,CAAA;AAAA,IACxC;AAEA,IAAA,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAO,OAAA,IAAW,IAAI,CAAA;AAE/C,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,CAAC,SAAA,KAAc;AAC1C,MAAA,SAAA,CAAU,gBAAA,CAAiB,KAAK,YAAY,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBQ,mBAAA,CAAoB,OAAc,OAAA,EAAiC;AACzE,IAAA,MAAM,cAAc,KAAA,CAAM,KAAA,CAAM,cAAA,EAAgB,kBAAkB,EAAE,CAAC,CAAA;AACrE,IAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AAErC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,cAAc,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,kBAAkB,CAAA;AACpE,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,SAAA,EAAW;AAExB,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,MAAM,UAAA,GAAa,IAAI,cAAA,KAAmB,OAAA;AAE1C,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,EAAA,CAAG,qBAAA,CAAsB,UAAA,GAAa,aAAA,GAAgB,OAAO,CAAA;AAAA,IACxE,CAAA,CAAA,MAAQ;AAAA,IAER;AAIA,IAAA,MAAM,UAAW,OAAA,EACb,eAAA;AACJ,IAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GACtC,OAAA,CAAQ,SAAS,aAAa,CAAA;AAAA;AAAA;AAAA,MAG9B;AAAA,KAAA;AAEJ,IAAA,IAAA,CAAK,mBAAA,GACH,UAAA,IAAc,CAAC,YAAA,GAAe,IAAI,iBAAA,GAAoB,CAAA;AAExD,IAAA,IAAI,IAAA,CAAK,wBAAwB,CAAA,EAAG;AAClC,MAAA,SAAA,CAAU,QAAA,CAAS,KAAK,IAAA,CAAK,mBAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAAA,EAAoB;AAG3C,IAAA,IAAI,IAAA,CAAK,wBAAwB,CAAA,EAAG;AAClC,MAAA,MAAM,cAAc,KAAA,CAAM,KAAA,CAAM,cAAA,EAAgB,kBAAkB,EAAE,CAAC,CAAA;AACrE,MAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACnC,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,kBAAkB,CAAA;AACpE,QAAA,IAAI,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,CAAA,IAAK,IAAA,CAAK,mBAAA;AAAA,MAC9C;AACA,MAAA,IAAA,CAAK,mBAAA,GAAsB,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,kBAAA;AACpB,IAAA,IAAA,CAAK,aAAa,aAAA,EAAc;AAChC,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,CAAC,SAAA,KAAc;AAC1C,MAAA,SAAA,CAAU,cAAA,EAAe;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,mBAAmB,KAAA,EAAoB;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa,SAAA,EAAU;AAC3C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAEpC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAO,CAAC,MAAM,CAAA,CAAE,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,MAAM,SAAA,EAAW;AACnB,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAO,CAAC,MAAM,CAAA,CAAE,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,OACA,KAAA,EACM;AACN,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA,EAAG;AACnD,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,eAAe,CAAA;AAC3D,MAAA,MAAM,YAAY,MAAA,EAAQ,eAAA;AAC1B,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,KAAA,MAAW,QAAA,IAAY,SAAA,CAAU,MAAA,EAAO,EAAG;AACzC,QAAA,IAAI,EAAE,oBAAoB,SAAA,CAAA,EAAY;AACtC,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,QAChB,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA,EAGA,YAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA,EAGA,SAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAA,EAAa,SAAA,EAAU,IAAK,EAAC;AAAA,EAC3C;AACF,CAAA;AA/KkD,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAA3C,IAAM,eAAA,GAAN;ACRP,SAASC,eACP,IAAA,EACsB;AACtB,EAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AAG3B,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAC7C,IAAA,OAAO,IAAUC,kBAAA,CAAA,cAAA,CAAe,MAAA,EAAQ,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,IAAUA,kBAAA,CAAA,aAAA;AAAA,IACf,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA;AAAA,IACzB,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,KAAK;AAAA,GAC3B;AACF;AAbS,MAAA,CAAAD,cAAAA,EAAA,eAAA,CAAA;AAeT,SAAS,YAAY,IAAA,EAAuC;AAC1D,EAAA,OAAO,CAAA,EAAG,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA;AAClD;AAFS,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAIF,IAAM,qBAAA,GAAN,MAAM,qBAAA,CAA0C;AAAA,EAAhD,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAAoB;AAAA,EAAA;AAAA,EAEtD,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,uBAAA,EAAyB,WAAW,CAAA;AAGlE,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,SAAS,CAAA;AAC/B,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,EAAG;AAC5C,MAAA,IAAI,CAAC,MAAM,GAAA,CAAI,OAAO,GAAG,IAAA,CAAK,UAAA,CAAW,OAAO,OAAO,CAAA;AAAA,IACzD;AAEA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,uBAAuB,CAAA;AACjE,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,MAAA,IAAI,CAAC,IAAA,IAAQ,EAAE,MAAA,YAAwBC,kBAAA,CAAA,IAAA,CAAA,EAAO;AAE9C,MAAA,MAAM,SAAA,GAAY,YAAY,IAAI,CAAA;AAClC,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,MAAM,SAAA,EAAW;AACjD,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,EAAU,SAAS,CAAA;AAIvC,MAAA,MAAA,CAAO,UAAU,OAAA,IAAU;AAC3B,MAAA,MAAA,CAAO,QAAA,GAAWD,eAAc,IAAI,CAAA;AAAA,IACtC;AAAA,EACF;AACF,CAAA;AA3BuD,MAAA,CAAA,qBAAA,EAAA,sBAAA,CAAA;AAAhD,IAAM,oBAAA,GAAN;ACZA,SAAS,kBAAA,CACd,QACA,OAAA,EACgB;AAChB,EAAA,MAAM,KAAA,GAAQ,IAAUE,kBAAA,CAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAE3C,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,OAAA;AAGH,MAAA,OAAO,IAAUA,kBAAA,CAAA,iBAAA,CAAkB;AAAA,QACjC,KAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,EAAM,OAAA,CAAQ,OAAA,GAAU,IAAI,CAAC,CAAA;AAAA,QAC3D,UAAA,EAAY,KAAA;AAAA,QACZ,IAAA,EAAYA,kBAAA,CAAA;AAAA,OACb,CAAA;AAAA,IAEH,KAAK,MAAA;AAEH,MAAA,OAAO,IAAUA,kBAAA,CAAA,oBAAA,CAAqB;AAAA,QACpC,KAAA;AAAA,QACA,QAAA,EAAU,KAAA;AAAA,QACV,mBAAmB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAA,CAAQ,qBAAqB,CAAC,CAAA;AAAA,QAC/D,SAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAW,CAAA;AAAA,QACX,WAAA,EAAa,QAAQ,OAAA,GAAU,CAAA;AAAA,QAC/B,SAAS,OAAA,CAAQ;AAAA,OAClB,CAAA;AAAA,IAEH,KAAK,UAAA;AAGH,MAAA,OAAO,IAAUA,kBAAA,CAAA,iBAAA,CAAkB;AAAA,QACjC,KAAA;AAAA,QACA,SAAA,EAAW,IAAA;AAAA,QACX,WAAA,EAAa,IAAA;AAAA,QACb,SAAS,OAAA,CAAQ;AAAA,OAClB,CAAA;AAAA,IAEH,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,IAAUA,kBAAA,CAAA,oBAAA,CAAqB;AAAA,QACpC,KAAA;AAAA,QACA,SAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAW,CAAA;AAAA,QACX,QAAA,EAAU,KAAA;AAAA,QACV,iBAAA,EAAmB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,iBAAiB,CAAA;AAAA,QACxD,WAAA,EAAa,QAAQ,OAAA,GAAU,CAAA;AAAA,QAC/B,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,IAAA,EAAYA,kBAAA,CAAA;AAAA,OACb,CAAA;AAAA,IAEH,SAAS;AAKP,MAAA,OAAO,IAAUA,kBAAA,CAAA,oBAAA,CAAqB,EAAE,KAAA,EAAO,CAAA;AAAA,IACjD;AAAA;AAEJ;AA7DgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAgET,SAAS,iBAAA,CACd,MACA,QAAA,EACM;AACN,EAAA,IAAA,CAAK,QAAA,CAAS,CAAC,KAAA,KAAU;AACvB,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAGlB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB,CAAC,CAAA;AACH;AAXgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;;;AC1DhB,IAAM,UAAA,GAAa,CAAA;AAGnB,IAAM,UAAA,GAAa,IAAA;AAEnB,IAAM,KAAA,GAA0D;AAAA,EAC9D,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,EACzB,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,OAAA;AACpB,CAAA;AAaO,IAAM,yBAAA,GAAN,MAAM,yBAAA,CAA8C;AAAA,EAezD,YAAY,OAAA,EAGT;AAjBH,IAAA,IAAA,CAAiB,sBAAA,GAAyB,IAAIC,oDAAA,EAAyB;AACvE,IAAA,IAAA,CAAiB,gBAAA,GAAmB,IAAIC,wCAAA,EAAmB;AAC3D,IAAA,IAAA,CAAiB,KAAA,GAAQ,IAAUC,kBAAA,CAAA,KAAA,EAAM;AAEzC;AAAA,IAAA,IAAA,CAAiB,eAAA,GAAkB,IAAUA,kBAAA,CAAA,KAAA,EAAM;AACnD,IAAA,IAAA,CAAiB,KAAA,uBAAY,GAAA,EAAyB;AAItD,IAAA,IAAA,CAAQ,UAAA,GAAoC,IAAA;AAE5C;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAAqB,EAAA;AAC7B,IAAA,IAAA,CAAQ,YAAA,GAAsC,IAAA;AAM5C,IAAA,IAAA,CAAK,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,IAAA;AACvD,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,IAAA;AAC3C,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,qBAAA;AAElB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,gBAAA,GAAmB,IAAA;AAAA,EACzC;AAAA,EAEA,OAAO,KAAA,EAAoB;AACzB,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAA,EAAS;AAE3B,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAEtB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAG/C,IAAA,MAAM,IAAA,GAAO,YAAY,cAAA,IAAkB,MAAA;AAC3C,IAAA,MAAM,eAAA,GAAkB,IAAA,KAAS,aAAA,IAAiB,IAAA,KAAS,MAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,MAAA;AAE/C,IAAA,IAAA,CAAK,iBAAiB,UAAU,CAAA;AAEhC,IAAA,KAAA,MAAW,EAAE,KAAA,EAAO,IAAA,EAAK,IAAK,KAAA,EAAO;AACnC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,OAAA,EAAS;AASd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACtC,MAAA,MAAM,aAAA,GAAgB,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,YAAA;AACxD,MAAA,MAAM,OAAA,GAAU,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA;AAElD,MAAA,OAAA,CAAQ,eAAA,CAAgB,UAAU,eAAA,IAAmB,aAAA;AACrD,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAU,SAAA,IAAa,OAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,YAAY,IAAI,CAAA;AACzD,MAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AACpC,MAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAA;AAE1C,MAAA,IAAI,SAAA,IAAa,KAAK,YAAA,EAAc;AAClC,QAAA,iBAAA,CAAkB,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA;AAAA,MACxD;AAEA,MAAA,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAY,IAAA,EAAuC;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,SAAA,EAAU;AAC1C,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,MAAM,UAAA,KAAe,IAAA,IAAQ,KAAA,CAAM,SAAA,SAAkB,KAAA,CAAM,IAAA;AAAA,IACjE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGQ,kBAAkB,KAAA,EAA4C;AACpE,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,qBAAqB,EAAE,CAAC,CAAA;AACrD,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,IAAA;AACzC,IAAA,OAAO,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,qBAAqB,CAAA,IAAK,IAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,iBAAA,CACN,KAAA,EACA,OAAA,EACA,IAAA,EACM;AACN,IAAA,IAAI,OAAA,GAAiC,IAAA;AACrC,IAAA,KAAA,MAAW,YAAY,KAAA,CAAM,KAAA;AAAA,MAC3B,yBAAA;AAAA,MACA;AAAA,KACF,EAAG;AACD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,yBAAyB,CAAA;AACnE,MAAA,IAAI,IAAA,EAAM,SAAS,IAAA,EAAM;AACzB,MAAA,OAAA,GAAU,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,GAAG,MAAA,IAAU,IAAA;AAC/D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,cAAA,GAAiB,IAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,OAAA,CAAQ,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,IAC1B;AACA,IAAA,OAAA,CAAQ,cAAA,GAAiB,OAAA;AAAA,EAC3B;AAAA;AAAA,EAGQ,iBAAiB,UAAA,EAAgD;AACvE,IAAA,MAAM,MAAA,GAAS,YAAY,UAAA,IAAc,SAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,YAAY,SAAA,IAAa,SAAA;AACvC,IAAA,MAAM,OAAA,GAAU,YAAY,WAAA,IAAe,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,YAAY,qBAAA,IAAyB,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,GAAG,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,OAAO,IAAI,QAAQ,CAAA,CAAA;AAC3D,IAAA,IAAI,SAAA,KAAc,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,YAAA,EAAc;AAEhE,IAAA,IAAA,CAAK,kBAAA,GAAqB,SAAA;AAC1B,IAAA,IAAA,CAAK,cAAc,OAAA,EAAQ;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,mBAAmB,MAAA,EAAQ;AAAA,MAC7C,KAAA;AAAA,MACA,OAAA;AAAA,MACA,iBAAA,EAAmB;AAAA,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAA,CACN,YACA,IAAA,EACS;AACT,IAAA,MAAM,UAAA,GAAa,YAAY,aAAA,IAAiB,aAAA;AAChD,IAAA,IAAI,UAAA,KAAe,SAAS,OAAO,KAAA;AACnC,IAAA,IAAI,UAAA,KAAe,UAAU,OAAO,IAAA;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,EAAmB,OAAO,IAAA;AASpC,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,cAAA,CAAe,IAAI,GAAG,OAAO,KAAA;AACxD,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,WAAA,CAAY,IAAI,CAAA,KAAM,IAAA;AAAA,EACtD;AAAA;AAAA,EAGQ,aAAA,CACN,KACA,UAAA,EACM;AACN,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,IAAI,QAAA,EAAU,KAAA,IAAS,CAAC,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAC,CAAA,EAAG;AAC5F,MAAA,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAe,CAAA;AAAA,IAC1C;AAIA,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAQ,UAAA,CAAW,YAAA,GAAe,CAAC,CAAA,GAAI,UAAA;AAC/D,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,CAAA,KAAM,MAAA,EAAQ;AAC1B,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA;AACd,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,aAAA,CAAc,KAAiB,IAAA,EAA8B;AACnE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,EAAmB,WAAA,CAAY,IAAI,CAAA,IAAK,IAAA;AAG3D,IAAA,MAAM,MAAA,GACJ,KAAA,IAAS,MAAA,CAAO,QAAA,CAAS,MAAM,QAAQ,CAAA,IAAK,KAAA,CAAM,QAAA,GAAW,IACzD,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,UAAU,CAAA,GACnC,UAAA;AAEN,IAAA,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA;AAAA,EAChB;AAAA;AAAA,EAGQ,YAAY,KAAA,EAAoB;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,KAAA,EAAO;AAC7B,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAG;AAE3B,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,EAAA,CAAG,aAAA,CAAc,KAAK,CAAA;AAClD,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,EAAA,CAAG,iBAAA,CAAkB,KAAK,CAAA;AAChD,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,EAAA,CAAG,OAAA,CAAQ,KAAK,CAAA;AACtC,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAEnC,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,EAAU;AAC3B,MAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAElB,MAAA,MAAM,eAAA,GACJ,IAAA,CAAK,sBAAA,CAAuB,qBAAA,CAAsB,IAAI,CAAA;AACxD,MAAA,IAAA,CAAK,IAAI,eAAe,CAAA;AAExB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,eAAA,CAAgB,MAAM,MAAM,CAAA;AACpE,MAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAElB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAA,EAAY,IAAA,EAAM,IAAI,CAAA;AACrC,MAAA,IAAA,CAAK,KAAA,CAAM,IAAI,KAAA,EAAO;AAAA,QACpB,UAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,GAAA;AAAA,QACA,eAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,KAAA,EAAoB;AACzC,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,KAAA,CAAM,QAAA,EAAS;AAC/C,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ;AAChC,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,SAAA,GAAwB;AAE9B,IAAA,MAAM,WAAW,IAAUA,kBAAA,CAAA,gBAAA,CAAiB,YAAY,UAAA,EAAY,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3E,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC7B,IAAA,QAAA,CAAS,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AAE7B,IAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,iBAAA,CAAkB;AAAA,MAC3C,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,EAAa,IAAA;AAAA,MACb,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAW,KAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,IAAUA,kBAAA,CAAA,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,GAAA;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,IAAA,IAAA,CAAK,UAAU,MAAM;AAAA,IAAC,CAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,MAAM,gBAAA,EAAiB;AAC5B,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,KAAA,KAAU;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,IAAA,CAAK,UAAU,OAAA,IAAU;AACzB,MAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,KAAA,MAAW,KAAA,IAAS,QAAA,EAAU,KAAA,CAAM,OAAA,IAAU;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,QAAA,EAAU,OAAA,IAAU;AAAA,MACtB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,cAAc,OAAA,EAAQ;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,kBAAA,GAAqB,EAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,EACpB;AACF,CAAA;AAnT2D,MAAA,CAAA,yBAAA,EAAA,0BAAA,CAAA;AAApD,IAAM,wBAAA,GAAN;AC9BP,IAAM,aAAA,GAAgB,IAAA;AACtB,IAAM,MAAA,GAAS,IAAUC,kBAAA,CAAA,KAAA,CAAM,SAAS,CAAA;AAExC,IAAM,YAAA,GAAe,IAAUA,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAS9C,IAAM,cAAA,GAAiB,IAAA;AAEhB,IAAM,uBAAA,GAAN,MAAM,uBAAA,CAA4C;AAAA,EAsBvD,YAAY,gBAAA,EAAsC;AApBlD,IAAA,IAAA,CAAiB,KAAA,GAAQ,IAAUA,kBAAA,CAAA,KAAA,EAAM;AAEzC;AAAA,IAAA,IAAA,CAAiB,GAAA,GAAM,IAAUA,kBAAA,CAAA,KAAA,EAAM;AASvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAiB,kBAAkB,IAAUA,kBAAA,CAAA,gBAAA,CAAiB,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3E,IAAA,IAAA,CAAiB,WAAyB,EAAC;AAC3C,IAAA,IAAA,CAAiB,MAAA,GAAS,IAAUA,kBAAA,CAAA,KAAA,EAAM;AAC1C,IAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AACnB,IAAA,IAAA,CAAiB,gBAAA,GAAmB,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACtD,IAAA,IAAA,CAAiB,WAAA,GAAc,IAAUA,kBAAA,CAAA,OAAA,EAAQ;AACjD,IAAA,IAAA,CAAiB,UAAA,GAAa,IAAUA,kBAAA,CAAA,KAAA,EAAM;AAC9C,IAAA,IAAA,CAAiB,YAAA,GAAe,IAAUA,kBAAA,CAAA,KAAA,EAAM;AAG9C,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AACxB,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,mBAAA;AAElB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,gBAAA,GAAmB,IAAA;AAEvC,IAAA,IAAA,CAAK,IAAI,IAAA,GAAO,eAAA;AAChB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAEvB,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,IAAA,CAAK,YAAW,EAAG,IAAA,CAAK,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,OAAO,WAAA,GAAc,GAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAE1B,IAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,OAAO,KAAA,EAAoB;AACzB,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,KAAA,CAAM,QAAA,EAAS,CAAE,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAC/B,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAY;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,eAAA,EAAgB;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAW;AAE/C,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,MAAA;AAAA,IACF;AAOA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,GAAG,CAAA;AAC1C,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACjC,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,MACrB,GAAA;AAAA,MACA,IAAA,CAAK,GAAA,CAAI,IAAA,EAAO,GAAA,EAAK,wBAAwB,KAAK;AAAA,KACpD;AACA,IAAA,MAAM,IAAA,GAAO,KAAA,GACT,IAAA,CAAK,UAAA,CAAW,IAAI,GAAA,EAAK,gBAAA,IAAoB,SAAS,CAAA,GACtD,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,2BAA2B,SAAS,CAAA;AAKnE,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA;AAE7C,IAAA,IAAI,SAAS,OAAA,EAAS;AAEpB,MAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AACpB,MAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAEjC,MAAA,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,IAAK,IAAA;AAC1B,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,KAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EACtB;AAAA,EAEQ,iBAAA,CACN,KAAA,EACA,IAAA,EACA,SAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAE1B,IAAA,MAAM,SAAS,SAAA,GAAY,CAAA;AAE3B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,QAAA,CAAS,MAAA,EAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC/B,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AACtB,MAAA,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,EAAA,EAAI,IAAI,CAAA;AACzC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAO;AAC5C,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,MAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,IAAI,EAAE,eAAA,CAAgB,IAAA,CAAK,kBAAkB,GAAG,CAAA;AACtE,MAAA,OAAA,CAAQ,UAAA,CAAW,kBAAA;AAAA,QACjB,YAAA;AAAA,QACA,IAAA,CAAK,gBAAA,CAAiB,YAAA,CAAa,MAAM;AAAA,OAC3C;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAIxC,MAAA,MAAM,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA,IAAK,SAAS,CAAA,CAAA,GAAK,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,IAAA;AACrB,MAAC,QAAQ,QAAA,CAAqC,KAAA,CAC3C,KAAK,IAAI,CAAA,CACT,eAAe,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGQ,eAAe,KAAA,EAAqB;AAC1C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,KAAA,EAAO;AAGnC,MAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,iBAAA,CAAkB;AAAA,QAC3C,WAAA,EAAa,IAAA;AAAA,QACb,SAAA,EAAW,KAAA;AAAA,QACX,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,IAAUA,kBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAC1D,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,GAAA;AACnB,MAAA,IAAA,CAAK,UAAU,MAAM;AAAA,MAAC,CAAA;AACtB,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AACvB,MAAA,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGQ,YAAA,CACN,OACA,KAAA,EACiB;AACjB,IAAA,KAAA,CAAM,SAAA,EAAU,CAAE,gBAAA,CAAiB,IAAA,CAAK,WAAW,CAAA;AAEnD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,OACE,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,IACvB,KAAA,CAAM,KAAK,CAAA,CAAE,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA,GAAI,cAAA,EAC5C;AACA,MAAA,KAAA,IAAS,CAAA;AAAA,IACX;AAEA,IAAA,OAAO,KAAA,KAAU,CAAA,GAAI,KAAA,GAAQ,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,EAChD;AAAA,EAEQ,WAAW,KAAA,EAAqC;AACtD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,cAAc,EAAE,CAAC,CAAA;AAC9C,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,IAAA;AACzC,IAAA,OAAO,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,cAAc,CAAA,IAAK,IAAA;AAAA,EACzD;AAAA,EAEQ,UAAA,GAAyB;AAC/B,IAAA,MAAM,WAAW,IAAUA,kBAAA,CAAA,YAAA;AAAA,MACzB,aAAA,GAAgB,IAAA;AAAA,MAChB,aAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC7B,IAAA,OAAO,IAAUA,kBAAA,CAAA,IAAA;AAAA,MACf,QAAA;AAAA,MACA,IAAUA,kBAAA,CAAA,iBAAA,CAAkB;AAAA,QAC1B,KAAA,EAAO,MAAA;AAAA,QACP,WAAA,EAAa,IAAA;AAAA,QACb,OAAA,EAAS,GAAA;AAAA,QACT,IAAA,EAAYA,kBAAA,CAAA,UAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACZ;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,SAAA,GAAwB;AAC9B,IAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,cAAA,CAAe,aAAA,GAAgB,MAAM,EAAE,CAAA;AAClE,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC7B,IAAA,OAAO,IAAUA,kBAAA,CAAA,IAAA;AAAA,MACf,QAAA;AAAA,MACA,IAAUA,kBAAA,CAAA,iBAAA,CAAkB;AAAA,QAC1B,KAAA,EAAO,MAAA;AAAA,QACP,WAAA,EAAa,IAAA;AAAA,QACb,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAYA,kBAAA,CAAA,UAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACZ;AAAA,KACH;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,KAAA,EAA0B;AAC3C,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAC,KAAA,KAAU;AAC9B,MAAA,MAAM,WAAY,KAAA,CAA8B,QAAA;AAChD,MAAA,IAAI,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACxC,QAAC,QAAA,CAAqC,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA;AAAA,MACzD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAW,OAAA,EAAwB;AACzC,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,OAAA;AAAA,EACvB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,MAAM,gBAAA,EAAiB;AAC5B,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,KAAA,KAAU;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,IAAA,CAAK,UAAU,OAAA,IAAU;AACzB,MAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,KAAA,MAAW,KAAA,IAAS,QAAA,EAAU,KAAA,CAAM,OAAA,IAAU;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,QAAA,EAAU,OAAA,IAAU;AAAA,MACtB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AACF,CAAA;AAjPyD,MAAA,CAAA,uBAAA,EAAA,wBAAA,CAAA;AAAlD,IAAM,sBAAA,GAAN;ACiBA,IAAM,UAAA,GAAkC;AAAA,EAC7C,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAGO,IAAM,aAAA,GAAuD;AAAA,EAClE,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAiBA,IAAM,aAAA,GAA8D;AAAA,EAClE,KAAA,EAAO;AAAA,IACL,kBAAA;AAAA,IACA,wBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,yBAAA;AAAA,IACA,+BAAA;AAAA,IACA,mCAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,0BAAA;AAAA,IACA,gCAAA;AAAA,IACA,oCAAA;AAAA,IACA,8BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,wBAAA;AAAA,IACA,8BAAA;AAAA,IACA,kCAAA;AAAA,IACA,4BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,yBAAA;AAAA,IACA,+BAAA;AAAA,IACA,mCAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA;AAEJ,CAAA;AAEA,IAAM,UAAA,GAAgD;AAAA,EACpD,KAAA,EAAO,WAAA;AAAA,EACP,KAAA,EAAO,kBAAA;AAAA,EACP,MAAA,EAAQ,mBAAA;AAAA,EACR,IAAA,EAAM,iBAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,iBAAA,GAAuD;AAAA,EAC3D,KAAA,EAAO,kBAAA;AAAA,EACP,KAAA,EAAO,yBAAA;AAAA,EACP,MAAA,EAAQ,0BAAA;AAAA,EACR,IAAA,EAAM,wBAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAGO,IAAM,mBAAA,GAAsB,IAAA;AAS5B,IAAM,YAAA,GAAe,IAAA;AACrB,IAAM,UAAA,GAAa,IAAA;AAE1B,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,IAAI,CAAA,GAAI,KAAA;AACzC;AAFS,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAKT,SAAS,cAAA,CACP,QACA,MAAA,EACwB;AACxB,EAAA,MAAM,KAAA,GAAQ,cAAc,MAAM,CAAA;AAClC,EAAA,MAAM,aAA8B,EAAC;AAErC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC,CAAA;AAChC,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,EAAA,EAAI,OAAO,IAAA;AAEzB,IAAA,MAAM,YAAY,IAAUC,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,IAAI,IAAI,CAAA;AAGzD,IAAA,IAAI,SAAA,CAAU,QAAA,EAAS,GAAI,KAAA,EAAO,OAAO,IAAA;AACzC,IAAA,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,UAAA,CAAW,MAAA,IAAU,CAAA,GAAI,UAAA,GAAa,IAAA;AAC/C;AApBS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAuBT,SAAS,YAAY,UAAA,EAAuC;AAC1D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC7C,IAAA,MAAM,GAAA,GAAM,WAAW,CAAA,GAAI,CAAC,EAAE,GAAA,CAAI,UAAA,CAAW,CAAC,CAAC,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,OAAA,CAAA,CAAS,GAAA,GAAM,UAAA,KAAe,eAAe,UAAA,CAAW,CAAA;AAC7E,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,YAAY,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,KAAA;AACT;AARS,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAUT,SAAS,QAAQ,MAAA,EAA0B;AACzC,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAChC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,GAAA,IAAO,KAAA;AACnC,EAAA,OAAO,MAAM,MAAA,CAAO,MAAA;AACtB;AALS,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAuBF,SAAS,iBAAA,CACd,QACA,MAAA,EACqB;AACrB,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AAChD,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,EAAA,MAAM,KAAA,GAAQ,YAAY,UAAU,CAAA;AACpC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,IACjB,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,IAC1D,IAAA,EAAM,QAAQ,KAAK;AAAA,GACrB;AACF;AAfgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAkBT,SAAS,iBAAiB,MAAA,EAAqC;AACpE,EAAA,MAAM,KAAA,GAAQ,OAAO,yBAAyB,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,OAAO,yBAAyB,CAAA;AAC9C,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO,OAAO,IAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA,GAAQ,OAAO,KAAA,GAAQ,IAAA;AAChC;AANgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAcT,SAAS,kBAAkB,MAAA,EAA8B;AAC9D,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,MAAM,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AACrC,EAAA,IAAI,KAAA,KAAU,IAAA,EAAM,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAE3C,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,MAAM,SAAA,GAAY,OAAO,mBAAmB,CAAA;AAC5C,EAAA,IAAI,SAAS,SAAA,EAAW;AAGtB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA;AACvC,IAAA,IAAI,IAAA,GAAO,IAAA,EAAM,YAAA,CAAa,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,mBAAA;AACtC,EAAA,OAAO,QAAQ,YAAY,CAAA;AAC7B;AAjBgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAyBT,SAAS,YAAA,CACd,QACA,MAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,SAAA,EAAW,OAAO,IAAA;AAEpC,EAAA,MAAM,KAAA,GAAQ,kBAAkB,MAAM,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA;AAC9C,EAAA,OAAO,OAAA,CAAQ,CAAA,GAAI,QAAA,IAAY,KAAA,GAAQ,GAAA,CAAI,CAAA;AAC7C;AAXgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAmBT,SAAS,aAAA,CACd,MAAA,EACA,CAAA,EACA,CAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,iBAAA,CAAkB,CAAC,CAAC,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,CAAC,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,iBAAA,CAAkB,CAAC,CAAC,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,CAAC,CAAC,CAAA;AACjC,EAAA,IAAI,CAAC,SAAS,CAAC,IAAA,IAAQ,CAAC,KAAA,IAAS,CAAC,MAAM,OAAO,IAAA;AAE/C,EAAA,MAAM,OAAO,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,KAAK,CAAA;AACvD,EAAA,MAAM,OAAO,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,KAAK,CAAA;AACvD,EAAA,IAAI,IAAA,CAAK,UAAS,GAAI,KAAA,IAAS,KAAK,QAAA,EAAS,GAAI,OAAO,OAAO,IAAA;AAE/D,EAAA,OAAO,OAAA,CAAA,CAAS,CAAA,GAAI,IAAA,CAAK,SAAA,EAAU,CAAE,IAAI,IAAA,CAAK,SAAA,EAAW,CAAA,IAAK,IAAI,CAAA;AACpE;AAhBgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAqCT,SAAS,eAAA,CACd,QACA,UAAA,EACmB;AACnB,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,MAAM,SAAA,GAAY,OAAO,yBAAyB,CAAA;AAClD,EAAA,MAAM,SAAA,GAAY,OAAO,yBAAyB,CAAA;AAClD,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,SAAA,IAAa,CAAC,WAAW,OAAO,IAAA;AAE/C,EAAA,MAAM,IAAI,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,WAAW,KAAK,CAAA;AACzD,EAAA,MAAM,IAAI,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,WAAW,KAAK,CAAA;AACzD,EAAA,MAAM,SAAS,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,YAAA,CAAa,GAAG,CAAC,CAAA;AACpD,EAAA,IAAI,MAAA,CAAO,QAAA,EAAS,GAAI,KAAA,EAAO,OAAO,IAAA;AACtC,EAAA,MAAA,CAAO,SAAA,EAAU;AACjB,EAAA,IAAI,UAAA,KAAe,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,EAAE,CAAA;AAEnD,EAAA,MAAM,QAAQ,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,WAAW,SAAS,CAAA;AACjE,EAAA,IAAI,KAAA,CAAM,QAAA,EAAS,GAAI,KAAA,EAAO,OAAO,IAAA;AACrC,EAAA,KAAA,CAAM,SAAA,EAAU;AAChB,EAAA,IAAI,UAAA,KAAe,MAAA,EAAQ,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAElD,EAAA,MAAM,EAAA,GAAK,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,aAAa,MAAA,EAAQ,KAAK,EAAE,SAAA,EAAU;AACrE,EAAA,MAAM,MAAA,GAAS,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAC9B,IAAI,KAAK,CAAA,CACT,GAAA,CAAI,SAAS,CAAA,CACb,GAAA,CAAI,SAAS,CAAA,CACb,aAAa,CAAC,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,KAAA,EAAO,gBAAA,CAAiB,MAAM,CAAA,IAAK;AAAA,GACrC;AACF;AAnCgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAsET,SAAS,gBAAA,CACd,QACA,UAAA,EACoB;AACpB,EAAA,MAAMC,WAAU,EAAC;AACjB,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,EAAQ,MAAM,CAAA;AAC7C,IAAA,IAAI,IAAA,EAAM;AACR,MAAAA,QAAAA,CAAQ,MAAM,CAAA,GAAI,IAAA;AAClB,MAAA,OAAA,IAAW,CAAA;AAAA,IACb,CAAA,MAAO;AAGL,MAAAA,QAAAA,CAAQ,MAAM,CAAA,GAAI,EAAE,UAAU,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,KAAY,GAAG,OAAO,IAAA;AAE1B,EAAA,MAAM,QAAQ,EAAC;AACf,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,KAAA,CAAM,MAAM,CAAA,GAAI,YAAA,CAAa,MAAA,EAAQ,MAAM,CAAA,IAAK,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,kBAAkB,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,IAAI,cAAA,GAAuC,IAAA;AAC3C,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,MAAM,YAAY,IAAUD,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,UAAU,SAAS,CAAA;AACpE,IAAA,IAAI,UAAU,QAAA,EAAS,GAAI,KAAA,EAAO,cAAA,GAAiB,UAAU,SAAA,EAAU;AAAA,EACzE;AAEA,EAAA,MAAM,mBAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,GAAA,EAAK;AACjB,MAAA,gBAAA,CAAiB,MAAM,CAAA,GAAI,IAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAAY,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,KAAK,IAAI,CAAA;AAC1D,IAAA,gBAAA,CAAiB,MAAM,IACrB,SAAA,CAAU,QAAA,KAAa,KAAA,GAAQ,SAAA,CAAU,WAAU,GAAI,IAAA;AAAA,EAC3D;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA,EAAAC,QAAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA,IAAK,CAAA;AAAA,MACvD,WAAA,EAAa,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA,IAAK,CAAA;AAAA,MACzD,UAAA,EAAY,aAAA,CAAc,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA,IAAK,CAAA;AAAA,MACvD,SAAA,EAAW,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAA,IAAK;AAAA,KACvD;AAAA,IACA,IAAA,EAAM,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA;AAAA,IACxC,KAAA,EAAO,kBAAkB,MAAM,CAAA;AAAA,IAC/B;AAAA,GACF;AACF;AA9DgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AA4IT,IAAM,aAAA,GAAgB,IAAA;AAW7B,IAAM,QAAA,GAA4B;AAAA,EAChC,OAAA,EAAS,KAAA;AAAA,EACT,UAAA,EAAY,CAAA;AAAA,EACZ,eAAA,EAAiB;AACnB,CAAA;AAGA,SAAS,YAAA,CACP,MAAA,EACA,MAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,MAAM,CAAA;AACtC,EAAA,IAAI,KAAA,IAAS,WAAW,OAAO,CAAA;AAC/B,EAAA,OAAO,OAAA,CAAQ,CAAA,GAAA,CAAK,KAAA,GAAQ,SAAA,IAAa,aAAa,CAAA;AACxD;AARS,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAWF,IAAM,2BAAA,GAA8B,EAAA;AAE3C,IAAM,gBAAA,GAGF;AAAA,EACF,EAAA,EAAI,IAAUD,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EAC7B,IAAA,EAAM,IAAUA,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EAChC,OAAA,EAAS,IAAUA,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,EAAE,CAAA;AAAA,EACnC,IAAA,EAAM,IAAUA,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EAC/B,IAAA,EAAM,IAAUA,kBAAA,CAAA,OAAA,CAAQ,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,EAChC,KAAA,EAAO,IAAUA,kBAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC;AAClC,CAAA;AAOA,SAAS,UAAA,CACP,OACA,IAAA,EACsB;AACtB,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA,CAAM,cAAA;AACnC,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAM,OAAO,IAAA;AACxB,EAAA,OAAO,SAAS,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA;AACjE;AAPS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAST,SAAS,gBAAA,CACP,SAAA,EACA,KAAA,EACA,OAAA,EACsB;AACtB,EAAA,IAAI,SAAA,KAAc,aAAA,IAAiB,SAAA,KAAc,gBAAA,EAAkB;AACjE,IAAA,OAAO,iBAAiB,SAAS,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,OAAO,OAAA,EAAS,YAAA;AACtB,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAM,MAAA;AAG3B,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,EAAQ,OAAO,IAAA;AAE7B,EAAA,MAAM,SAAS,IAAUA,kBAAA,CAAA,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,MAAM,CAAA;AAC1D,EAAA,IAAI,MAAA,CAAO,QAAA,EAAS,GAAI,KAAA,EAAO,OAAO,IAAA;AACtC,EAAA,MAAA,CAAO,SAAA,EAAU;AACjB,EAAA,OAAO,SAAA,KAAc,aAAA,GAAgB,MAAA,GAAS,MAAA,CAAO,eAAe,EAAE,CAAA;AACxE;AAnBS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AA2BT,SAAS,eAAA,CACP,MAAA,EACA,QAAA,EACA,KAAA,EACA,kBACA,OAAA,EACQ;AACR,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AAEpB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAChC,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AACzD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,QAAcA,kBAAA,CAAA,SAAA,CAAU,QAAA;AAAA,MAC5B,IAAA,CAAK,IAAA,CAAWA,kBAAA,CAAA,SAAA,CAAU,KAAA,CAAM,MAAA,CAAO,IAAI,MAAM,CAAA,EAAG,EAAA,EAAI,CAAC,CAAC;AAAA,KAC5D;AACA,IAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,gBAAgB,CAAA,GAAI,EAAA;AAChE,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAA,GAAI,eAAA,GAAkB,aAAa,CAAA;AACzD,IAAA,IAAI,KAAA,GAAQ,MAAM,IAAA,GAAO,KAAA;AAAA,EAC3B;AACA,EAAA,OAAO,IAAA;AACT;AAtBS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AA+BF,SAAS,aAAA,CACd,KAAA,EACA,UAAA,EACA,OAAA,EACiB;AACjB,EAAA,IAAI,WAAW,IAAA,IAAQ,UAAA,CAAW,IAAA,KAAS,KAAA,CAAM,YAAY,OAAO,QAAA;AAEpE,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,eAAA,GAAiC,IAAA;AAErC,EAAA,MAAM,QAAA,mBAAW,MAAA,CAAA,CAAC,KAAA,EAAe,KAAA,KAAkB;AACjD,IAAA,IAAI,KAAA,GAAQ,YAAY,UAAA,GAAa,KAAA;AACrC,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,eAAA,GAAkB,KAAA;AAAA,IACpB;AAAA,EACF,CAAA,EANiB,UAAA,CAAA;AAQjB,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAEnC,IAAA,QAAA,CAAS,YAAA,CAAa,OAAO,IAAA,EAAM,MAAA,CAAO,MAAM,MAAA,CAAO,SAAS,GAAG,MAAM,CAAA;AAEzE,IAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,MAAA,QAAA;AAAA,QACE,aAAa,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,OAAO,SAAS,CAAA;AAAA,QAC/D,GAAG,MAAM,CAAA,QAAA;AAAA,OACX;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,MAAA,QAAA;AAAA,QACE,aAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,OAAO,SAAS,CAAA;AAAA,QAC7D,GAAG,MAAM,CAAA,IAAA;AAAA,OACX;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACrD,MAAA,QAAA;AAAA,QACE,eAAA;AAAA,UACE,KAAA,CAAM,iBAAiB,MAAM,CAAA;AAAA,UAC7B,MAAA,CAAO,UAAA;AAAA,UACP,KAAA;AAAA,UACA,WAAW,yBAAA,IAA6B,2BAAA;AAAA,UACxC;AAAA,SACF;AAAA,QACA,GAAG,MAAM,CAAA,UAAA;AAAA,OACX;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,KAAc,UAAA,CAAW,KAAA;AACjD,IAAA,QAAA;AAAA,MACE,aAAa,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG,QAAQ,SAAS,CAAA;AAAA,MACnD,GAAG,MAAM,CAAA,MAAA;AAAA,KACX;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,gBAAA,KAAqB,UAAA,CAAW,WAAA;AACzD,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,EAAO,IAAI,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AAEzD,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ;AACxB,MAAA,QAAA,CAAS,GAAG,aAAa,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,MAAM,QAAcA,kBAAA,CAAA,SAAA,CAAU,QAAA;AAAA,QAC5B,IAAA,CAAK,IAAA,CAAWA,kBAAA,CAAA,SAAA,CAAU,KAAA,CAAM,QAAA,CAAS,IAAI,MAAM,CAAA,EAAG,EAAA,EAAI,CAAC,CAAC;AAAA,OAC9D;AAGA,MAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,gBAAgB,CAAA,GAAI,EAAA;AAChE,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAA,GAAI,eAAA,GAAkB,aAAa,GAAG,aAAa,CAAA;AAAA,IACtE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,UAAA,IAAc,CAAA;AAAA,IACvB,UAAA;AAAA,IACA,eAAA,EAAiB,UAAA,IAAc,CAAA,GAAI,IAAA,GAAO;AAAA,GAC5C;AACF;AApFgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAuGT,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAM,wBAAA,GAA2B,IAAA;AACjC,IAAM,0BAAA,GAA6B,IAAA;AAenC,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAU3B,YAAY,OAAA,EAAkC;AAJ9C,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AACjB,IAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,SAAA,GAA2B,IAAA;AAGjC,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAS,eAAA,IAAmB,wBAAA;AACnD,IAAA,MAAM,IAAA,GAAO,SAAS,cAAA,IAAkB,uBAAA;AAGxC,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAChE,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,cAAA,IAAkB,wBAAA;AACjD,IAAA,IAAA,CAAK,gBAAA,GACH,SAAS,gBAAA,IAAoB,0BAAA;AAAA,EACjC;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAA,CAAO,YAAoB,GAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAI,UAAA,GAAa,KAAK,cAAA,EAAgB;AACpC,QAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,UAAA,IAAc,KAAK,eAAA,EAAiB;AACtC,MAAA,IAAI,IAAA,CAAK,YAAA,KAAiB,IAAA,EAAM,IAAA,CAAK,YAAA,GAAe,GAAA;AACpD,MAAA,IAAI,GAAA,GAAM,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,cAAA,EAAgB;AAClD,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,GAAA,EAA8B;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AAEzB,IAAA,IAAI,IAAA,CAAK,SAAA,KAAc,IAAA,EAAM,IAAA,CAAK,SAAA,GAAY,GAAA;AAC9C,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,kBAAkB,OAAO,IAAA;AAEzD,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AACF,CAAA;AArE6B,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAAtB,IAAM,eAAA,GAAN,gBAAA;;;ACttBA,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAsC;AAAA,EAQjD,YAAY,WAAA,EAA4B;AANxC,IAAA,IAAA,CAAiB,QAAA,uBAAe,GAAA,EAAoC;AACpE,IAAA,IAAA,CAAiB,MAAA,uBAAa,GAAA,EAA0C;AAExE;AAAA,IAAA,IAAA,CAAiB,YAAA,GAAe,IAAUE,kBAAA,CAAA,OAAA,EAAQ;AAClD,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAA;AAGhB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EAEA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAC5C,IAAA,IAAI,CAAC,KAAA,CAAM,cAAA,EAAe,EAAG;AAG3B,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,IAAW,SAAA;AAChB,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACzC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,IAAA,KAAA,CAAM,SAAA,EAAU,CAAE,gBAAA,CAAiB,IAAA,CAAK,YAAY,CAAA;AACpD,IAAA,MAAM,OAAA,GAA6B,EAAE,YAAA,EAAc,IAAA,CAAK,YAAA,EAAa;AAErE,IAAA,KAAA,MAAW,EAAE,QAAA,EAAU,KAAA,EAAM,IAAK,OAAA,EAAS;AACzC,MAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,KAAA,EAAO,iBAAiB,CAAA;AACjE,MAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,MAAA,KAAA,MAAW,UAAA,IAAc,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAY;AACnD,QAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AAE7C,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,EAAE,CAAA,CAAA;AACnC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA;AAC5C,QAAA,IAAI,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC9B,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,IAAI,eAAA,CAAgB;AAAA,YAC5B,gBAAgB,KAAA,CAAM;AAAA,WACvB,CAAA;AACD,UAAA,QAAA,CAAS,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,QAC3B;AAEA,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,IAAK,IAAA;AAC7C,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,MAAM,KAAA,EAAO;AACxC,YAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO;AAAA,cACpC,QAAQ,KAAA,CAAM,EAAA;AAAA,cACd,UAAU,KAAA,CAAM,IAAA;AAAA,cAChB,UAAA;AAAA,cACA,UAAA,EAAY;AAAA,aACb,CAAA;AAAA,UACH;AACA,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA;AACtD,QAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY,KAAK,OAAO,CAAA;AAC3D,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO;AAAA,YACpC,QAAQ,KAAA,CAAM,EAAA;AAAA,YACd,UAAU,KAAA,CAAM,IAAA;AAAA,YAChB,UAAA;AAAA,YACA,YAAY,KAAA,CAAM;AAAA,WACnB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,aAAA,GAAsB;AAC5B,IAAA,KAAA,MAAW,UAAA,IAAc,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAY;AACnD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AAClD,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,IAAA;AAChC,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,UAAA;AAAA,QACA,MAAA,GAAS,gBAAA,CAAiB,MAAA,EAAQ,UAAU,CAAA,GAAI;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eACN,KAAA,EACgD;AAChD,IAAA,MAAM,YAA4D,EAAC;AAEnE,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,mBAAmB,CAAA,EAAG;AACvD,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,mBAAmB,CAAA;AAClE,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAEzB,MAAA,KAAA,MAAW,KAAA,IAAS,UAAU,KAAA,EAAO;AACnC,QAAA,IAAI,MAAM,OAAA,EAAS,SAAA,CAAU,KAAK,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,YAAY,UAAA,EAA4C;AAC9D,IAAA,IAAI,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAC3C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,QAAA,uBAAe,GAAA,EAAI;AACnB,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAA,EAAY,QAAQ,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,QAAA,CACN,KAAA,EACA,QAAA,EACA,KAAA,EACA,MAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,eAAe,CAAA;AAC3D,IAAA,MAAM,YAAY,MAAA,EAAQ,eAAA;AAC1B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,KAAA,MAAW,QAAA,IAAY,SAAA,CAAU,MAAA,EAAO,EAAG;AACzC,MAAA,IAAI,EAAE,oBAAoB,SAAA,CAAA,EAAY;AACtC,MAAA,IAAI;AACF,QAAA,IAAI,KAAA,KAAU,OAAA,EAAS,QAAA,CAAS,eAAA,CAAgB,MAAM,CAAA;AAAA,aACjD,QAAA,CAAS,cAAc,MAAM,CAAA;AAAA,MACpC,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC7C,MAAA,KAAA,MAAW,OAAA,IAAW,QAAA,CAAS,MAAA,EAAO,UAAW,KAAA,EAAM;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AAAA;AAAA,EAGA,aAAa,UAAA,EAAkD;AAC7D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,IAAK,IAAA;AAAA,EACxC;AAAA;AAAA,EAGA,YAAA,CACE,QAAA,EACA,MAAA,EACA,UAAA,EACS;AACT,IAAA,OACE,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA,EAAG,UAAS,IACtE,KAAA;AAAA,EAEJ;AACF,CAAA;AAlKmD,MAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAA5C,IAAM,gBAAA,GAAN;ACrBA,IAAM,mBAAA,GAAsB;AAGnC,IAAM,aAAA,GAAgB,IAAA;AAQtB,IAAM,oBAAA,GAAuB,IAAA;AAatB,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAAyC;AAAA,EAIpD,YAAY,iBAAA,EAAwC;AAFpD,IAAA,IAAA,CAAiB,OAAA,uBAAc,GAAA,EAAyB;AAGtD,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AAAA,EAC3B;AAAA,EAEA,MAAA,CAAO,OAAc,SAAA,EAAyB;AAC5C,IAAA,IAAI,CAAC,KAAA,CAAM,cAAA,EAAe,EAAG;AAC3B,MAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,mBAAA,EAAoB;AAG3D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,gBAAA,EAAiB;AAErD,IAAA,KAAA,MAAW,YAAY,OAAA,EAAS;AAC9B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACxB,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,uBAAuB,CAAA;AACzE,MAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC5B,MAAA,IAAI,YAAA,CAAa,kBAAkB,MAAA,EAAQ;AAC3C,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,YAAY,CAAA;AAAA,IAC1C;AAEA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AAC7C,MAAA,IAAI,CAAC,QAAQ,GAAA,CAAI,QAAQ,KAAK,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChD,QAAA,MAAA,CAAO,MAAA,GAAS,KAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,SAAS,CAAA;AAAA,EAC/B;AAAA,EAEQ,KAAA,CACN,KAAA,EACA,QAAA,EACA,YAAA,EACM;AACN,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAC1C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,UAAA,GACJ,YAAA,CAAa,aAAA,KAAkB,OAAA,IAC/B,aAAa,aAAA,KAAkB,MAAA;AAEjC,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,QAAA,EAAU;AAAA,MACzB,OAAO,UAAA,GAAa,IAAA,CAAK,SAAS,KAAA,EAAO,QAAA,EAAU,YAAY,CAAA,GAAI,IAAA;AAAA,MACnE,WAAW,IAAUC,kBAAA,CAAA,OAAA;AAAA,QACnB,UAAU,KAAA,CAAM,CAAA;AAAA,QAChB,UAAU,KAAA,CAAM,CAAA;AAAA,QAChB,UAAU,KAAA,CAAM;AAAA,OAClB;AAAA,MACA,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,QAAA,CACN,KAAA,EACA,QAAA,EACA,YAAA,EACuB;AACvB,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG,MAAA;AAC1D,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,MAAM,QAAA,GAAW,IAAUA,kBAAA,CAAA,iBAAA,CAAkB;AAAA,MAC3C,KAAA,EAAO,IAAUA,kBAAA,CAAA,KAAA,CAAM,YAAA,CAAa,UAAU,CAAA;AAAA;AAAA;AAAA,MAG9C,IAAA,EAAYA,kBAAA,CAAA,QAAA;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,IAAUA,kBAAA,CAAA,KAAA,EAAM;AAC9B,IAAA,KAAA,CAAM,IAAA,GAAO,cAAA;AACb,IAAA,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA,GAAI,IAAA;AACtC,IAAA,KAAA,CAAM,WAAA,GAAc,GAAA;AAEpB,IAAA,MAAA,CAAO,QAAA,CAAS,CAAC,KAAA,KAAU;AACzB,MAAA,IAAI,EAAE,KAAA,YAAuBA,kBAAA,CAAA,IAAA,CAAA,IAAS,CAAC,MAAM,QAAA,EAAU;AAEvD,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAEzC,MAAA,MAAM,KAAA,GAAQ,IAAUA,kBAAA,CAAA,IAAA,CAAK,KAAA,CAAM,UAAU,QAAQ,CAAA;AAGrD,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,KAAK,CAAA;AACnC,MAAA,MAAA,CAAO,iBAAA,CAAkB,MAAM,KAAK,CAAA;AACpC,MAAA,KAAA,CAAM,gBAAA,GAAmB,KAAA;AACzB,MAAA,KAAA,CAAM,OACH,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,CACvB,QAAO,CACP,QAAA,CAAS,KAAA,CAAM,WAAW,EAC1B,KAAA,CAAM,IAAUA,2BAAQ,aAAA,EAAe,aAAA,EAAe,aAAa,CAAC,CAAA;AACvE,MAAA,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA,GAAI,IAAA;AACtC,MAAA,KAAA,CAAM,UAAU,MAAM;AAAA,MAGtB,CAAA;AACA,MAAA,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,OAAA,CAAQ,OAAc,SAAA,EAAyB;AAGrD,IAAA,MAAM,IAAA,GAGA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,IAAI,oBAAoB,CAAA;AAEjE,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG;AACzD,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,uBAAuB,CAAA;AACzE,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,CAAA;AACnC,MAAA,MAAA,CAAO,QAAA,IAAA,CAAa,MAAA,GAAS,MAAA,CAAO,QAAA,IAAY,IAAA;AAEhD,MAAA,MAAM,UAAA,GACJ,YAAA,EAAc,aAAA,KAAkB,OAAA,IAChC,cAAc,aAAA,KAAkB,MAAA;AAElC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,MAAA,GACJ,KAAK,YAAA,CAAa,UAAA,GAAa,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA;AACjE,UAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA,GAAI,MAAA;AACzC,UAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA,GAAI,MAAA;AACzC,UAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA,GAAI,MAAA;AAAA,QAC3C;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,WAAW,IAAA,EAAM;AAC5C,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,MAAM,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,MAAA,CACN,KAAA,EACA,QAAA,EACA,MAAA,EACM;AACN,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,kBAAkB,CAAA;AACjE,IAAA,IAAI,SAAA,EAAW;AAGb,MAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA;AACrC,MAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA;AACrC,MAAA,SAAA,CAAU,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA;AAAA,IACvC;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,KAAK,CAAA;AAC9B,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA,EAC9B;AAAA,EAEQ,aAAa,KAAA,EAAoC;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAK,CAAA;AAC1B,IAAA,KAAA,CAAM,QAAA,CAAS,CAAC,KAAA,KAAU;AACxB,MAAA,IAAI,iBAAuBA,kBAAA,CAAA,IAAA,EAAM;AAC/B,QAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAGvB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,UAAA,KAAA,MAAW,KAAA,IAAS,QAAA,EAAU,KAAA,CAAM,OAAA,EAAQ;AAAA,QAC9C,CAAA,MAAO;AACL,UAAA,QAAA,EAAU,OAAA,EAAQ;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,SAAS,KAAA,EAAoB;AACnC,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG;AACzD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,MAAM,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,KAAK,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF,CAAA;AA5MsD,MAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAA/C,IAAM,mBAAA,GAAN","file":"index.cjs","sourcesContent":["/**\n * Marker base class for every ECS component. Subclass `Component` to declare\n * a typed data container that systems can query.\n *\n * @remarks\n * Components own state only — runtime behaviour belongs in {@link Behaviour}\n * subclasses for user scripts. Keep fields plain (numbers, strings, vectors,\n * asset URLs).\n *\n * @category Components\n */\nexport class Component {}\n\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Wraps the live `THREE.Object3D` for an entity. Almost every entity that\n * renders to the scene carries an `Object3DRef` so transform sync, selection,\n * and parenting systems can manipulate the underlying object.\n *\n * @remarks\n * The `object` reference may be replaced when assets finish loading. Read it\n * fresh inside system/script hooks rather than caching it across frames.\n *\n * @category Components\n */\nexport class Object3DRef extends Component {\n /** Live three.js object placed in the scene graph. May be replaced when assets finish loading. */\n object: THREE.Object3D;\n /** Whether the object is currently visible. Mirrors `object.visible` and is preserved across reloads. */\n visibility: boolean;\n\n constructor(object: THREE.Object3D, visibility?: boolean) {\n super();\n this.object = object;\n this.visibility =\n typeof visibility === \"boolean\" ? visibility : Boolean(object.visible);\n }\n}\n","import { Component } from \"../Component\";\nimport type { EntityId } from \"../types\";\n\n/**\n * Records the parent entity id for hierarchical scene graphs. `null` means\n * the entity is at the world root. The `ObjectManagementSystem` reconciles\n * scene-graph parenting from this component each frame.\n *\n * @category Components\n */\nexport class ParentId extends Component {\n /** Parent entity id, or `null` for root-level entities. */\n value: EntityId | null;\n\n constructor(value: EntityId | null = null) {\n super();\n this.value = value;\n }\n}\n","import { Component } from \"../Component\";\nimport {\n Euler,\n Quaternion,\n Vector3,\n type EulerOrder,\n} from \"three\";\n\n/** Plain XYZ vector. All ECS transform fields use this shape rather than `THREE.Vector3` so they save cleanly with the project. */\nexport type Vec3 = {\n /** X component. */\n x: number;\n /** Y component. */\n y: number;\n /** Z component. */\n z: number;\n};\n\n/** Optional initial values passed to {@link TransformComponent}. Missing axes default to `0` for position/rotation and `1` for scale. */\nexport type TransformData = {\n /** Initial position (defaults to `{ 0, 0, 0 }`). */\n position?: Partial<Vec3>;\n /** Initial rotation in **radians** (defaults to `{ 0, 0, 0 }`). */\n rotation?: Partial<Vec3>;\n /** Initial scale (defaults to `{ 1, 1, 1 }`). */\n scale?: Partial<Vec3>;\n};\n\ntype TransformInput = Vector3 | Euler | Quaternion;\n\nfunction readXYZ(input: TransformInput): Vec3 {\n return {\n x: input.x,\n y: input.y,\n z: input.z,\n };\n}\n\n/**\n * Position, rotation, and scale of an entity in its parent's local space.\n *\n * @remarks\n * Rotation is stored in **radians** (Euler XYZ). The editor inspector converts\n * to/from degrees for display — do not store degrees in this component.\n * Mutations should go through the `setPosition` / `setRotation` / `setScale`\n * helpers so dependent systems pick up the change.\n *\n * @category Components\n */\nexport class TransformComponent extends Component {\n /** Local position relative to the parent (or world if no parent). */\n position: Vec3;\n /** Local rotation as Euler XYZ in **radians**. */\n rotation: Vec3;\n /** Local scale factors per axis (`1` = identity). */\n scale: Vec3;\n\n constructor(data: TransformData = {}) {\n super();\n\n const position = data.position ?? {};\n const rotation = data.rotation ?? {};\n const scale = data.scale ?? {};\n\n this.position = {\n x: position.x ?? 0,\n y: position.y ?? 0,\n z: position.z ?? 0,\n };\n\n this.rotation = {\n x: rotation.x ?? 0,\n y: rotation.y ?? 0,\n z: rotation.z ?? 0,\n };\n\n this.scale = {\n x: scale.x ?? 1,\n y: scale.y ?? 1,\n z: scale.z ?? 1,\n };\n }\n\n toPositionVector3(target = new Vector3()): Vector3 {\n return target.set(this.position.x, this.position.y, this.position.z);\n }\n\n toRotationEuler(\n target = new Euler(),\n order: EulerOrder = \"XYZ\",\n ): Euler {\n return target.set(this.rotation.x, this.rotation.y, this.rotation.z, order);\n }\n\n toRotationQuaternion(\n target = new Quaternion(),\n order: EulerOrder = \"XYZ\",\n ): Quaternion {\n const euler = new Euler(\n this.rotation.x,\n this.rotation.y,\n this.rotation.z,\n order,\n );\n return target.setFromEuler(euler);\n }\n\n toScaleVector3(target = new Vector3()): Vector3 {\n return target.set(this.scale.x, this.scale.y, this.scale.z);\n }\n\n setPosition(input: TransformInput): this {\n const next = readXYZ(input);\n this.position.x = next.x;\n this.position.y = next.y;\n this.position.z = next.z;\n return this;\n }\n\n setScale(input: TransformInput): this {\n const next = readXYZ(input);\n this.scale.x = next.x;\n this.scale.y = next.y;\n this.scale.z = next.z;\n return this;\n }\n\n setRotation(input: TransformInput, order: EulerOrder = \"XYZ\"): this {\n if (input instanceof Quaternion) {\n const euler = new Euler().setFromQuaternion(input, order);\n this.rotation.x = euler.x;\n this.rotation.y = euler.y;\n this.rotation.z = euler.z;\n return this;\n }\n\n const next = readXYZ(input);\n this.rotation.x = next.x;\n this.rotation.y = next.y;\n this.rotation.z = next.z;\n return this;\n }\n}\n","import * as THREE from \"three\";\nimport type { GLTF } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { clone as cloneWithSkeleton } from \"three/examples/jsm/utils/SkeletonUtils.js\";\n\n/**\n * userData flag set on geometries/materials that back shared (cached) model\n * scenes. Entity disposal must skip these — other live clones and future\n * spawns reference the same GPU resources.\n */\nexport const SHARED_MODEL_RESOURCE_FLAG = \"spatialEcsSharedModelResource\";\n\nconst modelCache = new Map<string, Promise<GLTF>>();\n\nfunction markSharedResources(root: THREE.Object3D): void {\n root.traverse((child) => {\n if (!(child instanceof THREE.Mesh)) {\n return;\n }\n if (child.geometry) {\n child.geometry.userData[SHARED_MODEL_RESOURCE_FLAG] = true;\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const material of materials) {\n if (material) {\n material.userData[SHARED_MODEL_RESOURCE_FLAG] = true;\n }\n }\n });\n}\n\n/**\n * Load a GLTF once per URL and share the parsed result, so repeated spawns of\n * the same model skip both the fetch and the parse. The cached scene must\n * never be mounted directly (an Object3D has a single parent) — mount a\n * cloneModelScene() of it. Failed loads are evicted so a retry re-fetches.\n */\nexport function loadSharedGltf(\n url: string,\n load: () => Promise<GLTF>,\n): Promise<GLTF> {\n let pending = modelCache.get(url);\n if (!pending) {\n pending = load().then((gltf) => {\n markSharedResources(gltf.scene);\n return gltf;\n });\n pending.catch(() => {\n modelCache.delete(url);\n });\n modelCache.set(url, pending);\n }\n return pending;\n}\n\n/**\n * Skeleton-aware clone of a cached model scene for mounting. Geometries and\n * materials are shared with the cached original (marked via\n * SHARED_MODEL_RESOURCE_FLAG); the object hierarchy — including rebound\n * skeletons for skinned meshes — is fresh per call.\n */\nexport function cloneModelScene(scene: THREE.Object3D): THREE.Object3D {\n return cloneWithSkeleton(scene);\n}\n\n/**\n * Forget cached models (one URL, or everything). Subsequent loads fetch and\n * parse anew. Does not dispose GPU resources — live clones may still use them.\n */\nexport function clearModelCache(url?: string): void {\n if (typeof url === \"string\") {\n modelCache.delete(url);\n return;\n }\n modelCache.clear();\n}\n","import * as THREE from \"three\";\n\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { ParentId } from \"../components/ParentId\";\nimport type { TransformData } from \"../components/Transform\";\nimport { TransformComponent } from \"../components/Transform\";\nimport type { EcsSystem } from \"../System\";\nimport { SHARED_MODEL_RESOURCE_FLAG } from \"../utils/modelCache\";\nimport type { World } from \"../World\";\nimport type { EntityId, EcsEntityKind } from \"../types\";\n\nexport type CreatePayload = {\n name?: string;\n transform?: TransformData;\n parentId?: EntityId | null;\n path?: string;\n options?: Record<string, unknown>;\n camera?: Record<string, unknown>;\n useWorldCamera?: boolean;\n /**\n * Suppress the default child entities a factory would otherwise create.\n *\n * Set during hydration: the snapshot already contains those children, so\n * letting the factory add its own too duplicates them on every load.\n */\n skipDefaultChildren?: boolean;\n};\n\nexport type CreateContext = {\n world: World;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n payload: CreatePayload;\n isEditor?: boolean;\n};\n\nexport type EntityFactory = (context: CreateContext) => EntityId;\n\nexport type EcsComponentFactoryKind =\n | \"animation\"\n | \"audio\"\n | \"camera\"\n | \"environment\"\n | \"entityType\"\n | \"image\"\n | \"imageTargetAnchor\"\n | \"imageTarget\"\n | \"light\"\n | \"material\"\n | \"mesh\"\n | \"meshGeometry\"\n | \"model\"\n | \"name\"\n | \"object3DRef\"\n | \"parentId\"\n | \"physics\"\n | \"postprocessing\"\n | \"script\"\n | \"scriptObject\"\n | \"selectable\"\n | \"selectionTransformState\"\n | \"sprite\"\n | \"transform\"\n | \"video\"\n | \"instancedMesh\"\n | \"xrRig\"\n | \"vrTeleportArea\"\n | \"xrHandPose\"\n | \"xrInteractable\"\n | \"xrInteractor\"\n | \"xrInteractorSide\";\n\nexport type ComponentFactory = (\n world: World,\n entityId: EntityId,\n ...args: any[]\n) => unknown;\n\ntype CreateRequest = {\n kind: EcsEntityKind;\n payload: CreatePayload;\n onCreated?: (entityId: EntityId) => void;\n};\n\nexport function createTransform(input?: TransformData): TransformComponent {\n return new TransformComponent(input);\n}\n\nexport function applyTransform(\n object: THREE.Object3D,\n transform: TransformComponent,\n): void {\n object.position.set(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n object.rotation.set(\n transform.rotation.x,\n transform.rotation.y,\n transform.rotation.z,\n );\n object.scale.set(transform.scale.x, transform.scale.y, transform.scale.z);\n}\n\nexport class ObjectManagementSystem implements EcsSystem {\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private readonly isEditor: boolean;\n private readonly registry = new Map<EcsEntityKind, EntityFactory>();\n private readonly componentRegistry = new Map<\n EcsComponentFactoryKind,\n ComponentFactory\n >();\n private readonly createQueue: CreateRequest[] = [];\n\n constructor(\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n isEditor = false,\n ) {\n this.scene = scene;\n this.camera = camera;\n this.isEditor = isEditor;\n }\n\n register(kind: EcsEntityKind, factory: EntityFactory): void {\n this.registry.set(kind, factory);\n }\n\n registerComponentFactory(\n kind: EcsComponentFactoryKind,\n factory: ComponentFactory,\n ): void {\n this.componentRegistry.set(kind, factory);\n }\n\n getOrCreateAudioListener(): THREE.AudioListener {\n const existing = this.camera.userData.ecsAudioListener;\n if (existing instanceof THREE.AudioListener) {\n return existing;\n }\n\n const listener = new THREE.AudioListener();\n this.camera.add(listener);\n this.camera.userData.ecsAudioListener = listener;\n return listener;\n }\n\n isEditorMode(): boolean {\n return this.isEditor;\n }\n\n getComponentFactory(kind: EcsComponentFactoryKind): ComponentFactory | null {\n return this.componentRegistry.get(kind) ?? null;\n }\n\n createComponentNow(\n kind: EcsComponentFactoryKind,\n world: World,\n entityId: EntityId,\n ...args: any[]\n ): unknown {\n const factory = this.componentRegistry.get(kind);\n if (!factory) {\n throw new Error(`Unknown component kind: ${kind}`);\n }\n\n return factory(world, entityId, ...args);\n }\n\n requestCreate(\n kind: EcsEntityKind,\n payload: CreatePayload = {},\n onCreated?: (entityId: EntityId) => void,\n ): void {\n this.createQueue.push({ kind, payload, onCreated });\n }\n\n createNow(\n kind: EcsEntityKind,\n world: World,\n payload: CreatePayload = {},\n ): EntityId {\n const factory = this.registry.get(kind);\n if (!factory) {\n throw new Error(`Unknown object kind: ${kind}`);\n }\n\n const entityId = factory({\n world,\n scene: this.scene,\n camera: this.camera,\n payload,\n isEditor: this.isEditor,\n });\n\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) {\n object.userData.ecsKind = kind;\n }\n\n if (payload.parentId !== undefined) {\n world.addComponent(entityId, new ParentId(payload.parentId));\n }\n\n return entityId;\n }\n\n /**\n * Removes an entity from the ECS world and its associated `Object3D` from the\n * THREE.js scene graph.\n *\n * @param world - The world the entity belongs to.\n * @param entityId - The entity to remove.\n * @param dispose - When `true`, traverses the entity's `Object3D` subtree and\n * calls `.dispose()` on every `BufferGeometry` and `Material` found. Pass\n * `true` when the entity will not be reused and you want to free GPU memory\n * immediately (e.g. dynamically spawned objects). Defaults to `false`.\n * @returns `true` if the entity existed and was removed; `false` if the entity\n * was not found.\n *\n * @example\n * ```ts\n * // Remove from scene, keep GPU resources (safe if geometry is shared)\n * objects.deleteEntity(world, entityId);\n *\n * // Remove from scene and free GPU memory (use for one-off spawned objects)\n * objects.deleteEntity(world, entityId, true);\n * ```\n */\n deleteEntity(world: World, entityId: EntityId, dispose = false): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n const object3d = world.getComponent(entityId, Object3DRef)?.object;\n if (object3d?.parent) {\n object3d.parent.remove(object3d);\n }\n\n if (dispose && object3d) {\n object3d.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n // Resources backing shared (cached) model scenes are skipped —\n // other live clones and future spawns reference the same objects.\n if (!child.geometry?.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n child.geometry?.dispose();\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const mat of materials) {\n if (mat && !mat.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n mat.dispose();\n }\n }\n }\n });\n }\n\n world.destroyEntity(entityId);\n return true;\n }\n\n setParent(\n world: World,\n entityId: EntityId,\n parentId: EntityId | null,\n options?: {\n preserveWorldTransform?: boolean;\n },\n ): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n if (parentId !== null && !world.hasEntity(parentId)) {\n return false;\n }\n\n if (parentId === entityId) {\n return false;\n }\n\n let ancestor = parentId;\n while (ancestor !== null) {\n if (ancestor === entityId) {\n return false;\n }\n\n ancestor = world.getComponent(ancestor, ParentId)?.value ?? null;\n }\n\n const parentComponent = world.getComponent(entityId, ParentId);\n if (parentComponent) {\n if (parentComponent.value === parentId) {\n return false;\n }\n\n parentComponent.value = parentId;\n } else {\n world.addComponent(entityId, new ParentId(parentId));\n }\n\n const preserveWorldTransform = options?.preserveWorldTransform ?? true;\n if (preserveWorldTransform) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n const parentObject =\n parentId !== null\n ? world.getComponent(parentId, Object3DRef)?.object ?? null\n : null;\n\n if (object) {\n // Refresh matrixWorld before attach so world-space preservation is accurate.\n this.scene.updateMatrixWorld(true);\n\n if (parentObject && parentObject !== object) {\n parentObject.attach(object);\n } else {\n this.scene.attach(object);\n }\n\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n }\n\n this.reconcileSceneFromWorld(world);\n return true;\n }\n\n private syncTransformComponentFromObject(\n world: World,\n entityId: EntityId,\n object: THREE.Object3D,\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) {\n return;\n }\n\n transform.position.x = object.position.x;\n transform.position.y = object.position.y;\n transform.position.z = object.position.z;\n\n transform.rotation.x = object.rotation.x;\n transform.rotation.y = object.rotation.y;\n transform.rotation.z = object.rotation.z;\n\n transform.scale.x = object.scale.x;\n transform.scale.y = object.scale.y;\n transform.scale.z = object.scale.z;\n }\n\n reconcileSceneFromWorld(world: World): void {\n const worldObjects = new Map<EntityId, THREE.Object3D>();\n const entityIds = world.query(Object3DRef);\n\n for (const entityId of entityIds) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!object) {\n continue;\n }\n\n worldObjects.set(entityId, object);\n }\n\n for (const child of [...this.scene.children]) {\n const entityId = child.userData?.entityId;\n if (typeof entityId === \"number\" && !world.hasEntity(entityId)) {\n this.scene.remove(child);\n }\n }\n\n for (const [entityId, object] of worldObjects.entries()) {\n const parentEntityId = world.getComponent(entityId, ParentId)?.value;\n const parentObject =\n typeof parentEntityId === \"number\"\n ? worldObjects.get(parentEntityId)\n : undefined;\n\n if (parentObject && parentObject !== object) {\n if (object.parent !== parentObject) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n parentObject.add(object);\n object.updateMatrixWorld(true);\n }\n continue;\n }\n\n if (object.parent !== this.scene) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n this.scene.add(object);\n object.updateMatrixWorld(true);\n }\n }\n }\n\n update(world: World): void {\n for (const request of this.createQueue.splice(0)) {\n const entityId = this.createNow(request.kind, world, request.payload);\n request.onCreated?.(entityId);\n }\n\n this.reconcileSceneFromWorld(world);\n }\n}\n","import type * as THREE from \"three\";\n\nexport interface StateMachine {\n name: string;\n clip: THREE.AnimationClip;\n clipId: string | null;\n loop: boolean;\n isPlaying: boolean;\n isPaused: boolean;\n onStart: () => void;\n onPlaying: () => void;\n onEnd: () => void;\n play: () => void;\n pause: () => void;\n stop: () => void;\n}\n\nexport type AnimationStateCallbacks = {\n onStart?: () => void;\n onPlaying?: () => void;\n onEnd?: () => void;\n};\n\nexport class AnimationStateMachine implements StateMachine {\n name: string;\n clip: THREE.AnimationClip;\n clipId: string | null;\n loop: boolean;\n isPlaying = false;\n isPaused = false;\n private callbacks: Required<AnimationStateCallbacks>;\n\n constructor(\n name: string,\n clip: THREE.AnimationClip,\n callbacks: AnimationStateCallbacks = {},\n loop = false,\n clipId: string | null = null,\n ) {\n this.name = name;\n this.clip = clip;\n this.clipId = clipId;\n this.loop = loop;\n this.callbacks = {\n onStart: callbacks.onStart ?? (() => {}),\n onPlaying: callbacks.onPlaying ?? (() => {}),\n onEnd: callbacks.onEnd ?? (() => {}),\n };\n }\n\n setCallbacks(callbacks: AnimationStateCallbacks): void {\n this.callbacks = {\n onStart: callbacks.onStart ?? this.callbacks.onStart,\n onPlaying: callbacks.onPlaying ?? this.callbacks.onPlaying,\n onEnd: callbacks.onEnd ?? this.callbacks.onEnd,\n };\n }\n\n setLoop(loop: boolean): void {\n this.loop = loop;\n }\n\n onStart(): void {\n this.callbacks.onStart();\n }\n\n onPlaying(): void {\n this.callbacks.onPlaying();\n }\n\n onEnd(): void {\n this.callbacks.onEnd();\n }\n\n play(): void {\n const wasPlaying = this.isPlaying;\n this.isPlaying = true;\n this.isPaused = false;\n\n if (!wasPlaying) {\n this.onStart();\n }\n\n this.onPlaying();\n }\n\n pause(): void {\n if (!this.isPlaying) {\n return;\n }\n\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n stop(): void {\n const shouldNotifyEnd = this.isPlaying || this.isPaused;\n this.isPlaying = false;\n this.isPaused = false;\n\n if (shouldNotifyEnd) {\n this.onEnd();\n }\n }\n}\n\nexport class AnimationStateManager {\n private readonly states = new Map<string, AnimationStateMachine>();\n private activeState: AnimationStateMachine | null = null;\n\n addState(state: AnimationStateMachine): AnimationStateMachine {\n this.states.set(state.name, state);\n return state;\n }\n\n createState(\n name: string,\n clip: THREE.AnimationClip,\n callbacks: AnimationStateCallbacks = {},\n loop = false,\n clipId: string | null = null,\n ): AnimationStateMachine {\n const state = new AnimationStateMachine(name, clip, callbacks, loop, clipId);\n this.states.set(name, state);\n return state;\n }\n\n removeState(name: string): boolean {\n const state = this.states.get(name);\n if (!state) {\n return false;\n }\n\n if (this.activeState?.name === name) {\n this.activeState.stop();\n this.activeState = null;\n }\n\n return this.states.delete(name);\n }\n\n getState(name: string): AnimationStateMachine | null {\n return this.states.get(name) ?? null;\n }\n\n hasState(name: string): boolean {\n return this.states.has(name);\n }\n\n listStates(): AnimationStateMachine[] {\n return [...this.states.values()];\n }\n\n getActiveState(): AnimationStateMachine | null {\n return this.activeState;\n }\n\n switchState(name: string, autoPlay = true): AnimationStateMachine | null {\n const next = this.states.get(name) ?? null;\n if (!next) {\n return null;\n }\n\n if (this.activeState && this.activeState !== next) {\n this.activeState.stop();\n }\n\n this.activeState = next;\n if (autoPlay) {\n next.play();\n }\n\n return next;\n }\n\n playState(name?: string): boolean {\n const state = name ? this.switchState(name, false) : this.activeState;\n if (!state) {\n return false;\n }\n\n this.activeState = state;\n state.play();\n return true;\n }\n\n pauseState(name?: string): boolean {\n const state = name ? this.states.get(name) : this.activeState;\n if (!state) {\n return false;\n }\n\n state.pause();\n return true;\n }\n\n stopState(name?: string): boolean {\n const state = name ? this.states.get(name) : this.activeState;\n if (!state) {\n return false;\n }\n\n state.stop();\n if (!name || this.activeState?.name === name) {\n this.activeState = null;\n }\n return true;\n }\n\n clear(): void {\n this.stopState();\n this.states.clear();\n this.activeState = null;\n }\n}","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\nimport {\n AnimationStateManager,\n type AnimationStateMachine,\n} from \"../AnimationStateMachine\";\n\n/** Initializer for {@link AnimationComponent}. */\nexport type AnimationComponentOptions = {\n /** Initial set of clips imported from the entity's model. */\n clips?: THREE.AnimationClip[];\n /** URLs (or `localasset://` paths) of clips to load asynchronously and merge into the catalog. */\n externalClipSources?: string[];\n /** Name of the state to activate after construction. */\n activeState?: string | null;\n /** Whether playback starts paused. */\n paused?: boolean;\n /** Play the active clip in reverse. */\n reverse?: boolean;\n /** Time-scale multiplier (`1` = real-time). */\n timeScale?: number;\n /** Default cross-fade duration in seconds when switching states. */\n crossFadeDuration?: number;\n /** Predefined state machine entries (`name` -> clip binding). */\n states?: Array<{\n /** State name (must be unique). */\n name: string;\n /** Clip name to play in this state. */\n clip: string;\n /** Optional stable clip id used to disambiguate same-named clips. */\n clipId?: string;\n /** Loop the clip while in this state. */\n loop?: boolean;\n }>;\n};\n\n/** Catalog entry describing a clip available to the entity (from a model or an external source). */\nexport type AnimationClipCatalogEntry = {\n /** Stable id used to reference the clip from state machines. */\n id: string;\n /** Internal clip name as stored on the `THREE.AnimationClip`. */\n name: string;\n /** Display label shown in the inspector. */\n label: string;\n /** Underlying three.js clip. */\n clip: THREE.AnimationClip;\n /** Where this clip came from. */\n source: \"model\" | \"external\";\n /** Source URL/path for `external` clips; `null` for clips imported from a model. */\n sourceUrl: string | null;\n};\n\ntype ImportedClipEntry = {\n clip: THREE.AnimationClip;\n sourceUrl: string | null;\n};\n\n/**\n * Animation catalog and runtime state for an entity. Combines clips imported\n * from a model with externally added clips, exposes a state machine for\n * named transitions, and is queried each frame by the animation system to\n * advance mixer time.\n *\n * @remarks\n * Use the `addState` / `switchState` helpers rather than mutating the state\n * machine directly so the animation system observes transitions.\n *\n * @category Components\n */\nexport class AnimationComponent extends Component {\n private modelClips: THREE.AnimationClip[];\n private importedClips: ImportedClipEntry[];\n private clipById: Map<string, THREE.AnimationClip>;\n private clipEntriesById: Map<string, AnimationClipCatalogEntry>;\n\n /** Combined ordered list of clips (model + external) currently loaded. */\n clips: THREE.AnimationClip[];\n /** Per-clip metadata used by the inspector. */\n clipCatalog: AnimationClipCatalogEntry[];\n /** Display names of clips available for state-machine bindings. */\n availableClips: string[];\n /** URLs/paths of external clip sources (saved with the project). */\n externalClipSources: string[];\n /** Whether playback is currently paused. */\n paused: boolean;\n /** Play the active clip in reverse. */\n reverse: boolean;\n /** Playback speed multiplier (`1` = real-time). */\n timeScale: number;\n /** Default cross-fade duration in seconds when switching states. */\n crossFadeDuration: number;\n /** All state-machine entries authored on this entity. */\n states: AnimationStateMachine[];\n /** State currently being played, or `null` if none. */\n active: AnimationStateMachine | null;\n /** Name of the {@link active} state, or `null` if none. */\n activeStateName: string | null;\n /** Manager that drives state transitions; mutate via {@link addState}/{@link switchState}. */\n stateManager: AnimationStateManager;\n\n constructor(options: AnimationComponentOptions = {}) {\n super();\n\n this.modelClips = Array.isArray(options.clips) ? [...options.clips] : [];\n this.importedClips = [];\n this.clipById = new Map<string, THREE.AnimationClip>();\n this.clipEntriesById = new Map<string, AnimationClipCatalogEntry>();\n this.clips = [];\n this.clipCatalog = [];\n this.availableClips = [];\n this.externalClipSources = [];\n\n this.setExternalClipSources(options.externalClipSources ?? []);\n this.refreshClipCatalog();\n\n this.paused = options.paused ?? false;\n this.reverse = options.reverse ?? false;\n this.timeScale = options.timeScale ?? 1;\n this.crossFadeDuration = options.crossFadeDuration ?? 0;\n\n this.stateManager = new AnimationStateManager();\n this.states = this.stateManager.listStates();\n this.active = this.stateManager.getActiveState();\n this.activeStateName = this.active?.name ?? null;\n\n if (Array.isArray(options.states) && options.states.length > 0) {\n for (const entry of options.states) {\n this.addState(entry.name, entry.clip, entry.loop ?? false);\n }\n }\n // else {\n // for (const clip of this.clips) {\n // this.addState(clip.name || \"Default\", clip.name, false);\n // }\n // }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n this.switchState(options.activeState, !this.paused);\n }\n }\n\n private refreshClipCatalog(): void {\n const catalog: AnimationClipCatalogEntry[] = [];\n const nameCounts = new Map<string, number>();\n const nextById = new Map<string, THREE.AnimationClip>();\n const nextEntriesById = new Map<string, AnimationClipCatalogEntry>();\n\n for (const [index, clip] of this.modelClips.entries()) {\n const name = typeof clip?.name === \"string\" && clip.name.length > 0\n ? clip.name\n : `Clip ${index + 1}`;\n const id = `model:${index}:${name}`;\n const count = (nameCounts.get(name) ?? 0) + 1;\n nameCounts.set(name, count);\n\n const entry: AnimationClipCatalogEntry = {\n id,\n name,\n label: count > 1 ? `${name} (${count})` : name,\n clip,\n source: \"model\",\n sourceUrl: null,\n };\n\n catalog.push(entry);\n nextById.set(id, clip);\n nextEntriesById.set(id, entry);\n }\n\n for (const [index, imported] of this.importedClips.entries()) {\n const clip = imported.clip;\n const name = typeof clip?.name === \"string\" && clip.name.length > 0\n ? clip.name\n : `Clip ${index + 1}`;\n const sourceUrl = imported.sourceUrl;\n const id = `external:${index}:${name}`;\n const count = (nameCounts.get(name) ?? 0) + 1;\n nameCounts.set(name, count);\n\n const sourceSuffix = sourceUrl\n ? sourceUrl.split(\"/\").pop() ?? sourceUrl\n : \"external\";\n\n const entry: AnimationClipCatalogEntry = {\n id,\n name,\n label:\n count > 1\n ? `${name} (${count}) • ${sourceSuffix}`\n : `${name} • ${sourceSuffix}`,\n clip,\n source: \"external\",\n sourceUrl,\n };\n\n catalog.push(entry);\n nextById.set(id, clip);\n nextEntriesById.set(id, entry);\n }\n\n this.clipById = nextById;\n this.clipEntriesById = nextEntriesById;\n this.clipCatalog = catalog;\n this.clips = catalog.map((entry) => entry.clip);\n this.availableClips = catalog.map((entry) => entry.name);\n }\n\n private refreshStateRefs(): void {\n this.states = this.stateManager.listStates();\n this.active = this.stateManager.getActiveState();\n this.activeStateName = this.active?.name ?? null;\n }\n\n private resolveClipRef(clipRef: string): { id: string; clip: THREE.AnimationClip } | null {\n const trimmed = clipRef.trim();\n if (!trimmed) {\n return null;\n }\n\n const byId = this.clipById.get(trimmed);\n if (byId) {\n return { id: trimmed, clip: byId };\n }\n\n const byName = this.clipCatalog.find((entry) => entry.name === trimmed);\n if (!byName) {\n return null;\n }\n\n return { id: byName.id, clip: byName.clip };\n }\n\n setModelClips(clips: THREE.AnimationClip[]): void {\n this.modelClips = Array.isArray(clips) ? [...clips] : [];\n this.refreshClipCatalog();\n }\n\n setImportedClips(\n clips: THREE.AnimationClip[] | ImportedClipEntry[],\n ): void {\n if (!Array.isArray(clips)) {\n this.importedClips = [];\n this.refreshClipCatalog();\n return;\n }\n\n this.importedClips = clips\n .map((entry) => {\n if (entry instanceof THREE.AnimationClip) {\n return { clip: entry, sourceUrl: null };\n }\n\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n\n const candidate = entry as Partial<ImportedClipEntry>;\n if (!(candidate.clip instanceof THREE.AnimationClip)) {\n return null;\n }\n\n return {\n clip: candidate.clip,\n sourceUrl:\n typeof candidate.sourceUrl === \"string\" && candidate.sourceUrl.length > 0\n ? candidate.sourceUrl\n : null,\n };\n })\n .filter((entry): entry is ImportedClipEntry => entry !== null);\n\n this.refreshClipCatalog();\n }\n\n setExternalClipSources(sources: string[]): void {\n if (!Array.isArray(sources)) {\n this.externalClipSources = [];\n return;\n }\n\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const source of sources) {\n if (typeof source !== \"string\") {\n continue;\n }\n\n const trimmed = source.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n normalized.push(trimmed);\n }\n\n this.externalClipSources = normalized;\n }\n\n addState(name: string, clipRef: string, loop = false): AnimationStateMachine | null {\n if (!name.trim()) {\n return null;\n }\n\n const resolved = this.resolveClipRef(clipRef);\n if (!resolved) {\n return null;\n }\n\n const state = this.stateManager.createState(name, resolved.clip, {}, loop, resolved.id);\n this.refreshStateRefs();\n return state;\n }\n\n setStates(states: Array<{ name: string; clip: string; clipId?: string; loop?: boolean }>): void {\n const previousActive = this.activeStateName;\n this.stateManager.clear();\n\n for (const state of states) {\n if (!state.name.trim()) {\n continue;\n }\n\n let createdState: AnimationStateMachine | null = null;\n\n if (typeof state.clipId === \"string\" && state.clipId.trim().length > 0) {\n createdState = this.addState(state.name, state.clipId, Boolean(state.loop));\n }\n\n if (!createdState) {\n this.addState(state.name, state.clip, Boolean(state.loop));\n }\n }\n\n if (previousActive) {\n this.stateManager.switchState(previousActive, !this.paused);\n }\n\n this.refreshStateRefs();\n }\n\n getStateConfigs(): Array<{ name: string; clip: string; clipId: string | null; loop: boolean }> {\n return this.states.map((state) => ({\n name: state.name,\n clip: state.clip.name,\n clipId: state.clipId,\n loop: state.loop,\n }));\n }\n\n setActiveState(name: string | null, autoPlay = true): boolean {\n if (!name) {\n const stopped = this.stateManager.stopState();\n this.paused = true;\n this.refreshStateRefs();\n return stopped;\n }\n\n return this.switchState(name, autoPlay);\n }\n\n removeState(name: string): boolean {\n const removed = this.stateManager.removeState(name);\n if (removed) {\n this.refreshStateRefs();\n }\n return removed;\n }\n\n switchState(name: string, autoPlay = true): boolean {\n const state = this.stateManager.switchState(name, autoPlay);\n if (!state) {\n return false;\n }\n\n this.paused = !state.isPlaying;\n this.refreshStateRefs();\n return true;\n }\n\n playState(name?: string): boolean {\n const played = this.stateManager.playState(name);\n if (!played) {\n return false;\n }\n\n this.paused = false;\n this.refreshStateRefs();\n return true;\n }\n\n pauseState(name?: string): boolean {\n const paused = this.stateManager.pauseState(name);\n if (!paused) {\n return false;\n }\n\n this.paused = true;\n this.refreshStateRefs();\n return true;\n }\n\n stopState(name?: string): boolean {\n const stopped = this.stateManager.stopState(name);\n if (!stopped) {\n return false;\n }\n\n this.paused = true;\n this.refreshStateRefs();\n return true;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Runtime camera mode. `3d` is a free camera; `ar` is composited over a tracked\n * image/face feed; `xr` is driven by an immersive WebXR session (the headset\n * owns the pose and projection — locomotion moves the camera's XR rig parent).\n */\nexport type CameraRuntimeType = \"3d\" | \"ar\" | \"xr\";\n/** Projection model. */\nexport type CameraProjection = \"perspective\" | \"orthographic\";\n\n/** Optional initializer for {@link CameraComponent}. Any field omitted falls back to the defaults documented on the component. */\nexport type CameraComponentOptions = {\n /** Pre-built three.js camera. When omitted the component creates one from {@link projection}. */\n camera?: THREE.Camera;\n /** Runtime camera mode. */\n type?: CameraRuntimeType;\n /** Mark this camera as the default camera the renderer uses. */\n isDefault?: boolean;\n /** Projection model. */\n projection?: CameraProjection;\n /** Vertical field of view in **degrees** (perspective only). */\n fov?: number;\n /** Near clip plane in world units. */\n near?: number;\n /** Far clip plane in world units. */\n far?: number;\n /** Left edge of the orthographic frustum in world units. */\n left?: number;\n /** Right edge of the orthographic frustum in world units. */\n right?: number;\n /** Top edge of the orthographic frustum in world units. */\n top?: number;\n /** Bottom edge of the orthographic frustum in world units. */\n bottom?: number;\n /** Zoom multiplier (`1` = no zoom). */\n zoom?: number;\n};\n\nconst DEFAULT_FOV = 50;\nconst DEFAULT_NEAR = 0.1;\nconst DEFAULT_FAR = 2000;\nconst DEFAULT_ORTHO_LEFT = -5;\nconst DEFAULT_ORTHO_RIGHT = 5;\nconst DEFAULT_ORTHO_TOP = 5;\nconst DEFAULT_ORTHO_BOTTOM = -5;\nconst DEFAULT_ZOOM = 1;\n\nfunction inferProjection(camera: THREE.Camera | undefined): CameraProjection {\n if (camera instanceof THREE.OrthographicCamera) {\n return \"orthographic\";\n }\n\n return \"perspective\";\n}\n\nfunction readCameraNear(camera: THREE.Camera | undefined): number | null {\n if (\n camera &&\n \"near\" in camera &&\n typeof camera.near === \"number\" &&\n Number.isFinite(camera.near)\n ) {\n return camera.near;\n }\n\n return null;\n}\n\nfunction readCameraFar(camera: THREE.Camera | undefined): number | null {\n if (\n camera &&\n \"far\" in camera &&\n typeof camera.far === \"number\" &&\n Number.isFinite(camera.far)\n ) {\n return camera.far;\n }\n\n return null;\n}\n\nfunction inferFov(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.PerspectiveCamera && Number.isFinite(camera.fov)) {\n return camera.fov;\n }\n\n return DEFAULT_FOV;\n}\n\nfunction inferNear(camera: THREE.Camera | undefined): number {\n const near = readCameraNear(camera);\n if (near !== null) {\n return near;\n }\n\n return DEFAULT_NEAR;\n}\n\nfunction inferFar(camera: THREE.Camera | undefined): number {\n const far = readCameraFar(camera);\n if (far !== null) {\n return far;\n }\n\n return DEFAULT_FAR;\n}\n\nfunction inferOrthoLeft(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.left)) {\n return camera.left;\n }\n\n return DEFAULT_ORTHO_LEFT;\n}\n\nfunction inferOrthoRight(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.right)) {\n return camera.right;\n }\n\n return DEFAULT_ORTHO_RIGHT;\n}\n\nfunction inferOrthoTop(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.top)) {\n return camera.top;\n }\n\n return DEFAULT_ORTHO_TOP;\n}\n\nfunction inferOrthoBottom(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.bottom)) {\n return camera.bottom;\n }\n\n return DEFAULT_ORTHO_BOTTOM;\n}\n\nfunction inferZoom(camera: THREE.Camera | undefined): number {\n if (\n camera &&\n \"zoom\" in camera &&\n typeof camera.zoom === \"number\" &&\n Number.isFinite(camera.zoom)\n ) {\n return camera.zoom;\n }\n\n return DEFAULT_ZOOM;\n}\n\n/**\n * Camera entity state. Supports perspective and orthographic projections, a\n * `3d` or `ar` runtime type, and an `isDefault` flag for the camera that the\n * preview/editor renders through. Field-of-view, near/far, ortho frustum, and\n * zoom are persisted; the live `THREE.Camera` is recreated when the project loads.\n *\n * @category Components\n */\nexport class CameraComponent extends Component {\n /** Live three.js camera. Recreated when the project loads to match {@link projection}. */\n camera: THREE.Camera;\n /** Runtime camera mode (`3d` or `ar`). */\n type: CameraRuntimeType;\n /** When `true`, this is the active rendering camera. Only one camera per scene should be the default. */\n isDefault: boolean;\n /** Active projection model (`perspective` or `orthographic`). */\n projection: CameraProjection;\n /** Vertical field of view in **degrees**. Used when {@link projection} is `perspective`. */\n fov: number;\n /** Near clip plane in world units. */\n near: number;\n /** Far clip plane in world units. */\n far: number;\n /** Left edge of the orthographic frustum (orthographic only). */\n left: number;\n /** Right edge of the orthographic frustum (orthographic only). */\n right: number;\n /** Top edge of the orthographic frustum (orthographic only). */\n top: number;\n /** Bottom edge of the orthographic frustum (orthographic only). */\n bottom: number;\n /** Zoom multiplier applied to the projection. */\n zoom: number;\n\n constructor(payload: CameraComponentOptions = {}) {\n super();\n\n this.camera = payload.camera ?? new THREE.PerspectiveCamera();\n this.type = payload.type ?? \"3d\";\n this.isDefault = typeof payload.isDefault === \"boolean\" ? payload.isDefault : false;\n this.projection = payload.projection ?? inferProjection(payload.camera);\n this.fov =\n typeof payload.fov === \"number\" && Number.isFinite(payload.fov)\n ? payload.fov\n : inferFov(payload.camera);\n this.near =\n typeof payload.near === \"number\" && Number.isFinite(payload.near)\n ? payload.near\n : inferNear(payload.camera);\n this.far =\n typeof payload.far === \"number\" && Number.isFinite(payload.far)\n ? payload.far\n : inferFar(payload.camera);\n this.left =\n typeof payload.left === \"number\" && Number.isFinite(payload.left)\n ? payload.left\n : inferOrthoLeft(payload.camera);\n this.right =\n typeof payload.right === \"number\" && Number.isFinite(payload.right)\n ? payload.right\n : inferOrthoRight(payload.camera);\n this.top =\n typeof payload.top === \"number\" && Number.isFinite(payload.top)\n ? payload.top\n : inferOrthoTop(payload.camera);\n this.bottom =\n typeof payload.bottom === \"number\" && Number.isFinite(payload.bottom)\n ? payload.bottom\n : inferOrthoBottom(payload.camera);\n this.zoom =\n typeof payload.zoom === \"number\" && Number.isFinite(payload.zoom)\n ? payload.zoom\n : inferZoom(payload.camera);\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * @internal Default options applied when no override is provided.\n */\nconst DEFAULT_AUDIO_OPTIONS = {\n autoplay: false,\n loop: false,\n pitch: 1,\n volume: 1,\n positional: false,\n refDistance: 1,\n distanceModel: \"inverse\",\n rolloffFactor: 1,\n};\n\n/**\n * Plays an audio clip from `path`. Supports both global stereo (`positional:\n * false`) and 3D positional audio with the configured distance model.\n * Runtime fields (`object`, `audio`, `isPlaying`, `isPaused`) are recreated\n * when the project loads and are never persisted to saved snapshots.\n *\n * @category Components\n */\nexport class AudioComponent extends Component {\n /** Source URL or `localasset://` path of the audio file. */\n path: string;\n /**\n * Playback options.\n *\n * | Field | Default | Description |\n * |---|---|---|\n * | `autoplay` | `false` | Start playback as soon as the clip is loaded. |\n * | `loop` | `false` | Loop playback indefinitely. |\n * | `pitch` | `1` | Playback rate multiplier (`1` = normal speed/pitch). |\n * | `volume` | `1` | Linear gain in `[0, 1]`. |\n * | `positional` | `false` | When `true`, audio is spatialized using the entity's transform. |\n * | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |\n * | `distanceModel` | `\"inverse\"` | WebAudio distance model (`linear`, `inverse`, `exponential`). |\n * | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. |\n */\n options: typeof DEFAULT_AUDIO_OPTIONS;\n /** Live three.js object hosting the audio (a parented `Audio`/`PositionalAudio`). `null` until built. */\n object: THREE.Object3D | null;\n /** Live three.js audio source. `null` until built. Recreated when the project loads. */\n audio: THREE.Audio<GainNode> | THREE.PositionalAudio | null;\n\n /**\n * Whether the audio should be playing. Managed by `AudioSystem` in preview.\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link play} / {@link stop}.\n */\n declare isPlaying: boolean;\n\n /**\n * Whether the audio is paused mid-playback (position is preserved).\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link pause} / {@link play} / {@link stop}.\n */\n declare isPaused: boolean;\n\n constructor(\n path: string,\n options: Partial<typeof DEFAULT_AUDIO_OPTIONS> = {},\n ) {\n super();\n this.path = path;\n this.options = {\n ...DEFAULT_AUDIO_OPTIONS,\n ...options,\n };\n this.object = null;\n this.audio = null;\n\n // Runtime-only playback state. Non-enumerable so these values are never\n // written into save data, debug snapshots, or undo history.\n Object.defineProperty(this, \"isPlaying\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(this, \"isPaused\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n\n /**\n * Signals `AudioSystem` to start (or resume) playback.\n * Has no direct effect in the editor — `AudioSystem` drives the actual\n * THREE.js call in preview.\n */\n play(): void {\n this.isPlaying = true;\n this.isPaused = false;\n }\n\n /**\n * Signals `AudioSystem` to pause playback, preserving the current position.\n * Calling {@link play} afterwards resumes from where it paused.\n * No-op if not currently playing.\n */\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n /**\n * Signals `AudioSystem` to stop playback and reset the playback position.\n */\n stop(): void {\n this.isPlaying = false;\n this.isPaused = false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Skybox rendering modes. `none` disables skybox rendering entirely. */\nexport type EnvironmentSkyboxType = \"gradient\" | \"color\" | \"image\" | \"none\";\n/** Gradient distribution applied when {@link EnvironmentSkyboxState.type} is `\"gradient\"`. */\nexport type EnvironmentGradientEffect = \"radial\" | \"linear\" | \"angular\";\n/** Fog distance models. `none` disables fog. */\nexport type EnvironmentFogType = \"linear\" | \"exponential\" | \"none\";\n\n/** Skybox configuration. Only the fields relevant to {@link type} are read at render time. */\nexport type EnvironmentSkyboxState = {\n /** Active skybox mode. */\n type: EnvironmentSkyboxType;\n /** Solid color used when {@link type} is `\"color\"`. `#rrggbb`. */\n color: string;\n /** URL or `localasset://` path of the equirectangular image used when {@link type} is `\"image\"`. */\n imageUrl?: string;\n /** Gradient parameters used when {@link type} is `\"gradient\"`. */\n gradient: {\n /** Ordered list of color stops as `#rrggbb` strings. */\n colors: string[];\n /** Gradient distribution. */\n effect: EnvironmentGradientEffect;\n };\n};\n\n/** Fog configuration. Mirrors three.js `Fog` / `FogExp2`. */\nexport type EnvironmentFogState = {\n /** Active fog model. */\n type: EnvironmentFogType;\n /** Fog color as `#rrggbb`. */\n color: string;\n /** Linear-fog parameters used when {@link type} is `\"linear\"`. */\n linear: {\n /** Distance at which fog begins to take effect. */\n near: number;\n /** Distance at which fog reaches full opacity. */\n far: number;\n };\n /** Exponential-fog parameters used when {@link type} is `\"exponential\"`. */\n exponential: {\n /** Density coefficient. Higher values produce thicker fog. */\n density: number;\n };\n};\n\n/** World gravity vector applied by the physics system, in world units per second squared. */\nexport type EnvironmentGravityState = {\n /** Gravity along world X. */\n x: number;\n /** Gravity along world Y (negative pulls objects down). */\n y: number;\n /** Gravity along world Z. */\n z: number;\n};\n\n/** Aggregated authoring state owned by {@link Environment}. */\nexport type EnvironmentState = {\n /** Skybox configuration. */\n skybox: EnvironmentSkyboxState;\n /** Fog configuration. */\n fog: EnvironmentFogState;\n /** World gravity. */\n gravity: EnvironmentGravityState;\n /**\n * Fixed timestep (seconds) used by the physics accumulator loop.\n * Physics is stepped in fixed increments of this size each frame.\n * Default is `0.02` (50 Hz).\n */\n fixedTimeStep: number;\n};\n\nexport const DEFAULT_ENVIRONMENT_STATE: EnvironmentState = {\n skybox: {\n type: \"none\",\n color: \"#1e1e1e\",\n imageUrl: \"\",\n gradient: {\n colors: [\"#464766\", \"#657ea6\", \"#0f0e1a\"],\n effect: \"linear\",\n },\n },\n fog: {\n type: \"none\",\n color: \"#1e1e1e\",\n linear: {\n near: 1,\n far: 100,\n },\n exponential: {\n density: 0.002,\n },\n },\n gravity: {\n x: 0,\n y: -9.81,\n z: 0,\n },\n fixedTimeStep: 0.02,\n};\n\nfunction normalizeColors(colors: unknown): string[] {\n if (!Array.isArray(colors)) {\n return [...DEFAULT_ENVIRONMENT_STATE.skybox.gradient.colors];\n }\n\n const normalized = colors.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0,\n );\n if (normalized.length === 0) {\n return [...DEFAULT_ENVIRONMENT_STATE.skybox.gradient.colors];\n }\n\n return normalized;\n}\n\nfunction normalizeGradientEffect(value: unknown): EnvironmentGradientEffect {\n if (value === \"radial\" || value === \"linear\" || value === \"angular\") {\n return value;\n }\n\n return DEFAULT_ENVIRONMENT_STATE.skybox.gradient.effect;\n}\n\nfunction normalizeSkyboxType(value: unknown): EnvironmentSkyboxType {\n if (value === \"gradient\" || value === \"color\" || value === \"none\") {\n return value;\n }\n\n if (value === \"image\" || value === \"Image\") {\n return \"image\";\n }\n\n return DEFAULT_ENVIRONMENT_STATE.skybox.type;\n}\n\nfunction normalizeFogType(value: unknown): EnvironmentFogType {\n if (value === \"linear\" || value === \"exponential\" || value === \"none\") {\n return value;\n }\n\n return DEFAULT_ENVIRONMENT_STATE.fog.type;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n\n return value;\n}\n\n/**\n * Scene environment settings: skybox (gradient/color/image), fog\n * (linear/exponential), and gravity vector for the physics world.\n * Singleton-style — attached to one environment entity per scene.\n *\n * Use `world.getEnvironmentComponent()` to access this component directly\n * from a Behaviour script. Mutate `values` to change settings at runtime;\n * `EnvironmentSyncSystem` applies the changes on the next frame.\n *\n * @category Components\n */\nexport class Environment extends Component {\n /** Aggregated environment authoring state (skybox, fog, gravity). Saved with the project. */\n values: EnvironmentState;\n\n constructor(values?: Partial<EnvironmentState>) {\n super();\n\n const skybox = values?.skybox;\n const fog = values?.fog;\n const gravity = values?.gravity;\n this.values = {\n skybox: {\n type: normalizeSkyboxType(skybox?.type),\n color:\n typeof skybox?.color === \"string\"\n ? skybox.color\n : DEFAULT_ENVIRONMENT_STATE.skybox.color,\n imageUrl:\n typeof skybox?.imageUrl === \"string\"\n ? skybox.imageUrl\n : DEFAULT_ENVIRONMENT_STATE.skybox.imageUrl,\n gradient: {\n colors: normalizeColors(skybox?.gradient?.colors),\n effect: normalizeGradientEffect(skybox?.gradient?.effect),\n },\n },\n fog: {\n type: normalizeFogType(fog?.type),\n color:\n typeof fog?.color === \"string\"\n ? fog.color\n : DEFAULT_ENVIRONMENT_STATE.fog.color,\n linear: {\n near: toFiniteNumber(\n fog?.linear?.near,\n DEFAULT_ENVIRONMENT_STATE.fog.linear.near,\n ),\n far: toFiniteNumber(\n fog?.linear?.far,\n DEFAULT_ENVIRONMENT_STATE.fog.linear.far,\n ),\n },\n exponential: {\n density: toFiniteNumber(\n fog?.exponential?.density,\n DEFAULT_ENVIRONMENT_STATE.fog.exponential.density,\n ),\n },\n },\n gravity: {\n x: toFiniteNumber(gravity?.x, DEFAULT_ENVIRONMENT_STATE.gravity.x),\n y: toFiniteNumber(gravity?.y, DEFAULT_ENVIRONMENT_STATE.gravity.y),\n z: toFiniteNumber(gravity?.z, DEFAULT_ENVIRONMENT_STATE.gravity.z),\n },\n fixedTimeStep: toFiniteNumber(\n values?.fixedTimeStep,\n DEFAULT_ENVIRONMENT_STATE.fixedTimeStep,\n ),\n };\n }\n}\n","import { Component } from \"../Component\";\n\n/** Aggregated post-processing effect chain authored on the scene environment. Each sub-effect has its own `enabled` flag plus per-effect parameters. */\nexport type PostprocessingState = {\n /** Master toggle. When `false` no post-processing is applied even if individual effects are enabled. */\n postEnabled: boolean;\n /** Depth-of-field (bokeh) effect. */\n dof: {\n /** Enable the effect. */\n enabled: boolean;\n /** Distance to the focal plane in world units. */\n focusDistance: number;\n /** Lens focal length controlling depth-of-field strength. */\n focalLength: number;\n /** Bokeh blur kernel scale. */\n bokehScale: number;\n };\n /** Bloom (HDR glow) effect. */\n bloom: {\n /** Enable the effect. */\n enabled: boolean;\n /** Strength of the bloom contribution. */\n intensity: number;\n /** Luminance threshold above which pixels bloom. */\n threshold: number;\n /** Blur radius applied to the bloom buffer. */\n radius: number;\n };\n /** Vignette (corner darkening) effect. */\n vignette: {\n /** Enable the effect. */\n enabled: boolean;\n /** Distance from screen center where the vignette begins. */\n offset: number;\n /** Maximum darkness applied at screen edges. */\n darkness: number;\n };\n /** Chromatic aberration (RGB channel offset) effect. */\n chromAberration: {\n /** Enable the effect. */\n enabled: boolean;\n /** Horizontal channel offset. */\n offsetX: number;\n /** Vertical channel offset. */\n offsetY: number;\n };\n /** Film-noise overlay. */\n noise: {\n /** Enable the effect. */\n enabled: boolean;\n /** Opacity of the noise layer in `[0, 1]`. */\n opacity: number;\n };\n /** Pixelation (mosaic) effect. */\n pixelation: {\n /** Enable the effect. */\n enabled: boolean;\n /** Pixel block size in screen pixels. */\n granularity: number;\n };\n /** Tone-mapping exposure control. */\n toneMapping: {\n /** Enable the effect. */\n enabled: boolean;\n /** Exposure multiplier applied before tone-mapping. */\n exposure: number;\n };\n /** Hue/saturation color grading. */\n hueSaturation: {\n /** Enable the effect. */\n enabled: boolean;\n /** Hue rotation in radians. */\n hue: number;\n /** Saturation offset (`0` = unchanged, `>0` = more saturated). */\n saturation: number;\n };\n /** Sepia color grade. */\n sepia: {\n /** Enable the effect. */\n enabled: boolean;\n /** Blend strength between original and sepia in `[0, 1]`. */\n intensity: number;\n };\n /** SMAA antialiasing pass. */\n smaa: {\n /** Enable the effect. */\n enabled: boolean;\n };\n /** Screen-space ambient occlusion. */\n ssao: {\n /** Enable the effect. */\n enabled: boolean;\n /** Strength of the AO contribution. */\n intensity: number;\n /** Sampling radius in world units. */\n radius: number;\n };\n /** Dot-screen (halftone) effect. */\n dotScreen: {\n /** Enable the effect. */\n enabled: boolean;\n /** Pattern scale (legacy field; use {@link scale} where available). */\n dotScreenScale: number;\n /** Pattern rotation in radians (legacy field; use {@link angle} where available). */\n dotScreenAngle: number;\n /** Pattern rotation in radians. */\n angle?: number;\n /** Pattern scale. */\n scale?: number;\n /** Three.js blend function override. */\n blendFunction?: number;\n /** Effect opacity in `[0, 1]`. */\n opacity?: number;\n };\n /** Glitch effect (digital corruption simulation). */\n glitch: {\n /** Enable the effect. */\n enabled: boolean;\n /** Three.js blend function override. */\n blendFunction?: number;\n /** RGB channel offset applied during a glitch burst. */\n chromaticAberrationOffset?: { x: number; y: number } | [number, number];\n /** `[min, max]` delay (seconds) between glitch bursts. */\n delay?: [number, number];\n /** `[min, max]` duration (seconds) of each glitch burst. */\n duration?: [number, number];\n /** Glitch displacement strength (scalar or per-axis). */\n strength?: number | { x: number; y: number };\n /** Size of the displacement texture sampled by the glitch shader. */\n dtSize?: number;\n /** Fraction of columns affected during a glitch burst. */\n columns?: number;\n /** Ratio between weak and strong glitch bursts. */\n ratio?: number;\n /** Glitch mode label (matches the postprocessing library's mode enum). */\n mode?: string;\n /** Force the glitch to remain active. */\n active?: boolean;\n };\n};\n\nexport const DEFAULT_POSTPROCESSING_STATE: PostprocessingState = {\n postEnabled: false,\n dof: {\n enabled: false,\n focusDistance: 0.015,\n focalLength: 0.018,\n bokehScale: 3,\n },\n bloom: {\n enabled: false,\n intensity: 1.2,\n threshold: 0.2,\n radius: 0.7,\n },\n vignette: {\n enabled: false,\n offset: 0.05,\n darkness: 1.2,\n },\n chromAberration: {\n enabled: false,\n offsetX: 0.003,\n offsetY: 0.003,\n },\n noise: {\n enabled: false,\n opacity: 0.12,\n },\n pixelation: {\n enabled: false,\n granularity: 6,\n },\n toneMapping: {\n enabled: false,\n exposure: 1.3,\n },\n hueSaturation: {\n enabled: false,\n hue: 0.05,\n saturation: 0.2,\n },\n sepia: {\n enabled: false,\n intensity: 0.5,\n },\n smaa: {\n enabled: false,\n },\n ssao: {\n enabled: false,\n intensity: 1.5,\n radius: 0.25,\n },\n dotScreen: {\n enabled: false,\n dotScreenScale: 1.2,\n dotScreenAngle: 1.57,\n scale: 1.2,\n angle: 1.57,\n blendFunction: undefined,\n opacity: undefined,\n },\n glitch: {\n enabled: false,\n blendFunction: undefined,\n chromaticAberrationOffset: undefined,\n delay: undefined,\n duration: undefined,\n strength: undefined,\n dtSize: undefined,\n columns: undefined,\n ratio: undefined,\n mode: undefined,\n active: undefined,\n },\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n\n return value;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== \"boolean\") {\n return fallback;\n }\n\n return value;\n}\n\nfunction normalizeNumberTuple(value: unknown): [number, number] | undefined {\n if (!Array.isArray(value) || value.length !== 2) {\n return undefined;\n }\n\n if (\n typeof value[0] !== \"number\" ||\n !Number.isFinite(value[0]) ||\n typeof value[1] !== \"number\" ||\n !Number.isFinite(value[1])\n ) {\n return undefined;\n }\n\n return [value[0], value[1]];\n}\n\nfunction normalizePostprocessing(\n value: Partial<PostprocessingState> | undefined,\n): PostprocessingState {\n const postprocessing = asRecord(value);\n const defaults = DEFAULT_POSTPROCESSING_STATE;\n\n const dof = asRecord(postprocessing?.dof);\n const bloom = asRecord(postprocessing?.bloom);\n const vignette = asRecord(postprocessing?.vignette);\n const chromAberration = asRecord(postprocessing?.chromAberration);\n const noise = asRecord(postprocessing?.noise);\n const pixelation = asRecord(postprocessing?.pixelation);\n const toneMapping = asRecord(postprocessing?.toneMapping);\n const hueSaturation = asRecord(postprocessing?.hueSaturation);\n const sepia = asRecord(postprocessing?.sepia);\n const smaa = asRecord(postprocessing?.smaa);\n const ssao = asRecord(postprocessing?.ssao);\n const dotScreen = asRecord(postprocessing?.dotScreen);\n const glitch = asRecord(postprocessing?.glitch);\n const glitchChromaticAberrationOffset = asRecord(\n glitch?.chromaticAberrationOffset,\n );\n const glitchStrength = asRecord(glitch?.strength);\n\n const dotScreenScale = toFiniteNumber(\n dotScreen?.dotScreenScale,\n defaults.dotScreen.dotScreenScale,\n );\n const dotScreenAngle = toFiniteNumber(\n dotScreen?.dotScreenAngle,\n defaults.dotScreen.dotScreenAngle,\n );\n\n const normalizedGlitchStrength =\n typeof glitch?.strength === \"number\" && Number.isFinite(glitch.strength)\n ? glitch.strength\n : glitchStrength &&\n typeof glitchStrength.x === \"number\" &&\n Number.isFinite(glitchStrength.x) &&\n typeof glitchStrength.y === \"number\" &&\n Number.isFinite(glitchStrength.y)\n ? { x: glitchStrength.x, y: glitchStrength.y }\n : undefined;\n\n const normalizedGlitchChromaticAberrationOffset =\n normalizeNumberTuple(glitch?.chromaticAberrationOffset) ??\n (glitchChromaticAberrationOffset &&\n typeof glitchChromaticAberrationOffset.x === \"number\" &&\n Number.isFinite(glitchChromaticAberrationOffset.x) &&\n typeof glitchChromaticAberrationOffset.y === \"number\" &&\n Number.isFinite(glitchChromaticAberrationOffset.y)\n ? {\n x: glitchChromaticAberrationOffset.x,\n y: glitchChromaticAberrationOffset.y,\n }\n : undefined);\n\n return {\n postEnabled: toBoolean(postprocessing?.postEnabled, defaults.postEnabled),\n dof: {\n enabled: toBoolean(dof?.enabled, defaults.dof.enabled),\n focusDistance: toFiniteNumber(dof?.focusDistance, defaults.dof.focusDistance),\n focalLength: toFiniteNumber(dof?.focalLength, defaults.dof.focalLength),\n bokehScale: toFiniteNumber(dof?.bokehScale, defaults.dof.bokehScale),\n },\n bloom: {\n enabled: toBoolean(bloom?.enabled, defaults.bloom.enabled),\n intensity: toFiniteNumber(bloom?.intensity, defaults.bloom.intensity),\n threshold: toFiniteNumber(bloom?.threshold, defaults.bloom.threshold),\n radius: toFiniteNumber(bloom?.radius, defaults.bloom.radius),\n },\n vignette: {\n enabled: toBoolean(vignette?.enabled, defaults.vignette.enabled),\n offset: toFiniteNumber(vignette?.offset, defaults.vignette.offset),\n darkness: toFiniteNumber(vignette?.darkness, defaults.vignette.darkness),\n },\n chromAberration: {\n enabled: toBoolean(chromAberration?.enabled, defaults.chromAberration.enabled),\n offsetX: toFiniteNumber(chromAberration?.offsetX, defaults.chromAberration.offsetX),\n offsetY: toFiniteNumber(chromAberration?.offsetY, defaults.chromAberration.offsetY),\n },\n noise: {\n enabled: toBoolean(noise?.enabled, defaults.noise.enabled),\n opacity: toFiniteNumber(noise?.opacity, defaults.noise.opacity),\n },\n pixelation: {\n enabled: toBoolean(pixelation?.enabled, defaults.pixelation.enabled),\n granularity: toFiniteNumber(pixelation?.granularity, defaults.pixelation.granularity),\n },\n toneMapping: {\n enabled: toBoolean(toneMapping?.enabled, defaults.toneMapping.enabled),\n exposure: toFiniteNumber(toneMapping?.exposure, defaults.toneMapping.exposure),\n },\n hueSaturation: {\n enabled: toBoolean(hueSaturation?.enabled, defaults.hueSaturation.enabled),\n hue: toFiniteNumber(hueSaturation?.hue, defaults.hueSaturation.hue),\n saturation: toFiniteNumber(\n hueSaturation?.saturation,\n defaults.hueSaturation.saturation,\n ),\n },\n sepia: {\n enabled: toBoolean(sepia?.enabled, defaults.sepia.enabled),\n intensity: toFiniteNumber(sepia?.intensity, defaults.sepia.intensity),\n },\n smaa: {\n enabled: toBoolean(smaa?.enabled, defaults.smaa.enabled),\n },\n ssao: {\n enabled: toBoolean(ssao?.enabled, defaults.ssao.enabled),\n intensity: toFiniteNumber(ssao?.intensity, defaults.ssao.intensity),\n radius: toFiniteNumber(ssao?.radius, defaults.ssao.radius),\n },\n dotScreen: {\n enabled: toBoolean(dotScreen?.enabled, defaults.dotScreen.enabled),\n dotScreenScale,\n dotScreenAngle,\n scale: toFiniteNumber(dotScreen?.scale, dotScreenScale),\n angle: toFiniteNumber(dotScreen?.angle, dotScreenAngle),\n blendFunction:\n typeof dotScreen?.blendFunction === \"number\" &&\n Number.isFinite(dotScreen.blendFunction)\n ? dotScreen.blendFunction\n : defaults.dotScreen.blendFunction,\n opacity:\n typeof dotScreen?.opacity === \"number\" && Number.isFinite(dotScreen.opacity)\n ? dotScreen.opacity\n : defaults.dotScreen.opacity,\n },\n glitch: {\n enabled: toBoolean(glitch?.enabled, defaults.glitch.enabled),\n blendFunction:\n typeof glitch?.blendFunction === \"number\" && Number.isFinite(glitch.blendFunction)\n ? glitch.blendFunction\n : defaults.glitch.blendFunction,\n chromaticAberrationOffset:\n normalizedGlitchChromaticAberrationOffset,\n delay: normalizeNumberTuple(glitch?.delay) ?? defaults.glitch.delay,\n duration: normalizeNumberTuple(glitch?.duration) ?? defaults.glitch.duration,\n strength: normalizedGlitchStrength,\n dtSize:\n typeof glitch?.dtSize === \"number\" && Number.isFinite(glitch.dtSize)\n ? glitch.dtSize\n : defaults.glitch.dtSize,\n columns:\n typeof glitch?.columns === \"number\" && Number.isFinite(glitch.columns)\n ? glitch.columns\n : defaults.glitch.columns,\n ratio:\n typeof glitch?.ratio === \"number\" && Number.isFinite(glitch.ratio)\n ? glitch.ratio\n : defaults.glitch.ratio,\n mode: typeof glitch?.mode === \"string\" ? glitch.mode : defaults.glitch.mode,\n active: toBoolean(glitch?.active, defaults.glitch.active ?? false),\n },\n };\n}\n\n/**\n * Postprocessing stack settings (depth-of-field, bloom, vignette, chromatic\n * aberration, noise, pixelation, tone mapping, hue/saturation, sepia, SMAA,\n *\n * Use `world.getPostprocessingComponent()` to access this component directly\n * from a Behaviour script. Mutate `values` to toggle effects or adjust\n * parameters at runtime; `PostprocessingSyncSystem` applies changes next frame.\n * SSAO, dot-screen, glitch). The render system applies enabled effects in a\n * `postprocessing`-library composer when `postEnabled` is `true`. Singleton-\n * style — attached to one entity per scene.\n *\n * @category Components\n */\nexport class Postprocessing extends Component {\n /** Aggregated post-processing state. Saved with the project. */\n values: PostprocessingState;\n\n constructor(values?: Partial<PostprocessingState>) {\n super();\n this.values = normalizePostprocessing(values);\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Editable primitive kinds the mesh-geometry system can rebuild on the fly. `model` is a passthrough placeholder for entities that own a loaded GLTF/GLB instead. */\nexport type EditableMeshObjectKind =\n | \"capsule\"\n | \"cube\"\n | \"cylinder\"\n | \"model\"\n | \"plane\"\n | \"sphere\";\n\n/** Box geometry parameters in world units. */\nexport type CubeMeshParameters = {\n /** Box width along X. */\n width: number;\n /** Box height along Y. */\n height: number;\n /** Box depth along Z. */\n depth: number;\n};\n\n/** Plane geometry parameters in world units. */\nexport type PlaneMeshParameters = {\n /** Plane width along X. */\n width: number;\n /** Plane height along Y. */\n height: number;\n};\n\n/** Radius-only primitive parameters (sphere). */\nexport type RadiusMeshParameters = {\n /** Sphere radius in world units. */\n radius: number;\n};\n\n/** Radius + height primitive parameters (capsule, cylinder). */\nexport type RadiusHeightMeshParameters = {\n /** Radius of the cap/cylinder cross-section. */\n radius: number;\n /** Length of the straight section between caps (capsule) or full height (cylinder). */\n height: number;\n};\n\n/** Empty parameter set for `model` entities. */\nexport type ModelMeshParameters = Record<string, never>;\n\n/** Map from {@link EditableMeshObjectKind} to its parameter shape. */\nexport type MeshGeometryParametersByKind = {\n capsule: RadiusHeightMeshParameters;\n cube: CubeMeshParameters;\n cylinder: RadiusHeightMeshParameters;\n model: ModelMeshParameters;\n plane: PlaneMeshParameters;\n sphere: RadiusMeshParameters;\n};\n\nexport type MeshGeometryParameters =\n MeshGeometryParametersByKind[EditableMeshObjectKind];\n\nexport const DEFAULT_MESH_GEOMETRY_PARAMETERS: MeshGeometryParametersByKind = {\n capsule: { radius: 0.5, height: 1 },\n cube: { width: 1, height: 1, depth: 1 },\n cylinder: { radius: 0.5, height: 1 },\n model: {},\n plane: { width: 100, height: 100 },\n sphere: { radius: 0.5 },\n};\n\nconst GEOMETRY_TYPE_BY_KIND: Record<EditableMeshObjectKind, string> = {\n capsule: \"CapsuleGeometry\",\n cube: \"BoxGeometry\",\n cylinder: \"CylinderGeometry\",\n model: \"Model\",\n plane: \"PlaneGeometry\",\n sphere: \"SphereGeometry\",\n};\n\n/**\n * Editable geometry parameters for primitive meshes (cube, sphere, plane,\n * capsule, cylinder) and the placeholder for `model` entities. Holds the\n * authoring values plus shadow casting/receiving flags. The mesh-geometry\n * system rebuilds the underlying `BufferGeometry` when parameters change.\n *\n * @category Components\n */\nexport class MeshGeometryComponent extends Component {\n /** Primitive kind (`cube`, `sphere`, `plane`, `capsule`, `cylinder`) or `model` for loaded assets. */\n readonly kind: EditableMeshObjectKind;\n /** Three.js geometry class name (e.g. `\"BoxGeometry\"`, `\"SphereGeometry\"`). Derived from {@link kind}. */\n readonly geometryType: string;\n /** Editable parameters whose shape depends on {@link kind}. The mesh-geometry system rebuilds geometry when these change. */\n parameters: MeshGeometryParameters;\n /** Live three.js object whose geometry is being managed. `null` until the object is built. */\n object: THREE.Object3D | null;\n /** Human-readable model name shown in the inspector for `model` entities; empty for primitives. */\n modelName: string;\n /** Whether the mesh casts shadows in the renderer. */\n castShadow: boolean;\n /** Whether the mesh receives shadows in the renderer. */\n receiveShadow: boolean;\n\n constructor(\n kind: EditableMeshObjectKind,\n object: THREE.Object3D | null,\n parameters?: Partial<MeshGeometryParameters>,\n options?: {\n modelName?: string;\n castShadow?: boolean;\n receiveShadow?: boolean;\n },\n ) {\n super();\n\n this.kind = kind;\n this.geometryType = GEOMETRY_TYPE_BY_KIND[kind];\n this.object = object;\n this.modelName = options?.modelName ?? \"\";\n this.castShadow = options?.castShadow ?? false;\n this.receiveShadow = options?.receiveShadow ?? false;\n\n switch (kind) {\n case \"cube\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n ...(parameters as Partial<CubeMeshParameters> | undefined),\n };\n break;\n case \"plane\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.plane,\n ...(parameters as Partial<PlaneMeshParameters> | undefined),\n };\n break;\n case \"sphere\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere,\n ...(parameters as Partial<RadiusMeshParameters> | undefined),\n };\n break;\n case \"cylinder\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder,\n ...(parameters as Partial<RadiusHeightMeshParameters> | undefined),\n };\n break;\n case \"capsule\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule,\n ...(parameters as Partial<RadiusHeightMeshParameters> | undefined),\n };\n break;\n case \"model\":\n this.parameters = {};\n break;\n }\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\nimport type {\n CubeMeshParameters,\n MeshGeometryParameters,\n PlaneMeshParameters,\n RadiusHeightMeshParameters,\n RadiusMeshParameters,\n} from \"./MeshGeometry\";\nimport { DEFAULT_MESH_GEOMETRY_PARAMETERS } from \"./MeshGeometry\";\n\n/**\n * Per-instance transform stored inside {@link InstancedMeshComponent}.\n * All rotations are in radians.\n */\nexport type InstanceTransform = {\n position: { x: number; y: number; z: number };\n /** Euler rotation in radians (XYZ order). */\n rotation: { x: number; y: number; z: number };\n scale: { x: number; y: number; z: number };\n};\n\n/** Primitive geometry kinds and custom 3D model kind supported by instanced mesh rendering. */\nexport type InstancedMeshKind =\n | \"capsule\"\n | \"cube\"\n | \"cylinder\"\n | \"model\"\n | \"plane\"\n | \"sphere\";\n\n/** Default identity instance transform. */\nexport const DEFAULT_INSTANCE_TRANSFORM: InstanceTransform = {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n};\n\n/** Default geometry parameters per instanced mesh kind. For \"model\" kind, cube params are stored as a placeholder (unused). */\nexport const DEFAULT_INSTANCED_MESH_PARAMETERS: Record<\n InstancedMeshKind,\n MeshGeometryParameters\n> = {\n capsule: DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule,\n cube: DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n cylinder: DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder,\n model: DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n plane: DEFAULT_MESH_GEOMETRY_PARAMETERS.plane,\n sphere: DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere,\n};\n\n/**\n * Holds authored instanced-mesh data for an entity that renders as a\n * `THREE.InstancedMesh`. Supports primitive geometry kinds (cube, sphere,\n * plane, capsule, cylinder).\n *\n * The `instancedMesh` field is a live runtime reference that is **not**\n * serialized into snapshots — it is excluded by the snapshot normalizer in\n * `worldSnapshotUtils.ts` to prevent history churn.\n *\n * @category Components\n */\nexport class InstancedMeshComponent extends Component {\n /** Geometry kind for all instances. Use `\"model\"` for a custom GLTF/GLB asset. */\n meshKind: InstancedMeshKind;\n /**\n * Path to the GLTF/GLB asset when `meshKind === \"model\"`.\n * Serialized in snapshots and restored on hydration.\n */\n modelPath: string;\n /** Editable geometry parameters (width/height/depth, radius, etc.). Ignored when `meshKind === \"model\"`. */\n meshParameters: MeshGeometryParameters;\n /** Whether all instances cast shadows. */\n castShadow: boolean;\n /** Whether all instances receive shadows. */\n receiveShadow: boolean;\n /**\n * Ordered list of entity IDs for the instance slot entities owned by this group.\n * Each slot entity carries a `TransformComponent` that `InstancedMeshSystem`\n * reads every frame to build the per-instance matrix.\n */\n instanceEntityIds: number[];\n\n /**\n * Live runtime container managed by `InstancedMeshSystem`:\n * - For primitive kinds: a `THREE.InstancedMesh`.\n * - For `\"model\"` kind: a `THREE.Group` containing per-mesh `THREE.InstancedMesh` objects.\n * Excluded from snapshot serialization — do **not** read this in hydration code.\n */\n instancedMesh: THREE.Object3D | null;\n\n constructor(\n meshKind: InstancedMeshKind = \"cube\",\n meshParameters?: Partial<MeshGeometryParameters>,\n options?: {\n castShadow?: boolean;\n receiveShadow?: boolean;\n instanceEntityIds?: number[];\n modelPath?: string;\n },\n ) {\n super();\n this.meshKind = meshKind;\n this.modelPath = options?.modelPath ?? \"\";\n this.meshParameters = {\n ...DEFAULT_INSTANCED_MESH_PARAMETERS[meshKind],\n ...(meshParameters ?? {}),\n } as MeshGeometryParameters;\n this.castShadow = options?.castShadow ?? false;\n this.receiveShadow = options?.receiveShadow ?? false;\n this.instanceEntityIds = options?.instanceEntityIds ?? [];\n this.instancedMesh = null;\n }\n\n /** Sanitize and return a copy of the current mesh parameters with valid values. */\n getSanitizedParameters(): MeshGeometryParameters {\n const MIN_DIM = 0.01;\n const MIN_RAD = 0.001;\n const sanitize = (v: number, min: number) =>\n Number.isFinite(v) ? Math.max(min, v) : min;\n\n switch (this.meshKind) {\n case \"cube\": {\n const p = this.meshParameters as CubeMeshParameters;\n return {\n width: sanitize(p.width, MIN_DIM),\n height: sanitize(p.height, MIN_DIM),\n depth: sanitize(p.depth, MIN_DIM),\n };\n }\n case \"plane\": {\n const p = this.meshParameters as PlaneMeshParameters;\n return {\n width: sanitize(p.width, MIN_DIM),\n height: sanitize(p.height, MIN_DIM),\n };\n }\n case \"sphere\": {\n const p = this.meshParameters as RadiusMeshParameters;\n return { radius: sanitize(p.radius, MIN_RAD) };\n }\n case \"cylinder\":\n case \"capsule\": {\n const p = this.meshParameters as RadiusHeightMeshParameters;\n return {\n radius: sanitize(p.radius, MIN_RAD),\n height: sanitize(p.height, MIN_DIM),\n };\n }\n case \"model\":\n // No geometry parameters for model kind; return cube defaults as a placeholder.\n return DEFAULT_MESH_GEOMETRY_PARAMETERS.cube;\n }\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Marks an entity as an instance slot owned by an {@link InstancedMeshComponent} group entity.\n *\n * Instance slot entities are lightweight data containers — they carry\n * `TransformComponent` (the per-instance local transform) and this component,\n * but do **not** have an `Object3DRef`. Their transforms are consumed each\n * frame by `InstancedMeshSystem` to compose the instance matrix.\n *\n * @category Components\n */\nexport class InstanceSlotComponent extends Component {\n /** Entity ID of the owning `instancedMesh` group entity. */\n groupEntityId: number;\n /** Zero-based index of this slot within the group's `instanceEntityIds` array. */\n slotIndex: number;\n\n constructor(groupEntityId: number, slotIndex: number) {\n super();\n this.groupEntityId = groupEntityId;\n this.slotIndex = slotIndex;\n }\n}\n","import { Component } from \"../Component\";\n\ntype RapierRigidBody = import(\"@dimforge/rapier3d-compat\").RigidBody;\ntype RapierCollider = import(\"@dimforge/rapier3d-compat\").Collider;\n\n// ---------------------------------------------------------------------------\n// Rigidbody\n// ---------------------------------------------------------------------------\n\n/**\n * Rigidbody body type:\n * - `dynamic`: simulated by physics; affected by forces and gravity.\n * - `fixed`: immovable static body.\n * - `kinematicPosition`: moved by setting next position; ignores forces.\n * - `kinematicVelocity`: moved by setting velocity; ignores forces.\n */\nexport type RigidbodyType =\n | \"dynamic\"\n | \"fixed\"\n | \"kinematicPosition\"\n | \"kinematicVelocity\";\n\n/** Authoring state for the rigidbody half of {@link PhysicsComponent}. Saved with the project. */\nexport type RigidbodyState = {\n /** When `false`, the body is removed from physics simulation but kept in state. */\n enabled: boolean;\n /** Body type. See {@link RigidbodyType}. */\n type: RigidbodyType;\n /** Mass in kilograms. Only meaningful for `dynamic` bodies. */\n mass: number;\n /** Damping applied to linear velocity each step (`0` = none). */\n linearDamping: number;\n /** Damping applied to angular velocity each step (`0` = none). */\n angularDamping: number;\n /** Scale factor applied to world gravity for this body (`1` = full gravity, `0` = floating). */\n gravityScale: number;\n /** Allow the body to sleep when at rest to save simulation cost. */\n canSleep: boolean;\n /** Enable continuous collision detection to prevent tunneling for fast bodies. */\n ccdEnabled: boolean;\n /** Master toggle: when `true`, all linear motion is locked. */\n lockTranslations: boolean;\n /** Lock translation along world X. */\n lockTranslationX: boolean;\n /** Lock translation along world Y. */\n lockTranslationY: boolean;\n /** Lock translation along world Z. */\n lockTranslationZ: boolean;\n /** Master toggle: when `true`, all rotation is locked. */\n lockRotations: boolean;\n /** Lock rotation around world X. */\n lockRotationX: boolean;\n /** Lock rotation around world Y. */\n lockRotationY: boolean;\n /** Lock rotation around world Z. */\n lockRotationZ: boolean;\n};\n\nexport const DEFAULT_RIGIDBODY_STATE: RigidbodyState = {\n enabled: true,\n type: \"dynamic\",\n mass: 1,\n linearDamping: 0,\n angularDamping: 0,\n gravityScale: 1,\n canSleep: true,\n ccdEnabled: false,\n lockTranslations: false,\n lockTranslationX: false,\n lockTranslationY: false,\n lockTranslationZ: false,\n lockRotations: false,\n lockRotationX: false,\n lockRotationY: false,\n lockRotationZ: false,\n};\n\n// ---------------------------------------------------------------------------\n// Collider\n// ---------------------------------------------------------------------------\n\n/** Collider primitive shape. `trimesh` derives geometry from the entity's mesh. */\nexport type ColliderShape =\n | \"cuboid\"\n | \"ball\"\n | \"capsule\"\n | \"cylinder\"\n | \"trimesh\";\n\n/** Authoring state for the collider half of {@link PhysicsComponent}. Only the size fields relevant to {@link ColliderState.shape} are read at simulation time. */\nexport type ColliderState = {\n /** When `false`, the collider is removed from physics simulation but kept in state. */\n enabled: boolean;\n /** Collider primitive shape. */\n shape: ColliderShape;\n /** Local offset of the collider relative to the entity's transform, in world units. */\n offsetPosition: {\n /** Offset along local X. */\n x: number;\n /** Offset along local Y. */\n y: number;\n /** Offset along local Z. */\n z: number;\n };\n /** Local rotation offset in **radians** (Euler XYZ). */\n offsetRotation: {\n /** Rotation around local X (radians). */\n x: number;\n /** Rotation around local Y (radians). */\n y: number;\n /** Rotation around local Z (radians). */\n z: number;\n };\n /** FULL edge lengths for `cuboid` shape (NOT half-extents), in unscaled local units — multiplied by the entity world scale at collider build time. */\n size: {\n /** Half-extent along X. */\n x: number;\n /** Half-extent along Y. */\n y: number;\n /** Half-extent along Z. */\n z: number;\n };\n /** Radius for `ball`, `capsule`, and `cylinder` shapes. */\n radius: number;\n /** Height for `capsule` (segment length between caps) and `cylinder`. */\n height: number;\n /** Bounciness in `[0, 1]`. `0` is no bounce; `1` is perfectly elastic. */\n restitution: number;\n /** Surface friction coefficient. `0` is frictionless. */\n friction: number;\n /** When `true`, the collider reports overlaps but does not generate contact responses. */\n isSensor: boolean;\n};\n\nexport const DEFAULT_COLLIDER_STATE: ColliderState = {\n enabled: true,\n shape: \"cuboid\",\n offsetPosition: {\n x: 0,\n y: 0,\n z: 0,\n },\n offsetRotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n size: {\n x: 1,\n y: 1,\n z: 1,\n },\n radius: 0.5,\n height: 1,\n restitution: 0,\n friction: 0.5,\n isSensor: false,\n};\n\n// ---------------------------------------------------------------------------\n// PhysicsState\n// ---------------------------------------------------------------------------\n\n/** Combined authoring state for {@link PhysicsComponent}. Saved with the project. */\nexport type PhysicsState = {\n /** Rigid body settings. */\n rigidbody: RigidbodyState;\n /** Collider settings. */\n collider: ColliderState;\n};\n\nexport const DEFAULT_PHYSICS_STATE: PhysicsState = {\n rigidbody: DEFAULT_RIGIDBODY_STATE,\n collider: DEFAULT_COLLIDER_STATE,\n};\n\n// ---------------------------------------------------------------------------\n// Normalization helpers (private)\n// ---------------------------------------------------------------------------\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n return value;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== \"boolean\") {\n return fallback;\n }\n return value;\n}\n\nfunction toRigidbodyType(value: unknown, fallback: RigidbodyType): RigidbodyType {\n if (\n value === \"dynamic\" ||\n value === \"fixed\" ||\n value === \"kinematicPosition\" ||\n value === \"kinematicVelocity\"\n ) {\n return value;\n }\n return fallback;\n}\n\nfunction toColliderShape(value: unknown, fallback: ColliderShape): ColliderShape {\n if (\n value === \"cuboid\" ||\n value === \"ball\" ||\n value === \"capsule\" ||\n value === \"cylinder\" ||\n value === \"trimesh\"\n ) {\n return value;\n }\n return fallback;\n}\n\nfunction normalizeRigidbodyState(\n value: Partial<RigidbodyState> | undefined,\n): RigidbodyState {\n const source = asRecord(value);\n const defaults = DEFAULT_RIGIDBODY_STATE;\n // Legacy: if per-axis flags are absent, fall back to master toggle value.\n const legacyLockTranslations = toBoolean(\n source?.lockTranslations,\n defaults.lockTranslations,\n );\n const legacyLockRotations = toBoolean(\n source?.lockRotations,\n defaults.lockRotations,\n );\n\n const lockTranslationX = toBoolean(\n source?.lockTranslationX,\n legacyLockTranslations,\n );\n const lockTranslationY = toBoolean(\n source?.lockTranslationY,\n legacyLockTranslations,\n );\n const lockTranslationZ = toBoolean(\n source?.lockTranslationZ,\n legacyLockTranslations,\n );\n const lockRotationX = toBoolean(source?.lockRotationX, legacyLockRotations);\n const lockRotationY = toBoolean(source?.lockRotationY, legacyLockRotations);\n const lockRotationZ = toBoolean(source?.lockRotationZ, legacyLockRotations);\n\n return {\n enabled: toBoolean(source?.enabled, defaults.enabled),\n type: toRigidbodyType(source?.type, defaults.type),\n mass: Math.max(0.0001, toFiniteNumber(source?.mass, defaults.mass)),\n linearDamping: Math.max(\n 0,\n toFiniteNumber(source?.linearDamping, defaults.linearDamping),\n ),\n angularDamping: Math.max(\n 0,\n toFiniteNumber(source?.angularDamping, defaults.angularDamping),\n ),\n gravityScale: toFiniteNumber(source?.gravityScale, defaults.gravityScale),\n canSleep: toBoolean(source?.canSleep, defaults.canSleep),\n ccdEnabled: toBoolean(source?.ccdEnabled, defaults.ccdEnabled),\n lockTranslations: legacyLockTranslations,\n lockTranslationX,\n lockTranslationY,\n lockTranslationZ,\n lockRotations: legacyLockRotations,\n lockRotationX,\n lockRotationY,\n lockRotationZ,\n };\n}\n\nfunction normalizeColliderState(\n value: Partial<ColliderState> | undefined,\n): ColliderState {\n const source = asRecord(value);\n const defaults = DEFAULT_COLLIDER_STATE;\n const offsetPosition = asRecord(source?.offsetPosition);\n const offsetRotation = asRecord(source?.offsetRotation);\n const size = asRecord(source?.size);\n\n return {\n enabled: toBoolean(source?.enabled, defaults.enabled),\n shape: toColliderShape(source?.shape, defaults.shape),\n offsetPosition: {\n x: toFiniteNumber(offsetPosition?.x, defaults.offsetPosition.x),\n y: toFiniteNumber(offsetPosition?.y, defaults.offsetPosition.y),\n z: toFiniteNumber(offsetPosition?.z, defaults.offsetPosition.z),\n },\n offsetRotation: {\n x: toFiniteNumber(offsetRotation?.x, defaults.offsetRotation.x),\n y: toFiniteNumber(offsetRotation?.y, defaults.offsetRotation.y),\n z: toFiniteNumber(offsetRotation?.z, defaults.offsetRotation.z),\n },\n size: {\n x: Math.max(0.0001, toFiniteNumber(size?.x, defaults.size.x)),\n y: Math.max(0.0001, toFiniteNumber(size?.y, defaults.size.y)),\n z: Math.max(0.0001, toFiniteNumber(size?.z, defaults.size.z)),\n },\n radius: Math.max(0.0001, toFiniteNumber(source?.radius, defaults.radius)),\n height: Math.max(0.0001, toFiniteNumber(source?.height, defaults.height)),\n restitution: Math.max(0, toFiniteNumber(source?.restitution, defaults.restitution)),\n friction: Math.max(0, toFiniteNumber(source?.friction, defaults.friction)),\n isSensor: toBoolean(source?.isSensor, defaults.isSensor),\n };\n}\n\nexport function normalizePhysicsState(\n value: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> } | undefined,\n): PhysicsState {\n const source = asRecord(value);\n return {\n rigidbody: normalizeRigidbodyState(\n (source?.rigidbody as Partial<RigidbodyState>) ?? undefined,\n ),\n collider: normalizeColliderState(\n (source?.collider as Partial<ColliderState>) ?? undefined,\n ),\n };\n}\n\n// ---------------------------------------------------------------------------\n// PhysicsComponent\n// ---------------------------------------------------------------------------\n\n/**\n * Unified physics component combining a Rapier rigid body and a Rapier\n * collider into a single authoring and runtime container.\n *\n * Use `values.rigidbody` to configure body type, mass, damping, locks, etc.\n * Use `values.collider` to configure collider shape, size, offset, material\n * properties, and sensor mode.\n *\n * The runtime `rigidBody` and `collider` references are created by the physics\n * system when the project loads and are `null` until physics is initialized.\n *\n * @category Components\n */\n/**\n * Write a live Rapier ref as a NON-ENUMERABLE own property. Always via\n * defineProperty (mirroring ScriptObjectComponent's `instance` ref): a\n * history-restored clone that dropped the original slot would otherwise get an\n * ENUMERABLE property from plain assignment, leaking Rapier objects — and for\n * trimesh their huge vertex buffers — into snapshot/history/debug walks.\n */\n/**\n * A velocity waiting to be applied to the body, in world space.\n *\n * Needed because a throw is decided while the body is still kinematic (the hand\n * was holding it), and Rapier ignores velocity on kinematic bodies. Queueing it\n * lets `PhysicsSyncSystem` apply it in the same tick it turns the body dynamic\n * again, which is the only moment the velocity actually takes.\n */\nexport type PendingBodyVelocity = {\n linear: { x: number; y: number; z: number };\n angular: { x: number; y: number; z: number };\n};\n\nexport function setPhysicsLiveRef(\n component: PhysicsComponent,\n key: \"rigidBody\" | \"collider\" | \"pendingVelocity\",\n value:\n | RapierRigidBody\n | RapierCollider\n | PendingBodyVelocity\n | null,\n): void {\n Object.defineProperty(component, key, {\n value,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n}\n\nexport class PhysicsComponent extends Component {\n /** Authoring state. Saved with the project. */\n values: PhysicsState;\n /**\n * Velocity to apply the moment this body becomes dynamic again.\n *\n * Non-enumerable, like the Rapier refs — never serialized.\n */\n pendingVelocity?: PendingBodyVelocity | null;\n /**\n * Live Rapier rigid body. `null` until physics is initialized.\n * NON-ENUMERABLE — Rapier wrappers (and, for trimesh, their vertex buffers)\n * must never leak into snapshots/history/debug walks.\n */\n declare rigidBody: RapierRigidBody | null;\n /** Live Rapier collider. `null` until physics is initialized. NON-ENUMERABLE. */\n declare collider: RapierCollider | null;\n\n constructor(values?: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> }) {\n super();\n this.values = normalizePhysicsState(values);\n setPhysicsLiveRef(this, \"rigidBody\", null);\n setPhysicsLiveRef(this, \"collider\", null);\n }\n\n /**\n * Patch rigidbody and/or collider state. Each sub-object is deep-merged\n * with the current values via the respective normalizer.\n */\n setValues(patch: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> }): void {\n this.values = normalizePhysicsState({\n rigidbody: { ...this.values.rigidbody, ...(patch.rigidbody ?? {}) },\n collider: { ...this.values.collider, ...(patch.collider ?? {}) },\n });\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Renders a 2D image as a textured quad in the scene. Width/height are in\n * world units. Texture loading is handled by the image system, which\n * populates {@link ImageComponent.texture} and {@link ImageComponent.object}\n * asynchronously.\n *\n * @category Components\n */\nexport class ImageComponent extends Component {\n /** Source URL or `localasset://` path of the image file. */\n path: string;\n /** Width of the rendered quad in world units. */\n width: number;\n /** Height of the rendered quad in world units. */\n height: number;\n /** Loaded texture, populated asynchronously by the image system. `null` until loaded. */\n texture: THREE.Texture | null;\n /** Live three.js object representing the textured quad. `null` until built. */\n object: THREE.Object3D | null;\n\n constructor(path: string, width: number = 1, height: number = 1) {\n super();\n this.path = path;\n this.width = width;\n this.height = height;\n this.texture = null;\n this.object = null;\n }\n}\n","import { Component } from \"../Component\";\nimport type * as THREE from \"three\";\n\n\n/** Single uploaded image used as input to the image-target compiler. */\nexport type ImageTargetReference = {\n /** Stable target id assigned at compile time. Referenced by {@link ImageTargetAnchor.targetId}. */\n id: number;\n /** Source image URL or `localasset://` path. */\n url: string;\n /** Image width in pixels. */\n width: number;\n /** Image height in pixels. */\n height: number;\n /** Local directory the source image is stored in (desktop projects). */\n storageDir?: string;\n /** Local file name for the source image (desktop projects). */\n fileName?: string;\n};\n\n/**\n * Image-tracking target metadata used by AR projects. Holds the source images\n * users uploaded plus the URL of the compiled `.mind` target file produced by\n * the image-target compiler. Pair with {@link ImageTargetAnchor} on child\n * entities that should appear when the target is detected.\n *\n * @category Components\n */\nexport class ImageTarget extends Component {\n /** Source images that were combined into the compiled `.mind` target. */\n targets: ImageTargetReference[];\n /** URL of the compiled `.mind` target file. Set after the image-target compiler finishes. */\n compiledTargetUrl?: string;\n /** Directory containing the compiled `.mind` file (desktop projects). */\n compiledTargetDir?: string;\n /** Optional preview texture used in the editor viewport. `null` when not assigned. */\n texture: THREE.Texture | null;\n /** Optional preview object placed in the editor viewport. `null` when not assigned. */\n object: THREE.Object3D | null;\n\n constructor(options?: {\n targets?: ImageTargetReference[];\n compiledTargetUrl?: string;\n compiledTargetDir?: string;\n }, texture?: THREE.Texture, object?: THREE.Object3D) {\n super();\n this.targets = options?.targets ?? [];\n this.compiledTargetUrl = options?.compiledTargetUrl;\n this.compiledTargetDir = options?.compiledTargetDir;\n this.texture = texture ?? null;\n this.object = object ?? null;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Authoring state for {@link LightComponent}. Common fields apply to every light kind; the optional fields are only meaningful for specific kinds. */\ntype LightValueState = {\n /** Light color as `#rrggbb` hex string. */\n color: string;\n /** Light intensity multiplier (units depend on three.js physically-correct mode). */\n intensity: number;\n /** Whether the light casts shadows. */\n castShadow: boolean;\n /** Whether the light is frustum-culled when off-screen. */\n frustumCulling: boolean;\n /** Maximum range; `0` means infinite. (PointLight, SpotLight) */\n distance?: number;\n /** Falloff exponent for distance attenuation. (PointLight, SpotLight) */\n decay?: number;\n /** Cone half-angle in **radians**. (SpotLight) */\n angle?: number;\n /** Soft-edge factor in `[0, 1]`; `0` is a hard edge. (SpotLight) */\n penumbra?: number;\n /** Rectangle width in world units. (RectAreaLight) */\n width?: number;\n /** Rectangle height in world units. (RectAreaLight) */\n height?: number;\n};\n\nfunction toHexColor(value: THREE.Color): string {\n return `#${value.getHexString()}`;\n}\n\nfunction createValueState(light: THREE.Light): LightValueState {\n const base: LightValueState = {\n color: toHexColor(light.color),\n intensity: light.intensity,\n castShadow: (light as THREE.Light & { castShadow?: boolean }).castShadow ?? false,\n frustumCulling: light.frustumCulled,\n };\n\n if (light instanceof THREE.PointLight) {\n base.distance = light.distance;\n base.decay = light.decay;\n } else if (light instanceof THREE.SpotLight) {\n base.distance = light.distance;\n base.decay = light.decay;\n base.angle = light.angle;\n base.penumbra = light.penumbra;\n } else if (light instanceof THREE.RectAreaLight) {\n base.width = light.width;\n base.height = light.height;\n }\n\n return base;\n}\n\n/**\n * Light source attached to an entity. `type` selects the underlying three.js\n * light class (directional, point, spot, ambient, hemisphere, rect-area).\n * `values` carries authoring state including color, intensity, and\n * type-specific fields (distance, decay, angle, penumbra, width, height).\n *\n * @category Components\n */\nexport class LightComponent extends Component {\n /** Live three.js light placed in the scene. Recreated when the project loads. */\n light: THREE.Light;\n /** Three.js class name of the light (e.g. `\"DirectionalLight\"`, `\"PointLight\"`, `\"SpotLight\"`). */\n type: string;\n /** Serialized authoring state. Saved with the project. */\n values: LightValueState;\n\n constructor(light: THREE.Light) {\n super();\n this.light = light;\n this.type = light.type;\n this.values = createValueState(light);\n }\n\n setValues(patch: Partial<LightValueState>): void {\n this.values = {\n ...this.values,\n ...patch,\n };\n }\n}\n\nexport type { LightValueState };\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Supported material classes. Each maps to a three.js `Mesh*Material` type. */\ntype MaterialTypeValue = \"standard\" | \"basic\" | \"phong\" | \"physical\";\n/** Texture sampling mode. `smooth` uses linear filtering; `sharp` uses nearest filtering for pixel-art look. */\ntype TextureFilteringValue = \"smooth\" | \"sharp\";\n\n/** Authoring state for a single slot in {@link MaterialComponent.values}. Mirrors the live three.js material so it can be re-applied when the project loads. */\ntype MaterialValueState = {\n /** Underlying material class. */\n type: MaterialTypeValue;\n /** Base color as `#rrggbb` hex string. */\n color: string;\n /** PBR roughness in `[0, 1]`. */\n roughness: number;\n /** PBR metalness in `[0, 1]`. */\n metalness: number;\n /** Multiplier applied to the normal map (uniform on both axes). */\n normalScale: number;\n /** Surface opacity in `[0, 1]`. Combine with {@link transparent} to enable alpha. */\n opacity: number;\n /** Emissive color as `#rrggbb` hex string. */\n emissive: string;\n /** Emissive intensity multiplier. */\n emissiveIntensity: number;\n /** Three.js `Side` enum value (`FrontSide`, `BackSide`, or `DoubleSide`). */\n side: number;\n /** Three.js `Blending` enum value. */\n blending: number;\n /** Whether depth testing is enabled. */\n depthTest: boolean;\n /** Whether depth writes are enabled. */\n depthWrite: boolean;\n /** Render as wireframe. */\n wireframe: boolean;\n /** Enable transparency (must be `true` for {@link opacity} < 1 to render correctly). */\n transparent: boolean;\n /** Color/diffuse texture URL. */\n textureMap?: string;\n /** Alpha (transparency) texture URL. */\n alphaTextureMap?: string;\n /** Tangent-space normal map URL. */\n normalMap?: string;\n /** Roughness map URL (red channel). */\n roughnessMap?: string;\n /** Metalness map URL (red channel). */\n metalnessMap?: string;\n /** Ambient occlusion map URL. */\n aoMap?: string;\n /** Emissive color map URL. */\n emissiveMap?: string;\n /** Bump map URL (height-based shading approximation). */\n bumpMap?: string;\n /** Displacement map URL (geometric vertex offset). */\n displacementMap?: string;\n /** Pre-baked light map URL. */\n lightMap?: string;\n /** Environment reflection map URL. */\n envMap?: string;\n /** Texture sampling mode applied to the color map. */\n textureFiltering: TextureFilteringValue;\n /** Whether mipmaps are generated for texture maps. */\n useMipmaps: boolean;\n};\n\nfunction toHexColor(value: unknown, fallback: string): string {\n if (\n value &&\n typeof value === \"object\" &&\n typeof (value as { getHexString?: () => string }).getHexString ===\n \"function\"\n ) {\n try {\n return `#${(value as { getHexString: () => string }).getHexString()}`;\n } catch {\n return fallback;\n }\n }\n\n return fallback;\n}\n\nfunction getMaterialType(material: THREE.Material): MaterialTypeValue {\n if (material instanceof THREE.MeshPhysicalMaterial) {\n return \"physical\";\n }\n\n if (material instanceof THREE.MeshPhongMaterial) {\n return \"phong\";\n }\n\n if (material instanceof THREE.MeshBasicMaterial) {\n return \"basic\";\n }\n\n return \"standard\";\n}\n\n/** Shape we read off a decoded texture image. */\ntype TextureImageLike = { src?: unknown; currentSrc?: unknown };\n\n/**\n * A texture's source URL, read from its decoded image.\n *\n * `THREE.Texture.image` is deliberately untyped by three (it can be an\n * HTMLImageElement, ImageBitmap, canvas, video, …), so narrow it here once\n * rather than at each of the dozen texture slots below.\n */\nfunction textureImageSrc(\n texture: THREE.Texture | null | undefined,\n): string | undefined {\n const src = (texture?.image as TextureImageLike | undefined)?.src;\n return typeof src === \"string\" ? src : undefined;\n}\n\n/**\n * Same, but preferring the browser-resolved `source.data.currentSrc` when it is\n * available (the colour map is the one slot that can be backed by an element\n * whose `src` is still relative).\n */\nfunction textureSourceUrl(\n texture: THREE.Texture | null | undefined,\n): string | undefined {\n if (!texture?.image) {\n return undefined;\n }\n const currentSrc = (\n texture.source as { data?: TextureImageLike } | undefined\n )?.data?.currentSrc;\n if (typeof currentSrc === \"string\" && currentSrc) {\n return currentSrc;\n }\n return textureImageSrc(texture);\n}\n\nfunction createMaterialValue(material: THREE.Material): MaterialValueState {\n const materialRecord = material as unknown as Record<string, unknown>;\n const normalScale = materialRecord.normalScale as\n | { x?: number; y?: number }\n | undefined;\n const map = materialRecord.map as THREE.Texture | undefined;\n\n return {\n type: getMaterialType(material),\n color: toHexColor(materialRecord.color, \"#ffffff\"),\n roughness:\n typeof materialRecord.roughness === \"number\" ? materialRecord.roughness : 0.5,\n metalness:\n typeof materialRecord.metalness === \"number\" ? materialRecord.metalness : 0.5,\n normalScale:\n typeof normalScale?.x === \"number\" ? normalScale.x : 1,\n opacity: typeof materialRecord.opacity === \"number\" ? materialRecord.opacity : 1,\n emissive: toHexColor(materialRecord.emissive, \"#000000\"),\n emissiveIntensity:\n typeof materialRecord.emissiveIntensity === \"number\"\n ? materialRecord.emissiveIntensity\n : 0,\n side: typeof materialRecord.side === \"number\" ? materialRecord.side : THREE.FrontSide,\n blending:\n typeof materialRecord.blending === \"number\"\n ? materialRecord.blending\n : THREE.NormalBlending,\n depthTest: materialRecord.depthTest !== false,\n depthWrite: materialRecord.depthWrite !== false,\n wireframe: Boolean(materialRecord.wireframe),\n transparent: Boolean(materialRecord.transparent),\n textureMap: textureSourceUrl(map),\n alphaTextureMap: textureImageSrc(\n materialRecord.alphaMap as THREE.Texture | undefined,\n ),\n normalMap: textureImageSrc(\n materialRecord.normalMap as THREE.Texture | undefined,\n ),\n roughnessMap: textureImageSrc(\n materialRecord.roughnessMap as THREE.Texture | undefined,\n ),\n metalnessMap: textureImageSrc(\n materialRecord.metalnessMap as THREE.Texture | undefined,\n ),\n aoMap: textureImageSrc(materialRecord.aoMap as THREE.Texture | undefined),\n emissiveMap: textureImageSrc(\n materialRecord.emissiveMap as THREE.Texture | undefined,\n ),\n bumpMap: textureImageSrc(\n materialRecord.bumpMap as THREE.Texture | undefined,\n ),\n displacementMap: textureImageSrc(\n materialRecord.displacementMap as THREE.Texture | undefined,\n ),\n lightMap: textureImageSrc(\n materialRecord.lightMap as THREE.Texture | undefined,\n ),\n envMap: textureImageSrc(materialRecord.envMap as THREE.Texture | undefined),\n textureFiltering:\n map?.magFilter === THREE.NearestFilter ? \"sharp\" : \"smooth\",\n useMipmaps: map?.generateMipmaps !== false,\n };\n}\n\nexport function defaultMaterialValue(): MaterialValueState {\n return {\n type: \"standard\",\n color: \"#ffffff\",\n roughness: 0.5,\n metalness: 0.5,\n normalScale: 1,\n opacity: 1,\n emissive: \"#000000\",\n emissiveIntensity: 0,\n side: THREE.FrontSide,\n blending: THREE.NormalBlending,\n depthTest: true,\n depthWrite: true,\n wireframe: false,\n transparent: false,\n textureFiltering: \"smooth\",\n useMipmaps: true,\n };\n}\n\n/**\n * Material catalog for an entity. Tracks the live three.js materials\n * (`materials`, `material`) plus serialized authoring state (`values[]`)\n * mirrored from the inspector. Supports `standard`, `basic`, `phong`, and\n * `physical` PBR types with optional texture map slots.\n *\n * @remarks\n * Use `setMaterials`, `updateValue`, `setMaterialType`, `setTextureFiltering`,\n * and `setUseMipmaps` to mutate state — these keep `values[]` and the live\n * three.js materials in sync. Texture URLs use the `localasset://` protocol\n * inside the editor.\n *\n * @category Components\n */\nexport class MaterialComponent extends Component {\n /** Live three.js materials currently bound to the entity's mesh (one per submesh). */\n materials: THREE.Material[];\n /** Convenience reference to `materials[0]`. `null` when no material is assigned. */\n material: THREE.Material | null;\n /** Serialized authoring state (one entry per material in {@link materials}). Saved with the project. */\n values: MaterialValueState[];\n /**\n * Editor-managed material-asset linkage, one entry per slot (parallel to\n * {@link values}). A `localasset://` URL of a `.material` asset file, or\n * `null`/absent for a local (unlinked) material. The editor materializes the\n * asset's values into {@link values} and keeps them in sync when the asset\n * is edited — rendering and the runtime read only {@link values} and ignore\n * this field. Saved with the project; survives material rebinds.\n */\n assetRefs: (string | null)[];\n\n constructor(materialOrMaterials: THREE.Material | THREE.Material[] = []) {\n super();\n\n this.materials = [];\n this.material = null;\n this.values = [];\n this.assetRefs = [];\n this.setMaterials(materialOrMaterials);\n }\n\n /** Link/unlink a slot to a material asset URL (editor bookkeeping only). */\n setAssetRef(index: number, url: string | null): void {\n if (index < 0) {\n return;\n }\n while (this.assetRefs.length <= index) {\n this.assetRefs.push(null);\n }\n this.assetRefs[index] = url;\n }\n\n /** The material-asset URL a slot is linked to, or null when local. */\n getAssetRef(index: number): string | null {\n return this.assetRefs[index] ?? null;\n }\n\n setMaterials(\n materialOrMaterials: THREE.Material | THREE.Material[] = [],\n ): void {\n this.materials = Array.isArray(materialOrMaterials)\n ? materialOrMaterials.filter(Boolean)\n : materialOrMaterials\n ? [materialOrMaterials]\n : [];\n\n this.material = this.materials[0] ?? null;\n this.values =\n this.materials.length > 0\n ? this.materials.map((material) => createMaterialValue(material))\n : [defaultMaterialValue()];\n }\n\n updateValue(index: number, patch: Partial<MaterialValueState>): void {\n if (index < 0) {\n return;\n }\n\n while (this.values.length <= index) {\n this.values.push(defaultMaterialValue());\n }\n\n this.values[index] = {\n ...this.values[index],\n ...patch,\n };\n }\n\n resetValue(index: number): void {\n if (index < 0) {\n return;\n }\n\n while (this.values.length <= index) {\n this.values.push(defaultMaterialValue());\n }\n\n const type = this.values[index]?.type ?? \"standard\";\n this.values[index] = {\n ...defaultMaterialValue(),\n type,\n };\n }\n\n setMaterialType(index: number, type: MaterialTypeValue): void {\n this.updateValue(index, { type });\n }\n\n setTextureFiltering(index: number, filtering: TextureFilteringValue): void {\n this.updateValue(index, { textureFiltering: filtering });\n }\n\n setUseMipmaps(index: number, enabled: boolean): void {\n this.updateValue(index, { useMipmaps: enabled });\n }\n}\n\nexport type { MaterialTypeValue, MaterialValueState, TextureFilteringValue };\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * References a GLTF/GLB asset loaded from `path`. The model loading system\n * resolves the asset asynchronously and populates {@link ModelComponent.object}\n * once available; loading is deferred-tolerant so the entity exists before\n * the model finishes loading.\n *\n * @category Components\n */\nexport class ModelComponent extends Component {\n /** Source URL or `localasset://` path of the GLTF/GLB asset. */\n path: string;\n /** Loaded model object, populated asynchronously by the model loader. `null` until loaded. */\n object: THREE.Object3D | null;\n\n constructor(path: string) {\n super();\n this.path = path;\n this.object = null;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Human-readable name for an entity. Shown in the editor hierarchy panel and\n * preserved across save/reload.\n *\n * @category Components\n */\nexport class Name extends Component {\n /** Display name for the entity. Shown in the editor hierarchy. */\n value: string;\n\n constructor(value: string) {\n super();\n this.value = value;\n }\n}\n","import { Component } from \"../Component\";\n\nconst generateInstanceId = (): string => {\n try {\n return crypto.randomUUID();\n } catch {\n // Non-secure-context fallback — uniqueness within a document is enough.\n return `i-${Math.random().toString(36).slice(2, 10)}${Date.now().toString(36)}`;\n }\n};\n\n/**\n * Marks the ROOT entity of a prefab instance and records its link to the\n * source `.prefab` asset plus the instance's per-property overrides.\n *\n * Instances may appear in a scene OR nested inside another prefab's file\n * (nested prefabs): the nested root keeps the child prefab's `PrefabNode`\n * identity AND this link. `instanceId` is a per-placement uuid that scopes\n * node identity across nesting — two nested instances of the same prefab\n * share nodeIds but never instanceIds, so override keys stay unambiguous.\n *\n * `overrides` is a flat list of encoded strings so it survives snapshot\n * serialization at any depth:\n *\n * ```\n * \"<nodeKey>|<ComponentName>|<slash/separated/path>\"\n * \"<nodeKey>|<ComponentName>|\" // empty path = whole component overridden\n * \"<nodeKey>|+node|\" // marker: node added by the HOST document\n * // inside a nested region (never deleted by\n * // file patching)\n * ```\n *\n * where `<nodeKey>` is the entity's `PrefabNode.nodeId` prefixed by the\n * `instanceId` chain of any nested instance roots between the scope root and\n * the entity (e.g. `\"9f2c…\"` for direct children, `\"<iB>/<bNode>\"` inside a\n * nested instance). Overridden paths keep their per-instance values when the\n * prefab asset is re-applied; everything else syncs from the file. The\n * instance root's Transform, Name, and ParentId are implicitly per-instance\n * and never appear here. Overrides are an editor-side concern — the runtime\n * never resolves them (scene-placed instances are fully materialized;\n * runtime spawns are fresh copies of the file).\n *\n * @category Components\n */\nexport class PrefabInstance extends Component {\n /** URL of the source `.prefab` asset (`localasset://…` inside the editor). */\n url: string;\n /** Encoded override paths — see class docs for the format. */\n overrides: string[];\n /**\n * Per-placement uuid scoping node identity across nesting. Stable for the\n * lifetime of the placement (persisted; survives applies) so override keys\n * referencing nested content stay valid.\n */\n instanceId: string;\n\n constructor(url: string, overrides: string[] = [], instanceId?: string) {\n super();\n this.url = url;\n this.overrides = overrides;\n this.instanceId =\n typeof instanceId === \"string\" && instanceId.length > 0\n ? instanceId\n : generateInstanceId();\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Stable identity for an entity that originated from a prefab asset.\n *\n * Every entity serialized into a `.prefab` file carries a `PrefabNode` with a\n * uuid `nodeId`. Hydrating the prefab (editor instantiate or runtime spawn)\n * restores the component, so each instance entity can be matched back to its\n * prefab-file counterpart regardless of live entity ids. The per-property\n * override system diffs and merges in nodeId-space.\n *\n * Node ids are unique within one prefab subtree — two instances of the same\n * prefab intentionally share nodeIds.\n *\n * @category Components\n */\nexport class PrefabNode extends Component {\n /** Stable uuid identifying this entity within its prefab definition. */\n nodeId: string;\n\n constructor(nodeId: string) {\n super();\n this.nodeId = nodeId;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * One script attached to an entity. Multiple entries may target a single\n * entity (different classes from the same or different files).\n */\nexport type ScriptEntry = {\n /** Owning entity id. */\n entityId: number;\n /** Class name exported by the script module (default export class name). */\n className: string;\n /** Compiled script URL (e.g. `localasset://.../scripts/foo.js`). */\n scriptUrl: string;\n /** When `false`, the script is skipped each frame. */\n enabled: boolean;\n /** Inspector-bound payload exposed to the script as `this.data`. */\n data: Record<string, unknown>;\n /** Last load/runtime status reported by `ScriptBehaviourSystem`. */\n runtimeState?: \"idle\" | \"loading\" | \"ready\" | \"error\";\n /** Optional human-readable status message (e.g. compile/load error). */\n runtimeMessage?: string;\n};\n\n/**\n * Component holding the list of {@link ScriptEntry | scripts} attached to an\n * entity. Loaded from the saved project; the runtime-side fields\n * (`scriptInstance`, `scriptInstances`) are non-enumerable so they never leak\n * into save data or undo history.\n *\n * @remarks\n * Authored scripts subclass {@link Behaviour}.\n *\n * @category Components\n */\nexport class ScriptComponent extends Component {\n /** Authored script entries attached to the entity. Each entry references a class by name plus its inspector field overrides. Saved with the project. */\n entries: ScriptEntry[];\n /** First live behaviour instance after compile/load. Non-enumerable, so it does not appear in save data. `null` when no script is loaded. */\n declare scriptInstance: unknown | null;\n /** Map of `entityId` to its compiled behaviour instance (one entry per script bound to the entity). Non-enumerable, so it does not appear in save data. */\n declare scriptInstances: Map<number, unknown>;\n\n constructor(entries: ScriptEntry[] = []) {\n super();\n\n this.entries = entries.map((entry) => ({\n entityId: typeof entry.entityId === \"number\" ? entry.entityId : 0,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data && typeof entry.data === \"object\" && !Array.isArray(entry.data)\n ? (entry.data as Record<string, unknown>)\n : {},\n runtimeState: entry.runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\" ? entry.runtimeMessage : undefined,\n }));\n\n // Runtime-only reference used by ScriptBehaviourSystem.\n // Keep non-enumerable so snapshots/history/hydration payloads remain stable.\n Object.defineProperty(this, \"scriptInstance\", {\n value: null,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n\n // Runtime-only map of all entry instances keyed by entryIndex.\n // Non-enumerable for the same reason as scriptInstance.\n Object.defineProperty(this, \"scriptInstances\", {\n value: new Map<number, unknown>(),\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n","import { Component } from \"../Component\";\nimport type { ScriptObject } from \"../ScriptObject\";\n\nexport type ScriptObjectRuntimeState = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type ScriptObjectComponentInput = Partial<{\n /** Compiled script URL (e.g. `localasset://.../scripts/foo.js`). */\n scriptUrl: string | null;\n /** Class name exported by the script module. */\n className: string | null;\n /** When `false`, the script object is not built/ticked. */\n enabled: boolean;\n /** Inspector-bound payload exposed to the script as `this.data`. */\n data: Record<string, unknown>;\n /** Last load/build status reported by `ScriptObjectSystem`. */\n runtimeState: ScriptObjectRuntimeState;\n /** Optional human-readable status message (e.g. compile/build error). */\n runtimeMessage: string;\n}>;\n\n/**\n * Component for a **script object** — a single {@link ScriptObject} whose\n * THREE.js visual is built by user code and runs in the editor AND at runtime.\n * Unlike {@link ScriptComponent} this holds ONE script (not an entries array).\n * The live instance ref is non-enumerable so it never leaks into save data or\n * undo history.\n *\n * @category Components\n */\nexport class ScriptObjectComponent extends Component {\n scriptUrl: string | null;\n className: string | null;\n enabled: boolean;\n data: Record<string, unknown>;\n runtimeState: ScriptObjectRuntimeState;\n runtimeMessage?: string;\n /** Live ScriptObject instance. Non-enumerable — never enters snapshots/history. */\n declare instance: unknown | null;\n\n constructor(input: ScriptObjectComponentInput = {}) {\n super();\n\n this.scriptUrl =\n typeof input.scriptUrl === \"string\" && input.scriptUrl.length > 0\n ? input.scriptUrl\n : null;\n this.className =\n typeof input.className === \"string\" && input.className.length > 0\n ? input.className\n : null;\n this.enabled = typeof input.enabled === \"boolean\" ? input.enabled : true;\n this.data =\n input.data && typeof input.data === \"object\" && !Array.isArray(input.data)\n ? (input.data as Record<string, unknown>)\n : {};\n this.runtimeState =\n input.runtimeState === \"idle\" ||\n input.runtimeState === \"loading\" ||\n input.runtimeState === \"ready\" ||\n input.runtimeState === \"error\"\n ? input.runtimeState\n : \"idle\";\n this.runtimeMessage =\n typeof input.runtimeMessage === \"string\" ? input.runtimeMessage : undefined;\n\n // Runtime-only reference used by ScriptObjectSystem. Non-enumerable so\n // snapshots/history/hydration payloads remain stable.\n Object.defineProperty(this, \"instance\", {\n value: null,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Toggles whether the editor selection system can pick this entity. When\n * `enabled` is `false`, the entity is excluded from raycast hit tests.\n *\n * @category Components\n */\nexport class Selectable extends Component {\n /** When `false`, the editor selection raycaster ignores this entity. */\n enabled: boolean;\n\n constructor(enabled = true) {\n super();\n this.enabled = enabled;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Camera-facing 2D sprite. Unlike {@link ImageComponent}, sprites use\n * `THREE.Sprite` and always render as billboards.\n *\n * @category Components\n */\nexport class SpriteComponent extends Component {\n /** Source URL or `localasset://` path of the sprite image. */\n path: string;\n /** Width of the sprite in world units. */\n width: number;\n /** Height of the sprite in world units. */\n height: number;\n /** Loaded texture, populated asynchronously. `null` until loaded. */\n texture: THREE.Texture | null;\n /** Live `THREE.Sprite` placed in the scene. `null` until built. */\n object: THREE.Sprite | null;\n\n constructor(path: string, width: number = 1, height: number = 1) {\n super();\n this.path = path;\n this.width = width;\n this.height = height;\n this.texture = null;\n this.object = null;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * @internal Default options applied when no override is provided.\n */\nconst DEFAULT_VIDEO_OPTIONS = {\n autoplay: false,\n loop: true,\n volume: 1,\n width: 1,\n height: 1,\n isGreenScreen: false,\n backgroundColor: \"#00ff00\",\n similarity: 0.4,\n smoothness: 0.08,\n spill: 0.12,\n /** When `true`, the video's audio stream is spatialized using the entity's transform. */\n positional: false,\n /** Distance at which volume is unattenuated (positional only). */\n refDistance: 1,\n /** WebAudio distance model (`linear`, `inverse`, `exponential`). Positional only. */\n distanceModel: \"inverse\",\n /** How quickly volume falls off past `refDistance`. Positional only. */\n rolloffFactor: 1,\n};\n\n/**\n * Plays a video file as a texture on a quad. Supports green-screen keying\n * (`isGreenScreen`, `backgroundColor`, `similarity`, `smoothness`, `spill`).\n * The video element, texture, and material are runtime-only and re-created\n * when the project loads.\n *\n * @category Components\n */\nexport class VideoComponent extends Component {\n /** Source URL or `localasset://` path of the video file. */\n path: string;\n /**\n * Playback + green-screen options.\n *\n * | Field | Default | Description |\n * |---|---|---|\n * | `autoplay` | `false` | Start playback as soon as the video is ready. |\n * | `loop` | `true` | Loop playback indefinitely. |\n * | `volume` | `1` | Linear gain in `[0, 1]`. |\n * | `width` | `1` | Quad width in world units. |\n * | `height` | `1` | Quad height in world units. |\n * | `isGreenScreen` | `false` | Enable chroma keying using the fields below. |\n * | `backgroundColor` | `\"#00ff00\"` | Color to key out (CSS color string). |\n * | `similarity` | `0.4` | How close a pixel must be to the key to be removed (`0`–`1`). |\n * | `smoothness` | `0.08` | Soft-edge thickness around the key threshold. |\n * | `spill` | `0.12` | Amount of color spill suppression near edges. |\n * | `positional` | `false` | When `true`, the video's audio stream is spatialized using the entity's 3D position. |\n * | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |\n * | `distanceModel` | `\"inverse\"` | WebAudio distance model (`linear`, `inverse`, `exponential`). Positional only. |\n * | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. Positional only. |\n */\n options: typeof DEFAULT_VIDEO_OPTIONS;\n /** Live three.js object hosting the video quad. `null` until built. */\n object: THREE.Object3D | null;\n /** Underlying HTML video element. `null` until built. */\n videoElement: HTMLVideoElement | null;\n /** Three.js texture sampling the video element. `null` until built. */\n texture: THREE.VideoTexture | null;\n /** Material rendering the video texture (with green-screen shader when enabled). `null` until built. */\n material: THREE.Material | null;\n /**\n * THREE.js audio node connected to this video's audio stream via\n * `setMediaElementSource`. Present only in preview when the camera\n * listener is available. `null` in editor mode.\n */\n audioNode: THREE.Audio<GainNode> | THREE.PositionalAudio | null;\n\n /**\n * Whether the video should be playing. Managed by `VideoSystem` in preview.\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link play} / {@link stop}.\n */\n declare isPlaying: boolean;\n\n /**\n * Whether the video is paused mid-playback (position is preserved).\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link pause} / {@link play} / {@link stop}.\n */\n declare isPaused: boolean;\n\n constructor(\n path: string,\n options: Partial<typeof DEFAULT_VIDEO_OPTIONS> = {},\n ) {\n super();\n this.path = path;\n this.options = {\n ...DEFAULT_VIDEO_OPTIONS,\n ...options,\n };\n this.object = null;\n this.videoElement = null;\n this.texture = null;\n this.material = null;\n this.audioNode = null;\n\n // Runtime-only playback state. Non-enumerable so these values are never\n // written into save data, debug snapshots, or undo history.\n Object.defineProperty(this, \"isPlaying\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(this, \"isPaused\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n\n /**\n * Signals `VideoSystem` to start (or resume) playback.\n * Has no direct effect in the editor — `VideoSystem` drives the actual\n * HTML video element call in preview.\n */\n play(): void {\n this.isPlaying = true;\n this.isPaused = false;\n }\n\n /**\n * Signals `VideoSystem` to pause playback, preserving the current position.\n * Calling {@link play} afterwards resumes from where it paused.\n * No-op if not currently playing.\n */\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n /**\n * Signals `VideoSystem` to stop playback and reset the playback position.\n */\n stop(): void {\n this.isPlaying = false;\n this.isPaused = false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Footprint of a teleport destination. */\nexport type VrTeleportShape = \"plane\" | \"circle\";\n\n/** Optional initializer for {@link VRTeleportAreaComponent}. */\nexport type VRTeleportAreaOptions = {\n /** Disable to keep the area authored but inert. */\n enabled?: boolean;\n /** Footprint shape. */\n shape?: VrTeleportShape;\n /** Full width in metres (`plane`), or diameter (`circle`). */\n width?: number;\n /** Full depth in metres. Ignored for `circle`, which uses `width`. */\n depth?: number;\n};\n\n/**\n * Marks an entity's surface as a valid teleport destination.\n *\n * Teleport is an allow-list, not a physics query: only entities carrying an\n * enabled area can be teleported onto. That keeps destinations deliberate —\n * authors decide where the player may stand rather than discovering that every\n * collider in the scene is walkable.\n *\n * @category Components\n */\nexport class VRTeleportAreaComponent extends Component {\n /** Whether this area currently accepts teleports. */\n enabled: boolean;\n /** Footprint shape. */\n shape: VrTeleportShape;\n /** Full width in metres (diameter for `circle`). */\n width: number;\n /** Full depth in metres (unused for `circle`). */\n depth: number;\n\n constructor(options?: VRTeleportAreaOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n // \"cylinder\" was the pre-release name for this shape; normalize so scenes\n // saved before the rename still resolve to the disc they were authored as.\n const shape = options?.shape as string | undefined;\n this.shape = shape === \"cylinder\" ? \"circle\" : (options?.shape ?? \"plane\");\n this.width = options?.width ?? 10;\n this.depth = options?.depth ?? 10;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * How close the user must be to grab.\n *\n * `physical` requires the hand to actually reach the object — the honest,\n * embodied interaction. `distance` allows grabbing across the room along the\n * pointer ray, which is what makes seated and room-scale play comfortable.\n * `both` accepts either, and is the friendliest default.\n */\nexport type XrGrabReach = \"physical\" | \"distance\" | \"both\";\n\n/**\n * What a distance grab does to the object.\n *\n * `snap` brings it to the hand (Half-Life: Alyx style — good for picking things\n * up). `remote` leaves it where it is and manipulates it at range, which suits\n * large or anchored objects that would look absurd flying into your palm.\n */\nexport type XrDistanceGrabBehavior = \"snap\" | \"remote\";\n\n/**\n * Which gesture grabs the object.\n *\n * `pinch` maps to the primary action (trigger / finger pinch), `full` to the\n * grip squeeze (whole-hand close). Distinguishing them lets a scene mix\n * precise pickups with firm grabs — a chess piece versus a suitcase handle.\n */\nexport type XrGrabGesture = \"any\" | \"pinch\" | \"full\";\n\n/**\n * A hand-hold authored on the object.\n *\n * Without attach points a hand grabs wherever it happens to touch, which is\n * right for a ball and wrong for a rifle — a weapon has a grip and a foregrip,\n * and the hands belong on those exact spots. `role` is what lets an author say\n * \"this is the trigger hand's hold\" so a two-hand grab assembles correctly no\n * matter which hand arrives first.\n */\nexport type XrAttachPoint = {\n /** Stable id; referenced by scripts and by the inspector list. */\n id: string;\n name: string;\n /** Object-local position of the hold (unscaled). */\n position: { x: number; y: number; z: number };\n /** Object-local orientation of the hold, radians. */\n rotation: { x: number; y: number; z: number };\n /** Restrict to one hand, or `any`. */\n hand: \"left\" | \"right\" | \"any\";\n /** Whether this hold is the anchoring hand, the steering hand, or either. */\n role: \"primary\" | \"secondary\" | \"any\";\n};\n\n/**\n * How many hands may hold the object at once, and what a second grab does.\n *\n * `single` is a plain pickup. `handOff` lets the other hand TAKE it — the\n * everyday gesture of passing something between your hands. `two` keeps both\n * hands on it, which is what enables aiming a two-handed weapon and\n * pull-apart scaling.\n */\nexport type XrGrabHands = \"single\" | \"handOff\" | \"two\";\n\n/** How the second hand affects orientation. See `solveTwoHandTransform`. */\nexport type XrTwoHandRotation = \"align\" | \"primary\";\n\n/**\n * What an object does when a pointer lands on it.\n *\n * Hover feedback is what tells the user the ray has actually caught something —\n * without it, aiming at a grabbable object and aiming at empty space look\n * identical.\n */\nexport type XrHoverBehavior = \"none\" | \"color\" | \"scale\" | \"both\";\n\n/** Optional initializer for {@link XRInteractableComponent}. */\nexport type XRInteractableOptions = {\n enabled?: boolean;\n grabbable?: boolean;\n pointable?: boolean;\n grabReach?: XrGrabReach;\n distanceBehavior?: XrDistanceGrabBehavior;\n grabGesture?: XrGrabGesture;\n /** Metres within which a `physical` grab registers. */\n grabRadius?: number;\n /** Where the object sits relative to the hand once held. */\n grabOffsetPosition?: { x: number; y: number; z: number };\n /** Orientation offset, in radians. */\n grabOffsetRotation?: { x: number; y: number; z: number };\n /** How many hands may hold it, and whether a second grab transfers it. */\n grabHands?: XrGrabHands;\n /** Whether the second hand aims the object or only scales it. */\n twoHandRotation?: XrTwoHandRotation;\n /** Let a two-hand grab resize the object by moving the hands apart. */\n allowTwoHandScale?: boolean;\n /** Smallest fraction of its size a single scaling gesture may reach. */\n minScale?: number;\n /** Largest multiple of its size a single scaling gesture may reach. */\n maxScale?: number;\n /** Authored hand-holds. Empty means grab anywhere. */\n attachPoints?: XrAttachPoint[];\n /** Hand the object the velocity it was moving with when released. */\n applyVelocityOnRelease?: boolean;\n /** Scales released velocity; >1 makes throws feel stronger than real life. */\n velocityScale?: number;\n /** Feedback shown while a pointer is on the object. */\n hoverBehavior?: XrHoverBehavior;\n /** Outline colour used by the `color` and `both` behaviours. */\n hoverColor?: string;\n /** Size multiplier used by the `scale` and `both` behaviours. */\n hoverScale?: number;\n};\n\n/**\n * Makes an entity respond to XR pointers and hands.\n *\n * Split into `pointable` and `grabbable` because they are different\n * affordances: a wall panel should receive select events without being\n * liftable, while a physics prop should be both.\n *\n * @category Components\n */\nexport class XRInteractableComponent extends Component {\n enabled: boolean;\n grabbable: boolean;\n pointable: boolean;\n /** Whether the object can be grabbed up close, at range, or either. */\n grabReach: XrGrabReach;\n /** What a distance grab does — bring it here, or manipulate it in place. */\n distanceBehavior: XrDistanceGrabBehavior;\n /** Which gesture grabs it. */\n grabGesture: XrGrabGesture;\n /** Metres within which a physical grab registers. */\n grabRadius: number;\n /** Position offset from the hand while held. */\n grabOffsetPosition: { x: number; y: number; z: number };\n /** Rotation offset (radians) while held. */\n grabOffsetRotation: { x: number; y: number; z: number };\n /** How many hands may hold it, and whether a second grab transfers it. */\n grabHands: XrGrabHands;\n /** Whether the second hand aims the object or only scales it. */\n twoHandRotation: XrTwoHandRotation;\n /** Whether a two-hand grab may resize the object. */\n allowTwoHandScale: boolean;\n /** Scale floor for one gesture, as a fraction of the size at grab time. */\n minScale: number;\n /** Scale ceiling for one gesture, as a multiple of the size at grab time. */\n maxScale: number;\n /** Authored hand-holds; empty means grab anywhere. */\n attachPoints: XrAttachPoint[];\n /**\n * Hand the object the velocity it was moving with when released.\n *\n * Applies to every release, not just a deliberate throw — letting go while\n * your hand drifts should nudge the object, which is why this is not called\n * \"throw\".\n */\n applyVelocityOnRelease: boolean;\n /** Multiplier on released velocity. */\n velocityScale: number;\n /** Feedback shown while a pointer is on the object. */\n hoverBehavior: XrHoverBehavior;\n /** Outline colour for the `color` and `both` behaviours. */\n hoverColor: string;\n /** Size multiplier for the `scale` and `both` behaviours. */\n hoverScale: number;\n\n constructor(options?: XRInteractableOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n this.grabbable = options?.grabbable ?? true;\n this.pointable = options?.pointable ?? true;\n this.grabReach = options?.grabReach ?? \"both\";\n this.distanceBehavior = options?.distanceBehavior ?? \"snap\";\n this.grabGesture = options?.grabGesture ?? \"any\";\n this.grabRadius = options?.grabRadius ?? 0.15;\n this.grabOffsetPosition = options?.grabOffsetPosition ?? {\n x: 0,\n y: 0,\n z: 0,\n };\n this.grabOffsetRotation = options?.grabOffsetRotation ?? {\n x: 0,\n y: 0,\n z: 0,\n };\n this.grabHands = options?.grabHands ?? \"handOff\";\n this.twoHandRotation = options?.twoHandRotation ?? \"align\";\n this.allowTwoHandScale = options?.allowTwoHandScale ?? false;\n this.minScale = options?.minScale ?? 0.25;\n this.maxScale = options?.maxScale ?? 4;\n this.attachPoints = (options?.attachPoints ?? []).map((point) =>\n createAttachPoint(point),\n );\n this.applyVelocityOnRelease = options?.applyVelocityOnRelease ?? true;\n this.velocityScale = options?.velocityScale ?? 1;\n this.hoverBehavior = options?.hoverBehavior ?? \"color\";\n // Matches the teleport arc and pointer ray, so XR feedback reads as one\n // visual language rather than three unrelated accents.\n this.hoverColor = options?.hoverColor ?? \"#4da3ff\";\n this.hoverScale = options?.hoverScale ?? 1.06;\n }\n}\n\n/** An attach point with every field populated, for the editor and AI tools. */\nexport function createAttachPoint(\n partial: Partial<XrAttachPoint> & { id: string },\n): XrAttachPoint {\n return {\n id: partial.id,\n name: partial.name ?? partial.id,\n position: { x: 0, y: 0, z: 0, ...partial.position },\n rotation: { x: 0, y: 0, z: 0, ...partial.rotation },\n hand: partial.hand ?? \"any\",\n role: partial.role ?? \"any\",\n };\n}\n","import { Component } from \"../Component\";\n\n/**\n * Where the headset's origin sits in the scene.\n *\n * `floor` maps to the WebXR `local-floor` reference space: Y=0 is the user's\n * real floor, so content authored standing on the ground lines up naturally.\n * `eye` maps to `local`: Y=0 is wherever the headset was when the session\n * started, which suits seated/cockpit experiences.\n *\n * Getting this wrong is the classic \"I spawned inside/under the geometry\" bug —\n * with `eye`, a scene authored floor-relative places the user's eyes at ground\n * level, sinking them through the floor.\n */\nexport type XrTrackingOrigin = \"floor\" | \"eye\";\n\n/** How the player moves through the scene in an immersive session. */\nexport type XrLocomotionMode = \"teleport\" | \"smooth\" | \"none\";\n\n/** Optional initializer for {@link XRRigComponent}. */\nexport type XRRigOptions = {\n /** Where the headset origin sits. Defaults to `floor`. */\n trackingOrigin?: XrTrackingOrigin;\n /** Movement style. Defaults to `teleport` — the most comfort-safe option. */\n locomotion?: XrLocomotionMode;\n /** Metres/second for `smooth` locomotion. */\n moveSpeed?: number;\n /** Rotate in fixed steps instead of continuously (greatly reduces nausea). */\n snapTurn?: boolean;\n /** Degrees per snap-turn step. */\n snapTurnDegrees?: number;\n /** Height in metres used when the device reports no floor-relative space. */\n fallbackEyeHeight?: number;\n /** Teleport arc colour when it lands somewhere valid. */\n teleportArcColor?: string;\n /** Teleport arc colour when it lands nowhere teleportable. */\n teleportArcInvalidColor?: string;\n /** Teleport arc thickness (diameter), metres. */\n teleportArcThickness?: number;\n};\n\n/**\n * Marks an entity as the XR rig — the player's movable origin.\n *\n * The rig exists because a WebXR headset owns the camera pose absolutely: three\n * composes the render camera as `rig.matrixWorld × headPose`, so the ONLY way\n * to move the player is to move the camera's parent. The camera entity must be\n * a child of this entity.\n *\n * Defaults are deliberately comfort-first — teleport locomotion with snap\n * turning is the combination least likely to cause motion sickness, and is what\n * every platform's design guidance recommends as the baseline.\n *\n * @category Components\n */\nexport class XRRigComponent extends Component {\n /** Where the headset origin sits (floor-relative vs eye-relative). */\n trackingOrigin: XrTrackingOrigin;\n /** Movement style. */\n locomotion: XrLocomotionMode;\n /** Metres/second for `smooth` locomotion. */\n moveSpeed: number;\n /** Rotate in fixed steps rather than continuously. */\n snapTurn: boolean;\n /** Degrees per snap-turn step. */\n snapTurnDegrees: number;\n /** Eye height fallback for devices without a floor-relative reference space. */\n fallbackEyeHeight: number;\n /** Teleport arc colour when it lands somewhere valid. */\n teleportArcColor: string;\n /** Teleport arc colour when it lands nowhere teleportable. */\n teleportArcInvalidColor: string;\n /** Teleport arc thickness (diameter), metres. */\n teleportArcThickness: number;\n\n constructor(options?: XRRigOptions) {\n super();\n this.trackingOrigin = options?.trackingOrigin ?? \"floor\";\n this.locomotion = options?.locomotion ?? \"teleport\";\n this.moveSpeed = options?.moveSpeed ?? 2;\n this.snapTurn = options?.snapTurn ?? true;\n this.snapTurnDegrees = options?.snapTurnDegrees ?? 30;\n this.fallbackEyeHeight = options?.fallbackEyeHeight ?? 1.6;\n this.teleportArcColor = options?.teleportArcColor ?? \"#4da3ff\";\n this.teleportArcInvalidColor = options?.teleportArcInvalidColor ?? \"#ff5a5a\";\n // Thicker than the pointer ray: the arc is viewed at a distance and\n // against the floor, where a thin line disappears.\n this.teleportArcThickness = options?.teleportArcThickness ?? 0.012;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * What is rendered at the user's hands.\n *\n * `both` is the honest default for a cross-device build: a Quest user may put\n * controllers down and switch to hands mid-session, and Android XR leads with\n * hands while Quest/Pico lead with controllers. Rendering whichever the device\n * currently reports avoids shipping a build that shows nothing on half the\n * hardware. `none` hands presentation entirely to the author's own meshes.\n */\n/**\n * When the pointer ray is drawn.\n *\n * `interacting` (default) shows it only while the hand is pointing at something\n * it could act on, so the scene isn't permanently criss-crossed with rays\n * implying everything is clickable. `always` suits scenes built around pointing.\n */\nexport type XrRayVisibility = \"always\" | \"interacting\" | \"never\";\n\nexport type XrInteractorType = \"hands\" | \"controllers\" | \"both\" | \"none\";\n\n/**\n * Look applied to tracked-hand meshes.\n *\n * Presets exist because hand rendering is the single most visible surface of a\n * VR experience and hand-authoring a shader for it is a big ask — but `custom`\n * is always available for authors who want full control.\n */\nexport type XrHandPreset =\n | \"default\"\n | \"ghost\"\n | \"neon\"\n | \"skeleton\"\n | \"custom\";\n\n/** Which hand a child interactor entity follows. */\nexport type XrInteractorSide = \"left\" | \"right\";\n\n/** Optional initializer for {@link XRInteractorComponent}. */\nexport type XRInteractorOptions = {\n /** What to render at the hands. */\n interactorType?: XrInteractorType;\n /** Look for tracked-hand meshes. */\n handPreset?: XrHandPreset;\n /** Tint applied by the preset (and by `custom`). */\n handColor?: string;\n /** 0-1; `ghost` leans on this. */\n handOpacity?: number;\n /** Emissive strength, used by `neon`. */\n handEmissiveIntensity?: number;\n /** Draw the aim ray from each hand. */\n /** When the pointer ray is drawn. */\n rayVisibility?: XrRayVisibility;\n /** Pointer ray colour. */\n rayColor?: string;\n /** Pointer ray thickness (diameter), metres. */\n rayThickness?: number;\n};\n\n/**\n * Configures what the user sees as their hands, and hosts custom hand content.\n *\n * An interactor entity owns two children — a left and a right interactor —\n * whose transforms are driven by the corresponding tracked hand. Anything an\n * author parents under those children renders at that hand, which is how custom\n * tools, gloves, or held props are built without any scripting.\n *\n * @category Components\n */\nexport class XRInteractorComponent extends Component {\n /** What to render at the hands. */\n interactorType: XrInteractorType;\n /** Look for tracked-hand meshes. */\n handPreset: XrHandPreset;\n /** Tint applied by the preset. */\n handColor: string;\n /** 0-1 opacity for translucent presets. */\n handOpacity: number;\n /** Emissive strength for glowing presets. */\n handEmissiveIntensity: number;\n /** Draw the aim ray from each hand. */\n /** When the pointer ray is drawn. */\n rayVisibility: XrRayVisibility;\n /** Pointer ray colour. */\n rayColor: string;\n /** Pointer ray thickness (diameter), metres. */\n rayThickness: number;\n\n constructor(options?: XRInteractorOptions) {\n super();\n this.interactorType = options?.interactorType ?? \"both\";\n this.handPreset = options?.handPreset ?? \"default\";\n this.handColor = options?.handColor ?? \"#e8b48a\";\n this.handOpacity = options?.handOpacity ?? 1;\n this.handEmissiveIntensity = options?.handEmissiveIntensity ?? 0;\n this.rayVisibility = options?.rayVisibility ?? \"interacting\";\n this.rayColor = options?.rayColor ?? \"#4da3ff\";\n // A hairline is nearly invisible on a headset; ~6mm reads clearly without\n // obscuring what it points at.\n this.rayThickness = options?.rayThickness ?? 0.006;\n }\n}\n\n/**\n * Marks an entity as the left or right hand slot of an {@link XRInteractorComponent}.\n *\n * Its transform is driven every frame from the tracked hand, so authored\n * children ride along. Authors never set this by hand — the interactor factory\n * creates both slots.\n *\n * @category Components\n */\nexport class XRInteractorSideComponent extends Component {\n /** Which hand this slot follows. */\n side: XrInteractorSide;\n\n constructor(options?: { side?: XrInteractorSide }) {\n super();\n this.side = options?.side ?? \"left\";\n }\n}\n","import type {\n XrFinger,\n XrFingerTarget,\n XrHandPoseDefinition,\n XrHandPoseDirection,\n XrHandPoseOrientation,\n} from \"./handPose\";\n\n/**\n * The stock pose library.\n *\n * Curl targets are anatomical rather than measured — no toolkit publishes its\n * numbers, they live in binary assets — so these are derived from what each\n * finger physically does in the gesture, with tolerances wide enough to survive\n * hand-to-hand variation. They are starting points: every one is editable, and\n * the pose editor exists precisely so a scene can tighten or loosen them.\n *\n * Tolerances follow a simple rule: the extremes (fully extended, fully curled)\n * get generous bands because they are far apart and unambiguous; mid-range\n * targets get tighter ones because that is where poses collide.\n */\n\n/** Comfortable slack for a finger held at an extreme. */\nconst WIDE = 0.35;\n/** Tighter band for mid-range targets, which sit closer to their neighbours. */\nconst NARROW = 0.25;\n\nconst EXTENDED: XrFingerTarget = { curl: 0.05, tolerance: WIDE };\nconst CURLED: XrFingerTarget = { curl: 0.95, tolerance: WIDE };\n/** A thumb tucked across the palm, as in a fist. */\nconst THUMB_TUCKED: XrFingerTarget = { curl: 0.7, tolerance: NARROW + 0.1 };\n/** A thumb resting alongside curled fingers without being wrapped. */\nconst THUMB_RELAXED: XrFingerTarget = { curl: 0.6, tolerance: 0.4 };\n\nfunction fingers(\n thumb: XrFingerTarget,\n index: XrFingerTarget,\n middle: XrFingerTarget,\n ring: XrFingerTarget,\n pinky: XrFingerTarget,\n): Record<XrFinger, XrFingerTarget> {\n return { thumb, index, middle, ring, pinky };\n}\n\nconst THUMB_UP: XrHandPoseOrientation = {\n axis: \"thumb\",\n direction: \"up\",\n toleranceDegrees: 45,\n};\n\nconst THUMB_DOWN: XrHandPoseOrientation = {\n axis: \"thumb\",\n direction: \"down\",\n toleranceDegrees: 45,\n};\n\n/**\n * Built-in poses, keyed by id.\n *\n * The set covers the industry consensus (fist, open palm, point, thumbs up,\n * pinch) plus the widely-requested ones the major toolkits omit — OK sign and\n * gun — and the expressive extras that read well in social VR.\n */\nexport const HAND_POSE_PRESETS: Record<string, XrHandPoseDefinition> = {\n fist: {\n id: \"fist\",\n name: \"Fist\",\n fingers: fingers(THUMB_TUCKED, CURLED, CURLED, CURLED, CURLED),\n },\n\n \"open-palm\": {\n id: \"open-palm\",\n name: \"Open Palm\",\n fingers: fingers(EXTENDED, EXTENDED, EXTENDED, EXTENDED, EXTENDED),\n },\n\n point: {\n id: \"point\",\n name: \"Point\",\n fingers: fingers(THUMB_RELAXED, EXTENDED, CURLED, CURLED, CURLED),\n },\n\n \"thumbs-up\": {\n id: \"thumbs-up\",\n name: \"Thumbs Up\",\n fingers: fingers(EXTENDED, CURLED, CURLED, CURLED, CURLED),\n orientation: THUMB_UP,\n },\n\n \"thumbs-down\": {\n id: \"thumbs-down\",\n name: \"Thumbs Down\",\n fingers: fingers(EXTENDED, CURLED, CURLED, CURLED, CURLED),\n orientation: THUMB_DOWN,\n },\n\n peace: {\n id: \"peace\",\n name: \"Peace\",\n fingers: fingers(THUMB_RELAXED, EXTENDED, EXTENDED, CURLED, CURLED),\n },\n\n pinch: {\n id: \"pinch\",\n name: \"Pinch\",\n // Curl is left loose: what defines a pinch is the tips MEETING, and people\n // pinch with wildly different amounts of finger bend.\n fingers: fingers(\n { curl: 0.5, tolerance: 0.5 },\n { curl: 0.5, tolerance: 0.5 },\n { curl: 0.5, tolerance: 0.5 },\n { curl: 0.5, tolerance: 0.5 },\n { curl: 0.5, tolerance: 0.5 },\n ),\n pinch: { finger: \"index\", target: 1, tolerance: 0.25 },\n },\n\n ok: {\n id: \"ok\",\n name: \"OK Sign\",\n // Thumb and index meet in a ring while the rest stay up — that contrast with\n // a plain pinch is the whole gesture, so the other three are constrained.\n fingers: fingers(\n { curl: 0.5, tolerance: 0.4 },\n { curl: 0.55, tolerance: 0.35 },\n EXTENDED,\n EXTENDED,\n EXTENDED,\n ),\n pinch: { finger: \"index\", target: 1, tolerance: 0.3 },\n },\n\n gun: {\n id: \"gun\",\n name: \"Gun\",\n fingers: fingers(EXTENDED, EXTENDED, CURLED, CURLED, CURLED),\n },\n\n rock: {\n id: \"rock\",\n name: \"Rock Horns\",\n fingers: fingers(THUMB_TUCKED, EXTENDED, CURLED, CURLED, EXTENDED),\n },\n\n shaka: {\n id: \"shaka\",\n name: \"Shaka\",\n fingers: fingers(EXTENDED, CURLED, CURLED, CURLED, EXTENDED),\n },\n\n \"palm-up\": {\n id: \"palm-up\",\n name: \"Palm Up\",\n fingers: fingers(EXTENDED, EXTENDED, EXTENDED, EXTENDED, EXTENDED),\n orientation: {\n axis: \"palm-normal\",\n direction: \"up\",\n toleranceDegrees: 40,\n },\n },\n};\n\n/** Preset ids, in the order the editor lists them. */\nexport const HAND_POSE_PRESET_IDS: readonly string[] =\n Object.keys(HAND_POSE_PRESETS);\n\n/**\n * A deep copy of a preset.\n *\n * Returned by value because scenes edit their poses: handing out the shared\n * object would let one scene's tweak leak into every other pose in the app.\n */\nexport function getHandPosePreset(id: string): XrHandPoseDefinition | null {\n const preset = HAND_POSE_PRESETS[id];\n if (!preset) return null;\n return cloneHandPose(preset);\n}\n\nfunction cloneTarget(target: XrFingerTarget): XrFingerTarget {\n return {\n ...target,\n ...(target.directions ? { directions: [...target.directions] } : {}),\n };\n}\n\nexport function cloneHandPose(\n definition: XrHandPoseDefinition,\n): XrHandPoseDefinition {\n return {\n ...definition,\n fingers: {\n thumb: cloneTarget(definition.fingers.thumb),\n index: cloneTarget(definition.fingers.index),\n middle: cloneTarget(definition.fingers.middle),\n ring: cloneTarget(definition.fingers.ring),\n pinky: cloneTarget(definition.fingers.pinky),\n },\n pinch: definition.pinch ? { ...definition.pinch } : undefined,\n orientation: definition.orientation\n ? { ...definition.orientation }\n : undefined,\n };\n}\n\n/**\n * Build a pose from five curl values — the shape the editor's sliders and the\n * AI tools produce.\n */\nexport function handPoseFromCurls(\n id: string,\n name: string,\n curls: Record<XrFinger, number>,\n options?: {\n tolerance?: number;\n pinch?: XrHandPoseDefinition[\"pinch\"];\n orientation?: XrHandPoseOrientation;\n hand?: \"left\" | \"right\";\n /** Per-finger accepted directions; empty lists leave a finger free. */\n directions?: Partial<Record<XrFinger, XrHandPoseDirection[]>>;\n directionToleranceDegrees?: number;\n },\n): XrHandPoseDefinition {\n const tolerance = options?.tolerance ?? NARROW;\n const target = (finger: XrFinger, curl: number): XrFingerTarget => {\n const directions = options?.directions?.[finger];\n return {\n curl: Math.min(1, Math.max(0, curl)),\n tolerance,\n ...(directions && directions.length > 0 ? { directions } : {}),\n };\n };\n\n return {\n id,\n name,\n fingers: {\n thumb: target(\"thumb\", curls.thumb),\n index: target(\"index\", curls.index),\n middle: target(\"middle\", curls.middle),\n ring: target(\"ring\", curls.ring),\n pinky: target(\"pinky\", curls.pinky),\n },\n pinch: options?.pinch,\n orientation: options?.orientation,\n directionToleranceDegrees: options?.directionToleranceDegrees,\n hand: options?.hand,\n };\n}\n","import { Component } from \"../Component\";\nimport type {\n XrFinger,\n XrHandPoseDefinition,\n XrHandPoseDirection,\n XrHandPoseOrientation,\n} from \"../xr/handPose\";\nimport { handPoseFromCurls } from \"../xr/handPosePresets\";\n\n/**\n * One pose an entity listens for.\n *\n * A pose is either a named PRESET or a CUSTOM set of finger curls. Storing the\n * preset id rather than a copy of its numbers means a preset improved in a later\n * release reaches existing scenes, while custom poses stay pinned to exactly\n * what the author dialled in.\n */\nexport type XrHandPoseEntry = {\n /** Stable id, unique within the component. Used in Behaviour hooks. */\n id: string;\n /** Shown in the inspector and passed to scripts. */\n name: string;\n /** Preset id, or null for a custom pose. */\n preset: string | null;\n /** Per-finger curl targets, 0 extended → 1 curled. Custom poses only. */\n curls: Record<XrFinger, number>;\n /** Slack around each curl target. Larger is easier to perform. */\n tolerance: number;\n /**\n * Directions each finger may point. Empty means the finger may point anywhere.\n *\n * Any ONE listed direction satisfies the finger, mirroring fingerpose's\n * `addDirection` — \"thumb up OR diagonally up\" is one pose, not two.\n */\n directions: Record<XrFinger, XrHandPoseDirection[]>;\n /** How far a finger may point from an accepted direction, in degrees. */\n directionTolerance: number;\n /** Which hand may trigger it; null for either. */\n hand: \"left\" | \"right\" | null;\n /** Optional direction requirement. */\n orientation: XrHandPoseOrientation | null;\n /** Seconds the pose must be held before it fires. */\n minHoldSeconds: number;\n enabled: boolean;\n};\n\nexport type XRHandPoseOptions = {\n enabled?: boolean;\n poses?: XrHandPoseEntry[];\n};\n\nexport const DEFAULT_POSE_CURLS: Record<XrFinger, number> = {\n thumb: 0,\n index: 0,\n middle: 0,\n ring: 0,\n pinky: 0,\n};\n\nexport const DEFAULT_POSE_DIRECTIONS: Record<XrFinger, XrHandPoseDirection[]> =\n {\n thumb: [],\n index: [],\n middle: [],\n ring: [],\n pinky: [],\n };\n\n/** A pose entry with every field populated, for the editor and AI tools. */\nexport function createHandPoseEntry(\n partial: Partial<XrHandPoseEntry> & { id: string },\n): XrHandPoseEntry {\n return {\n id: partial.id,\n name: partial.name ?? partial.id,\n preset: partial.preset ?? null,\n curls: { ...DEFAULT_POSE_CURLS, ...partial.curls },\n tolerance: partial.tolerance ?? 0.25,\n directions: {\n thumb: [...(partial.directions?.thumb ?? [])],\n index: [...(partial.directions?.index ?? [])],\n middle: [...(partial.directions?.middle ?? [])],\n ring: [...(partial.directions?.ring ?? [])],\n pinky: [...(partial.directions?.pinky ?? [])],\n },\n directionTolerance: partial.directionTolerance ?? 45,\n hand: partial.hand ?? null,\n orientation: partial.orientation ?? null,\n minHoldSeconds: partial.minHoldSeconds ?? 0.15,\n enabled: partial.enabled ?? true,\n };\n}\n\n/**\n * Resolve an entry to the definition the matcher consumes.\n *\n * Preset entries defer to the shared library but still honour the entry's own\n * hand restriction and hold time, so a scene can reuse \"thumbs up\" while\n * scoping it to one hand.\n */\nexport function handPoseDefinitionFor(\n entry: XrHandPoseEntry,\n resolvePreset: (id: string) => XrHandPoseDefinition | null,\n): XrHandPoseDefinition | null {\n if (entry.preset) {\n const preset = resolvePreset(entry.preset);\n if (!preset) return null;\n return {\n ...preset,\n id: entry.id,\n name: entry.name,\n hand: entry.hand ?? preset.hand,\n orientation: entry.orientation ?? preset.orientation,\n };\n }\n\n return handPoseFromCurls(entry.id, entry.name, entry.curls, {\n tolerance: entry.tolerance,\n orientation: entry.orientation ?? undefined,\n hand: entry.hand ?? undefined,\n directions: entry.directions,\n directionToleranceDegrees: entry.directionTolerance,\n });\n}\n\n/**\n * Listens for hand poses and reports them to the entity's Behaviours.\n *\n * Attached to any entity that wants to react to a gesture — the poses are\n * detected on the user's hands, not on the entity, so this is a subscription\n * rather than a property of the object itself.\n *\n * @category Components\n */\nexport class XRHandPoseComponent extends Component {\n enabled: boolean;\n poses: XrHandPoseEntry[];\n\n constructor(options?: XRHandPoseOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n this.poses = (options?.poses ?? []).map((pose) => createHandPoseEntry(pose));\n }\n}\n","const LOCAL_DRACO_DECODER_RELATIVE_PATH = \"./assets/draco/\";\nexport const DRACO_DECODER_CDN_PATH =\n \"https://www.gstatic.com/draco/versioned/decoders/1.5.7/\";\n\nlet dracoDecoderPathOverride: string | null = null;\n\n/**\n * Override where the DRACO decoder files (draco_wasm_wrapper.js,\n * draco_decoder.wasm, draco_decoder.js) are fetched from. Embedding apps\n * whose bundlers relocate this package's chunks — making the default\n * import.meta.url resolution point at a location that is never populated —\n * should call this before any model loads. The path must end with \"/\".\n * Pass null to restore the default resolution.\n */\nexport function setDracoDecoderPath(path: string | null): void {\n dracoDecoderPathOverride = path;\n}\n\nfunction isBlockedBrowserFileUrl(url: string): boolean {\n return url.startsWith(\"file://\");\n}\n\nexport function resolveDracoDecoderPath(): string {\n if (dracoDecoderPathOverride) {\n return dracoDecoderPathOverride;\n }\n\n try {\n // Prefer vendored decoder assets shipped with this package.\n const resolvedPath = new URL(\n LOCAL_DRACO_DECODER_RELATIVE_PATH,\n import.meta.url,\n ).toString();\n\n // Browser loaders cannot fetch file:// resources from package install paths.\n // Fall back to CDN decoders when bundlers emit file URLs for node_modules assets.\n if (isBlockedBrowserFileUrl(resolvedPath)) {\n return DRACO_DECODER_CDN_PATH;\n }\n\n return resolvedPath;\n } catch {\n // Fallback keeps compatibility in runtimes that cannot resolve package-relative URLs.\n return DRACO_DECODER_CDN_PATH;\n }\n}\n","import * as THREE from \"three\";\nimport { DRACOLoader } from \"three/examples/jsm/loaders/DRACOLoader.js\";\nimport { FBXLoader } from \"three/examples/jsm/loaders/FBXLoader.js\";\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nimport { AnimationComponent, ModelComponent } from \"../components\";\nimport type { AnimationComponentOptions } from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport { resolveDracoDecoderPath } from \"../utils/dracoDecoderPath\";\nimport type { World } from \"../World\";\n\ntype AnimationRuntime = {\n rootUuid: string;\n mixer: THREE.AnimationMixer;\n actions: Map<string, THREE.AnimationAction>;\n clipNameToIds: Map<string, string[]>;\n activeClipId: string | null;\n clipSignature: string;\n sourceSignature: string;\n sourceToken: number;\n importedSourceClips: Map<string, THREE.AnimationClip[]>;\n pendingSources: Set<string>;\n};\n\ntype RuntimeClipEntry = {\n id: string;\n name: string;\n clip: THREE.AnimationClip;\n};\n\ntype PendingHydratedAnimationOptions = Pick<\n AnimationComponentOptions,\n | \"paused\"\n | \"reverse\"\n | \"timeScale\"\n | \"crossFadeDuration\"\n | \"activeState\"\n | \"states\"\n | \"externalClipSources\"\n>;\n\nfunction createClipSourceLoader(): GLTFLoader {\n const loader = new GLTFLoader();\n\n try {\n const dracoLoader = new DRACOLoader();\n dracoLoader.setDecoderPath(resolveDracoDecoderPath());\n loader.setDRACOLoader(dracoLoader);\n } catch (error) {\n console.warn(\"DRACOLoader could not be configured for clip source loading.\", error);\n }\n\n return loader;\n}\n\nfunction normalizeDeltaTime(deltaTime: number): number {\n return Number.isFinite(deltaTime) ? Math.max(0, deltaTime) : 0;\n}\n\nfunction sanitizeTimeScale(timeScale: number): number {\n if (!Number.isFinite(timeScale) || Math.abs(timeScale) < 0.0001) {\n return 1;\n }\n\n return Math.abs(timeScale);\n}\n\nfunction sanitizeCrossFadeDuration(duration: number): number {\n if (!Number.isFinite(duration) || duration < 0) {\n return 0;\n }\n\n return duration;\n}\n\nfunction buildClipSignature(entries: RuntimeClipEntry[]): string {\n return entries\n .map((entry) => entry.id)\n .sort((a, b) => a.localeCompare(b))\n .join(\"|\");\n}\n\nfunction readRuntimeClipEntries(animation: AnimationComponent): RuntimeClipEntry[] {\n if (Array.isArray(animation.clipCatalog) && animation.clipCatalog.length > 0) {\n return animation.clipCatalog.map((entry) => ({\n id: entry.id,\n name: entry.name,\n clip: entry.clip,\n }));\n }\n\n if (!Array.isArray(animation.clips)) {\n return [];\n }\n\n return animation.clips\n .map((clip, index) => {\n const name = typeof clip?.name === \"string\" ? clip.name : \"\";\n if (!name) {\n return null;\n }\n\n return {\n id: `legacy:${index}:${name}`,\n name,\n clip,\n };\n })\n .filter((entry): entry is RuntimeClipEntry => entry !== null);\n}\n\nfunction normalizeClipSources(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const seen = new Set<string>();\n const sources: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\") {\n continue;\n }\n\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n sources.push(trimmed);\n }\n\n return sources;\n}\n\nfunction extractFileExtension(url: string): string {\n const clean = url.split(\"?\")[0]?.split(\"#\")[0] ?? \"\";\n const ext = clean.split(\".\").pop();\n return typeof ext === \"string\" ? ext.toLowerCase() : \"\";\n}\n\nfunction createActions(\n mixer: THREE.AnimationMixer,\n entries: RuntimeClipEntry[],\n): {\n actions: Map<string, THREE.AnimationAction>;\n clipNameToIds: Map<string, string[]>;\n} {\n const actions = new Map<string, THREE.AnimationAction>();\n const clipNameToIds = new Map<string, string[]>();\n\n for (const entry of entries) {\n if (!entry.name) {\n continue;\n }\n\n actions.set(entry.id, mixer.clipAction(entry.clip));\n\n const ids = clipNameToIds.get(entry.name) ?? [];\n ids.push(entry.id);\n clipNameToIds.set(entry.name, ids);\n }\n\n return { actions, clipNameToIds };\n}\n\nfunction stopAllActions(runtime: AnimationRuntime): void {\n runtime.actions.forEach((action) => {\n action.stop();\n });\n runtime.mixer.stopAllAction();\n runtime.activeClipId = null;\n}\n\nfunction transitionToClip(\n runtime: AnimationRuntime,\n nextClipId: string | null,\n crossFadeDuration: number,\n): void {\n if (runtime.activeClipId === nextClipId) {\n return;\n }\n\n const previousAction = runtime.activeClipId\n ? runtime.actions.get(runtime.activeClipId)\n : undefined;\n const nextAction = nextClipId ? runtime.actions.get(nextClipId) : undefined;\n\n if (!nextAction) {\n if (previousAction) {\n previousAction.stop();\n }\n runtime.activeClipId = null;\n return;\n }\n\n if (!previousAction || previousAction === nextAction) {\n nextAction.reset();\n nextAction.play();\n runtime.activeClipId = nextClipId;\n return;\n }\n\n if (crossFadeDuration > 0) {\n nextAction.reset();\n nextAction.play();\n previousAction.crossFadeTo(nextAction, crossFadeDuration, true);\n } else {\n previousAction.stop();\n nextAction.reset();\n nextAction.play();\n }\n\n runtime.activeClipId = nextClipId;\n}\n\nfunction applyActionState(\n action: THREE.AnimationAction,\n component: AnimationComponent,\n paused: boolean,\n shouldLoop: boolean,\n): void {\n const loopMode = shouldLoop ? THREE.LoopRepeat : THREE.LoopOnce;\n const repetitions = shouldLoop ? Infinity : 1;\n action.setLoop(loopMode, repetitions);\n action.clampWhenFinished = !shouldLoop;\n action.paused = paused;\n\n const direction = component.reverse ? -1 : 1;\n action.setEffectiveTimeScale(sanitizeTimeScale(component.timeScale) * direction);\n}\n\nfunction applyPendingHydratedOptions(component: AnimationComponent, runtime?: AnimationRuntime): void {\n const pending = (\n component as AnimationComponent & {\n __pendingHydratedOptions?: PendingHydratedAnimationOptions;\n }\n ).__pendingHydratedOptions;\n\n if (!pending) {\n return;\n }\n\n if (Array.isArray(pending.externalClipSources)) {\n component.setExternalClipSources(pending.externalClipSources);\n }\n\n if (!Array.isArray(component.clips) || component.clips.length === 0) {\n return;\n }\n\n if (runtime && runtime.pendingSources.size > 0) {\n return;\n }\n\n const states = Array.isArray(pending.states) ? pending.states : [];\n if (states.length > 0) {\n component.setStates(states);\n }\n\n if (typeof pending.reverse === \"boolean\") {\n component.reverse = pending.reverse;\n }\n\n if (typeof pending.timeScale === \"number\" && Number.isFinite(pending.timeScale)) {\n component.timeScale = pending.timeScale;\n }\n\n if (\n typeof pending.crossFadeDuration === \"number\" &&\n Number.isFinite(pending.crossFadeDuration)\n ) {\n component.crossFadeDuration = Math.max(0, pending.crossFadeDuration);\n }\n\n if (typeof pending.activeState === \"string\" && pending.activeState.length > 0) {\n component.setActiveState(pending.activeState, !pending.paused);\n }\n\n if (typeof pending.paused === \"boolean\") {\n if (pending.paused) {\n component.pauseState(pending.activeState ?? undefined);\n } else {\n component.playState(pending.activeState ?? undefined);\n }\n }\n\n delete (\n component as AnimationComponent & {\n __pendingHydratedOptions?: PendingHydratedAnimationOptions;\n }\n ).__pendingHydratedOptions;\n}\n\nexport class AnimationSystem implements EcsSystem {\n private readonly runtimeByEntity = new Map<number, AnimationRuntime>();\n private readonly gltfLoader = createClipSourceLoader();\n private readonly fbxLoader = new FBXLoader();\n\n private async loadClipsFromSource(sourceUrl: string): Promise<THREE.AnimationClip[]> {\n const ext = extractFileExtension(sourceUrl);\n\n if (ext === \"fbx\") {\n return new Promise((resolve, reject) => {\n this.fbxLoader.load(\n sourceUrl,\n (object) => {\n const clips = Array.isArray(object.animations) ? object.animations : [];\n resolve(clips);\n },\n undefined,\n reject,\n );\n });\n }\n\n if (ext === \"glb\" || ext === \"gltf\") {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n sourceUrl,\n (gltf) => {\n const clips = Array.isArray(gltf.animations) ? gltf.animations : [];\n resolve(clips);\n },\n undefined,\n reject,\n );\n });\n }\n\n return [];\n }\n\n private refreshExternalClipSources(\n world: World,\n entityId: number,\n animation: AnimationComponent,\n runtime: AnimationRuntime,\n ): void {\n const normalizedSources = normalizeClipSources(animation.externalClipSources);\n const sourceSignature = normalizedSources.join(\"|\");\n\n if (runtime.sourceSignature !== sourceSignature) {\n runtime.sourceSignature = sourceSignature;\n runtime.sourceToken += 1;\n runtime.pendingSources.clear();\n runtime.importedSourceClips.clear();\n animation.setImportedClips([]);\n }\n\n const sourceSet = new Set(normalizedSources);\n for (const loadedSource of runtime.importedSourceClips.keys()) {\n if (!sourceSet.has(loadedSource)) {\n runtime.importedSourceClips.delete(loadedSource);\n }\n }\n\n const mergedLoadedClips = [...runtime.importedSourceClips.values()].flat();\n animation.setImportedClips(\n normalizedSources.flatMap((sourceUrl) => {\n const clipsForSource = runtime.importedSourceClips.get(sourceUrl) ?? [];\n return clipsForSource.map((clip) => ({ clip, sourceUrl }));\n }),\n );\n\n for (const sourceUrl of normalizedSources) {\n if (\n runtime.importedSourceClips.has(sourceUrl) ||\n runtime.pendingSources.has(sourceUrl)\n ) {\n continue;\n }\n\n runtime.pendingSources.add(sourceUrl);\n const sourceToken = runtime.sourceToken;\n\n void this.loadClipsFromSource(sourceUrl)\n .then((clips) => {\n const currentRuntime = this.runtimeByEntity.get(entityId);\n if (!currentRuntime || currentRuntime.sourceToken !== sourceToken) {\n return;\n }\n\n currentRuntime.pendingSources.delete(sourceUrl);\n currentRuntime.importedSourceClips.set(sourceUrl, clips);\n\n const currentAnimation = world.getComponent(entityId, AnimationComponent);\n if (!currentAnimation) {\n return;\n }\n\n currentAnimation.setImportedClips(\n normalizedSources.flatMap((url) => {\n const clipsForSource = currentRuntime.importedSourceClips.get(url) ?? [];\n return clipsForSource.map((clip) => ({ clip, sourceUrl: url }));\n }),\n );\n })\n .catch((error) => {\n const currentRuntime = this.runtimeByEntity.get(entityId);\n if (!currentRuntime || currentRuntime.sourceToken !== sourceToken) {\n return;\n }\n\n currentRuntime.pendingSources.delete(sourceUrl);\n currentRuntime.importedSourceClips.delete(sourceUrl);\n console.warn(`Failed to load animation source: ${sourceUrl}`, error);\n });\n }\n }\n\n private release(entityId: number): void {\n const runtime = this.runtimeByEntity.get(entityId);\n if (!runtime) {\n return;\n }\n\n stopAllActions(runtime);\n this.runtimeByEntity.delete(entityId);\n }\n\n update(world: World, deltaTime: number): void {\n const entityIds = world.query(AnimationComponent, ModelComponent);\n const alive = new Set<number>(entityIds);\n\n for (const trackedEntityId of this.runtimeByEntity.keys()) {\n if (!alive.has(trackedEntityId)) {\n this.release(trackedEntityId);\n }\n }\n\n const step = normalizeDeltaTime(deltaTime);\n\n for (const entityId of entityIds) {\n const animation = world.getComponent(entityId, AnimationComponent);\n const model = world.getComponent(entityId, ModelComponent);\n const root = model?.object ?? null;\n\n if (!animation || !model || !root) {\n this.release(entityId);\n continue;\n }\n\n const existing = this.runtimeByEntity.get(entityId);\n let runtime = existing;\n\n if (!runtime || runtime.rootUuid !== root.uuid) {\n if (runtime) {\n stopAllActions(runtime);\n }\n\n const mixer = new THREE.AnimationMixer(root);\n const entries = readRuntimeClipEntries(animation);\n const indexedActions = createActions(mixer, entries);\n runtime = {\n rootUuid: root.uuid,\n mixer,\n actions: indexedActions.actions,\n clipNameToIds: indexedActions.clipNameToIds,\n activeClipId: null,\n clipSignature: buildClipSignature(entries),\n sourceSignature: \"\",\n sourceToken: 0,\n importedSourceClips: new Map<string, THREE.AnimationClip[]>(),\n pendingSources: new Set<string>(),\n };\n\n this.runtimeByEntity.set(entityId, runtime);\n }\n\n this.refreshExternalClipSources(world, entityId, animation, runtime);\n\n applyPendingHydratedOptions(animation, runtime);\n\n // Skip playback updates for invisible entities. The runtime and clip catalog\n // are still maintained so animation resumes immediately on visibility restore.\n if (!world.isEntityVisible(entityId)) {\n continue;\n }\n\n const entries = readRuntimeClipEntries(animation);\n const clipSignature = buildClipSignature(entries);\n if (runtime.clipSignature !== clipSignature) {\n stopAllActions(runtime);\n const indexedActions = createActions(runtime.mixer, entries);\n runtime.actions = indexedActions.actions;\n runtime.clipNameToIds = indexedActions.clipNameToIds;\n runtime.clipSignature = clipSignature;\n }\n\n if (runtime.actions.size === 0) {\n continue;\n }\n\n const activeState = animation.active;\n const stateClipId =\n typeof activeState?.clipId === \"string\" && activeState.clipId.length > 0\n ? activeState.clipId\n : null;\n const stateClipName = activeState?.clip.name ?? null;\n const fallbackClipId =\n stateClipName && runtime.clipNameToIds.has(stateClipName)\n ? runtime.clipNameToIds.get(stateClipName)?.[0] ?? null\n : null;\n const nextClipId =\n stateClipId && runtime.actions.has(stateClipId)\n ? stateClipId\n : fallbackClipId && runtime.actions.has(fallbackClipId)\n ? fallbackClipId\n : null;\n const hasActiveState = Boolean(activeState);\n const isPaused = hasActiveState\n ? !(activeState?.isPlaying ?? false)\n : animation.paused;\n\n if (hasActiveState) {\n animation.paused = isPaused;\n }\n\n transitionToClip(\n runtime,\n nextClipId,\n sanitizeCrossFadeDuration(animation.crossFadeDuration),\n );\n\n if (!runtime.activeClipId) {\n continue;\n }\n\n const action = runtime.actions.get(runtime.activeClipId);\n if (!action) {\n continue;\n }\n\n applyActionState(action, animation, isPaused, Boolean(activeState?.loop));\n\n if (animation.reverse && action.time <= 0) {\n action.time = action.getClip().duration;\n }\n\n runtime.mixer.update(step);\n\n if (activeState?.isPlaying) {\n activeState.onPlaying();\n }\n }\n }\n\n dispose(): void {\n for (const runtime of this.runtimeByEntity.values()) {\n stopAllActions(runtime);\n }\n\n this.runtimeByEntity.clear();\n }\n}\n","import * as THREE from \"three\";\n\nimport { CameraComponent } from \"../components/Camera\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nconst MIN_NEAR = 0.001;\nconst MIN_FAR_DELTA = 0.001;\nconst MIN_FOV = 1;\nconst MAX_FOV = 179;\nconst MIN_ZOOM = 0.001;\n\nfunction clampNear(value: number): number {\n if (!Number.isFinite(value)) {\n return MIN_NEAR;\n }\n\n return Math.max(MIN_NEAR, value);\n}\n\nfunction clampFar(value: number, near: number): number {\n if (!Number.isFinite(value)) {\n return near + 1000;\n }\n\n return Math.max(near + MIN_FAR_DELTA, value);\n}\n\nfunction clampFov(value: number): number {\n if (!Number.isFinite(value)) {\n return 50;\n }\n\n return Math.min(MAX_FOV, Math.max(MIN_FOV, value));\n}\n\nfunction clampZoom(value: number): number {\n if (!Number.isFinite(value)) {\n return 1;\n }\n\n return Math.max(MIN_ZOOM, value);\n}\n\nfunction normalizeOrthoBounds(component: CameraComponent): void {\n let left = Number.isFinite(component.left) ? component.left : -5;\n let right = Number.isFinite(component.right) ? component.right : 5;\n let top = Number.isFinite(component.top) ? component.top : 5;\n let bottom = Number.isFinite(component.bottom) ? component.bottom : -5;\n\n if (right <= left) {\n right = left + 0.01;\n }\n\n if (top <= bottom) {\n top = bottom + 0.01;\n }\n\n component.left = left;\n component.right = right;\n component.top = top;\n component.bottom = bottom;\n}\n\nfunction isPerspectiveCamera(camera: THREE.Camera): camera is THREE.PerspectiveCamera {\n return camera instanceof THREE.PerspectiveCamera;\n}\n\nfunction isOrthographicCamera(camera: THREE.Camera): camera is THREE.OrthographicCamera {\n return camera instanceof THREE.OrthographicCamera;\n}\n\nfunction readWindowAspect(): number | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const width = window.innerWidth;\n const height = window.innerHeight;\n if (\n Number.isFinite(width) &&\n Number.isFinite(height) &&\n width > 0 &&\n height > 0\n ) {\n return width / height;\n }\n\n return null;\n}\n\nfunction buildSignature(\n component: CameraComponent,\n camera: THREE.Camera,\n windowAspect: number | null,\n): string {\n return [\n component.type,\n component.isDefault,\n component.projection,\n component.fov,\n component.near,\n component.far,\n component.left,\n component.right,\n component.top,\n component.bottom,\n component.zoom,\n windowAspect ?? \"na\",\n camera.uuid,\n ].join(\"|\");\n}\n\nexport class CameraSyncSystem implements EcsSystem {\n private readonly signatures = new Map<number, string>();\n\n update(world: World): void {\n const entityIds = world.query(CameraComponent, Object3DRef);\n const windowAspect = readWindowAspect();\n\n // While an immersive session presents, three owns the render camera's\n // projection: it copies the XR projection matrix onto it and derives `fov`\n // from it every frame. Re-applying the authored fov/aspect here would both\n // fight that and — because the signature includes camera state three keeps\n // changing — invalidate the dirty-check on every single frame.\n // `near`/`far` are still honoured: three READS them off this camera to build\n // the XR render state, so we leave the rest of the sync alone and only skip\n // the camera three has taken over.\n const xrCamera = world.isXrPresenting() ? world.getCamera() : null;\n\n const alive = new Set(entityIds);\n for (const trackedId of this.signatures.keys()) {\n if (!alive.has(trackedId)) {\n this.signatures.delete(trackedId);\n }\n }\n\n for (const entityId of entityIds) {\n const component = world.getComponent(entityId, CameraComponent);\n const objectRef = world.getComponent(entityId, Object3DRef);\n if (!component || !objectRef) {\n continue;\n }\n\n const camera = objectRef.object;\n if (!(camera instanceof THREE.Camera)) {\n continue;\n }\n\n if (xrCamera !== null && camera === xrCamera) {\n continue;\n }\n\n const nextSignature = buildSignature(component, camera, windowAspect);\n if (this.signatures.get(entityId) === nextSignature) {\n continue;\n }\n\n const near = clampNear(component.near);\n const far = clampFar(component.far, near);\n component.near = near;\n component.far = far;\n\n if (isPerspectiveCamera(camera)) {\n camera.fov = clampFov(component.fov);\n component.fov = camera.fov;\n if (windowAspect !== null) {\n camera.aspect = windowAspect;\n }\n camera.near = near;\n camera.far = far;\n camera.updateProjectionMatrix();\n } else if (isOrthographicCamera(camera)) {\n normalizeOrthoBounds(component);\n camera.left = component.left;\n camera.right = component.right;\n camera.top = component.top;\n camera.bottom = component.bottom;\n camera.zoom = clampZoom(component.zoom);\n component.zoom = camera.zoom;\n camera.near = near;\n camera.far = far;\n camera.updateProjectionMatrix();\n }\n\n component.camera = camera;\n this.signatures.set(entityId, buildSignature(component, camera, windowAspect));\n }\n }\n}\n","import { Object3DRef } from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nexport class ObjectVisibilitySystem implements EcsSystem {\n update(world: World): void {\n const entityIds = world.query(Object3DRef);\n\n for (const entityId of entityIds) {\n const objectRef = world.getComponent(entityId, Object3DRef);\n const object = objectRef?.object;\n if (!objectRef || !object) {\n continue;\n }\n\n const targetVisibility = Boolean(objectRef.visibility);\n if (object.visible !== targetVisibility) {\n object.visible = targetVisibility;\n }\n }\n }\n}\n","import * as THREE from \"three\";\n\nimport { Environment } from \"../components/Environment\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nconst MIN_FOG_DELTA = 0.001;\nconst MIN_DENSITY = 0;\n\nfunction createGradientTexture(\n effect: \"radial\" | \"linear\" | \"angular\",\n colors: string[],\n): THREE.Texture {\n if (typeof document === \"undefined\") {\n const pixel = new Uint8Array([30, 30, 30, 255]);\n const fallback = new THREE.DataTexture(pixel, 1, 1, THREE.RGBAFormat);\n fallback.needsUpdate = true;\n return fallback;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = 512;\n canvas.height = 512;\n\n const context = canvas.getContext(\"2d\");\n if (!context) {\n const fallback = new THREE.CanvasTexture(canvas);\n fallback.needsUpdate = true;\n return fallback;\n }\n\n const safeColors = colors.length > 0 ? colors : [\"#0f172a\", \"#334155\"];\n const lastIndex = Math.max(1, safeColors.length - 1);\n\n let gradient: CanvasGradient;\n if (effect === \"radial\") {\n gradient = context.createRadialGradient(256, 256, 16, 256, 256, 320);\n } else if (effect === \"angular\") {\n gradient = context.createLinearGradient(0, 0, 512, 512);\n } else {\n gradient = context.createLinearGradient(0, 0, 0, 512);\n }\n\n for (let index = 0; index < safeColors.length; index += 1) {\n gradient.addColorStop(index / lastIndex, safeColors[index]);\n }\n\n context.fillStyle = gradient;\n context.fillRect(0, 0, 512, 512);\n\n if (effect === \"angular\") {\n context.globalCompositeOperation = \"overlay\";\n const overlay = context.createRadialGradient(256, 256, 32, 256, 256, 340);\n overlay.addColorStop(0, \"rgba(255,255,255,0.25)\");\n overlay.addColorStop(1, \"rgba(0,0,0,0.2)\");\n context.fillStyle = overlay;\n context.fillRect(0, 0, 512, 512);\n context.globalCompositeOperation = \"source-over\";\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.needsUpdate = true;\n return texture;\n}\n\nexport class EnvironmentSyncSystem implements EcsSystem {\n private readonly scene: THREE.Scene;\n private readonly textureLoader = new THREE.TextureLoader();\n private signature: string | null = null;\n private activeTexture: THREE.Texture | null = null;\n private pendingImageUrl: string | null = null;\n\n constructor(scene: THREE.Scene) {\n this.scene = scene;\n }\n\n private disposeActiveTexture(): void {\n if (this.activeTexture) {\n this.activeTexture.dispose();\n this.activeTexture = null;\n }\n }\n\n private applySkybox(component: Environment): void {\n const skybox = component.values.skybox;\n\n if (skybox.type === \"none\") {\n this.disposeActiveTexture();\n this.pendingImageUrl = null;\n this.scene.background = null;\n return;\n }\n\n if (skybox.type === \"color\") {\n this.disposeActiveTexture();\n this.pendingImageUrl = null;\n this.scene.background = new THREE.Color(skybox.color || \"#1e1e1e\");\n return;\n }\n\n if (skybox.type === \"gradient\") {\n this.disposeActiveTexture();\n this.pendingImageUrl = null;\n const texture = createGradientTexture(\n skybox.gradient.effect,\n skybox.gradient.colors,\n );\n this.activeTexture = texture;\n this.scene.background = texture;\n return;\n }\n\n const imageUrl = skybox.imageUrl?.trim() ?? \"\";\n if (!imageUrl) {\n this.disposeActiveTexture();\n this.pendingImageUrl = null;\n this.scene.background = null;\n return;\n }\n\n if (this.pendingImageUrl === imageUrl && this.activeTexture) {\n this.scene.background = this.activeTexture;\n return;\n }\n\n this.disposeActiveTexture();\n this.pendingImageUrl = imageUrl;\n this.textureLoader.load(\n imageUrl,\n (texture) => {\n if (this.pendingImageUrl !== imageUrl) {\n texture.dispose();\n return;\n }\n\n texture.colorSpace = THREE.SRGBColorSpace;\n this.activeTexture = texture;\n this.scene.background = texture;\n },\n undefined,\n () => {\n if (this.pendingImageUrl === imageUrl) {\n this.pendingImageUrl = null;\n this.scene.background = null;\n }\n },\n );\n }\n\n private applyFog(component: Environment): void {\n const fog = component.values.fog;\n\n if (fog.type === \"none\") {\n this.scene.fog = null;\n return;\n }\n\n const fogColor = new THREE.Color(fog.color || \"#1e1e1e\");\n if (fog.type === \"linear\") {\n const near = Number.isFinite(fog.linear.near) ? fog.linear.near : 1;\n const farCandidate = Number.isFinite(fog.linear.far) ? fog.linear.far : near + 10;\n const far = Math.max(near + MIN_FOG_DELTA, farCandidate);\n this.scene.fog = new THREE.Fog(fogColor, near, far);\n return;\n }\n\n const density = Number.isFinite(fog.exponential.density)\n ? Math.max(MIN_DENSITY, fog.exponential.density)\n : 0.002;\n this.scene.fog = new THREE.FogExp2(fogColor, density);\n }\n\n update(world: World): void {\n const entityIds = world.query(Environment);\n if (entityIds.length === 0) {\n if (this.signature !== null) {\n this.signature = null;\n this.pendingImageUrl = null;\n this.disposeActiveTexture();\n this.scene.background = null;\n this.scene.fog = null;\n }\n return;\n }\n\n const entityId = entityIds[0];\n const environment = world.getComponent(entityId, Environment);\n if (!environment) {\n return;\n }\n\n const nextSignature = JSON.stringify(environment.values);\n if (this.signature === nextSignature) {\n return;\n }\n\n this.signature = nextSignature;\n this.applySkybox(environment);\n this.applyFog(environment);\n }\n\n dispose(): void {\n this.pendingImageUrl = null;\n this.disposeActiveTexture();\n }\n}\n","import { Postprocessing } from \"../components/Postprocessing\";\nimport type { PostprocessingState } from \"../components/Postprocessing\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport * as THREE from \"three\";\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/examples/jsm/postprocessing/RenderPass.js\";\nimport { UnrealBloomPass } from \"three/examples/jsm/postprocessing/UnrealBloomPass.js\";\nimport { DotScreenPass } from \"three/examples/jsm/postprocessing/DotScreenPass.js\";\nimport { GlitchPass } from \"three/examples/jsm/postprocessing/GlitchPass.js\";\nimport { FilmPass } from \"three/examples/jsm/postprocessing/FilmPass.js\";\nimport { BokehPass } from \"three/examples/jsm/postprocessing/BokehPass.js\";\nimport { SSAOPass } from \"three/examples/jsm/postprocessing/SSAOPass.js\";\nimport { ShaderPass } from \"three/examples/jsm/postprocessing/ShaderPass.js\";\nimport { OutputPass } from \"three/examples/jsm/postprocessing/OutputPass.js\";\nimport { HueSaturationShader } from \"three/examples/jsm/shaders/HueSaturationShader.js\";\nimport { SepiaShader } from \"three/examples/jsm/shaders/SepiaShader.js\";\nimport { VignetteShader } from \"three/examples/jsm/shaders/VignetteShader.js\";\n\nexport class PostprocessingSyncSystem implements EcsSystem {\n private readonly renderer: THREE.WebGLRenderer;\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private signature: string | null = null;\n private composer: EffectComposer | null = null;\n private composerEnabled = false;\n\n constructor(\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n ) {\n this.renderer = renderer;\n this.scene = scene;\n this.camera = camera;\n }\n\n private setComposerEnabled(enabled: boolean): void {\n this.composerEnabled = enabled;\n this.scene.userData.ecsPostprocessingComposerActive = enabled;\n if (!enabled) {\n delete this.scene.userData.ecsPostprocessingComposer;\n }\n }\n\n private disposeComposer(): void {\n if (!this.composer) {\n this.setComposerEnabled(false);\n return;\n }\n\n const maybeComposer = this.composer as unknown as {\n passes?: Array<{ dispose?: () => void }>;\n dispose?: () => void;\n };\n\n if (Array.isArray(maybeComposer.passes)) {\n for (const pass of maybeComposer.passes) {\n pass.dispose?.();\n }\n }\n\n maybeComposer.dispose?.();\n this.composer = null;\n this.setComposerEnabled(false);\n }\n\n private buildComposer(values: PostprocessingState): void {\n this.disposeComposer();\n\n if (!values.postEnabled) {\n return;\n }\n\n const composer = new EffectComposer(this.renderer);\n composer.addPass(new RenderPass(this.scene, this.camera));\n\n if (values.dof.enabled) {\n composer.addPass(\n new BokehPass(this.scene, this.camera, {\n focus: values.dof.focusDistance,\n aperture: Math.max(0, values.dof.focalLength),\n maxblur: Math.max(0, values.dof.bokehScale),\n }),\n );\n }\n\n if (values.bloom.enabled) {\n const size = this.renderer.getSize(new THREE.Vector2());\n composer.addPass(\n new UnrealBloomPass(\n new THREE.Vector2(size.width, size.height),\n values.bloom.intensity,\n values.bloom.radius,\n values.bloom.threshold,\n ),\n );\n }\n\n if (values.vignette.enabled) {\n const pass = new ShaderPass(VignetteShader);\n const offset = pass.uniforms.offset;\n const darkness = pass.uniforms.darkness;\n if (offset) {\n offset.value = values.vignette.offset;\n }\n if (darkness) {\n darkness.value = values.vignette.darkness;\n }\n composer.addPass(pass);\n }\n\n if (values.hueSaturation.enabled) {\n const pass = new ShaderPass(HueSaturationShader);\n const hue = pass.uniforms.hue;\n const saturation = pass.uniforms.saturation;\n if (hue) {\n hue.value = values.hueSaturation.hue;\n }\n if (saturation) {\n saturation.value = values.hueSaturation.saturation;\n }\n composer.addPass(pass);\n }\n\n if (values.sepia.enabled) {\n const pass = new ShaderPass(SepiaShader);\n const amount = pass.uniforms.amount;\n if (amount) {\n amount.value = values.sepia.intensity;\n }\n composer.addPass(pass);\n }\n\n if (values.noise.enabled) {\n composer.addPass(new FilmPass(values.noise.opacity));\n }\n\n if (values.dotScreen.enabled) {\n composer.addPass(\n new DotScreenPass(\n new THREE.Vector2(0, 0),\n values.dotScreen.angle ?? values.dotScreen.dotScreenAngle,\n values.dotScreen.scale ?? values.dotScreen.dotScreenScale,\n ),\n );\n }\n\n if (values.ssao.enabled) {\n const pass = new SSAOPass(this.scene, this.camera);\n pass.kernelRadius = values.ssao.radius;\n pass.minDistance = 0.001;\n pass.maxDistance = Math.max(0.01, values.ssao.intensity);\n composer.addPass(pass);\n }\n\n if (values.glitch.enabled) {\n const pass = new GlitchPass();\n pass.enabled = true;\n pass.goWild = Boolean(values.glitch.active);\n composer.addPass(pass);\n }\n\n composer.addPass(new OutputPass());\n this.composer = composer;\n this.scene.userData.ecsPostprocessingComposer = composer;\n this.setComposerEnabled(true);\n }\n\n update(world: World): void {\n const entityIds = world.query(Postprocessing);\n if (entityIds.length === 0) {\n if (this.signature !== null) {\n this.signature = null;\n this.disposeComposer();\n delete this.scene.userData.ecsPostprocessing;\n }\n return;\n }\n\n const postprocessing = world.getComponent(entityIds[0], Postprocessing);\n if (!postprocessing) {\n return;\n }\n\n const nextSignature = JSON.stringify(postprocessing.values);\n if (this.signature === nextSignature) {\n return;\n }\n\n this.signature = nextSignature;\n this.buildComposer(postprocessing.values);\n\n this.scene.userData.ecsPostprocessing = postprocessing.values;\n }\n\n dispose(): void {\n this.signature = null;\n this.disposeComposer();\n delete this.scene.userData.ecsPostprocessing;\n delete this.scene.userData.ecsPostprocessingComposerActive;\n delete this.scene.userData.ecsPostprocessingComposer;\n }\n}\n","import * as THREE from \"three\";\n\nimport {\n type ColliderState,\n Environment,\n Object3DRef,\n PhysicsComponent,\n type RigidbodyState,\n setPhysicsLiveRef,\n TransformComponent,\n} from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\ntype RapierModule = typeof import(\"@dimforge/rapier3d-compat\");\n\ntype BodyType = RigidbodyState[\"type\"];\ntype EntityId = number;\ntype TriMeshData = {\n vertices: Float32Array;\n indices: Uint32Array;\n signature: string;\n};\n\nconst MIN_SIZE = 0.0001;\n\nfunction toBodyType(\n RAPIER: RapierModule,\n bodyType: BodyType,\n): import(\"@dimforge/rapier3d-compat\").RigidBodyType {\n switch (bodyType) {\n case \"fixed\":\n return RAPIER.RigidBodyType.Fixed;\n case \"kinematicPosition\":\n return RAPIER.RigidBodyType.KinematicPositionBased;\n case \"kinematicVelocity\":\n return RAPIER.RigidBodyType.KinematicVelocityBased;\n case \"dynamic\":\n default:\n return RAPIER.RigidBodyType.Dynamic;\n }\n}\n\nfunction createRigidBodyDesc(\n RAPIER: RapierModule,\n bodyType: BodyType,\n): import(\"@dimforge/rapier3d-compat\").RigidBodyDesc {\n if (bodyType === \"fixed\") {\n return RAPIER.RigidBodyDesc.fixed();\n }\n\n if (bodyType === \"kinematicPosition\") {\n return RAPIER.RigidBodyDesc.kinematicPositionBased();\n }\n\n if (bodyType === \"kinematicVelocity\") {\n return RAPIER.RigidBodyDesc.kinematicVelocityBased();\n }\n\n return RAPIER.RigidBodyDesc.dynamic();\n}\n\nfunction computeColliderState(\n colliderValues: ColliderState,\n object: THREE.Object3D | null,\n): ColliderState {\n if (!object) {\n return colliderValues;\n }\n\n const scale = new THREE.Vector3();\n object.getWorldScale(scale);\n\n return {\n ...colliderValues,\n size: {\n x: Math.max(MIN_SIZE, colliderValues.size.x * Math.abs(scale.x || 1)),\n y: Math.max(MIN_SIZE, colliderValues.size.y * Math.abs(scale.y || 1)),\n z: Math.max(MIN_SIZE, colliderValues.size.z * Math.abs(scale.z || 1)),\n },\n radius: Math.max(\n MIN_SIZE,\n colliderValues.radius *\n Math.max(Math.abs(scale.x || 1), Math.abs(scale.z || 1), 1),\n ),\n height: Math.max(MIN_SIZE, colliderValues.height * Math.abs(scale.y || 1)),\n };\n}\n\nfunction createColliderDesc(\n RAPIER: RapierModule,\n values: ColliderState,\n triMeshData: TriMeshData | null,\n): import(\"@dimforge/rapier3d-compat\").ColliderDesc {\n let desc: import(\"@dimforge/rapier3d-compat\").ColliderDesc;\n\n if (values.shape === \"trimesh\" && triMeshData) {\n desc = RAPIER.ColliderDesc.trimesh(\n triMeshData.vertices,\n triMeshData.indices,\n );\n } else if (values.shape === \"ball\") {\n desc = RAPIER.ColliderDesc.ball(Math.max(MIN_SIZE, values.radius));\n } else if (values.shape === \"capsule\") {\n desc = RAPIER.ColliderDesc.capsule(\n Math.max(MIN_SIZE, values.height / 2),\n Math.max(MIN_SIZE, values.radius),\n );\n } else if (values.shape === \"cylinder\") {\n desc = RAPIER.ColliderDesc.cylinder(\n Math.max(MIN_SIZE, values.height / 2),\n Math.max(MIN_SIZE, values.radius),\n );\n } else {\n desc = RAPIER.ColliderDesc.cuboid(\n Math.max(MIN_SIZE, values.size.x / 2),\n Math.max(MIN_SIZE, values.size.y / 2),\n Math.max(MIN_SIZE, values.size.z / 2),\n );\n }\n\n desc.setRestitution(Math.max(0, values.restitution));\n desc.setFriction(Math.max(0, values.friction));\n desc.setSensor(values.isSensor);\n\n desc.setTranslation(\n values.offsetPosition.x,\n values.offsetPosition.y,\n values.offsetPosition.z,\n );\n\n const offsetQuaternion = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(\n values.offsetRotation.x,\n values.offsetRotation.y,\n values.offsetRotation.z,\n ),\n );\n desc.setRotation(offsetQuaternion);\n\n return desc;\n}\n\ntype TriMeshPart = {\n positionAttribute: THREE.BufferAttribute | THREE.InterleavedBufferAttribute;\n indexAttribute: THREE.BufferAttribute | null;\n positionCount: number;\n indexCount: number;\n relativeMatrix: THREE.Matrix4;\n signature: string;\n};\n\ntype TriMeshParts = {\n parts: TriMeshPart[];\n scale: { x: number; y: number; z: number };\n signature: string;\n};\n\n/**\n * Gather every mesh under the entity as a trimesh part (relative matrix +\n * geometry refs) plus the entity's world scale. Cheap — no vertex work — so it\n * can run per frame to detect changes; `createTriMeshData` does the heavy\n * merge only when the signature actually changed.\n *\n * Rapier bodies carry position+rotation only (no scale), so the entity's world\n * scale must be BAKED into the trimesh vertices — that is what makes a scaled\n * mesh's collider match what is rendered, and what lets users \"scale\" a\n * trimesh by scaling the entity. Mirrors `computeColliderState`'s abs/zero\n * guards for primitive shapes.\n */\nexport function collectTriMeshParts(\n object: THREE.Object3D | null,\n): TriMeshParts | null {\n if (!object) {\n return null;\n }\n\n object.updateWorldMatrix(true, true);\n\n const worldScale = new THREE.Vector3();\n object.getWorldScale(worldScale);\n const scale = {\n x: Math.abs(worldScale.x) || 1,\n y: Math.abs(worldScale.y) || 1,\n z: Math.abs(worldScale.z) || 1,\n };\n\n const worldToObject = new THREE.Matrix4().copy(object.matrixWorld).invert();\n\n const parts: TriMeshPart[] = [];\n object.traverse((child) => {\n if (!(child instanceof THREE.Mesh) || !child.geometry) {\n return;\n }\n\n const geometry = child.geometry;\n const positionAttribute = geometry.getAttribute(\"position\");\n if (!positionAttribute || positionAttribute.itemSize < 3) {\n return;\n }\n const positionCount = positionAttribute.count;\n if (positionCount < 3) {\n return;\n }\n\n const indexAttribute = geometry.getIndex();\n const indexCount = indexAttribute\n ? indexAttribute.count\n : Math.floor(positionCount / 3) * 3;\n if (indexCount < 3) {\n return;\n }\n\n const relativeMatrix = new THREE.Matrix4().multiplyMatrices(\n worldToObject,\n child.matrixWorld,\n );\n const matrixSignature = relativeMatrix.elements\n .map((value) => value.toFixed(5))\n .join(\",\");\n\n parts.push({\n positionAttribute,\n indexAttribute,\n positionCount,\n indexCount,\n relativeMatrix,\n signature: `${child.uuid}:${geometry.uuid}:${positionCount}:${indexCount}:${matrixSignature}`,\n });\n });\n\n if (parts.length === 0) {\n return null;\n }\n\n // The relative matrices are invariant under the entity's own scale, so the\n // scale must be part of the signature for a rescale to trigger a rebuild.\n const scaleSignature = `${scale.x.toFixed(5)},${scale.y.toFixed(5)},${scale.z.toFixed(5)}`;\n return {\n parts,\n scale,\n signature: `${scaleSignature}|${parts.map((p) => p.signature).join(\"|\")}`,\n };\n}\n\n/** Merge all collected mesh parts into one scaled vertex/index trimesh buffer. */\nexport function createTriMeshData(\n collected: TriMeshParts | null,\n): TriMeshData | null {\n if (!collected) {\n return null;\n }\n\n const { parts, scale } = collected;\n let vertexTotal = 0;\n let indexTotal = 0;\n for (const part of parts) {\n vertexTotal += part.positionCount;\n indexTotal += part.indexCount;\n }\n if (vertexTotal < 3 || indexTotal < 3) {\n return null;\n }\n\n const vertices = new Float32Array(vertexTotal * 3);\n const indices = new Uint32Array(indexTotal);\n const point = new THREE.Vector3();\n let vertexOffset = 0;\n let indexOffset = 0;\n\n for (const part of parts) {\n const { positionAttribute, indexAttribute, relativeMatrix } = part;\n for (let index = 0; index < part.positionCount; index += 1) {\n point\n .set(\n positionAttribute.getX(index),\n positionAttribute.getY(index),\n positionAttribute.getZ(index),\n )\n .applyMatrix4(relativeMatrix);\n\n const outputIndex = (vertexOffset + index) * 3;\n vertices[outputIndex] = point.x * scale.x;\n vertices[outputIndex + 1] = point.y * scale.y;\n vertices[outputIndex + 2] = point.z * scale.z;\n }\n\n if (indexAttribute) {\n for (let index = 0; index < part.indexCount; index += 1) {\n indices[indexOffset + index] = vertexOffset + indexAttribute.getX(index);\n }\n } else {\n for (let index = 0; index < part.indexCount; index += 1) {\n indices[indexOffset + index] = vertexOffset + index;\n }\n }\n\n vertexOffset += part.positionCount;\n indexOffset += part.indexCount;\n }\n\n return { vertices, indices, signature: collected.signature };\n}\n\nfunction syncBodyFromTransform(\n body: import(\"@dimforge/rapier3d-compat\").RigidBody,\n transform: TransformComponent,\n): void {\n const quaternion = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(transform.rotation.x, transform.rotation.y, transform.rotation.z),\n );\n\n body.setTranslation(\n {\n x: transform.position.x,\n y: transform.position.y,\n z: transform.position.z,\n },\n true,\n );\n body.setRotation(\n {\n x: quaternion.x,\n y: quaternion.y,\n z: quaternion.z,\n w: quaternion.w,\n },\n true,\n );\n}\n\nfunction syncTransformFromBody(\n transform: TransformComponent,\n body: import(\"@dimforge/rapier3d-compat\").RigidBody,\n): void {\n const position = body.translation();\n const rotation = body.rotation();\n\n transform.position.x = position.x;\n transform.position.y = position.y;\n transform.position.z = position.z;\n\n const euler = new THREE.Euler().setFromQuaternion(\n new THREE.Quaternion(rotation.x, rotation.y, rotation.z, rotation.w),\n );\n\n transform.rotation.x = euler.x;\n transform.rotation.y = euler.y;\n transform.rotation.z = euler.z;\n}\n\nexport class PhysicsSyncSystem implements EcsSystem {\n private readonly rigidBodyHandles = new Map<EntityId, number>();\n private readonly colliderHandles = new Map<EntityId, number>();\n private readonly rigidBodySignatures = new Map<EntityId, string>();\n private readonly colliderSignatures = new Map<EntityId, string>();\n private readonly isEditorMode: boolean;\n private rapier: RapierModule | null = null;\n private isBootstrappingWorld = false;\n private accumulator = 0;\n\n constructor(options?: { isEditor?: boolean }) {\n this.isEditorMode = options?.isEditor ?? false;\n }\n\n private async ensurePhysicsWorld(world: World): Promise<void> {\n if (this.rapier || this.isBootstrappingWorld) {\n return;\n }\n\n this.isBootstrappingWorld = true;\n try {\n const environmentEntityId = world.query(Environment)[0];\n const environment =\n typeof environmentEntityId === \"number\"\n ? world.getComponent(environmentEntityId, Environment)\n : undefined;\n\n const gravity = environment?.values.gravity;\n const rapierWorld = await world.createPhysicsWorld({\n gravity: {\n x: gravity?.x,\n y: gravity?.y,\n z: gravity?.z,\n },\n });\n if (!rapierWorld) {\n return;\n }\n\n const moduleValue = await world.getRapierModule();\n this.rapier = moduleValue;\n } finally {\n this.isBootstrappingWorld = false;\n }\n }\n\n private removeEntityPhysics(\n physicsWorld: import(\"@dimforge/rapier3d-compat\").World,\n entityId: EntityId,\n ): void {\n const rigidBodyHandle = this.rigidBodyHandles.get(entityId);\n if (typeof rigidBodyHandle === \"number\") {\n const rigidBody = physicsWorld.getRigidBody(rigidBodyHandle);\n if (rigidBody) {\n physicsWorld.removeRigidBody(rigidBody);\n }\n }\n\n this.rigidBodyHandles.delete(entityId);\n this.colliderHandles.delete(entityId);\n this.rigidBodySignatures.delete(entityId);\n this.colliderSignatures.delete(entityId);\n }\n\n update(world: World, deltaTime: number): void {\n if (!this.rapier || !world.getPhysicsWorld()) {\n void this.ensurePhysicsWorld(world);\n return;\n }\n\n const physicsWorld = world.getPhysicsWorld();\n if (!physicsWorld) {\n return;\n }\n\n const entities = world.query(TransformComponent, PhysicsComponent);\n const activeEntities = new Set<EntityId>(entities);\n\n for (const entityId of this.rigidBodyHandles.keys()) {\n if (!activeEntities.has(entityId)) {\n this.removeEntityPhysics(physicsWorld, entityId);\n }\n }\n\n for (const entityId of entities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const physics = world.getComponent(entityId, PhysicsComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object ?? null;\n if (!transform || !physics) {\n continue;\n }\n\n if (!physics.values.rigidbody.enabled) {\n this.removeEntityPhysics(physicsWorld, entityId);\n setPhysicsLiveRef(physics, \"rigidBody\", null);\n setPhysicsLiveRef(physics, \"collider\", null);\n continue;\n }\n\n // Body TYPE is deliberately excluded from the rebuild signature and\n // reconciled on the live body below instead.\n //\n // Recreating a body to change its type destroys its velocity, which broke\n // throwing outright: a grab flips the type to kinematic and a release\n // flips it back, so the velocity applied at release was wiped by the\n // rebuild on the very next tick and every throw became a dead drop.\n const { type: _desiredBodyType, ...rigidBodyRebuildValues } =\n physics.values.rigidbody;\n const rigidBodySignature = JSON.stringify(rigidBodyRebuildValues);\n const previousRigidBodySignature = this.rigidBodySignatures.get(entityId);\n const hasRigidBody = this.rigidBodyHandles.has(entityId);\n const shouldRecreateBody =\n !hasRigidBody || previousRigidBodySignature !== rigidBodySignature;\n\n if (shouldRecreateBody) {\n this.removeEntityPhysics(physicsWorld, entityId);\n\n const lockTranslationX =\n physics.values.rigidbody.lockTranslations || physics.values.rigidbody.lockTranslationX;\n const lockTranslationY =\n physics.values.rigidbody.lockTranslations || physics.values.rigidbody.lockTranslationY;\n const lockTranslationZ =\n physics.values.rigidbody.lockTranslations || physics.values.rigidbody.lockTranslationZ;\n const lockRotationX =\n physics.values.rigidbody.lockRotations || physics.values.rigidbody.lockRotationX;\n const lockRotationY =\n physics.values.rigidbody.lockRotations || physics.values.rigidbody.lockRotationY;\n const lockRotationZ =\n physics.values.rigidbody.lockRotations || physics.values.rigidbody.lockRotationZ;\n\n const bodyType = this.isEditorMode ? \"fixed\" : physics.values.rigidbody.type;\n const bodyDesc = createRigidBodyDesc(this.rapier, bodyType)\n .setLinearDamping(physics.values.rigidbody.linearDamping)\n .setAngularDamping(physics.values.rigidbody.angularDamping)\n .setGravityScale(physics.values.rigidbody.gravityScale)\n .setCanSleep(physics.values.rigidbody.canSleep)\n .setCcdEnabled(physics.values.rigidbody.ccdEnabled)\n .enabledTranslations(\n !lockTranslationX,\n !lockTranslationY,\n !lockTranslationZ,\n )\n .enabledRotations(\n !lockRotationX,\n !lockRotationY,\n !lockRotationZ,\n );\n\n bodyDesc.setTranslation(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n\n const quaternion = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(\n transform.rotation.x,\n transform.rotation.y,\n transform.rotation.z,\n ),\n );\n bodyDesc.setRotation(quaternion);\n\n const body = physicsWorld.createRigidBody(bodyDesc);\n if (!this.isEditorMode && physics.values.rigidbody.type === \"dynamic\") {\n body.setAdditionalMass(physics.values.rigidbody.mass, true);\n }\n\n this.rigidBodyHandles.set(entityId, body.handle);\n this.rigidBodySignatures.set(entityId, rigidBodySignature);\n setPhysicsLiveRef(physics, \"rigidBody\", body);\n }\n\n const rigidBodyHandle = this.rigidBodyHandles.get(entityId);\n if (typeof rigidBodyHandle !== \"number\") {\n continue;\n }\n\n const body = physicsWorld.getRigidBody(rigidBodyHandle);\n if (!body) {\n this.removeEntityPhysics(physicsWorld, entityId);\n setPhysicsLiveRef(physics, \"rigidBody\", null);\n setPhysicsLiveRef(physics, \"collider\", null);\n continue;\n }\n\n setPhysicsLiveRef(physics, \"rigidBody\", body);\n\n // Reconcile the live body's type without rebuilding it, so a grab/release\n // cycle preserves the velocity a throw depends on.\n const desiredBodyType = this.isEditorMode\n ? \"fixed\"\n : physics.values.rigidbody.type;\n const desiredRapierType = toBodyType(this.rapier, desiredBodyType);\n if (body.bodyType() !== desiredRapierType) {\n body.setBodyType(desiredRapierType, true);\n // Mass is only meaningful on a dynamic body, and is applied at creation\n // for bodies that start dynamic — reapply when becoming dynamic later.\n if (!this.isEditorMode && desiredBodyType === \"dynamic\") {\n body.setAdditionalMass(physics.values.rigidbody.mass, true);\n }\n }\n\n // Drain a queued throw now that the body is dynamic again. Applying it at\n // release time would have been ignored — the body was still kinematic.\n const pending = physics.pendingVelocity;\n if (pending) {\n setPhysicsLiveRef(physics, \"pendingVelocity\", null);\n if (!this.isEditorMode && desiredBodyType === \"dynamic\") {\n try {\n body.setLinvel(pending.linear, true);\n body.setAngvel(pending.angular, true);\n } catch {\n // Body removed mid-frame — nothing to throw.\n }\n }\n }\n\n if (this.isEditorMode || physics.values.rigidbody.type !== \"dynamic\") {\n syncBodyFromTransform(body, transform);\n }\n\n const effectiveCollider = computeColliderState(physics.values.collider, object);\n // Cheap per-frame collect (matrices + counts only); the heavy vertex merge\n // runs only when the signature changes (mesh load, edit, entity rescale).\n const triMeshParts =\n effectiveCollider.shape === \"trimesh\" ? collectTriMeshParts(object) : null;\n\n if (!effectiveCollider || !effectiveCollider.enabled) {\n const colliderHandle = this.colliderHandles.get(entityId);\n if (typeof colliderHandle === \"number\") {\n const existingCollider = physicsWorld.getCollider(colliderHandle);\n if (existingCollider) {\n physicsWorld.removeCollider(existingCollider, true);\n }\n }\n this.colliderHandles.delete(entityId);\n this.colliderSignatures.delete(entityId);\n setPhysicsLiveRef(physics, \"collider\", null);\n continue;\n }\n\n const colliderSignature = `${JSON.stringify(effectiveCollider)}:${triMeshParts?.signature ?? \"\"}`;\n const previousColliderSignature = this.colliderSignatures.get(entityId);\n if (\n !this.colliderHandles.has(entityId) ||\n previousColliderSignature !== colliderSignature\n ) {\n const previousColliderHandle = this.colliderHandles.get(entityId);\n if (typeof previousColliderHandle === \"number\") {\n const previousCollider = physicsWorld.getCollider(previousColliderHandle);\n if (previousCollider) {\n physicsWorld.removeCollider(previousCollider, true);\n }\n }\n\n const colliderDesc = createColliderDesc(\n this.rapier,\n effectiveCollider,\n createTriMeshData(triMeshParts),\n );\n const createdCollider = physicsWorld.createCollider(colliderDesc, body);\n this.colliderHandles.set(entityId, createdCollider.handle);\n this.colliderSignatures.set(entityId, colliderSignature);\n setPhysicsLiveRef(physics, \"collider\", createdCollider);\n } else {\n const colliderHandle = this.colliderHandles.get(entityId);\n setPhysicsLiveRef(\n physics,\n \"collider\",\n typeof colliderHandle === \"number\"\n ? (physicsWorld.getCollider(colliderHandle) ?? null)\n : null,\n );\n }\n }\n\n if (!this.isEditorMode) {\n const environmentEntityId = world.query(Environment)[0];\n const environment =\n typeof environmentEntityId === \"number\"\n ? world.getComponent(environmentEntityId, Environment)\n : undefined;\n const fixedTimeStep =\n typeof environment?.values.fixedTimeStep === \"number\" &&\n environment.values.fixedTimeStep > 0\n ? environment.values.fixedTimeStep\n : 0.02;\n\n const clampedDelta =\n Number.isFinite(deltaTime) && deltaTime > 0\n ? Math.min(deltaTime, 0.1)\n : fixedTimeStep;\n\n this.accumulator += clampedDelta;\n\n while (this.accumulator >= fixedTimeStep) {\n physicsWorld.integrationParameters.dt = fixedTimeStep;\n physicsWorld.step();\n this.accumulator -= fixedTimeStep;\n }\n }\n\n for (const entityId of entities) {\n const physics = world.getComponent(entityId, PhysicsComponent);\n const transform = world.getComponent(entityId, TransformComponent);\n if (\n !physics ||\n !transform ||\n this.isEditorMode ||\n physics.values.rigidbody.type !== \"dynamic\"\n ) {\n continue;\n }\n\n const rigidBodyHandle = this.rigidBodyHandles.get(entityId);\n if (typeof rigidBodyHandle !== \"number\") {\n continue;\n }\n\n const body = physicsWorld.getRigidBody(rigidBodyHandle);\n if (!body) {\n continue;\n }\n\n syncTransformFromBody(transform, body);\n }\n }\n\n dispose(world: World): void {\n const physicsWorld = world.getPhysicsWorld();\n if (physicsWorld) {\n for (const entityId of this.rigidBodyHandles.keys()) {\n this.removeEntityPhysics(physicsWorld, entityId);\n }\n }\n\n this.rigidBodyHandles.clear();\n this.colliderHandles.clear();\n this.rigidBodySignatures.clear();\n this.colliderSignatures.clear();\n this.accumulator = 0;\n }\n}\n","export const KeyboardKeys = {\n A: \"a\",\n B: \"b\",\n C: \"c\",\n D: \"d\",\n E: \"e\",\n F: \"f\",\n G: \"g\",\n H: \"h\",\n I: \"i\",\n J: \"j\",\n K: \"k\",\n L: \"l\",\n M: \"m\",\n N: \"n\",\n O: \"o\",\n P: \"p\",\n Q: \"q\",\n R: \"r\",\n S: \"s\",\n T: \"t\",\n U: \"u\",\n V: \"v\",\n W: \"w\",\n X: \"x\",\n Y: \"y\",\n Z: \"z\",\n Digit0: \"0\",\n Digit1: \"1\",\n Digit2: \"2\",\n Digit3: \"3\",\n Digit4: \"4\",\n Digit5: \"5\",\n Digit6: \"6\",\n Digit7: \"7\",\n Digit8: \"8\",\n Digit9: \"9\",\n Space: \" \",\n Enter: \"enter\",\n Escape: \"escape\",\n Tab: \"tab\",\n Backspace: \"backspace\",\n Delete: \"delete\",\n Insert: \"insert\",\n Home: \"home\",\n End: \"end\",\n PageUp: \"pageup\",\n PageDown: \"pagedown\",\n ArrowUp: \"arrowup\",\n ArrowDown: \"arrowdown\",\n ArrowLeft: \"arrowleft\",\n ArrowRight: \"arrowright\",\n Shift: \"shift\",\n ShiftLeft: \"shiftleft\",\n ShiftRight: \"shiftright\",\n Control: \"control\",\n ControlLeft: \"controlleft\",\n ControlRight: \"controlright\",\n Alt: \"alt\",\n Meta: \"meta\",\n CapsLock: \"capslock\",\n NumLock: \"numlock\",\n ScrollLock: \"scrolllock\",\n Pause: \"pause\",\n PrintScreen: \"printscreen\",\n ContextMenu: \"contextmenu\",\n Minus: \"-\",\n Equal: \"=\",\n BracketLeft: \"[\",\n BracketRight: \"]\",\n Backslash: \"\\\\\",\n Semicolon: \";\",\n Quote: \"'\",\n Backquote: \"`\",\n Comma: \",\",\n Period: \".\",\n Slash: \"/\",\n F1: \"f1\",\n F2: \"f2\",\n F3: \"f3\",\n F4: \"f4\",\n F5: \"f5\",\n F6: \"f6\",\n F7: \"f7\",\n F8: \"f8\",\n F9: \"f9\",\n F10: \"f10\",\n F11: \"f11\",\n F12: \"f12\",\n} as const;\n\nexport type KeyboardKey = (typeof KeyboardKeys)[keyof typeof KeyboardKeys];","import type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport type { KeyboardKey } from \"./keyboardKeys\";\n\nfunction normalizeKey(key: KeyboardKey | string): string {\n return key.toLowerCase();\n}\n\nexport type MouseButton = \"left\" | \"middle\" | \"right\";\n\nfunction normalizeMouseButton(button: MouseButton | number | string): number {\n if (typeof button === \"number\") {\n return button;\n }\n\n const normalized = button.toLowerCase();\n if (normalized === \"left\") {\n return 0;\n }\n\n if (normalized === \"middle\" || normalized === \"scroll\") {\n return 1;\n }\n\n if (normalized === \"right\") {\n return 2;\n }\n\n return Number.NaN;\n}\n\nexport class InputSystem implements EcsSystem {\n private readonly held = new Set<string>();\n private readonly down = new Set<string>();\n private readonly up = new Set<string>();\n private readonly pendingDown = new Set<string>();\n private readonly pendingUp = new Set<string>();\n\n private readonly heldMouse = new Set<number>();\n private readonly downMouse = new Set<number>();\n private readonly upMouse = new Set<number>();\n private readonly pendingMouseDown = new Set<number>();\n private readonly pendingMouseUp = new Set<number>();\n\n private scrollDeltaX = 0;\n private scrollDeltaY = 0;\n private pendingScrollDeltaX = 0;\n private pendingScrollDeltaY = 0;\n private mouseDeltaX = 0;\n private mouseDeltaY = 0;\n private pendingMouseDeltaX = 0;\n private pendingMouseDeltaY = 0;\n private mousePosition = { x: 0, y: 0 };\n private pointerLockElement: HTMLElement | null = null;\n private pendingPointerLockRequest = false;\n\n private resolvePointerBounds(): { minX: number; minY: number; maxX: number; maxY: number } {\n const targetElement = this.pointerLockElement;\n if (targetElement) {\n const rect = targetElement.getBoundingClientRect();\n return {\n minX: rect.left,\n minY: rect.top,\n maxX: rect.right,\n maxY: rect.bottom,\n };\n }\n\n return {\n minX: 0,\n minY: 0,\n maxX: typeof window !== \"undefined\" ? window.innerWidth : 0,\n maxY: typeof window !== \"undefined\" ? window.innerHeight : 0,\n };\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n const key = normalizeKey(event.key);\n const code = normalizeKey(event.code);\n\n if (!this.held.has(key)) {\n this.pendingDown.add(key);\n }\n\n this.held.add(key);\n\n // Also track event.code so left/right variants (e.g. ShiftLeft, ControlRight)\n // can be distinguished independently of event.key.\n if (code !== key) {\n if (!this.held.has(code)) {\n this.pendingDown.add(code);\n }\n this.held.add(code);\n }\n };\n\n private onKeyUp = (event: KeyboardEvent): void => {\n const key = normalizeKey(event.key);\n const code = normalizeKey(event.code);\n\n this.held.delete(key);\n this.pendingUp.add(key);\n\n if (code !== key) {\n this.held.delete(code);\n this.pendingUp.add(code);\n }\n };\n\n private onWindowBlur = (): void => {\n this.clearAll();\n };\n\n private onMouseDown = (event: MouseEvent): void => {\n const button = event.button;\n\n if (!this.heldMouse.has(button)) {\n this.pendingMouseDown.add(button);\n }\n\n this.heldMouse.add(button);\n\n // If a behaviour called lockMousePointer() outside a gesture context (e.g. from\n // update()), honour the deferred request now — we are synchronously inside a\n // trusted mousedown event, so Safari will allow the pointer lock.\n if (this.pendingPointerLockRequest) {\n this.pendingPointerLockRequest = false;\n const targetElement = this.pointerLockElement ?? document.body;\n if (targetElement && typeof targetElement.requestPointerLock === \"function\") {\n const result = targetElement.requestPointerLock();\n if (result instanceof Promise) {\n result.catch(() => {});\n }\n }\n }\n };\n\n private onMouseUp = (event: MouseEvent): void => {\n const button = event.button;\n\n this.heldMouse.delete(button);\n this.pendingMouseUp.add(button);\n };\n\n private onMouseWheel = (event: WheelEvent): void => {\n this.pendingScrollDeltaX += event.deltaX;\n this.pendingScrollDeltaY += event.deltaY;\n };\n\n private onMouseMove = (event: MouseEvent): void => {\n if (this.isMousePointerLocked()) {\n this.pendingMouseDeltaX += event.movementX;\n this.pendingMouseDeltaY += event.movementY;\n this.mousePosition = {\n x: this.mousePosition.x + event.movementX,\n y: this.mousePosition.y + event.movementY,\n };\n return;\n }\n\n this.pendingMouseDeltaX += event.movementX;\n this.pendingMouseDeltaY += event.movementY;\n\n this.mousePosition = {\n x: event.clientX,\n y: event.clientY,\n };\n };\n\n private onPointerLockChange = (): void => {\n if (!this.isMousePointerLocked()) {\n return;\n }\n\n const bounds = this.resolvePointerBounds();\n this.mousePosition = {\n x: (bounds.minX + bounds.maxX) / 2,\n y: (bounds.minY + bounds.maxY) / 2,\n };\n };\n\n private onPointerLockError = (): void => {\n // No-op by default; callers can inspect lock state via isMousePointerLocked().\n };\n\n constructor() {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n window.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n document.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"wheel\", this.onMouseWheel, { passive: true });\n window.addEventListener(\"blur\", this.onWindowBlur);\n document.addEventListener(\"pointerlockchange\", this.onPointerLockChange);\n document.addEventListener(\"pointerlockerror\", this.onPointerLockError);\n }\n\n setPointerLockElement(element: HTMLElement | null): void {\n this.pointerLockElement = element;\n }\n\n lockMousePointer(): boolean {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n const targetElement = this.pointerLockElement ?? document.body;\n if (!targetElement || typeof targetElement.requestPointerLock !== \"function\") {\n return false;\n }\n\n try {\n const result = targetElement.requestPointerLock();\n // Modern browsers (including Safari) return a Promise. If it rejects\n // (e.g. called outside a user gesture on Safari), set a flag so the\n // lock is automatically requested on the next mousedown event, which\n // is always a trusted user gesture.\n if (result instanceof Promise) {\n result.catch(() => {\n this.pendingPointerLockRequest = true;\n });\n }\n return true;\n } catch {\n return false;\n }\n }\n\n unlockMousePointer(): boolean {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n // Cancel any deferred lock request so we don't immediately re-lock on next click.\n this.pendingPointerLockRequest = false;\n\n if (!document.pointerLockElement || typeof document.exitPointerLock !== \"function\") {\n return false;\n }\n\n document.exitPointerLock();\n return true;\n }\n\n isMousePointerLocked(): boolean {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n const activePointerLockElement = document.pointerLockElement;\n if (!activePointerLockElement) {\n return false;\n }\n\n if (!this.pointerLockElement) {\n return true;\n }\n\n return activePointerLockElement === this.pointerLockElement;\n }\n\n getKey(key: KeyboardKey | string): boolean {\n return this.held.has(normalizeKey(key));\n }\n\n getKeyDown(key: KeyboardKey | string): boolean {\n return this.down.has(normalizeKey(key));\n }\n\n getKeyUp(key: KeyboardKey | string): boolean {\n return this.up.has(normalizeKey(key));\n }\n\n consumePressed(key: KeyboardKey | string): boolean {\n const normalized = normalizeKey(key);\n if (!this.down.has(normalized)) {\n return false;\n }\n\n this.down.delete(normalized);\n return true;\n }\n\n getMouse(button: MouseButton | number | string): boolean {\n const normalizedButton = normalizeMouseButton(button);\n if (!Number.isInteger(normalizedButton)) {\n return false;\n }\n\n return this.heldMouse.has(normalizedButton);\n }\n\n getMouseDown(button: MouseButton | number | string): boolean {\n const normalizedButton = normalizeMouseButton(button);\n if (!Number.isInteger(normalizedButton)) {\n return false;\n }\n\n return this.downMouse.has(normalizedButton);\n }\n\n getMouseUp(button: MouseButton | number | string): boolean {\n const normalizedButton = normalizeMouseButton(button);\n if (!Number.isInteger(normalizedButton)) {\n return false;\n }\n\n return this.upMouse.has(normalizedButton);\n }\n\n getScrollClick(): boolean {\n return this.getMouse(\"middle\");\n }\n\n getScrollClickDown(): boolean {\n return this.getMouseDown(\"middle\");\n }\n\n getScrollClickUp(): boolean {\n return this.getMouseUp(\"middle\");\n }\n\n getScrollDelta(): { x: number; y: number } {\n return {\n x: this.scrollDeltaX,\n y: this.scrollDeltaY,\n };\n }\n\n consumeScrollDelta(): { x: number; y: number } {\n const delta = this.getScrollDelta();\n this.scrollDeltaX = 0;\n this.scrollDeltaY = 0;\n return delta;\n }\n\n getMousePosition(): { x: number; y: number } {\n return {\n x: this.mousePosition.x,\n y: this.mousePosition.y,\n };\n }\n\n getMouseDelta(): { x: number; y: number } {\n return {\n x: this.mouseDeltaX,\n y: this.mouseDeltaY,\n };\n }\n\n consumeMouseDelta(): { x: number; y: number } {\n const delta = this.getMouseDelta();\n this.mouseDeltaX = 0;\n this.mouseDeltaY = 0;\n return delta;\n }\n\n update(_world: World, _deltaTime: number): void {\n this.down.clear();\n this.up.clear();\n this.downMouse.clear();\n this.upMouse.clear();\n this.scrollDeltaX = this.pendingScrollDeltaX;\n this.scrollDeltaY = this.pendingScrollDeltaY;\n this.mouseDeltaX = this.pendingMouseDeltaX;\n this.mouseDeltaY = this.pendingMouseDeltaY;\n\n for (const key of this.pendingDown) {\n this.down.add(key);\n }\n\n for (const key of this.pendingUp) {\n this.up.add(key);\n }\n\n for (const button of this.pendingMouseDown) {\n this.downMouse.add(button);\n }\n\n for (const button of this.pendingMouseUp) {\n this.upMouse.add(button);\n }\n\n this.pendingDown.clear();\n this.pendingUp.clear();\n this.pendingMouseDown.clear();\n this.pendingMouseUp.clear();\n this.pendingScrollDeltaX = 0;\n this.pendingScrollDeltaY = 0;\n this.pendingMouseDeltaX = 0;\n this.pendingMouseDeltaY = 0;\n }\n\n dispose(): void {\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n window.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n document.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"wheel\", this.onMouseWheel);\n window.removeEventListener(\"blur\", this.onWindowBlur);\n document.removeEventListener(\"pointerlockchange\", this.onPointerLockChange);\n document.removeEventListener(\"pointerlockerror\", this.onPointerLockError);\n }\n\n this.clearAll();\n }\n\n private clearAll(): void {\n this.held.clear();\n this.down.clear();\n this.up.clear();\n this.pendingDown.clear();\n this.pendingUp.clear();\n this.heldMouse.clear();\n this.downMouse.clear();\n this.upMouse.clear();\n this.pendingMouseDown.clear();\n this.pendingMouseUp.clear();\n this.scrollDeltaX = 0;\n this.scrollDeltaY = 0;\n this.pendingScrollDeltaX = 0;\n this.pendingScrollDeltaY = 0;\n this.mouseDeltaX = 0;\n this.mouseDeltaY = 0;\n this.pendingMouseDeltaX = 0;\n this.pendingMouseDeltaY = 0;\n this.mousePosition = { x: 0, y: 0 };\n }\n}\n\n\n","import * as THREE from \"three\";\n\nimport { LightComponent } from \"../components/Light\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nconst MIN_LIGHT_DISTANCE = 0;\nconst MIN_LIGHT_INTENSITY = 0;\nconst MIN_AREA_SIZE = 0.01;\n\nfunction applyLightValues(lightComponent: LightComponent): void {\n const { light, values } = lightComponent;\n\n if (typeof values.color === \"string\") {\n light.color.set(values.color);\n }\n\n if (Number.isFinite(values.intensity)) {\n light.intensity = Math.max(MIN_LIGHT_INTENSITY, values.intensity);\n }\n\n light.frustumCulled = Boolean(values.frustumCulling);\n\n if (\"castShadow\" in light) {\n (light as THREE.Light & { castShadow: boolean }).castShadow = Boolean(\n values.castShadow,\n );\n }\n\n if (light instanceof THREE.PointLight) {\n if (typeof values.distance === \"number\" && Number.isFinite(values.distance)) {\n light.distance = Math.max(MIN_LIGHT_DISTANCE, values.distance);\n }\n\n if (typeof values.decay === \"number\" && Number.isFinite(values.decay)) {\n light.decay = Math.max(0, values.decay);\n }\n }\n\n if (light instanceof THREE.SpotLight) {\n if (typeof values.distance === \"number\" && Number.isFinite(values.distance)) {\n light.distance = Math.max(MIN_LIGHT_DISTANCE, values.distance);\n }\n\n if (typeof values.decay === \"number\" && Number.isFinite(values.decay)) {\n light.decay = Math.max(0, values.decay);\n }\n\n if (typeof values.angle === \"number\" && Number.isFinite(values.angle)) {\n light.angle = Math.max(0, Math.min(Math.PI / 2, values.angle));\n }\n\n if (typeof values.penumbra === \"number\" && Number.isFinite(values.penumbra)) {\n light.penumbra = Math.max(0, Math.min(1, values.penumbra));\n }\n }\n\n if (light instanceof THREE.RectAreaLight) {\n if (typeof values.width === \"number\" && Number.isFinite(values.width)) {\n light.width = Math.max(MIN_AREA_SIZE, values.width);\n }\n\n if (typeof values.height === \"number\" && Number.isFinite(values.height)) {\n light.height = Math.max(MIN_AREA_SIZE, values.height);\n }\n }\n}\n\nexport class LightSyncSystem implements EcsSystem {\n private readonly signatures = new Map<number, string>();\n\n update(world: World): void {\n const entityIds = world.query(LightComponent);\n\n const alive = new Set(entityIds);\n for (const trackedId of this.signatures.keys()) {\n if (!alive.has(trackedId)) {\n this.signatures.delete(trackedId);\n }\n }\n\n for (const entityId of entityIds) {\n const lightComponent = world.getComponent(entityId, LightComponent);\n if (!lightComponent) {\n continue;\n }\n\n const signature = JSON.stringify(lightComponent.values);\n if (this.signatures.get(entityId) === signature) {\n continue;\n }\n\n applyLightValues(lightComponent);\n this.signatures.set(entityId, signature);\n }\n }\n}\n","import * as THREE from \"three\";\n\nimport {\n MaterialComponent,\n type MaterialTypeValue,\n type MaterialValueState,\n Object3DRef,\n type TextureFilteringValue,\n} from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\ntype MaterialWithValues = {\n material: THREE.Material | null;\n materials: THREE.Material[];\n values: MaterialValueState[];\n};\n\nconst materialTextureKeyMap: Record<string, string> = {\n textureMap: \"map\",\n alphaTextureMap: \"alphaMap\",\n};\n\nconst materialTextureSlots = [\n \"map\",\n \"alphaMap\",\n \"normalMap\",\n \"roughnessMap\",\n \"metalnessMap\",\n \"aoMap\",\n \"emissiveMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"lightMap\",\n \"envMap\",\n] as const;\n\nfunction resolveMaterialPropertyKey(key: string): string {\n return materialTextureKeyMap[key] ?? key;\n}\n\nfunction createMaterialByType(type: MaterialTypeValue): THREE.Material {\n if (type === \"basic\") {\n return new THREE.MeshBasicMaterial();\n }\n\n if (type === \"phong\") {\n return new THREE.MeshPhongMaterial();\n }\n\n if (type === \"physical\") {\n return new THREE.MeshPhysicalMaterial();\n }\n\n return new THREE.MeshStandardMaterial();\n}\n\nfunction replaceMaterialAcrossObject(\n object: THREE.Object3D,\n previous: THREE.Material,\n next: THREE.Material,\n): void {\n object.traverse((child) => {\n const mesh = child as THREE.Mesh;\n const currentMaterial = mesh.material;\n if (!currentMaterial) {\n return;\n }\n\n if (Array.isArray(currentMaterial)) {\n let changed = false;\n const updated = currentMaterial.map((material) => {\n if (material === previous) {\n changed = true;\n return next;\n }\n\n return material;\n });\n\n if (changed) {\n mesh.material = updated;\n }\n return;\n }\n\n if (currentMaterial === previous) {\n mesh.material = next;\n }\n });\n}\n\nfunction extractObjectMaterials(object: THREE.Object3D): THREE.Material[] {\n const materials: THREE.Material[] = [];\n\n object.traverse((child) => {\n const mesh = child as THREE.Mesh;\n const currentMaterial = mesh.material;\n if (!currentMaterial) {\n return;\n }\n\n const addMaterial = (material: THREE.Material) => {\n if (!materials.includes(material)) {\n materials.push(material);\n }\n };\n\n if (Array.isArray(currentMaterial)) {\n for (const material of currentMaterial) {\n addMaterial(material);\n }\n return;\n }\n\n addMaterial(currentMaterial);\n });\n\n return materials;\n}\n\nfunction applyTextureFiltering(\n material: THREE.Material,\n filtering: TextureFilteringValue,\n): void {\n const sharp = filtering === \"sharp\";\n const target = material as unknown as Record<string, unknown>;\n\n for (const slot of materialTextureSlots) {\n const texture = target[slot] as THREE.Texture | null | undefined;\n if (!texture || !(texture instanceof THREE.Texture)) {\n continue;\n }\n\n const useMipmaps = texture.generateMipmaps !== false;\n texture.magFilter = sharp ? THREE.NearestFilter : THREE.LinearFilter;\n texture.minFilter = useMipmaps\n ? sharp\n ? THREE.NearestMipmapNearestFilter\n : THREE.LinearMipmapLinearFilter\n : sharp\n ? THREE.NearestFilter\n : THREE.LinearFilter;\n texture.needsUpdate = true;\n }\n\n material.needsUpdate = true;\n}\n\nfunction setTextureMipmaps(material: THREE.Material, enabled: boolean): void {\n const target = material as unknown as Record<string, unknown>;\n\n for (const slot of materialTextureSlots) {\n const texture = target[slot] as THREE.Texture | null | undefined;\n if (!texture || !(texture instanceof THREE.Texture)) {\n continue;\n }\n\n texture.generateMipmaps = enabled;\n\n const sharp = texture.magFilter === THREE.NearestFilter;\n texture.minFilter = enabled\n ? sharp\n ? THREE.NearestMipmapNearestFilter\n : THREE.LinearMipmapLinearFilter\n : sharp\n ? THREE.NearestFilter\n : THREE.LinearFilter;\n\n texture.needsUpdate = true;\n }\n\n material.needsUpdate = true;\n}\n\nfunction assignMaterialTexture(\n material: THREE.Material,\n rawKey: string,\n url: string,\n textureCache: Map<string, THREE.Texture>,\n): void {\n const target = material as unknown as Record<string, unknown>;\n const key = resolveMaterialPropertyKey(rawKey);\n\n let texture = textureCache.get(url);\n if (!texture) {\n texture = new THREE.TextureLoader().load(url);\n textureCache.set(url, texture);\n }\n\n target[key] = texture;\n}\n\nfunction clearMaterialTexture(material: THREE.Material, rawKey: string): void {\n const target = material as unknown as Record<string, unknown>;\n const key = resolveMaterialPropertyKey(rawKey);\n target[key] = null;\n}\n\nfunction applyMaterialState(\n material: THREE.Material,\n value: MaterialValueState,\n textureCache: Map<string, THREE.Texture>,\n): void {\n const target = material as unknown as Record<string, unknown>;\n\n if (\n target.color &&\n typeof (target.color as { set?: (nextValue: string) => void }).set ===\n \"function\"\n ) {\n (target.color as { set: (nextValue: string) => void }).set(value.color);\n }\n\n if (typeof target.roughness === \"number\") {\n target.roughness = value.roughness;\n }\n\n if (typeof target.metalness === \"number\") {\n target.metalness = value.metalness;\n }\n\n if (\n target.normalScale &&\n typeof (target.normalScale as { set?: (x: number, y: number) => void })\n .set === \"function\"\n ) {\n (target.normalScale as { set: (x: number, y: number) => void }).set(\n value.normalScale,\n value.normalScale,\n );\n }\n\n target.opacity = value.opacity;\n\n if (\n target.emissive &&\n typeof (target.emissive as { set?: (nextValue: string) => void }).set ===\n \"function\"\n ) {\n (target.emissive as { set: (nextValue: string) => void }).set(value.emissive);\n }\n\n if (typeof target.emissiveIntensity === \"number\") {\n target.emissiveIntensity = value.emissiveIntensity;\n }\n\n target.side = value.side;\n target.blending = value.blending;\n // three r178+: MultiplyBlending and SubtractiveBlending only produce the\n // correct result when the material is premultiplied. Both are user-selectable\n // in the inspector, so derive the flag instead of leaving it at the default —\n // otherwise every material set to Multiply/Subtract renders wrong.\n target.premultipliedAlpha =\n value.blending === THREE.MultiplyBlending ||\n value.blending === THREE.SubtractiveBlending;\n target.depthTest = value.depthTest;\n target.depthWrite = value.depthWrite;\n target.wireframe = value.wireframe;\n target.transparent = value.transparent;\n\n const textureEntries: Array<[string, string | undefined]> = [\n [\"textureMap\", value.textureMap],\n [\"alphaTextureMap\", value.alphaTextureMap],\n [\"normalMap\", value.normalMap],\n [\"roughnessMap\", value.roughnessMap],\n [\"metalnessMap\", value.metalnessMap],\n [\"aoMap\", value.aoMap],\n [\"emissiveMap\", value.emissiveMap],\n [\"bumpMap\", value.bumpMap],\n [\"displacementMap\", value.displacementMap],\n [\"lightMap\", value.lightMap],\n [\"envMap\", value.envMap],\n ];\n\n for (const [key, url] of textureEntries) {\n if (typeof url === \"string\" && url.length > 0) {\n assignMaterialTexture(material, key, url, textureCache);\n } else {\n clearMaterialTexture(material, key);\n }\n }\n\n applyTextureFiltering(material, value.textureFiltering);\n setTextureMipmaps(material, value.useMipmaps);\n material.needsUpdate = true;\n}\n\nexport class MaterialSyncSystem implements EcsSystem {\n private readonly signatures = new Map<number, string>();\n private readonly textureCache = new Map<string, THREE.Texture>();\n\n update(world: World): void {\n const entityIds = world.query(MaterialComponent);\n\n const alive = new Set(entityIds);\n for (const trackedId of this.signatures.keys()) {\n if (!alive.has(trackedId)) {\n this.signatures.delete(trackedId);\n }\n }\n\n for (const entityId of entityIds) {\n const materialComponent = world.getComponent(\n entityId,\n MaterialComponent,\n ) as MaterialWithValues | undefined;\n if (!materialComponent) {\n continue;\n }\n\n const signature = JSON.stringify(materialComponent.values);\n if (this.signatures.get(entityId) === signature) {\n continue;\n }\n\n const object = world.getComponent(entityId, Object3DRef)?.object;\n const objectMaterials = object ? extractObjectMaterials(object) : [];\n for (let index = 0; index < materialComponent.values.length; index += 1) {\n const value = materialComponent.values[index];\n if (!value) {\n continue;\n }\n\n const previousMaterial = materialComponent.materials[index];\n if (!previousMaterial) {\n continue;\n }\n\n // Undo/redo can restore component material references that differ from\n // what meshes currently hold. Rebind by slot index so subsequent state\n // writes always target the rendered material instance.\n if (object) {\n const currentObjectMaterial = objectMaterials[index];\n if (\n currentObjectMaterial &&\n currentObjectMaterial !== previousMaterial\n ) {\n replaceMaterialAcrossObject(\n object,\n currentObjectMaterial,\n previousMaterial,\n );\n objectMaterials[index] = previousMaterial;\n }\n }\n\n const nextType = createMaterialByType(value.type).type;\n let targetMaterial = previousMaterial;\n\n if (previousMaterial.type !== nextType) {\n const replacement = createMaterialByType(value.type);\n if (object) {\n replaceMaterialAcrossObject(object, previousMaterial, replacement);\n objectMaterials[index] = replacement;\n }\n materialComponent.materials[index] = replacement;\n targetMaterial = replacement;\n if (index === 0) {\n materialComponent.material = replacement;\n }\n previousMaterial.dispose();\n }\n\n applyMaterialState(targetMaterial, value, this.textureCache);\n }\n\n this.signatures.set(entityId, JSON.stringify(materialComponent.values));\n }\n }\n\n dispose(): void {\n for (const texture of this.textureCache.values()) {\n texture.dispose();\n }\n\n this.textureCache.clear();\n this.signatures.clear();\n }\n}\n","import * as THREE from \"three\";\n\nimport {\n type CubeMeshParameters,\n DEFAULT_MESH_GEOMETRY_PARAMETERS,\n type MeshGeometryParameters,\n MeshGeometryComponent,\n Object3DRef,\n type PlaneMeshParameters,\n type RadiusHeightMeshParameters,\n type RadiusMeshParameters,\n} from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nconst MIN_DIMENSION = 0.01;\nconst MIN_RADIUS = 0.001;\n\nfunction sanitizeDimension(value: number): number {\n return Number.isFinite(value)\n ? Math.max(MIN_DIMENSION, value)\n : MIN_DIMENSION;\n}\n\nfunction sanitizeRadius(value: number): number {\n return Number.isFinite(value) ? Math.max(MIN_RADIUS, value) : MIN_RADIUS;\n}\n\nfunction sanitizeMeshParameters(\n component: MeshGeometryComponent,\n): MeshGeometryParameters {\n switch (component.kind) {\n case \"cube\": {\n const params = component.parameters as Partial<CubeMeshParameters>;\n const fallback = DEFAULT_MESH_GEOMETRY_PARAMETERS.cube;\n return {\n width: sanitizeDimension(params.width ?? fallback.width),\n height: sanitizeDimension(params.height ?? fallback.height),\n depth: sanitizeDimension(params.depth ?? fallback.depth),\n };\n }\n case \"plane\": {\n const params = component.parameters as Partial<PlaneMeshParameters>;\n const fallback = DEFAULT_MESH_GEOMETRY_PARAMETERS.plane;\n return {\n width: sanitizeDimension(params.width ?? fallback.width),\n height: sanitizeDimension(params.height ?? fallback.height),\n };\n }\n case \"sphere\": {\n const params = component.parameters as Partial<RadiusMeshParameters>;\n const fallback = DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere;\n return {\n radius: sanitizeRadius(params.radius ?? fallback.radius),\n };\n }\n case \"cylinder\":\n case \"capsule\": {\n const params = component.parameters as Partial<RadiusHeightMeshParameters>;\n const fallback =\n component.kind === \"cylinder\"\n ? DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder\n : DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule;\n return {\n radius: sanitizeRadius(params.radius ?? fallback.radius),\n height: sanitizeDimension(params.height ?? fallback.height),\n };\n }\n case \"model\":\n return {};\n }\n}\n\nfunction resolvePrimaryMesh(object: THREE.Object3D | null): THREE.Mesh | null {\n if (!object) {\n return null;\n }\n\n if (object instanceof THREE.Mesh) {\n return object;\n }\n\n let found: THREE.Mesh | null = null;\n object.traverse((child: THREE.Object3D) => {\n if (!found && child instanceof THREE.Mesh) {\n found = child;\n }\n });\n\n return found;\n}\n\nfunction applyGeometry(component: MeshGeometryComponent): void {\n if (component.kind === \"model\") {\n return;\n }\n\n const mesh = resolvePrimaryMesh(component.object);\n if (!mesh) {\n return;\n }\n\n const sanitized = sanitizeMeshParameters(component);\n component.parameters = sanitized;\n\n let nextGeometry: THREE.BufferGeometry;\n\n switch (component.kind) {\n case \"cube\": {\n const params = sanitized as CubeMeshParameters;\n nextGeometry = new THREE.BoxGeometry(params.width, params.height, params.depth);\n break;\n }\n case \"plane\": {\n const params = sanitized as PlaneMeshParameters;\n nextGeometry = new THREE.PlaneGeometry(params.width, params.height);\n break;\n }\n case \"sphere\": {\n const params = sanitized as RadiusMeshParameters;\n nextGeometry = new THREE.SphereGeometry(params.radius, 24, 24);\n break;\n }\n case \"cylinder\": {\n const params = sanitized as RadiusHeightMeshParameters;\n nextGeometry = new THREE.CylinderGeometry(\n params.radius,\n params.radius,\n params.height,\n 20,\n );\n break;\n }\n case \"capsule\": {\n const params = sanitized as RadiusHeightMeshParameters;\n nextGeometry = new THREE.CapsuleGeometry(params.radius, params.height, 4, 8);\n break;\n }\n default:\n return;\n }\n\n const previousGeometry = mesh.geometry;\n mesh.geometry = nextGeometry;\n previousGeometry.dispose();\n}\n\nfunction applyShadowFlags(component: MeshGeometryComponent): void {\n if (!component.object) {\n return;\n }\n\n component.object.traverse((child: THREE.Object3D) => {\n if (child instanceof THREE.Mesh) {\n child.castShadow = component.castShadow;\n child.receiveShadow = component.receiveShadow;\n }\n });\n}\n\nexport class MeshGeometrySystem implements EcsSystem {\n private readonly geometrySignatures = new Map<number, string>();\n private readonly shadowSignatures = new Map<number, string>();\n\n update(world: World): void {\n const entityIds = world.query(MeshGeometryComponent);\n\n const alive = new Set<number>(entityIds);\n for (const trackedId of this.geometrySignatures.keys()) {\n if (!alive.has(trackedId)) {\n this.geometrySignatures.delete(trackedId);\n this.shadowSignatures.delete(trackedId);\n }\n }\n\n for (const entityId of entityIds) {\n const meshGeometry = world.getComponent(\n entityId,\n MeshGeometryComponent,\n ) as MeshGeometryComponent | undefined;\n if (!meshGeometry) {\n continue;\n }\n\n if (!meshGeometry.object) {\n const objectRef = world.getComponent(entityId, Object3DRef);\n if (objectRef?.object) {\n meshGeometry.object = objectRef.object;\n }\n }\n\n const geometrySignature = `${meshGeometry.kind}:${JSON.stringify(meshGeometry.parameters)}:${meshGeometry.object?.uuid ?? \"\"}`;\n const shadowSignature = `${meshGeometry.castShadow}:${meshGeometry.receiveShadow}:${meshGeometry.object?.uuid ?? \"\"}`;\n\n if (this.geometrySignatures.get(entityId) !== geometrySignature) {\n applyGeometry(meshGeometry);\n this.geometrySignatures.set(\n entityId,\n `${meshGeometry.kind}:${JSON.stringify(meshGeometry.parameters)}:${meshGeometry.object?.uuid ?? \"\"}`,\n );\n }\n\n if (this.shadowSignatures.get(entityId) !== shadowSignature) {\n applyShadowFlags(meshGeometry);\n this.shadowSignatures.set(entityId, shadowSignature);\n }\n }\n }\n}\n","\nimport * as THREE from \"three\";\nimport { DRACOLoader } from \"three/examples/jsm/loaders/DRACOLoader.js\";\nimport { GLTFLoader, type GLTF } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { resolveDracoDecoderPath } from \"./dracoDecoderPath\";\n\nexport const loadGLTF = (path: string): Promise<GLTF> => {\n return new Promise((resolve, reject) => {\n const loader = new GLTFLoader();\n try {\n // Configure DRACOLoader so GLTFLoader can decode DRACO-compressed meshes.\n const dracoLoader = new DRACOLoader();\n // Resolved per call so a setDracoDecoderPath() override made after\n // module load still takes effect.\n dracoLoader.setDecoderPath(resolveDracoDecoderPath());\n loader.setDRACOLoader(dracoLoader);\n } catch (error) {\n // If DRACOLoader isn't available for any reason, proceed without it.\n // GLTFLoader will throw if the file actually contains DRACO-compressed data.\n console.debug(\"DRACOLoader setup failed or unavailable\", error);\n }\n\n loader.load(\n path,\n (gltf: GLTF) => {\n resolve(gltf);\n },\n undefined,\n (error: unknown) => {\n console.debug(\"GLTFLoader failed to load\", error);\n reject(error);\n },\n );\n });\n};\n\nexport const loadAudio = (path: string): Promise<AudioBuffer> => {\n return new Promise((resolve, reject) => {\n const loader = new THREE.AudioLoader();\n loader.load(\n path,\n (buffer: AudioBuffer) => {\n resolve(buffer);\n },\n undefined,\n (error: unknown) => {\n reject(error);\n },\n );\n });\n};\n\nexport const loadVideo = (path: string): Promise<HTMLVideoElement> => {\n return new Promise((resolve, reject) => {\n const video = document.createElement(\"video\");\n video.addEventListener(\"loadedmetadata\", () => {\n video.setAttribute(\"playsinline\", \"\");\n resolve(video);\n });\n video.addEventListener(\"error\", () => {\n reject(new Error(`Failed to load video: ${path}`));\n });\n video.src = path;\n });\n};\n\nexport const loadTexture = (path: string): Promise<THREE.Texture> => {\n return new Promise((resolve, reject) => {\n const loader = new THREE.TextureLoader();\n loader.load(\n path,\n (texture: THREE.Texture) => {\n resolve(texture);\n },\n undefined,\n (error: unknown) => {\n reject(error);\n },\n );\n });\n};\n\nexport const loadTextures = (paths: string[]): Promise<THREE.Texture[]> => {\n const loader = new THREE.TextureLoader();\n const promises: Array<Promise<THREE.Texture>> = [];\n for (let i = 0; i < paths.length; i++) {\n promises.push(\n new Promise((resolve, reject) => {\n loader.load(\n paths[i],\n (texture: THREE.Texture) => {\n resolve(texture);\n },\n undefined,\n (error: unknown) => {\n reject(error);\n },\n );\n }),\n );\n }\n return Promise.all(promises);\n};\n","import * as THREE from \"three\";\n\nimport { Object3DRef, TransformComponent } from \"../components\";\nimport { InstancedMeshComponent } from \"../components/InstancedMesh\";\nimport {\n type CubeMeshParameters,\n type PlaneMeshParameters,\n type RadiusHeightMeshParameters,\n type RadiusMeshParameters,\n} from \"../components/MeshGeometry\";\nimport { loadGLTF } from \"../utils/loader\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\n// ---------------------------------------------------------------------------\n// Geometry helpers (primitive kinds)\n// ---------------------------------------------------------------------------\n\nfunction buildGeometry(component: InstancedMeshComponent): THREE.BufferGeometry {\n const p = component.getSanitizedParameters();\n\n switch (component.meshKind) {\n case \"cube\": {\n const params = p as CubeMeshParameters;\n return new THREE.BoxGeometry(params.width, params.height, params.depth);\n }\n case \"plane\": {\n const params = p as PlaneMeshParameters;\n return new THREE.PlaneGeometry(params.width, params.height);\n }\n case \"sphere\": {\n const params = p as RadiusMeshParameters;\n return new THREE.SphereGeometry(params.radius, 24, 24);\n }\n case \"cylinder\": {\n const params = p as RadiusHeightMeshParameters;\n return new THREE.CylinderGeometry(params.radius, params.radius, params.height, 20);\n }\n case \"capsule\": {\n const params = p as RadiusHeightMeshParameters;\n return new THREE.CapsuleGeometry(params.radius, params.height, 4, 8);\n }\n default:\n return new THREE.BoxGeometry(1, 1, 1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Matrix composition helper\n// ---------------------------------------------------------------------------\n\nconst _position = new THREE.Vector3();\nconst _quaternion = new THREE.Quaternion();\nconst _euler = new THREE.Euler();\nconst _scale = new THREE.Vector3();\nconst _matrix = new THREE.Matrix4();\nconst _modelMatrix = new THREE.Matrix4();\n\nfunction instanceTransformFromComponent(\n transform: TransformComponent,\n out: THREE.Matrix4,\n): void {\n _position.set(transform.position.x, transform.position.y, transform.position.z);\n _euler.set(transform.rotation.x, transform.rotation.y, transform.rotation.z, \"XYZ\");\n _quaternion.setFromEuler(_euler);\n _scale.set(transform.scale.x, transform.scale.y, transform.scale.z);\n out.compose(_position, _quaternion, _scale);\n}\n\n// ---------------------------------------------------------------------------\n// Dispose helpers\n// ---------------------------------------------------------------------------\n\nfunction disposePrimitiveInstancedMesh(mesh: THREE.InstancedMesh): void {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n for (const m of mesh.material) {\n m.dispose();\n }\n } else {\n (mesh.material as THREE.Material).dispose();\n }\n}\n\nfunction disposeModelGroup(group: THREE.Object3D): void {\n group.traverse((child) => {\n const im = child as THREE.InstancedMesh;\n if (im.isInstancedMesh) {\n im.geometry.dispose();\n if (Array.isArray(im.material)) {\n for (const m of im.material) {\n m.dispose();\n }\n } else {\n (im.material as THREE.Material).dispose();\n }\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Per-mesh entry for model kind\n// ---------------------------------------------------------------------------\n\ntype ModelMeshEntry = {\n localMatrix: THREE.Matrix4;\n instancedMesh: THREE.InstancedMesh;\n};\n\n// ---------------------------------------------------------------------------\n// InstancedMeshSystem\n// ---------------------------------------------------------------------------\n\n/**\n * Maintains the runtime geometry for entities with an {@link InstancedMeshComponent}.\n *\n * - **Primitive kinds** (`cube`, `sphere`, `plane`, `cylinder`, `capsule`): creates a single\n * `THREE.InstancedMesh` on the anchor and writes per-instance matrices every frame.\n * - **Model kind** (`model`): asynchronously loads the GLTF/GLB at `comp.modelPath`, traverses\n * the scene to collect all `THREE.Mesh` nodes, and creates one `THREE.InstancedMesh` per mesh\n * (preserving the mesh's local transform and original materials). All sub-meshes are grouped\n * under a `THREE.Group` stored in `comp.instancedMesh`. Per-instance matrices are composed as\n * `instanceTransform × meshLocalMatrix` every frame.\n *\n * Geometry is rebuilt whenever the signature (`meshKind:parameters:instanceCount` for primitives,\n * `model:path:instanceCount` for model kind) changes.\n */\nexport class InstancedMeshSystem implements EcsSystem {\n /** Signature tracking for geometry + instance count changes. */\n private readonly geometrySignatures = new Map<number, string>();\n /** Signature being loaded per entity. Maps entityId → geometrySignature in-flight.\n * Prevents re-dispatching a load every frame while comp.instancedMesh is still null. */\n private readonly loadingSignatures = new Map<number, string>();\n /** Per-mesh data for model kind, populated after GLTF load. */\n private readonly modelMeshEntries = new Map<number, ModelMeshEntry[]>();\n /**\n * System-internal ref to the Three.js mesh/group most recently placed on\n * the anchor by this system. Used for cleanup on rebuild instead of\n * `comp.instancedMesh`, which can be stale (pointing to a disposed mesh)\n * after an undo/redo restores a history snapshot captured at an earlier\n * geometry configuration. Relying on the stale comp ref would skip removal\n * of the current live mesh → ghost mesh in the scene.\n */\n private readonly trackedMeshes = new Map<number, THREE.Object3D>();\n\n update(world: World): void {\n const entityIds = world.query(InstancedMeshComponent);\n\n // Prune stale tracking for destroyed entities.\n const alive = new Set<number>(entityIds);\n for (const trackedId of this.geometrySignatures.keys()) {\n if (!alive.has(trackedId)) this.geometrySignatures.delete(trackedId);\n }\n for (const trackedId of this.loadingSignatures.keys()) {\n if (!alive.has(trackedId)) this.loadingSignatures.delete(trackedId);\n }\n for (const trackedId of this.modelMeshEntries.keys()) {\n if (!alive.has(trackedId)) this.modelMeshEntries.delete(trackedId);\n }\n for (const trackedId of this.trackedMeshes.keys()) {\n if (!alive.has(trackedId)) this.trackedMeshes.delete(trackedId);\n }\n\n for (const entityId of entityIds) {\n const comp = world.getComponent(\n entityId,\n InstancedMeshComponent,\n ) as InstancedMeshComponent | undefined;\n if (!comp) continue;\n\n const objectRef = world.getComponent(entityId, Object3DRef);\n const anchor: THREE.Object3D | null = objectRef?.object ?? null;\n if (!anchor) continue;\n\n const instanceCount = comp.instanceEntityIds.length;\n const geometrySignature =\n comp.meshKind === \"model\"\n ? `model:${comp.modelPath}:${instanceCount}`\n : `${comp.meshKind}:${JSON.stringify(comp.meshParameters)}:${instanceCount}`;\n\n // Re-sync comp.instancedMesh from system tracking when it has been\n // nulled out by an undo/redo snapshot restore (cloneHistoryValue sets it\n // to null to prevent stale Three.js refs in history). Without this the\n // every-frame matrix-update path below would crash on a null ref.\n if (comp.instancedMesh === null) {\n const tracked = this.trackedMeshes.get(entityId);\n if (tracked) {\n comp.instancedMesh = tracked;\n }\n }\n\n // While a load for the current signature is in-flight, instancedMesh stays null\n // but we must NOT treat that as \"needsRebuild\" — doing so would clear loadingSignatures\n // and re-dispatch the load every frame, causing duplicate groups in the scene.\n // Use trackedMeshes (system-internal) instead of comp.instancedMesh: after an\n // undo/redo the component ref is null (cleared by cloneHistoryValue) even when\n // the mesh hasn't changed, so relying on comp.instancedMesh would force a needless\n // rebuild (and disposal/creation cycle) on every transform undo.\n const pendingLoadSignature = this.loadingSignatures.get(entityId);\n const needsRebuild =\n (!this.trackedMeshes.has(entityId) || this.geometrySignatures.get(entityId) !== geometrySignature) &&\n pendingLoadSignature !== geometrySignature;\n\n if (needsRebuild) {\n // Dispose previous container using the system-internal tracked ref.\n // comp.instancedMesh may point to a stale/disposed mesh after an\n // undo/redo restores a snapshot — using it for cleanup would leave the\n // current live mesh in the anchor, producing a ghost.\n const trackedMesh = this.trackedMeshes.get(entityId);\n if (trackedMesh) {\n anchor.remove(trackedMesh);\n if ((trackedMesh as THREE.InstancedMesh).isInstancedMesh) {\n disposePrimitiveInstancedMesh(trackedMesh as THREE.InstancedMesh);\n } else {\n disposeModelGroup(trackedMesh);\n }\n this.trackedMeshes.delete(entityId);\n }\n comp.instancedMesh = null;\n\n // Cancel an in-flight load only when the target signature changed\n // (e.g. user changed path or instance count). Preserve the slot when\n // rebuilding for any other reason to avoid re-dispatching.\n if (pendingLoadSignature !== undefined && pendingLoadSignature !== geometrySignature) {\n this.loadingSignatures.delete(entityId);\n this.modelMeshEntries.delete(entityId);\n }\n\n // No instances — record the empty signature so we don't re-enter every frame,\n // but skip geometry creation (existing mesh already disposed above).\n if (instanceCount === 0) {\n this.geometrySignatures.set(entityId, geometrySignature);\n continue;\n }\n\n if (comp.meshKind === \"model\") {\n // Async GLTF load — skip this entity until the load completes.\n if (comp.modelPath && !this.loadingSignatures.has(entityId)) {\n this.loadingSignatures.set(entityId, geometrySignature);\n const targetSignature = geometrySignature;\n const targetEntityId = entityId;\n\n loadGLTF(comp.modelPath)\n .then((gltf) => {\n // Guard: entity still alive.\n if (!world.hasEntity(targetEntityId)) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n const currentComp = world.getComponent(\n targetEntityId,\n InstancedMeshComponent,\n ) as InstancedMeshComponent | undefined;\n if (!currentComp) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n // Guard: signature unchanged (no path/count change during load).\n const currentSig = `model:${currentComp.modelPath}:${currentComp.instanceEntityIds.length}`;\n if (currentSig !== targetSignature) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n const currentRef = world.getComponent(targetEntityId, Object3DRef);\n const currentAnchor: THREE.Object3D | null = currentRef?.object ?? null;\n if (!currentAnchor) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n // Safety: remove any stale mesh set by a concurrent load that\n // raced to completion before this one.\n if (currentComp.instancedMesh) {\n currentAnchor.remove(currentComp.instancedMesh);\n disposeModelGroup(currentComp.instancedMesh);\n currentComp.instancedMesh = null;\n }\n\n const count = Math.max(1, currentComp.instanceEntityIds.length);\n const entries: ModelMeshEntry[] = [];\n\n // Ensure world matrices are up to date before extracting local transforms.\n gltf.scene.updateWorldMatrix(true, true);\n\n gltf.scene.traverse((child) => {\n const meshChild = child as THREE.Mesh;\n if (!meshChild.isMesh) return;\n\n const geometry = meshChild.geometry.clone();\n const sourceMaterial = Array.isArray(meshChild.material)\n ? (meshChild.material as THREE.Material[]).map((m) => m.clone())\n : (meshChild.material as THREE.Material).clone();\n\n meshChild.updateWorldMatrix(true, false);\n const localMatrix = meshChild.matrixWorld.clone();\n\n const instancedMesh = new THREE.InstancedMesh(\n geometry,\n Array.isArray(sourceMaterial)\n ? (sourceMaterial as THREE.Material[])\n : (sourceMaterial as THREE.Material),\n count,\n );\n instancedMesh.castShadow = currentComp.castShadow;\n instancedMesh.receiveShadow = currentComp.receiveShadow;\n\n for (let i = 0; i < count; i++) {\n const instanceEntityId = currentComp.instanceEntityIds[i];\n const instTransform =\n instanceEntityId !== undefined\n ? (world.getComponent(instanceEntityId, TransformComponent) ?? null)\n : null;\n if (instTransform) {\n instanceTransformFromComponent(instTransform, _matrix);\n } else {\n _matrix.identity();\n }\n _modelMatrix.multiplyMatrices(_matrix, localMatrix);\n instancedMesh.setMatrixAt(i, _modelMatrix);\n }\n instancedMesh.instanceMatrix.needsUpdate = true;\n\n entries.push({ localMatrix, instancedMesh });\n });\n\n if (entries.length === 0) {\n this.loadingSignatures.delete(targetEntityId);\n return;\n }\n\n const group = new THREE.Group();\n for (const entry of entries) {\n group.add(entry.instancedMesh);\n }\n\n currentAnchor.add(group);\n currentComp.instancedMesh = group;\n this.modelMeshEntries.set(targetEntityId, entries);\n this.geometrySignatures.set(targetEntityId, targetSignature);\n this.trackedMeshes.set(targetEntityId, group);\n this.loadingSignatures.delete(targetEntityId);\n })\n .catch(() => {\n this.loadingSignatures.delete(targetEntityId);\n });\n }\n // Skip synchronous build for model kind — wait for async load.\n continue;\n }\n\n // --- Primitive kinds: synchronous build ---\n const count = instanceCount;\n const geometry = buildGeometry(comp);\n const material = new THREE.MeshStandardMaterial({ color: \"#ffffff\" });\n const instancedMesh = new THREE.InstancedMesh(geometry, material, count);\n instancedMesh.castShadow = comp.castShadow;\n instancedMesh.receiveShadow = comp.receiveShadow;\n\n for (let i = 0; i < count; i++) {\n const instanceEntityId = comp.instanceEntityIds[i];\n const instTransform =\n instanceEntityId !== undefined\n ? (world.getComponent(instanceEntityId, TransformComponent) ?? null)\n : null;\n if (instTransform) {\n instanceTransformFromComponent(instTransform, _matrix);\n } else {\n _matrix.identity();\n }\n instancedMesh.setMatrixAt(i, _matrix);\n }\n instancedMesh.instanceMatrix.needsUpdate = true;\n\n anchor.add(instancedMesh);\n comp.instancedMesh = instancedMesh;\n this.trackedMeshes.set(entityId, instancedMesh);\n this.geometrySignatures.set(entityId, geometrySignature);\n } else {\n // --- Every-frame matrix update ---\n if (comp.meshKind === \"model\") {\n const entries = this.modelMeshEntries.get(entityId);\n if (entries) {\n const count = comp.instanceEntityIds.length;\n for (const entry of entries) {\n for (let i = 0; i < count; i++) {\n const instanceEntityId = comp.instanceEntityIds[i];\n const instTransform =\n instanceEntityId !== undefined\n ? (world.getComponent(instanceEntityId, TransformComponent) ?? null)\n : null;\n if (instTransform) {\n instanceTransformFromComponent(instTransform, _matrix);\n } else {\n _matrix.identity();\n }\n _modelMatrix.multiplyMatrices(_matrix, entry.localMatrix);\n entry.instancedMesh.setMatrixAt(i, _modelMatrix);\n }\n entry.instancedMesh.instanceMatrix.needsUpdate = true;\n entry.instancedMesh.castShadow = comp.castShadow;\n entry.instancedMesh.receiveShadow = comp.receiveShadow;\n }\n }\n } else {\n const im = comp.instancedMesh as THREE.InstancedMesh;\n const count = comp.instanceEntityIds.length;\n for (let i = 0; i < count; i++) {\n const instanceEntityId = comp.instanceEntityIds[i];\n const instTransform =\n instanceEntityId !== undefined\n ? (world.getComponent(instanceEntityId, TransformComponent) ?? null)\n : null;\n if (instTransform) {\n instanceTransformFromComponent(instTransform, _matrix);\n } else {\n _matrix.identity();\n }\n im.setMatrixAt(i, _matrix);\n }\n im.instanceMatrix.needsUpdate = true;\n im.castShadow = comp.castShadow;\n im.receiveShadow = comp.receiveShadow;\n }\n }\n }\n }\n}\n","import type * as THREE from \"three\";\n\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\nexport class RenderSystem implements EcsSystem {\n private readonly renderer: THREE.WebGLRenderer;\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private readonly afterRender?: () => void;\n\n constructor(\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n afterRender?: () => void,\n ) {\n this.renderer = renderer;\n this.scene = scene;\n this.camera = camera;\n this.afterRender = afterRender;\n }\n\n update(_world: World): void {\n if (this.scene.userData.ecsPostprocessingComposerActive === true) {\n const composer = this.scene.userData.ecsPostprocessingComposer as\n | {\n setSize: (width: number, height: number) => void;\n render: () => void;\n }\n | undefined;\n\n if (composer) {\n const width = Math.max(1, this.renderer.domElement.clientWidth);\n const height = Math.max(1, this.renderer.domElement.clientHeight);\n composer.setSize(width, height);\n composer.render();\n } else {\n this.renderer.render(this.scene, this.camera);\n }\n\n this.afterRender?.();\n return;\n }\n\n this.renderer.render(this.scene, this.camera);\n this.afterRender?.();\n }\n}\n","import { ParentId } from \"../components\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\n\n/**\n * Collect the given roots plus every descendant, BFS parent-first, using the\n * `ParentId` component edges. Parent-first ordering matters: serialization\n * renumbers ids in this order and instantiation creates entities in file\n * order, so parents always exist before their children are linked.\n */\nexport function collectEntitySubtree(\n world: World,\n rootIds: EntityId[],\n): EntityId[] {\n // Build a parent → children index once instead of scanning per node.\n const childrenByParent = new Map<EntityId, EntityId[]>();\n for (const entityId of world.query(ParentId)) {\n const parentId = world.getComponent(entityId, ParentId)?.value;\n if (parentId === null || parentId === undefined) {\n continue;\n }\n const siblings = childrenByParent.get(parentId);\n if (siblings) {\n siblings.push(entityId);\n } else {\n childrenByParent.set(parentId, [entityId]);\n }\n }\n\n const ordered: EntityId[] = [];\n const seen = new Set<EntityId>();\n const queue = [...rootIds];\n\n while (queue.length > 0) {\n const entityId = queue.shift() as EntityId;\n if (seen.has(entityId)) {\n continue;\n }\n seen.add(entityId);\n ordered.push(entityId);\n\n const children = childrenByParent.get(entityId);\n if (children) {\n queue.push(...children.sort((a, b) => a - b));\n }\n }\n\n return ordered;\n}\n","import type { EcsWorldComponentSnapshot, HydrationPayload } from \"./types\";\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function readString(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n return typeof record.value === \"string\" ? record.value : null;\n}\n\nexport function readTransform(value: unknown): HydrationPayload[\"transform\"] {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n const position = asRecord(record.position);\n const rotation = asRecord(record.rotation);\n const scale = asRecord(record.scale);\n\n return {\n position: position\n ? {\n x: typeof position.x === \"number\" ? position.x : undefined,\n y: typeof position.y === \"number\" ? position.y : undefined,\n z: typeof position.z === \"number\" ? position.z : undefined,\n }\n : undefined,\n rotation: rotation\n ? {\n x: typeof rotation.x === \"number\" ? rotation.x : undefined,\n y: typeof rotation.y === \"number\" ? rotation.y : undefined,\n z: typeof rotation.z === \"number\" ? rotation.z : undefined,\n }\n : undefined,\n scale: scale\n ? {\n x: typeof scale.x === \"number\" ? scale.x : undefined,\n y: typeof scale.y === \"number\" ? scale.y : undefined,\n z: typeof scale.z === \"number\" ? scale.z : undefined,\n }\n : undefined,\n };\n}\n\nexport function readByComponent(\n components: EcsWorldComponentSnapshot[],\n componentName: string,\n): Map<number, unknown> {\n const component = components.find((entry) => entry.component === componentName);\n const map = new Map<number, unknown>();\n\n if (!component) {\n return map;\n }\n\n for (const entry of component.entries) {\n map.set(entry.entityId, entry.value);\n }\n\n return map;\n}\n\nexport function readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n","import type { EcsWorldStateSnapshotLike, ComponentValueMaps } from \"./types\";\nimport { readByComponent } from \"./readers\";\n\nexport function buildComponentValueMaps(\n snapshot: EcsWorldStateSnapshotLike,\n): ComponentValueMaps {\n return {\n object3DRefValues: readByComponent(snapshot.components, \"Object3DRef\"),\n nameValues: readByComponent(snapshot.components, \"Name\"),\n transformValues: readByComponent(snapshot.components, \"TransformComponent\"),\n modelValues: readByComponent(snapshot.components, \"ModelComponent\"),\n imageValues: readByComponent(snapshot.components, \"ImageComponent\"),\n spriteValues: readByComponent(snapshot.components, \"SpriteComponent\"),\n videoValues: readByComponent(snapshot.components, \"VideoComponent\"),\n cameraValues: readByComponent(snapshot.components, \"CameraComponent\"),\n environmentValues: readByComponent(snapshot.components, \"Environment\"),\n postprocessingValues: readByComponent(snapshot.components, \"Postprocessing\"),\n audioValues: readByComponent(snapshot.components, \"AudioComponent\"),\n imageTargetValues: readByComponent(snapshot.components, \"ImageTarget\"),\n lightValues: readByComponent(snapshot.components, \"LightComponent\"),\n materialValues: readByComponent(snapshot.components, \"MaterialComponent\"),\n meshGeometryValues: readByComponent(snapshot.components, \"MeshGeometryComponent\"),\n selectableValues: readByComponent(snapshot.components, \"Selectable\"),\n physicsValues: readByComponent(snapshot.components, \"PhysicsComponent\"),\n animationValues: readByComponent(snapshot.components, \"AnimationComponent\"),\n imageTargetAnchorValues: readByComponent(snapshot.components, \"ImageTargetAnchor\"),\n scriptValues: readByComponent(snapshot.components, \"ScriptComponent\"),\n scriptObjectValues: readByComponent(\n snapshot.components,\n \"ScriptObjectComponent\",\n ),\n xrRigValues: readByComponent(snapshot.components, \"XRRigComponent\"),\n vrTeleportAreaValues: readByComponent(\n snapshot.components,\n \"VRTeleportAreaComponent\",\n ),\n xrInteractableValues: readByComponent(\n snapshot.components,\n \"XRInteractableComponent\",\n ),\n xrInteractorValues: readByComponent(\n snapshot.components,\n \"XRInteractorComponent\",\n ),\n xrHandPoseValues: readByComponent(\n snapshot.components,\n \"XRHandPoseComponent\",\n ),\n xrInteractorSideValues: readByComponent(\n snapshot.components,\n \"XRInteractorSideComponent\",\n ),\n instancedMeshValues: readByComponent(snapshot.components, \"InstancedMeshComponent\"),\n instanceSlotValues: readByComponent(snapshot.components, \"InstanceSlotComponent\"),\n prefabNodeValues: readByComponent(snapshot.components, \"PrefabNode\"),\n prefabInstanceValues: readByComponent(snapshot.components, \"PrefabInstance\"),\n };\n}\n","import type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { EcsWorldStateSnapshotLike } from \"./types\";\nimport { asRecord, readByComponent } from \"./readers\";\n\nexport function applyParentLinks(\n snapshot: EcsWorldStateSnapshotLike,\n idMap: Map<number, number>,\n objectManagementSystem: ObjectManagementSystem,\n world: World,\n): void {\n const parentValues = readByComponent(snapshot.components, \"ParentId\");\n\n for (const [sourceEntityId, parentValue] of parentValues.entries()) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const parentRecord = asRecord(parentValue);\n const sourceParentId =\n parentRecord && typeof parentRecord.value === \"number\"\n ? parentRecord.value\n : null;\n\n if (sourceParentId === null) {\n objectManagementSystem.setParent(world, targetEntityId, null, {\n preserveWorldTransform: false,\n });\n continue;\n }\n\n const mappedParentId = idMap.get(sourceParentId);\n objectManagementSystem.setParent(world, targetEntityId, mappedParentId ?? null, {\n preserveWorldTransform: false,\n });\n }\n}\n","import {\n InstancedMeshComponent,\n Object3DRef,\n ScriptComponent,\n ScriptObjectComponent,\n VRTeleportAreaComponent,\n XRInteractorComponent,\n XRInteractorSideComponent,\n XRHandPoseComponent,\n XRInteractableComponent,\n XRRigComponent,\n} from \"../components\";\nimport { createHandPoseEntry } from \"../components/XRHandPose\";\nimport { createAttachPoint } from \"../components/XRInteractable\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord } from \"./readers\";\n\nfunction remapEntityRefsInScriptData(\n data: Record<string, unknown>,\n idMap: Map<number, number>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.type === \"entity\" && typeof v.value === \"number\") {\n result[key] = { ...v, value: idMap.get(v.value) ?? v.value };\n } else if (\n v.type === \"component\" &&\n v.value !== null &&\n typeof v.value === \"object\" &&\n !Array.isArray(v.value) &&\n typeof (v.value as Record<string, unknown>).entityId === \"number\"\n ) {\n const ref = v.value as Record<string, unknown>;\n result[key] = {\n ...v,\n value: { ...ref, entityId: idMap.get(ref.entityId as number) ?? ref.entityId },\n };\n } else {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function restorePostCreateComponents(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n idMap: Map<number, number>,\n): void {\n const objectRef = world.getComponent(targetEntityId, Object3DRef)?.object ?? null;\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType !== \"audio\") {\n const sourceOptions = asRecord(sourceAudio.options) ?? {};\n\n objectManagementSystem.createComponentNow(\n \"audio\",\n world,\n targetEntityId,\n typeof sourceAudio.path === \"string\" ? sourceAudio.path : \"\",\n sourceOptions,\n {\n object: objectRef,\n listener: objectManagementSystem.getOrCreateAudioListener(),\n isEditor: objectManagementSystem.isEditorMode(),\n },\n );\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType !== \"imageTarget\") {\n objectManagementSystem.createComponentNow(\n \"imageTarget\",\n world,\n targetEntityId,\n {\n targets: Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [],\n compiledTargetUrl:\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined,\n },\n );\n }\n\n const sourceImageTargetAnchor = asRecord(values.imageTargetAnchorValues.get(sourceEntityId));\n if (sourceImageTargetAnchor) {\n // ImageTargetAnchor.targetId references ImageTarget.targets[].id, not an entity id.\n // Preserve the id directly; idMap remapping is only valid for entity references.\n const mappedTargetId =\n typeof sourceImageTargetAnchor.targetId === \"number\" &&\n Number.isFinite(sourceImageTargetAnchor.targetId)\n ? sourceImageTargetAnchor.targetId\n : null;\n\n objectManagementSystem.createComponentNow(\"imageTargetAnchor\", world, targetEntityId, {\n targetId: mappedTargetId,\n targetUrl:\n typeof sourceImageTargetAnchor.targetUrl === \"string\"\n ? sourceImageTargetAnchor.targetUrl\n : undefined,\n });\n }\n\n const sourceScript = asRecord(values.scriptValues.get(sourceEntityId));\n if (sourceScript) {\n const entries = Array.isArray(sourceScript.entries)\n ? sourceScript.entries\n .map((entry) => asRecord(entry))\n .filter((entry): entry is Record<string, unknown> => Boolean(entry))\n .map((entry) => {\n const runtimeState: \"idle\" | \"loading\" | \"ready\" | \"error\" | undefined =\n entry.runtimeState === \"idle\" ||\n entry.runtimeState === \"loading\" ||\n entry.runtimeState === \"ready\" ||\n entry.runtimeState === \"error\"\n ? entry.runtimeState\n : undefined;\n\n return {\n entityId: targetEntityId,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data &&\n typeof entry.data === \"object\" &&\n !Array.isArray(entry.data)\n ? remapEntityRefsInScriptData(entry.data as Record<string, unknown>, idMap)\n : {},\n runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\"\n ? entry.runtimeMessage\n : undefined,\n };\n })\n .filter((entry) => entry.className || entry.scriptUrl)\n : [];\n\n // Skip only the ScriptComponent, never the rest of this pass. This was a\n // bare `return`, which exited the whole function — so an entity carrying a\n // Script component with no script picked yet (the state right after adding\n // one) silently lost every component restored below it, XR included.\n if (entries.length) {\n world.addComponent(targetEntityId, new ScriptComponent(entries));\n }\n }\n\n // Restore ScriptObjectComponent.data (with entity-ref remapping). The factory\n // already created the component with scriptUrl/className/enabled; runtimeState\n // is intentionally left \"idle\" so ScriptObjectSystem loads cleanly.\n const sourceScriptObject = asRecord(values.scriptObjectValues.get(sourceEntityId));\n if (sourceScriptObject) {\n const soc = world.getComponent(targetEntityId, ScriptObjectComponent);\n const data = asRecord(sourceScriptObject.data);\n if (soc && data) {\n soc.data = remapEntityRefsInScriptData(data, idMap);\n }\n }\n\n // Restore the XR authoring components' saved values.\n //\n // The entity factories seed these with DEFAULTS at create time (they only see\n // the create payload, not the snapshot), so without this pass a saved\n // teleport area would come back as a fresh 10×10 plane and the author's\n // width/depth/shape edits would be silently discarded on reload.\n {\n const sourceXrRig = asRecord(values.xrRigValues.get(sourceEntityId));\n const rig = world.getComponent(targetEntityId, XRRigComponent);\n if (sourceXrRig && rig) {\n if (typeof sourceXrRig.locomotion === \"string\") {\n rig.locomotion = sourceXrRig.locomotion as typeof rig.locomotion;\n }\n if (typeof sourceXrRig.moveSpeed === \"number\") {\n rig.moveSpeed = sourceXrRig.moveSpeed;\n }\n if (typeof sourceXrRig.snapTurn === \"boolean\") {\n rig.snapTurn = sourceXrRig.snapTurn;\n }\n if (typeof sourceXrRig.snapTurnDegrees === \"number\") {\n rig.snapTurnDegrees = sourceXrRig.snapTurnDegrees;\n }\n if (typeof sourceXrRig.teleportArcColor === \"string\") {\n rig.teleportArcColor = sourceXrRig.teleportArcColor;\n }\n if (typeof sourceXrRig.teleportArcInvalidColor === \"string\") {\n rig.teleportArcInvalidColor = sourceXrRig.teleportArcInvalidColor;\n }\n if (typeof sourceXrRig.teleportArcThickness === \"number\") {\n rig.teleportArcThickness = sourceXrRig.teleportArcThickness;\n }\n if (typeof sourceXrRig.fallbackEyeHeight === \"number\") {\n rig.fallbackEyeHeight = sourceXrRig.fallbackEyeHeight;\n }\n }\n }\n\n {\n const sourceArea = asRecord(values.vrTeleportAreaValues.get(sourceEntityId));\n const area = world.getComponent(targetEntityId, VRTeleportAreaComponent);\n if (sourceArea && area) {\n if (typeof sourceArea.enabled === \"boolean\") {\n area.enabled = sourceArea.enabled;\n }\n if (typeof sourceArea.shape === \"string\") {\n // \"cylinder\" is the pre-release alias for \"circle\".\n area.shape =\n sourceArea.shape === \"cylinder\"\n ? \"circle\"\n : (sourceArea.shape as typeof area.shape);\n }\n if (typeof sourceArea.width === \"number\") area.width = sourceArea.width;\n if (typeof sourceArea.depth === \"number\") area.depth = sourceArea.depth;\n }\n }\n\n {\n const sourceInteractable = asRecord(\n values.xrInteractableValues.get(sourceEntityId),\n );\n // CREATED HERE WHEN ABSENT. No entity factory produces an\n // XRInteractableComponent — it is only ever added to an existing object —\n // so hydration is the only thing that can put it back. Merely restoring\n // values onto an already-present component silently dropped grabbing from\n // every loaded scene: it worked in the editor, where the component is live\n // in memory, and vanished at runtime.\n let interactable = world.getComponent(\n targetEntityId,\n XRInteractableComponent,\n );\n if (sourceInteractable && !interactable) {\n interactable = new XRInteractableComponent();\n world.addComponent(targetEntityId, interactable);\n }\n if (sourceInteractable && interactable) {\n if (typeof sourceInteractable.enabled === \"boolean\") {\n interactable.enabled = sourceInteractable.enabled;\n }\n if (typeof sourceInteractable.grabbable === \"boolean\") {\n interactable.grabbable = sourceInteractable.grabbable;\n }\n if (typeof sourceInteractable.pointable === \"boolean\") {\n interactable.pointable = sourceInteractable.pointable;\n }\n if (typeof sourceInteractable.grabReach === \"string\") {\n interactable.grabReach =\n sourceInteractable.grabReach as typeof interactable.grabReach;\n }\n if (typeof sourceInteractable.distanceBehavior === \"string\") {\n interactable.distanceBehavior =\n sourceInteractable.distanceBehavior as typeof interactable.distanceBehavior;\n }\n if (typeof sourceInteractable.grabGesture === \"string\") {\n interactable.grabGesture =\n sourceInteractable.grabGesture as typeof interactable.grabGesture;\n }\n if (typeof sourceInteractable.grabRadius === \"number\") {\n interactable.grabRadius = sourceInteractable.grabRadius;\n }\n if (typeof sourceInteractable.grabHands === \"string\") {\n interactable.grabHands =\n sourceInteractable.grabHands as typeof interactable.grabHands;\n }\n if (typeof sourceInteractable.twoHandRotation === \"string\") {\n interactable.twoHandRotation =\n sourceInteractable.twoHandRotation as typeof interactable.twoHandRotation;\n }\n if (typeof sourceInteractable.allowTwoHandScale === \"boolean\") {\n interactable.allowTwoHandScale = sourceInteractable.allowTwoHandScale;\n }\n if (typeof sourceInteractable.minScale === \"number\") {\n interactable.minScale = sourceInteractable.minScale;\n }\n if (typeof sourceInteractable.maxScale === \"number\") {\n interactable.maxScale = sourceInteractable.maxScale;\n }\n if (Array.isArray(sourceInteractable.attachPoints)) {\n // Rebuilt through the factory so a point saved by an older editor gains\n // any field added since, instead of arriving half-populated.\n interactable.attachPoints = sourceInteractable.attachPoints\n .map((point) => asRecord(point))\n .filter(\n (point): point is Record<string, unknown> =>\n point !== null && typeof point.id === \"string\",\n )\n .map((point) =>\n createAttachPoint(\n point as unknown as Parameters<typeof createAttachPoint>[0],\n ),\n );\n }\n // `throwOnRelease`/`throwStrength` are the pre-0.3.11 names, still present\n // in scenes saved by a published build — read them as a fallback so those\n // projects keep their authored values.\n if (typeof sourceInteractable.applyVelocityOnRelease === \"boolean\") {\n interactable.applyVelocityOnRelease =\n sourceInteractable.applyVelocityOnRelease;\n } else if (typeof sourceInteractable.throwOnRelease === \"boolean\") {\n interactable.applyVelocityOnRelease = sourceInteractable.throwOnRelease;\n }\n if (typeof sourceInteractable.velocityScale === \"number\") {\n interactable.velocityScale = sourceInteractable.velocityScale;\n } else if (typeof sourceInteractable.throwStrength === \"number\") {\n interactable.velocityScale = sourceInteractable.throwStrength;\n }\n const grabPos = asRecord(sourceInteractable.grabOffsetPosition);\n if (grabPos) {\n interactable.grabOffsetPosition = {\n x: typeof grabPos.x === \"number\" ? grabPos.x : 0,\n y: typeof grabPos.y === \"number\" ? grabPos.y : 0,\n z: typeof grabPos.z === \"number\" ? grabPos.z : 0,\n };\n }\n const grabRot = asRecord(sourceInteractable.grabOffsetRotation);\n if (grabRot) {\n interactable.grabOffsetRotation = {\n x: typeof grabRot.x === \"number\" ? grabRot.x : 0,\n y: typeof grabRot.y === \"number\" ? grabRot.y : 0,\n z: typeof grabRot.z === \"number\" ? grabRot.z : 0,\n };\n }\n if (typeof sourceInteractable.hoverBehavior === \"string\") {\n interactable.hoverBehavior =\n sourceInteractable.hoverBehavior as typeof interactable.hoverBehavior;\n } else if (sourceInteractable.highlightOnHover === false) {\n // Migration: the old boolean is the only hover setting older scenes\n // carry, and turning it off meant \"no feedback\".\n interactable.hoverBehavior = \"none\";\n }\n if (typeof sourceInteractable.hoverColor === \"string\") {\n interactable.hoverColor = sourceInteractable.hoverColor;\n }\n if (typeof sourceInteractable.hoverScale === \"number\") {\n interactable.hoverScale = sourceInteractable.hoverScale;\n }\n }\n }\n\n {\n const sourceHandPose = asRecord(\n values.xrHandPoseValues.get(sourceEntityId),\n );\n // Created here when absent, for the same reason as XRInteractableComponent\n // above: no entity factory makes one, so hydration is its only way back.\n let handPose = world.getComponent(targetEntityId, XRHandPoseComponent);\n if (sourceHandPose && !handPose) {\n handPose = new XRHandPoseComponent();\n world.addComponent(targetEntityId, handPose);\n }\n if (sourceHandPose && handPose) {\n if (typeof sourceHandPose.enabled === \"boolean\") {\n handPose.enabled = sourceHandPose.enabled;\n }\n if (Array.isArray(sourceHandPose.poses)) {\n // Rebuilt through the factory so a pose saved by an older editor gains\n // any fields added since, rather than arriving half-populated.\n handPose.poses = sourceHandPose.poses\n .map((entry) => asRecord(entry))\n .filter(\n (entry): entry is Record<string, unknown> =>\n entry !== null && typeof entry.id === \"string\",\n )\n .map((entry) =>\n createHandPoseEntry(\n entry as unknown as Parameters<typeof createHandPoseEntry>[0],\n ),\n );\n }\n }\n }\n\n {\n const sourceInteractor = asRecord(\n values.xrInteractorValues.get(sourceEntityId),\n );\n const interactor = world.getComponent(targetEntityId, XRInteractorComponent);\n if (sourceInteractor && interactor) {\n if (typeof sourceInteractor.interactorType === \"string\") {\n interactor.interactorType =\n sourceInteractor.interactorType as typeof interactor.interactorType;\n }\n if (typeof sourceInteractor.handPreset === \"string\") {\n interactor.handPreset =\n sourceInteractor.handPreset as typeof interactor.handPreset;\n }\n if (typeof sourceInteractor.handColor === \"string\") {\n interactor.handColor = sourceInteractor.handColor;\n }\n if (typeof sourceInteractor.handOpacity === \"number\") {\n interactor.handOpacity = sourceInteractor.handOpacity;\n }\n if (typeof sourceInteractor.handEmissiveIntensity === \"number\") {\n interactor.handEmissiveIntensity =\n sourceInteractor.handEmissiveIntensity;\n }\n if (typeof sourceInteractor.rayVisibility === \"string\") {\n interactor.rayVisibility =\n sourceInteractor.rayVisibility as typeof interactor.rayVisibility;\n } else if (typeof sourceInteractor.showRay === \"boolean\") {\n // Migration: `showRay` was the pre-0.3.11 boolean, and its \"on\" state\n // meant exactly today's `interacting`.\n interactor.rayVisibility = sourceInteractor.showRay\n ? \"interacting\"\n : \"never\";\n }\n if (typeof sourceInteractor.rayColor === \"string\") {\n interactor.rayColor = sourceInteractor.rayColor;\n }\n if (typeof sourceInteractor.rayThickness === \"number\") {\n interactor.rayThickness = sourceInteractor.rayThickness;\n }\n }\n }\n\n {\n // The left/right slots are plain `empty` entities, so the factory never\n // creates their side marker — restore it or authored hand content loses\n // track of which hand it belongs to.\n const sourceSide = asRecord(\n values.xrInteractorSideValues.get(sourceEntityId),\n );\n if (sourceSide && typeof sourceSide.side === \"string\") {\n const existing = world.getComponent(\n targetEntityId,\n XRInteractorSideComponent,\n );\n if (existing) {\n existing.side = sourceSide.side as typeof existing.side;\n } else {\n world.addComponent(\n targetEntityId,\n new XRInteractorSideComponent({\n side: sourceSide.side as \"left\" | \"right\",\n }),\n );\n }\n }\n }\n\n // Restore the XR rig's tracking origin alongside its other fields.\n {\n const sourceRigOrigin = asRecord(values.xrRigValues.get(sourceEntityId));\n const rigForOrigin = world.getComponent(targetEntityId, XRRigComponent);\n if (\n sourceRigOrigin &&\n rigForOrigin &&\n typeof sourceRigOrigin.trackingOrigin === \"string\"\n ) {\n rigForOrigin.trackingOrigin =\n sourceRigOrigin.trackingOrigin as typeof rigForOrigin.trackingOrigin;\n }\n }\n\n // Remap InstancedMeshComponent.instanceEntityIds from snapshot IDs → live IDs.\n {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent && imComponent.instanceEntityIds.length > 0) {\n imComponent.instanceEntityIds = imComponent.instanceEntityIds.map(\n (oldId) => idMap.get(oldId) ?? oldId,\n );\n }\n }\n\n // Remap InstanceSlotComponent.groupEntityId from snapshot ID → live ID.\n {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent && slotComponent.groupEntityId !== -1) {\n slotComponent.groupEntityId =\n idMap.get(slotComponent.groupEntityId) ?? slotComponent.groupEntityId;\n }\n }\n}\n","import {\n AnimationComponent,\n type AnimationComponentOptions,\n} from \"../components\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { asRecord, readBoolean, readNumber } from \"./readers\";\n\nfunction readAnimationClipName(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n if (typeof record.name === \"string\") {\n return record.name;\n }\n\n return null;\n}\n\nfunction readAnimationStates(value: unknown): NonNullable<\n AnimationComponentOptions[\"states\"]\n> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const states: NonNullable<AnimationComponentOptions[\"states\"]> = [];\n\n for (const entry of value) {\n const state = asRecord(entry);\n if (!state) {\n continue;\n }\n\n const name = typeof state.name === \"string\" ? state.name : null;\n const clip = readAnimationClipName(state.clip);\n if (!name || !clip) {\n continue;\n }\n\n states.push({\n name,\n clip,\n clipId: typeof state.clipId === \"string\" ? state.clipId : undefined,\n loop: typeof state.loop === \"boolean\" ? state.loop : false,\n });\n }\n\n return states;\n}\n\nfunction readAnimationClipSources(\n value: unknown,\n): NonNullable<AnimationComponentOptions[\"externalClipSources\"]> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const seen = new Set<string>();\n const sources: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\") {\n continue;\n }\n\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n sources.push(trimmed);\n }\n\n return sources;\n}\n\nfunction toAnimationOptions(\n sourceAnimation: Record<string, unknown>,\n): AnimationComponentOptions {\n const paused = readBoolean(sourceAnimation.paused);\n const reverse = readBoolean(sourceAnimation.reverse);\n const timeScale = readNumber(sourceAnimation.timeScale);\n const crossFadeDuration = readNumber(sourceAnimation.crossFadeDuration);\n const states = readAnimationStates(sourceAnimation.states);\n const externalClipSources = readAnimationClipSources(\n sourceAnimation.externalClipSources,\n );\n const activeStateName =\n typeof sourceAnimation.activeStateName === \"string\"\n ? sourceAnimation.activeStateName\n : typeof sourceAnimation.activeState === \"string\"\n ? sourceAnimation.activeState\n : typeof (sourceAnimation.active as { name?: unknown } | undefined)?.name ===\n \"string\"\n ? ((sourceAnimation.active as { name: string }).name ?? null)\n : null;\n\n return {\n paused,\n reverse,\n timeScale,\n crossFadeDuration,\n states,\n externalClipSources,\n activeState: activeStateName,\n };\n}\n\nexport function restoreAnimationComponent(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceAnimation: Record<string, unknown>,\n): void {\n const options = toAnimationOptions(sourceAnimation);\n let animation = world.getComponent(targetEntityId, AnimationComponent);\n\n if (!animation) {\n objectManagementSystem.createComponentNow(\n \"animation\",\n world,\n targetEntityId,\n options,\n );\n animation = world.getComponent(targetEntityId, AnimationComponent);\n }\n\n if (!animation) {\n return;\n }\n\n const availableClips = Array.isArray(sourceAnimation.availableClips)\n ? sourceAnimation.availableClips.filter(\n (clip): clip is string => typeof clip === \"string\" && clip.length > 0,\n )\n : [];\n if (availableClips.length > 0) {\n animation.availableClips = [...availableClips];\n }\n\n if (Array.isArray(options.externalClipSources)) {\n animation.setExternalClipSources(options.externalClipSources);\n }\n\n const states = options.states ?? [];\n const hasClips = Array.isArray(animation.clips) && animation.clips.length > 0;\n if (!hasClips) {\n (\n animation as AnimationComponent & {\n __pendingHydratedOptions?: AnimationComponentOptions;\n }\n ).__pendingHydratedOptions = options;\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.paused === \"boolean\") {\n animation.paused = options.paused;\n }\n\n return;\n }\n\n if (states.length > 0) {\n animation.setStates(states);\n }\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.setActiveState(options.activeState, !options.paused);\n }\n\n if (typeof options.paused === \"boolean\") {\n if (options.paused) {\n animation.pauseState();\n } else if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.playState(options.activeState);\n }\n }\n}\n","import {\n AudioComponent,\n CameraComponent,\n Environment,\n type EnvironmentState,\n ImageComponent,\n ImageTarget,\n InstancedMeshComponent,\n LightComponent,\n MaterialComponent,\n MeshGeometryComponent,\n ModelComponent,\n Name,\n Object3DRef,\n PhysicsComponent,\n Postprocessing,\n PrefabInstance,\n PrefabNode,\n Selectable,\n SpriteComponent,\n TransformComponent,\n VideoComponent,\n} from \"../components\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { restoreAnimationComponent } from \"./animation\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord, readBoolean, readNumber, readString, readTransform } from \"./readers\";\n\nfunction readEnvironmentState(value: unknown): Partial<EnvironmentState> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues as Partial<EnvironmentState>;\n }\n\n return record as Partial<EnvironmentState>;\n}\n\nfunction readPostprocessingState(value: unknown): Record<string, unknown> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues;\n }\n\n return record;\n}\n\nexport function restoreComponentState(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n): void {\n const sourceName = readString(values.nameValues.get(sourceEntityId));\n if (sourceName !== null) {\n const nameComponent = world.getComponent(targetEntityId, Name);\n if (nameComponent) {\n nameComponent.value = sourceName;\n }\n }\n\n const sourceObject3DRef = asRecord(values.object3DRefValues.get(sourceEntityId));\n if (sourceObject3DRef) {\n const object3DRefComponent = world.getComponent(targetEntityId, Object3DRef);\n const visibility = readBoolean(sourceObject3DRef.visibility);\n if (object3DRefComponent && typeof visibility === \"boolean\") {\n object3DRefComponent.visibility = visibility;\n }\n }\n\n const sourceTransform = readTransform(values.transformValues.get(sourceEntityId));\n if (sourceTransform) {\n const transformComponent = world.getComponent(targetEntityId, TransformComponent);\n if (transformComponent) {\n if (typeof sourceTransform.position?.x === \"number\") {\n transformComponent.position.x = sourceTransform.position.x;\n }\n if (typeof sourceTransform.position?.y === \"number\") {\n transformComponent.position.y = sourceTransform.position.y;\n }\n if (typeof sourceTransform.position?.z === \"number\") {\n transformComponent.position.z = sourceTransform.position.z;\n }\n\n if (typeof sourceTransform.rotation?.x === \"number\") {\n transformComponent.rotation.x = sourceTransform.rotation.x;\n }\n if (typeof sourceTransform.rotation?.y === \"number\") {\n transformComponent.rotation.y = sourceTransform.rotation.y;\n }\n if (typeof sourceTransform.rotation?.z === \"number\") {\n transformComponent.rotation.z = sourceTransform.rotation.z;\n }\n\n if (typeof sourceTransform.scale?.x === \"number\") {\n transformComponent.scale.x = sourceTransform.scale.x;\n }\n if (typeof sourceTransform.scale?.y === \"number\") {\n transformComponent.scale.y = sourceTransform.scale.y;\n }\n if (typeof sourceTransform.scale?.z === \"number\") {\n transformComponent.scale.z = sourceTransform.scale.z;\n }\n }\n }\n\n const sourceModel = asRecord(values.modelValues.get(sourceEntityId));\n if (sourceModel) {\n const modelComponent = world.getComponent(targetEntityId, ModelComponent);\n if (modelComponent && typeof sourceModel.path === \"string\") {\n modelComponent.path = sourceModel.path;\n }\n }\n\n const sourceImage = asRecord(values.imageValues.get(sourceEntityId));\n if (sourceImage) {\n const imageComponent = world.getComponent(targetEntityId, ImageComponent);\n if (imageComponent) {\n if (typeof sourceImage.path === \"string\") {\n imageComponent.path = sourceImage.path;\n }\n\n const width = readNumber(sourceImage.width);\n if (typeof width === \"number\") {\n imageComponent.width = width;\n }\n\n const height = readNumber(sourceImage.height);\n if (typeof height === \"number\") {\n imageComponent.height = height;\n }\n }\n }\n\n const sourceSprite = asRecord(values.spriteValues.get(sourceEntityId));\n if (sourceSprite) {\n const spriteComponent = world.getComponent(targetEntityId, SpriteComponent);\n if (spriteComponent) {\n if (typeof sourceSprite.path === \"string\") {\n spriteComponent.path = sourceSprite.path;\n }\n\n const width = readNumber(sourceSprite.width);\n if (typeof width === \"number\") {\n spriteComponent.width = width;\n }\n\n const height = readNumber(sourceSprite.height);\n if (typeof height === \"number\") {\n spriteComponent.height = height;\n }\n }\n }\n\n const sourceVideo = asRecord(values.videoValues.get(sourceEntityId));\n if (sourceVideo) {\n const videoComponent = world.getComponent(targetEntityId, VideoComponent);\n if (videoComponent) {\n if (typeof sourceVideo.path === \"string\") {\n videoComponent.path = sourceVideo.path;\n }\n\n const videoOptions = asRecord(sourceVideo.options);\n if (videoOptions) {\n videoComponent.options = {\n ...videoComponent.options,\n ...videoOptions,\n } as typeof videoComponent.options;\n }\n }\n }\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType === \"audio\") {\n const audioComponent = world.getComponent(targetEntityId, AudioComponent);\n if (audioComponent) {\n if (typeof sourceAudio.path === \"string\") {\n audioComponent.path = sourceAudio.path;\n }\n\n const audioOptions = asRecord(sourceAudio.options);\n if (audioOptions) {\n audioComponent.options = {\n ...audioComponent.options,\n ...audioOptions,\n } as typeof audioComponent.options;\n }\n }\n }\n\n const sourceCamera = asRecord(values.cameraValues.get(sourceEntityId));\n if (sourceCamera) {\n const cameraComponent = world.getComponent(targetEntityId, CameraComponent);\n if (cameraComponent) {\n if (\n sourceCamera.projection === \"orthographic\" ||\n sourceCamera.projection === \"perspective\"\n ) {\n cameraComponent.projection = sourceCamera.projection;\n }\n\n if (\n sourceCamera.type === \"3d\" ||\n sourceCamera.type === \"ar\"\n ) {\n cameraComponent.type = sourceCamera.type;\n }\n\n if (typeof sourceCamera.isDefault === \"boolean\") {\n cameraComponent.isDefault = sourceCamera.isDefault;\n }\n\n const fov = readNumber(sourceCamera.fov);\n if (typeof fov === \"number\") {\n cameraComponent.fov = fov;\n }\n\n const near = readNumber(sourceCamera.near);\n if (typeof near === \"number\") {\n cameraComponent.near = near;\n }\n\n const far = readNumber(sourceCamera.far);\n if (typeof far === \"number\") {\n cameraComponent.far = far;\n }\n\n const left = readNumber(sourceCamera.left);\n if (typeof left === \"number\") {\n cameraComponent.left = left;\n }\n\n const right = readNumber(sourceCamera.right);\n if (typeof right === \"number\") {\n cameraComponent.right = right;\n }\n\n const top = readNumber(sourceCamera.top);\n if (typeof top === \"number\") {\n cameraComponent.top = top;\n }\n\n const bottom = readNumber(sourceCamera.bottom);\n if (typeof bottom === \"number\") {\n cameraComponent.bottom = bottom;\n }\n\n const zoom = readNumber(sourceCamera.zoom);\n if (typeof zoom === \"number\") {\n cameraComponent.zoom = zoom;\n }\n }\n }\n\n const sourceEnvironment = readEnvironmentState(\n values.environmentValues.get(sourceEntityId),\n );\n if (sourceEnvironment) {\n let environmentComponent = world.getComponent(targetEntityId, Environment);\n if (!environmentComponent) {\n objectManagementSystem.createComponentNow(\n \"environment\",\n world,\n targetEntityId,\n sourceEnvironment,\n );\n environmentComponent = world.getComponent(targetEntityId, Environment);\n }\n\n if (environmentComponent) {\n environmentComponent.values = new Environment({\n ...environmentComponent.values,\n ...sourceEnvironment,\n }).values;\n }\n }\n\n const sourcePostprocessing = readPostprocessingState(\n values.postprocessingValues.get(sourceEntityId),\n );\n if (sourcePostprocessing) {\n let postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n if (!postprocessingComponent) {\n objectManagementSystem.createComponentNow(\n \"postprocessing\",\n world,\n targetEntityId,\n sourcePostprocessing,\n );\n postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n }\n\n if (postprocessingComponent) {\n postprocessingComponent.values = new Postprocessing({\n ...postprocessingComponent.values,\n ...sourcePostprocessing,\n }).values;\n }\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType === \"imageTarget\") {\n const imageTargetComponent = world.getComponent(targetEntityId, ImageTarget);\n if (imageTargetComponent) {\n imageTargetComponent.targets = Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [];\n\n imageTargetComponent.compiledTargetUrl =\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined;\n\n imageTargetComponent.compiledTargetDir =\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined;\n }\n }\n\n const sourceLight = asRecord(values.lightValues.get(sourceEntityId));\n if (sourceLight) {\n const lightComponent = world.getComponent(targetEntityId, LightComponent);\n const sourceValues = asRecord(sourceLight.values);\n\n if (lightComponent && sourceValues) {\n lightComponent.values = {\n ...lightComponent.values,\n ...sourceValues,\n } as typeof lightComponent.values;\n }\n }\n\n const sourceMaterial = asRecord(values.materialValues.get(sourceEntityId));\n if (sourceMaterial) {\n const materialComponent = world.getComponent(targetEntityId, MaterialComponent);\n const sourceValues = sourceMaterial.values;\n\n if (materialComponent && Array.isArray(sourceValues)) {\n materialComponent.values = sourceValues as typeof materialComponent.values;\n }\n\n // Restore editor-managed material-asset linkage when present.\n const sourceAssetRefs = sourceMaterial.assetRefs;\n if (materialComponent && Array.isArray(sourceAssetRefs)) {\n materialComponent.assetRefs = sourceAssetRefs as (string | null)[];\n }\n }\n\n const sourceMeshGeometry = asRecord(values.meshGeometryValues.get(sourceEntityId));\n if (sourceMeshGeometry) {\n const meshGeometryComponent = world.getComponent(\n targetEntityId,\n MeshGeometryComponent,\n );\n\n if (meshGeometryComponent) {\n const parameters = asRecord(sourceMeshGeometry.parameters);\n if (parameters) {\n meshGeometryComponent.parameters =\n parameters as typeof meshGeometryComponent.parameters;\n }\n\n if (typeof sourceMeshGeometry.modelName === \"string\") {\n meshGeometryComponent.modelName = sourceMeshGeometry.modelName;\n }\n\n if (typeof sourceMeshGeometry.castShadow === \"boolean\") {\n meshGeometryComponent.castShadow = sourceMeshGeometry.castShadow;\n }\n\n if (typeof sourceMeshGeometry.receiveShadow === \"boolean\") {\n meshGeometryComponent.receiveShadow = sourceMeshGeometry.receiveShadow;\n }\n }\n }\n\n const sourceSelectable = asRecord(values.selectableValues.get(sourceEntityId));\n if (sourceSelectable) {\n const enabled = readBoolean(sourceSelectable.enabled);\n let selectable = world.getComponent(targetEntityId, Selectable);\n\n if (!selectable) {\n objectManagementSystem.createComponentNow(\n \"selectable\",\n world,\n targetEntityId,\n enabled ?? true,\n );\n selectable = world.getComponent(targetEntityId, Selectable);\n }\n\n if (selectable && typeof enabled === \"boolean\") {\n selectable.enabled = enabled;\n }\n }\n\n const sourcePhysics = asRecord(values.physicsValues.get(sourceEntityId));\n if (sourcePhysics) {\n // Unwrap wrapped component snapshot shape: { values: { rigidbody, collider }, rigidBody, collider }\n // Fall back to raw shape for backward compatibility with any plain-shape saves.\n const physicsValues = asRecord(sourcePhysics.values) ?? sourcePhysics;\n\n let physics = world.getComponent(targetEntityId, PhysicsComponent);\n if (!physics) {\n objectManagementSystem.createComponentNow(\n \"physics\",\n world,\n targetEntityId,\n physicsValues,\n );\n physics = world.getComponent(targetEntityId, PhysicsComponent);\n }\n\n if (physics) {\n physics.setValues({\n rigidbody: asRecord(physicsValues.rigidbody) as never ?? {},\n collider: asRecord(physicsValues.collider) as never ?? {},\n });\n }\n }\n\n const sourceAnimation = asRecord(values.animationValues.get(sourceEntityId));\n if (sourceAnimation) {\n restoreAnimationComponent(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceAnimation,\n );\n }\n\n const sourceInstancedMesh = asRecord(values.instancedMeshValues.get(sourceEntityId));\n if (sourceInstancedMesh) {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent) {\n if (typeof sourceInstancedMesh.meshKind === \"string\") {\n imComponent.meshKind = sourceInstancedMesh.meshKind as typeof imComponent.meshKind;\n }\n\n if (typeof sourceInstancedMesh.modelPath === \"string\") {\n imComponent.modelPath = sourceInstancedMesh.modelPath;\n }\n\n const parameters = asRecord(sourceInstancedMesh.meshParameters);\n if (parameters) {\n imComponent.meshParameters = parameters as typeof imComponent.meshParameters;\n }\n\n if (typeof sourceInstancedMesh.castShadow === \"boolean\") {\n imComponent.castShadow = sourceInstancedMesh.castShadow;\n }\n\n if (typeof sourceInstancedMesh.receiveShadow === \"boolean\") {\n imComponent.receiveShadow = sourceInstancedMesh.receiveShadow;\n }\n\n // New format: restore instanceEntityIds (IDs are old snapshot IDs —\n // remapping to live IDs is deferred to restorePostCreateComponents).\n if (Array.isArray(sourceInstancedMesh.instanceEntityIds)) {\n imComponent.instanceEntityIds =\n sourceInstancedMesh.instanceEntityIds as number[];\n }\n // Old format (migration): instanceEntityIds were already created by the\n // factory from the legacy instances[] array — nothing more to do here.\n\n // Force geometry rebuild on next system update by clearing the runtime ref.\n imComponent.instancedMesh = null;\n }\n }\n\n // InstanceSlotComponent: slotIndex is restored here; groupEntityId remapping\n // is deferred to restorePostCreateComponents (needs idMap).\n const sourceInstanceSlot = asRecord(values.instanceSlotValues.get(sourceEntityId));\n if (sourceInstanceSlot) {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent) {\n if (typeof sourceInstanceSlot.slotIndex === \"number\") {\n slotComponent.slotIndex = sourceInstanceSlot.slotIndex;\n }\n // groupEntityId is set from the factory payload and will be remapped in postCreate.\n }\n }\n\n // PrefabNode: stable prefab identity — factories never create it, so re-add\n // directly (same pattern as ScriptComponent in restorePostCreateComponents).\n const sourcePrefabNode = asRecord(values.prefabNodeValues.get(sourceEntityId));\n if (sourcePrefabNode && typeof sourcePrefabNode.nodeId === \"string\") {\n if (!world.getComponent(targetEntityId, PrefabNode)) {\n world.addComponent(targetEntityId, new PrefabNode(sourcePrefabNode.nodeId));\n }\n }\n\n // PrefabInstance: prefab-asset link on instance roots.\n const sourcePrefabInstance = asRecord(\n values.prefabInstanceValues.get(sourceEntityId),\n );\n if (sourcePrefabInstance && typeof sourcePrefabInstance.url === \"string\") {\n if (!world.getComponent(targetEntityId, PrefabInstance)) {\n const overrides = Array.isArray(sourcePrefabInstance.overrides)\n ? sourcePrefabInstance.overrides.filter(\n (entry): entry is string => typeof entry === \"string\",\n )\n : [];\n world.addComponent(\n targetEntityId,\n new PrefabInstance(\n sourcePrefabInstance.url,\n overrides,\n // Preserve the placement identity; the constructor generates a\n // fresh one for legacy snapshots that predate instanceId.\n typeof sourcePrefabInstance.instanceId === \"string\" &&\n sourcePrefabInstance.instanceId.length > 0\n ? sourcePrefabInstance.instanceId\n : undefined,\n ),\n );\n }\n }\n}\n","import type { EcsEntityKind } from \"../types\";\n\nexport type HydrationPayload = {\n /**\n * Suppress default child entities the factory would create.\n *\n * Always set during hydration — the snapshot already contains those children.\n */\n skipDefaultChildren?: boolean;\n name?: string;\n transform?: {\n position?: { x?: number; y?: number; z?: number };\n rotation?: { x?: number; y?: number; z?: number };\n scale?: { x?: number; y?: number; z?: number };\n };\n path?: string;\n options?: Record<string, unknown>;\n useWorldCamera?: boolean;\n};\n\nexport type ComponentValueMaps = {\n object3DRefValues: Map<number, unknown>;\n nameValues: Map<number, unknown>;\n transformValues: Map<number, unknown>;\n modelValues: Map<number, unknown>;\n imageValues: Map<number, unknown>;\n spriteValues: Map<number, unknown>;\n videoValues: Map<number, unknown>;\n cameraValues: Map<number, unknown>;\n environmentValues: Map<number, unknown>;\n postprocessingValues: Map<number, unknown>;\n audioValues: Map<number, unknown>;\n imageTargetValues: Map<number, unknown>;\n lightValues: Map<number, unknown>;\n materialValues: Map<number, unknown>;\n meshGeometryValues: Map<number, unknown>;\n selectableValues: Map<number, unknown>;\n physicsValues: Map<number, unknown>;\n animationValues: Map<number, unknown>;\n imageTargetAnchorValues: Map<number, unknown>;\n scriptValues: Map<number, unknown>;\n scriptObjectValues: Map<number, unknown>;\n xrRigValues: Map<number, unknown>;\n vrTeleportAreaValues: Map<number, unknown>;\n xrInteractableValues: Map<number, unknown>;\n xrInteractorValues: Map<number, unknown>;\n xrHandPoseValues: Map<number, unknown>;\nxrInteractorSideValues: Map<number, unknown>;\n instancedMeshValues: Map<number, unknown>;\n instanceSlotValues: Map<number, unknown>;\n prefabNodeValues: Map<number, unknown>;\n prefabInstanceValues: Map<number, unknown>;\n};\n\nexport type EcsWorldComponentSnapshot = {\n component: string;\n entries: Array<{\n entityId: number;\n value: unknown;\n }>;\n};\n\nexport type EcsWorldStateSnapshotLike = {\n selectedEntityId?: number | null;\n entities: number[];\n components: EcsWorldComponentSnapshot[];\n};\n\nexport type HydrateWorldFromSnapshotResult = {\n restoredCount: number;\n selectedEntityId: number | null;\n /** Snapshot entity id → created live entity id for every hydrated entity. */\n idMap: Map<number, number>;\n};\n\n/**\n * Optional behavior tweaks for {@link hydrateWorldFromSnapshotDetailed}.\n * Defaults preserve the historical full-world-load behavior; prefab/subtree\n * instantiation passes stricter options.\n */\nexport type HydrateOptions = {\n /**\n * When false, no camera in the snapshot is promoted to the world camera.\n * Defaults to true (full scene loads want their default camera active);\n * prefab spawns pass false so a spawned camera never hijacks the view.\n */\n assignPrimaryCamera?: boolean;\n /**\n * \"world\" (default) re-applies local transforms for every entity in the\n * world after parent links restore — correct for full scene loads.\n * \"created\" limits the pass to entities created by THIS hydrate call, so\n * mid-session spawns don't touch unrelated live entities.\n */\n applyTransformsScope?: \"world\" | \"created\";\n};\n\nexport const HYDRATABLE_ENTITY_KINDS = new Set<EcsEntityKind>([\n \"cube\",\n \"sphere\",\n \"plane\",\n \"capsule\",\n \"cylinder\",\n \"empty\",\n \"model\",\n \"image\",\n \"imageTarget\",\n \"sprite\",\n \"audio\",\n \"camera\",\n \"video\",\n \"ambientLight\",\n \"directionalLight\",\n \"pointLight\",\n \"spotLight\",\n \"areaLight\",\n \"instancedMesh\",\n \"instanceSlot\",\n \"scriptObject\",\n \"xrRig\",\n \"xrInteractor\",\n \"teleportArea\",\n]);\n","import { Object3DRef, TransformComponent } from \"../components\";\nimport {\n applyTransform,\n type ObjectManagementSystem,\n} from \"../systems/ObjectManagementSystem\";\nimport type { EcsEntityKind } from \"../types\";\nimport type { World } from \"../World\";\nimport { buildComponentValueMaps } from \"./componentValues\";\nimport { applyParentLinks } from \"./parentLinks\";\nimport { restorePostCreateComponents } from \"./postCreateComponents\";\nimport { restoreComponentState } from \"./restoreComponentState\";\nimport { asRecord, readByComponent, readString, readTransform } from \"./readers\";\nimport {\n HYDRATABLE_ENTITY_KINDS,\n type EcsWorldStateSnapshotLike,\n type HydrateOptions,\n type HydrateWorldFromSnapshotResult,\n type HydrationPayload,\n} from \"./types\";\n\nexport type {\n EcsWorldComponentSnapshot,\n EcsWorldStateSnapshotLike,\n HydrateOptions,\n HydrateWorldFromSnapshotResult,\n} from \"./types\";\nexport { HYDRATABLE_ENTITY_KINDS } from \"./types\";\n\nfunction buildEntityCreationPayload(\n sourceEntityId: number,\n kind: EcsEntityKind,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n): HydrationPayload {\n const payload: HydrationPayload = {\n name: readString(componentValues.nameValues.get(sourceEntityId)) ?? undefined,\n transform: readTransform(componentValues.transformValues.get(sourceEntityId)),\n };\n\n if (kind === \"model\") {\n const model = asRecord(componentValues.modelValues.get(sourceEntityId));\n if (typeof model?.path === \"string\") {\n payload.path = model.path;\n }\n }\n\n if (kind === \"image\") {\n const image = asRecord(componentValues.imageValues.get(sourceEntityId));\n if (typeof image?.path === \"string\") {\n payload.path = image.path;\n }\n }\n\n if (kind === \"sprite\") {\n const sprite = asRecord(componentValues.spriteValues.get(sourceEntityId));\n if (typeof sprite?.path === \"string\") {\n payload.path = sprite.path;\n }\n }\n\n if (kind === \"video\") {\n const video = asRecord(componentValues.videoValues.get(sourceEntityId));\n if (typeof video?.path === \"string\") {\n payload.path = video.path;\n }\n const videoOptions = asRecord(video?.options);\n if (videoOptions) {\n payload.options = videoOptions;\n }\n }\n\n if (kind === \"audio\") {\n const audio = asRecord(componentValues.audioValues.get(sourceEntityId));\n if (typeof audio?.path === \"string\") {\n payload.path = audio.path;\n }\n const audioOptions = asRecord(audio?.options);\n if (audioOptions) {\n payload.options = audioOptions;\n }\n }\n\n if (kind === \"camera\") {\n const camera = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (camera) {\n const projection =\n camera.projection === \"orthographic\" || camera.projection === \"perspective\"\n ? camera.projection\n : undefined;\n const type =\n camera.type === \"3d\" || camera.type === \"ar\"\n ? camera.type\n : undefined;\n\n payload.options = {\n isDefault: typeof camera.isDefault === \"boolean\" ? camera.isDefault : undefined,\n projection,\n type,\n fov: typeof camera.fov === \"number\" ? camera.fov : undefined,\n near: typeof camera.near === \"number\" ? camera.near : undefined,\n far: typeof camera.far === \"number\" ? camera.far : undefined,\n left: typeof camera.left === \"number\" ? camera.left : undefined,\n right: typeof camera.right === \"number\" ? camera.right : undefined,\n top: typeof camera.top === \"number\" ? camera.top : undefined,\n bottom: typeof camera.bottom === \"number\" ? camera.bottom : undefined,\n zoom: typeof camera.zoom === \"number\" ? camera.zoom : undefined,\n };\n }\n }\n\n if (kind === \"imageTarget\") {\n const imageTarget = asRecord(componentValues.imageTargetValues.get(sourceEntityId));\n if (imageTarget) {\n payload.options = {\n targets: Array.isArray(imageTarget.targets) ? imageTarget.targets : [],\n compiledTargetUrl:\n typeof imageTarget.compiledTargetUrl === \"string\"\n ? imageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof imageTarget.compiledTargetDir === \"string\"\n ? imageTarget.compiledTargetDir\n : undefined,\n };\n }\n }\n\n if (kind === \"instancedMesh\") {\n const im = asRecord(componentValues.instancedMeshValues.get(sourceEntityId));\n if (im) {\n payload.options = {\n meshKind: typeof im.meshKind === \"string\" ? im.meshKind : \"cube\",\n modelPath: typeof im.modelPath === \"string\" ? im.modelPath : undefined,\n meshParameters: asRecord(im.meshParameters) ?? undefined,\n castShadow: typeof im.castShadow === \"boolean\" ? im.castShadow : false,\n receiveShadow: typeof im.receiveShadow === \"boolean\" ? im.receiveShadow : false,\n // New format: signal the factory to skip child entity creation.\n // Old format (instances[]): pass through for migration — factory will\n // create slot entities from the legacy InstanceTransform array.\n ...(Array.isArray(im.instanceEntityIds)\n ? { instanceEntityIds: im.instanceEntityIds }\n : Array.isArray(im.instances)\n ? { instances: im.instances }\n : {}),\n };\n }\n }\n\n if (kind === \"instanceSlot\") {\n const slot = asRecord(componentValues.instanceSlotValues.get(sourceEntityId));\n if (slot) {\n payload.options = {\n groupEntityId: typeof slot.groupEntityId === \"number\" ? slot.groupEntityId : -1,\n slotIndex: typeof slot.slotIndex === \"number\" ? slot.slotIndex : 0,\n };\n }\n }\n\n if (kind === \"scriptObject\") {\n const so = asRecord(componentValues.scriptObjectValues.get(sourceEntityId));\n if (so) {\n // Identity pre-linked at creation; `data` (with entity-ref remapping) is\n // restored in the post-create pass where the full idMap exists.\n payload.options = {\n scriptUrl: typeof so.scriptUrl === \"string\" ? so.scriptUrl : null,\n className: typeof so.className === \"string\" ? so.className : null,\n enabled: typeof so.enabled === \"boolean\" ? so.enabled : true,\n };\n }\n }\n\n return payload;\n}\n\nfunction resolvePrimaryCameraSourceEntityId(\n snapshot: EcsWorldStateSnapshotLike,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n entityTypeValues: Map<number, unknown>,\n): number | null {\n let firstCameraSourceEntityId: number | null = null;\n\n for (const sourceEntityId of snapshot.entities) {\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n if (entityType !== \"camera\") {\n continue;\n }\n\n if (firstCameraSourceEntityId === null) {\n firstCameraSourceEntityId = sourceEntityId;\n }\n\n const cameraValue = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (cameraValue?.isDefault === true) {\n return sourceEntityId;\n }\n }\n\n return firstCameraSourceEntityId;\n}\n\nfunction applyLocalTransformsAfterHierarchyRestore(\n world: World,\n scopeEntityIds?: Iterable<number>,\n): void {\n const transformEntities = scopeEntityIds\n ? Array.from(scopeEntityIds)\n : world.query(TransformComponent, Object3DRef);\n\n for (const entityId of transformEntities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!transform || !object) {\n continue;\n }\n\n // Parent links are already resolved, so applying transform now uses correct local space.\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n}\n\nexport function hydrateWorldFromSnapshotDetailed(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n options?: HydrateOptions,\n): HydrateWorldFromSnapshotResult {\n if (!snapshot || !snapshot.entities.length) {\n return {\n restoredCount: 0,\n selectedEntityId: null,\n idMap: new Map(),\n };\n }\n\n const assignPrimaryCamera = options?.assignPrimaryCamera !== false;\n const entityTypeValues = readByComponent(snapshot.components, \"EntityType\");\n const componentValues = buildComponentValueMaps(snapshot);\n const primaryCameraSourceEntityId = assignPrimaryCamera\n ? resolvePrimaryCameraSourceEntityId(\n snapshot,\n componentValues,\n entityTypeValues,\n )\n : null;\n const idMap = new Map<number, number>();\n\n for (const sourceEntityId of snapshot.entities) {\n const entityTypeValue = entityTypeValues.get(sourceEntityId);\n const entityType = readString(entityTypeValue);\n if (!entityType || !HYDRATABLE_ENTITY_KINDS.has(entityType as EcsEntityKind)) {\n continue;\n }\n\n const kind = entityType as EcsEntityKind;\n const payload = buildEntityCreationPayload(sourceEntityId, kind, componentValues);\n\n if (kind === \"camera\" && sourceEntityId === primaryCameraSourceEntityId) {\n payload.useWorldCamera = true;\n\n const options = asRecord(payload.options);\n payload.options = {\n ...(options ?? {}),\n isDefault: true,\n };\n }\n\n // The snapshot carries every entity, including factory-authored children,\n // so factories must not add their own during a restore.\n payload.skipDefaultChildren = true;\n\n const createdEntityId = objectManagementSystem.createNow(kind, world, payload);\n idMap.set(sourceEntityId, createdEntityId);\n }\n\n for (const sourceEntityId of snapshot.entities) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n\n restoreComponentState(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n );\n\n restorePostCreateComponents(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n idMap,\n );\n }\n\n applyParentLinks(snapshot, idMap, objectManagementSystem, world);\n objectManagementSystem.reconcileSceneFromWorld(world);\n applyLocalTransformsAfterHierarchyRestore(\n world,\n options?.applyTransformsScope === \"created\" ? idMap.values() : undefined,\n );\n\n const selectedEntityId =\n typeof snapshot.selectedEntityId === \"number\"\n ? (idMap.get(snapshot.selectedEntityId) ?? null)\n : null;\n\n return {\n restoredCount: idMap.size,\n selectedEntityId,\n idMap,\n };\n}\n\nexport function hydrateWorldFromSnapshot(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n): number {\n return hydrateWorldFromSnapshotDetailed(\n snapshot,\n world,\n objectManagementSystem,\n ).restoredCount;\n}\n","/**\n * Per-property prefab override model — pure JSON-space functions shared by\n * the editor (diff/merge at apply time) and future `.scene` tooling.\n *\n * The core problem: an instance's entity ids differ from the prefab file's\n * ids by construction, so raw values can't be compared. Both sides are first\n * CANONICALIZED into nodeId-space: every entity-id-bearing field (kept in\n * sync with `snapshotIdUtils.ts`) becomes `{ $node: \"<nodeId>\" }` when the id\n * maps to a node inside the same document, or stays a raw id when external.\n * Two canonical values are equal iff they describe the same state relative\n * to their own subtree.\n *\n * Override encoding (stored in `PrefabInstance.overrides`):\n * \"<nodeId>|<ComponentName>|<slash/separated/path>\"\n * \"<nodeId>|<ComponentName>|\" // empty path = whole component overridden\n */\n\nimport {\n ADDED_NODE_MARKER_COMPONENT,\n buildNodeKeyMapsFromSnapshot,\n} from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/** Components that never participate in override diffing/merging. */\nexport const OVERRIDE_DIFF_EXCLUDED_COMPONENTS = new Set([\n \"PrefabNode\",\n \"PrefabInstance\",\n \"EntityType\",\n \"Selectable\",\n \"SelectionTransformState\",\n]);\n\n/**\n * Components excluded ONLY on the instance ROOT node — these are per-instance\n * by definition (where the instance sits in the scene and what it's called).\n */\nexport const OVERRIDE_ROOT_EXCLUDED_COMPONENTS = new Set([\n \"TransformComponent\",\n \"Name\",\n \"ParentId\",\n]);\n\nexport type NodeMaps = {\n idToNode: Map<number, string>;\n nodeToId: Map<string, number>;\n /** nodeId of the subtree root (entity whose ParentId is null/absent). */\n rootNodeId: string | null;\n};\n\ntype Rec = Record<string, unknown>;\n\nconst asRecord = (value: unknown): Rec | null =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Rec)\n : null;\n\nconst clone = <T>(value: T): T =>\n value === undefined ? value : (structuredClone(value) as T);\n\n/** `{ $node: \"<nodeId>\" }` marker — a canonical internal entity reference. */\nconst isNodeRef = (value: unknown): value is { $node: string } => {\n const record = asRecord(value);\n return Boolean(\n record &&\n typeof record.$node === \"string\" &&\n Object.keys(record).length === 1,\n );\n};\n\nconst makeNodeRef = (nodeId: string) => ({ $node: nodeId });\n\n/** Entity ids of entities whose ParentId is null or absent. */\nexport function findSnapshotRootEntityIds(snapshot: SubtreeSnapshot): number[] {\n const parentBlock = snapshot.components.find(\n (block) => block.component === \"ParentId\",\n );\n const parentByEntity = new Map<number, unknown>();\n for (const entry of parentBlock?.entries ?? []) {\n parentByEntity.set(entry.entityId, asRecord(entry.value)?.value ?? null);\n }\n return snapshot.entities.filter(\n (entityId) => typeof parentByEntity.get(entityId) !== \"number\",\n );\n}\n\nexport function buildNodeMapsFromSnapshot(snapshot: SubtreeSnapshot): NodeMaps {\n const idToNode = new Map<number, string>();\n const nodeToId = new Map<string, number>();\n\n const nodeBlock = snapshot.components.find(\n (block) => block.component === \"PrefabNode\",\n );\n for (const entry of nodeBlock?.entries ?? []) {\n const nodeId = asRecord(entry.value)?.nodeId;\n if (typeof nodeId === \"string\" && nodeId.length > 0) {\n idToNode.set(entry.entityId, nodeId);\n nodeToId.set(nodeId, entry.entityId);\n }\n }\n\n const rootEntityId = findSnapshotRootEntityIds(snapshot)[0];\n const rootNodeId =\n rootEntityId !== undefined ? (idToNode.get(rootEntityId) ?? null) : null;\n\n return { idToNode, nodeToId, rootNodeId };\n}\n\n/** Invert the columnar snapshot into entityId → (componentName → value). */\nexport function indexSnapshotByEntity(\n snapshot: SubtreeSnapshot,\n): Map<number, Map<string, unknown>> {\n const byEntity = new Map<number, Map<string, unknown>>();\n for (const block of snapshot.components) {\n for (const entry of block.entries) {\n let componentMap = byEntity.get(entry.entityId);\n if (!componentMap) {\n componentMap = new Map();\n byEntity.set(entry.entityId, componentMap);\n }\n componentMap.set(block.component, entry.value);\n }\n }\n return byEntity;\n}\n\nconst toRefOrRaw = (id: number, idToNode: Map<number, string>): unknown => {\n const nodeId = idToNode.get(id);\n return nodeId !== undefined ? makeNodeRef(nodeId) : id;\n};\n\n/** Canonicalize a script `data` record: EntityInput/ComponentInput ids → `{$node}`. */\nfunction canonicalizeScriptDataFields(\n data: Rec,\n idToNode: Map<number, string>,\n): Rec {\n const canonicalData: Rec = {};\n for (const [key, fieldValue] of Object.entries(data)) {\n const field = asRecord(fieldValue);\n if (field?.type === \"entity\" && typeof field.value === \"number\") {\n canonicalData[key] = {\n ...field,\n value: toRefOrRaw(field.value, idToNode),\n };\n continue;\n }\n const componentRef = asRecord(field?.value);\n if (\n field?.type === \"component\" &&\n componentRef &&\n typeof componentRef.entityId === \"number\"\n ) {\n canonicalData[key] = {\n ...field,\n value: {\n ...componentRef,\n entityId: toRefOrRaw(componentRef.entityId, idToNode),\n },\n };\n continue;\n }\n canonicalData[key] = fieldValue;\n }\n return canonicalData;\n}\n\n/**\n * Canonicalize a serialized component value into nodeId-space:\n * - entity-id fields → `{$node}` (internal) or raw id (external)\n * - ScriptComponent entries keep only `{className, scriptUrl, enabled, data}`\n * (entityId/runtimeState/runtimeMessage are per-instance transients)\n * - ScriptObjectComponent keeps only `{scriptUrl, className, enabled, data}`\n * (runtimeState/runtimeMessage are per-instance transients)\n * - Object3DRef keeps only `{visibility}` (the rest is a live object ref)\n *\n * Keep the id-bearing field list in sync with `snapshotIdUtils.ts`.\n */\nexport function canonicalizeComponentValue(\n componentName: string,\n value: unknown,\n idToNode: Map<number, string>,\n): unknown {\n const cloned = clone(value);\n const record = asRecord(cloned);\n if (!record) {\n return cloned;\n }\n\n if (componentName === \"ParentId\") {\n if (typeof record.value === \"number\") {\n record.value = toRefOrRaw(record.value, idToNode);\n }\n return record;\n }\n\n if (componentName === \"Object3DRef\") {\n return {\n visibility:\n typeof record.visibility === \"boolean\" ? record.visibility : true,\n };\n }\n\n if (componentName === \"ScriptComponent\") {\n const entries = Array.isArray(record.entries) ? record.entries : [];\n return {\n entries: entries.map((rawEntry) => {\n const entry = asRecord(rawEntry);\n if (!entry) {\n return rawEntry;\n }\n return {\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data: canonicalizeScriptDataFields(asRecord(entry.data) ?? {}, idToNode),\n };\n }),\n };\n }\n\n if (componentName === \"ScriptObjectComponent\") {\n return {\n scriptUrl: typeof record.scriptUrl === \"string\" ? record.scriptUrl : null,\n className: typeof record.className === \"string\" ? record.className : null,\n enabled: typeof record.enabled === \"boolean\" ? record.enabled : true,\n data: canonicalizeScriptDataFields(asRecord(record.data) ?? {}, idToNode),\n };\n }\n\n if (componentName === \"InstancedMeshComponent\") {\n if (Array.isArray(record.instanceEntityIds)) {\n record.instanceEntityIds = record.instanceEntityIds.map((id) =>\n typeof id === \"number\" ? toRefOrRaw(id, idToNode) : id,\n );\n }\n return record;\n }\n\n if (componentName === \"InstanceSlotComponent\") {\n if (\n typeof record.groupEntityId === \"number\" &&\n record.groupEntityId !== -1\n ) {\n record.groupEntityId = toRefOrRaw(record.groupEntityId, idToNode);\n }\n return record;\n }\n\n return record;\n}\n\n/**\n * Replace every `{$node}` marker (at any depth) with the mapped entity id\n * from `nodeToId`, or null when the node no longer exists. Exact inverse of\n * canonicalization for the id-bearing positions.\n */\nexport function decanonicalizeComponentValue(\n value: unknown,\n nodeToId: Map<string, number>,\n): unknown {\n if (isNodeRef(value)) {\n return nodeToId.get(value.$node) ?? null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => decanonicalizeComponentValue(item, nodeToId));\n }\n const record = asRecord(value);\n if (record) {\n const result: Rec = {};\n for (const [key, item] of Object.entries(record)) {\n result[key] = decanonicalizeComponentValue(item, nodeToId);\n }\n return result;\n }\n return value;\n}\n\nexport const encodeOverride = (\n nodeId: string,\n componentName: string,\n path: string,\n): string => `${nodeId}|${componentName}|${path}`;\n\nexport function parseOverride(\n encoded: string,\n): { nodeId: string; componentName: string; path: string } | null {\n const firstSep = encoded.indexOf(\"|\");\n if (firstSep <= 0) {\n return null;\n }\n const secondSep = encoded.indexOf(\"|\", firstSep + 1);\n if (secondSep <= firstSep + 1) {\n return null;\n }\n return {\n nodeId: encoded.slice(0, firstSep),\n componentName: encoded.slice(firstSep + 1, secondSep),\n path: encoded.slice(secondSep + 1),\n };\n}\n\n/** nodeId → componentName → set of overridden paths. */\nexport function groupOverridePaths(\n overrides: string[],\n): Map<string, Map<string, Set<string>>> {\n const grouped = new Map<string, Map<string, Set<string>>>();\n for (const encoded of overrides) {\n const parsed = parseOverride(encoded);\n if (!parsed) {\n continue;\n }\n let byComponent = grouped.get(parsed.nodeId);\n if (!byComponent) {\n byComponent = new Map();\n grouped.set(parsed.nodeId, byComponent);\n }\n let paths = byComponent.get(parsed.componentName);\n if (!paths) {\n paths = new Set();\n byComponent.set(parsed.componentName, paths);\n }\n paths.add(parsed.path);\n }\n return grouped;\n}\n\nconst isPrimitive = (value: unknown): boolean =>\n value === null || typeof value !== \"object\";\n\n/**\n * Collect leaf paths where two canonical values differ. Semantics:\n * - `{$node}` refs compare atomically by nodeId\n * - arrays of differing length are ONE atomic override (the array path);\n * equal lengths recurse per index\n * - object key present on one side only marks that key's path\n * - type mismatches mark the current path\n * An empty-string path means the values differ at the top level.\n */\nexport function collectDiffPaths(\n base: unknown,\n current: unknown,\n prefix = \"\",\n out: string[] = [],\n): string[] {\n if (isNodeRef(base) || isNodeRef(current)) {\n const same =\n isNodeRef(base) && isNodeRef(current) && base.$node === current.$node;\n if (!same) {\n out.push(prefix);\n }\n return out;\n }\n\n if (isPrimitive(base) || isPrimitive(current)) {\n if (base !== current) {\n out.push(prefix);\n }\n return out;\n }\n\n const baseIsArray = Array.isArray(base);\n const currentIsArray = Array.isArray(current);\n if (baseIsArray !== currentIsArray) {\n out.push(prefix);\n return out;\n }\n\n if (baseIsArray && currentIsArray) {\n if (base.length !== current.length) {\n out.push(prefix);\n return out;\n }\n base.forEach((item, index) => {\n collectDiffPaths(\n item,\n current[index],\n prefix ? `${prefix}/${index}` : String(index),\n out,\n );\n });\n return out;\n }\n\n const baseRecord = base as Rec;\n const currentRecord = current as Rec;\n const keys = new Set([\n ...Object.keys(baseRecord),\n ...Object.keys(currentRecord),\n ]);\n for (const key of keys) {\n const childPrefix = prefix ? `${prefix}/${key}` : key;\n if (!(key in baseRecord) || !(key in currentRecord)) {\n out.push(childPrefix);\n continue;\n }\n collectDiffPaths(baseRecord[key], currentRecord[key], childPrefix, out);\n }\n return out;\n}\n\n/**\n * Diff a live instance subtree against its prefab base (both as serialized\n * subtree snapshots carrying PrefabNode identity) and return the encoded\n * override list: every path where the instance deviates from the base.\n *\n * Identity is nodeKey-scoped ({@link buildNodeKeyMapsFromSnapshot}), so\n * nested instance regions diff correctly; for nested-free documents the\n * keys degenerate to bare nodeIds (v1 behavior unchanged).\n *\n * Policies: components missing on the instance produce no override (apply\n * re-adds them); components/nodes only on the instance are local additions\n * and produce no override — EXCEPT when `emitAdditionMarkers` is set\n * (file-space callers), which records `\"<key>|+node|\"` for instance nodes\n * absent from the base so pure-JSON patching never deletes host-authored\n * nodes inside nested regions.\n */\nexport function computeInstanceOverrides(\n baseSnapshot: SubtreeSnapshot,\n instanceSnapshot: SubtreeSnapshot,\n options?: { emitAdditionMarkers?: boolean },\n): string[] {\n const baseMaps = buildNodeKeyMapsFromSnapshot(baseSnapshot);\n const instanceMaps = buildNodeKeyMapsFromSnapshot(instanceSnapshot);\n const baseByEntity = indexSnapshotByEntity(baseSnapshot);\n const instanceByEntity = indexSnapshotByEntity(instanceSnapshot);\n\n const overrides: string[] = [];\n\n for (const [nodeKey, instanceEntityId] of instanceMaps.keyToId) {\n const baseEntityId = baseMaps.keyToId.get(nodeKey);\n if (baseEntityId === undefined) {\n // Node only exists on the instance — local addition.\n if (options?.emitAdditionMarkers) {\n overrides.push(\n encodeOverride(nodeKey, ADDED_NODE_MARKER_COMPONENT, \"\"),\n );\n }\n continue;\n }\n\n const baseComponents = baseByEntity.get(baseEntityId);\n const instanceComponents = instanceByEntity.get(instanceEntityId);\n if (!baseComponents) {\n continue;\n }\n\n // Root detection must use the BASE doc: the file root always has a null\n // ParentId, whereas an instance root carries its numeric scene parent.\n const isRoot = nodeKey === baseMaps.rootKey;\n\n for (const [componentName, baseRaw] of baseComponents) {\n if (OVERRIDE_DIFF_EXCLUDED_COMPONENTS.has(componentName)) {\n continue;\n }\n if (isRoot && OVERRIDE_ROOT_EXCLUDED_COMPONENTS.has(componentName)) {\n continue;\n }\n\n const instanceRaw = instanceComponents?.get(componentName);\n if (instanceRaw === undefined) {\n continue; // locally removed — apply re-adds, no override\n }\n\n const baseCanonical = canonicalizeComponentValue(\n componentName,\n baseRaw,\n baseMaps.idToKey,\n );\n const instanceCanonical = canonicalizeComponentValue(\n componentName,\n instanceRaw,\n instanceMaps.idToKey,\n );\n\n for (const path of collectDiffPaths(baseCanonical, instanceCanonical)) {\n overrides.push(encodeOverride(nodeKey, componentName, path));\n }\n }\n }\n\n return overrides;\n}\n\nconst PATH_TOKEN_SPLIT = \"/\";\n\nfunction getAtPath(value: unknown, tokens: string[]): unknown {\n let cursor: unknown = value;\n for (const token of tokens) {\n if (Array.isArray(cursor)) {\n cursor = cursor[Number(token)];\n } else {\n const record = asRecord(cursor);\n if (!record) {\n return undefined;\n }\n cursor = record[token];\n }\n if (cursor === undefined) {\n return undefined;\n }\n }\n return cursor;\n}\n\nfunction setAtPath(target: unknown, tokens: string[], value: unknown): void {\n let cursor: unknown = target;\n for (let i = 0; i < tokens.length - 1; i++) {\n const token = tokens[i];\n if (Array.isArray(cursor)) {\n cursor = cursor[Number(token)];\n } else {\n const record = asRecord(cursor);\n if (!record) {\n return; // container shape changed in the new file — skip gracefully\n }\n cursor = record[token];\n }\n if (cursor === null || typeof cursor !== \"object\") {\n return;\n }\n }\n\n const last = tokens[tokens.length - 1];\n if (Array.isArray(cursor)) {\n cursor[Number(last)] = value;\n } else {\n const record = asRecord(cursor);\n if (record) {\n if (value === undefined) {\n delete record[last];\n } else {\n record[last] = value;\n }\n }\n }\n}\n\n/**\n * Merge a component's NEW canonical file value with an instance's canonical\n * value, preserving the instance side at every overridden path. An empty\n * path (\"\") means the whole component is overridden → instance wins.\n */\nexport function mergeComponentValue(\n newFileCanonical: unknown,\n instanceCanonical: unknown,\n overridePaths: Set<string> | undefined,\n): unknown {\n if (!overridePaths || overridePaths.size === 0) {\n return clone(newFileCanonical);\n }\n if (overridePaths.has(\"\")) {\n return clone(instanceCanonical);\n }\n\n const merged = clone(newFileCanonical);\n for (const path of overridePaths) {\n const tokens = path.split(PATH_TOKEN_SPLIT);\n const instanceValue = getAtPath(instanceCanonical, tokens);\n setAtPath(merged, tokens, clone(instanceValue));\n }\n return merged;\n}\n","import { hydrateWorldFromSnapshotDetailed } from \"../hydration/hydrateWorld\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { findSnapshotRootEntityIds } from \"./overrides\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/**\n * Components a subtree snapshot must never inject into a live world —\n * scene singletons. Nested `PrefabInstance` links are kept (nested prefabs);\n * only an instance link ON THE SNAPSHOT ROOT is dropped (a file claiming to\n * be an instance of another prefab = variant, unsupported — defense in depth\n * for hand-edited files).\n */\nconst INSTANTIATE_EXCLUDED_COMPONENTS = new Set([\n \"Environment\",\n \"Postprocessing\",\n \"SelectionTransformState\",\n]);\n\nexport type InstantiateSubtreeResult = {\n /** Live entity id of the subtree root, or null when nothing hydrated. */\n rootId: EntityId | null;\n /** Snapshot entity id → live entity id. */\n idMap: Map<number, number>;\n};\n\n/**\n * Hydrate a self-contained subtree snapshot (a prefab file's `snapshot`)\n * into a LIVE world: fresh entity ids, internal references remapped, no\n * camera promotion, transform pass scoped to the created entities.\n */\nexport function instantiateSubtree(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n snapshot: SubtreeSnapshot,\n): InstantiateSubtreeResult {\n const snapshotRootIds = new Set(findSnapshotRootEntityIds(snapshot));\n const safeSnapshot: SubtreeSnapshot = {\n entities: snapshot.entities,\n components: snapshot.components\n .filter((block) => !INSTANTIATE_EXCLUDED_COMPONENTS.has(block.component))\n .map((block) =>\n block.component === \"PrefabInstance\"\n ? {\n component: block.component,\n entries: block.entries.filter(\n (entry) => !snapshotRootIds.has(entry.entityId),\n ),\n }\n : block,\n )\n .filter((block) => block.entries.length > 0),\n };\n\n const result = hydrateWorldFromSnapshotDetailed(\n safeSnapshot,\n world,\n objectManagementSystem,\n { assignPrimaryCamera: false, applyTransformsScope: \"created\" },\n );\n\n const rootSourceId = findSnapshotRootEntityIds(safeSnapshot).find(\n (sourceId) => result.idMap.has(sourceId),\n );\n\n return {\n rootId: rootSourceId !== undefined ? (result.idMap.get(rootSourceId) ?? null) : null,\n idMap: result.idMap,\n };\n}\n","import { findTopLevelNestedRegions } from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\nexport const PREFAB_FILE_VERSION = 1;\n/** Written for files containing NESTED instances (parse accepts either). */\nexport const PREFAB_FILE_VERSION_NESTED = 2;\n\n/** File version to write for a given snapshot: 2 iff it nests instances. */\nexport function prefabFileVersionFor(snapshot: SubtreeSnapshot): number {\n return findTopLevelNestedRegions(snapshot).length > 0\n ? PREFAB_FILE_VERSION_NESTED\n : PREFAB_FILE_VERSION;\n}\n\n/**\n * Envelope of a `.prefab` asset file (and, later, `.scene` assets — same\n * shape with `type: \"scene\"`). `snapshot` is the same columnar world-snapshot\n * format `hydrateWorldFromSnapshotDetailed` consumes, with entity ids\n * renumbered 1..N and every entity carrying a `PrefabNode` identity.\n */\nexport type PrefabAsset = {\n version: number;\n type?: \"prefab\" | \"scene\";\n name?: string;\n snapshot: SubtreeSnapshot;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/** Validate untrusted JSON into a `PrefabAsset`, or null when malformed. */\nexport function parsePrefabAsset(json: unknown): PrefabAsset | null {\n if (!isRecord(json)) {\n return null;\n }\n if (typeof json.version !== \"number\" || json.version < 1) {\n return null;\n }\n\n const snapshot = json.snapshot;\n if (!isRecord(snapshot)) {\n return null;\n }\n const entities = snapshot.entities;\n const components = snapshot.components;\n if (!Array.isArray(entities) || !Array.isArray(components)) {\n return null;\n }\n if (!entities.every((id) => typeof id === \"number\")) {\n return null;\n }\n if (\n !components.every(\n (block) =>\n isRecord(block) &&\n typeof block.component === \"string\" &&\n Array.isArray(block.entries),\n )\n ) {\n return null;\n }\n\n return {\n version: json.version,\n type: json.type === \"scene\" ? \"scene\" : \"prefab\",\n name: typeof json.name === \"string\" ? json.name : undefined,\n snapshot: snapshot as unknown as SubtreeSnapshot,\n };\n}\n","import { Object3DRef, PrefabInstance, TransformComponent } from \"../components\";\nimport { applyTransform } from \"../systems/ObjectManagementSystem\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { collectEntitySubtree } from \"./collectEntitySubtree\";\nimport { instantiateSubtree } from \"./instantiateSubtree\";\nimport { parsePrefabAsset, type PrefabAsset } from \"./types\";\n\ntype Vec3Like = { x?: number; y?: number; z?: number };\n\nlet prefabAssetUrlResolver: ((url: string) => string) | null = null;\n\n/**\n * Override how prefab asset URLs (the file URL itself AND every asset URL\n * stored inside prefab files) are resolved before fetching. Published/preview\n * runtimes register a resolver that maps the editor's `localasset://…/assets/x`\n * URLs to `./assets/x`; the editor leaves it unset (identity — the\n * `localasset://` protocol is fetchable there). Same pattern as\n * {@link setDracoDecoderPath}. Pass null to restore identity.\n */\nexport function setPrefabAssetUrlResolver(\n resolver: ((url: string) => string) | null,\n): void {\n prefabAssetUrlResolver = resolver;\n}\n\nconst resolveUrl = (url: string): string =>\n prefabAssetUrlResolver ? prefabAssetUrlResolver(url) : url;\n\n/** Deep-transform every string in a JSON value (arrays/objects walked). */\nfunction transformStringsDeep(value: unknown, fn: (s: string) => string): unknown {\n if (typeof value === \"string\") {\n return fn(value);\n }\n if (Array.isArray(value)) {\n return value.map((item) => transformStringsDeep(item, fn));\n }\n if (value !== null && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n result[key] = transformStringsDeep(item, fn);\n }\n return result;\n }\n return value;\n}\n\n/**\n * Prefab JSON cache: each URL is fetched and parsed once per session; every\n * spawn shares the parsed asset. Failed loads are evicted so a later spawn\n * can retry (same policy as the shared model cache).\n */\nconst prefabCache = new Map<string, Promise<PrefabAsset>>();\n\n/**\n * Fetch + parse (and cache) a `.prefab` asset. All strings inside the\n * snapshot are passed through the registered URL resolver, so asset\n * references load correctly in published/preview builds. Use this from\n * preloaders to warm the same cache `spawnPrefab` reads.\n */\nexport function loadPrefab(url: string): Promise<PrefabAsset> {\n const cached = prefabCache.get(url);\n if (cached) {\n return cached;\n }\n\n const pending = (async () => {\n const response = await fetch(resolveUrl(url));\n if (!response.ok) {\n throw new Error(`Failed to fetch prefab \"${url}\" (${response.status})`);\n }\n const json: unknown = await response.json();\n const parsed = parsePrefabAsset(json);\n if (!parsed) {\n throw new Error(`Invalid prefab file at \"${url}\"`);\n }\n return {\n ...parsed,\n snapshot: transformStringsDeep(\n parsed.snapshot,\n resolveUrl,\n ) as PrefabAsset[\"snapshot\"],\n };\n })();\n\n prefabCache.set(url, pending);\n pending.catch(() => {\n // Evict failed loads so future spawns can retry.\n if (prefabCache.get(url) === pending) {\n prefabCache.delete(url);\n }\n });\n\n return pending;\n}\n\n/** Drop one cached prefab (or all when no url is given). */\nexport function clearPrefabCache(url?: string): void {\n if (typeof url === \"string\") {\n prefabCache.delete(url);\n } else {\n prefabCache.clear();\n }\n}\n\nexport type SpawnPrefabSource =\n | string\n | { path: string; type?: string }\n | PrefabAsset;\n\nexport type SpawnPrefabOptions = {\n /** Parent the spawned root under this entity (default: world root). */\n parentId?: EntityId | null;\n /** Local-space spawn transform for the root (partial axes allowed). */\n position?: Vec3Like;\n rotation?: Vec3Like;\n scale?: Vec3Like;\n};\n\nfunction resolveSource(source: SpawnPrefabSource): {\n url: string;\n asset: Promise<PrefabAsset> | PrefabAsset;\n} {\n if (typeof source === \"string\") {\n return { url: source, asset: loadPrefab(source) };\n }\n if (\"path\" in source && typeof source.path === \"string\") {\n // AssetInput shape from script data: { path, type }.\n return { url: source.path, asset: loadPrefab(source.path) };\n }\n const asset = source as PrefabAsset;\n return { url: asset.name ?? \"\", asset };\n}\n\n/**\n * Instantiate a prefab into a live world at runtime.\n *\n * `source` may be a URL string, a script AssetInput (`{ path, type }`), or an\n * already-loaded {@link PrefabAsset}. Resolves with the root entity id once\n * all entities/components exist — heavyweight assets inside (models,\n * textures, audio) continue loading reactively through their systems, using\n * the shared model cache for repeat spawns.\n */\nexport async function spawnPrefab(\n world: World,\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n): Promise<EntityId> {\n const { url, asset } = resolveSource(source);\n const prefab = await asset;\n\n const objectManagementSystem = world.getObjectManagementSystem();\n const { rootId } = instantiateSubtree(\n world,\n objectManagementSystem,\n prefab.snapshot,\n );\n if (rootId === null) {\n throw new Error(\n `Prefab \"${url || prefab.name || \"unknown\"}\" contained no spawnable entities`,\n );\n }\n\n if (!world.getComponent(rootId, PrefabInstance)) {\n world.addComponent(rootId, new PrefabInstance(url, []));\n }\n\n if (options?.parentId !== undefined && options.parentId !== null) {\n objectManagementSystem.setParent(world, rootId, options.parentId, {\n preserveWorldTransform: false,\n });\n }\n\n const transform = world.getComponent(rootId, TransformComponent);\n if (transform && (options?.position || options?.rotation || options?.scale)) {\n const write = (target: { x: number; y: number; z: number }, src?: Vec3Like) => {\n if (!src) return;\n if (typeof src.x === \"number\") target.x = src.x;\n if (typeof src.y === \"number\") target.y = src.y;\n if (typeof src.z === \"number\") target.z = src.z;\n };\n write(transform.position, options.position);\n write(transform.rotation, options.rotation);\n write(transform.scale, options.scale);\n\n const object = world.getComponent(rootId, Object3DRef)?.object;\n if (object) {\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n }\n\n return rootId;\n}\n\n/**\n * Delete a spawned prefab instance: the root entity plus every descendant\n * (children first). Returns the number of entities removed. `dispose`\n * releases GPU resources not flagged as shared (safe with the model cache).\n */\nexport function despawnPrefab(\n world: World,\n rootId: EntityId,\n dispose = true,\n): number {\n const objectManagementSystem = world.getObjectManagementSystem();\n const subtree = collectEntitySubtree(world, [rootId]).reverse();\n\n let removed = 0;\n for (const entityId of subtree) {\n if (objectManagementSystem.deleteEntity(world, entityId, dispose)) {\n removed += 1;\n }\n }\n return removed;\n}\n","import type { World } from \"./World\";\nimport { Component } from \"./Component\";\nimport {\n despawnPrefab,\n spawnPrefab,\n type SpawnPrefabOptions,\n type SpawnPrefabSource,\n} from \"./prefab/spawnPrefab\";\nimport type { CustomEcsSystem } from \"./CustomEcsSystem\";\nimport type { ComponentClass } from \"./worldSnapshotUtils\";\nimport { Object3DRef, ParentId, TransformComponent } from \"./components\";\nimport type { ParentLookup, WorldEntityView } from \"./types\";\nimport type { XrHandPoseEventDetail } from \"./systems/XRHandPoseSystem\";\nimport type { XrCapabilities, XrInputState } from \"./xr/types\";\nimport type { ScriptObject } from \"./ScriptObject\";\nimport * as THREE from \"three\";\n\n/**\n * Base class for all user-authored scripts attached to an entity through a\n * `ScriptComponent`. Subclass `Behaviour` to drive per-frame logic on a single\n * entity with full access to the {@link World}, the entity's\n * {@link TransformComponent}, and its three.js {@link Object3DRef}.\n *\n * @remarks\n * Scripts are dispatched by `ScriptBehaviourSystem` once per frame in this\n * order: {@link Behaviour.init} (first frame only) → {@link Behaviour.onUpdate}.\n * Override {@link Behaviour.onUpdate} for per-frame logic — never override\n * {@link Behaviour.update}, which is the engine-managed entry point.\n *\n * **Editor vs runtime**: `Behaviour` subclasses run ONLY at preview/runtime —\n * they never execute in the editor. For a visual that must render and animate\n * inside the editor (custom shaders, procedural geometry, grass, anything the\n * object palette can't produce), use {@link ScriptObject} instead.\n *\n * The runtime recognizes a script by its **default export** plus the\n * inherited static marker `__reluBehaviourClass`. Do not override the marker.\n *\n * @example\n * ```ts\n * import { Behaviour, type Component } from \"@relu-interactives/spatial-ecs\";\n *\n *\n * export default class Spinner extends Behaviour {\n * data: {\n * speed: number;\n * axis: \"x\" | \"y\" | \"z\";\n * };\n *\n * init() {\n * this.data.speed ??= 1;\n * this.data.axis ??= \"y\";\n * }\n *\n * onUpdate() {\n * this.transform.rotation[this.data.axis] += this.data.speed * this.deltaTime;\n * }\n * }\n * ```\n *\n * @see {@link World}\n * @see {@link TransformComponent}\n * @see {@link Object3DRef}\n *\n * @category Scripting\n */\nexport class Behaviour implements CustomEcsSystem {\n /**\n * Static marker used by `ScriptBehaviourSystem` to detect `Behaviour`\n * subclasses across bundle-identity splits (esbuild may produce a second\n * copy of the package when scripts are bundled, breaking `instanceof`).\n * Inherited by every subclass via the prototype chain.\n *\n * @internal\n */\n static readonly __reluBehaviourClass = true as const;\n\n /**\n * Inspector-bound payload from the entity's `ScriptComponent`. Override the\n * type on subclasses with `declare data: MyDataShape` to get type safety\n * inside hooks. Saved with the project so values persist across reloads.\n */\n data: Component | Record<string, unknown> = {} as Component;\n\n /** Numeric id of the entity this script is attached to. */\n entityId: number;\n\n /** View of the owning entity (id + components) at construction time. */\n entity: WorldEntityView;\n\n /**\n * Live three.js object wrapper for the entity. May be `null` for entities\n * with no scene presence; helpers on this class return `null` in that case.\n */\n threeRef: Object3DRef;\n\n /**\n * The entity's {@link TransformComponent}. Mutating `position`, `rotation`,\n * or `scale` here is picked up the same frame by `TransformSyncSystem`.\n */\n transform: TransformComponent;\n\n /**\n * The owning {@link World}. Refreshed each frame in {@link Behaviour.update}.\n * Use it to query other entities or components.\n */\n world: World;\n\n /**\n * Seconds elapsed since the last frame. Set by the engine before each\n * {@link Behaviour.onUpdate}.\n */\n deltaTime: number = 0;\n\n /**\n * Engine-managed constructor. Hosts (`ScriptBehaviourSystem`) instantiate\n * subclasses with the owning world, the entity id, and the script's `data`\n * payload. User code should not call this directly.\n *\n * @param world - The owning ECS world.\n * @param entityId - The entity this script is bound to.\n * @param component - The `ScriptComponent.data` payload, or any object that\n * should be exposed to the script as `this.data`.\n */\n constructor(\n world: World,\n entityId: number,\n component: Component | Record<string, unknown>,\n ) {\n this.world = world;\n this.entityId = entityId;\n if (component) this.data = component;\n this.entity = this.getEntity()!;\n this.threeRef = this.getComponent(Object3DRef)!;\n this.transform = this.getComponent(TransformComponent)!;\n }\n\n /**\n * Engine-managed per-frame entry point. Refreshes {@link Behaviour.deltaTime}\n * and delegates to {@link Behaviour.onUpdate}.\n *\n * @remarks Do **not** override this method — override\n * {@link Behaviour.onUpdate} instead.\n *\n * @param world - The owning world (may differ from the constructor world\n * after hot reload).\n * @param deltaTime - Seconds since the last frame.\n */\n update(world: World, deltaTime: number): void {\n this.deltaTime = deltaTime;\n this.world = world;\n this.onUpdate();\n }\n\n /**\n * Optional cleanup hook invoked when the script is detached or the entity\n * is destroyed. Override to release timers, listeners, or other resources.\n *\n * @param world - The owning world at disposal time.\n */\n dispose?(world: World): void {\n // Default cleanup: no-op; override in subclasses if needed\n }\n\n /**\n * Instantiate a prefab asset into the world at runtime.\n *\n * `source` is typically an `AssetInput` field from this script's `data`\n * (drag a `.prefab` from the asset browser onto the field in the editor),\n * a URL string, or a pre-loaded `PrefabAsset`. Resolves with the new root\n * entity id.\n *\n * ```ts\n * data = { enemyPrefab: { path: \"\", type: \"prefab\" } };\n * async onUpdate() {\n * if (shouldSpawn) {\n * const id = await this.spawnPrefab(this.data.enemyPrefab, {\n * position: { x: 0, y: 0, z: -5 },\n * });\n * }\n * }\n * ```\n */\n spawnPrefab(\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n ): Promise<number> {\n return spawnPrefab(this.world, source, options);\n }\n\n /**\n * Remove a spawned prefab instance (the root entity and all descendants).\n * Returns the number of entities removed.\n */\n despawn(rootEntityId: number): number {\n return despawnPrefab(this.world, rootEntityId);\n }\n\n /**\n * Returns the entity's world-space position as a new `THREE.Vector3`, or\n * `null` if the entity has no scene presence.\n */\n getWorldPosition(): THREE.Vector3 | null {\n if (!this.threeRef) {\n return null;\n }\n\n const position = new THREE.Vector3();\n this.threeRef.object.getWorldPosition(position);\n\n return position;\n }\n\n /**\n * Returns the entity's forward direction in world space (the +Z axis of its\n * world matrix), or `null` if the entity has no scene presence.\n */\n getWorldDirection(): THREE.Vector3 | null {\n if (!this.threeRef) {\n return null;\n }\n\n const target = new THREE.Vector3();\n this.threeRef.object.getWorldDirection(target);\n\n return target;\n }\n\n /**\n * Returns a unit vector pointing from this entity toward the given world\n * position, or `null` if the entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n */\n directionTo(targetPosition: THREE.Vector3): THREE.Vector3 | null {\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return null;\n }\n\n return targetPosition.clone().sub(currentPosition).normalize();\n }\n\n /**\n * Returns the world-space distance from this entity to the given position,\n * or `null` if the entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n */\n distanceTo(targetPosition: THREE.Vector3): number | null {\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return null;\n }\n\n return currentPosition.distanceTo(targetPosition);\n }\n\n /**\n * Linearly interpolates the entity's position toward `targetPosition` and\n * writes the result back through {@link TransformComponent}. No-op if the\n * entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n * @param alpha - Interpolation factor in [0, 1]. Multiply by `deltaTime`\n * for frame-rate-independent smoothing.\n */\n lerpTo(targetPosition: THREE.Vector3, alpha: number): void {\n if (!this.threeRef) {\n return;\n }\n\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return;\n }\n\n const newPosition = currentPosition.lerp(targetPosition, alpha);\n this.transform.setPosition(newPosition);\n }\n\n /**\n * Spherically interpolates the entity's rotation toward `targetRotation`\n * and writes the result back through {@link TransformComponent}. No-op if\n * the entity has no scene presence.\n *\n * @param targetRotation - Destination orientation as a quaternion.\n * @param alpha - Interpolation factor in [0, 1].\n */\n slerpTo(targetRotation: THREE.Quaternion, alpha: number): void {\n if (!this.threeRef) {\n return;\n }\n\n const rotation = new THREE.Quaternion();\n\n this.threeRef.object.getWorldQuaternion(rotation);\n rotation.slerp(targetRotation, alpha);\n this.transform.setRotation(rotation);\n }\n\n /**\n * Rotates the entity to face `targetPosition` in world space and writes the\n * resulting orientation back through {@link TransformComponent}. No-op if\n * the entity has no scene presence.\n *\n * @param targetPosition - Point in world space to face.\n */\n lookAt(targetPosition: THREE.Vector3): void {\n if (!this.threeRef) {\n return;\n }\n\n const clone = this.threeRef.object.clone();\n\n const rotation = new THREE.Quaternion();\n clone.lookAt(targetPosition);\n clone.getWorldQuaternion(rotation);\n this.transform.setRotation(rotation);\n }\n\n /** Returns every component currently attached to this entity. */\n getComponents(): Component[] {\n return this.world.getEntityById(this.entityId)?.components ?? [];\n }\n\n /**\n * Returns the entity's component of the given class, or `null` if it has\n * no such component.\n *\n * @typeParam T - Concrete component type.\n * @param componentClass - Component class constructor to look up.\n *\n * @example\n * ```ts\n * const mesh = this.getComponent(MeshComponent);\n * if (mesh) console.log(mesh.geometryRef);\n * ```\n */\n getComponent<T extends Component>(\n componentClass: ComponentClass<T>,\n ): T | null {\n return this.world.getComponent(this.entityId, componentClass) ?? null;\n }\n\n /**\n * Returns the latest {@link WorldEntityView} snapshot for this entity, or\n * `null` if it was destroyed.\n */\n getEntity(): WorldEntityView | null {\n return this.world.getEntityById(this.entityId);\n }\n\n /**\n * Resolves the entity's parent from the {@link ParentId} component, if any.\n *\n * @returns A {@link ParentLookup} with the parent component reference and\n * the parent entity view (or `null` if the entity is at the root).\n */\n getParent(): ParentLookup {\n const parentIdComponent = this.getComponent(ParentId);\n const parentEntityId = parentIdComponent?.value ?? null;\n\n if (parentEntityId === null) {\n return {\n parentIdComponent,\n parent: null,\n };\n }\n\n return {\n parentIdComponent,\n parent: this.world.getEntityById(parentEntityId),\n };\n }\n\n /**\n * Returns every direct child entity of this one (entities whose\n * {@link ParentId} matches `entityId`).\n */\n getChildren(): WorldEntityView[] {\n return this.world.getAllEntities().filter((entity) => {\n const parentIdComponent = entity.components.find(\n (component) => component instanceof ParentId,\n ) as ParentId | undefined;\n\n return parentIdComponent?.value === this.entityId;\n });\n }\n\n /**\n * Called once before the first {@link Behaviour.onUpdate}. Override to\n * default and validate {@link Behaviour.data}, cache references, or set\n * initial state. Runs at preview/runtime only — never in the editor.\n */\n protected init(): void {\n // Override in subclasses to implement custom startup logic\n }\n\n /**\n * Called every frame while the script is enabled. Override with the\n * script's main per-frame logic. Runs at preview/runtime only — never in the\n * editor (use {@link ScriptObject} for editor-visible visuals).\n */\n protected onUpdate(): void {\n // Override in subclasses to implement custom behaviour\n }\n\n /** Called when the editor selects this entity. Optional UX hook. */\n onSelect(): void {\n // Override in subclasses to implement custom logic when this behaviour's entity is selected\n }\n\n /** Called when the editor deselects this entity. Optional UX hook. */\n onDeselect(): void {\n // Override in subclasses to implement custom logic when this behaviour's entity is deselected\n }\n\n /**\n * Called when an image-tracking target this entity depends on becomes\n * visible. Optional AR hook.\n *\n * @param target - The newly-visible target entity view.\n */\n onTargetFound(target: WorldEntityView): void {\n // Override in subclasses to implement custom logic when a target is found\n }\n\n /**\n * Called when an image-tracking target this entity depends on is lost.\n * Optional AR hook.\n *\n * @param target - The target entity view that became invisible.\n */\n onTargetLost(target: WorldEntityView): void {\n // Override in subclasses to implement custom logic when a target is lost\n }\n\n // ─── WebXR (VR / MR) hooks ────────────────────────────────────────────────\n // Dispatched by XRSessionSystem / XRInteractionSystem, following the same\n // pattern as the AR hooks above: public no-op methods that subclasses opt\n // into by overriding. They never fire outside an immersive session.\n\n /**\n * Called once when an immersive session starts. Optional XR hook.\n *\n * Use it to set up XR-only state. Inspect `capabilities` rather than guessing\n * by device: feature support differs sharply per headset (for example Vision\n * Pro grants no passthrough on the web today).\n *\n * @param capabilities - What the session actually granted, read from\n * `XRSession.enabledFeatures`.\n */\n onXRSessionStart(capabilities: XrCapabilities): void {\n // Override in subclasses to react to entering VR/MR\n }\n\n /** Called once when the immersive session ends. Optional XR hook. */\n onXRSessionEnd(): void {\n // Override in subclasses to tear down XR-only state\n }\n\n /**\n * Called when a primary action begins — controller trigger, hand pinch, or\n * Vision Pro gaze-pinch. Optional XR hook.\n *\n * @param input - Normalized state for the source that acted.\n */\n onSelectStart(input: XrInputState): void {\n // Override in subclasses to react to a primary action press\n }\n\n /** Called when the primary action ends. Optional XR hook. */\n onSelectEnd(input: XrInputState): void {\n // Override in subclasses to react to a primary action release\n }\n\n /**\n * Called when this entity is grabbed. Optional XR hook.\n *\n * Only fires for entities carrying an enabled, grabbable\n * `XRInteractableComponent`.\n *\n * @param input - The source doing the grabbing.\n */\n /**\n * A SECOND hand joined a two-hand grab on this entity.\n *\n * The first hand anchors the object and keeps holding it; this fires for the\n * hand that came second — the foregrip on a rifle, say.\n */\n onSecondaryGrab(_input: XrInputState): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** The second hand let go, leaving the object in the first hand alone. */\n onSecondaryRelease(_input: XrInputState): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /**\n * A hand pose declared on this entity started being held.\n *\n * Fires once the pose has been sustained for its hold time, not the instant\n * the fingers pass through it.\n */\n onHandPoseStart(_event: XrHandPoseEventDetail): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A held hand pose ended, or its hand stopped being tracked. */\n onHandPoseEnd(_event: XrHandPoseEventDetail): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n onGrab(input: XrInputState): void {\n // Override in subclasses to react to being picked up\n }\n\n /** Called when this entity is released. Optional XR hook. */\n onRelease(input: XrInputState): void {\n // Override in subclasses to react to being dropped\n }\n}\n","import type { Component } from \"../Component\";\nimport type { World } from \"../World\";\n\n/**\n * Shared infrastructure for the script-hosting systems (`ScriptBehaviourSystem`\n * and `ScriptObjectSystem`): module loading, class resolution, data-envelope\n * merge/resolve/serialize. Extracted verbatim from `ScriptBehaviourSystem` so\n * both systems stay behaviourally identical for the parts they share.\n */\n\n/** Resolves a script URL to its ES module namespace. */\nexport type ModuleLoader = (\n scriptUrl: string,\n) => Promise<Record<string, unknown>>;\n\n/** Default loader — a plain dynamic import (used outside the editor/runtime). */\nexport async function defaultModuleLoader(\n scriptUrl: string,\n): Promise<Record<string, unknown>> {\n return (await import(/* webpackIgnore: true */ scriptUrl)) as Record<\n string,\n unknown\n >;\n}\n\n/** Strip local paths / localasset hosts from an error before surfacing it. */\nexport function toErrorMessage(error: unknown): string {\n const sanitize = (value: string): string =>\n value\n .replace(/localasset:\\/\\/[^/]+\\//g, \"localasset://\")\n .replace(/\\/Users\\/[^\\s)]+/g, \"[local path]\");\n\n if (error instanceof Error && error.message) {\n return sanitize(error.message);\n }\n if (typeof error === \"string\" && error) {\n return sanitize(error);\n }\n return \"Unknown script error.\";\n}\n\n/**\n * Resolve a script class from a loaded module: named export → `default` →\n * static marker fallback. The `instanceof baseClass` check can fail when a\n * bundler ships a second copy of the package into the script blob (identity\n * split); the inherited static marker (e.g. `__reluScriptObjectClass`) survives\n * that, so it's the fallback.\n */\nexport function resolveScriptCtor<TCtor extends abstract new (...args: never) => unknown>(\n moduleValue: Record<string, unknown>,\n className: string,\n options: { baseClass: Function; markerKey: string },\n): TCtor | null {\n const named = moduleValue[className];\n const fallback = moduleValue.default;\n const candidate =\n typeof named === \"function\"\n ? named\n : typeof fallback === \"function\"\n ? fallback\n : null;\n\n if (!candidate) {\n return null;\n }\n\n if (!(candidate.prototype instanceof options.baseClass)) {\n const marker = (candidate as unknown as Record<string, unknown>)[\n options.markerKey\n ];\n if (!marker) {\n return null;\n }\n }\n\n return candidate as unknown as TCtor;\n}\n\nexport function normalizeScriptData(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeValueByDefaultShape(\n defaultValue: unknown,\n currentValue: unknown,\n): unknown {\n if (Array.isArray(defaultValue)) {\n return Array.isArray(currentValue) ? currentValue : defaultValue;\n }\n\n if (isPlainObject(defaultValue)) {\n if (!isPlainObject(currentValue)) {\n return defaultValue;\n }\n\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(defaultValue)) {\n next[key] = mergeValueByDefaultShape(defaultValue[key], currentValue[key]);\n }\n return next;\n }\n\n if (typeof defaultValue === \"number\") {\n return typeof currentValue === \"number\" ? currentValue : defaultValue;\n }\n if (typeof defaultValue === \"string\") {\n return typeof currentValue === \"string\" ? currentValue : defaultValue;\n }\n if (typeof defaultValue === \"boolean\") {\n return typeof currentValue === \"boolean\" ? currentValue : defaultValue;\n }\n if (defaultValue === null) {\n return currentValue !== undefined ? currentValue : null;\n }\n\n return typeof currentValue === \"undefined\" ? defaultValue : currentValue;\n}\n\n/** Merge persisted `current` data over the script's `defaults`, shape-aware. */\nexport function mergeDataByCurrentDefaults(\n defaults: Record<string, unknown>,\n current: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(defaults)) {\n next[key] = mergeValueByDefaultShape(defaults[key], current[key]);\n }\n return next;\n}\n\nfunction isRawEntityInput(\n value: unknown,\n): value is { type: string; value: number | null } {\n if (!isPlainObject(value)) return false;\n return (value as Record<string, unknown>).type === \"entity\";\n}\n\nfunction isRawComponentInput(value: unknown): boolean {\n if (!isPlainObject(value)) return false;\n return (value as Record<string, unknown>).type === \"component\";\n}\n\nfunction findComponentByKind(\n components: Component[],\n componentKind: string,\n): Component | null {\n return (\n components.find(\n (c) =>\n c.constructor.name === `${componentKind}Component` ||\n c.constructor.name === componentKind,\n ) ?? null\n );\n}\n\n/** Replace raw EntityInput/ComponentInput envelopes with live views for the script. */\nexport function resolveInputData(\n world: World,\n rawData: Record<string, unknown>,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = { ...rawData };\n for (const [key, value] of Object.entries(rawData)) {\n if (isRawEntityInput(value)) {\n const entityId = (value as { type: string; value: number | null }).value;\n const entityView =\n typeof entityId === \"number\" ? world.getEntityById(entityId) : null;\n resolved[key] = { ...(value as object), value: entityView };\n } else if (isRawComponentInput(value)) {\n const ref = (value as Record<string, unknown>).value;\n if (\n isPlainObject(ref) &&\n typeof (ref as Record<string, unknown>).entityId === \"number\" &&\n typeof (ref as Record<string, unknown>).componentKind === \"string\"\n ) {\n const { entityId: refEntityId, componentKind } = ref as {\n entityId: number;\n componentKind: string;\n };\n const entityView = world.getEntityById(refEntityId);\n const component = entityView\n ? findComponentByKind(entityView.components, componentKind)\n : null;\n resolved[key] = { ...(value as object), value: component };\n }\n }\n }\n return resolved;\n}\n\n/** Re-serialize instance data for storage, preserving raw entity/component refs. */\nexport function serializeDataForStorage(\n rawData: Record<string, unknown>,\n instanceData: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...instanceData };\n for (const [key, rawValue] of Object.entries(rawData)) {\n if (isRawEntityInput(rawValue) || isRawComponentInput(rawValue)) {\n result[key] = rawValue;\n }\n }\n return result;\n}\n","import * as THREE from \"three\";\nimport { Behaviour } from \"../Behaviour\";\nimport type { Component } from \"../Component\";\nimport { ScriptComponent } from \"../components\";\nimport type { ScriptEntry } from \"../components/ScriptComponent\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport {\n defaultModuleLoader,\n mergeDataByCurrentDefaults,\n type ModuleLoader,\n normalizeScriptData,\n resolveInputData,\n resolveScriptCtor,\n serializeDataForStorage,\n toErrorMessage,\n} from \"./scriptShared\";\n\ntype BehaviourCtor = new (\n world: World,\n entityId: number,\n component: Component | Record<string, unknown>,\n) => Behaviour;\n\ntype ActiveScript = {\n entityId: number;\n scriptComponent: ScriptComponent;\n entryIndex: number;\n scriptEntry: ScriptEntry;\n};\n\ntype ScriptInstanceRecord = {\n entityId: number;\n scriptUrl: string;\n className: string;\n entryIndex: number;\n behaviour: Behaviour;\n rawData: Record<string, unknown>;\n};\n\nfunction buildInstanceKey(entityId: number, scriptUrl: string, className: string): string {\n return `${entityId}:${scriptUrl}:${className}`;\n}\n\n/** Thin wrapper over the shared resolver, pinned to the Behaviour base class. */\nfunction resolveBehaviourCtor(\n moduleValue: Record<string, unknown>,\n className: string,\n): BehaviourCtor | null {\n return resolveScriptCtor<BehaviourCtor>(moduleValue, className, {\n baseClass: Behaviour,\n markerKey: \"__reluBehaviourClass\",\n });\n}\n\nfunction normalizeEntry(\n value: Partial<ScriptEntry> | undefined,\n fallbackEntityId: number,\n): ScriptEntry {\n return {\n entityId: typeof value?.entityId === \"number\" ? value.entityId : fallbackEntityId,\n className: typeof value?.className === \"string\" ? value.className : \"\",\n scriptUrl: typeof value?.scriptUrl === \"string\" ? value.scriptUrl : \"\",\n enabled: typeof value?.enabled === \"boolean\" ? value.enabled : true,\n data: normalizeScriptData(value?.data),\n runtimeState:\n value?.runtimeState === \"idle\" ||\n value?.runtimeState === \"loading\" ||\n value?.runtimeState === \"ready\" ||\n value?.runtimeState === \"error\"\n ? value.runtimeState\n : undefined,\n runtimeMessage: typeof value?.runtimeMessage === \"string\" ? value.runtimeMessage : undefined,\n };\n}\n\nfunction readScriptEntries(component: ScriptComponent, entityId: number): ScriptEntry[] {\n if (Array.isArray(component.entries) && component.entries.length > 0) {\n return component.entries\n .map((entry) => normalizeEntry(entry as Partial<ScriptEntry>, entityId))\n .filter((entry) => entry.className || entry.scriptUrl);\n }\n\n return [];\n}\n\nfunction writeScriptEntries(component: ScriptComponent, entries: ScriptEntry[]): void {\n const normalized = entries.map((entry) => normalizeEntry(entry, entry.entityId));\n component.entries = normalized;\n\n const active = normalized[0];\n if (!active) {\n component.scriptInstance = null;\n }\n}\n\n\n/**\n * Optional context that enables raycast-based onSelect / onDeselect dispatch.\n * When provided, pointer/touch taps on the canvas fire a raycast against the\n * scene. If the hit object (or any ancestor) carries userData.entityId, every\n * Behaviour instance for that entity receives onSelect(); the previously\n * selected entity's instances receive onDeselect().\n */\nexport type SelectionContext = {\n camera: THREE.Camera;\n scene: THREE.Scene;\n domElement: HTMLElement;\n};\n\nexport class ScriptBehaviourSystem implements EcsSystem {\n private instances = new Map<string, ScriptInstanceRecord>();\n private loading = new Map<string, Promise<void>>();\n private readonly moduleLoader: ModuleLoader;\n\n // Raycast-based onSelect / onDeselect support\n private readonly selectionCtx: SelectionContext | null;\n private readonly raycaster: THREE.Raycaster;\n private readonly ndcPointer: THREE.Vector2;\n private selectedEntityId: number | null = null;\n // undefined = nothing queued; null = queued \"deselect all\"; number = queued entity\n private pendingEntityId: number | null | undefined = undefined;\n private pointerDownPos: { x: number; y: number } | null = null;\n private static readonly CLICK_THRESHOLD = 6;\n\n constructor(moduleLoader?: ModuleLoader, selectionContext?: SelectionContext) {\n this.moduleLoader = moduleLoader ?? defaultModuleLoader;\n this.selectionCtx = selectionContext ?? null;\n this.raycaster = new THREE.Raycaster();\n this.ndcPointer = new THREE.Vector2();\n if (this.selectionCtx) {\n this.selectionCtx.domElement.addEventListener(\"pointerdown\", this.onPointerDown);\n this.selectionCtx.domElement.addEventListener(\"pointerup\", this.onPointerUp);\n }\n }\n\n // ── Raycast selection helpers ──────────────────────────────────────────────\n\n /** Walk up the object hierarchy to find the nearest userData.entityId. */\n private resolveEntityId(object: THREE.Object3D): number | null {\n let current: THREE.Object3D | null = object;\n while (current) {\n const id = current.userData?.entityId;\n if (typeof id === \"number\") return id;\n current = current.parent;\n }\n return null;\n }\n\n /** Convert client (screen) coordinates to normalised device coordinates. */\n private toNdc(clientX: number, clientY: number): void {\n if (!this.selectionCtx) return;\n const rect = this.selectionCtx.domElement.getBoundingClientRect();\n this.ndcPointer.x = ((clientX - rect.left) / rect.width) * 2 - 1;\n this.ndcPointer.y = -((clientY - rect.top) / rect.height) * 2 + 1;\n }\n\n /** Fire raycast and queue the result to be dispatched in the next update(). */\n private queueRaycast(clientX: number, clientY: number): void {\n if (!this.selectionCtx) return;\n this.toNdc(clientX, clientY);\n this.raycaster.setFromCamera(this.ndcPointer, this.selectionCtx.camera);\n const hits = this.raycaster.intersectObjects(this.selectionCtx.scene.children, true);\n for (const hit of hits) {\n // Skip editor-only helpers (grid, transform gizmo, etc.)\n if (hit.object.userData?.ecsPreviewHidden) continue;\n const entityId = this.resolveEntityId(hit.object);\n if (entityId !== null) {\n this.pendingEntityId = entityId;\n return;\n }\n }\n // Clicked empty space → queue deselect\n this.pendingEntityId = null;\n }\n\n private onPointerDown = (event: PointerEvent): void => {\n this.pointerDownPos = { x: event.clientX, y: event.clientY };\n };\n\n private onPointerUp = (event: PointerEvent): void => {\n if (!this.pointerDownPos) return;\n const dx = event.clientX - this.pointerDownPos.x;\n const dy = event.clientY - this.pointerDownPos.y;\n this.pointerDownPos = null;\n // Ignore drag gestures — only fire for taps / clicks\n if (Math.sqrt(dx * dx + dy * dy) > ScriptBehaviourSystem.CLICK_THRESHOLD) return;\n this.queueRaycast(event.clientX, event.clientY);\n };\n\n /**\n * Apply a queued selection change.\n * Calls onDeselect() on all behaviours of the previous entity and\n * onSelect() on all behaviours of the newly selected entity.\n */\n private applySelection(nextEntityId: number | null): void {\n if (nextEntityId === this.selectedEntityId) return;\n const prevEntityId = this.selectedEntityId;\n this.selectedEntityId = nextEntityId;\n\n if (prevEntityId !== null) {\n for (const record of this.instances.values()) {\n if (record.entityId === prevEntityId) {\n try {\n record.behaviour.onDeselect();\n } catch {}\n }\n }\n }\n\n if (nextEntityId !== null) {\n for (const record of this.instances.values()) {\n if (record.entityId === nextEntityId) {\n try {\n record.behaviour.onSelect();\n } catch {}\n }\n }\n }\n }\n\n // ── ECS lifecycle ──────────────────────────────────────────────────────────\n\n update(world: World, deltaTime: number): void {\n // Dispatch any queued raycast selection before running behaviour updates\n if (this.pendingEntityId !== undefined) {\n const next = this.pendingEntityId;\n this.pendingEntityId = undefined;\n this.applySelection(next);\n }\n\n const active = new Map<string, ActiveScript>();\n const entityIds = world.query(ScriptComponent);\n\n for (const entityId of entityIds) {\n const scriptComponent = world.getComponent(entityId, ScriptComponent);\n if (!scriptComponent) {\n continue;\n }\n\n const entries = readScriptEntries(scriptComponent, entityId);\n if (entries.length === 0) {\n scriptComponent.scriptInstance = null;\n continue;\n }\n\n const nextEntries = [...entries];\n let hasEnabledScript = false;\n\n for (let entryIndex = 0; entryIndex < nextEntries.length; entryIndex += 1) {\n const entry = nextEntries[entryIndex];\n // Behaviours never run in the editor — they are preview/runtime only.\n // (For visuals that must render in the editor, use ScriptObject.)\n const skipInEditor = world.isEditorMode();\n if (!entry.enabled || !entry.scriptUrl || skipInEditor) {\n nextEntries[entryIndex] = {\n ...entry,\n runtimeState: \"idle\",\n runtimeMessage: undefined,\n };\n continue;\n }\n\n hasEnabledScript = true;\n const key = buildInstanceKey(entityId, entry.scriptUrl, entry.className);\n active.set(key, {\n entityId,\n scriptComponent,\n entryIndex,\n scriptEntry: entry,\n });\n }\n\n writeScriptEntries(scriptComponent, nextEntries);\n if (!hasEnabledScript) {\n scriptComponent.scriptInstance = null;\n }\n }\n\n for (const [key, record] of this.instances.entries()) {\n const script = active.get(key);\n if (!script) {\n const liveComponent = world.getComponent(record.entityId, ScriptComponent);\n if (liveComponent) {\n if (record.entryIndex === 0) {\n liveComponent.scriptInstance = null;\n }\n liveComponent.scriptInstances.delete(record.entryIndex);\n }\n\n record.behaviour.dispose?.(world);\n this.instances.delete(key);\n continue;\n }\n\n const entries = readScriptEntries(script.scriptComponent, script.entityId);\n const liveEntry = entries[script.entryIndex];\n if (!liveEntry) {\n record.behaviour.dispose?.(world);\n this.instances.delete(key);\n continue;\n }\n\n // Skip behaviour update for invisible entities. The instance is kept alive\n // so scripts resume immediately when the entity becomes visible again.\n if (!world.isEntityVisible(record.entityId)) {\n continue;\n }\n\n try {\n script.scriptComponent.scriptInstance =\n script.entryIndex === 0 ? record.behaviour : script.scriptComponent.scriptInstance;\n script.scriptComponent.scriptInstances.set(script.entryIndex, record.behaviour);\n\n entries[script.entryIndex] = {\n ...liveEntry,\n data: serializeDataForStorage(record.rawData, normalizeScriptData(record.behaviour.data)),\n };\n\n record.behaviour.update(world, deltaTime);\n\n entries[script.entryIndex] = {\n ...entries[script.entryIndex],\n data: serializeDataForStorage(record.rawData, normalizeScriptData(record.behaviour.data)),\n runtimeState: \"ready\",\n runtimeMessage: undefined,\n };\n writeScriptEntries(script.scriptComponent, entries);\n } catch (error) {\n entries[script.entryIndex] = {\n ...entries[script.entryIndex],\n runtimeState: \"error\",\n runtimeMessage: toErrorMessage(error),\n };\n writeScriptEntries(script.scriptComponent, entries);\n if (script.entryIndex === 0) {\n script.scriptComponent.scriptInstance = null;\n }\n record.behaviour.dispose?.(world);\n this.instances.delete(key);\n }\n }\n\n // If the selected entity no longer has any loaded behaviour instances,\n // clear the selection so stale state does not persist.\n if (this.selectedEntityId !== null) {\n let stillActive = false;\n for (const record of this.instances.values()) {\n if (record.entityId === this.selectedEntityId) {\n stillActive = true;\n break;\n }\n }\n if (!stillActive) {\n this.selectedEntityId = null;\n }\n }\n\n for (const [key, script] of active.entries()) {\n if (this.instances.has(key) || this.loading.has(key)) {\n continue;\n }\n\n const entries = readScriptEntries(script.scriptComponent, script.entityId);\n const targetEntry = entries[script.entryIndex];\n if (targetEntry) {\n entries[script.entryIndex] = {\n ...targetEntry,\n runtimeState: \"loading\",\n runtimeMessage: undefined,\n };\n writeScriptEntries(script.scriptComponent, entries);\n }\n\n const promise = this.loadBehaviour(world, script)\n .catch((error) => {\n const liveEntries = readScriptEntries(script.scriptComponent, script.entityId);\n const liveEntry = liveEntries[script.entryIndex];\n if (liveEntry) {\n liveEntries[script.entryIndex] = {\n ...liveEntry,\n runtimeState: \"error\",\n runtimeMessage: \"Failed to load script.\",\n };\n writeScriptEntries(script.scriptComponent, liveEntries);\n }\n if (script.entryIndex === 0) {\n script.scriptComponent.scriptInstance = null;\n }\n console.error(\n `[ScriptBehaviourSystem] Failed loading script ${script.scriptEntry.className}`,\n error,\n );\n })\n .finally(() => {\n this.loading.delete(key);\n });\n\n this.loading.set(key, promise);\n }\n\n for (const key of this.loading.keys()) {\n if (active.has(key)) {\n continue;\n }\n\n this.loading.delete(key);\n }\n }\n\n dispose(world: World): void {\n if (this.selectionCtx) {\n this.selectionCtx.domElement.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.selectionCtx.domElement.removeEventListener(\"pointerup\", this.onPointerUp);\n }\n\n for (const record of this.instances.values()) {\n const liveComponent = world.getComponent(record.entityId, ScriptComponent);\n if (liveComponent) {\n if (record.entryIndex === 0) {\n liveComponent.scriptInstance = null;\n }\n liveComponent.scriptInstances.delete(record.entryIndex);\n }\n\n record.behaviour.dispose?.(world);\n }\n\n this.instances.clear();\n this.loading.clear();\n }\n\n private async loadBehaviour(world: World, script: ActiveScript): Promise<void> {\n const { entityId, scriptComponent, entryIndex, scriptEntry } = script;\n const key = buildInstanceKey(\n entityId,\n scriptEntry.scriptUrl,\n scriptEntry.className,\n );\n\n const moduleValue = await this.moduleLoader(scriptEntry.scriptUrl);\n\n const ctor = resolveBehaviourCtor(moduleValue, scriptEntry.className);\n if (!ctor) {\n throw new Error(\n `Missing Behaviour export '${scriptEntry.className}' in ${scriptEntry.scriptUrl}`,\n );\n }\n\n if (!world.hasEntity(entityId)) {\n return;\n }\n\n const liveComponent = world.getComponent(entityId, ScriptComponent);\n\n if (!liveComponent) {\n return;\n }\n\n const liveEntries = readScriptEntries(liveComponent, entityId);\n const liveEntry = liveEntries[entryIndex];\n\n if (\n !liveEntry ||\n !liveEntry.enabled ||\n !liveEntry.scriptUrl ||\n liveEntry.scriptUrl !== scriptEntry.scriptUrl ||\n liveEntry.className !== scriptEntry.className\n ) {\n return;\n }\n\n const currentData = normalizeScriptData(liveEntry.data);\n\n let behaviour: Behaviour;\n try {\n // Prefer undefined so Behaviour does not preempt script class defaults.\n behaviour = new ctor(\n world,\n entityId,\n undefined as unknown as Record<string, unknown>,\n );\n } catch {\n // Fallback for scripts that require a component object in constructor.\n behaviour = new ctor(world, entityId, currentData);\n }\n\n const defaults = normalizeScriptData(behaviour.data);\n const mergedData = mergeDataByCurrentDefaults(defaults, currentData);\n const resolvedData = resolveInputData(world, mergedData);\n\n behaviour.data = resolvedData;\n\n // Behaviours never init in the editor (loads never start there anyway).\n if (!world.isEditorMode()) {\n (behaviour as unknown as { init(): void }).init();\n }\n\n liveEntries[entryIndex] = {\n ...liveEntry,\n data: mergedData,\n runtimeState: \"ready\",\n runtimeMessage: undefined,\n };\n writeScriptEntries(liveComponent, liveEntries);\n if (entryIndex === 0) {\n liveComponent.scriptInstance = behaviour;\n }\n liveComponent.scriptInstances.set(entryIndex, behaviour);\n this.instances.set(key, {\n entityId,\n scriptUrl: scriptEntry.scriptUrl,\n className: scriptEntry.className,\n entryIndex,\n behaviour,\n rawData: mergedData,\n });\n }\n}\n","import type * as THREE from \"three\";\nimport type { World } from \"./World\";\n\n/**\n * Base class for **script objects** — entities whose THREE.js visual is built\n * entirely by user code (procedural geometry, shaders, particle systems,\n * anything the editor can't author natively).\n *\n * The critical difference from {@link Behaviour}: a `ScriptObject` runs in the\n * **editor AND at runtime** — `build()` and `update()` execute identically in\n * both. `ScriptObjectSystem` loads the module, instantiates the class, calls\n * `build()` to get the visual, attaches it under the entity's Object3D, and\n * ticks `update()` every frame. **Do NOT gate anything on\n * `world.isEditorMode()`** — running everywhere is the whole point. Use\n * {@link Behaviour} for gameplay logic that must NOT run in the editor.\n *\n * Subclasses are resolved by the inherited static marker\n * `__reluScriptObjectClass` (survives bundler identity splits). Do not override\n * the marker.\n *\n * @example\n * ```ts\n * import { ScriptObject, type ColorInput } from \"@relu-interactives/spatial-ecs\";\n * import * as THREE from \"three\";\n *\n * export default class GlowOrb extends ScriptObject {\n * declare data: { color: ColorInput };\n * private mat!: THREE.MeshStandardMaterial;\n *\n * build(): THREE.Object3D {\n * this.data.color ??= { type: \"color\", value: \"#66ccff\" };\n * this.mat = new THREE.MeshStandardMaterial({\n * color: this.data.color.value,\n * emissive: this.data.color.value,\n * });\n * return new THREE.Mesh(new THREE.SphereGeometry(0.5, 32, 32), this.mat);\n * }\n *\n * update(dt: number): void {\n * this.mat.emissiveIntensity = 0.5 + 0.5 * Math.sin(performance.now() * 0.002);\n * }\n *\n * dispose(): void {\n * this.mat.dispose();\n * }\n * }\n * ```\n *\n * @category Scripting\n */\nexport class ScriptObject {\n /**\n * Static marker used by `ScriptObjectSystem` to detect `ScriptObject`\n * subclasses even when a bundler ships a second copy of the package into the\n * script blob (breaking `instanceof`). Do NOT override.\n */\n static readonly __reluScriptObjectClass = true as const;\n\n /**\n * The script's data payload (the `ScriptObjectComponent.data`). Declare a\n * concrete shape on subclasses with `declare data: MyShape` for type safety.\n * Use the same typed input envelopes as Behaviours (`ColorInput`,\n * `SliderInput`, `EntityInput`, …) to get inspector fields.\n */\n data: Record<string, unknown> = {};\n\n /** The owning ECS world. */\n world: World;\n\n /** The entity this script object is bound to. */\n entityId: number;\n\n /**\n * The Object3D returned by {@link ScriptObject.build}. Assigned by\n * `ScriptObjectSystem` after `build()` runs; `null` until then.\n */\n root: THREE.Object3D | null = null;\n\n /**\n * Engine-managed constructor. `ScriptObjectSystem` instantiates subclasses\n * with the owning world, the entity id, and the component's `data`. User code\n * should not call this directly.\n */\n constructor(world: World, entityId: number, data?: Record<string, unknown>) {\n this.world = world;\n this.entityId = entityId;\n if (data) this.data = data;\n }\n\n /**\n * REQUIRED — build and return the visual root. Called once by\n * `ScriptObjectSystem` after construction. The returned object is attached\n * under the entity's Object3D (so it inherits the entity transform, selection\n * and visibility). Subclasses MUST override.\n */\n build(): THREE.Object3D {\n throw new Error(\"ScriptObject subclasses must implement build()\");\n }\n\n /**\n * OPTIONAL — per-frame hook. Runs in the editor AND at runtime (e.g. advance\n * a shader time uniform, procedural animation). Keep per-frame work on local\n * THREE state / uniforms — do NOT write ECS components every frame (that\n * churns the editor's undo history).\n */\n update?(deltaTime: number): void;\n\n /**\n * OPTIONAL — free any GPU resources this script created (geometries,\n * materials, textures, render targets). Called by `ScriptObjectSystem` when\n * the object is removed, disabled, or reloaded. THREE `dispose()` is\n * idempotent, so double-dispose is safe.\n */\n dispose?(): void;\n}\n","import * as THREE from \"three\";\nimport { ScriptObject } from \"../ScriptObject\";\nimport { Object3DRef, ScriptObjectComponent } from \"../components\";\nimport type { EcsSystem } from \"../System\";\nimport { SHARED_MODEL_RESOURCE_FLAG } from \"../utils/modelCache\";\nimport type { World } from \"../World\";\nimport {\n defaultModuleLoader,\n mergeDataByCurrentDefaults,\n type ModuleLoader,\n normalizeScriptData,\n resolveInputData,\n resolveScriptCtor,\n serializeDataForStorage,\n toErrorMessage,\n} from \"./scriptShared\";\n\n/** Tags the Object3D a script's `build()` returned, so reloads can find/remove it. */\nexport const SCRIPT_OBJECT_ROOT_FLAG = \"__scriptObjectRoot\";\n\ntype ScriptObjectCtor = new (\n world: World,\n entityId: number,\n data?: Record<string, unknown>,\n) => ScriptObject;\n\ntype ScriptObjectRecord = {\n entityId: number;\n scriptUrl: string;\n className: string;\n /** \"error\" records are tombstones — kept so a broken script doesn't reload every frame. */\n status: \"ready\" | \"error\";\n instance: ScriptObject | null;\n root: THREE.Object3D | null;\n /** Serializable merged envelope last resolved. */\n rawData: Record<string, unknown>;\n /** Exact object last written to component.data — reference-equality dirty check. */\n lastWrittenData: Record<string, unknown> | null;\n};\n\nfunction setInstanceRef(component: ScriptObjectComponent, value: unknown): void {\n // Always via defineProperty: a history-restored clone (Object.create walk that\n // drops non-enumerable own props) would otherwise get an ENUMERABLE `instance`\n // that leaks into snapshots.\n Object.defineProperty(component, \"instance\", {\n value,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n}\n\n/** Remove a built subtree from the scene and free its GPU resources. */\nfunction disposeBuiltObject(root: THREE.Object3D): void {\n root.parent?.remove(root);\n root.traverse((node) => {\n const mesh = node as THREE.Mesh;\n const geometry = mesh.geometry as THREE.BufferGeometry | undefined;\n if (\n geometry?.dispose &&\n !geometry.userData?.[SHARED_MODEL_RESOURCE_FLAG]\n ) {\n geometry.dispose();\n }\n const material = mesh.material as\n | THREE.Material\n | THREE.Material[]\n | undefined;\n const materials = Array.isArray(material)\n ? material\n : material\n ? [material]\n : [];\n for (const mat of materials) {\n if (mat.userData?.[SHARED_MODEL_RESOURCE_FLAG]) continue;\n // Dispose textures the material references before the material itself.\n for (const value of Object.values(mat)) {\n if (value instanceof THREE.Texture) value.dispose();\n }\n mat.dispose?.();\n }\n });\n}\n\n/**\n * Builds, ticks, and disposes {@link ScriptObject} scripts. Unlike\n * `ScriptBehaviourSystem`, this runs in the editor AND at runtime — there is NO\n * `isEditorMode` gating anywhere here. A script's `build()` output is attached\n * under the entity's `Object3DRef.object` (so it inherits transform, selection\n * and visibility). `runtimeState` is written on transitions only (never every\n * frame).\n *\n * Construct it and pass it to `World.setup({ systems })`.\n *\n * @category Systems\n */\nexport class ScriptObjectSystem implements EcsSystem {\n private readonly moduleLoader: ModuleLoader;\n private instances = new Map<number, ScriptObjectRecord>();\n private loading = new Map<number, { key: string; promise: Promise<void> }>();\n /** Bumped by invalidate*() so in-flight loads that predate it are discarded. */\n private epoch = 0;\n\n constructor(moduleLoader?: ModuleLoader) {\n this.moduleLoader = moduleLoader ?? defaultModuleLoader;\n }\n\n update(world: World, deltaTime: number): void {\n const active = new Map<number, ScriptObjectComponent>();\n\n for (const entityId of world.query(ScriptObjectComponent)) {\n const component = world.getComponent(entityId, ScriptObjectComponent);\n if (!component) continue;\n\n const wantsRun =\n component.enabled &&\n typeof component.scriptUrl === \"string\" &&\n typeof component.className === \"string\";\n\n if (!wantsRun) {\n // Tear down any live/tombstone record + cancel loads; idle transition only.\n const record = this.instances.get(entityId);\n if (record) this.teardownRecord(world, entityId, record, false);\n this.loading.delete(entityId);\n if (component.runtimeState !== \"idle\") {\n component.runtimeState = \"idle\";\n component.runtimeMessage = undefined;\n }\n continue;\n }\n\n active.set(entityId, component);\n }\n\n // Sweep records whose entity/identity no longer matches.\n for (const [entityId, record] of this.instances) {\n const component = active.get(entityId);\n const identityChanged =\n !component ||\n record.scriptUrl !== component.scriptUrl ||\n record.className !== component.className;\n if (!world.hasEntity(entityId) || identityChanged) {\n this.teardownRecord(world, entityId, record, false);\n }\n }\n\n // Tick ready instances + sync inspector edits.\n for (const [entityId, component] of active) {\n const record = this.instances.get(entityId);\n if (!record || record.status !== \"ready\" || !record.instance) continue;\n if (!world.isEntityVisible(entityId)) continue;\n\n // Dirty-only data sync: the editor/undo installs a NEW object on any edit.\n if (component.data !== record.lastWrittenData) {\n try {\n const merged = mergeDataByCurrentDefaults(\n record.rawData,\n normalizeScriptData(component.data),\n );\n record.rawData = merged;\n record.instance.data = resolveInputData(world, merged);\n const stored = serializeDataForStorage(merged, merged);\n component.data = stored;\n record.lastWrittenData = stored;\n } catch (error) {\n this.markError(world, entityId, component, error);\n continue;\n }\n }\n\n try {\n record.instance.update?.(deltaTime);\n } catch (error) {\n this.markError(world, entityId, component, error);\n }\n }\n\n // Kick loads for active entries with no record and no in-flight load.\n for (const [entityId, component] of active) {\n if (this.instances.has(entityId) || this.loading.has(entityId)) continue;\n const scriptUrl = component.scriptUrl as string;\n const className = component.className as string;\n if (component.runtimeState !== \"loading\") {\n component.runtimeState = \"loading\";\n component.runtimeMessage = undefined;\n }\n const epochAtStart = this.epoch;\n const key = `${epochAtStart}:${scriptUrl}:${className}`;\n const promise = this.loadScriptObject(\n world,\n entityId,\n scriptUrl,\n className,\n key,\n epochAtStart,\n )\n .catch((error) => {\n this.markError(world, entityId, undefined, error);\n console.error(\n `[ScriptObjectSystem] Failed loading ${className} (${scriptUrl})`,\n error,\n );\n })\n .finally(() => {\n if (this.loading.get(entityId)?.key === key) {\n this.loading.delete(entityId);\n }\n });\n this.loading.set(entityId, { key, promise });\n }\n\n // Drop loading entries no longer active.\n for (const entityId of this.loading.keys()) {\n if (!active.has(entityId)) this.loading.delete(entityId);\n }\n }\n\n private async loadScriptObject(\n world: World,\n entityId: number,\n scriptUrl: string,\n className: string,\n key: string,\n epochAtStart: number,\n ): Promise<void> {\n const moduleValue = await this.moduleLoader(scriptUrl);\n\n // Staleness guards after the await.\n if (\n this.loading.get(entityId)?.key !== key ||\n epochAtStart !== this.epoch ||\n !world.hasEntity(entityId)\n ) {\n return;\n }\n const component = world.getComponent(entityId, ScriptObjectComponent);\n if (\n !component ||\n !component.enabled ||\n component.scriptUrl !== scriptUrl ||\n component.className !== className\n ) {\n return;\n }\n\n const ctor = resolveScriptCtor<ScriptObjectCtor>(moduleValue, className, {\n baseClass: ScriptObject,\n markerKey: \"__reluScriptObjectClass\",\n });\n if (!ctor) {\n throw new Error(\n `Missing ScriptObject export '${className}' in ${scriptUrl}`,\n );\n }\n\n const currentData = normalizeScriptData(component.data);\n let instance: ScriptObject;\n try {\n instance = new ctor(world, entityId, undefined);\n } catch {\n instance = new ctor(world, entityId, currentData);\n }\n\n // Defaults from the class's `data = { … }` literal (may carry envelope\n // metadata: sliders, dropdowns, entity/component/asset inputs). A\n // `declare data` class has no runtime initializer, so this is empty and the\n // field schema is discovered AFTER build() below.\n const literalDefaults = normalizeScriptData(instance.data);\n\n // Seed the instance with persisted values (merged over the literal) BEFORE\n // build() so a `this.data.x ??= default` inside build() fills only missing\n // keys and never clobbers a saved edit. For a `declare data` class the seed\n // is just the saved data — build() itself supplies the defaults.\n const seed =\n Object.keys(literalDefaults).length > 0\n ? mergeDataByCurrentDefaults(literalDefaults, currentData)\n : { ...currentData };\n instance.data = resolveInputData(world, seed);\n\n const parent = world.getComponent(entityId, Object3DRef)?.object;\n if (!parent) {\n throw new Error(\"Script object entity has no Object3D to attach to.\");\n }\n\n // Pre-attach sweep: remove any orphaned prior root (survived invalidate/undo).\n for (const child of [...parent.children]) {\n if (child.userData?.[SCRIPT_OBJECT_ROOT_FLAG]) {\n disposeBuiltObject(child);\n }\n }\n\n let built: THREE.Object3D;\n try {\n built = instance.build();\n } catch (error) {\n try {\n instance.dispose?.();\n } catch {\n // best-effort\n }\n throw error;\n }\n if (!built || (built as THREE.Object3D).isObject3D !== true) {\n try {\n instance.dispose?.();\n } catch {\n // best-effort\n }\n throw new Error(\"build() must return a THREE.Object3D.\");\n }\n\n built.userData[SCRIPT_OBJECT_ROOT_FLAG] = true;\n parent.add(built);\n instance.root = built;\n\n // Discover the final field schema. build() may have populated defaults on a\n // `declare data` class (`this.data.x ??= …`) that weren't visible at\n // construction; fold those in UNDER the literal defaults (which keep their\n // envelope shape) so the inspector renders every field the script uses.\n const postBuildData = normalizeScriptData(instance.data);\n const schemaDefaults: Record<string, unknown> = { ...literalDefaults };\n for (const [key, value] of Object.entries(postBuildData)) {\n if (!(key in schemaDefaults)) schemaDefaults[key] = value;\n }\n const merged = mergeDataByCurrentDefaults(schemaDefaults, currentData);\n instance.data = resolveInputData(world, merged);\n\n const stored = serializeDataForStorage(merged, merged);\n component.data = stored;\n component.runtimeState = \"ready\";\n component.runtimeMessage = undefined;\n setInstanceRef(component, instance);\n\n this.instances.set(entityId, {\n entityId,\n scriptUrl,\n className,\n status: \"ready\",\n instance,\n root: built,\n rawData: merged,\n lastWrittenData: stored,\n });\n }\n\n /** Dispose a record's instance + built subtree. `keepTombstone` leaves an error marker. */\n private teardownRecord(\n world: World,\n entityId: number,\n record: ScriptObjectRecord,\n keepTombstone: boolean,\n ): void {\n try {\n record.instance?.dispose?.();\n } catch {\n // best-effort\n }\n if (record.root) disposeBuiltObject(record.root);\n\n const component = world.getComponent(entityId, ScriptObjectComponent);\n if (component) setInstanceRef(component, null);\n\n if (keepTombstone) {\n this.instances.set(entityId, {\n ...record,\n status: \"error\",\n instance: null,\n root: null,\n });\n } else {\n this.instances.delete(entityId);\n }\n }\n\n private markError(\n world: World,\n entityId: number,\n component: ScriptObjectComponent | undefined,\n error: unknown,\n ): void {\n const comp =\n component ?? world.getComponent(entityId, ScriptObjectComponent) ?? null;\n if (comp) {\n comp.runtimeState = \"error\";\n comp.runtimeMessage = toErrorMessage(error);\n }\n const record = this.instances.get(entityId);\n if (record) {\n this.teardownRecord(world, entityId, record, true);\n } else {\n // Error before a record existed (load failure) — plant a tombstone so we\n // don't retry every frame until identity/enabled/invalidate changes.\n this.instances.set(entityId, {\n entityId,\n scriptUrl: comp?.scriptUrl ?? \"\",\n className: comp?.className ?? \"\",\n status: \"error\",\n instance: null,\n root: null,\n rawData: {},\n lastWrittenData: null,\n });\n }\n }\n\n /** Dispose all live instances so the next update() reloads with fresh modules. */\n invalidateAll(): void {\n this.epoch += 1;\n for (const [entityId, record] of [...this.instances]) {\n try {\n record.instance?.dispose?.();\n } catch {\n // best-effort\n }\n if (record.root) disposeBuiltObject(record.root);\n this.instances.delete(entityId);\n }\n this.loading.clear();\n }\n\n /** Invalidate only the entities whose script matches `scriptUrl`. */\n invalidate(scriptUrl: string): void {\n this.epoch += 1;\n for (const [entityId, record] of [...this.instances]) {\n if (record.scriptUrl !== scriptUrl) continue;\n try {\n record.instance?.dispose?.();\n } catch {\n // best-effort\n }\n if (record.root) disposeBuiltObject(record.root);\n this.instances.delete(entityId);\n }\n for (const [entityId, entry] of [...this.loading]) {\n if (entry.key.includes(`:${scriptUrl}:`)) this.loading.delete(entityId);\n }\n }\n\n dispose(world: World): void {\n for (const [entityId, record] of [...this.instances]) {\n this.teardownRecord(world, entityId, record, false);\n }\n this.instances.clear();\n this.loading.clear();\n }\n}\n","import { Object3DRef } from \"../components/Object3DRef\";\nimport { TransformComponent } from \"../components/Transform\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport { applyTransform } from \"./ObjectManagementSystem\";\n\nexport class TransformSyncSystem implements EcsSystem {\n update(world: World): void {\n const entities = world.query(TransformComponent, Object3DRef);\n\n // While an immersive session presents, three writes the headset pose onto\n // the render camera every frame. Writing the authored transform back over\n // it would fight the headset — move the XR rig (the camera's parent)\n // instead. See World.isXrPresenting().\n const xrCamera = world.isXrPresenting() ? world.getCamera() : null;\n\n for (const entityId of entities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n\n if (!transform || !object) {\n continue;\n }\n\n if (xrCamera !== null && object === xrCamera) {\n continue;\n }\n\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n }\n}\n","import * as THREE from \"three\";\n\nimport { AudioComponent } from \"../components/Audio\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\n/** Subset of `AudioComponent.options` that the system syncs to THREE.js every frame. */\ntype TrackedAudioOptions = {\n loop: boolean;\n pitch: number;\n volume: number;\n refDistance: number;\n distanceModel: string;\n rolloffFactor: number;\n};\n\nfunction snapshotOptions(opts: AudioComponent[\"options\"]): TrackedAudioOptions {\n return {\n loop: opts.loop,\n pitch: opts.pitch,\n volume: opts.volume,\n refDistance: opts.refDistance,\n distanceModel: opts.distanceModel,\n rolloffFactor: opts.rolloffFactor,\n };\n}\n\n/**\n * Reconciles `AudioComponent` state with the underlying THREE.js audio objects\n * each frame.\n *\n * **Playback** — drives `play()`, `pause()`, and `stop()` on the THREE.js\n * audio node based on the `isPlaying` / `isPaused` flags set by\n * `AudioComponent.play()`, `.pause()`, and `.stop()`.\n *\n * **Option sync** — detects changes to `loop`, `pitch`, `volume`,\n * `refDistance`, `distanceModel`, and `rolloffFactor` and applies them live.\n * Changes take effect on the next frame, so scripts and inspector edits during\n * runtime are reflected without reloading the scene.\n *\n * Only active in **preview** mode (`isEditor: true` makes every update a\n * no-op so the editor is unaffected).\n *\n * @category Systems\n */\nexport class AudioSystem implements EcsSystem {\n private readonly isEditor: boolean;\n /** THREE.js `isPlaying` state captured at the end of the previous frame. */\n private readonly prevPlayingState = new Map<number, boolean>();\n /** Snapshot of options applied in the previous frame, for change detection. */\n private readonly prevOptions = new Map<number, TrackedAudioOptions>();\n /** Tracks entities that were stopped due to invisibility. */\n private readonly stoppedDueToInvisibility = new Set<number>();\n\n constructor({ isEditor = false }: { isEditor?: boolean } = {}) {\n this.isEditor = isEditor;\n }\n\n update(world: World, _deltaTime: number): void {\n if (this.isEditor) return;\n\n const entities = world.query(AudioComponent);\n\n // Track which entities are still alive so we can prune stale map entries.\n const liveEntityIds = new Set(entities);\n\n for (const entityId of entities) {\n const component = world.getComponent(entityId, AudioComponent);\n if (!component?.audio) continue;\n\n const sound = component.audio;\n\n // Skip audio updates for invisible entities; stop any sound that is\n // currently playing so it does not continue while the entity is hidden.\n // Track that we stopped it so we can resume when visibility is restored.\n if (!world.isEntityVisible(entityId)) {\n if (sound.isPlaying) {\n sound.stop();\n this.stoppedDueToInvisibility.add(entityId);\n }\n continue;\n }\n\n // Entity is visible — if we previously stopped it due to invisibility,\n // resume playback now and clear the flag.\n if (this.stoppedDueToInvisibility.has(entityId)) {\n this.stoppedDueToInvisibility.delete(entityId);\n // If the component still wants to play, restart the audio.\n if (component.isPlaying && !sound.isPlaying && sound.buffer) {\n sound.play();\n }\n }\n\n // --- Option sync ---------------------------------------------------\n this._syncOptions(entityId, component, sound);\n\n // --- Playback reconciliation ----------------------------------------\n const prevWasPlaying = this.prevPlayingState.get(entityId) ?? false;\n\n // Detect natural audio end: THREE.js stopped on its own (e.g. a\n // non-looping clip finished) while the component still believes it is\n // playing. Skip this check if we stopped due to invisibility.\n if (\n prevWasPlaying &&\n !sound.isPlaying &&\n component.isPlaying &&\n !component.isPaused &&\n !this.stoppedDueToInvisibility.has(entityId)\n ) {\n component.isPlaying = false;\n }\n\n if (component.isPlaying && !sound.isPlaying) {\n // Wait for a buffer to be available; the system will retry each frame\n // until it is ready, so autoplay / programmatic play always fires.\n if (sound.buffer) {\n sound.play();\n }\n } else if (!component.isPlaying && sound.isPlaying) {\n if (component.isPaused) {\n sound.pause();\n } else {\n sound.stop();\n }\n }\n\n this.prevPlayingState.set(entityId, sound.isPlaying);\n }\n\n // Remove tracking entries for entities that no longer exist.\n for (const entityId of this.prevPlayingState.keys()) {\n if (!liveEntityIds.has(entityId)) {\n this.prevPlayingState.delete(entityId);\n this.prevOptions.delete(entityId);\n this.stoppedDueToInvisibility.delete(entityId);\n }\n }\n }\n\n /** Apply any changed options from the component to the THREE.js audio node. */\n private _syncOptions(\n entityId: number,\n component: AudioComponent,\n sound: THREE.Audio<GainNode> | THREE.PositionalAudio,\n ): void {\n const opts = component.options;\n const prev = this.prevOptions.get(entityId);\n\n if (!prev || prev.loop !== opts.loop) {\n sound.setLoop(opts.loop);\n }\n\n if (!prev || prev.pitch !== opts.pitch) {\n sound.setPlaybackRate(opts.pitch);\n }\n\n if (!prev || prev.volume !== opts.volume) {\n sound.setVolume(opts.volume);\n }\n\n // Positional-only properties — guarded by both the options flag and the\n // THREE.js class check so neither can cause a spurious call.\n if (opts.positional && sound instanceof THREE.PositionalAudio) {\n if (!prev || prev.refDistance !== opts.refDistance) {\n sound.setRefDistance(opts.refDistance);\n }\n\n if (!prev || prev.distanceModel !== opts.distanceModel) {\n sound.setDistanceModel(opts.distanceModel as DistanceModelType);\n }\n\n if (!prev || prev.rolloffFactor !== opts.rolloffFactor) {\n sound.setRolloffFactor(opts.rolloffFactor);\n }\n }\n\n this.prevOptions.set(entityId, snapshotOptions(opts));\n }\n\n dispose(_world: World): void {\n this.prevPlayingState.clear();\n this.prevOptions.clear();\n this.stoppedDueToInvisibility.clear();\n }\n}\n","import * as THREE from \"three\";\n\nimport { VideoComponent } from \"../components/Video\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\n/** Subset of `VideoComponent.options` the system syncs to the DOM / mesh each frame. */\ntype TrackedVideoOptions = {\n loop: boolean;\n volume: number;\n width: number;\n height: number;\n backgroundColor: string;\n similarity: number;\n smoothness: number;\n spill: number;\n positional: boolean;\n refDistance: number;\n distanceModel: string;\n rolloffFactor: number;\n};\n\n/** Playback intent captured from the previous frame for transition detection. */\ntype PrevVideoIntent = {\n isPlaying: boolean;\n isPaused: boolean;\n};\n\nfunction snapshotOptions(opts: VideoComponent[\"options\"]): TrackedVideoOptions {\n return {\n loop: opts.loop,\n volume: opts.volume,\n width: opts.width,\n height: opts.height,\n backgroundColor: opts.backgroundColor,\n similarity: opts.similarity,\n smoothness: opts.smoothness,\n spill: opts.spill,\n positional: opts.positional,\n refDistance: opts.refDistance,\n distanceModel: opts.distanceModel,\n rolloffFactor: opts.rolloffFactor,\n };\n}\n\n/**\n * Reconciles `VideoComponent` state with the underlying HTML video element\n * and THREE.js mesh/material each frame.\n *\n * **Playback** — drives `play()`, `pause()`, and stop (pause + seek to 0) on\n * the HTML `<video>` element based on the `isPlaying` / `isPaused` flags set\n * by `VideoComponent.play()`, `.pause()`, and `.stop()`.\n *\n * **Option sync** — detects changes to `loop`, `volume`, `width`, `height`,\n * and green-screen shader uniforms (`backgroundColor`, `similarity`,\n * `smoothness`, `spill`) and applies them live without a scene reload.\n *\n * Only active in **preview** mode (`isEditor: true` makes every update a\n * no-op so the editor is unaffected).\n *\n * @category Systems\n */\nexport class VideoSystem implements EcsSystem {\n private readonly isEditor: boolean;\n /** Playback intent captured at the end of the previous frame. */\n private readonly prevIntent = new Map<number, PrevVideoIntent>();\n /** Snapshot of options applied in the previous frame, for change detection. */\n private readonly prevOptions = new Map<number, TrackedVideoOptions>();\n /** Tracks entities that were manually paused due to invisibility. */\n private readonly pausedDueToInvisibility = new Set<number>();\n\n constructor({ isEditor = false }: { isEditor?: boolean } = {}) {\n this.isEditor = isEditor;\n }\n\n update(world: World, _deltaTime: number): void {\n if (this.isEditor) return;\n\n const entities = world.query(VideoComponent);\n\n // Track which entities are still alive so we can prune stale map entries.\n const liveEntityIds = new Set(entities);\n\n for (const entityId of entities) {\n const component = world.getComponent(entityId, VideoComponent);\n if (!component?.videoElement) continue;\n\n const video = component.videoElement;\n\n // Skip video updates for invisible entities; pause playback so the video\n // does not continue running while the entity is hidden. Track that we\n // manually paused it so we can resume when visibility is restored.\n if (!world.isEntityVisible(entityId)) {\n if (!video.paused) {\n video.pause();\n this.pausedDueToInvisibility.add(entityId);\n }\n continue;\n }\n\n // Entity is visible — if we previously paused it due to invisibility,\n // resume playback now and clear the flag.\n if (this.pausedDueToInvisibility.has(entityId)) {\n this.pausedDueToInvisibility.delete(entityId);\n // If the component still wants to play, resume the video element.\n if (component.isPlaying && video.paused) {\n video.play().catch(() => {});\n }\n }\n\n // --- Option sync ---------------------------------------------------\n this._syncOptions(entityId, component, video);\n\n // --- Playback reconciliation ----------------------------------------\n const prev = this.prevIntent.get(entityId) ?? { isPlaying: false, isPaused: false };\n\n // Detect natural video end: the element paused on its own (non-looping\n // clip finished) while the component still believes it is playing.\n // Skip this check if we manually paused due to invisibility.\n if (\n prev.isPlaying &&\n video.paused &&\n !video.seeking &&\n component.isPlaying &&\n !component.isPaused &&\n !this.pausedDueToInvisibility.has(entityId)\n ) {\n component.isPlaying = false;\n }\n\n const isStoppedNow = !component.isPlaying && !component.isPaused;\n const wasStoppedPrev = !prev.isPlaying && !prev.isPaused;\n // True only on the first frame after `stop()` is called — used to reset\n // currentTime exactly once rather than every frame.\n const justStopped = !wasStoppedPrev && isStoppedNow;\n\n if (component.isPlaying) {\n if (video.paused) {\n // play() returns a Promise; browsers may reject it due to autoplay\n // policy. The flag stays true so the system retries next frame.\n video.play().catch(() => {});\n }\n } else if (component.isPaused) {\n if (!video.paused) {\n video.pause();\n }\n } else {\n // Stopped state — pause and reset position.\n if (!video.paused) {\n video.pause();\n }\n if (justStopped) {\n video.currentTime = 0;\n }\n }\n\n this.prevIntent.set(entityId, {\n isPlaying: component.isPlaying,\n isPaused: component.isPaused,\n });\n }\n\n // Remove tracking entries for entities that no longer exist.\n for (const entityId of this.prevIntent.keys()) {\n if (!liveEntityIds.has(entityId)) {\n this.prevIntent.delete(entityId);\n this.prevOptions.delete(entityId);\n this.pausedDueToInvisibility.delete(entityId);\n }\n }\n }\n\n /** Apply any changed options from the component to the video element and mesh. */\n private _syncOptions(\n entityId: number,\n component: VideoComponent,\n video: HTMLVideoElement,\n ): void {\n const opts = component.options;\n const prev = this.prevOptions.get(entityId);\n\n if (!prev || prev.loop !== opts.loop) {\n video.loop = opts.loop;\n }\n\n // Volume: prefer the Web Audio gain node when present so that positional\n // attenuation is applied correctly. Fall back to the HTML element directly\n // when no audio node exists (e.g. in editor mode, should rarely occur here\n // since VideoSystem is a no-op in editor).\n if (!prev || prev.volume !== opts.volume) {\n if (component.audioNode) {\n component.audioNode.setVolume(Math.max(0, Math.min(1, opts.volume)));\n } else {\n video.volume = Math.max(0, Math.min(1, opts.volume));\n }\n }\n\n // Mesh scale for width / height.\n if ((!prev || prev.width !== opts.width || prev.height !== opts.height) && component.object) {\n component.object.scale.set(opts.width, opts.height, 1);\n }\n\n // Green-screen shader uniforms — only when the material is a ShaderMaterial.\n const material = component.material;\n if (material instanceof THREE.ShaderMaterial) {\n if (!prev || prev.backgroundColor !== opts.backgroundColor) {\n (material.uniforms.keyColor.value as THREE.Color).set(opts.backgroundColor);\n }\n\n if (!prev || prev.similarity !== opts.similarity) {\n material.uniforms.similarity.value = opts.similarity;\n }\n\n if (!prev || prev.smoothness !== opts.smoothness) {\n material.uniforms.smoothness.value = opts.smoothness;\n }\n\n if (!prev || prev.spill !== opts.spill) {\n material.uniforms.spill.value = opts.spill;\n }\n }\n\n // Positional audio options — only when the audioNode is a PositionalAudio.\n if (opts.positional && component.audioNode instanceof THREE.PositionalAudio) {\n const posAudio = component.audioNode;\n\n if (!prev || prev.refDistance !== opts.refDistance) {\n posAudio.setRefDistance(opts.refDistance);\n }\n\n if (!prev || prev.distanceModel !== opts.distanceModel) {\n posAudio.setDistanceModel(opts.distanceModel as DistanceModelType);\n }\n\n if (!prev || prev.rolloffFactor !== opts.rolloffFactor) {\n posAudio.setRolloffFactor(opts.rolloffFactor);\n }\n }\n\n this.prevOptions.set(entityId, snapshotOptions(opts));\n }\n\n dispose(_world: World): void {\n this.prevIntent.clear();\n this.prevOptions.clear();\n this.pausedDueToInvisibility.clear();\n }\n}\n","import * as THREE from \"three\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport type { XrHandJointName, XrHandJoints } from \"../xr/handPose\";\nimport type { XrHandedness, XrInputKind, XrInputState } from \"../xr/types\";\n\n/**\n * Normalizes every WebXR input model into one pollable shape.\n *\n * Sources are keyed by their live `XRInputSource` object, NOT by index or\n * handedness: Vision Pro's `transient-pointer` sources are created on pinch and\n * destroyed on release, so index-based caching would attribute one pinch's\n * state to the next. Keying by identity means a released source simply\n * disappears, and `selectEnd` still fires for it on its final frame.\n *\n * Mirrors {@link InputSystem}'s pending→latched contract: event handlers only\n * set `pending*` flags, and `update()` promotes them exactly once per frame so\n * `selectStart`/`selectEnd` are true for a single frame regardless of how many\n * events arrived.\n */\n\ntype SourceRecord = {\n source: XRInputSource;\n state: XrInputState;\n pendingSelectStart: boolean;\n pendingSelectEnd: boolean;\n pendingSqueezeStart: boolean;\n pendingSqueezeEnd: boolean;\n /** Marks sources that vanished this frame so we can emit their final edge. */\n removed: boolean;\n};\n\nfunction handednessOf(source: XRInputSource): XrHandedness {\n const value = source.handedness;\n return value === \"left\" || value === \"right\" ? value : \"none\";\n}\n\n/**\n * Classify a source. `targetRayMode` is the authoritative signal — it is how the\n * spec distinguishes Vision Pro's transient pinch (`transient-pointer`) from a\n * held controller (`tracked-pointer`) — with the presence of `hand` breaking the\n * tie for articulated hands.\n */\nfunction kindOf(source: XRInputSource): XrInputKind {\n const mode = source.targetRayMode as string;\n if (mode === \"transient-pointer\") return \"transient-pointer\";\n if (mode === \"gaze\") return \"gaze\";\n if (source.hand) return \"hand\";\n return \"controller\";\n}\n\nfunction blankState(source: XRInputSource): XrInputState {\n return {\n handedness: handednessOf(source),\n kind: kindOf(source),\n connected: true,\n rayOrigin: new THREE.Vector3(),\n rayDirection: new THREE.Vector3(0, 0, -1),\n gripPosition: null,\n gripQuaternion: null,\n select: false,\n selectStart: false,\n selectEnd: false,\n squeeze: false,\n squeezeStart: false,\n squeezeEnd: false,\n axes: [],\n hasAxes: false,\n buttons: [],\n joints: null,\n };\n}\n\n/** Scratch buffer for `fillPoses`; 25 joints x 16 floats. */\nconst JOINT_MATRIX_BUFFER = new Float32Array(25 * 16);\n\n/**\n * Read a tracked hand's joints into world space.\n *\n * Prefers `fillPoses`, which resolves the whole skeleton in one call — 25\n * separate `getJointPose` calls per hand per frame is a real cost at 90Hz — and\n * falls back to per-joint reads on runtimes that lack it.\n *\n * Vectors are reused across frames so a tracked hand allocates nothing.\n */\nfunction readHandJoints(\n frame: XRFrame,\n hand: XRHand,\n referenceSpace: XRReferenceSpace,\n rigMatrix: THREE.Matrix4,\n existing: XrHandJoints | null,\n): XrHandJoints | null {\n const names: XrHandJointName[] = [];\n const spaces: XRSpace[] = [];\n for (const [name, space] of hand as unknown as Iterable<\n [XrHandJointName, XRSpace]\n >) {\n names.push(name);\n spaces.push(space);\n }\n if (spaces.length === 0) return null;\n\n const target: XrHandJoints = existing ?? {};\n const matrix = new THREE.Matrix4();\n\n const buffer =\n spaces.length * 16 <= JOINT_MATRIX_BUFFER.length\n ? JOINT_MATRIX_BUFFER\n : new Float32Array(spaces.length * 16);\n\n const fillPoses = (\n frame as unknown as {\n fillPoses?: (\n spaces: XRSpace[],\n base: XRReferenceSpace,\n out: Float32Array,\n ) => boolean;\n }\n ).fillPoses;\n\n if (typeof fillPoses === \"function\") {\n let filled = false;\n try {\n filled = fillPoses.call(frame, spaces, referenceSpace, buffer);\n } catch {\n filled = false;\n }\n if (filled) {\n for (let i = 0; i < names.length; i += 1) {\n matrix.fromArray(buffer, i * 16).premultiply(rigMatrix);\n const vector = target[names[i]] ?? new THREE.Vector3();\n vector.setFromMatrixPosition(matrix);\n target[names[i]] = vector;\n }\n return target;\n }\n }\n\n let anyTracked = false;\n for (let i = 0; i < names.length; i += 1) {\n const pose = frame.getJointPose?.(\n spaces[i] as XRJointSpace,\n referenceSpace,\n );\n if (!pose) {\n target[names[i]] = undefined;\n continue;\n }\n matrix.fromArray(pose.transform.matrix).premultiply(rigMatrix);\n const vector = target[names[i]] ?? new THREE.Vector3();\n vector.setFromMatrixPosition(matrix);\n target[names[i]] = vector;\n anyTracked = true;\n }\n\n // The spec guarantees a hand poses all joints or none, so no tracked joint\n // means the hand is genuinely gone rather than partially occluded.\n return anyTracked ? target : null;\n}\n\nexport class XRInputSystem implements EcsSystem {\n private readonly records = new Map<XRInputSource, SourceRecord>();\n /** Reference-space → world matrix, rebuilt each frame from the XR rig. */\n private readonly referenceToWorld = new THREE.Matrix4();\n private session: XRSession | null = null;\n\n private readonly onSelectStart = (event: XRInputSourceEvent) =>\n this.mark(event, \"pendingSelectStart\");\n private readonly onSelectEnd = (event: XRInputSourceEvent) =>\n this.mark(event, \"pendingSelectEnd\");\n private readonly onSqueezeStart = (event: XRInputSourceEvent) =>\n this.mark(event, \"pendingSqueezeStart\");\n private readonly onSqueezeEnd = (event: XRInputSourceEvent) =>\n this.mark(event, \"pendingSqueezeEnd\");\n\n private mark(event: XRInputSourceEvent, flag: keyof SourceRecord): void {\n const record = this.ensureRecord(event.inputSource);\n (record as unknown as Record<string, boolean>)[flag as string] = true;\n }\n\n private ensureRecord(source: XRInputSource): SourceRecord {\n let record = this.records.get(source);\n if (!record) {\n record = {\n source,\n state: blankState(source),\n pendingSelectStart: false,\n pendingSelectEnd: false,\n pendingSqueezeStart: false,\n pendingSqueezeEnd: false,\n removed: false,\n };\n this.records.set(source, record);\n }\n return record;\n }\n\n /** Bind to a session. Called by {@link XRSessionSystem} on session start. */\n attachSession(session: XRSession): void {\n this.detachSession();\n this.session = session;\n session.addEventListener(\"selectstart\", this.onSelectStart as EventListener);\n session.addEventListener(\"selectend\", this.onSelectEnd as EventListener);\n session.addEventListener(\n \"squeezestart\",\n this.onSqueezeStart as EventListener,\n );\n session.addEventListener(\"squeezeend\", this.onSqueezeEnd as EventListener);\n }\n\n /** Unbind and drop all per-source state. */\n detachSession(): void {\n const session = this.session;\n if (session) {\n session.removeEventListener(\n \"selectstart\",\n this.onSelectStart as EventListener,\n );\n session.removeEventListener(\n \"selectend\",\n this.onSelectEnd as EventListener,\n );\n session.removeEventListener(\n \"squeezestart\",\n this.onSqueezeStart as EventListener,\n );\n session.removeEventListener(\n \"squeezeend\",\n this.onSqueezeEnd as EventListener,\n );\n }\n this.session = null;\n this.records.clear();\n }\n\n update(world: World): void {\n // Clear one-frame edges from the previous tick, and retire sources that\n // disconnected then (their final selectEnd has now been observed).\n for (const [source, record] of this.records) {\n if (record.removed) {\n this.records.delete(source);\n continue;\n }\n record.state.selectStart = false;\n record.state.selectEnd = false;\n record.state.squeezeStart = false;\n record.state.squeezeEnd = false;\n }\n\n const session = this.session;\n if (!session || !world.isXrPresenting()) return;\n\n const renderer = world.getRenderer();\n const referenceSpace = renderer.xr.getReferenceSpace();\n const frame = (renderer.xr as { getFrame?: () => XRFrame | null }).getFrame?.();\n const live = new Set<XRInputSource>();\n\n // WebXR reports poses in REFERENCE space, which is the XR rig's space —\n // three relies on the rig being the parent to place its own controller\n // objects. Everything downstream of this system (teleport arcs, interaction\n // raycasts, grab positions) works against WORLD-space scene objects, so the\n // poses must be lifted out of rig space here. They coincide only while the\n // rig sits at the origin, which is why aiming drifted the moment the player\n // teleported or turned.\n const rigMatrix = this.referenceToWorld;\n const rig = world.getCamera().parent;\n if (rig) {\n rig.updateMatrixWorld();\n rigMatrix.copy(rig.matrixWorld);\n } else {\n rigMatrix.identity();\n }\n\n for (const source of session.inputSources) {\n live.add(source);\n const record = this.ensureRecord(source);\n const state = record.state;\n state.connected = true;\n // Re-read each frame: a source can gain a gamepad or hand mid-session.\n state.handedness = handednessOf(source);\n state.kind = kindOf(source);\n\n if (frame && referenceSpace && source.targetRaySpace) {\n const pose = frame.getPose(source.targetRaySpace, referenceSpace);\n if (pose) {\n const m = new THREE.Matrix4()\n .fromArray(pose.transform.matrix)\n .premultiply(rigMatrix);\n state.rayOrigin.setFromMatrixPosition(m);\n state.rayDirection\n .set(0, 0, -1)\n .applyQuaternion(\n new THREE.Quaternion().setFromRotationMatrix(m),\n )\n .normalize();\n }\n }\n\n if (frame && referenceSpace && source.gripSpace) {\n const gripPose = frame.getPose(source.gripSpace, referenceSpace);\n if (gripPose) {\n const m = new THREE.Matrix4()\n .fromArray(gripPose.transform.matrix)\n .premultiply(rigMatrix);\n state.gripPosition ??= new THREE.Vector3();\n state.gripQuaternion ??= new THREE.Quaternion();\n state.gripPosition.setFromMatrixPosition(m);\n state.gripQuaternion.setFromRotationMatrix(m);\n }\n } else {\n // Gaze and transient-pointer have no grip — keep it explicitly null so\n // callers can tell \"no grip\" from \"grip at the origin\".\n state.gripPosition = null;\n state.gripQuaternion = null;\n }\n\n if (frame && referenceSpace && source.hand) {\n state.joints = readHandJoints(\n frame,\n source.hand,\n referenceSpace,\n rigMatrix,\n state.joints,\n );\n } else {\n state.joints = null;\n }\n\n const gamepad = source.gamepad;\n if (gamepad) {\n state.axes = Array.from(gamepad.axes);\n state.hasAxes = gamepad.axes.some((axis) => Number.isFinite(axis));\n state.buttons = gamepad.buttons.map((button) => button.pressed);\n } else {\n state.axes = [];\n state.hasAxes = false;\n state.buttons = [];\n }\n\n }\n\n // Latch pending edges for EVERY record, not just the live ones.\n //\n // This pass must not be folded into the loop above: Vision Pro destroys a\n // transient-pointer source in the SAME frame its `selectend` fires, so by\n // the time we iterate `session.inputSources` the released source is already\n // gone. Latching only live sources silently dropped that release edge — and\n // since teleport commits on release, gaze-pinch teleport never fired at all.\n for (const record of this.records.values()) {\n const state = record.state;\n if (record.pendingSelectStart) {\n state.select = true;\n state.selectStart = true;\n record.pendingSelectStart = false;\n }\n if (record.pendingSelectEnd) {\n state.select = false;\n state.selectEnd = true;\n record.pendingSelectEnd = false;\n }\n if (record.pendingSqueezeStart) {\n state.squeeze = true;\n state.squeezeStart = true;\n record.pendingSqueezeStart = false;\n }\n if (record.pendingSqueezeEnd) {\n state.squeeze = false;\n state.squeezeEnd = true;\n record.pendingSqueezeEnd = false;\n }\n }\n\n // A source that left `inputSources` is gone (a released Vision Pro pinch).\n // Flag it rather than deleting now, so this frame still reports its\n // selectEnd; it is removed at the top of the next tick.\n for (const [source, record] of this.records) {\n if (live.has(source)) continue;\n record.state.connected = false;\n record.removed = true;\n }\n }\n\n /** Every input source active this frame. */\n getInputs(): XrInputState[] {\n return Array.from(this.records.values(), (record) => record.state);\n }\n\n /** The first source for a hand, or null. Prefer this for hand-specific logic. */\n getInput(handedness: XrHandedness): XrInputState | null {\n for (const record of this.records.values()) {\n if (record.state.handedness === handedness) return record.state;\n }\n return null;\n }\n\n /** True while ANY source is selecting — the portable \"is the user acting\" check. */\n isSelecting(): boolean {\n for (const record of this.records.values()) {\n if (record.state.select) return true;\n }\n return false;\n }\n\n dispose(): void {\n this.detachSession();\n }\n}\n","import * as THREE from \"three\";\n\n/**\n * Estimates release velocity for thrown objects.\n *\n * Naively differencing the last two frames produces terrible throws: a single\n * noisy sample (or the tiny decelerating motion as the user opens their hand)\n * lands right on the release frame and the object dribbles out. Real throws are\n * recovered by looking back over a short WINDOW and taking the best of it — the\n * approach every mature VR toolkit converges on.\n *\n * Pure and frame-rate independent so throw feel can be unit-tested without a\n * headset.\n */\n\n/** Samples retained. ~5 frames ≈ 55ms at 90Hz — long enough to smooth noise. */\nexport const VELOCITY_SAMPLES = 5;\n/**\n * Samples older than this are ignored on release.\n *\n * Without it, pausing mid-grab then opening your hand would throw using motion\n * from before the pause.\n */\nexport const MAX_SAMPLE_AGE_SECONDS = 0.2;\n\n/**\n * Fastest hand motion treated as real, in metres/second.\n *\n * Samples are recorded in WORLD space, so anything that moves the XR rig while\n * an object is held — teleport, snap turn — relocates the hand instantly and\n * implies an enormous velocity. Releasing after a teleport would otherwise\n * launch the object out of the world.\n *\n * A very hard human throw is under ~15 m/s; a teleport across a room in one\n * frame is hundreds. The gap is wide enough that one threshold separates them\n * cleanly, and it also absorbs the frame-timing glitches that produce the same\n * artefact on standalone headsets.\n */\nexport const MAX_PLAUSIBLE_SPEED = 20;\n\nexport type VelocitySample = {\n position: THREE.Vector3;\n /** Seconds, monotonically increasing. */\n time: number;\n};\n\n/**\n * Rolling buffer of hand positions used to recover throw velocity.\n *\n * One per active grab; cleared on release.\n */\nexport class ThrowVelocityTracker {\n private readonly samples: VelocitySample[] = [];\n\n /** Record where the hand is now. Call once per frame while held. */\n record(position: THREE.Vector3, time: number): void {\n this.samples.push({ position: position.clone(), time });\n if (this.samples.length > VELOCITY_SAMPLES) {\n this.samples.shift();\n }\n }\n\n /**\n * Velocity to release with, in metres/second.\n *\n * Uses the FASTEST segment inside the window rather than the most recent or\n * the window average. Users decelerate as they open their hand, so the last\n * segment understates the throw and the average washes it out; peak speed is\n * what matches the motion the user actually felt they made.\n */\n computeVelocity(now: number): THREE.Vector3 {\n const fresh = this.samples.filter(\n (sample) => now - sample.time <= MAX_SAMPLE_AGE_SECONDS,\n );\n if (fresh.length < 2) return new THREE.Vector3();\n\n let best = new THREE.Vector3();\n let bestSpeed = 0;\n\n for (let i = 1; i < fresh.length; i += 1) {\n const previous = fresh[i - 1];\n const current = fresh[i];\n const dt = current.time - previous.time;\n // Guard zero/negative dt — duplicate timestamps would divide to Infinity\n // and fling the object out of the world.\n if (dt <= 1e-5) continue;\n\n const velocity = new THREE.Vector3()\n .subVectors(current.position, previous.position)\n .divideScalar(dt);\n const speed = velocity.length();\n // Discard teleport/snap-turn discontinuities rather than clamping them:\n // a clamped spike still points in the jump's direction, so the object\n // would fly the way the player teleported instead of the way they threw.\n if (speed > MAX_PLAUSIBLE_SPEED) continue;\n if (speed > bestSpeed) {\n bestSpeed = speed;\n best = velocity;\n }\n }\n\n return best;\n }\n\n clear(): void {\n this.samples.length = 0;\n }\n}\n\n/**\n * Angular velocity from a rotation delta, as an axis-angle vector (rad/s).\n *\n * Spin makes a thrown ball read as thrown rather than launched, and it is what\n * lets a scene do curve shots or spinning props.\n */\nexport function angularVelocityFrom(\n previous: THREE.Quaternion,\n current: THREE.Quaternion,\n deltaTime: number,\n): THREE.Vector3 {\n if (deltaTime <= 1e-5) return new THREE.Vector3();\n\n const delta = current.clone().multiply(previous.clone().invert());\n // Shortest arc — without this a small rotation can be read as a ~2π spin.\n if (delta.w < 0) {\n delta.set(-delta.x, -delta.y, -delta.z, -delta.w);\n }\n\n const angle = 2 * Math.acos(THREE.MathUtils.clamp(delta.w, -1, 1));\n const sinHalf = Math.sqrt(Math.max(0, 1 - delta.w * delta.w));\n if (sinHalf < 1e-6 || angle < 1e-6) return new THREE.Vector3();\n\n return new THREE.Vector3(delta.x, delta.y, delta.z)\n .divideScalar(sinHalf)\n .multiplyScalar(angle / deltaTime);\n}\n","import * as THREE from \"three\";\n\n/**\n * Solves an object's transform from TWO hands holding it.\n *\n * Two grab points constrain an object almost completely — but not quite. They\n * fix a line and a length, which gives orientation along that line and a scale\n * ratio, yet leave the TWIST about the line undetermined. Every implementation\n * has to pick a reference for that twist; here it comes from the primary hand's\n * own roll — the object keeps tracking that hand and is then swung onto the\n * second one by a shortest-arc correction, which adds no twist of its own. That\n * is what makes a two-handed rifle bank when you rotate your trigger hand.\n *\n * The primary hand is ANCHORED and the secondary steers. That asymmetry is\n * deliberate: for the weapon case the grip stays welded to the dominant hand\n * while the foregrip aims, which is both what users expect and what keeps the\n * object from sliding around under small tracking noise in either hand.\n *\n * Pure and frame-rate independent so two-hand feel can be unit-tested.\n */\n\n/** A hand's world pose. */\nexport type HandPose = {\n position: THREE.Vector3;\n /** Used only to resolve twist about the grab axis. */\n quaternion: THREE.Quaternion;\n};\n\n/**\n * How the second hand affects orientation.\n *\n * `align` points the object's grab axis along the line between the hands — the\n * two-handed weapon/tool behaviour. `primary` leaves rotation entirely to the\n * primary hand and lets the second hand contribute only scale, which suits\n * objects being resized rather than aimed.\n */\nexport type TwoHandRotationMode = \"align\" | \"primary\";\n\n/** Captured once, when the second hand grabs. */\nexport type TwoHandGrabBasis = {\n /** Primary hand's grab anchor, object-local (unscaled). */\n primaryLocal: THREE.Vector3;\n /** Secondary hand's grab anchor, object-local (unscaled). */\n secondaryLocal: THREE.Vector3;\n /** Object scale at the moment the second hand grabbed. */\n initialScale: THREE.Vector3;\n /** Hand separation at the moment the second hand grabbed, metres. */\n initialSeparation: number;\n /**\n * Object rotation relative to the PRIMARY hand at grab time.\n *\n * Lets the two-hand solve continue exactly where the one-hand grab left off,\n * so nothing pops at the instant the second hand lands.\n */\n primaryHandOffset: THREE.Quaternion;\n /** Object rotation at that moment, used as the fallback when degenerate. */\n initialQuaternion: THREE.Quaternion;\n};\n\nexport type TwoHandSolveOptions = {\n rotationMode: TwoHandRotationMode;\n allowScale: boolean;\n /** Smallest fraction of the starting size this gesture may reach. */\n minScale: number;\n /** Largest multiple of the starting size this gesture may reach. */\n maxScale: number;\n};\n\nexport type TwoHandSolveResult = {\n position: THREE.Vector3;\n quaternion: THREE.Quaternion;\n scale: THREE.Vector3;\n /**\n * True when the hands were too close to define a stable axis, so rotation\n * fell back rather than being solved. Callers should hold their previous\n * orientation on these frames.\n */\n degenerate: boolean;\n};\n\n/**\n * Hands closer together than this cannot define a reliable axis.\n *\n * Rotation from two points is a lever: as the separation shrinks, the same\n * millimetre of tracking noise swings the object through a larger angle, and\n * below a few centimetres it becomes violent jitter. Real two-handed grips are\n * never this close, so refusing to solve is strictly better than solving badly.\n */\nexport const MIN_HAND_SEPARATION = 0.06;\n\n/** Anchors closer together than this on the object give the same lever problem. */\nconst MIN_ANCHOR_SEPARATION = 1e-3;\n\n/**\n * Fractional change in hand separation before scale reacts.\n *\n * Hands drift constantly while carrying something with both of them. Without a\n * deadzone an object with scaling enabled would breathe in and out the whole\n * time it was held, which reads as broken rather than responsive.\n */\nexport const SCALE_DEADZONE = 0.05;\n\n/**\n * Solve the object transform for the current hand poses.\n *\n * `primary`/`secondary` must be passed in the same roles used when the basis was\n * captured, or the object will flip.\n */\nexport function solveTwoHandTransform(\n primary: HandPose,\n secondary: HandPose,\n basis: TwoHandGrabBasis,\n options: TwoHandSolveOptions,\n): TwoHandSolveResult {\n const separation = primary.position.distanceTo(secondary.position);\n\n const anchorDelta = new THREE.Vector3().subVectors(\n basis.secondaryLocal,\n basis.primaryLocal,\n );\n const anchorLength = anchorDelta.length();\n\n // ── Scale ────────────────────────────────────────────────────────────────\n // Ratio of current to starting hand separation. Clamped per gesture so a\n // single pull cannot blow the object up unboundedly.\n let factor = 1;\n if (\n options.allowScale &&\n basis.initialSeparation > MIN_ANCHOR_SEPARATION &&\n separation > MIN_ANCHOR_SEPARATION\n ) {\n factor = separation / basis.initialSeparation;\n // Ignore small drift so an object only resizes when the user clearly means\n // to, then rebase so scaling starts smoothly from the edge of the deadzone\n // rather than jumping by the deadzone's width.\n if (Math.abs(factor - 1) <= SCALE_DEADZONE) {\n factor = 1;\n } else {\n factor += factor > 1 ? -SCALE_DEADZONE : SCALE_DEADZONE;\n }\n factor = Math.min(options.maxScale, Math.max(options.minScale, factor));\n }\n // Uniform only: scaling one axis of a held object shears it relative to the\n // hands and there is no sane way to map two points onto three axes.\n const scale = basis.initialScale.clone().multiplyScalar(factor);\n\n // ── Rotation ─────────────────────────────────────────────────────────────\n //\n // Built as \"keep following the primary hand, then swing the grab axis onto the\n // second hand\" rather than by constructing an orientation from scratch.\n //\n // That composition matters for two reasons. It is CONTINUOUS with the one-hand\n // grab, so nothing jumps when the second hand lands. And the correction is a\n // SHORTEST-ARC rotation between two directions, which adds no twist of its\n // own — so the primary hand keeps supplying roll, and there is no up-vector to\n // go degenerate when the grab axis happens to point along it. Building an\n // orthonormal basis instead needs a reference up, and every implementation\n // that does it also needs a blend to escape that singularity plus a\n // hemisphere-flip guard to stop compound rotations snapping 180°.\n const degenerate =\n separation < MIN_HAND_SEPARATION || anchorLength < MIN_ANCHOR_SEPARATION;\n\n // Where the primary hand alone would put the object.\n const base = primary.quaternion.clone().multiply(basis.primaryHandOffset);\n\n let quaternion: THREE.Quaternion;\n\n if (options.rotationMode === \"primary\" || degenerate) {\n // Also the fallback when the axis is unusable, so bringing one hand right up\n // to the other degrades to a stable one-hand hold instead of thrashing.\n quaternion = base;\n } else {\n const axisLocal = anchorDelta.clone().normalize();\n const currentAxis = axisLocal.clone().applyQuaternion(base).normalize();\n const desiredAxis = new THREE.Vector3()\n .subVectors(secondary.position, primary.position)\n .normalize();\n\n // `setFromUnitVectors` picks an orthogonal axis for the antiparallel case,\n // so a fully reversed grab stays finite instead of producing NaN.\n const correction = new THREE.Quaternion().setFromUnitVectors(\n currentAxis,\n desiredAxis,\n );\n // World-space correction applied on top of the hand-tracked base.\n quaternion = correction.multiply(base);\n }\n\n // ── Position ─────────────────────────────────────────────────────────────\n // Place the object so its primary anchor lands exactly on the primary hand.\n const anchorOffset = basis.primaryLocal\n .clone()\n .multiply(scale)\n .applyQuaternion(quaternion);\n const position = primary.position.clone().sub(anchorOffset);\n\n return { position, quaternion, scale, degenerate };\n}\n","import * as THREE from \"three\";\nimport { Behaviour } from \"../Behaviour\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport {\n PhysicsComponent,\n setPhysicsLiveRef,\n} from \"../components/Physics\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport { TransformComponent } from \"../components/Transform\";\nimport {\n type XrAttachPoint,\n XRInteractableComponent,\n} from \"../components/XRInteractable\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport {\n angularVelocityFrom,\n ThrowVelocityTracker,\n} from \"../xr/throwVelocity\";\nimport {\n solveTwoHandTransform,\n type TwoHandGrabBasis,\n} from \"../xr/twoHandTransform\";\nimport type { XrInputState } from \"../xr/types\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\n\n/**\n * Pointer hover, grabbing and throwing for {@link XRInteractableComponent}.\n *\n * Supports both reach models — **physical** (hand within the object's grab\n * radius) and **distance** (along the pointer ray) — and, for distance grabs,\n * either snapping the object to the hand or manipulating it where it stands.\n *\n * Uses the same ray for every input model, so a controller, a tracked hand and\n * a Vision Pro gaze-pinch all drive interaction identically; the differences\n * are absorbed by {@link XRInputSystem}, not repeated here.\n */\n\n/** How far in front of a grip-less source an object is held, in metres. */\nconst RAYLESS_HOLD_DISTANCE = 0.5;\n\n/** Euler-XYZ radians → quaternion. TransformComponent stores Euler. */\nfunction quatFromEulerVec(r: {\n x: number;\n y: number;\n z: number;\n}): THREE.Quaternion {\n return new THREE.Quaternion().setFromEuler(new THREE.Euler(r.x, r.y, r.z));\n}\n\n/** Write a quaternion back into a TransformComponent's Euler rotation. */\nfunction writeEuler(\n target: { x: number; y: number; z: number },\n q: THREE.Quaternion,\n): void {\n const euler = new THREE.Euler().setFromQuaternion(q);\n target.x = euler.x;\n target.y = euler.y;\n target.z = euler.z;\n}\n\ntype GrabRecord = {\n entityId: number;\n /**\n * Anchoring hand vs steering hand.\n *\n * The primary is welded to the object; the secondary only aims and scales it.\n * When the primary lets go, the secondary is PROMOTED rather than the object\n * being dropped.\n */\n role: \"primary\" | \"secondary\";\n /** Authored hold in use, or null for a free grab. */\n attachPointId: string | null;\n /** The authored hold's object-local position, unscaled. */\n attachLocal: THREE.Vector3 | null;\n /** The authored hold's object-local orientation. */\n attachQuaternion: THREE.Quaternion | null;\n /** Object rotation relative to the hand at grab time, for free grabs. */\n handRotationOffset: THREE.Quaternion;\n /** Set on the PRIMARY record once a second hand joins. */\n twoHand: TwoHandGrabBasis | null;\n /** Object position relative to the hand at grab time (hand space). */\n offset: THREE.Vector3;\n /** Object rotation relative to the hand at grab time. */\n rotationOffset: THREE.Quaternion;\n /** Distance along the ray for a `remote` distance grab. */\n remoteDistance: number;\n remote: boolean;\n /** Body type to restore on release. */\n restoreBodyType: string | null;\n tracker: ThrowVelocityTracker;\n lastHandQuaternion: THREE.Quaternion;\n /** Most recent hand spin, released as angular velocity for a natural throw. */\n angularVelocity: THREE.Vector3;\n};\n\n/** One interactable considered this frame. */\ntype InteractableEntry = {\n entityId: number;\n object: THREE.Object3D;\n pointable: boolean;\n};\n\nexport class XRInteractionSystem implements EcsSystem {\n private readonly inputSystem: XRInputSystem;\n private readonly raycaster = new THREE.Raycaster();\n private readonly grabs = new Map<XrInputState, GrabRecord>();\n private hoveredEntityId: number | null = null;\n /** Per-hand hover, with the hit distance so the ray can stop at the surface. */\n private readonly hovers = new Map<\n XrInputState,\n { entityId: number; distance: number }\n >();\n /** Monotonic seconds, accumulated from deltaTime for velocity sampling. */\n private elapsed = 0;\n\n constructor(inputSystem: XRInputSystem) {\n this.inputSystem = inputSystem;\n }\n\n update(world: World, deltaTime: number): void {\n if (!world.isXrPresenting()) {\n this.releaseAll(world);\n return;\n }\n\n this.elapsed += Math.max(0, deltaTime);\n const inputs = this.inputSystem.getInputs();\n const interactables = this.collectInteractables(world);\n this.hoveredEntityId = null;\n this.hovers.clear();\n\n for (const input of inputs) {\n // A source that vanished mid-grab (released Vision Pro pinch) must drop\n // whatever it held, or the object is stranded in mid-air.\n if (!input.connected) {\n this.release(world, input);\n continue;\n }\n\n const held = this.grabs.get(input);\n if (held) {\n if (this.wantsRelease(world, input, held)) {\n this.release(world, input);\n }\n continue;\n }\n\n const candidate = this.findGrabCandidate(world, input, interactables);\n if (candidate === null) continue;\n\n if (this.hoveredEntityId === null) {\n this.hoveredEntityId = candidate.entityId;\n }\n this.hovers.set(input, {\n entityId: candidate.entityId,\n distance: candidate.distance,\n });\n\n const interactable = world.getComponent(\n candidate.entityId,\n XRInteractableComponent,\n );\n if (\n interactable?.grabbable &&\n this.gestureMatches(input, interactable, /* starting */ true)\n ) {\n this.tryGrab(world, input, candidate.entityId, candidate.viaDistance);\n }\n }\n\n // Move held objects only AFTER every grab and release has settled, and once\n // per ENTITY rather than once per hand. A two-hand hold is a single solve;\n // driving it from each hand in turn would have them fight each other.\n this.moveAllHeld(world, deltaTime);\n }\n\n /** Hands currently holding an entity. */\n private holdersOf(\n entityId: number,\n ): Array<{ input: XrInputState; record: GrabRecord }> {\n const holders: Array<{ input: XrInputState; record: GrabRecord }> = [];\n for (const [input, record] of this.grabs) {\n if (record.entityId === entityId) holders.push({ input, record });\n }\n return holders;\n }\n\n /**\n * Route a new grab: first hand, hand-off, or second hand.\n *\n * Which of those happens is the object's choice (`grabHands`), not the\n * hand's — a ball should pass between hands, a rifle should be held by both,\n * and a lever should stay with whoever grabbed it first.\n */\n private tryGrab(\n world: World,\n input: XrInputState,\n entityId: number,\n viaDistance: boolean,\n ): void {\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n if (!interactable) return;\n\n const holders = this.holdersOf(entityId);\n if (holders.length === 0) {\n this.grab(world, input, entityId, viaDistance, \"primary\");\n return;\n }\n if (holders.some((holder) => holder.input === input)) return;\n\n if (interactable.grabHands === \"single\") return;\n\n if (interactable.grabHands === \"handOff\") {\n // TRANSFER, not release-then-grab: going through release() would restore\n // the body to dynamic and hurl it with the old hand's velocity. Moving\n // the record keeps physics suspended and the object in hand.\n const previous = holders[0];\n this.grabs.delete(previous.input);\n const record = previous.record;\n record.role = \"primary\";\n record.twoHand = null;\n this.reanchor(world, input, record, interactable);\n this.grabs.set(input, record);\n this.dispatch(world, entityId, (b) => b.onGrab(input));\n return;\n }\n\n if (holders.length >= 2) return;\n this.grab(world, input, entityId, viaDistance, \"secondary\");\n this.beginTwoHand(world, entityId);\n }\n\n /**\n * Re-derive a record's hold from where the object is NOW.\n *\n * Used on hand-off and on promotion after the primary lets go. Without it the\n * object snaps to whatever offset the previous hand had, which reads as the\n * object jumping out of your grip at the moment you take it.\n */\n private reanchor(\n world: World,\n input: XrInputState,\n record: GrabRecord,\n interactable: XRInteractableComponent,\n ): void {\n const transform = world.getComponent(record.entityId, TransformComponent);\n if (!transform) return;\n\n const hand = this.handPosition(input);\n const handQuaternion = this.handQuaternion(input);\n const objectQuaternion = quatFromEulerVec(transform.rotation);\n\n record.offset = new THREE.Vector3(\n transform.position.x - hand.x,\n transform.position.y - hand.y,\n transform.position.z - hand.z,\n ).applyQuaternion(handQuaternion.clone().invert());\n record.handRotationOffset = handQuaternion\n .clone()\n .invert()\n .multiply(objectQuaternion);\n record.remote = false;\n record.tracker.clear();\n record.tracker.record(hand, this.elapsed);\n record.lastHandQuaternion = handQuaternion.clone();\n // An authored hold stays authored across a transfer; a free grab re-derives\n // from the current pose, which is what the offset above just captured.\n if (record.attachLocal && interactable.attachPoints.length === 0) {\n record.attachLocal = null;\n record.attachQuaternion = null;\n record.attachPointId = null;\n }\n }\n\n /** Capture the two-hand basis once both hands are on the object. */\n private beginTwoHand(world: World, entityId: number): void {\n const holders = this.holdersOf(entityId);\n if (holders.length !== 2) return;\n\n const primary = holders.find((h) => h.record.role === \"primary\");\n const secondary = holders.find((h) => h.record.role === \"secondary\");\n if (!primary || !secondary) return;\n\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) return;\n\n const primaryHand = this.handPosition(primary.input);\n const secondaryHand = this.handPosition(secondary.input);\n\n // Anchors are the authored holds when the object has them, and otherwise\n // wherever each hand happens to be on the object — so a plain box can still\n // be grabbed with two hands and scaled.\n const primaryLocal =\n primary.record.attachLocal?.clone() ??\n this.objectLocalPoint(transform, primaryHand);\n const secondaryLocal =\n secondary.record.attachLocal?.clone() ??\n this.objectLocalPoint(transform, secondaryHand);\n\n primary.record.twoHand = {\n primaryLocal,\n secondaryLocal,\n initialScale: new THREE.Vector3(\n transform.scale.x,\n transform.scale.y,\n transform.scale.z,\n ),\n initialSeparation: primaryHand.distanceTo(secondaryHand),\n // How the object sits relative to the anchoring hand right now, so the\n // two-hand solve picks up exactly where the one-hand hold left off.\n primaryHandOffset: this.handQuaternion(primary.input)\n .invert()\n .multiply(quatFromEulerVec(transform.rotation)),\n initialQuaternion: quatFromEulerVec(transform.rotation),\n };\n\n this.dispatch(world, entityId, (b) => b.onSecondaryGrab(secondary.input));\n }\n\n /** World point → the object's UNSCALED local space. */\n private objectLocalPoint(\n transform: TransformComponent,\n worldPoint: THREE.Vector3,\n ): THREE.Vector3 {\n const local = worldPoint\n .clone()\n .sub(\n new THREE.Vector3(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n ),\n )\n .applyQuaternion(quatFromEulerVec(transform.rotation).invert());\n // Divide out scale so the anchor stays valid when the object is resized.\n local.x /= transform.scale.x || 1;\n local.y /= transform.scale.y || 1;\n local.z /= transform.scale.z || 1;\n return local;\n }\n\n /** Whether the grab gesture for this object is currently starting. */\n private gestureMatches(\n input: XrInputState,\n interactable: XRInteractableComponent,\n starting: boolean,\n ): boolean {\n const pinch = starting ? input.selectStart : input.select;\n const full = starting ? input.squeezeStart : input.squeeze;\n switch (interactable.grabGesture) {\n case \"pinch\":\n return pinch;\n case \"full\":\n return full;\n default:\n return pinch || full;\n }\n }\n\n /** True once the gesture that started the grab has ended. */\n private wantsRelease(\n world: World,\n input: XrInputState,\n held: GrabRecord,\n ): boolean {\n const interactable = world.getComponent(\n held.entityId,\n XRInteractableComponent,\n );\n if (!interactable) return true;\n switch (interactable.grabGesture) {\n case \"pinch\":\n return input.selectEnd || !input.select;\n case \"full\":\n return input.squeezeEnd || !input.squeeze;\n default:\n return !input.select && !input.squeeze;\n }\n }\n\n /**\n * Find what this hand would grab: a physically-reachable object first, then\n * one along the pointer ray.\n *\n * Proximity wins over the ray so that reaching for something you are touching\n * never picks up a distant object behind it, which feels broken.\n */\n private findGrabCandidate(\n world: World,\n input: XrInputState,\n interactables: InteractableEntry[],\n ): { entityId: number; viaDistance: boolean; distance: number } | null {\n const hand = this.handPosition(input);\n\n let nearestId: number | null = null;\n let nearestDistance = Number.POSITIVE_INFINITY;\n for (const entry of interactables) {\n const interactable = world.getComponent(\n entry.entityId,\n XRInteractableComponent,\n );\n if (!interactable) continue;\n if (interactable.grabReach === \"distance\") continue;\n\n const position = new THREE.Vector3();\n entry.object.getWorldPosition(position);\n const distance = position.distanceTo(hand);\n if (distance <= interactable.grabRadius && distance < nearestDistance) {\n nearestDistance = distance;\n nearestId = entry.entityId;\n }\n }\n if (nearestId !== null) {\n return {\n entityId: nearestId,\n viaDistance: false,\n distance: nearestDistance,\n };\n }\n\n const hit = this.raycast(input, interactables);\n if (hit === null) return null;\n const hitId = hit.entityId;\n\n const interactable = world.getComponent(hitId, XRInteractableComponent);\n // Physical-only objects still HOVER at range (so the ray highlights them),\n // but cannot be grabbed until the user actually reaches them.\n const viaDistanceAllowed =\n interactable?.grabReach === \"distance\" ||\n interactable?.grabReach === \"both\";\n return {\n entityId: hitId,\n viaDistance: viaDistanceAllowed,\n distance: hit.distance,\n };\n }\n\n private collectInteractables(world: World): InteractableEntry[] {\n const out: InteractableEntry[] = [];\n for (const entityId of world.query(XRInteractableComponent, Object3DRef)) {\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n if (!interactable?.enabled) continue;\n if (!world.isEntityVisible(entityId)) continue;\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) {\n out.push({ entityId, object, pointable: interactable.pointable });\n }\n }\n return out;\n }\n\n /** Entity id of the nearest pointable hit along this source's ray, or null. */\n private raycast(\n input: XrInputState,\n interactables: InteractableEntry[],\n ): { entityId: number; distance: number } | null {\n if (interactables.length === 0) return null;\n this.raycaster.set(input.rayOrigin, input.rayDirection);\n this.raycaster.far = Number.POSITIVE_INFINITY;\n\n let nearestId: number | null = null;\n let nearestDistance = Number.POSITIVE_INFINITY;\n for (const entry of interactables) {\n // `pointable: false` means \"not reachable by the ray\" — a physics prop you\n // must actually walk up to. It was being ignored here, so clearing the\n // flag had no effect on ray targeting.\n if (!entry.pointable) continue;\n const hit = this.raycaster.intersectObject(entry.object, true)[0];\n if (!hit) continue;\n if (hit.distance < nearestDistance) {\n nearestDistance = hit.distance;\n nearestId = entry.entityId;\n }\n }\n return nearestId === null\n ? null\n : { entityId: nearestId, distance: nearestDistance };\n }\n\n /**\n * Pick the authored hold this hand should take.\n *\n * Filters by hand and by role — that is what makes \"the trigger hand goes on\n * the grip\" hold regardless of which hand reaches first — then takes the\n * nearest remaining one so grabbing near the foregrip picks the foregrip.\n */\n private chooseAttachPoint(\n world: World,\n input: XrInputState,\n entityId: number,\n interactable: XRInteractableComponent,\n role: \"primary\" | \"secondary\",\n ): XrAttachPoint | null {\n if (interactable.attachPoints.length === 0) return null;\n\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) return null;\n\n const taken = new Set(\n this.holdersOf(entityId)\n .map((holder) => holder.record.attachPointId)\n .filter((id): id is string => id !== null),\n );\n\n const hand = this.handPosition(input);\n const objectPosition = new THREE.Vector3(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n const objectQuaternion = quatFromEulerVec(transform.rotation);\n const scale = new THREE.Vector3(\n transform.scale.x,\n transform.scale.y,\n transform.scale.z,\n );\n\n let best: XrAttachPoint | null = null;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (const point of interactable.attachPoints) {\n if (taken.has(point.id)) continue;\n if (point.hand !== \"any\" && point.hand !== input.handedness) continue;\n if (point.role !== \"any\" && point.role !== role) continue;\n\n const world3 = new THREE.Vector3(\n point.position.x,\n point.position.y,\n point.position.z,\n )\n .multiply(scale)\n .applyQuaternion(objectQuaternion)\n .add(objectPosition);\n\n const distance = world3.distanceTo(hand);\n if (distance < bestDistance) {\n bestDistance = distance;\n best = point;\n }\n }\n\n return best;\n }\n\n private grab(\n world: World,\n input: XrInputState,\n entityId: number,\n viaDistance: boolean,\n role: \"primary\" | \"secondary\",\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n if (!transform || !interactable) return;\n\n const hand = this.handPosition(input);\n const handQuaternion = this.handQuaternion(input);\n const remote =\n viaDistance && interactable.distanceBehavior === \"remote\";\n\n let offset: THREE.Vector3;\n let remoteDistance = 0;\n\n if (remote) {\n // Keep it where it is and carry it along the ray at the same range.\n const position = new THREE.Vector3(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n remoteDistance = position.distanceTo(input.rayOrigin);\n offset = new THREE.Vector3();\n } else if (viaDistance) {\n // Snap: the object comes to the hand, positioned by the authored offset\n // so it sits where the author intended rather than at the wrist pivot.\n offset = new THREE.Vector3(\n interactable.grabOffsetPosition.x,\n interactable.grabOffsetPosition.y,\n interactable.grabOffsetPosition.z,\n );\n } else {\n // Physical: preserve the relative pose so it doesn't jump on contact.\n //\n // Stored in HAND space, not world space. A world-space offset stays put\n // as the wrist turns, so the object spun on the spot at a fixed distance\n // instead of swinging around the hand — which is why a directly-grabbed\n // object could not be turned over to inspect it, while a distance grab\n // (whose offset is ~zero) felt correct.\n offset = new THREE.Vector3(\n transform.position.x - hand.x,\n transform.position.y - hand.y,\n transform.position.z - hand.z,\n ).applyQuaternion(handQuaternion.clone().invert());\n }\n\n // Suspend simulation while held so the body follows the hand exactly\n // instead of fighting gravity; restored (and thrown) on release.\n const physics = world.getComponent(entityId, PhysicsComponent);\n let restoreBodyType: string | null = null;\n if (physics) {\n restoreBodyType = physics.values.rigidbody.type;\n physics.values.rigidbody.type = \"kinematicPosition\";\n }\n\n const tracker = new ThrowVelocityTracker();\n tracker.record(hand, this.elapsed);\n\n const attachPoint = this.chooseAttachPoint(\n world,\n input,\n entityId,\n interactable,\n role,\n );\n\n // Preserve the object's rotation relative to the hand, so it turns with the\n // wrist instead of staying stubbornly axis-aligned.\n const objectQuaternion = quatFromEulerVec(transform.rotation);\n const handRotationOffset = handQuaternion\n .clone()\n .invert()\n .multiply(objectQuaternion);\n\n this.grabs.set(input, {\n entityId,\n role,\n attachPointId: attachPoint?.id ?? null,\n attachLocal: attachPoint\n ? new THREE.Vector3(\n attachPoint.position.x,\n attachPoint.position.y,\n attachPoint.position.z,\n )\n : null,\n attachQuaternion: attachPoint\n ? quatFromEulerVec(attachPoint.rotation)\n : null,\n handRotationOffset,\n twoHand: null,\n offset,\n rotationOffset: new THREE.Quaternion().setFromEuler(\n new THREE.Euler(\n interactable.grabOffsetRotation.x,\n interactable.grabOffsetRotation.y,\n interactable.grabOffsetRotation.z,\n ),\n ),\n remoteDistance,\n remote,\n restoreBodyType,\n tracker,\n lastHandQuaternion: handQuaternion.clone(),\n angularVelocity: new THREE.Vector3(),\n });\n\n if (role === \"primary\") {\n this.dispatch(world, entityId, (b) => b.onGrab(input));\n }\n }\n\n /** Drive every held object, once each, after grabs and releases settle. */\n private moveAllHeld(world: World, deltaTime: number): void {\n const done = new Set<number>();\n for (const [input, record] of this.grabs) {\n if (done.has(record.entityId)) continue;\n done.add(record.entityId);\n\n const holders = this.holdersOf(record.entityId);\n if (holders.length >= 2) {\n this.moveTwoHand(world, record.entityId, holders, deltaTime);\n } else {\n this.moveHeld(world, input, record, deltaTime);\n }\n }\n }\n\n /** Solve and apply a two-hand hold. */\n private moveTwoHand(\n world: World,\n entityId: number,\n holders: Array<{ input: XrInputState; record: GrabRecord }>,\n deltaTime: number,\n ): void {\n const primary = holders.find((h) => h.record.role === \"primary\");\n const secondary = holders.find((h) => h.record.role === \"secondary\");\n const transform = world.getComponent(entityId, TransformComponent);\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n const basis = primary?.record.twoHand ?? null;\n\n // Missing basis means the second hand arrived without beginTwoHand running;\n // fall back to a one-hand hold rather than freezing the object.\n if (!primary || !secondary || !transform || !interactable || !basis) {\n if (primary) {\n this.moveHeld(world, primary.input, primary.record, deltaTime);\n }\n return;\n }\n\n const primaryHand = this.handPosition(primary.input);\n const primaryQuaternion = this.handQuaternion(primary.input);\n\n const solved = solveTwoHandTransform(\n { position: primaryHand, quaternion: primaryQuaternion },\n {\n position: this.handPosition(secondary.input),\n quaternion: this.handQuaternion(secondary.input),\n },\n basis,\n {\n rotationMode: interactable.twoHandRotation,\n allowScale: interactable.allowTwoHandScale,\n minScale: interactable.minScale,\n maxScale: interactable.maxScale,\n },\n );\n\n transform.position.x = solved.position.x;\n transform.position.y = solved.position.y;\n transform.position.z = solved.position.z;\n writeEuler(transform.rotation, solved.quaternion);\n\n if (interactable.allowTwoHandScale) {\n transform.scale.x = solved.scale.x;\n transform.scale.y = solved.scale.y;\n transform.scale.z = solved.scale.z;\n }\n\n // Throw velocity tracks the PRIMARY hand: releasing a two-hand hold should\n // throw the way the anchoring hand was moving, not some blend that matches\n // neither hand.\n primary.record.tracker.record(primaryHand, this.elapsed);\n primary.record.angularVelocity = angularVelocityFrom(\n primary.record.lastHandQuaternion,\n primaryQuaternion,\n deltaTime,\n );\n primary.record.lastHandQuaternion = primaryQuaternion.clone();\n }\n\n private moveHeld(\n world: World,\n input: XrInputState,\n held: GrabRecord,\n deltaTime: number,\n ): void {\n const transform = world.getComponent(held.entityId, TransformComponent);\n if (!transform) return;\n\n const hand = this.handPosition(input);\n const handQuaternion = this.handQuaternion(input);\n\n // Rotation: an authored hold aligns its own frame to the hand; a free grab\n // keeps the relative rotation it was picked up with. Nothing wrote rotation\n // at all before, so held objects could not be aimed and the authored\n // rotation offset had no effect.\n const objectQuaternion = held.attachQuaternion\n ? handQuaternion\n .clone()\n .multiply(held.rotationOffset)\n .multiply(held.attachQuaternion.clone().invert())\n : handQuaternion.clone().multiply(held.handRotationOffset);\n\n if (held.remote) {\n // Ride the ray at the distance it was grabbed from.\n const target = new THREE.Vector3()\n .copy(input.rayDirection)\n .multiplyScalar(held.remoteDistance)\n .add(input.rayOrigin);\n transform.position.x = target.x;\n transform.position.y = target.y;\n transform.position.z = target.z;\n writeEuler(transform.rotation, objectQuaternion);\n } else if (held.attachLocal) {\n // Place the object so its authored hold sits exactly on the hand.\n const anchor = held.attachLocal\n .clone()\n .multiply(\n new THREE.Vector3(\n transform.scale.x,\n transform.scale.y,\n transform.scale.z,\n ),\n )\n .applyQuaternion(objectQuaternion);\n transform.position.x = hand.x - anchor.x;\n transform.position.y = hand.y - anchor.y;\n transform.position.z = hand.z - anchor.z;\n writeEuler(transform.rotation, objectQuaternion);\n } else {\n // Hand-space offset rotated back into the world, so the object rides the\n // wrist rigidly rather than hovering at a fixed world displacement.\n const carried = held.offset.clone().applyQuaternion(handQuaternion);\n transform.position.x = hand.x + carried.x;\n transform.position.y = hand.y + carried.y;\n transform.position.z = hand.z + carried.z;\n writeEuler(transform.rotation, objectQuaternion);\n }\n\n // Sample for the throw, and track hand spin for angular release.\n held.tracker.record(\n held.remote\n ? new THREE.Vector3(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n )\n : hand,\n this.elapsed,\n );\n // Track hand spin so a thrown object tumbles instead of sliding flat.\n held.angularVelocity = angularVelocityFrom(\n held.lastHandQuaternion,\n handQuaternion,\n deltaTime,\n );\n held.lastHandQuaternion = handQuaternion;\n }\n\n private release(world: World, input: XrInputState): void {\n const held = this.grabs.get(input);\n if (!held) return;\n this.grabs.delete(input);\n\n const interactable = world.getComponent(\n held.entityId,\n XRInteractableComponent,\n );\n\n // ── Still held by the other hand? Then this is not a drop. ──────────────\n //\n // Letting go with one hand of a two-hand hold must leave the object in the\n // remaining hand. Restoring physics or throwing here would rip it away\n // mid-grip — the object would launch out of the hand still holding it.\n const remaining = this.holdersOf(held.entityId);\n if (remaining.length > 0 && interactable) {\n if (held.role === \"secondary\") {\n // The steering hand let go; the anchoring hand keeps it. Drop the\n // two-hand basis and re-derive the one-hand hold from where the object\n // ended up, so it does not snap back to its pre-scale pose.\n const primary = remaining.find((h) => h.record.role === \"primary\");\n if (primary) {\n primary.record.twoHand = null;\n this.reanchor(world, primary.input, primary.record, interactable);\n }\n this.dispatch(world, held.entityId, (b) =>\n b.onSecondaryRelease(input),\n );\n } else {\n // The anchoring hand let go: PROMOTE the other hand rather than\n // dropping the object, which is what a real hand-over-hand regrip does.\n const next = remaining[0];\n next.record.role = \"primary\";\n next.record.twoHand = null;\n // The promoted hand inherits the throw bookkeeping, so a two-hand hold\n // released one hand at a time can still be thrown.\n next.record.restoreBodyType = held.restoreBodyType;\n this.reanchor(world, next.input, next.record, interactable);\n this.dispatch(world, held.entityId, (b) => b.onRelease(input));\n }\n held.tracker.clear();\n return;\n }\n const physics = world.getComponent(held.entityId, PhysicsComponent);\n\n if (held.restoreBodyType !== null && physics) {\n physics.values.rigidbody.type =\n held.restoreBodyType as typeof physics.values.rigidbody.type;\n\n // Hand the object the momentum it was moving with. Without this a thrown\n // ball simply drops at the release point, which is the difference between\n // \"put down\" and \"throw\" — and the whole point of physics grabs.\n const dynamic = held.restoreBodyType === \"dynamic\";\n if (dynamic && interactable?.applyVelocityOnRelease) {\n const velocity = held.tracker\n .computeVelocity(this.elapsed)\n .multiplyScalar(interactable.velocityScale);\n const spin = held.angularVelocity;\n // QUEUED rather than applied here: the body is still kinematic at this\n // instant and Rapier ignores velocity on kinematic bodies. PhysicsSync\n // applies it in the same tick it turns the body dynamic again.\n setPhysicsLiveRef(physics, \"pendingVelocity\", {\n linear: { x: velocity.x, y: velocity.y, z: velocity.z },\n angular: { x: spin.x, y: spin.y, z: spin.z },\n });\n }\n }\n\n held.tracker.clear();\n this.dispatch(world, held.entityId, (b) => b.onRelease(input));\n }\n\n private releaseAll(world: World): void {\n for (const input of Array.from(this.grabs.keys())) {\n this.release(world, input);\n }\n }\n\n /**\n * Where the \"hand\" is. Controllers and tracked hands report a grip pose;\n * gaze and transient-pointer sources have none, so we hold the object a fixed\n * distance along the ray instead — which is what makes Vision Pro work.\n */\n private handPosition(input: XrInputState): THREE.Vector3 {\n if (input.gripPosition) return input.gripPosition;\n return new THREE.Vector3()\n .copy(input.rayDirection)\n .multiplyScalar(RAYLESS_HOLD_DISTANCE)\n .add(input.rayOrigin);\n }\n\n /**\n * Hand orientation. Grip-less sources (gaze / transient-pointer) have none,\n * so we derive one from the aim direction — enough for spin on release.\n */\n private handQuaternion(input: XrInputState): THREE.Quaternion {\n if (input.gripQuaternion) return input.gripQuaternion.clone();\n return new THREE.Quaternion().setFromUnitVectors(\n new THREE.Vector3(0, 0, -1),\n input.rayDirection.clone().normalize(),\n );\n }\n\n private dispatch(\n world: World,\n entityId: number,\n visit: (behaviour: Behaviour) => void,\n ): void {\n const script = world.getComponent(entityId, ScriptComponent);\n const instances = script?.scriptInstances;\n if (!instances) return;\n for (const instance of instances.values()) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n visit(instance);\n } catch (error) {\n console.error(\"[XRInteractionSystem] Behaviour hook failed:\", error);\n }\n }\n }\n\n /** Entity currently under a pointer this frame, or null. */\n getHoveredEntityId(): number | null {\n return this.hoveredEntityId;\n }\n\n /**\n * What this hand is pointing at, with the distance to it.\n *\n * The distance is what lets the pointer ray stop at the surface instead of\n * passing through the object.\n */\n getHoverFor(\n handedness: XrInputState[\"handedness\"],\n ): { entityId: number; distance: number } | null {\n for (const [input, hover] of this.hovers) {\n if (input.handedness === handedness) return hover;\n }\n return null;\n }\n\n /** Every entity under a pointer this frame — drives hover feedback. */\n getHoveredEntityIds(): Set<number> {\n const ids = new Set<number>();\n for (const hover of this.hovers.values()) ids.add(hover.entityId);\n return ids;\n }\n\n /** Entities currently held, so hover feedback can skip them. */\n getHeldEntityIds(): Set<number> {\n const ids = new Set<number>();\n for (const record of this.grabs.values()) ids.add(record.entityId);\n return ids;\n }\n\n /** True when any source is holding something. */\n isGrabbing(): boolean {\n return this.grabs.size > 0;\n }\n\n /**\n * Whether this input's primary action is committed to interaction.\n *\n * True while the source holds something, and also while it merely HOVERS a\n * grabbable — because the pinch that is about to grab must not be read as a\n * teleport by the locomotion system. Without the hover half, the first pinch\n * of a grab teleports the player, and so does the pinch that takes an object\n * from the other hand.\n *\n * Keyed on the INPUT SOURCE rather than handedness. Vision Pro reports\n * `handedness: \"none\"` for every gaze-pinch (it is hard-coded in WebKit), so a\n * handedness-keyed check silently never matched there and each pinch both\n * grabbed and teleported.\n */\n isSourceBusy(world: World, input: XrInputState): boolean {\n if (this.grabs.has(input)) return true;\n\n const hover = this.hovers.get(input);\n if (!hover) return false;\n\n const interactable = world.getComponent(\n hover.entityId,\n XRInteractableComponent,\n );\n return Boolean(interactable?.enabled && interactable.grabbable);\n }\n\n /** True when THIS hand is holding something. */\n isGrabbingWith(handedness: XrInputState[\"handedness\"]): boolean {\n for (const input of this.grabs.keys()) {\n if (input.handedness === handedness) return true;\n }\n return false;\n }\n\n /**\n * How an entity is currently held.\n *\n * Exposed for scripts: a Behaviour can poll this in `onUpdate` to drive\n * two-hand-specific behaviour — showing a bipod when both hands are on a\n * weapon, reading the live hand separation to gate a gesture, or reacting to\n * the scale a pull-apart produced. Returns null when nothing holds it.\n */\n getGrabInfo(entityId: number): {\n hands: number;\n primaryHandedness: XrInputState[\"handedness\"] | null;\n secondaryHandedness: XrInputState[\"handedness\"] | null;\n /** Metres between the hands, or null unless two hands are on it. */\n handSeparation: number | null;\n /** The attach point ids in use, in holder order. */\n attachPointIds: Array<string | null>;\n } | null {\n const holders = this.holdersOf(entityId);\n if (holders.length === 0) return null;\n\n const primary = holders.find((h) => h.record.role === \"primary\");\n const secondary = holders.find((h) => h.record.role === \"secondary\");\n\n return {\n hands: holders.length,\n primaryHandedness: primary?.input.handedness ?? null,\n secondaryHandedness: secondary?.input.handedness ?? null,\n handSeparation:\n primary && secondary\n ? this.handPosition(primary.input).distanceTo(\n this.handPosition(secondary.input),\n )\n : null,\n attachPointIds: holders.map((h) => h.record.attachPointId),\n };\n }\n}\n","import * as THREE from \"three\";\n\n/**\n * Projectile-arc sampling for teleport aiming.\n *\n * A straight ray makes distance impossible to judge in VR — it gives the eye no\n * cue about where it meets the floor, so users consistently over- or\n * under-shoot. A ballistic arc reads as a thrown object: the apex and the\n * downward approach tell you exactly where it lands. Every mature VR locomotion\n * implementation uses one.\n *\n * Pure and side-effect free so the curve can be unit-tested without a headset.\n */\n\n/** Downward acceleration applied to the aim curve, m/s². */\nexport const ARC_GRAVITY = 9.8;\n/** Launch speed of the virtual projectile, m/s. Tuned for ~5-8m reach. */\nexport const ARC_SPEED = 7;\n/** Samples along the curve. Enough to look smooth without wasting raycasts. */\nexport const ARC_STEPS = 24;\n/** Seconds of flight to simulate before giving up on finding ground. */\nexport const ARC_MAX_TIME = 2;\n\n/**\n * Sample a ballistic curve starting at `origin` heading along `direction`.\n *\n * Returns points in world space, oldest first. The caller raycasts consecutive\n * pairs to find where the arc meets a teleport surface — sampling and\n * intersection are kept separate so this stays testable.\n */\nexport function sampleTeleportArc(\n origin: THREE.Vector3,\n direction: THREE.Vector3,\n out: THREE.Vector3[] = [],\n options?: { speed?: number; gravity?: number; steps?: number; maxTime?: number },\n): THREE.Vector3[] {\n const speed = options?.speed ?? ARC_SPEED;\n const gravity = options?.gravity ?? ARC_GRAVITY;\n const steps = Math.max(2, options?.steps ?? ARC_STEPS);\n const maxTime = options?.maxTime ?? ARC_MAX_TIME;\n\n // Reuse the caller's array so aiming every frame doesn't churn the heap.\n out.length = 0;\n\n const velocity = direction.clone().normalize().multiplyScalar(speed);\n for (let i = 0; i < steps; i += 1) {\n const t = (i / (steps - 1)) * maxTime;\n out.push(\n new THREE.Vector3(\n origin.x + velocity.x * t,\n origin.y + velocity.y * t - 0.5 * gravity * t * t,\n origin.z + velocity.z * t,\n ),\n );\n }\n return out;\n}\n\n/**\n * Where a sampled arc first crosses `groundY` going downward, or null.\n *\n * Used as a cheap pre-check before raycasting: if the curve never descends to\n * the floor plane there is nothing to hit, so we can skip the per-segment\n * intersection work entirely.\n */\nexport function arcGroundCrossing(\n points: THREE.Vector3[],\n groundY: number,\n): THREE.Vector3 | null {\n for (let i = 1; i < points.length; i += 1) {\n const previous = points[i - 1];\n const current = points[i];\n if (previous.y >= groundY && current.y <= groundY) {\n const span = previous.y - current.y;\n // Guard the degenerate flat segment so we never divide by ~0.\n const alpha = span > 1e-6 ? (previous.y - groundY) / span : 0;\n return new THREE.Vector3().lerpVectors(previous, current, alpha);\n }\n }\n return null;\n}\n","/**\n * Decides when a teleport may actually commit.\n *\n * Teleport commits on RELEASE so the user can cancel by aiming away — the\n * standard interaction. The trap is that a release edge alone is not evidence\n * of intent: on hand tracking the SAME pinch drives grabbing, so the release\n * that drops an object looks identical to the release that ends a teleport aim.\n * Without this gate, letting go of a grabbed object teleports the player\n * whenever the arc happens to land somewhere valid — and passing an object\n * between hands does it too.\n *\n * The rule is simply: a release only commits if this source engaged an aim\n * first, and going busy (grabbing) discards any aim it had engaged.\n *\n * Keyed per input source so the two hands are independent.\n */\nexport class TeleportAimGate {\n private readonly aiming = new WeakSet<object>();\n\n /**\n * Feed one frame for one source.\n *\n * @returns whether the teleport should commit this frame.\n */\n update(source: object, aiming: boolean, releasing: boolean): boolean {\n const hadAim = this.aiming.has(source);\n if (aiming) this.aiming.add(source);\n\n if (!releasing) return false;\n\n this.aiming.delete(source);\n // `aiming` counts on the release frame too. A Vision Pro gaze-pinch is a\n // quick tap whose start and end can land in the SAME animation frame, and\n // requiring the aim to be strictly earlier made that gesture unable to\n // teleport at all. A grab release still cannot commit, because by then the\n // pinch is over — `aiming` is false and any earlier aim was cancelled when\n // the hand went busy.\n return hadAim || aiming;\n }\n\n /** True if this source currently has an aim engaged. */\n isAiming(source: object): boolean {\n return this.aiming.has(source);\n }\n\n /**\n * Drop a source's aim without committing.\n *\n * Called when a hand starts interacting, so the release that ends the grab\n * cannot cash in an aim engaged before it.\n *\n * @returns whether an aim was actually discarded.\n */\n cancel(source: object): boolean {\n return this.aiming.delete(source);\n }\n}\n","import * as THREE from \"three\";\nimport { CameraComponent } from \"../components/Camera\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { ParentId } from \"../components/ParentId\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { VRTeleportAreaComponent } from \"../components/VRTeleportArea\";\nimport { XRRigComponent } from \"../components/XRRig\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport { sampleTeleportArc } from \"../xr/teleportArc\";\nimport type { XrInputState } from \"../xr/types\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\nimport { TeleportAimGate } from \"../xr/teleportAimGate\";\nimport type { XRInteractionSystem } from \"./XRInteractionSystem\";\n\n/**\n * Moves the player through the scene.\n *\n * Writes to the RIG's `TransformComponent`, never the camera's: three composes\n * the render camera as `rig.matrixWorld × headPose`, so the rig is the only\n * movable handle. (`TransformSyncSystem` deliberately skips the XR camera for\n * the same reason — see `World.isXrPresenting`.)\n *\n * Teleport aims along a ballistic ARC rather than a straight ray, because a\n * straight line gives the eye no cue about where it meets the floor. The arc is\n * raycast segment-by-segment against {@link VRTeleportAreaComponent} surfaces,\n * so destinations remain an explicit allow-list.\n */\n\nconst UP = new THREE.Vector3(0, 1, 0);\n/** Deadzone below which stick noise is ignored. */\nconst AXIS_DEADZONE = 0.5;\n\nexport class XRLocomotionSystem implements EcsSystem {\n private readonly inputSystem: XRInputSystem;\n private readonly raycaster = new THREE.Raycaster();\n /** Per-source latch so one stick push yields exactly one snap turn. */\n private readonly turnLatched = new WeakSet<object>();\n /** Reused arc buffer — aiming runs every frame. */\n private readonly arcPoints: THREE.Vector3[] = [];\n /** Curve up to the landing point, for the visual system. Empty when not aiming. */\n private aimCurve: THREE.Vector3[] = [];\n private landingPoint: THREE.Vector3 | null = null;\n /** True when the current aim lands somewhere the player may actually stand. */\n private aimValid = false;\n /** Sources currently aiming via thumbstick (hysteresis, so it doesn't chatter). */\n private readonly stickAiming = new WeakSet<object>();\n /** One-time warning when a committed teleport found nowhere to land. */\n private warnedNoLanding = false;\n /** Gates teleport commits on a prior aim. See {@link TeleportAimGate}. */\n private readonly teleportAim = new TeleportAimGate();\n /** True once we've tried to self-heal camera parenting for this session. */\n private parentingChecked = false;\n\n /**\n * Optional; when wired, hands busy grabbing are excluded from teleport.\n *\n * On hand tracking the SAME pinch drives both grabbing and teleport aiming,\n * so without this a user who picks something up is teleported at the same\n * moment.\n */\n private interactionSystem: XRInteractionSystem | null = null;\n\n /** Wire the interaction system so grabs suppress teleport on that hand. */\n setInteractionSystem(interactionSystem: XRInteractionSystem | null): void {\n this.interactionSystem = interactionSystem;\n }\n\n constructor(inputSystem: XRInputSystem) {\n this.inputSystem = inputSystem;\n }\n\n update(world: World, deltaTime: number): void {\n this.aimCurve = [];\n this.landingPoint = null;\n this.aimValid = false;\n\n if (!world.isXrPresenting()) {\n this.parentingChecked = false;\n return;\n }\n\n if (!this.parentingChecked) {\n this.parentingChecked = true;\n this.ensureCameraUnderRig(world);\n this.warnOnIncompleteSetup(world);\n }\n\n const rigEntityId = world.query(XRRigComponent, TransformComponent)[0];\n if (typeof rigEntityId !== \"number\") return;\n\n const rig = world.getComponent(rigEntityId, XRRigComponent);\n const rigTransform = world.getComponent(rigEntityId, TransformComponent);\n if (!rig || !rigTransform) return;\n\n const inputs = this.inputSystem.getInputs();\n if (inputs.length === 0) return;\n\n if (rig.snapTurn) {\n this.applySnapTurn(rig, rigTransform, inputs);\n }\n\n if (rig.locomotion === \"teleport\") {\n this.applyTeleport(world, rigTransform, inputs);\n } else if (rig.locomotion === \"smooth\") {\n this.applySmoothMove(world, rig, rigTransform, inputs, deltaTime);\n }\n }\n\n /**\n * Name what is missing, once per session.\n *\n * Inside a headset there is no console and no inspector, so a scene that\n * simply cannot move gives the author nothing to go on. These messages are\n * visible over remote debugging and say exactly which entity to add.\n */\n private warnOnIncompleteSetup(world: World): void {\n if (typeof world.query(XRRigComponent)[0] !== \"number\") {\n console.warn(\n \"[XRLocomotion] No XR Rig in this scene — the player cannot move. \" +\n \"Add one via Add Object → VR → XR Rig (the scene camera is parented to it automatically).\",\n );\n return;\n }\n if (world.query(VRTeleportAreaComponent).length === 0) {\n console.warn(\n \"[XRLocomotion] No Teleport Area in this scene — teleport has nowhere to land. \" +\n \"Add one via Add Object → VR → Teleport Area, or add a Teleport Area component to an existing floor.\",\n );\n }\n }\n\n /**\n * Guarantee the render camera is a CHILD of the rig.\n *\n * Locomotion moves the rig, and three composes the head pose against\n * `camera.parent` — so if the camera sits at the scene root instead, moving\n * the rig does nothing at all and the player is frozen in place. Scenes\n * authored before the rig existed (or with the camera re-parented by hand)\n * would otherwise silently fail to move, which is exactly the symptom that is\n * hardest to diagnose from inside a headset. Repairing it via `ParentId` lets\n * `ObjectManagementSystem` reconcile the scene graph normally.\n */\n private ensureCameraUnderRig(world: World): void {\n const rigEntityId = world.query(XRRigComponent)[0];\n if (typeof rigEntityId !== \"number\") return;\n\n const activeCamera = world.getCamera();\n for (const entityId of world.query(CameraComponent, Object3DRef)) {\n if (world.getComponent(entityId, Object3DRef)?.object !== activeCamera) {\n continue;\n }\n\n const parent = world.getComponent(entityId, ParentId);\n if (parent) {\n if (parent.value !== rigEntityId) parent.value = rigEntityId;\n } else {\n world.addComponent(entityId, new ParentId(rigEntityId));\n }\n return;\n }\n }\n\n /**\n * Snap turning, not smooth turning — rotating the view continuously is the\n * single biggest cause of VR nausea, so the comfort-safe option is what's\n * wired to the stick.\n */\n private applySnapTurn(\n rig: XRRigComponent,\n transform: TransformComponent,\n inputs: XrInputState[],\n ): void {\n for (const input of inputs) {\n if (!input.hasAxes || input.axes.length < 3) continue;\n // WebXR standard mapping: axes[2] is thumbstick X.\n const x = input.axes[2] ?? 0;\n const source = input as unknown as object;\n\n if (Math.abs(x) < AXIS_DEADZONE) {\n this.turnLatched.delete(source);\n continue;\n }\n if (this.turnLatched.has(source)) continue;\n\n this.turnLatched.add(source);\n transform.rotation.y -= Math.sign(x) * THREE.MathUtils.degToRad(rig.snapTurnDegrees);\n }\n }\n\n private applySmoothMove(\n world: World,\n rig: XRRigComponent,\n transform: TransformComponent,\n inputs: XrInputState[],\n deltaTime: number,\n ): void {\n for (const input of inputs) {\n if (!input.hasAxes || input.axes.length < 2) continue;\n const x = input.axes[0] ?? 0;\n const y = input.axes[1] ?? 0;\n if (Math.abs(x) < 0.15 && Math.abs(y) < 0.15) continue;\n\n // Move relative to where the user is LOOKING, which is what players\n // expect, rather than relative to the rig's own yaw.\n const camera = world.getCamera();\n const forward = new THREE.Vector3();\n camera.getWorldDirection(forward);\n forward.y = 0;\n if (forward.lengthSq() < 1e-6) continue;\n forward.normalize();\n\n const right = new THREE.Vector3().crossVectors(forward, UP).normalize();\n const step = rig.moveSpeed * Math.max(0, deltaTime);\n\n transform.position.x += (forward.x * -y + right.x * x) * step;\n transform.position.z += (forward.z * -y + right.z * x) * step;\n }\n }\n\n private applyTeleport(\n world: World,\n transform: TransformComponent,\n inputs: XrInputState[],\n ): void {\n const targets = this.collectTeleportTargets(world);\n // NOTE: deliberately NOT early-returning on an empty target list. A scene\n // with no teleport area is the most common setup mistake, and bailing here\n // would show nothing at all — indistinguishable from broken input. Falling\n // through renders an invalid arc instead, which points straight at the fix.\n\n for (const input of inputs) {\n // A hand that is grabbing — or about to — owns its own pinch. Reading it\n // as teleport too would move the player every time they pick something\n // up, or pass an object from one hand to the other.\n const source = input as unknown as object;\n\n // Per SOURCE, not per handedness: Vision Pro reports `handedness: \"none\"`\n // for every gaze-pinch, so a handedness-keyed check never matched and each\n // pinch both grabbed and teleported.\n if (this.interactionSystem?.isSourceBusy(world, input)) {\n // Forget any aim this hand had engaged before it went to grab, so the\n // eventual release of that grab cannot commit a stale teleport.\n if (this.teleportAim.cancel(source)) {\n this.aimCurve = [];\n this.landingPoint = null;\n this.aimValid = false;\n }\n continue;\n }\n\n const stick = this.readStickAim(input, source);\n\n // Aim on either the primary action (trigger / pinch / gaze-pinch) or a\n // forward push on the thumbstick. Quest and Pico users reach for the\n // stick by convention, so supporting only the trigger reads as \"teleport\n // is broken\" on the very devices most likely to be tested first.\n // `selectStart` counts as aiming even when `select` was already cleared\n // by a same-frame `selectend` — a Vision Pro tap can do exactly that.\n const aiming = input.select || input.selectStart || stick.aiming;\n\n // A transient source — Vision Pro's gaze-pinch — is DESTROYED at the end\n // of the gesture, and its `selectend` has to be latched from a source that\n // has already left `session.inputSources`. Treating the disappearance of a\n // source that WAS aiming as a release as well means the teleport still\n // commits even if that edge is missed, which is exactly the failure where\n // the arc appears but releasing does nothing. Held controllers stay\n // connected, so this never fires on Quest.\n const vanished = !input.connected && this.teleportAim.isAiming(source);\n const releasing = input.selectEnd || stick.released || vanished;\n\n // Only a release that FOLLOWS an aim may teleport. Without this, any\n // stray release — most importantly the one that ends a grab — commits a\n // teleport as long as the arc happens to land somewhere valid.\n const commit = this.teleportAim.update(source, aiming, releasing);\n\n if (!aiming && !commit) continue;\n\n const points = sampleTeleportArc(\n input.rayOrigin,\n input.rayDirection,\n this.arcPoints,\n );\n const hit = this.raycastArc(points, targets);\n\n // Always publish the curve while aiming, even when it lands nowhere\n // valid. Hiding it entirely leaves the user unable to tell a missing\n // teleport area from broken input — showing an INVALID arc makes the\n // scene-setup problem obvious instead of silent.\n this.aimCurve = hit\n ? points.slice(0, hit.segmentIndex + 1).concat(hit.point)\n : points.slice();\n this.landingPoint = hit ? hit.point : null;\n this.aimValid = hit !== null;\n\n // Commit on RELEASE so the user can cancel by aiming away — the standard\n // teleport interaction.\n if (commit && hit) {\n transform.position.x = hit.point.x;\n transform.position.y = hit.point.y;\n transform.position.z = hit.point.z;\n this.aimCurve = [];\n this.landingPoint = null;\n this.aimValid = false;\n } else if (commit) {\n // Released with a real aim, but the arc landed on nothing teleportable.\n // Saying so separates a scene-setup problem (no Teleport Area under the\n // arc) from an input problem, which are indistinguishable on a headset.\n if (!this.warnedNoLanding) {\n this.warnedNoLanding = true;\n console.warn(\n \"[XRLocomotionSystem] Teleport released but the arc did not land on a Teleport Area. \" +\n \"Add a teleportArea entity where the player should be able to go.\",\n );\n }\n this.aimCurve = [];\n this.aimValid = false;\n }\n }\n }\n\n /**\n * Thumbstick-forward aiming with hysteresis.\n *\n * Engaging at 0.6 and releasing at 0.3 stops a stick resting near the\n * threshold from flickering the arc on and off — and the release edge is what\n * commits the teleport, so chatter there would teleport the player randomly.\n */\n private readStickAim(\n input: XrInputState,\n source: object,\n ): { aiming: boolean; released: boolean } {\n if (!input.hasAxes || input.axes.length < 4) {\n return { aiming: false, released: false };\n }\n // xr-standard mapping: axes[3] is thumbstick Y, negative = pushed forward.\n const forward = -(input.axes[3] ?? 0);\n const wasAiming = this.stickAiming.has(source);\n\n if (!wasAiming && forward > 0.6) {\n this.stickAiming.add(source);\n return { aiming: true, released: false };\n }\n if (wasAiming && forward < 0.3) {\n this.stickAiming.delete(source);\n return { aiming: false, released: true };\n }\n return { aiming: wasAiming, released: false };\n }\n\n /** Walk the arc segment-by-segment, returning the first surface hit. */\n private raycastArc(\n points: THREE.Vector3[],\n targets: THREE.Object3D[],\n ): { point: THREE.Vector3; segmentIndex: number } | null {\n if (targets.length === 0) return null;\n for (let i = 1; i < points.length; i += 1) {\n const from = points[i - 1];\n const to = points[i];\n const delta = new THREE.Vector3().subVectors(to, from);\n const distance = delta.length();\n if (distance < 1e-6) continue;\n\n this.raycaster.set(from, delta.divideScalar(distance));\n this.raycaster.far = distance;\n const hit = this.raycaster.intersectObjects(targets, true)[0];\n if (hit) {\n return { point: hit.point.clone(), segmentIndex: i - 1 };\n }\n }\n return null;\n }\n\n private collectTeleportTargets(world: World): THREE.Object3D[] {\n const objects: THREE.Object3D[] = [];\n for (const entityId of world.query(VRTeleportAreaComponent, Object3DRef)) {\n const area = world.getComponent(entityId, VRTeleportAreaComponent);\n if (!area?.enabled) continue;\n if (!world.isEntityVisible(entityId)) continue;\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) objects.push(object);\n }\n return objects;\n }\n\n /** Arc points up to the landing spot this frame; empty when not aiming. */\n getAimCurve(): THREE.Vector3[] {\n return this.aimCurve;\n }\n\n /** True when the aim lands on a valid teleport area. */\n isAimValid(): boolean {\n return this.aimValid;\n }\n\n /** Where the arc currently lands, or null when not aiming at a valid area. */\n getLandingPoint(): THREE.Vector3 | null {\n return this.landingPoint;\n }\n}\n","import type * as THREE from \"three\";\nimport type { XrHandJoints } from \"./handPose\";\n\n/**\n * Shared vocabulary for the WebXR layer.\n *\n * The single most important design constraint here: **the three target\n * platforms expose fundamentally different input models**, and a runtime that\n * hard-codes one of them silently excludes the others.\n *\n * - Meta Quest / Pico → motion controllers (trigger, grip, thumbstick) and,\n * optionally, tracked hands.\n * - Android XR → tracked hands are the PRIMARY input.\n * - Apple Vision Pro → no controllers at all. Input arrives as\n * `transient-pointer` sources that exist ONLY for the duration of a\n * gaze-and-pinch, appearing on pinch-start and disappearing on release.\n *\n * {@link XrInputState} normalizes all three into one shape so gameplay code and\n * Behaviours are written once. Anything platform-specific is expressed as a\n * capability (`kind`, `hasAxes`) rather than a branch on device name — we never\n * sniff the user agent, per the WebXR guidance from every vendor.\n */\n\n/** Which hand an input source belongs to (`none` for gaze / single-source devices). */\nexport type XrHandedness = \"left\" | \"right\" | \"none\";\n\n/**\n * How an input source is physically driven.\n *\n * `transient-pointer` is the Vision Pro case: the source is EPHEMERAL — it is\n * created when the user pinches and destroyed when they release, so it must\n * never be cached across frames by identity.\n */\nexport type XrInputKind = \"controller\" | \"hand\" | \"transient-pointer\" | \"gaze\";\n\n/**\n * One frame of normalized input for a single source.\n *\n * Boolean actions follow the same pending→latched contract as the desktop\n * `InputSystem`: `select` is the held state, while `selectStart` / `selectEnd`\n * are true for exactly one frame. This lets Behaviours poll (`if (select)`) or\n * edge-detect (`if (selectStart)`) without subscribing to events.\n */\nexport type XrInputState = {\n handedness: XrHandedness;\n kind: XrInputKind;\n /** False once the source disconnects (a released pinch on Vision Pro). */\n connected: boolean;\n /** Pointing ray in WORLD space, from the source's `targetRaySpace`. */\n rayOrigin: THREE.Vector3;\n rayDirection: THREE.Vector3;\n /** Physical grip pose. Null for gaze and transient-pointer, which have no grip. */\n gripPosition: THREE.Vector3 | null;\n gripQuaternion: THREE.Quaternion | null;\n /** Primary action: controller trigger, hand pinch, or Vision Pro gaze-pinch. */\n select: boolean;\n selectStart: boolean;\n selectEnd: boolean;\n /** Secondary action: controller grip squeeze. Never fires for hands/gaze. */\n squeeze: boolean;\n squeezeStart: boolean;\n squeezeEnd: boolean;\n /** Thumbstick / trackpad axes in [-1, 1]. Empty when {@link hasAxes} is false. */\n axes: number[];\n /** True only for sources with a physical stick — gates stick-driven locomotion. */\n hasAxes: boolean;\n /** Raw gamepad button pressed-states, when the source exposes a gamepad. */\n buttons: boolean[];\n\n /**\n * Tracked hand joint positions, world space, or null for controllers.\n *\n * Positions only — pose matching is position-based so it works identically\n * against WebXR, a simulator, or a recorded hand.\n */\n joints: XrHandJoints | null;\n};\n\n/**\n * What the ACTIVE session actually granted us.\n *\n * Always derived from `XRSession.enabledFeatures` — never from the device name.\n * A feature being requested is not a promise it was granted, and support varies\n * sharply per platform (e.g. Vision Pro grants no `immersive-ar` at all today).\n */\nexport type XrCapabilities = {\n /** The session's mode. `immersive-ar` implies passthrough / mixed reality. */\n mode: \"immersive-vr\" | \"immersive-ar\" | \"inline\";\n /** Tracked-hand joint data is available. */\n handTracking: boolean;\n /** Real-world plane detection (incubating; effectively Quest-only today). */\n planeDetection: boolean;\n /** Real-world mesh detection (draft spec; Quest-only today). */\n meshDetection: boolean;\n /** Per-frame depth buffer (Android XR stereo, Quest experimental). */\n depthSensing: boolean;\n /** Spatial anchors. */\n anchors: boolean;\n /** Ray-against-real-world hit testing. */\n hitTest: boolean;\n /** Everything the UA reported, verbatim, for diagnostics. */\n enabledFeatures: string[];\n};\n\n/** Capabilities for \"no session running\" — every feature off. */\nexport const NO_XR_CAPABILITIES: XrCapabilities = {\n mode: \"inline\",\n handTracking: false,\n planeDetection: false,\n meshDetection: false,\n depthSensing: false,\n anchors: false,\n hitTest: false,\n enabledFeatures: [],\n};\n\n/**\n * Read granted features off a live session.\n *\n * `enabledFeatures` is optional in the spec and missing on some UAs; when it is\n * absent we report nothing as granted rather than optimistically assuming\n * support, so callers degrade instead of calling an API that will throw.\n */\nexport function readXrCapabilities(\n session: XRSession | null,\n mode: XrCapabilities[\"mode\"] = \"immersive-vr\",\n): XrCapabilities {\n if (!session) return NO_XR_CAPABILITIES;\n\n const raw = (session as { enabledFeatures?: readonly string[] })\n .enabledFeatures;\n const features = Array.isArray(raw) ? Array.from(raw) : [];\n const has = (name: string) => features.includes(name);\n\n return {\n mode,\n handTracking: has(\"hand-tracking\"),\n planeDetection: has(\"plane-detection\"),\n meshDetection: has(\"mesh-detection\"),\n depthSensing: has(\"depth-sensing\"),\n anchors: has(\"anchors\"),\n hitTest: has(\"hit-test\"),\n enabledFeatures: features,\n };\n}\n","import { Behaviour } from \"../Behaviour\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { XRRigComponent } from \"../components/XRRig\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport {\n NO_XR_CAPABILITIES,\n readXrCapabilities,\n type XrCapabilities,\n type XrInputState,\n} from \"../xr/types\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\n\n/**\n * Owns the immersive-session lifecycle and fans XR events out to Behaviours.\n *\n * Detects session start/end by polling `renderer.xr.isPresenting` rather than\n * binding to `sessionstart`/`sessionend`: the session may already be running\n * before this system is registered (the consumer owns the entry button), and\n * polling a boolean makes the system correct regardless of construction order.\n *\n * Hook dispatch mirrors `ImageTargetAnchorSystem`'s AR precedent — walk live\n * `ScriptComponent.scriptInstances` and call the public no-op hook — so XR and\n * AR extend `Behaviour` the same way.\n */\nexport class XRSessionSystem implements EcsSystem {\n private presenting = false;\n private capabilities: XrCapabilities = NO_XR_CAPABILITIES;\n private readonly inputSystem: XRInputSystem | null;\n /** Y compensation applied when a floor-relative space was requested but not granted. */\n private appliedOriginOffset = 0;\n\n constructor(inputSystem?: XRInputSystem) {\n this.inputSystem = inputSystem ?? null;\n }\n\n update(world: World): void {\n const presenting = world.isXrPresenting();\n\n if (presenting !== this.presenting) {\n this.presenting = presenting;\n if (presenting) {\n this.handleSessionStart(world);\n } else {\n this.handleSessionEnd(world);\n }\n }\n\n if (presenting) {\n this.dispatchInputEdges(world);\n }\n }\n\n private handleSessionStart(world: World): void {\n const session = world.getRenderer().xr.getSession();\n // `immersive-ar` means passthrough; the session's own mode is the only\n // reliable signal, since a device can support both.\n const mode =\n session && (session as { environmentBlendMode?: string })\n .environmentBlendMode !== \"opaque\"\n ? \"immersive-ar\"\n : \"immersive-vr\";\n this.capabilities = readXrCapabilities(session ?? null, mode);\n\n if (session && this.inputSystem) {\n this.inputSystem.attachSession(session);\n }\n\n this.applyTrackingOrigin(world, session ?? null);\n\n this.forEachBehaviour(world, (behaviour) => {\n behaviour.onXRSessionStart(this.capabilities);\n });\n }\n\n /**\n * Apply the rig's authored tracking origin, and compensate when the device\n * cannot honour it.\n *\n * `floor` (`local-floor`) puts Y=0 on the user's real floor, which is what a\n * scene authored standing on the ground expects. `eye` (`local`) puts Y=0 at\n * the headset, for seated experiences.\n *\n * The compensation matters: `local-floor` is only ever REQUESTED as an\n * optional feature (requiring it would make `requestSession` reject outright\n * on devices that lack it). When it isn't granted, the runtime silently falls\n * back to `local` — the origin jumps to head height and a floor-authored\n * scene swallows the user, which is exactly the \"I'm standing under the\n * building\" symptom. Offsetting the rig down by the eye height restores the\n * intended floor relationship instead of leaving it broken.\n */\n private applyTrackingOrigin(world: World, session: XRSession | null): void {\n const rigEntityId = world.query(XRRigComponent, TransformComponent)[0];\n if (typeof rigEntityId !== \"number\") return;\n\n const rig = world.getComponent(rigEntityId, XRRigComponent);\n const transform = world.getComponent(rigEntityId, TransformComponent);\n if (!rig || !transform) return;\n\n const renderer = world.getRenderer();\n const wantsFloor = rig.trackingOrigin === \"floor\";\n\n try {\n renderer.xr.setReferenceSpaceType(wantsFloor ? \"local-floor\" : \"local\");\n } catch {\n // Older/limited UAs — fall through to the offset compensation below.\n }\n\n // `enabledFeatures` is the only trustworthy signal that a floor-relative\n // space was actually granted; never infer it from the device name.\n const granted = (session as { enabledFeatures?: readonly string[] } | null)\n ?.enabledFeatures;\n const floorGranted = Array.isArray(granted)\n ? granted.includes(\"local-floor\")\n : // No report at all: trust the request, since a wrong offset is worse\n // than none on devices that did honour it.\n true;\n\n this.appliedOriginOffset =\n wantsFloor && !floorGranted ? rig.fallbackEyeHeight : 0;\n\n if (this.appliedOriginOffset !== 0) {\n transform.position.y -= this.appliedOriginOffset;\n }\n }\n\n private handleSessionEnd(world: World): void {\n // Restore the authored rig height — the offset is a session-time\n // compensation, not a scene edit.\n if (this.appliedOriginOffset !== 0) {\n const rigEntityId = world.query(XRRigComponent, TransformComponent)[0];\n if (typeof rigEntityId === \"number\") {\n const transform = world.getComponent(rigEntityId, TransformComponent);\n if (transform) transform.position.y += this.appliedOriginOffset;\n }\n this.appliedOriginOffset = 0;\n }\n\n this.capabilities = NO_XR_CAPABILITIES;\n this.inputSystem?.detachSession();\n this.forEachBehaviour(world, (behaviour) => {\n behaviour.onXRSessionEnd();\n });\n }\n\n /**\n * Relay this frame's one-frame select edges. Polling the latched state (rather\n * than dispatching from the DOM event) keeps hook delivery on the ECS tick, so\n * a Behaviour's `onSelectStart` always observes the same world state its\n * `onUpdate` would.\n */\n private dispatchInputEdges(world: World): void {\n const inputs = this.inputSystem?.getInputs();\n if (!inputs || inputs.length === 0) return;\n\n for (const input of inputs) {\n if (input.selectStart) {\n this.forEachBehaviour(world, (b) => b.onSelectStart(input));\n }\n if (input.selectEnd) {\n this.forEachBehaviour(world, (b) => b.onSelectEnd(input));\n }\n }\n }\n\n private forEachBehaviour(\n world: World,\n visit: (behaviour: Behaviour) => void,\n ): void {\n for (const entityId of world.query(ScriptComponent)) {\n const script = world.getComponent(entityId, ScriptComponent);\n const instances = script?.scriptInstances;\n if (!instances) continue;\n\n for (const instance of instances.values()) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n visit(instance);\n } catch (error) {\n // One misbehaving script must never abort the dispatch loop.\n console.error(\"[XRSessionSystem] Behaviour hook failed:\", error);\n }\n }\n }\n }\n\n /** What the active session granted. `NO_XR_CAPABILITIES` when not presenting. */\n getCapabilities(): XrCapabilities {\n return this.capabilities;\n }\n\n /** True while an immersive session is presenting. */\n isPresenting(): boolean {\n return this.presenting;\n }\n\n /** Convenience passthrough so consumers need only hold this system. */\n getInputs(): XrInputState[] {\n return this.inputSystem?.getInputs() ?? [];\n }\n}\n","import * as THREE from \"three\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { VRTeleportAreaComponent } from \"../components/VRTeleportArea\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\n\n/**\n * Keeps a teleport area's visible mesh in step with its authored shape/size.\n *\n * Without this the geometry would be whatever the factory built at create time,\n * so switching `plane` → `circle` (or resizing) in the inspector would change\n * where the player can teleport while still DRAWING the old footprint — the\n * guide would lie about the destination.\n *\n * Rebuilds are gated on a cheap signature so an idle scene does no work, the\n * same approach `PhysicsColliderDebugSystem` uses.\n */\n\nfunction buildGeometry(\n area: VRTeleportAreaComponent,\n): THREE.BufferGeometry {\n if (area.shape === \"circle\") {\n // `width` is the DIAMETER for a circle; the mesh is a flat disc, so the\n // player teleports onto its top face.\n const radius = Math.max(0.005, area.width / 2);\n return new THREE.CircleGeometry(radius, 48);\n }\n return new THREE.PlaneGeometry(\n Math.max(0.01, area.width),\n Math.max(0.01, area.depth),\n );\n}\n\nfunction signatureOf(area: VRTeleportAreaComponent): string {\n return `${area.shape}:${area.width}:${area.depth}`;\n}\n\nexport class VRTeleportAreaSystem implements EcsSystem {\n private readonly signatures = new Map<number, string>();\n\n update(world: World): void {\n const entityIds = world.query(VRTeleportAreaComponent, Object3DRef);\n\n // Drop bookkeeping for entities that no longer exist.\n const alive = new Set(entityIds);\n for (const tracked of this.signatures.keys()) {\n if (!alive.has(tracked)) this.signatures.delete(tracked);\n }\n\n for (const entityId of entityIds) {\n const area = world.getComponent(entityId, VRTeleportAreaComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!area || !(object instanceof THREE.Mesh)) continue;\n\n const signature = signatureOf(area);\n if (this.signatures.get(entityId) === signature) continue;\n this.signatures.set(entityId, signature);\n\n // Dispose the outgoing geometry — these rebuild on every inspector edit,\n // so leaking one per keystroke would add up fast.\n object.geometry?.dispose?.();\n object.geometry = buildGeometry(area);\n }\n }\n}\n","import * as THREE from \"three\";\nimport type { XrHandPreset } from \"../components/XRInteractor\";\n\n/**\n * Materials for tracked-hand meshes.\n *\n * three's `XRHandModelFactory` builds the joint geometry but gives it a plain\n * default material, so hands look identical in every experience. These presets\n * let an author pick a look in one click, with `custom` deferring entirely to\n * the colour/opacity/emissive fields.\n */\n\nexport type HandMaterialOptions = {\n color: string;\n opacity: number;\n emissiveIntensity: number;\n};\n\n/**\n * Build the material for a preset.\n *\n * Returns a fresh material each call — hands are per-session and disposed with\n * the interactor, and sharing one instance across presets would make switching\n * leak state between them.\n */\nexport function createHandMaterial(\n preset: XrHandPreset,\n options: HandMaterialOptions,\n): THREE.Material {\n const color = new THREE.Color(options.color);\n\n switch (preset) {\n case \"ghost\":\n // Translucent and unlit so it reads as a presence rather than an object,\n // and never occludes what the user is reaching for.\n return new THREE.MeshBasicMaterial({\n color,\n transparent: true,\n opacity: Math.min(1, Math.max(0.05, options.opacity * 0.45)),\n depthWrite: false,\n side: THREE.DoubleSide,\n });\n\n case \"neon\":\n // Emissive so it glows in dark scenes without needing a light nearby.\n return new THREE.MeshStandardMaterial({\n color,\n emissive: color,\n emissiveIntensity: Math.max(0.5, options.emissiveIntensity || 2),\n roughness: 0.35,\n metalness: 0,\n transparent: options.opacity < 1,\n opacity: options.opacity,\n });\n\n case \"skeleton\":\n // Wireframe over the joint mesh — reads as a rig, and is genuinely useful\n // for debugging hand tracking.\n return new THREE.MeshBasicMaterial({\n color,\n wireframe: true,\n transparent: true,\n opacity: options.opacity,\n });\n\n case \"custom\":\n case \"default\":\n return new THREE.MeshStandardMaterial({\n color,\n roughness: 0.85,\n metalness: 0,\n emissive: color,\n emissiveIntensity: Math.max(0, options.emissiveIntensity),\n transparent: options.opacity < 1,\n opacity: options.opacity,\n side: THREE.DoubleSide,\n });\n\n default: {\n // Exhaustiveness guard — a new preset must be handled explicitly rather\n // than silently rendering as the default.\n const _never: never = preset;\n void _never;\n return new THREE.MeshStandardMaterial({ color });\n }\n }\n}\n\n/** Apply a preset material to every mesh under a hand model. */\nexport function applyHandMaterial(\n root: THREE.Object3D,\n material: THREE.Material,\n): void {\n root.traverse((child) => {\n const mesh = child as THREE.Mesh;\n if (!mesh.isMesh) return;\n // The factory's own material is replaced wholesale; disposing it here would\n // break other hands sharing the cached model.\n mesh.material = material;\n });\n}\n","import * as THREE from \"three\";\nimport { XRControllerModelFactory } from \"three/examples/jsm/webxr/XRControllerModelFactory.js\";\nimport { XRHandModelFactory } from \"three/examples/jsm/webxr/XRHandModelFactory.js\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport {\n XRInteractorComponent,\n XRInteractorSideComponent,\n} from \"../components/XRInteractor\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport { applyHandMaterial, createHandMaterial } from \"../xr/handPresets\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\nimport type { XRInteractionSystem } from \"./XRInteractionSystem\";\n\n/**\n * Renders what the user sees as their hands, driven by\n * {@link XRInteractorComponent}.\n *\n * Three presentation layers, independently controllable:\n * - **controller models** on the grip space (Quest/Pico),\n * - **tracked-hand meshes** on the hand space (Android XR, Quest hands,\n * Vision Pro), styled by the interactor's preset,\n * - **author content** — anything parented under the left/right interactor\n * entities, re-attached to the tracked spaces so custom tools and gloves\n * ride along with no scripting.\n *\n * `interactorType` gates the first two, so an author can hide the stock visuals\n * entirely and present only their own meshes.\n */\n\n/** How long the aim ray is drawn, in metres. */\nconst RAY_LENGTH = 5;\n\n/** Base cylinder radius; the authored thickness scales against this. */\nconst RAY_RADIUS = 0.003;\n/** WebXR reports the primary hands on slots 0 and 1. */\nconst SLOTS: Array<{ index: number; side: \"left\" | \"right\" }> = [\n { index: 0, side: \"left\" },\n { index: 1, side: \"right\" },\n];\n\ntype SlotVisuals = {\n controller: THREE.Object3D;\n grip: THREE.Object3D;\n hand: THREE.Object3D;\n ray: THREE.Mesh;\n controllerModel: THREE.Object3D;\n handModel: THREE.Object3D;\n /** Author content re-parented onto the grip space, if any. */\n attachedCustom: THREE.Object3D | null;\n};\n\nexport class XRControllerVisualSystem implements EcsSystem {\n private readonly controllerModelFactory = new XRControllerModelFactory();\n private readonly handModelFactory = new XRHandModelFactory();\n private readonly group = new THREE.Group();\n /** Reused so a per-frame colour compare allocates nothing. */\n private readonly rayColorScratch = new THREE.Color();\n private readonly slots = new Map<number, SlotVisuals>();\n private readonly interactionSystem: XRInteractionSystem | null;\n /** Optional — lets each visual follow the source that is ACTUALLY live. */\n private readonly inputSystem: XRInputSystem | null;\n private attachedTo: THREE.Object3D | null = null;\n /** Last applied preset signature, so materials rebuild only on real change. */\n private handStyleSignature = \"\";\n private handMaterial: THREE.Material | null = null;\n\n constructor(options?: {\n interactionSystem?: XRInteractionSystem;\n inputSystem?: XRInputSystem;\n }) {\n this.interactionSystem = options?.interactionSystem ?? null;\n this.inputSystem = options?.inputSystem ?? null;\n this.group.name = \"XRControllerVisuals\";\n // Never captured in editor screenshots or the project thumbnail.\n this.group.userData.ecsPreviewHidden = true;\n }\n\n update(world: World): void {\n const renderer = world.getRenderer();\n if (!renderer.xr?.enabled) return;\n\n this.ensureAttached(world);\n this.ensureSlots(world);\n\n const interactor = this.resolveInteractor(world);\n // No interactor entity authored — fall back to showing everything, so a\n // scene without one still has visible hands rather than nothing.\n const type = interactor?.interactorType ?? \"both\";\n const showControllers = type === \"controllers\" || type === \"both\";\n const showHands = type === \"hands\" || type === \"both\";\n\n this.syncHandMaterial(interactor);\n\n for (const { index, side } of SLOTS) {\n const visuals = this.slots.get(index);\n if (!visuals) continue;\n\n // Only show the visual whose source is actually live for this hand.\n //\n // With \"both\" selected and no controller picked up, the grip space never\n // receives a pose, so a controller model left visible sits frozen at the\n // rig origin — the phantom second pair. Picking a controller up gave it a\n // pose and \"fixed\" it, which is exactly the reported behaviour. Driving\n // visibility from the live source kind means each hand shows one thing.\n const liveKind = this.liveKindFor(side);\n const hasController = liveKind === null || liveKind === \"controller\";\n const hasHand = liveKind === null || liveKind === \"hand\";\n\n visuals.controllerModel.visible = showControllers && hasController;\n visuals.handModel.visible = showHands && hasHand;\n visuals.ray.visible = this.shouldShowRay(interactor, side);\n this.fitRayToHover(visuals.ray, side);\n this.applyRayStyle(visuals.ray, interactor);\n\n if (showHands && this.handMaterial) {\n applyHandMaterial(visuals.handModel, this.handMaterial);\n }\n\n this.syncCustomContent(world, visuals, side);\n }\n }\n\n /**\n * What kind of source is currently driving this hand, or null when we cannot\n * tell (no input system wired) — in which case callers fall back to showing\n * everything rather than hiding the user's hands entirely.\n */\n private liveKindFor(side: \"left\" | \"right\"): string | null {\n if (!this.inputSystem) return null;\n const inputs = this.inputSystem.getInputs();\n if (inputs.length === 0) return null;\n for (const input of inputs) {\n if (input.handedness === side && input.connected) return input.kind;\n }\n // A connected session with no source for this hand: show nothing for it.\n return \"none\";\n }\n\n /** The scene's interactor config, if one was authored. */\n private resolveInteractor(world: World): XRInteractorComponent | null {\n const entityId = world.query(XRInteractorComponent)[0];\n if (typeof entityId !== \"number\") return null;\n return world.getComponent(entityId, XRInteractorComponent) ?? null;\n }\n\n /**\n * Re-parent the author's left/right interactor content onto the tracked grip\n * space so it follows the hand.\n *\n * `ObjectManagementSystem` reconciles ECS objects back under their ParentId\n * every frame, so this re-attach has to be re-asserted — the same coexistence\n * dance the AR anchor system performs.\n */\n private syncCustomContent(\n world: World,\n visuals: SlotVisuals,\n side: \"left\" | \"right\",\n ): void {\n let content: THREE.Object3D | null = null;\n for (const entityId of world.query(\n XRInteractorSideComponent,\n Object3DRef,\n )) {\n const slot = world.getComponent(entityId, XRInteractorSideComponent);\n if (slot?.side !== side) continue;\n content = world.getComponent(entityId, Object3DRef)?.object ?? null;\n break;\n }\n\n if (!content) {\n visuals.attachedCustom = null;\n return;\n }\n if (content.parent !== visuals.grip) {\n visuals.grip.add(content);\n }\n visuals.attachedCustom = content;\n }\n\n /** Rebuild the hand material only when the authored style actually changes. */\n private syncHandMaterial(interactor: XRInteractorComponent | null): void {\n const preset = interactor?.handPreset ?? \"default\";\n const color = interactor?.handColor ?? \"#e8b48a\";\n const opacity = interactor?.handOpacity ?? 1;\n const emissive = interactor?.handEmissiveIntensity ?? 0;\n const signature = `${preset}:${color}:${opacity}:${emissive}`;\n if (signature === this.handStyleSignature && this.handMaterial) return;\n\n this.handStyleSignature = signature;\n this.handMaterial?.dispose();\n this.handMaterial = createHandMaterial(preset, {\n color,\n opacity,\n emissiveIntensity: emissive,\n });\n }\n\n /**\n * The ray is meaningful only when it points at something. Authors can turn it\n * off entirely; otherwise it appears on hover/grab so it isn't permanent\n * clutter implying the whole scene is clickable.\n */\n private shouldShowRay(\n interactor: XRInteractorComponent | null,\n side: \"left\" | \"right\",\n ): boolean {\n const visibility = interactor?.rayVisibility ?? \"interacting\";\n if (visibility === \"never\") return false;\n if (visibility === \"always\") return true;\n if (!this.interactionSystem) return true;\n\n // Per-HAND, not scene-wide. Reading the global hover lit up both rays as\n // soon as either hand pointed at something, so the idle hand grew a ray\n // pointing at nothing.\n //\n // Hidden once the hand actually HOLDS something: the ray has done its job\n // at that point, and leaving it on draws a line through the object the user\n // is now carrying.\n if (this.interactionSystem.isGrabbingWith(side)) return false;\n return this.interactionSystem.getHoverFor(side) !== null;\n }\n\n /** Push the author's ray colour and thickness onto the mesh. */\n private applyRayStyle(\n ray: THREE.Mesh,\n interactor: XRInteractorComponent | null,\n ): void {\n if (!interactor) return;\n\n const material = ray.material as THREE.MeshBasicMaterial;\n if (material?.color && !material.color.equals(this.rayColorScratch.set(interactor.rayColor))) {\n material.color.copy(this.rayColorScratch);\n }\n\n // Radius lives in X/Y after the geometry was rotated onto -Z, so thickness\n // and length scale independently.\n const radius = Math.max(0.0005, interactor.rayThickness / 2) / RAY_RADIUS;\n if (ray.scale.x !== radius) {\n ray.scale.x = radius;\n ray.scale.y = radius;\n }\n }\n\n /**\n * Stop the ray at whatever it is pointing at.\n *\n * A fixed-length ray drawn with depth testing off punches straight through the\n * object, so the user cannot tell where the pointer actually lands. Scaling it\n * to the hit distance turns it into a pointer that meets the surface.\n */\n private fitRayToHover(ray: THREE.Mesh, side: \"left\" | \"right\"): void {\n const hover = this.interactionSystem?.getHoverFor(side) ?? null;\n // Falls back to full length when nothing is hit, which is also what a\n // grab-in-progress wants.\n const length =\n hover && Number.isFinite(hover.distance) && hover.distance > 0\n ? Math.min(hover.distance, RAY_LENGTH)\n : RAY_LENGTH;\n // The geometry is UNIT length along -Z, so this is metres directly.\n ray.scale.z = length;\n }\n\n /** Lazily build per-slot visuals; the device reports profiles late. */\n private ensureSlots(world: World): void {\n const renderer = world.getRenderer();\n for (const { index } of SLOTS) {\n if (this.slots.has(index)) continue;\n\n const controller = renderer.xr.getController(index);\n const grip = renderer.xr.getControllerGrip(index);\n const hand = renderer.xr.getHand(index);\n if (!controller || !grip || !hand) continue;\n\n const ray = this.createRay();\n controller.add(ray);\n\n const controllerModel =\n this.controllerModelFactory.createControllerModel(grip);\n grip.add(controllerModel);\n\n const handModel = this.handModelFactory.createHandModel(hand, \"mesh\");\n hand.add(handModel);\n\n this.group.add(controller, grip, hand);\n this.slots.set(index, {\n controller,\n grip,\n hand,\n ray,\n controllerModel,\n handModel,\n attachedCustom: null,\n });\n }\n }\n\n /**\n * Parent the visuals to the XR rig when there is one, so locomotion moves the\n * hands with the player. Falls back to the scene root.\n */\n private ensureAttached(world: World): void {\n const camera = world.getCamera();\n const target = camera.parent ?? world.getScene();\n if (this.attachedTo === target) return;\n target.add(this.group);\n this.attachedTo = target;\n }\n\n /**\n * The pointer ray.\n *\n * A cylinder rather than a `THREE.Line`, because WebGL ignores `linewidth` —\n * every line renders one pixel wide regardless, which is nearly invisible on a\n * headset. A thin mesh is the only way to get a ray with real thickness\n * without pulling in a line-rendering extension.\n */\n private createRay(): THREE.Mesh {\n // Unit length along -Z, so `scale.z` is the ray's length in metres.\n const geometry = new THREE.CylinderGeometry(RAY_RADIUS, RAY_RADIUS, 1, 8, 1);\n geometry.rotateX(-Math.PI / 2);\n geometry.translate(0, 0, -0.5);\n\n const material = new THREE.MeshBasicMaterial({\n color: \"#4da3ff\",\n transparent: true,\n opacity: 0.75,\n depthTest: false,\n depthWrite: false,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = \"XRPointerRay\";\n mesh.renderOrder = 999;\n mesh.visible = false;\n // The ray must never be a grab target itself.\n mesh.raycast = () => {};\n return mesh;\n }\n\n dispose(): void {\n this.group.removeFromParent();\n this.group.traverse((child) => {\n const mesh = child as Partial<THREE.Mesh>;\n mesh.geometry?.dispose?.();\n const material = mesh.material;\n if (Array.isArray(material)) {\n for (const entry of material) entry.dispose?.();\n } else {\n material?.dispose?.();\n }\n });\n this.group.clear();\n this.slots.clear();\n this.handMaterial?.dispose();\n this.handMaterial = null;\n this.handStyleSignature = \"\";\n this.attachedTo = null;\n }\n}\n","import * as THREE from \"three\";\nimport { XRRigComponent } from \"../components/XRRig\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport type { XRLocomotionSystem } from \"./XRLocomotionSystem\";\n\n/**\n * Draws the teleport aim arc and its landing marker.\n *\n * Shown only while the user is AIMING — an always-on curve reads as clutter.\n * While aiming, the arc is always drawn: blue with a landing ring when it lands\n * on a teleport area, red and marker-less when it does not. Rendering the\n * blocked state (rather than nothing) is what distinguishes \"there is nowhere\n * to land here\" from \"teleport is broken\", which is otherwise impossible to\n * tell apart from inside a headset.\n *\n * The arc fades from opaque at the hand to transparent at the far end and the\n * marker is a soft ring plus a centre dot, so the landing spot is unambiguous\n * against a busy floor without dominating the scene.\n */\n\n/** Radius of the landing ring, in metres. */\nconst MARKER_RADIUS = 0.28;\nconst ACCENT = new THREE.Color(\"#4da3ff\");\n/** The cylinder's baked axis. */\nconst SEGMENT_AXIS = new THREE.Vector3(0, 1, 0);\n\n/**\n * How far from the head the drawn arc starts, in metres.\n *\n * Vision Pro's target ray begins between the eyes, so without this the arc is\n * drawn through the user's own view. Controllers sit further out than this, so\n * their arcs are unaffected.\n */\nconst HEAD_CLEARANCE = 0.25;\n\nexport class XRTeleportVisualSystem implements EcsSystem {\n private readonly locomotionSystem: XRLocomotionSystem;\n private readonly group = new THREE.Group();\n /** Holds the segment chain that draws the arc. */\n private readonly arc = new THREE.Group();\n /**\n * Unit cylinder along +Y, reused by every segment.\n *\n * The arc was a `THREE.Line`, which WebGL always renders one pixel wide —\n * effectively invisible on a headset, and not thickenable at all. A chain of\n * scaled cylinders gives real thickness while rebuilding no geometry: each\n * frame only moves, rotates and scales meshes that already exist.\n */\n private readonly segmentGeometry = new THREE.CylinderGeometry(1, 1, 1, 6, 1);\n private readonly segments: THREE.Mesh[] = [];\n private readonly marker = new THREE.Group();\n private attached = false;\n private readonly scratchDirection = new THREE.Vector3();\n private readonly scratchHead = new THREE.Vector3();\n private readonly validColor = new THREE.Color();\n private readonly invalidColor = new THREE.Color();\n\n constructor(locomotionSystem: XRLocomotionSystem) {\n this.locomotionSystem = locomotionSystem;\n this.group.name = \"XRTeleportVisuals\";\n // Keep it out of editor screenshots and the project thumbnail.\n this.group.userData.ecsPreviewHidden = true;\n\n this.arc.name = \"XRTeleportArc\";\n this.group.add(this.arc);\n\n this.marker.add(this.createRing(), this.createDot());\n this.marker.renderOrder = 999;\n this.group.add(this.marker);\n\n this.setVisible(false);\n }\n\n update(world: World): void {\n if (!this.attached) {\n world.getScene().add(this.group);\n this.attached = true;\n }\n\n const raw = this.locomotionSystem.getAimCurve();\n const landing = this.locomotionSystem.getLandingPoint();\n const valid = this.locomotionSystem.isAimValid();\n\n if (raw.length < 2) {\n this.setVisible(false);\n return;\n }\n\n // Drop the stretch nearest the head. Vision Pro's target ray ORIGINATES\n // between the user's eyes, so an arc drawn from its true start passes\n // straight through their face. Trimming by distance to the head rather\n // than by a fixed count leaves controller arcs — which begin at the hand,\n // already clear of the head — untouched.\n const curve = this.trimNearHead(world, raw);\n if (curve.length < 2) {\n this.setVisible(false);\n return;\n }\n\n const rig = this.resolveRig(world);\n const thickness = Math.min(\n 0.1,\n Math.max(0.001, rig?.teleportArcThickness ?? 0.012),\n );\n const tint = valid\n ? this.validColor.set(rig?.teleportArcColor ?? \"#4da3ff\")\n : this.invalidColor.set(rig?.teleportArcInvalidColor ?? \"#ff5a5a\");\n\n // Show the arc whenever the user is aiming — red when it lands nowhere\n // valid. Hiding it in that case is what makes a missing teleport area feel\n // like broken input rather than a scene-setup problem.\n this.updateArcGeometry(curve, tint, thickness);\n\n if (valid && landing) {\n // Marker follows the authored arc colour, so the two never disagree.\n this.tintMarker(tint);\n this.marker.position.copy(landing);\n // Lift fractionally off the surface so the ring never z-fights the floor.\n this.marker.position.y += 0.01;\n this.marker.visible = true;\n } else {\n this.marker.visible = false;\n }\n this.setVisible(true);\n }\n\n private updateArcGeometry(\n curve: THREE.Vector3[],\n tint: THREE.Color,\n thickness: number,\n ): void {\n const needed = curve.length - 1;\n this.ensureSegments(needed);\n\n const radius = thickness / 2;\n\n for (let i = 0; i < this.segments.length; i += 1) {\n const segment = this.segments[i];\n if (i >= needed) {\n segment.visible = false;\n continue;\n }\n\n const from = curve[i];\n const to = curve[i + 1];\n this.scratchDirection.subVectors(to, from);\n const length = this.scratchDirection.length();\n if (length < 1e-6) {\n segment.visible = false;\n continue;\n }\n\n segment.visible = true;\n segment.position.copy(from).addScaledVector(this.scratchDirection, 0.5);\n segment.quaternion.setFromUnitVectors(\n SEGMENT_AXIS,\n this.scratchDirection.divideScalar(length),\n );\n segment.scale.set(radius, length, radius);\n\n // Brightest at the hand, fading along the flight — reads as motion and\n // keeps the far end from competing with the landing marker.\n const t = needed > 1 ? i / (needed - 1) : 0;\n const fade = 1 - t * 0.75;\n (segment.material as THREE.MeshBasicMaterial).color\n .copy(tint)\n .multiplyScalar(fade);\n }\n }\n\n /** Grow the segment pool to cover the current arc. */\n private ensureSegments(count: number): void {\n while (this.segments.length < count) {\n // One material per segment so each can carry its own point on the fade;\n // they are created once and recoloured in place from then on.\n const material = new THREE.MeshBasicMaterial({\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n const mesh = new THREE.Mesh(this.segmentGeometry, material);\n mesh.frustumCulled = false;\n mesh.renderOrder = 998;\n mesh.raycast = () => {};\n this.segments.push(mesh);\n this.arc.add(mesh);\n }\n }\n\n /** Drop leading points that sit too close to the viewer's head. */\n private trimNearHead(\n world: World,\n curve: THREE.Vector3[],\n ): THREE.Vector3[] {\n world.getCamera().getWorldPosition(this.scratchHead);\n\n let start = 0;\n while (\n start < curve.length - 2 &&\n curve[start].distanceTo(this.scratchHead) < HEAD_CLEARANCE\n ) {\n start += 1;\n }\n\n return start === 0 ? curve : curve.slice(start);\n }\n\n private resolveRig(world: World): XRRigComponent | null {\n const entityId = world.query(XRRigComponent)[0];\n if (typeof entityId !== \"number\") return null;\n return world.getComponent(entityId, XRRigComponent) ?? null;\n }\n\n private createRing(): THREE.Mesh {\n const geometry = new THREE.RingGeometry(\n MARKER_RADIUS * 0.72,\n MARKER_RADIUS,\n 48,\n );\n // RingGeometry is authored in XY; lay it flat on the ground.\n geometry.rotateX(-Math.PI / 2);\n return new THREE.Mesh(\n geometry,\n new THREE.MeshBasicMaterial({\n color: ACCENT,\n transparent: true,\n opacity: 0.9,\n side: THREE.DoubleSide,\n depthTest: false,\n }),\n );\n }\n\n private createDot(): THREE.Mesh {\n const geometry = new THREE.CircleGeometry(MARKER_RADIUS * 0.16, 24);\n geometry.rotateX(-Math.PI / 2);\n return new THREE.Mesh(\n geometry,\n new THREE.MeshBasicMaterial({\n color: ACCENT,\n transparent: true,\n opacity: 0.55,\n side: THREE.DoubleSide,\n depthTest: false,\n }),\n );\n }\n\n /** Recolour the landing marker to match the arc. */\n private tintMarker(color: THREE.Color): void {\n this.marker.traverse((child) => {\n const material = (child as Partial<THREE.Mesh>).material;\n if (material && !Array.isArray(material)) {\n (material as THREE.MeshBasicMaterial).color?.copy(color);\n }\n });\n }\n\n private setVisible(visible: boolean): void {\n this.group.visible = visible;\n }\n\n dispose(): void {\n this.group.removeFromParent();\n this.group.traverse((child) => {\n const mesh = child as Partial<THREE.Mesh>;\n mesh.geometry?.dispose?.();\n const material = mesh.material;\n if (Array.isArray(material)) {\n for (const entry of material) entry.dispose?.();\n } else {\n material?.dispose?.();\n }\n });\n this.attached = false;\n }\n}\n","import * as THREE from \"three\";\n\n/**\n * Hand pose metrics and matching.\n *\n * The problem this solves: a raw hand is 25 joint positions, and no two users'\n * hands are the same size. Comparing joint positions directly would mean a pose\n * authored by an adult never matches a child. So we reduce the hand to a handful\n * of SCALE-INVARIANT scalars — how curled each finger is, how spread, how close\n * the tips are to the thumb — and match against those.\n *\n * Two conventions borrowed from the mature toolkits, both load-bearing:\n *\n * 1. Every distance threshold is expressed as a RATIO OF PALM WIDTH, never in\n * metres. This is what makes a pose authored once work for every hand.\n * 2. Curl is split into BASE (knuckle) and TIP (outer joints). A single curl\n * number cannot tell a hook (base straight, tip curled) from a fist (both\n * curled) from a flat bent hand (base curled, tip straight).\n *\n * Everything here is pure and position-only — no quaternions, no WebXR types —\n * so poses can be unit-tested without a headset and fed from any joint source.\n */\n\n/** The 25 joints of the WebXR hand skeleton. */\nexport type XrHandJointName =\n | \"wrist\"\n | \"thumb-metacarpal\"\n | \"thumb-phalanx-proximal\"\n | \"thumb-phalanx-distal\"\n | \"thumb-tip\"\n | \"index-finger-metacarpal\"\n | \"index-finger-phalanx-proximal\"\n | \"index-finger-phalanx-intermediate\"\n | \"index-finger-phalanx-distal\"\n | \"index-finger-tip\"\n | \"middle-finger-metacarpal\"\n | \"middle-finger-phalanx-proximal\"\n | \"middle-finger-phalanx-intermediate\"\n | \"middle-finger-phalanx-distal\"\n | \"middle-finger-tip\"\n | \"ring-finger-metacarpal\"\n | \"ring-finger-phalanx-proximal\"\n | \"ring-finger-phalanx-intermediate\"\n | \"ring-finger-phalanx-distal\"\n | \"ring-finger-tip\"\n | \"pinky-finger-metacarpal\"\n | \"pinky-finger-phalanx-proximal\"\n | \"pinky-finger-phalanx-intermediate\"\n | \"pinky-finger-phalanx-distal\"\n | \"pinky-finger-tip\";\n\nexport type XrFinger = \"thumb\" | \"index\" | \"middle\" | \"ring\" | \"pinky\";\n\nexport const XR_FINGERS: readonly XrFinger[] = [\n \"thumb\",\n \"index\",\n \"middle\",\n \"ring\",\n \"pinky\",\n];\n\n/** Fingers that can oppose the thumb. The thumb cannot pinch itself. */\nexport const PINCH_FINGERS: readonly Exclude<XrFinger, \"thumb\">[] = [\n \"index\",\n \"middle\",\n \"ring\",\n \"pinky\",\n];\n\n/**\n * Joint positions, in world space.\n *\n * Partial because tracking drops joints, and because non-WebXR sources (a\n * simulator, a recorded pose) may supply fewer.\n */\nexport type XrHandJoints = Partial<Record<XrHandJointName, THREE.Vector3>>;\n\n/**\n * Joint chains, wrist-outward.\n *\n * The thumb is deliberately one joint shorter — it has NO intermediate phalanx.\n * That asymmetry is in the WebXR spec and every implementation has to special\n * case it; here it falls out of the chain length automatically.\n */\nconst FINGER_CHAINS: Record<XrFinger, readonly XrHandJointName[]> = {\n thumb: [\n \"thumb-metacarpal\",\n \"thumb-phalanx-proximal\",\n \"thumb-phalanx-distal\",\n \"thumb-tip\",\n ],\n index: [\n \"index-finger-metacarpal\",\n \"index-finger-phalanx-proximal\",\n \"index-finger-phalanx-intermediate\",\n \"index-finger-phalanx-distal\",\n \"index-finger-tip\",\n ],\n middle: [\n \"middle-finger-metacarpal\",\n \"middle-finger-phalanx-proximal\",\n \"middle-finger-phalanx-intermediate\",\n \"middle-finger-phalanx-distal\",\n \"middle-finger-tip\",\n ],\n ring: [\n \"ring-finger-metacarpal\",\n \"ring-finger-phalanx-proximal\",\n \"ring-finger-phalanx-intermediate\",\n \"ring-finger-phalanx-distal\",\n \"ring-finger-tip\",\n ],\n pinky: [\n \"pinky-finger-metacarpal\",\n \"pinky-finger-phalanx-proximal\",\n \"pinky-finger-phalanx-intermediate\",\n \"pinky-finger-phalanx-distal\",\n \"pinky-finger-tip\",\n ],\n};\n\nconst TIP_JOINTS: Record<XrFinger, XrHandJointName> = {\n thumb: \"thumb-tip\",\n index: \"index-finger-tip\",\n middle: \"middle-finger-tip\",\n ring: \"ring-finger-tip\",\n pinky: \"pinky-finger-tip\",\n};\n\nconst METACARPAL_JOINTS: Record<XrFinger, XrHandJointName> = {\n thumb: \"thumb-metacarpal\",\n index: \"index-finger-metacarpal\",\n middle: \"middle-finger-metacarpal\",\n ring: \"ring-finger-metacarpal\",\n pinky: \"pinky-finger-metacarpal\",\n};\n\n/** Fallback palm width when the hand is too poorly tracked to measure. */\nexport const FALLBACK_HAND_SCALE = 0.08;\n\n/**\n * Straightness normalization.\n *\n * Adjacent bone directions are compared by dot product (cheaper than `acos` and\n * monotonic, which is all we need). A dot at or above {@link STRAIGHT_COS} reads\n * as perfectly straight; at or below {@link CURLED_COS} (~57°) as fully curled.\n */\nexport const STRAIGHT_COS = 0.95;\nexport const CURLED_COS = 0.55;\n\nfunction clamp01(value: number): number {\n return value < 0 ? 0 : value > 1 ? 1 : value;\n}\n\n/** Normalized bone directions along a finger, or null if too few joints track. */\nfunction boneDirections(\n joints: XrHandJoints,\n finger: XrFinger,\n): THREE.Vector3[] | null {\n const chain = FINGER_CHAINS[finger];\n const directions: THREE.Vector3[] = [];\n\n for (let i = 1; i < chain.length; i += 1) {\n const from = joints[chain[i - 1]];\n const to = joints[chain[i]];\n if (!from || !to) return null;\n\n const direction = new THREE.Vector3().subVectors(to, from);\n // A zero-length bone means duplicated/degenerate joints; normalizing would\n // produce NaN and poison every downstream metric.\n if (direction.lengthSq() < 1e-12) return null;\n directions.push(direction.normalize());\n }\n\n return directions.length >= 2 ? directions : null;\n}\n\n/** Per-joint bend, 0 = straight, 1 = fully curled. */\nfunction bendAmounts(directions: THREE.Vector3[]): number[] {\n const bends: number[] = [];\n for (let i = 1; i < directions.length; i += 1) {\n const cos = directions[i - 1].dot(directions[i]);\n const straightness = clamp01((cos - CURLED_COS) / (STRAIGHT_COS - CURLED_COS));\n bends.push(1 - straightness);\n }\n return bends;\n}\n\nfunction average(values: number[]): number {\n if (values.length === 0) return 0;\n let sum = 0;\n for (const value of values) sum += value;\n return sum / values.length;\n}\n\n/** How curled one finger is. */\nexport type XrFingerCurl = {\n /** Knuckle bend alone — 0 straight, 1 bent square to the palm. */\n baseCurl: number;\n /** The outer joints — distinguishes a hook from a fist. */\n tipCurl: number;\n /** Whole-finger curl. The value a simple pose editor exposes. */\n curl: number;\n};\n\n/**\n * Curl for one finger, or null when the finger isn't tracked well enough.\n *\n * The thumb yields only two bend angles to the fingers' three, so `baseCurl` and\n * `tipCurl` are its first and second bends respectively.\n */\nexport function computeFingerCurl(\n joints: XrHandJoints,\n finger: XrFinger,\n): XrFingerCurl | null {\n const directions = boneDirections(joints, finger);\n if (!directions) return null;\n\n const bends = bendAmounts(directions);\n if (bends.length === 0) return null;\n\n return {\n baseCurl: bends[0],\n tipCurl: average(bends.slice(1)) || bends[bends.length - 1],\n curl: average(bends),\n };\n}\n\n/** Distance across the knuckles — our unit of hand size. */\nexport function computePalmWidth(joints: XrHandJoints): number | null {\n const index = joints[\"index-finger-metacarpal\"];\n const pinky = joints[\"pinky-finger-metacarpal\"];\n if (!index || !pinky) return null;\n const width = index.distanceTo(pinky);\n return width > 1e-6 ? width : null;\n}\n\n/**\n * Characteristic hand size in metres.\n *\n * Every distance threshold in this module is a multiple of this, which is what\n * lets one authored pose match hands of any size.\n */\nexport function estimateHandScale(joints: XrHandJoints): number {\n const measurements: number[] = [];\n\n const width = computePalmWidth(joints);\n if (width !== null) measurements.push(width);\n\n const wrist = joints.wrist;\n const middleTip = joints[\"middle-finger-tip\"];\n if (wrist && middleTip) {\n // Wrist-to-middle-tip is roughly twice palm width on a real hand; halve it\n // so both measurements live on the same scale before averaging.\n const span = wrist.distanceTo(middleTip);\n if (span > 1e-6) measurements.push(span * 0.5);\n }\n\n if (measurements.length === 0) return FALLBACK_HAND_SCALE;\n return average(measurements);\n}\n\n/**\n * How close a fingertip is to the thumb tip. 1 = touching, 0 = far apart.\n *\n * Scaled by hand size, so \"pinching\" means the same gesture on every hand\n * rather than the same number of millimetres.\n */\nexport function computePinch(\n joints: XrHandJoints,\n finger: Exclude<XrFinger, \"thumb\">,\n): number | null {\n const thumbTip = joints[\"thumb-tip\"];\n const fingerTip = joints[TIP_JOINTS[finger]];\n if (!thumbTip || !fingerTip) return null;\n\n const scale = estimateHandScale(joints);\n const distance = thumbTip.distanceTo(fingerTip);\n return clamp01(1 - distance / (scale * 0.7));\n}\n\n/**\n * Angular separation between two fingers. 0 = parallel, 1 = splayed wide.\n *\n * Measured on metacarpal→tip direction, which stays meaningful even when the\n * fingers are partly curled.\n */\nexport function computeSpread(\n joints: XrHandJoints,\n a: XrFinger,\n b: XrFinger,\n): number | null {\n const aBase = joints[METACARPAL_JOINTS[a]];\n const aTip = joints[TIP_JOINTS[a]];\n const bBase = joints[METACARPAL_JOINTS[b]];\n const bTip = joints[TIP_JOINTS[b]];\n if (!aBase || !aTip || !bBase || !bTip) return null;\n\n const dirA = new THREE.Vector3().subVectors(aTip, aBase);\n const dirB = new THREE.Vector3().subVectors(bTip, bBase);\n if (dirA.lengthSq() < 1e-12 || dirB.lengthSq() < 1e-12) return null;\n\n return clamp01((1 - dirA.normalize().dot(dirB.normalize())) / 0.45);\n}\n\n/** An orthonormal frame attached to the palm. */\nexport type XrPalmPose = {\n center: THREE.Vector3;\n /** Outward from the front of the palm. */\n normal: THREE.Vector3;\n /** Across the palm, thumb-ward. */\n right: THREE.Vector3;\n /** Along the fingers. */\n up: THREE.Vector3;\n width: number;\n};\n\n/**\n * Palm frame, used for orientation conditions (\"palm up\", \"thumb toward face\").\n *\n * Handedness matters: the same cross product points opposite ways on left and\n * right hands, so the left is mirrored to keep `normal` meaning \"out of the\n * front of the palm\" on both.\n */\nexport function computePalmPose(\n joints: XrHandJoints,\n handedness: \"left\" | \"right\",\n): XrPalmPose | null {\n const wrist = joints.wrist;\n const indexBase = joints[\"index-finger-metacarpal\"];\n const pinkyBase = joints[\"pinky-finger-metacarpal\"];\n if (!wrist || !indexBase || !pinkyBase) return null;\n\n const u = new THREE.Vector3().subVectors(indexBase, wrist);\n const v = new THREE.Vector3().subVectors(pinkyBase, wrist);\n const normal = new THREE.Vector3().crossVectors(u, v);\n if (normal.lengthSq() < 1e-12) return null;\n normal.normalize();\n if (handedness === \"left\") normal.multiplyScalar(-1);\n\n const right = new THREE.Vector3().subVectors(indexBase, pinkyBase);\n if (right.lengthSq() < 1e-12) return null;\n right.normalize();\n if (handedness === \"left\") right.multiplyScalar(-1);\n\n const up = new THREE.Vector3().crossVectors(normal, right).normalize();\n const center = new THREE.Vector3()\n .add(wrist)\n .add(indexBase)\n .add(pinkyBase)\n .divideScalar(3);\n\n return {\n center,\n normal,\n right,\n up,\n width: computePalmWidth(joints) ?? FALLBACK_HAND_SCALE,\n };\n}\n\n/** Everything a pose is matched against, derived once per hand per frame. */\nexport type XrHandShape = {\n handedness: \"left\" | \"right\";\n fingers: Record<XrFinger, XrFingerCurl>;\n /** Thumb-opposition per finger. */\n pinch: Record<Exclude<XrFinger, \"thumb\">, number>;\n spread: {\n thumbIndex: number;\n indexMiddle: number;\n middleRing: number;\n ringPinky: number;\n };\n palm: XrPalmPose | null;\n /** Characteristic hand size, metres. */\n scale: number;\n /** Direction the thumb points, world space. */\n thumbDirection: THREE.Vector3 | null;\n /**\n * Direction each finger points, world space (metacarpal → tip).\n *\n * Separate from curl: a finger can be straight while pointing anywhere, and\n * \"index extended, pointing up\" is a different pose from \"index extended,\n * pointing at the user\".\n */\n fingerDirections: Record<XrFinger, THREE.Vector3 | null>;\n};\n\n/**\n * Reduce tracked joints to the matchable shape.\n *\n * Returns null when the hand is too poorly tracked for ANY finger to be\n * measured — better to report \"no pose\" than to match against garbage.\n */\nexport function computeHandShape(\n joints: XrHandJoints,\n handedness: \"left\" | \"right\",\n): XrHandShape | null {\n const fingers = {} as Record<XrFinger, XrFingerCurl>;\n let tracked = 0;\n\n for (const finger of XR_FINGERS) {\n const curl = computeFingerCurl(joints, finger);\n if (curl) {\n fingers[finger] = curl;\n tracked += 1;\n } else {\n // An untracked finger reads as neutral rather than absent, so a pose that\n // does not constrain it still matches.\n fingers[finger] = { baseCurl: 0, tipCurl: 0, curl: 0 };\n }\n }\n\n if (tracked === 0) return null;\n\n const pinch = {} as Record<Exclude<XrFinger, \"thumb\">, number>;\n for (const finger of PINCH_FINGERS) {\n pinch[finger] = computePinch(joints, finger) ?? 0;\n }\n\n const thumbBase = joints[\"thumb-metacarpal\"];\n const thumbTip = joints[\"thumb-tip\"];\n let thumbDirection: THREE.Vector3 | null = null;\n if (thumbBase && thumbTip) {\n const direction = new THREE.Vector3().subVectors(thumbTip, thumbBase);\n if (direction.lengthSq() > 1e-12) thumbDirection = direction.normalize();\n }\n\n const fingerDirections = {} as Record<XrFinger, THREE.Vector3 | null>;\n for (const finger of XR_FINGERS) {\n const base = joints[METACARPAL_JOINTS[finger]];\n const tip = joints[TIP_JOINTS[finger]];\n if (!base || !tip) {\n fingerDirections[finger] = null;\n continue;\n }\n const direction = new THREE.Vector3().subVectors(tip, base);\n fingerDirections[finger] =\n direction.lengthSq() > 1e-12 ? direction.normalize() : null;\n }\n\n return {\n handedness,\n fingers,\n pinch,\n fingerDirections,\n spread: {\n thumbIndex: computeSpread(joints, \"thumb\", \"index\") ?? 0,\n indexMiddle: computeSpread(joints, \"index\", \"middle\") ?? 0,\n middleRing: computeSpread(joints, \"middle\", \"ring\") ?? 0,\n ringPinky: computeSpread(joints, \"ring\", \"pinky\") ?? 0,\n },\n palm: computePalmPose(joints, handedness),\n scale: estimateHandScale(joints),\n thumbDirection,\n };\n}\n\n/* ------------------------------------------------------------------ *\n * Pose definitions\n * ------------------------------------------------------------------ */\n\n/** Target curl for one finger, with the slack allowed around it. */\nexport type XrFingerTarget = {\n /** 0 = extended, 1 = fully curled. */\n curl: number;\n /** Half-width of the accepted band. Larger = easier to perform. */\n tolerance: number;\n /** Optional knuckle constraint, for poses where whole-finger curl is ambiguous. */\n baseCurl?: number;\n /** Optional outer-joint constraint. */\n tipCurl?: number;\n /**\n * Directions this finger may point, world space.\n *\n * Any ONE of them satisfies the constraint, mirroring fingerpose's\n * `addDirection` — a thumb that may point up OR diagonally up is one pose,\n * not two. Empty or omitted leaves the finger free to point anywhere.\n */\n directions?: XrHandPoseDirection[];\n};\n\n/** Which way something on the hand must point for the pose to count. */\nexport type XrHandPoseAxis = \"palm-normal\" | \"fingers\" | \"thumb\";\n\nexport type XrHandPoseDirection =\n | \"up\"\n | \"down\"\n | \"forward\"\n | \"back\"\n | \"left\"\n | \"right\"\n | \"toward-head\"\n | \"away-from-head\";\n\nexport type XrHandPoseOrientation = {\n axis: XrHandPoseAxis;\n direction: XrHandPoseDirection;\n /** How far off it may point and still match. */\n toleranceDegrees: number;\n};\n\n/**\n * A matchable hand pose.\n *\n * Shape (finger curls) is kept separate from orientation deliberately: thumbs-up\n * and thumbs-down are the SAME hand shape and differ only in where the thumb\n * points. Folding orientation into the curl targets would force two nearly\n * duplicate definitions and make neither editable in isolation.\n */\nexport type XrHandPoseDefinition = {\n id: string;\n name: string;\n fingers: Record<XrFinger, XrFingerTarget>;\n /** Optional thumb-to-finger contact requirement. */\n pinch?: {\n finger: Exclude<XrFinger, \"thumb\">;\n /** 1 = touching. */\n target: number;\n tolerance: number;\n };\n orientation?: XrHandPoseOrientation;\n /**\n * How far a finger may point from an accepted direction, in degrees.\n *\n * Generous by default: finger direction is a coarse signal, and a tight cone\n * makes a pose that reads correctly to the user fail to register.\n */\n directionToleranceDegrees?: number;\n /** Restrict to one hand; omit to match either. */\n hand?: \"left\" | \"right\";\n};\n\n/** Confidence falls to zero this far outside a target's tolerance band. */\nexport const MATCH_FALLOFF = 0.25;\n\nexport type XrHandPoseMatch = {\n /** Every constraint inside its tolerance. */\n matched: boolean;\n /** 0..1. Degrades smoothly outside tolerance, for live editor feedback. */\n confidence: number;\n /** The constraint furthest out of range — what to show the user when it fails. */\n worstConstraint: string | null;\n};\n\nconst NO_MATCH: XrHandPoseMatch = {\n matched: false,\n confidence: 0,\n worstConstraint: null,\n};\n\n/** Score one scalar against a target band. 1 inside tolerance, decaying outside. */\nfunction scoreAgainst(\n actual: number,\n target: number,\n tolerance: number,\n): number {\n const error = Math.abs(actual - target);\n if (error <= tolerance) return 1;\n return clamp01(1 - (error - tolerance) / MATCH_FALLOFF);\n}\n\n/** Default cone for per-finger direction constraints. */\nexport const DEFAULT_DIRECTION_TOLERANCE = 45;\n\nconst WORLD_DIRECTIONS: Record<\n Exclude<XrHandPoseDirection, \"toward-head\" | \"away-from-head\">,\n THREE.Vector3\n> = {\n up: new THREE.Vector3(0, 1, 0),\n down: new THREE.Vector3(0, -1, 0),\n forward: new THREE.Vector3(0, 0, -1),\n back: new THREE.Vector3(0, 0, 1),\n left: new THREE.Vector3(-1, 0, 0),\n right: new THREE.Vector3(1, 0, 0),\n};\n\n/** Extra world context needed only by head-relative orientation conditions. */\nexport type XrHandPoseContext = {\n headPosition?: THREE.Vector3;\n};\n\nfunction axisVector(\n shape: XrHandShape,\n axis: XrHandPoseAxis,\n): THREE.Vector3 | null {\n if (axis === \"thumb\") return shape.thumbDirection;\n if (!shape.palm) return null;\n return axis === \"palm-normal\" ? shape.palm.normal : shape.palm.up;\n}\n\nfunction resolveDirection(\n direction: XrHandPoseDirection,\n shape: XrHandShape,\n context?: XrHandPoseContext,\n): THREE.Vector3 | null {\n if (direction !== \"toward-head\" && direction !== \"away-from-head\") {\n return WORLD_DIRECTIONS[direction];\n }\n\n const head = context?.headPosition;\n const origin = shape.palm?.center;\n // Head-relative conditions are unanswerable without both points; treat as\n // unmatched rather than silently succeeding.\n if (!head || !origin) return null;\n\n const toHead = new THREE.Vector3().subVectors(head, origin);\n if (toHead.lengthSq() < 1e-12) return null;\n toHead.normalize();\n return direction === \"toward-head\" ? toHead : toHead.multiplyScalar(-1);\n}\n\n/**\n * Best score across the accepted directions for one finger.\n *\n * Any one of them satisfying the constraint is enough, so this takes the MAX —\n * unlike the soft-AND used between separate constraints.\n */\nfunction scoreDirections(\n actual: THREE.Vector3 | null,\n accepted: XrHandPoseDirection[],\n shape: XrHandShape,\n toleranceDegrees: number,\n context?: XrHandPoseContext,\n): number {\n if (!actual) return 0;\n\n let best = 0;\n for (const direction of accepted) {\n const wanted = resolveDirection(direction, shape, context);\n if (!wanted) continue;\n\n const angle = THREE.MathUtils.radToDeg(\n Math.acos(THREE.MathUtils.clamp(actual.dot(wanted), -1, 1)),\n );\n const normalizedError = Math.max(0, angle - toleranceDegrees) / 90;\n const score = clamp01(1 - normalizedError / MATCH_FALLOFF);\n if (score > best) best = score;\n }\n return best;\n}\n\n/**\n * Score a live hand against a pose.\n *\n * Confidence is the MINIMUM across constraints, not the average — a soft AND.\n * Averaging lets three perfect fingers outvote one badly wrong one, which is how\n * a fist ends up firing as a thumbs-up.\n */\nexport function matchHandPose(\n shape: XrHandShape,\n definition: XrHandPoseDefinition,\n context?: XrHandPoseContext,\n): XrHandPoseMatch {\n if (definition.hand && definition.hand !== shape.handedness) return NO_MATCH;\n\n let confidence = 1;\n let worstScore = 1;\n let worstConstraint: string | null = null;\n\n const consider = (score: number, label: string) => {\n if (score < confidence) confidence = score;\n if (score < worstScore) {\n worstScore = score;\n worstConstraint = label;\n }\n };\n\n for (const finger of XR_FINGERS) {\n const target = definition.fingers[finger];\n if (!target) continue;\n const actual = shape.fingers[finger];\n\n consider(scoreAgainst(actual.curl, target.curl, target.tolerance), finger);\n\n if (target.baseCurl !== undefined) {\n consider(\n scoreAgainst(actual.baseCurl, target.baseCurl, target.tolerance),\n `${finger} knuckle`,\n );\n }\n if (target.tipCurl !== undefined) {\n consider(\n scoreAgainst(actual.tipCurl, target.tipCurl, target.tolerance),\n `${finger} tip`,\n );\n }\n\n if (target.directions && target.directions.length > 0) {\n consider(\n scoreDirections(\n shape.fingerDirections[finger],\n target.directions,\n shape,\n definition.directionToleranceDegrees ?? DEFAULT_DIRECTION_TOLERANCE,\n context,\n ),\n `${finger} direction`,\n );\n }\n }\n\n if (definition.pinch) {\n const { finger, target, tolerance } = definition.pinch;\n consider(\n scoreAgainst(shape.pinch[finger], target, tolerance),\n `${finger} pinch`,\n );\n }\n\n if (definition.orientation) {\n const { axis, direction, toleranceDegrees } = definition.orientation;\n const handAxis = axisVector(shape, axis);\n const wanted = resolveDirection(direction, shape, context);\n\n if (!handAxis || !wanted) {\n consider(0, \"orientation\");\n } else {\n const angle = THREE.MathUtils.radToDeg(\n Math.acos(THREE.MathUtils.clamp(handAxis.dot(wanted), -1, 1)),\n );\n // Reuse the curl falloff by mapping degrees onto the same 0..1 scale:\n // fully out of tolerance at twice the allowed angle.\n const normalizedError = Math.max(0, angle - toleranceDegrees) / 90;\n consider(clamp01(1 - normalizedError / MATCH_FALLOFF), \"orientation\");\n }\n }\n\n return {\n matched: confidence >= 1,\n confidence,\n worstConstraint: confidence >= 1 ? null : worstConstraint,\n };\n}\n\n/* ------------------------------------------------------------------ *\n * Detection state machine\n * ------------------------------------------------------------------ */\n\nexport type XrHandPoseEvent = \"start\" | \"end\" | null;\n\nexport type HandPoseTrackerOptions = {\n /** Confidence needed to begin holding. */\n enterConfidence?: number;\n /** Confidence below which an active pose ends. Must be < enter. */\n exitConfidence?: number;\n /** Seconds the pose must be held before it fires. */\n minHoldSeconds?: number;\n /** Grace period before tracking loss ends an active pose. */\n lostGraceSeconds?: number;\n};\n\nexport const DEFAULT_ENTER_CONFIDENCE = 0.8;\nexport const DEFAULT_EXIT_CONFIDENCE = 0.55;\nexport const DEFAULT_MIN_HOLD_SECONDS = 0.15;\nexport const DEFAULT_LOST_GRACE_SECONDS = 0.25;\n\n/**\n * Turns a stream of per-frame confidences into clean start/end events.\n *\n * Two mechanisms, both necessary:\n *\n * - HYSTERESIS. A single threshold makes confidence hovering at the boundary\n * emit start/end at frame rate. Entering high and exiting low kills that.\n * - HOLD TIME. Fingers pass through many shapes on the way to the intended one;\n * without a hold requirement a fist fires \"point\" en route.\n *\n * Tracking loss gets a grace period rather than ending immediately, because\n * hands drop out for a frame or two constantly at the edge of the camera FOV.\n */\nexport class HandPoseTracker {\n private readonly enterConfidence: number;\n private readonly exitConfidence: number;\n private readonly minHoldSeconds: number;\n private readonly lostGraceSeconds: number;\n\n private active = false;\n private holdingSince: number | null = null;\n private lostSince: number | null = null;\n\n constructor(options?: HandPoseTrackerOptions) {\n this.enterConfidence = options?.enterConfidence ?? DEFAULT_ENTER_CONFIDENCE;\n const exit = options?.exitConfidence ?? DEFAULT_EXIT_CONFIDENCE;\n // Exit must sit strictly below enter or the hysteresis band collapses and\n // the chatter it exists to prevent comes straight back.\n this.exitConfidence = Math.min(exit, this.enterConfidence - 1e-3);\n this.minHoldSeconds = options?.minHoldSeconds ?? DEFAULT_MIN_HOLD_SECONDS;\n this.lostGraceSeconds =\n options?.lostGraceSeconds ?? DEFAULT_LOST_GRACE_SECONDS;\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n /** Feed this frame's confidence. Returns an event on a transition. */\n update(confidence: number, now: number): XrHandPoseEvent {\n this.lostSince = null;\n\n if (this.active) {\n if (confidence < this.exitConfidence) {\n this.active = false;\n this.holdingSince = null;\n return \"end\";\n }\n return null;\n }\n\n if (confidence >= this.enterConfidence) {\n if (this.holdingSince === null) this.holdingSince = now;\n if (now - this.holdingSince >= this.minHoldSeconds) {\n this.active = true;\n return \"start\";\n }\n return null;\n }\n\n this.holdingSince = null;\n return null;\n }\n\n /** Feed a frame where the hand isn't tracked at all. */\n miss(now: number): XrHandPoseEvent {\n this.holdingSince = null;\n if (!this.active) return null;\n\n if (this.lostSince === null) this.lostSince = now;\n if (now - this.lostSince < this.lostGraceSeconds) return null;\n\n this.active = false;\n this.lostSince = null;\n return \"end\";\n }\n\n reset(): void {\n this.active = false;\n this.holdingSince = null;\n this.lostSince = null;\n }\n}\n","import * as THREE from \"three\";\nimport { Behaviour } from \"../Behaviour\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport {\n handPoseDefinitionFor,\n XRHandPoseComponent,\n type XrHandPoseEntry,\n} from \"../components/XRHandPose\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport {\n computeHandShape,\n HandPoseTracker,\n matchHandPose,\n type XrHandPoseContext,\n type XrHandShape,\n} from \"../xr/handPose\";\nimport { getHandPosePreset } from \"../xr/handPosePresets\";\nimport type { XRInputSystem } from \"./XRInputSystem\";\n\n/**\n * Detects hand poses and reports them to the scene.\n *\n * Runs after {@link XRInputSystem} so it reads the same latched joint data every\n * other system sees this tick.\n *\n * The hand shape is computed ONCE PER HAND PER FRAME and shared by every\n * listening entity. Recomputing it per entity would make the cost scale with\n * scene size for no benefit — the user has two hands regardless of how many\n * objects are watching them.\n */\n\n/** Pose detection state, keyed hand-then-pose. */\ntype HandTrackers = Map<string, HandPoseTracker>;\n\nexport type XrHandPoseEventDetail = {\n /** The entry's id. */\n poseId: string;\n poseName: string;\n handedness: \"left\" | \"right\";\n /** 0..1 at the moment of the transition. */\n confidence: number;\n};\n\nexport class XRHandPoseSystem implements EcsSystem {\n private readonly inputSystem: XRInputSystem;\n private readonly trackers = new Map<\"left\" | \"right\", HandTrackers>();\n private readonly shapes = new Map<\"left\" | \"right\", XrHandShape | null>();\n /** Reused so head-relative orientation checks allocate nothing per frame. */\n private readonly headPosition = new THREE.Vector3();\n private elapsed = 0;\n\n constructor(inputSystem: XRInputSystem) {\n this.inputSystem = inputSystem;\n }\n\n update(world: World, deltaTime: number): void {\n if (!world.isXrPresenting()) {\n // Leaving XR must not strand a pose in the \"active\" state, or re-entering\n // would never fire its start again.\n this.resetAll();\n return;\n }\n\n this.elapsed += deltaTime;\n this.refreshShapes();\n\n const entries = this.collectEntries(world);\n if (entries.length === 0) return;\n\n world.getCamera().getWorldPosition(this.headPosition);\n const context: XrHandPoseContext = { headPosition: this.headPosition };\n\n for (const { entityId, entry } of entries) {\n const definition = handPoseDefinitionFor(entry, getHandPosePreset);\n if (!definition) continue;\n\n for (const handedness of [\"left\", \"right\"] as const) {\n if (entry.hand && entry.hand !== handedness) continue;\n\n const key = `${entityId}:${entry.id}`;\n const trackers = this.trackersFor(handedness);\n let tracker = trackers.get(key);\n if (!tracker) {\n tracker = new HandPoseTracker({\n minHoldSeconds: entry.minHoldSeconds,\n });\n trackers.set(key, tracker);\n }\n\n const shape = this.shapes.get(handedness) ?? null;\n if (!shape) {\n if (tracker.miss(this.elapsed) === \"end\") {\n this.dispatch(world, entityId, \"end\", {\n poseId: entry.id,\n poseName: entry.name,\n handedness,\n confidence: 0,\n });\n }\n continue;\n }\n\n const match = matchHandPose(shape, definition, context);\n const event = tracker.update(match.confidence, this.elapsed);\n if (event) {\n this.dispatch(world, entityId, event, {\n poseId: entry.id,\n poseName: entry.name,\n handedness,\n confidence: match.confidence,\n });\n }\n }\n }\n }\n\n /** Derive each hand's shape once for the whole frame. */\n private refreshShapes(): void {\n for (const handedness of [\"left\", \"right\"] as const) {\n const input = this.inputSystem.getInput(handedness);\n const joints = input?.joints ?? null;\n this.shapes.set(\n handedness,\n joints ? computeHandShape(joints, handedness) : null,\n );\n }\n }\n\n private collectEntries(\n world: World,\n ): { entityId: number; entry: XrHandPoseEntry }[] {\n const collected: { entityId: number; entry: XrHandPoseEntry }[] = [];\n\n for (const entityId of world.query(XRHandPoseComponent)) {\n const component = world.getComponent(entityId, XRHandPoseComponent);\n if (!component?.enabled) continue;\n\n for (const entry of component.poses) {\n if (entry.enabled) collected.push({ entityId, entry });\n }\n }\n\n return collected;\n }\n\n private trackersFor(handedness: \"left\" | \"right\"): HandTrackers {\n let trackers = this.trackers.get(handedness);\n if (!trackers) {\n trackers = new Map();\n this.trackers.set(handedness, trackers);\n }\n return trackers;\n }\n\n /**\n * Deliver to the entity's own Behaviours.\n *\n * Scoped to the entity that declared the pose rather than broadcast, so two\n * objects listening for the same gesture stay independent.\n */\n private dispatch(\n world: World,\n entityId: number,\n event: \"start\" | \"end\",\n detail: XrHandPoseEventDetail,\n ): void {\n const script = world.getComponent(entityId, ScriptComponent);\n const instances = script?.scriptInstances;\n if (!instances) return;\n\n for (const instance of instances.values()) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n if (event === \"start\") instance.onHandPoseStart(detail);\n else instance.onHandPoseEnd(detail);\n } catch (error) {\n // One misbehaving script must never abort the dispatch loop.\n console.error(\"[XRHandPoseSystem] Behaviour hook failed:\", error);\n }\n }\n }\n\n private resetAll(): void {\n for (const trackers of this.trackers.values()) {\n for (const tracker of trackers.values()) tracker.reset();\n }\n this.shapes.clear();\n }\n\n /** Live shape for a hand — powers the editor's pose readout. */\n getHandShape(handedness: \"left\" | \"right\"): XrHandShape | null {\n return this.shapes.get(handedness) ?? null;\n }\n\n /** Whether a given entity's pose is currently held. */\n isPoseActive(\n entityId: number,\n poseId: string,\n handedness: \"left\" | \"right\",\n ): boolean {\n return (\n this.trackers.get(handedness)?.get(`${entityId}:${poseId}`)?.isActive() ??\n false\n );\n }\n}\n","import * as THREE from \"three\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { XRInteractableComponent } from \"../components/XRInteractable\";\nimport type { EcsSystem } from \"../System\";\nimport type { World } from \"../World\";\nimport type { XRInteractionSystem } from \"./XRInteractionSystem\";\n\n/**\n * Hover feedback for XR interactables.\n *\n * Without it, aiming the pointer at a grabbable object and aiming at empty space\n * look identical, so users cannot tell what they are about to pick up.\n *\n * The colour effect is drawn as a SEPARATE shell mesh rather than by tinting the\n * object's materials. Materials are frequently shared between entities (every\n * instance of a loaded model points at the same one), so tinting on hover would\n * light up every copy in the scene and would have to be perfectly unwound on\n * un-hover to avoid leaving objects permanently stained. A shell owns its own\n * material, can be removed wholesale, and cannot corrupt anything.\n */\n\n/** Marks shell meshes so they are never mistaken for scene content. */\nexport const XR_HOVER_SHELL_FLAG = \"__xrHoverShell\";\n\n/** How far outside the surface the outline sits, as a fraction of size. */\nconst SHELL_INFLATE = 1.04;\n\n/**\n * Seconds for the scale effect to substantially complete.\n *\n * Instant scaling reads as a glitch rather than a response; anything much slower\n * than this feels laggy when sweeping the pointer across several objects.\n */\nconst SCALE_SMOOTH_SECONDS = 0.09;\n\ntype HoverRecord = {\n /** The shell added for the colour effect, if any. */\n shell: THREE.Object3D | null;\n /** Authored scale, restored exactly when hover ends. */\n baseScale: THREE.Vector3;\n /** Current interpolation, 0 = authored size, 1 = fully hovered. */\n progress: number;\n /** False once hover ends, so the effect can animate back out. */\n active: boolean;\n};\n\nexport class XRHoverVisualSystem implements EcsSystem {\n private readonly interactionSystem: XRInteractionSystem;\n private readonly records = new Map<number, HoverRecord>();\n\n constructor(interactionSystem: XRInteractionSystem) {\n this.interactionSystem = interactionSystem;\n }\n\n update(world: World, deltaTime: number): void {\n if (!world.isXrPresenting()) {\n this.clearAll(world);\n return;\n }\n\n const hovered = this.interactionSystem.getHoveredEntityIds();\n // A held object is not \"hovered\" — the feedback exists to say what you are\n // ABOUT to grab, and scaling something already in your hand fights the grab.\n const held = this.interactionSystem.getHeldEntityIds();\n\n for (const entityId of hovered) {\n if (held.has(entityId)) continue;\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n if (!interactable?.enabled) continue;\n if (interactable.hoverBehavior === \"none\") continue;\n this.begin(world, entityId, interactable);\n }\n\n for (const [entityId, record] of this.records) {\n if (!hovered.has(entityId) || held.has(entityId)) {\n record.active = false;\n }\n }\n\n this.animate(world, deltaTime);\n }\n\n private begin(\n world: World,\n entityId: number,\n interactable: XRInteractableComponent,\n ): void {\n const existing = this.records.get(entityId);\n if (existing) {\n existing.active = true;\n return;\n }\n\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) return;\n\n const wantsColor =\n interactable.hoverBehavior === \"color\" ||\n interactable.hoverBehavior === \"both\";\n\n this.records.set(entityId, {\n shell: wantsColor ? this.addShell(world, entityId, interactable) : null,\n baseScale: new THREE.Vector3(\n transform.scale.x,\n transform.scale.y,\n transform.scale.z,\n ),\n progress: 0,\n active: true,\n });\n }\n\n /** Build an inflated back-face copy of the object's meshes. */\n private addShell(\n world: World,\n entityId: number,\n interactable: XRInteractableComponent,\n ): THREE.Object3D | null {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!object) return null;\n\n const material = new THREE.MeshBasicMaterial({\n color: new THREE.Color(interactable.hoverColor),\n // Back faces only, so the shell shows just outside the silhouette instead\n // of covering the object.\n side: THREE.BackSide,\n transparent: true,\n opacity: 0.85,\n depthWrite: false,\n });\n\n const group = new THREE.Group();\n group.name = \"XRHoverShell\";\n group.userData[XR_HOVER_SHELL_FLAG] = true;\n group.renderOrder = 998;\n\n object.traverse((child) => {\n if (!(child instanceof THREE.Mesh) || !child.geometry) return;\n // Never copy another shell — nested hovers would compound.\n if (child.userData[XR_HOVER_SHELL_FLAG]) return;\n\n const clone = new THREE.Mesh(child.geometry, material);\n // Position the copy where the source mesh sits relative to the entity\n // root, so multi-mesh models outline correctly rather than collapsing.\n child.updateWorldMatrix(true, false);\n object.updateWorldMatrix(true, false);\n clone.matrixAutoUpdate = false;\n clone.matrix\n .copy(object.matrixWorld)\n .invert()\n .multiply(child.matrixWorld)\n .scale(new THREE.Vector3(SHELL_INFLATE, SHELL_INFLATE, SHELL_INFLATE));\n clone.userData[XR_HOVER_SHELL_FLAG] = true;\n clone.raycast = () => {\n // The shell must be invisible to grab raycasts or it would shadow the\n // very object it is highlighting.\n };\n group.add(clone);\n });\n\n if (group.children.length === 0) {\n material.dispose();\n return null;\n }\n\n object.add(group);\n return group;\n }\n\n private animate(world: World, deltaTime: number): void {\n // Exponential approach — frame-rate independent, and settles without the\n // overshoot a spring would add.\n const step =\n SCALE_SMOOTH_SECONDS <= 0\n ? 1\n : 1 - Math.exp(-Math.max(0, deltaTime) / SCALE_SMOOTH_SECONDS);\n\n for (const [entityId, record] of Array.from(this.records)) {\n const interactable = world.getComponent(entityId, XRInteractableComponent);\n const target = record.active ? 1 : 0;\n record.progress += (target - record.progress) * step;\n\n const wantsScale =\n interactable?.hoverBehavior === \"scale\" ||\n interactable?.hoverBehavior === \"both\";\n\n if (wantsScale) {\n const transform = world.getComponent(entityId, TransformComponent);\n if (transform) {\n const factor =\n 1 + (interactable.hoverScale - 1) * Math.min(1, record.progress);\n transform.scale.x = record.baseScale.x * factor;\n transform.scale.y = record.baseScale.y * factor;\n transform.scale.z = record.baseScale.z * factor;\n }\n }\n\n if (!record.active && record.progress < 0.01) {\n this.finish(world, entityId, record);\n }\n }\n }\n\n /** Remove the effect and restore the authored scale exactly. */\n private finish(\n world: World,\n entityId: number,\n record: HoverRecord,\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n if (transform) {\n // Written exactly rather than left at the tail of the interpolation, so\n // hovering an object repeatedly cannot drift its authored size.\n transform.scale.x = record.baseScale.x;\n transform.scale.y = record.baseScale.y;\n transform.scale.z = record.baseScale.z;\n }\n this.disposeShell(record.shell);\n this.records.delete(entityId);\n }\n\n private disposeShell(shell: THREE.Object3D | null): void {\n if (!shell) return;\n shell.parent?.remove(shell);\n shell.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n const material = child.material;\n // Geometry is SHARED with the source mesh — disposing it would destroy\n // the object being highlighted.\n if (Array.isArray(material)) {\n for (const entry of material) entry.dispose();\n } else {\n material?.dispose();\n }\n }\n });\n }\n\n private clearAll(world: World): void {\n for (const [entityId, record] of Array.from(this.records)) {\n this.finish(world, entityId, record);\n }\n }\n\n dispose(): void {\n for (const record of this.records.values()) {\n this.disposeShell(record.shell);\n }\n this.records.clear();\n }\n}\n"]}