155d3d507ee5f73fc9ed189b8de885067a60550750f7730d9ecee4452db48f06.json 38 KB

1
  1. {"ast":null,"code":"import { WebXRAbstractFeature } from \"./WebXRAbstractFeature.js\";\nimport { Vector3, Quaternion } from \"../../Maths/math.vector.js\";\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor.js\";\nimport { CreateSphere } from \"../../Meshes/Builders/sphereBuilder.js\";\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager.js\";\nimport { Logger } from \"../../Misc/logger.js\";\n/**\n * Options for the controller physics feature\n */\nexport class IWebXRControllerPhysicsOptions {}\n/**\n * Add physics impostor to your webxr controllers,\n * including naive calculation of their linear and angular velocity\n */\nexport class WebXRControllerPhysics extends WebXRAbstractFeature {\n _createPhysicsImpostor(xrController) {\n const impostorType = this._options.physicsProperties.impostorType || PhysicsImpostor.SphereImpostor;\n const impostorSize = this._options.physicsProperties.impostorSize || 0.1;\n const impostorMesh = CreateSphere(\"impostor-mesh-\" + xrController.uniqueId, {\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth\n });\n impostorMesh.isVisible = this._debugMode;\n impostorMesh.isPickable = false;\n impostorMesh.rotationQuaternion = new Quaternion();\n const controllerMesh = xrController.grip || xrController.pointer;\n impostorMesh.position.copyFrom(controllerMesh.position);\n impostorMesh.rotationQuaternion.copyFrom(controllerMesh.rotationQuaternion);\n const impostor = new PhysicsImpostor(impostorMesh, impostorType, {\n mass: 0,\n ...this._options.physicsProperties\n });\n this._controllers[xrController.uniqueId] = {\n xrController,\n impostor,\n impostorMesh\n };\n }\n /**\n * Construct a new Controller Physics Feature\n * @param _xrSessionManager the corresponding xr session manager\n * @param _options options to create this feature with\n */\n constructor(_xrSessionManager, _options) {\n super(_xrSessionManager);\n this._options = _options;\n this._attachController = xrController => {\n if (this._controllers[xrController.uniqueId]) {\n // already attached\n return;\n }\n if (!this._xrSessionManager.scene.isPhysicsEnabled()) {\n Logger.Warn(\"physics engine not enabled, skipped. Please add this controller manually.\");\n }\n // if no motion controller available, create impostors!\n if (this._options.physicsProperties.useControllerMesh && xrController.inputSource.gamepad) {\n xrController.onMotionControllerInitObservable.addOnce(motionController => {\n if (!motionController._doNotLoadControllerMesh) {\n motionController.onModelLoadedObservable.addOnce(() => {\n const impostor = new PhysicsImpostor(motionController.rootMesh, PhysicsImpostor.MeshImpostor, {\n mass: 0,\n ...this._options.physicsProperties\n });\n const controllerMesh = xrController.grip || xrController.pointer;\n this._controllers[xrController.uniqueId] = {\n xrController,\n impostor,\n oldPos: controllerMesh.position.clone(),\n oldRotation: controllerMesh.rotationQuaternion.clone()\n };\n });\n } else {\n // This controller isn't using a model, create impostors instead\n this._createPhysicsImpostor(xrController);\n }\n });\n } else {\n this._createPhysicsImpostor(xrController);\n }\n };\n this._controllers = {};\n this._debugMode = false;\n this._delta = 0;\n this._lastTimestamp = 0;\n this._tmpQuaternion = new Quaternion();\n this._tmpVector = new Vector3();\n if (!this._options.physicsProperties) {\n this._options.physicsProperties = {};\n }\n }\n /**\n * @internal\n * enable debugging - will show console outputs and the impostor mesh\n */\n _enablePhysicsDebug() {\n this._debugMode = true;\n Object.keys(this._controllers).forEach(controllerId => {\n const controllerData = this._controllers[controllerId];\n if (controllerData.impostorMesh) {\n controllerData.impostorMesh.isVisible = true;\n }\n });\n }\n /**\n * Manually add a controller (if no xrInput was provided or physics engine was not enabled)\n * @param xrController the controller to add\n */\n addController(xrController) {\n this._attachController(xrController);\n }\n /**\n * attach this feature\n * Will usually be called by the features manager\n *\n * @returns true if successful.\n */\n attach() {\n if (!super.attach()) {\n return false;\n }\n if (!this._options.xrInput) {\n return true;\n }\n this._options.xrInput.controllers.forEach(this._attachController);\n this._addNewAttachObserver(this._options.xrInput.onControllerAddedObservable, this._attachController);\n this._addNewAttachObserver(this._options.xrInput.onControllerRemovedObservable, controller => {\n // REMOVE the controller\n this._detachController(controller.uniqueId);\n });\n if (this._options.enableHeadsetImpostor) {\n const params = this._options.headsetImpostorParams || {\n impostorType: PhysicsImpostor.SphereImpostor,\n restitution: 0.8,\n impostorSize: 0.3\n };\n const impostorSize = params.impostorSize || 0.3;\n this._headsetMesh = CreateSphere(\"headset-mesh\", {\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth\n });\n this._headsetMesh.rotationQuaternion = new Quaternion();\n this._headsetMesh.isVisible = false;\n this._headsetImpostor = new PhysicsImpostor(this._headsetMesh, params.impostorType, {\n mass: 0,\n ...params\n });\n }\n return true;\n }\n /**\n * detach this feature.\n * Will usually be called by the features manager\n *\n * @returns true if successful.\n */\n detach() {\n if (!super.detach()) {\n return false;\n }\n Object.keys(this._controllers).forEach(controllerId => {\n this._detachController(controllerId);\n });\n if (this._headsetMesh) {\n this._headsetMesh.dispose();\n }\n return true;\n }\n /**\n * Get the headset impostor, if enabled\n * @returns the impostor\n */\n getHeadsetImpostor() {\n return this._headsetImpostor;\n }\n /**\n * Get the physics impostor of a specific controller.\n * The impostor is not attached to a mesh because a mesh for each controller is not obligatory\n * @param controller the controller or the controller id of which to get the impostor\n * @returns the impostor or null\n */\n getImpostorForController(controller) {\n const id = typeof controller === \"string\" ? controller : controller.uniqueId;\n if (this._controllers[id]) {\n return this._controllers[id].impostor;\n } else {\n return null;\n }\n }\n /**\n * Update the physics properties provided in the constructor\n * @param newProperties the new properties object\n * @param newProperties.impostorType\n * @param newProperties.impostorSize\n * @param newProperties.friction\n * @param newProperties.restitution\n */\n setPhysicsProperties(newProperties) {\n this._options.physicsProperties = {\n ...this._options.physicsProperties,\n ...newProperties\n };\n }\n _onXRFrame(_xrFrame) {\n this._delta = this._xrSessionManager.currentTimestamp - this._lastTimestamp;\n this._lastTimestamp = this._xrSessionManager.currentTimestamp;\n if (this._headsetMesh && this._headsetImpostor) {\n var _this$_options$xrInpu, _this$_options$xrInpu2;\n this._headsetMesh.position.copyFrom(this._options.xrInput.xrCamera.globalPosition);\n this._headsetMesh.rotationQuaternion.copyFrom(this._options.xrInput.xrCamera.absoluteRotation);\n if ((_this$_options$xrInpu = this._options.xrInput.xrCamera._lastXRViewerPose) !== null && _this$_options$xrInpu !== void 0 && _this$_options$xrInpu.linearVelocity) {\n const lv = this._options.xrInput.xrCamera._lastXRViewerPose.linearVelocity;\n this._tmpVector.set(lv.x, lv.y, lv.z);\n this._headsetImpostor.setLinearVelocity(this._tmpVector);\n }\n if ((_this$_options$xrInpu2 = this._options.xrInput.xrCamera._lastXRViewerPose) !== null && _this$_options$xrInpu2 !== void 0 && _this$_options$xrInpu2.angularVelocity) {\n const av = this._options.xrInput.xrCamera._lastXRViewerPose.angularVelocity;\n this._tmpVector.set(av.x, av.y, av.z);\n this._headsetImpostor.setAngularVelocity(this._tmpVector);\n }\n }\n Object.keys(this._controllers).forEach(controllerId => {\n var _controllerData$xrCon, _controllerData$xrCon2;\n const controllerData = this._controllers[controllerId];\n const controllerMesh = controllerData.xrController.grip || controllerData.xrController.pointer;\n const comparedPosition = controllerData.oldPos || controllerData.impostorMesh.position;\n if ((_controllerData$xrCon = controllerData.xrController._lastXRPose) !== null && _controllerData$xrCon !== void 0 && _controllerData$xrCon.linearVelocity) {\n const lv = controllerData.xrController._lastXRPose.linearVelocity;\n this._tmpVector.set(lv.x, lv.y, lv.z);\n controllerData.impostor.setLinearVelocity(this._tmpVector);\n } else {\n controllerMesh.position.subtractToRef(comparedPosition, this._tmpVector);\n this._tmpVector.scaleInPlace(1000 / this._delta);\n controllerData.impostor.setLinearVelocity(this._tmpVector);\n }\n comparedPosition.copyFrom(controllerMesh.position);\n if (this._debugMode) {\n Logger.Log([this._tmpVector, \"linear\"]);\n }\n const comparedQuaternion = controllerData.oldRotation || controllerData.impostorMesh.rotationQuaternion;\n if ((_controllerData$xrCon2 = controllerData.xrController._lastXRPose) !== null && _controllerData$xrCon2 !== void 0 && _controllerData$xrCon2.angularVelocity) {\n const av = controllerData.xrController._lastXRPose.angularVelocity;\n this._tmpVector.set(av.x, av.y, av.z);\n controllerData.impostor.setAngularVelocity(this._tmpVector);\n } else {\n if (!comparedQuaternion.equalsWithEpsilon(controllerMesh.rotationQuaternion)) {\n // roughly based on this - https://www.gamedev.net/forums/topic/347752-quaternion-and-angular-velocity/\n comparedQuaternion.conjugateInPlace().multiplyToRef(controllerMesh.rotationQuaternion, this._tmpQuaternion);\n const len = Math.sqrt(this._tmpQuaternion.x * this._tmpQuaternion.x + this._tmpQuaternion.y * this._tmpQuaternion.y + this._tmpQuaternion.z * this._tmpQuaternion.z);\n this._tmpVector.set(this._tmpQuaternion.x, this._tmpQuaternion.y, this._tmpQuaternion.z);\n // define a better epsilon\n if (len < 0.001) {\n this._tmpVector.scaleInPlace(2);\n } else {\n const angle = 2 * Math.atan2(len, this._tmpQuaternion.w);\n this._tmpVector.scaleInPlace(angle / (len * (this._delta / 1000)));\n }\n controllerData.impostor.setAngularVelocity(this._tmpVector);\n }\n }\n comparedQuaternion.copyFrom(controllerMesh.rotationQuaternion);\n if (this._debugMode) {\n Logger.Log([this._tmpVector, this._tmpQuaternion, \"angular\"]);\n }\n });\n }\n _detachController(xrControllerUniqueId) {\n const controllerData = this._controllers[xrControllerUniqueId];\n if (!controllerData) {\n return;\n }\n if (controllerData.impostorMesh) {\n controllerData.impostorMesh.dispose();\n }\n // remove from the map\n delete this._controllers[xrControllerUniqueId];\n }\n}\n/**\n * The module's name\n */\nWebXRControllerPhysics.Name = WebXRFeatureName.PHYSICS_CONTROLLERS;\n/**\n * The (Babylon) version of this module.\n * This is an integer representing the implementation version.\n * This number does not correspond to the webxr specs version\n */\nWebXRControllerPhysics.Version = 1;\n//register the plugin\nWebXRFeaturesManager.AddWebXRFeature(WebXRControllerPhysics.Name, (xrSessionManager, options) => {\n return () => new WebXRControllerPhysics(xrSessionManager, options);\n}, WebXRControllerPhysics.Version, true);","map":{"version":3,"names":["WebXRAbstractFeature","Vector3","Quaternion","PhysicsImpostor","CreateSphere","WebXRFeatureName","WebXRFeaturesManager","Logger","IWebXRControllerPhysicsOptions","WebXRControllerPhysics","_createPhysicsImpostor","xrController","impostorType","_options","physicsProperties","SphereImpostor","impostorSize","impostorMesh","uniqueId","diameterX","width","diameterY","height","diameterZ","depth","isVisible","_debugMode","isPickable","rotationQuaternion","controllerMesh","grip","pointer","position","copyFrom","impostor","mass","_controllers","constructor","_xrSessionManager","_attachController","scene","isPhysicsEnabled","Warn","useControllerMesh","inputSource","gamepad","onMotionControllerInitObservable","addOnce","motionController","_doNotLoadControllerMesh","onModelLoadedObservable","rootMesh","MeshImpostor","oldPos","clone","oldRotation","_delta","_lastTimestamp","_tmpQuaternion","_tmpVector","_enablePhysicsDebug","Object","keys","forEach","controllerId","controllerData","addController","attach","xrInput","controllers","_addNewAttachObserver","onControllerAddedObservable","onControllerRemovedObservable","controller","_detachController","enableHeadsetImpostor","params","headsetImpostorParams","restitution","_headsetMesh","_headsetImpostor","detach","dispose","getHeadsetImpostor","getImpostorForController","id","setPhysicsProperties","newProperties","_onXRFrame","_xrFrame","currentTimestamp","_this$_options$xrInpu","_this$_options$xrInpu2","xrCamera","globalPosition","absoluteRotation","_lastXRViewerPose","linearVelocity","lv","set","x","y","z","setLinearVelocity","angularVelocity","av","setAngularVelocity","_controllerData$xrCon","_controllerData$xrCon2","comparedPosition","_lastXRPose","subtractToRef","scaleInPlace","Log","comparedQuaternion","equalsWithEpsilon","conjugateInPlace","multiplyToRef","len","Math","sqrt","angle","atan2","w","xrControllerUniqueId","Name","PHYSICS_CONTROLLERS","Version","AddWebXRFeature","xrSessionManager","options"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/XR/features/WebXRControllerPhysics.js"],"sourcesContent":["import { WebXRAbstractFeature } from \"./WebXRAbstractFeature.js\";\nimport { Vector3, Quaternion } from \"../../Maths/math.vector.js\";\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor.js\";\nimport { CreateSphere } from \"../../Meshes/Builders/sphereBuilder.js\";\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager.js\";\nimport { Logger } from \"../../Misc/logger.js\";\n/**\n * Options for the controller physics feature\n */\nexport class IWebXRControllerPhysicsOptions {\n}\n/**\n * Add physics impostor to your webxr controllers,\n * including naive calculation of their linear and angular velocity\n */\nexport class WebXRControllerPhysics extends WebXRAbstractFeature {\n _createPhysicsImpostor(xrController) {\n const impostorType = this._options.physicsProperties.impostorType || PhysicsImpostor.SphereImpostor;\n const impostorSize = this._options.physicsProperties.impostorSize || 0.1;\n const impostorMesh = CreateSphere(\"impostor-mesh-\" + xrController.uniqueId, {\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\n });\n impostorMesh.isVisible = this._debugMode;\n impostorMesh.isPickable = false;\n impostorMesh.rotationQuaternion = new Quaternion();\n const controllerMesh = xrController.grip || xrController.pointer;\n impostorMesh.position.copyFrom(controllerMesh.position);\n impostorMesh.rotationQuaternion.copyFrom(controllerMesh.rotationQuaternion);\n const impostor = new PhysicsImpostor(impostorMesh, impostorType, {\n mass: 0,\n ...this._options.physicsProperties,\n });\n this._controllers[xrController.uniqueId] = {\n xrController,\n impostor,\n impostorMesh,\n };\n }\n /**\n * Construct a new Controller Physics Feature\n * @param _xrSessionManager the corresponding xr session manager\n * @param _options options to create this feature with\n */\n constructor(_xrSessionManager, _options) {\n super(_xrSessionManager);\n this._options = _options;\n this._attachController = (xrController) => {\n if (this._controllers[xrController.uniqueId]) {\n // already attached\n return;\n }\n if (!this._xrSessionManager.scene.isPhysicsEnabled()) {\n Logger.Warn(\"physics engine not enabled, skipped. Please add this controller manually.\");\n }\n // if no motion controller available, create impostors!\n if (this._options.physicsProperties.useControllerMesh && xrController.inputSource.gamepad) {\n xrController.onMotionControllerInitObservable.addOnce((motionController) => {\n if (!motionController._doNotLoadControllerMesh) {\n motionController.onModelLoadedObservable.addOnce(() => {\n const impostor = new PhysicsImpostor(motionController.rootMesh, PhysicsImpostor.MeshImpostor, {\n mass: 0,\n ...this._options.physicsProperties,\n });\n const controllerMesh = xrController.grip || xrController.pointer;\n this._controllers[xrController.uniqueId] = {\n xrController,\n impostor,\n oldPos: controllerMesh.position.clone(),\n oldRotation: controllerMesh.rotationQuaternion.clone(),\n };\n });\n }\n else {\n // This controller isn't using a model, create impostors instead\n this._createPhysicsImpostor(xrController);\n }\n });\n }\n else {\n this._createPhysicsImpostor(xrController);\n }\n };\n this._controllers = {};\n this._debugMode = false;\n this._delta = 0;\n this._lastTimestamp = 0;\n this._tmpQuaternion = new Quaternion();\n this._tmpVector = new Vector3();\n if (!this._options.physicsProperties) {\n this._options.physicsProperties = {};\n }\n }\n /**\n * @internal\n * enable debugging - will show console outputs and the impostor mesh\n */\n _enablePhysicsDebug() {\n this._debugMode = true;\n Object.keys(this._controllers).forEach((controllerId) => {\n const controllerData = this._controllers[controllerId];\n if (controllerData.impostorMesh) {\n controllerData.impostorMesh.isVisible = true;\n }\n });\n }\n /**\n * Manually add a controller (if no xrInput was provided or physics engine was not enabled)\n * @param xrController the controller to add\n */\n addController(xrController) {\n this._attachController(xrController);\n }\n /**\n * attach this feature\n * Will usually be called by the features manager\n *\n * @returns true if successful.\n */\n attach() {\n if (!super.attach()) {\n return false;\n }\n if (!this._options.xrInput) {\n return true;\n }\n this._options.xrInput.controllers.forEach(this._attachController);\n this._addNewAttachObserver(this._options.xrInput.onControllerAddedObservable, this._attachController);\n this._addNewAttachObserver(this._options.xrInput.onControllerRemovedObservable, (controller) => {\n // REMOVE the controller\n this._detachController(controller.uniqueId);\n });\n if (this._options.enableHeadsetImpostor) {\n const params = this._options.headsetImpostorParams || {\n impostorType: PhysicsImpostor.SphereImpostor,\n restitution: 0.8,\n impostorSize: 0.3,\n };\n const impostorSize = params.impostorSize || 0.3;\n this._headsetMesh = CreateSphere(\"headset-mesh\", {\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\n });\n this._headsetMesh.rotationQuaternion = new Quaternion();\n this._headsetMesh.isVisible = false;\n this._headsetImpostor = new PhysicsImpostor(this._headsetMesh, params.impostorType, { mass: 0, ...params });\n }\n return true;\n }\n /**\n * detach this feature.\n * Will usually be called by the features manager\n *\n * @returns true if successful.\n */\n detach() {\n if (!super.detach()) {\n return false;\n }\n Object.keys(this._controllers).forEach((controllerId) => {\n this._detachController(controllerId);\n });\n if (this._headsetMesh) {\n this._headsetMesh.dispose();\n }\n return true;\n }\n /**\n * Get the headset impostor, if enabled\n * @returns the impostor\n */\n getHeadsetImpostor() {\n return this._headsetImpostor;\n }\n /**\n * Get the physics impostor of a specific controller.\n * The impostor is not attached to a mesh because a mesh for each controller is not obligatory\n * @param controller the controller or the controller id of which to get the impostor\n * @returns the impostor or null\n */\n getImpostorForController(controller) {\n const id = typeof controller === \"string\" ? controller : controller.uniqueId;\n if (this._controllers[id]) {\n return this._controllers[id].impostor;\n }\n else {\n return null;\n }\n }\n /**\n * Update the physics properties provided in the constructor\n * @param newProperties the new properties object\n * @param newProperties.impostorType\n * @param newProperties.impostorSize\n * @param newProperties.friction\n * @param newProperties.restitution\n */\n setPhysicsProperties(newProperties) {\n this._options.physicsProperties = {\n ...this._options.physicsProperties,\n ...newProperties,\n };\n }\n _onXRFrame(_xrFrame) {\n this._delta = this._xrSessionManager.currentTimestamp - this._lastTimestamp;\n this._lastTimestamp = this._xrSessionManager.currentTimestamp;\n if (this._headsetMesh && this._headsetImpostor) {\n this._headsetMesh.position.copyFrom(this._options.xrInput.xrCamera.globalPosition);\n this._headsetMesh.rotationQuaternion.copyFrom(this._options.xrInput.xrCamera.absoluteRotation);\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.linearVelocity) {\n const lv = this._options.xrInput.xrCamera._lastXRViewerPose.linearVelocity;\n this._tmpVector.set(lv.x, lv.y, lv.z);\n this._headsetImpostor.setLinearVelocity(this._tmpVector);\n }\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.angularVelocity) {\n const av = this._options.xrInput.xrCamera._lastXRViewerPose.angularVelocity;\n this._tmpVector.set(av.x, av.y, av.z);\n this._headsetImpostor.setAngularVelocity(this._tmpVector);\n }\n }\n Object.keys(this._controllers).forEach((controllerId) => {\n const controllerData = this._controllers[controllerId];\n const controllerMesh = controllerData.xrController.grip || controllerData.xrController.pointer;\n const comparedPosition = controllerData.oldPos || controllerData.impostorMesh.position;\n if (controllerData.xrController._lastXRPose?.linearVelocity) {\n const lv = controllerData.xrController._lastXRPose.linearVelocity;\n this._tmpVector.set(lv.x, lv.y, lv.z);\n controllerData.impostor.setLinearVelocity(this._tmpVector);\n }\n else {\n controllerMesh.position.subtractToRef(comparedPosition, this._tmpVector);\n this._tmpVector.scaleInPlace(1000 / this._delta);\n controllerData.impostor.setLinearVelocity(this._tmpVector);\n }\n comparedPosition.copyFrom(controllerMesh.position);\n if (this._debugMode) {\n Logger.Log([this._tmpVector, \"linear\"]);\n }\n const comparedQuaternion = controllerData.oldRotation || controllerData.impostorMesh.rotationQuaternion;\n if (controllerData.xrController._lastXRPose?.angularVelocity) {\n const av = controllerData.xrController._lastXRPose.angularVelocity;\n this._tmpVector.set(av.x, av.y, av.z);\n controllerData.impostor.setAngularVelocity(this._tmpVector);\n }\n else {\n if (!comparedQuaternion.equalsWithEpsilon(controllerMesh.rotationQuaternion)) {\n // roughly based on this - https://www.gamedev.net/forums/topic/347752-quaternion-and-angular-velocity/\n comparedQuaternion.conjugateInPlace().multiplyToRef(controllerMesh.rotationQuaternion, this._tmpQuaternion);\n const len = Math.sqrt(this._tmpQuaternion.x * this._tmpQuaternion.x + this._tmpQuaternion.y * this._tmpQuaternion.y + this._tmpQuaternion.z * this._tmpQuaternion.z);\n this._tmpVector.set(this._tmpQuaternion.x, this._tmpQuaternion.y, this._tmpQuaternion.z);\n // define a better epsilon\n if (len < 0.001) {\n this._tmpVector.scaleInPlace(2);\n }\n else {\n const angle = 2 * Math.atan2(len, this._tmpQuaternion.w);\n this._tmpVector.scaleInPlace(angle / (len * (this._delta / 1000)));\n }\n controllerData.impostor.setAngularVelocity(this._tmpVector);\n }\n }\n comparedQuaternion.copyFrom(controllerMesh.rotationQuaternion);\n if (this._debugMode) {\n Logger.Log([this._tmpVector, this._tmpQuaternion, \"angular\"]);\n }\n });\n }\n _detachController(xrControllerUniqueId) {\n const controllerData = this._controllers[xrControllerUniqueId];\n if (!controllerData) {\n return;\n }\n if (controllerData.impostorMesh) {\n controllerData.impostorMesh.dispose();\n }\n // remove from the map\n delete this._controllers[xrControllerUniqueId];\n }\n}\n/**\n * The module's name\n */\nWebXRControllerPhysics.Name = WebXRFeatureName.PHYSICS_CONTROLLERS;\n/**\n * The (Babylon) version of this module.\n * This is an integer representing the implementation version.\n * This number does not correspond to the webxr specs version\n */\nWebXRControllerPhysics.Version = 1;\n//register the plugin\nWebXRFeaturesManager.AddWebXRFeature(WebXRControllerPhysics.Name, (xrSessionManager, options) => {\n return () => new WebXRControllerPhysics(xrSessionManager, options);\n}, WebXRControllerPhysics.Version, true);\n"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,2BAA2B;AAChE,SAASC,OAAO,EAAEC,UAAU,QAAQ,4BAA4B;AAChE,SAASC,eAAe,QAAQ,qCAAqC;AACrE,SAASC,YAAY,QAAQ,wCAAwC;AACrE,SAASC,gBAAgB,EAAEC,oBAAoB,QAAQ,4BAA4B;AACnF,SAASC,MAAM,QAAQ,sBAAsB;AAC7C;AACA;AACA;AACA,OAAO,MAAMC,8BAA8B,CAAC;AAE5C;AACA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAAST,oBAAoB,CAAC;EAC7DU,sBAAsBA,CAACC,YAAY,EAAE;IACjC,MAAMC,YAAY,GAAG,IAAI,CAACC,QAAQ,CAACC,iBAAiB,CAACF,YAAY,IAAIT,eAAe,CAACY,cAAc;IACnG,MAAMC,YAAY,GAAG,IAAI,CAACH,QAAQ,CAACC,iBAAiB,CAACE,YAAY,IAAI,GAAG;IACxE,MAAMC,YAAY,GAAGb,YAAY,CAAC,gBAAgB,GAAGO,YAAY,CAACO,QAAQ,EAAE;MACxEC,SAAS,EAAE,OAAOH,YAAY,KAAK,QAAQ,GAAGA,YAAY,GAAGA,YAAY,CAACI,KAAK;MAC/EC,SAAS,EAAE,OAAOL,YAAY,KAAK,QAAQ,GAAGA,YAAY,GAAGA,YAAY,CAACM,MAAM;MAChFC,SAAS,EAAE,OAAOP,YAAY,KAAK,QAAQ,GAAGA,YAAY,GAAGA,YAAY,CAACQ;IAC9E,CAAC,CAAC;IACFP,YAAY,CAACQ,SAAS,GAAG,IAAI,CAACC,UAAU;IACxCT,YAAY,CAACU,UAAU,GAAG,KAAK;IAC/BV,YAAY,CAACW,kBAAkB,GAAG,IAAI1B,UAAU,CAAC,CAAC;IAClD,MAAM2B,cAAc,GAAGlB,YAAY,CAACmB,IAAI,IAAInB,YAAY,CAACoB,OAAO;IAChEd,YAAY,CAACe,QAAQ,CAACC,QAAQ,CAACJ,cAAc,CAACG,QAAQ,CAAC;IACvDf,YAAY,CAACW,kBAAkB,CAACK,QAAQ,CAACJ,cAAc,CAACD,kBAAkB,CAAC;IAC3E,MAAMM,QAAQ,GAAG,IAAI/B,eAAe,CAACc,YAAY,EAAEL,YAAY,EAAE;MAC7DuB,IAAI,EAAE,CAAC;MACP,GAAG,IAAI,CAACtB,QAAQ,CAACC;IACrB,CAAC,CAAC;IACF,IAAI,CAACsB,YAAY,CAACzB,YAAY,CAACO,QAAQ,CAAC,GAAG;MACvCP,YAAY;MACZuB,QAAQ;MACRjB;IACJ,CAAC;EACL;EACA;AACJ;AACA;AACA;AACA;EACIoB,WAAWA,CAACC,iBAAiB,EAAEzB,QAAQ,EAAE;IACrC,KAAK,CAACyB,iBAAiB,CAAC;IACxB,IAAI,CAACzB,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAAC0B,iBAAiB,GAAI5B,YAAY,IAAK;MACvC,IAAI,IAAI,CAACyB,YAAY,CAACzB,YAAY,CAACO,QAAQ,CAAC,EAAE;QAC1C;QACA;MACJ;MACA,IAAI,CAAC,IAAI,CAACoB,iBAAiB,CAACE,KAAK,CAACC,gBAAgB,CAAC,CAAC,EAAE;QAClDlC,MAAM,CAACmC,IAAI,CAAC,2EAA2E,CAAC;MAC5F;MACA;MACA,IAAI,IAAI,CAAC7B,QAAQ,CAACC,iBAAiB,CAAC6B,iBAAiB,IAAIhC,YAAY,CAACiC,WAAW,CAACC,OAAO,EAAE;QACvFlC,YAAY,CAACmC,gCAAgC,CAACC,OAAO,CAAEC,gBAAgB,IAAK;UACxE,IAAI,CAACA,gBAAgB,CAACC,wBAAwB,EAAE;YAC5CD,gBAAgB,CAACE,uBAAuB,CAACH,OAAO,CAAC,MAAM;cACnD,MAAMb,QAAQ,GAAG,IAAI/B,eAAe,CAAC6C,gBAAgB,CAACG,QAAQ,EAAEhD,eAAe,CAACiD,YAAY,EAAE;gBAC1FjB,IAAI,EAAE,CAAC;gBACP,GAAG,IAAI,CAACtB,QAAQ,CAACC;cACrB,CAAC,CAAC;cACF,MAAMe,cAAc,GAAGlB,YAAY,CAACmB,IAAI,IAAInB,YAAY,CAACoB,OAAO;cAChE,IAAI,CAACK,YAAY,CAACzB,YAAY,CAACO,QAAQ,CAAC,GAAG;gBACvCP,YAAY;gBACZuB,QAAQ;gBACRmB,MAAM,EAAExB,cAAc,CAACG,QAAQ,CAACsB,KAAK,CAAC,CAAC;gBACvCC,WAAW,EAAE1B,cAAc,CAACD,kBAAkB,CAAC0B,KAAK,CAAC;cACzD,CAAC;YACL,CAAC,CAAC;UACN,CAAC,MACI;YACD;YACA,IAAI,CAAC5C,sBAAsB,CAACC,YAAY,CAAC;UAC7C;QACJ,CAAC,CAAC;MACN,CAAC,MACI;QACD,IAAI,CAACD,sBAAsB,CAACC,YAAY,CAAC;MAC7C;IACJ,CAAC;IACD,IAAI,CAACyB,YAAY,GAAG,CAAC,CAAC;IACtB,IAAI,CAACV,UAAU,GAAG,KAAK;IACvB,IAAI,CAAC8B,MAAM,GAAG,CAAC;IACf,IAAI,CAACC,cAAc,GAAG,CAAC;IACvB,IAAI,CAACC,cAAc,GAAG,IAAIxD,UAAU,CAAC,CAAC;IACtC,IAAI,CAACyD,UAAU,GAAG,IAAI1D,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,CAACY,QAAQ,CAACC,iBAAiB,EAAE;MAClC,IAAI,CAACD,QAAQ,CAACC,iBAAiB,GAAG,CAAC,CAAC;IACxC;EACJ;EACA;AACJ;AACA;AACA;EACI8C,mBAAmBA,CAAA,EAAG;IAClB,IAAI,CAAClC,UAAU,GAAG,IAAI;IACtBmC,MAAM,CAACC,IAAI,CAAC,IAAI,CAAC1B,YAAY,CAAC,CAAC2B,OAAO,CAAEC,YAAY,IAAK;MACrD,MAAMC,cAAc,GAAG,IAAI,CAAC7B,YAAY,CAAC4B,YAAY,CAAC;MACtD,IAAIC,cAAc,CAAChD,YAAY,EAAE;QAC7BgD,cAAc,CAAChD,YAAY,CAACQ,SAAS,GAAG,IAAI;MAChD;IACJ,CAAC,CAAC;EACN;EACA;AACJ;AACA;AACA;EACIyC,aAAaA,CAACvD,YAAY,EAAE;IACxB,IAAI,CAAC4B,iBAAiB,CAAC5B,YAAY,CAAC;EACxC;EACA;AACJ;AACA;AACA;AACA;AACA;EACIwD,MAAMA,CAAA,EAAG;IACL,IAAI,CAAC,KAAK,CAACA,MAAM,CAAC,CAAC,EAAE;MACjB,OAAO,KAAK;IAChB;IACA,IAAI,CAAC,IAAI,CAACtD,QAAQ,CAACuD,OAAO,EAAE;MACxB,OAAO,IAAI;IACf;IACA,IAAI,CAACvD,QAAQ,CAACuD,OAAO,CAACC,WAAW,CAACN,OAAO,CAAC,IAAI,CAACxB,iBAAiB,CAAC;IACjE,IAAI,CAAC+B,qBAAqB,CAAC,IAAI,CAACzD,QAAQ,CAACuD,OAAO,CAACG,2BAA2B,EAAE,IAAI,CAAChC,iBAAiB,CAAC;IACrG,IAAI,CAAC+B,qBAAqB,CAAC,IAAI,CAACzD,QAAQ,CAACuD,OAAO,CAACI,6BAA6B,EAAGC,UAAU,IAAK;MAC5F;MACA,IAAI,CAACC,iBAAiB,CAACD,UAAU,CAACvD,QAAQ,CAAC;IAC/C,CAAC,CAAC;IACF,IAAI,IAAI,CAACL,QAAQ,CAAC8D,qBAAqB,EAAE;MACrC,MAAMC,MAAM,GAAG,IAAI,CAAC/D,QAAQ,CAACgE,qBAAqB,IAAI;QAClDjE,YAAY,EAAET,eAAe,CAACY,cAAc;QAC5C+D,WAAW,EAAE,GAAG;QAChB9D,YAAY,EAAE;MAClB,CAAC;MACD,MAAMA,YAAY,GAAG4D,MAAM,CAAC5D,YAAY,IAAI,GAAG;MAC/C,IAAI,CAAC+D,YAAY,GAAG3E,YAAY,CAAC,cAAc,EAAE;QAC7Ce,SAAS,EAAE,OAAOH,YAAY,KAAK,QAAQ,GAAGA,YAAY,GAAGA,YAAY,CAACI,KAAK;QAC/EC,SAAS,EAAE,OAAOL,YAAY,KAAK,QAAQ,GAAGA,YAAY,GAAGA,YAAY,CAACM,MAAM;QAChFC,SAAS,EAAE,OAAOP,YAAY,KAAK,QAAQ,GAAGA,YAAY,GAAGA,YAAY,CAACQ;MAC9E,CAAC,CAAC;MACF,IAAI,CAACuD,YAAY,CAACnD,kBAAkB,GAAG,IAAI1B,UAAU,CAAC,CAAC;MACvD,IAAI,CAAC6E,YAAY,CAACtD,SAAS,GAAG,KAAK;MACnC,IAAI,CAACuD,gBAAgB,GAAG,IAAI7E,eAAe,CAAC,IAAI,CAAC4E,YAAY,EAAEH,MAAM,CAAChE,YAAY,EAAE;QAAEuB,IAAI,EAAE,CAAC;QAAE,GAAGyC;MAAO,CAAC,CAAC;IAC/G;IACA,OAAO,IAAI;EACf;EACA;AACJ;AACA;AACA;AACA;AACA;EACIK,MAAMA,CAAA,EAAG;IACL,IAAI,CAAC,KAAK,CAACA,MAAM,CAAC,CAAC,EAAE;MACjB,OAAO,KAAK;IAChB;IACApB,MAAM,CAACC,IAAI,CAAC,IAAI,CAAC1B,YAAY,CAAC,CAAC2B,OAAO,CAAEC,YAAY,IAAK;MACrD,IAAI,CAACU,iBAAiB,CAACV,YAAY,CAAC;IACxC,CAAC,CAAC;IACF,IAAI,IAAI,CAACe,YAAY,EAAE;MACnB,IAAI,CAACA,YAAY,CAACG,OAAO,CAAC,CAAC;IAC/B;IACA,OAAO,IAAI;EACf;EACA;AACJ;AACA;AACA;EACIC,kBAAkBA,CAAA,EAAG;IACjB,OAAO,IAAI,CAACH,gBAAgB;EAChC;EACA;AACJ;AACA;AACA;AACA;AACA;EACII,wBAAwBA,CAACX,UAAU,EAAE;IACjC,MAAMY,EAAE,GAAG,OAAOZ,UAAU,KAAK,QAAQ,GAAGA,UAAU,GAAGA,UAAU,CAACvD,QAAQ;IAC5E,IAAI,IAAI,CAACkB,YAAY,CAACiD,EAAE,CAAC,EAAE;MACvB,OAAO,IAAI,CAACjD,YAAY,CAACiD,EAAE,CAAC,CAACnD,QAAQ;IACzC,CAAC,MACI;MACD,OAAO,IAAI;IACf;EACJ;EACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACIoD,oBAAoBA,CAACC,aAAa,EAAE;IAChC,IAAI,CAAC1E,QAAQ,CAACC,iBAAiB,GAAG;MAC9B,GAAG,IAAI,CAACD,QAAQ,CAACC,iBAAiB;MAClC,GAAGyE;IACP,CAAC;EACL;EACAC,UAAUA,CAACC,QAAQ,EAAE;IACjB,IAAI,CAACjC,MAAM,GAAG,IAAI,CAAClB,iBAAiB,CAACoD,gBAAgB,GAAG,IAAI,CAACjC,cAAc;IAC3E,IAAI,CAACA,cAAc,GAAG,IAAI,CAACnB,iBAAiB,CAACoD,gBAAgB;IAC7D,IAAI,IAAI,CAACX,YAAY,IAAI,IAAI,CAACC,gBAAgB,EAAE;MAAA,IAAAW,qBAAA,EAAAC,sBAAA;MAC5C,IAAI,CAACb,YAAY,CAAC/C,QAAQ,CAACC,QAAQ,CAAC,IAAI,CAACpB,QAAQ,CAACuD,OAAO,CAACyB,QAAQ,CAACC,cAAc,CAAC;MAClF,IAAI,CAACf,YAAY,CAACnD,kBAAkB,CAACK,QAAQ,CAAC,IAAI,CAACpB,QAAQ,CAACuD,OAAO,CAACyB,QAAQ,CAACE,gBAAgB,CAAC;MAC9F,KAAAJ,qBAAA,GAAI,IAAI,CAAC9E,QAAQ,CAACuD,OAAO,CAACyB,QAAQ,CAACG,iBAAiB,cAAAL,qBAAA,eAAhDA,qBAAA,CAAkDM,cAAc,EAAE;QAClE,MAAMC,EAAE,GAAG,IAAI,CAACrF,QAAQ,CAACuD,OAAO,CAACyB,QAAQ,CAACG,iBAAiB,CAACC,cAAc;QAC1E,IAAI,CAACtC,UAAU,CAACwC,GAAG,CAACD,EAAE,CAACE,CAAC,EAAEF,EAAE,CAACG,CAAC,EAAEH,EAAE,CAACI,CAAC,CAAC;QACrC,IAAI,CAACtB,gBAAgB,CAACuB,iBAAiB,CAAC,IAAI,CAAC5C,UAAU,CAAC;MAC5D;MACA,KAAAiC,sBAAA,GAAI,IAAI,CAAC/E,QAAQ,CAACuD,OAAO,CAACyB,QAAQ,CAACG,iBAAiB,cAAAJ,sBAAA,eAAhDA,sBAAA,CAAkDY,eAAe,EAAE;QACnE,MAAMC,EAAE,GAAG,IAAI,CAAC5F,QAAQ,CAACuD,OAAO,CAACyB,QAAQ,CAACG,iBAAiB,CAACQ,eAAe;QAC3E,IAAI,CAAC7C,UAAU,CAACwC,GAAG,CAACM,EAAE,CAACL,CAAC,EAAEK,EAAE,CAACJ,CAAC,EAAEI,EAAE,CAACH,CAAC,CAAC;QACrC,IAAI,CAACtB,gBAAgB,CAAC0B,kBAAkB,CAAC,IAAI,CAAC/C,UAAU,CAAC;MAC7D;IACJ;IACAE,MAAM,CAACC,IAAI,CAAC,IAAI,CAAC1B,YAAY,CAAC,CAAC2B,OAAO,CAAEC,YAAY,IAAK;MAAA,IAAA2C,qBAAA,EAAAC,sBAAA;MACrD,MAAM3C,cAAc,GAAG,IAAI,CAAC7B,YAAY,CAAC4B,YAAY,CAAC;MACtD,MAAMnC,cAAc,GAAGoC,cAAc,CAACtD,YAAY,CAACmB,IAAI,IAAImC,cAAc,CAACtD,YAAY,CAACoB,OAAO;MAC9F,MAAM8E,gBAAgB,GAAG5C,cAAc,CAACZ,MAAM,IAAIY,cAAc,CAAChD,YAAY,CAACe,QAAQ;MACtF,KAAA2E,qBAAA,GAAI1C,cAAc,CAACtD,YAAY,CAACmG,WAAW,cAAAH,qBAAA,eAAvCA,qBAAA,CAAyCV,cAAc,EAAE;QACzD,MAAMC,EAAE,GAAGjC,cAAc,CAACtD,YAAY,CAACmG,WAAW,CAACb,cAAc;QACjE,IAAI,CAACtC,UAAU,CAACwC,GAAG,CAACD,EAAE,CAACE,CAAC,EAAEF,EAAE,CAACG,CAAC,EAAEH,EAAE,CAACI,CAAC,CAAC;QACrCrC,cAAc,CAAC/B,QAAQ,CAACqE,iBAAiB,CAAC,IAAI,CAAC5C,UAAU,CAAC;MAC9D,CAAC,MACI;QACD9B,cAAc,CAACG,QAAQ,CAAC+E,aAAa,CAACF,gBAAgB,EAAE,IAAI,CAAClD,UAAU,CAAC;QACxE,IAAI,CAACA,UAAU,CAACqD,YAAY,CAAC,IAAI,GAAG,IAAI,CAACxD,MAAM,CAAC;QAChDS,cAAc,CAAC/B,QAAQ,CAACqE,iBAAiB,CAAC,IAAI,CAAC5C,UAAU,CAAC;MAC9D;MACAkD,gBAAgB,CAAC5E,QAAQ,CAACJ,cAAc,CAACG,QAAQ,CAAC;MAClD,IAAI,IAAI,CAACN,UAAU,EAAE;QACjBnB,MAAM,CAAC0G,GAAG,CAAC,CAAC,IAAI,CAACtD,UAAU,EAAE,QAAQ,CAAC,CAAC;MAC3C;MACA,MAAMuD,kBAAkB,GAAGjD,cAAc,CAACV,WAAW,IAAIU,cAAc,CAAChD,YAAY,CAACW,kBAAkB;MACvG,KAAAgF,sBAAA,GAAI3C,cAAc,CAACtD,YAAY,CAACmG,WAAW,cAAAF,sBAAA,eAAvCA,sBAAA,CAAyCJ,eAAe,EAAE;QAC1D,MAAMC,EAAE,GAAGxC,cAAc,CAACtD,YAAY,CAACmG,WAAW,CAACN,eAAe;QAClE,IAAI,CAAC7C,UAAU,CAACwC,GAAG,CAACM,EAAE,CAACL,CAAC,EAAEK,EAAE,CAACJ,CAAC,EAAEI,EAAE,CAACH,CAAC,CAAC;QACrCrC,cAAc,CAAC/B,QAAQ,CAACwE,kBAAkB,CAAC,IAAI,CAAC/C,UAAU,CAAC;MAC/D,CAAC,MACI;QACD,IAAI,CAACuD,kBAAkB,CAACC,iBAAiB,CAACtF,cAAc,CAACD,kBAAkB,CAAC,EAAE;UAC1E;UACAsF,kBAAkB,CAACE,gBAAgB,CAAC,CAAC,CAACC,aAAa,CAACxF,cAAc,CAACD,kBAAkB,EAAE,IAAI,CAAC8B,cAAc,CAAC;UAC3G,MAAM4D,GAAG,GAAGC,IAAI,CAACC,IAAI,CAAC,IAAI,CAAC9D,cAAc,CAAC0C,CAAC,GAAG,IAAI,CAAC1C,cAAc,CAAC0C,CAAC,GAAG,IAAI,CAAC1C,cAAc,CAAC2C,CAAC,GAAG,IAAI,CAAC3C,cAAc,CAAC2C,CAAC,GAAG,IAAI,CAAC3C,cAAc,CAAC4C,CAAC,GAAG,IAAI,CAAC5C,cAAc,CAAC4C,CAAC,CAAC;UACpK,IAAI,CAAC3C,UAAU,CAACwC,GAAG,CAAC,IAAI,CAACzC,cAAc,CAAC0C,CAAC,EAAE,IAAI,CAAC1C,cAAc,CAAC2C,CAAC,EAAE,IAAI,CAAC3C,cAAc,CAAC4C,CAAC,CAAC;UACxF;UACA,IAAIgB,GAAG,GAAG,KAAK,EAAE;YACb,IAAI,CAAC3D,UAAU,CAACqD,YAAY,CAAC,CAAC,CAAC;UACnC,CAAC,MACI;YACD,MAAMS,KAAK,GAAG,CAAC,GAAGF,IAAI,CAACG,KAAK,CAACJ,GAAG,EAAE,IAAI,CAAC5D,cAAc,CAACiE,CAAC,CAAC;YACxD,IAAI,CAAChE,UAAU,CAACqD,YAAY,CAACS,KAAK,IAAIH,GAAG,IAAI,IAAI,CAAC9D,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;UACtE;UACAS,cAAc,CAAC/B,QAAQ,CAACwE,kBAAkB,CAAC,IAAI,CAAC/C,UAAU,CAAC;QAC/D;MACJ;MACAuD,kBAAkB,CAACjF,QAAQ,CAACJ,cAAc,CAACD,kBAAkB,CAAC;MAC9D,IAAI,IAAI,CAACF,UAAU,EAAE;QACjBnB,MAAM,CAAC0G,GAAG,CAAC,CAAC,IAAI,CAACtD,UAAU,EAAE,IAAI,CAACD,cAAc,EAAE,SAAS,CAAC,CAAC;MACjE;IACJ,CAAC,CAAC;EACN;EACAgB,iBAAiBA,CAACkD,oBAAoB,EAAE;IACpC,MAAM3D,cAAc,GAAG,IAAI,CAAC7B,YAAY,CAACwF,oBAAoB,CAAC;IAC9D,IAAI,CAAC3D,cAAc,EAAE;MACjB;IACJ;IACA,IAAIA,cAAc,CAAChD,YAAY,EAAE;MAC7BgD,cAAc,CAAChD,YAAY,CAACiE,OAAO,CAAC,CAAC;IACzC;IACA;IACA,OAAO,IAAI,CAAC9C,YAAY,CAACwF,oBAAoB,CAAC;EAClD;AACJ;AACA;AACA;AACA;AACAnH,sBAAsB,CAACoH,IAAI,GAAGxH,gBAAgB,CAACyH,mBAAmB;AAClE;AACA;AACA;AACA;AACA;AACArH,sBAAsB,CAACsH,OAAO,GAAG,CAAC;AAClC;AACAzH,oBAAoB,CAAC0H,eAAe,CAACvH,sBAAsB,CAACoH,IAAI,EAAE,CAACI,gBAAgB,EAAEC,OAAO,KAAK;EAC7F,OAAO,MAAM,IAAIzH,sBAAsB,CAACwH,gBAAgB,EAAEC,OAAO,CAAC;AACtE,CAAC,EAAEzH,sBAAsB,CAACsH,OAAO,EAAE,IAAI,CAAC","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}