diff --git a/engine/src/android/nbproject/project.xml b/engine/src/android/nbproject/project.xml deleted file mode 100644 index 124bfda04..000000000 --- a/engine/src/android/nbproject/project.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - org.netbeans.modules.ant.freeform - - - jMonkeyEngine3 - Android - - - - jMonkeyEngine3 - Android - - ../../build.xml - - - - - java - . - MacRoman - - - - - - jar - - - - clean - - - - javadoc - - - - run - - - - clean - jar - - - - - - - . - - - ${ant.script} - - - - - - - - - - - - - - . - ../../lib/android/android.jar:../../dist/jMonkeyEngine3.jar - 1.5 - - - - diff --git a/engine/src/bullet/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java b/engine/src/bullet/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java deleted file mode 100644 index cc721d0f1..000000000 --- a/engine/src/bullet/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.collision.shapes.infos; - -import com.jme3.bullet.collision.shapes.BoxCollisionShape; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.export.Savable; -import com.jme3.math.Matrix3f; -import com.jme3.math.Vector3f; -import java.io.IOException; - -/** - * - * @author normenhansen - */ -public class ChildCollisionShape implements Savable { - - public Vector3f location; - public Matrix3f rotation; - public CollisionShape shape; - - public ChildCollisionShape() { - } - - public ChildCollisionShape(Vector3f location, Matrix3f rotation, CollisionShape shape) { - this.location = location; - this.rotation = rotation; - this.shape = shape; - } - - public void write(JmeExporter ex) throws IOException { - OutputCapsule capsule = ex.getCapsule(this); - capsule.write(location, "location", new Vector3f()); - capsule.write(rotation, "rotation", new Matrix3f()); - capsule.write(shape, "shape", new BoxCollisionShape(new Vector3f(1, 1, 1))); - } - - public void read(JmeImporter im) throws IOException { - InputCapsule capsule = im.getCapsule(this); - location = (Vector3f) capsule.readSavable("location", new Vector3f()); - rotation = (Matrix3f) capsule.readSavable("rotation", new Matrix3f()); - shape = (CollisionShape) capsule.readSavable("shape", new BoxCollisionShape(new Vector3f(1, 1, 1))); - } -} diff --git a/engine/src/bullet/com/jme3/bullet/control/CharacterControl.java b/engine/src/bullet/com/jme3/bullet/control/CharacterControl.java deleted file mode 100644 index 2acac5316..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/CharacterControl.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.bullet.objects.PhysicsCharacter; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import java.io.IOException; - -/** - * - * @author normenhansen - */ -public class CharacterControl extends PhysicsCharacter implements PhysicsControl { - - protected Spatial spatial; - protected boolean enabled = true; - protected boolean added = false; - protected PhysicsSpace space = null; - protected Vector3f viewDirection = new Vector3f(Vector3f.UNIT_Z); - protected boolean useViewDirection = true; - protected boolean applyLocal = false; - - public CharacterControl() { - } - - public CharacterControl(CollisionShape shape, float stepHeight) { - super(shape, stepHeight); - } - - public boolean isApplyPhysicsLocal() { - return applyLocal; - } - - /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial - * @param applyPhysicsLocal - */ - public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { - applyLocal = applyPhysicsLocal; - } - - private Vector3f getSpatialTranslation() { - if (applyLocal) { - return spatial.getLocalTranslation(); - } - return spatial.getWorldTranslation(); - } - - public Control cloneForSpatial(Spatial spatial) { - CharacterControl control = new CharacterControl(collisionShape, stepHeight); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setFallSpeed(getFallSpeed()); - control.setGravity(getGravity()); - control.setJumpSpeed(getJumpSpeed()); - control.setMaxSlope(getMaxSlope()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setUpAxis(getUpAxis()); - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - - control.setSpatial(spatial); - return control; - } - - public void setSpatial(Spatial spatial) { - if (getUserObject() == null || getUserObject() == this.spatial) { - setUserObject(spatial); - } - this.spatial = spatial; - if (spatial == null) { - if (getUserObject() == spatial) { - setUserObject(null); - } - return; - } - setPhysicsLocation(getSpatialTranslation()); - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - if (space != null) { - if (enabled && !added) { - if (spatial != null) { - warp(getSpatialTranslation()); - } - space.addCollisionObject(this); - added = true; - } else if (!enabled && added) { - space.removeCollisionObject(this); - added = false; - } - } - } - - public boolean isEnabled() { - return enabled; - } - - public void setViewDirection(Vector3f vec) { - viewDirection.set(vec); - } - - public Vector3f getViewDirection() { - return viewDirection; - } - - public boolean isUseViewDirection() { - return useViewDirection; - } - - public void setUseViewDirection(boolean viewDirectionEnabled) { - this.useViewDirection = viewDirectionEnabled; - } - - public void update(float tpf) { - if (enabled && spatial != null) { - Quaternion localRotationQuat = spatial.getLocalRotation(); - Vector3f localLocation = spatial.getLocalTranslation(); - if (!applyLocal && spatial.getParent() != null) { - getPhysicsLocation(localLocation); - localLocation.subtractLocal(spatial.getParent().getWorldTranslation()); - localLocation.divideLocal(spatial.getParent().getWorldScale()); - tmp_inverseWorldRotation.set(spatial.getParent().getWorldRotation()).inverseLocal().multLocal(localLocation); - spatial.setLocalTranslation(localLocation); - - if (useViewDirection) { - localRotationQuat.lookAt(viewDirection, Vector3f.UNIT_Y); - spatial.setLocalRotation(localRotationQuat); - } - } else { - spatial.setLocalTranslation(getPhysicsLocation()); - localRotationQuat.lookAt(viewDirection, Vector3f.UNIT_Y); - spatial.setLocalRotation(localRotationQuat); - } - } - } - - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (debugShape == null) { - attachDebugShape(space.getDebugManager()); - } - debugShape.setLocalTranslation(getPhysicsLocation()); - debugShape.updateLogicalState(0); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if (this.space == space) { - return; - } - space.addCollisionObject(this); - added = true; - } - this.space = space; - } - - public PhysicsSpace getPhysicsSpace() { - return space; - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(enabled, "enabled", true); - oc.write(applyLocal, "applyLocalPhysics", false); - oc.write(useViewDirection, "viewDirectionEnabled", true); - oc.write(viewDirection, "viewDirection", new Vector3f(Vector3f.UNIT_Z)); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - enabled = ic.readBoolean("enabled", true); - useViewDirection = ic.readBoolean("viewDirectionEnabled", true); - viewDirection = (Vector3f) ic.readSavable("viewDirection", new Vector3f(Vector3f.UNIT_Z)); - applyLocal = ic.readBoolean("applyLocalPhysics", false); - spatial = (Spatial) ic.readSavable("spatial", null); - setUserObject(spatial); - } -} diff --git a/engine/src/bullet/com/jme3/bullet/control/GhostControl.java b/engine/src/bullet/com/jme3/bullet/control/GhostControl.java deleted file mode 100644 index 99e598480..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/GhostControl.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.bullet.objects.PhysicsGhostObject; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import java.io.IOException; - -/** - * A GhostControl moves with the spatial it is attached to and can be used to check - * overlaps with other physics objects (e.g. aggro radius). - * @author normenhansen - */ -public class GhostControl extends PhysicsGhostObject implements PhysicsControl { - - protected Spatial spatial; - protected boolean enabled = true; - protected boolean added = false; - protected PhysicsSpace space = null; - protected boolean applyLocal = false; - - public GhostControl() { - } - - public GhostControl(CollisionShape shape) { - super(shape); - } - - public boolean isApplyPhysicsLocal() { - return applyLocal; - } - - /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial - * @param applyPhysicsLocal - */ - public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { - applyLocal = applyPhysicsLocal; - } - - private Vector3f getSpatialTranslation() { - if (applyLocal) { - return spatial.getLocalTranslation(); - } - return spatial.getWorldTranslation(); - } - - private Quaternion getSpatialRotation() { - if (applyLocal) { - return spatial.getLocalRotation(); - } - return spatial.getWorldRotation(); - } - - public Control cloneForSpatial(Spatial spatial) { - GhostControl control = new GhostControl(collisionShape); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setPhysicsRotation(getPhysicsRotationMatrix()); - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - - control.setSpatial(spatial); - return control; - } - - public void setSpatial(Spatial spatial) { - if (getUserObject() == null || getUserObject() == this.spatial) { - setUserObject(spatial); - } - this.spatial = spatial; - if (spatial == null) { - if (getUserObject() == spatial) { - setUserObject(null); - } - return; - } - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - if (space != null) { - if (enabled && !added) { - if (spatial != null) { - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - space.addCollisionObject(this); - added = true; - } else if (!enabled && added) { - space.removeCollisionObject(this); - added = false; - } - } - } - - public boolean isEnabled() { - return enabled; - } - - public void update(float tpf) { - if (!enabled) { - return; - } - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (debugShape == null) { - attachDebugShape(space.getDebugManager()); - } - debugShape.setLocalTranslation(spatial.getWorldTranslation()); - debugShape.setLocalRotation(spatial.getWorldRotation()); - debugShape.updateLogicalState(0); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if (this.space == space) { - return; - } - space.addCollisionObject(this); - added = true; - } - this.space = space; - } - - public PhysicsSpace getPhysicsSpace() { - return space; - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(enabled, "enabled", true); - oc.write(applyLocal, "applyLocalPhysics", false); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - enabled = ic.readBoolean("enabled", true); - spatial = (Spatial) ic.readSavable("spatial", null); - applyLocal = ic.readBoolean("applyLocalPhysics", false); - setUserObject(spatial); - } -} diff --git a/engine/src/bullet/com/jme3/bullet/control/KinematicRagdollControl.java b/engine/src/bullet/com/jme3/bullet/control/KinematicRagdollControl.java deleted file mode 100644 index 3470153c8..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/KinematicRagdollControl.java +++ /dev/null @@ -1,873 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.control.ragdoll.RagdollPreset; -import com.jme3.bullet.control.ragdoll.HumanoidRagdollPreset; -import com.jme3.animation.AnimControl; -import com.jme3.animation.Bone; -import com.jme3.animation.Skeleton; -import com.jme3.animation.SkeletonControl; -import com.jme3.asset.AssetManager; -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.PhysicsCollisionEvent; -import com.jme3.bullet.collision.PhysicsCollisionListener; -import com.jme3.bullet.collision.PhysicsCollisionObject; -import com.jme3.bullet.collision.RagdollCollisionListener; -import com.jme3.bullet.collision.shapes.BoxCollisionShape; -import com.jme3.bullet.collision.shapes.HullCollisionShape; -import com.jme3.bullet.control.ragdoll.RagdollUtils; -import com.jme3.bullet.joints.SixDofJoint; -import com.jme3.bullet.objects.PhysicsRigidBody; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import com.jme3.util.TempVars; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import java.util.logging.Level; -import java.util.logging.Logger; - -/**This control is still a WIP, use it at your own risk
- * To use this control you need a model with an AnimControl and a SkeletonControl.
- * This should be the case if you imported an animated model from Ogre or blender.
- * Note enabling/disabling the control add/removes it from the physic space
- *

- * This control creates collision shapes for each bones of the skeleton when you call spatial.addControl(ragdollControl). - *

- *

- *

- *There are 2 modes for this control : - *

- *

- * - * @author Normen Hansen and Rémy Bouquet (Nehon) - */ -public class KinematicRagdollControl implements PhysicsControl, PhysicsCollisionListener { - - protected static final Logger logger = Logger.getLogger(KinematicRagdollControl.class.getName()); - protected Map boneLinks = new HashMap(); - protected Skeleton skeleton; - protected PhysicsSpace space; - protected boolean enabled = true; - protected boolean debug = false; - protected PhysicsRigidBody baseRigidBody; - protected float weightThreshold = -1.0f; - protected Spatial targetModel; - protected Vector3f initScale; - protected Mode mode = Mode.Kinetmatic; - protected boolean blendedControl = false; - protected float blendTime = 1.0f; - protected float blendStart = 0.0f; - protected List listeners; - protected float eventDispatchImpulseThreshold = 10; - protected RagdollPreset preset = new HumanoidRagdollPreset(); - protected Set boneList = new TreeSet(); - protected Vector3f modelPosition = new Vector3f(); - protected Quaternion modelRotation = new Quaternion(); - protected float rootMass = 15; - protected float totalMass = 0; - protected boolean added = false; - - public static enum Mode { - - Kinetmatic, - Ragdoll - } - - protected class PhysicsBoneLink { - - protected Bone bone; - protected Quaternion initalWorldRotation; - protected SixDofJoint joint; - protected PhysicsRigidBody rigidBody; - protected Quaternion startBlendingRot = new Quaternion(); - protected Vector3f startBlendingPos = new Vector3f(); - } - - /** - * contruct a KinematicRagdollControl - */ - public KinematicRagdollControl() { - } - - public KinematicRagdollControl(float weightThreshold) { - this.weightThreshold = weightThreshold; - } - - public KinematicRagdollControl(RagdollPreset preset, float weightThreshold) { - this.preset = preset; - this.weightThreshold = weightThreshold; - } - - public KinematicRagdollControl(RagdollPreset preset) { - this.preset = preset; - } - - public void update(float tpf) { - if (!enabled) { - return; - } - TempVars vars = TempVars.get(); - - Quaternion tmpRot1 = vars.quat1; - Quaternion tmpRot2 = vars.quat2; - - //if the ragdoll has the control of the skeleton, we update each bone with its position in physic world space. - if (mode == mode.Ragdoll && targetModel.getLocalTranslation().equals(modelPosition)) { - for (PhysicsBoneLink link : boneLinks.values()) { - - Vector3f position = vars.vect1; - - //retrieving bone position in physic world space - Vector3f p = link.rigidBody.getMotionState().getWorldLocation(); - //transforming this position with inverse transforms of the model - targetModel.getWorldTransform().transformInverseVector(p, position); - - //retrieving bone rotation in physic world space - Quaternion q = link.rigidBody.getMotionState().getWorldRotationQuat(); - - //multiplying this rotation by the initialWorld rotation of the bone, - //then transforming it with the inverse world rotation of the model - tmpRot1.set(q).multLocal(link.initalWorldRotation); - tmpRot2.set(targetModel.getWorldRotation()).inverseLocal().mult(tmpRot1, tmpRot1); - tmpRot1.normalizeLocal(); - - //if the bone is the root bone, we apply the physic's transform to the model, so its position and rotation are correctly updated - if (link.bone.getParent() == null) { - - //offsetting the physic's position/rotation by the root bone inverse model space position/rotaion - modelPosition.set(p).subtractLocal(link.bone.getWorldBindPosition()); - targetModel.getParent().getWorldTransform().transformInverseVector(modelPosition, modelPosition); - modelRotation.set(q).multLocal(tmpRot2.set(link.bone.getWorldBindRotation()).inverseLocal()); - - - //applying transforms to the model - targetModel.setLocalTranslation(modelPosition); - - targetModel.setLocalRotation(modelRotation); - - //Applying computed transforms to the bone - link.bone.setUserTransformsWorld(position, tmpRot1); - - } else { - //if boneList is empty, this means that every bone in the ragdoll has a collision shape, - //so we just update the bone position - if (boneList.isEmpty()) { - link.bone.setUserTransformsWorld(position, tmpRot1); - } else { - //boneList is not empty, this means some bones of the skeleton might not be associated with a collision shape. - //So we update them recusively - RagdollUtils.setTransform(link.bone, position, tmpRot1, false, boneList); - } - } - } - } else { - //the ragdoll does not have the controll, so the keyframed animation updates the physic position of the physic bonces - for (PhysicsBoneLink link : boneLinks.values()) { - - Vector3f position = vars.vect1; - - //if blended control this means, keyframed animation is updating the skeleton, - //but to allow smooth transition, we blend this transformation with the saved position of the ragdoll - if (blendedControl) { - Vector3f position2 = vars.vect2; - //initializing tmp vars with the start position/rotation of the ragdoll - position.set(link.startBlendingPos); - tmpRot1.set(link.startBlendingRot); - - //interpolating between ragdoll position/rotation and keyframed position/rotation - tmpRot2.set(tmpRot1).nlerp(link.bone.getModelSpaceRotation(), blendStart / blendTime); - position2.set(position).interpolate(link.bone.getModelSpacePosition(), blendStart / blendTime); - tmpRot1.set(tmpRot2); - position.set(position2); - - //updating bones transforms - if (boneList.isEmpty()) { - //we ensure we have the control to update the bone - link.bone.setUserControl(true); - link.bone.setUserTransformsWorld(position, tmpRot1); - //we give control back to the key framed animation. - link.bone.setUserControl(false); - } else { - RagdollUtils.setTransform(link.bone, position, tmpRot1, true, boneList); - } - - } - //setting skeleton transforms to the ragdoll - matchPhysicObjectToBone(link, position, tmpRot1); - modelPosition.set(targetModel.getLocalTranslation()); - - } - - //time control for blending - if (blendedControl) { - blendStart += tpf; - if (blendStart > blendTime) { - blendedControl = false; - } - } - } - vars.release(); - - } - - /** - * Set the transforms of a rigidBody to match the transforms of a bone. - * this is used to make the ragdoll follow the skeleton motion while in Kinematic mode - * @param link the link containing the bone and the rigidBody - * @param position just a temp vector for position - * @param tmpRot1 just a temp quaternion for rotation - */ - private void matchPhysicObjectToBone(PhysicsBoneLink link, Vector3f position, Quaternion tmpRot1) { - //computing position from rotation and scale - targetModel.getWorldTransform().transformVector(link.bone.getModelSpacePosition(), position); - - //computing rotation - tmpRot1.set(link.bone.getModelSpaceRotation()).multLocal(link.bone.getWorldBindInverseRotation()); - targetModel.getWorldRotation().mult(tmpRot1, tmpRot1); - tmpRot1.normalizeLocal(); - - //updating physic location/rotation of the physic bone - link.rigidBody.setPhysicsLocation(position); - link.rigidBody.setPhysicsRotation(tmpRot1); - - } - - public Control cloneForSpatial(Spatial spatial) { - throw new UnsupportedOperationException("Not supported yet."); - } - - /** - * rebuild the ragdoll - * this is useful if you applied scale on the ragdoll after it's been initialized - */ - public void reBuild() { - setSpatial(targetModel); - addToPhysicsSpace(); - } - - public void setSpatial(Spatial model) { - if (model == null) { - removeFromPhysicsSpace(); - clearData(); - return; - } - targetModel = model; - Node parent = model.getParent(); - - - Vector3f initPosition = model.getLocalTranslation().clone(); - Quaternion initRotation = model.getLocalRotation().clone(); - initScale = model.getLocalScale().clone(); - - model.removeFromParent(); - model.setLocalTranslation(Vector3f.ZERO); - model.setLocalRotation(Quaternion.IDENTITY); - model.setLocalScale(1); - //HACK ALERT change this - //I remove the skeletonControl and readd it to the spatial to make sure it's after the ragdollControl in the stack - //Find a proper way to order the controls. - SkeletonControl sc = model.getControl(SkeletonControl.class); - model.removeControl(sc); - model.addControl(sc); - //---- - - removeFromPhysicsSpace(); - clearData(); - // put into bind pose and compute bone transforms in model space - // maybe dont reset to ragdoll out of animations? - scanSpatial(model); - - - if (parent != null) { - parent.attachChild(model); - - } - model.setLocalTranslation(initPosition); - model.setLocalRotation(initRotation); - model.setLocalScale(initScale); - - logger.log(Level.INFO, "Created physics ragdoll for skeleton {0}", skeleton); - } - - /** - * Add a bone name to this control - * Using this method you can specify which bones of the skeleton will be used to build the collision shapes. - * @param name - */ - public void addBoneName(String name) { - boneList.add(name); - } - - private void scanSpatial(Spatial model) { - AnimControl animControl = model.getControl(AnimControl.class); - Map> pointsMap = null; - if (weightThreshold == -1.0f) { - pointsMap = RagdollUtils.buildPointMap(model); - } - - skeleton = animControl.getSkeleton(); - skeleton.resetAndUpdate(); - for (int i = 0; i < skeleton.getRoots().length; i++) { - Bone childBone = skeleton.getRoots()[i]; - if (childBone.getParent() == null) { - logger.log(Level.INFO, "Found root bone in skeleton {0}", skeleton); - baseRigidBody = new PhysicsRigidBody(new BoxCollisionShape(Vector3f.UNIT_XYZ.mult(0.1f)), 1); - baseRigidBody.setKinematic(mode == Mode.Kinetmatic); - boneRecursion(model, childBone, baseRigidBody, 1, pointsMap); - } - } - } - - private void boneRecursion(Spatial model, Bone bone, PhysicsRigidBody parent, int reccount, Map> pointsMap) { - PhysicsRigidBody parentShape = parent; - if (boneList.isEmpty() || boneList.contains(bone.getName())) { - - PhysicsBoneLink link = new PhysicsBoneLink(); - link.bone = bone; - - //creating the collision shape - HullCollisionShape shape = null; - if (pointsMap != null) { - //build a shape for the bone, using the vertices that are most influenced by this bone - shape = RagdollUtils.makeShapeFromPointMap(pointsMap, RagdollUtils.getBoneIndices(link.bone, skeleton, boneList), initScale, link.bone.getModelSpacePosition()); - } else { - //build a shape for the bone, using the vertices associated with this bone with a weight above the threshold - shape = RagdollUtils.makeShapeFromVerticeWeights(model, RagdollUtils.getBoneIndices(link.bone, skeleton, boneList), initScale, link.bone.getModelSpacePosition(), weightThreshold); - } - - PhysicsRigidBody shapeNode = new PhysicsRigidBody(shape, rootMass / (float) reccount); - - shapeNode.setKinematic(mode == Mode.Kinetmatic); - totalMass += rootMass / (float) reccount; - - link.rigidBody = shapeNode; - link.initalWorldRotation = bone.getModelSpaceRotation().clone(); - - if (parent != null) { - //get joint position for parent - Vector3f posToParent = new Vector3f(); - if (bone.getParent() != null) { - bone.getModelSpacePosition().subtract(bone.getParent().getModelSpacePosition(), posToParent).multLocal(initScale); - } - - SixDofJoint joint = new SixDofJoint(parent, shapeNode, posToParent, new Vector3f(0, 0, 0f), true); - preset.setupJointForBone(bone.getName(), joint); - - link.joint = joint; - joint.setCollisionBetweenLinkedBodys(false); - } - boneLinks.put(bone.getName(), link); - shapeNode.setUserObject(link); - parentShape = shapeNode; - } - - for (Iterator it = bone.getChildren().iterator(); it.hasNext();) { - Bone childBone = it.next(); - boneRecursion(model, childBone, parentShape, reccount + 1, pointsMap); - } - } - - /** - * Set the joint limits for the joint between the given bone and its parent. - * This method can't work before attaching the control to a spatial - * @param boneName the name of the bone - * @param maxX the maximum rotation on the x axis (in radians) - * @param minX the minimum rotation on the x axis (in radians) - * @param maxY the maximum rotation on the y axis (in radians) - * @param minY the minimum rotation on the z axis (in radians) - * @param maxZ the maximum rotation on the z axis (in radians) - * @param minZ the minimum rotation on the z axis (in radians) - */ - public void setJointLimit(String boneName, float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - RagdollUtils.setJointLimit(link.joint, maxX, minX, maxY, minY, maxZ, minZ); - } else { - logger.log(Level.WARNING, "Not joint was found for bone {0}. make sure you call spatial.addControl(ragdoll) before setting joints limit", boneName); - } - } - - /** - * Return the joint between the given bone and its parent. - * This return null if it's called before attaching the control to a spatial - * @param boneName the name of the bone - * @return the joint between the given bone and its parent - */ - public SixDofJoint getJoint(String boneName) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - return link.joint; - } else { - logger.log(Level.WARNING, "Not joint was found for bone {0}. make sure you call spatial.addControl(ragdoll) before setting joints limit", boneName); - return null; - } - } - - private void clearData() { - boneLinks.clear(); - baseRigidBody = null; - } - - private void addToPhysicsSpace() { - if (space == null) { - return; - } - if (baseRigidBody != null) { - space.add(baseRigidBody); - added = true; - } - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - if (physicsBoneLink.rigidBody != null) { - space.add(physicsBoneLink.rigidBody); - if (physicsBoneLink.joint != null) { - space.add(physicsBoneLink.joint); - - } - added = true; - } - } - } - - protected void removeFromPhysicsSpace() { - if (space == null) { - return; - } - if (baseRigidBody != null) { - space.remove(baseRigidBody); - } - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - if (physicsBoneLink.joint != null) { - space.remove(physicsBoneLink.joint); - if (physicsBoneLink.rigidBody != null) { - space.remove(physicsBoneLink.rigidBody); - } - } - } - added = false; - } - - /** - * enable or disable the control - * note that if enabled is true and that the physic space has been set on the ragdoll, the ragdoll is added to the physic space - * if enabled is false the ragdoll is removed from physic space. - * @param enabled - */ - public void setEnabled(boolean enabled) { - if (this.enabled == enabled) { - return; - } - this.enabled = enabled; - if (!enabled && space != null) { - removeFromPhysicsSpace(); - } else if (enabled && space != null) { - addToPhysicsSpace(); - } - } - - /** - * returns true if the control is enabled - * @return - */ - public boolean isEnabled() { - return enabled; - } - - protected void attachDebugShape(AssetManager manager) { - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - physicsBoneLink.rigidBody.createDebugShape(manager); - } - debug = true; - } - - protected void detachDebugShape() { - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - physicsBoneLink.rigidBody.detachDebugShape(); - } - debug = false; - } - - /** - * For internal use only - * specific render for the ragdoll(if debugging) - * @param rm - * @param vp - */ - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (!debug) { - attachDebugShape(space.getDebugManager()); - } - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - Spatial debugShape = physicsBoneLink.rigidBody.debugShape(); - if (debugShape != null) { - debugShape.setLocalTranslation(physicsBoneLink.rigidBody.getMotionState().getWorldLocation()); - debugShape.setLocalRotation(physicsBoneLink.rigidBody.getMotionState().getWorldRotationQuat()); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - } - } - - /** - * set the physic space to this ragdoll - * @param space - */ - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - removeFromPhysicsSpace(); - this.space = space; - } else { - if (this.space == space) { - return; - } - this.space = space; - addToPhysicsSpace(); - this.space.addCollisionListener(this); - } - } - - /** - * returns the physic space - * @return - */ - public PhysicsSpace getPhysicsSpace() { - return space; - } - - /** - * serialize this control - * @param ex - * @throws IOException - */ - public void write(JmeExporter ex) throws IOException { - throw new UnsupportedOperationException("Not supported yet."); - } - - /** - * de-serialize this control - * @param im - * @throws IOException - */ - public void read(JmeImporter im) throws IOException { - throw new UnsupportedOperationException("Not supported yet."); - } - - /** - * For internal use only - * callback for collisionevent - * @param event - */ - public void collision(PhysicsCollisionEvent event) { - PhysicsCollisionObject objA = event.getObjectA(); - PhysicsCollisionObject objB = event.getObjectB(); - - //excluding collisions that involve 2 parts of the ragdoll - if (event.getNodeA() == null && event.getNodeB() == null) { - return; - } - - //discarding low impulse collision - if (event.getAppliedImpulse() < eventDispatchImpulseThreshold) { - return; - } - - boolean hit = false; - Bone hitBone = null; - PhysicsCollisionObject hitObject = null; - - //Computing which bone has been hit - if (objA.getUserObject() instanceof PhysicsBoneLink) { - PhysicsBoneLink link = (PhysicsBoneLink) objA.getUserObject(); - if (link != null) { - hit = true; - hitBone = link.bone; - hitObject = objB; - } - } - - if (objB.getUserObject() instanceof PhysicsBoneLink) { - PhysicsBoneLink link = (PhysicsBoneLink) objB.getUserObject(); - if (link != null) { - hit = true; - hitBone = link.bone; - hitObject = objA; - - } - } - - //dispatching the event if the ragdoll has been hit - if (hit && listeners != null) { - for (RagdollCollisionListener listener : listeners) { - listener.collide(hitBone, hitObject, event); - } - } - - } - - /** - * Enable or disable the ragdoll behaviour. - * if ragdollEnabled is true, the character motion will only be powerd by physics - * else, the characted will be animated by the keyframe animation, - * but will be able to physically interact with its physic environnement - * @param ragdollEnabled - */ - protected void setMode(Mode mode) { - this.mode = mode; - AnimControl animControl = targetModel.getControl(AnimControl.class); - animControl.setEnabled(mode == Mode.Kinetmatic); - - baseRigidBody.setKinematic(mode == Mode.Kinetmatic); - TempVars vars = TempVars.get(); - - for (PhysicsBoneLink link : boneLinks.values()) { - link.rigidBody.setKinematic(mode == Mode.Kinetmatic); - if (mode == Mode.Ragdoll) { - Quaternion tmpRot1 = vars.quat1; - Vector3f position = vars.vect1; - //making sure that the ragdoll is at the correct place. - matchPhysicObjectToBone(link, position, tmpRot1); - } - - } - vars.release(); - - for (Bone bone : skeleton.getRoots()) { - RagdollUtils.setUserControl(bone, mode == Mode.Ragdoll); - } - } - - /** - * Smoothly blend from Ragdoll mode to Kinematic mode - * This is useful to blend ragdoll actual position to a keyframe animation for example - * @param blendTime the blending time between ragdoll to anim. - */ - public void blendToKinematicMode(float blendTime) { - if (mode == Mode.Kinetmatic) { - return; - } - blendedControl = true; - this.blendTime = blendTime; - mode = Mode.Kinetmatic; - AnimControl animControl = targetModel.getControl(AnimControl.class); - animControl.setEnabled(true); - - - TempVars vars = TempVars.get(); - for (PhysicsBoneLink link : boneLinks.values()) { - - Vector3f p = link.rigidBody.getMotionState().getWorldLocation(); - Vector3f position = vars.vect1; - - targetModel.getWorldTransform().transformInverseVector(p, position); - - Quaternion q = link.rigidBody.getMotionState().getWorldRotationQuat(); - Quaternion q2 = vars.quat1; - Quaternion q3 = vars.quat2; - - q2.set(q).multLocal(link.initalWorldRotation).normalizeLocal(); - q3.set(targetModel.getWorldRotation()).inverseLocal().mult(q2, q2); - q2.normalizeLocal(); - link.startBlendingPos.set(position); - link.startBlendingRot.set(q2); - link.rigidBody.setKinematic(true); - } - vars.release(); - - for (Bone bone : skeleton.getRoots()) { - RagdollUtils.setUserControl(bone, false); - } - - blendStart = 0; - } - - /** - * Set the control into Kinematic mode - * In theis mode, the collision shapes follow the movements of the skeleton, - * and can interact with physical environement - */ - public void setKinematicMode() { - if (mode != Mode.Kinetmatic) { - setMode(Mode.Kinetmatic); - } - } - - /** - * Sets the control into Ragdoll mode - * The skeleton is entirely controlled by physics. - */ - public void setRagdollMode() { - if (mode != Mode.Ragdoll) { - setMode(Mode.Ragdoll); - } - } - - /** - * retruns the mode of this control - * @return - */ - public Mode getMode() { - return mode; - } - - /** - * add a - * @param listener - */ - public void addCollisionListener(RagdollCollisionListener listener) { - if (listeners == null) { - listeners = new ArrayList(); - } - listeners.add(listener); - } - - public void setRootMass(float rootMass) { - this.rootMass = rootMass; - } - - public float getTotalMass() { - return totalMass; - } - - public float getWeightThreshold() { - return weightThreshold; - } - - public void setWeightThreshold(float weightThreshold) { - this.weightThreshold = weightThreshold; - } - - public float getEventDispatchImpulseThreshold() { - return eventDispatchImpulseThreshold; - } - - public void setEventDispatchImpulseThreshold(float eventDispatchImpulseThreshold) { - this.eventDispatchImpulseThreshold = eventDispatchImpulseThreshold; - } - - /** - * Set the CcdMotionThreshold of all the bone's rigidBodies of the ragdoll - * @see PhysicsRigidBody#setCcdMotionThreshold(float) - * @param value - */ - public void setCcdMotionThreshold(float value) { - for (PhysicsBoneLink link : boneLinks.values()) { - link.rigidBody.setCcdMotionThreshold(value); - } - } - - /** - * Set the CcdSweptSphereRadius of all the bone's rigidBodies of the ragdoll - * @see PhysicsRigidBody#setCcdSweptSphereRadius(float) - * @param value - */ - public void setCcdSweptSphereRadius(float value) { - for (PhysicsBoneLink link : boneLinks.values()) { - link.rigidBody.setCcdSweptSphereRadius(value); - } - } - - /** - * Set the CcdMotionThreshold of the given bone's rigidBodies of the ragdoll - * @see PhysicsRigidBody#setCcdMotionThreshold(float) - * @param value - * @deprecated use getBoneRigidBody(String BoneName).setCcdMotionThreshold(float) instead - */ - @Deprecated - public void setBoneCcdMotionThreshold(String boneName, float value) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - link.rigidBody.setCcdMotionThreshold(value); - } - } - - /** - * Set the CcdSweptSphereRadius of the given bone's rigidBodies of the ragdoll - * @see PhysicsRigidBody#setCcdSweptSphereRadius(float) - * @param value - * @deprecated use getBoneRigidBody(String BoneName).setCcdSweptSphereRadius(float) instead - */ - @Deprecated - public void setBoneCcdSweptSphereRadius(String boneName, float value) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - link.rigidBody.setCcdSweptSphereRadius(value); - } - } - - /** - * return the rigidBody associated to the given bone - * @param boneName the name of the bone - * @return the associated rigidBody. - */ - public PhysicsRigidBody getBoneRigidBody(String boneName) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - return link.rigidBody; - } - return null; - } -} diff --git a/engine/src/bullet/com/jme3/bullet/control/PhysicsControl.java b/engine/src/bullet/com/jme3/bullet/control/PhysicsControl.java deleted file mode 100644 index ba6515789..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/PhysicsControl.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.scene.control.Control; - -/** - * - * @author normenhansen - */ -public interface PhysicsControl extends Control { - - public void setPhysicsSpace(PhysicsSpace space); - - public PhysicsSpace getPhysicsSpace(); - - /** - * The physics object is removed from the physics space when the control - * is disabled. When the control is enabled again the physics object is - * moved to the current location of the spatial and then added to the physics - * space. This allows disabling/enabling physics to move the spatial freely. - * @param state - */ - public void setEnabled(boolean state); -} diff --git a/engine/src/bullet/com/jme3/bullet/control/RigidBodyControl.java b/engine/src/bullet/com/jme3/bullet/control/RigidBodyControl.java deleted file mode 100644 index be40b58c3..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/RigidBodyControl.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.shapes.BoxCollisionShape; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.bullet.collision.shapes.SphereCollisionShape; -import com.jme3.bullet.objects.PhysicsRigidBody; -import com.jme3.bullet.util.CollisionShapeFactory; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import com.jme3.scene.shape.Box; -import com.jme3.scene.shape.Sphere; -import java.io.IOException; - -/** - * - * @author normenhansen - */ -public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl { - - protected Spatial spatial; - protected boolean enabled = true; - protected boolean added = false; - protected PhysicsSpace space = null; - protected boolean kinematicSpatial = true; - - public RigidBodyControl() { - } - - /** - * When using this constructor, the CollisionShape for the RigidBody is generated - * automatically when the Control is added to a Spatial. - * @param mass When not 0, a HullCollisionShape is generated, otherwise a MeshCollisionShape is used. For geometries with box or sphere meshes the proper box or sphere collision shape is used. - */ - public RigidBodyControl(float mass) { - this.mass = mass; - } - - /** - * Creates a new PhysicsNode with the supplied collision shape and mass 1 - * @param child - * @param shape - */ - public RigidBodyControl(CollisionShape shape) { - super(shape); - } - - public RigidBodyControl(CollisionShape shape, float mass) { - super(shape, mass); - } - - public Control cloneForSpatial(Spatial spatial) { - RigidBodyControl control = new RigidBodyControl(collisionShape, mass); - control.setAngularFactor(getAngularFactor()); - control.setAngularSleepingThreshold(getAngularSleepingThreshold()); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setDamping(getLinearDamping(), getAngularDamping()); - control.setFriction(getFriction()); - control.setGravity(getGravity()); - control.setKinematic(isKinematic()); - control.setKinematicSpatial(isKinematicSpatial()); - control.setLinearSleepingThreshold(getLinearSleepingThreshold()); - control.setPhysicsLocation(getPhysicsLocation(null)); - control.setPhysicsRotation(getPhysicsRotationMatrix(null)); - control.setRestitution(getRestitution()); - - if (mass > 0) { - control.setAngularVelocity(getAngularVelocity()); - control.setLinearVelocity(getLinearVelocity()); - } - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - - control.setSpatial(spatial); - return control; - } - - public void setSpatial(Spatial spatial) { - if (getUserObject() == null || getUserObject() == this.spatial) { - setUserObject(spatial); - } - this.spatial = spatial; - if (spatial == null) { - if (getUserObject() == spatial) { - setUserObject(null); - } - spatial = null; - collisionShape = null; - return; - } - if (collisionShape == null) { - createCollisionShape(); - rebuildRigidBody(); - } - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - - protected void createCollisionShape() { - if (spatial == null) { - return; - } - if (spatial instanceof Geometry) { - Geometry geom = (Geometry) spatial; - Mesh mesh = geom.getMesh(); - if (mesh instanceof Sphere) { - collisionShape = new SphereCollisionShape(((Sphere) mesh).getRadius()); - return; - } else if (mesh instanceof Box) { - collisionShape = new BoxCollisionShape(new Vector3f(((Box) mesh).getXExtent(), ((Box) mesh).getYExtent(), ((Box) mesh).getZExtent())); - return; - } - } - if (mass > 0) { - collisionShape = CollisionShapeFactory.createDynamicMeshShape(spatial); - } else { - collisionShape = CollisionShapeFactory.createMeshShape(spatial); - } - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - if (space != null) { - if (enabled && !added) { - if (spatial != null) { - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - space.addCollisionObject(this); - added = true; - } else if (!enabled && added) { - space.removeCollisionObject(this); - added = false; - } - } - } - - public boolean isEnabled() { - return enabled; - } - - /** - * Checks if this control is in kinematic spatial mode. - * @return true if the spatial location is applied to this kinematic rigidbody - */ - public boolean isKinematicSpatial() { - return kinematicSpatial; - } - - /** - * Sets this control to kinematic spatial mode so that the spatials transform will - * be applied to the rigidbody in kinematic mode, defaults to true. - * @param kinematicSpatial - */ - public void setKinematicSpatial(boolean kinematicSpatial) { - this.kinematicSpatial = kinematicSpatial; - } - - public boolean isApplyPhysicsLocal() { - return motionState.isApplyPhysicsLocal(); - } - - /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial instead of the world traslation. - * @param applyPhysicsLocal - */ - public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { - motionState.setApplyPhysicsLocal(applyPhysicsLocal); - } - - private Vector3f getSpatialTranslation(){ - if(motionState.isApplyPhysicsLocal()){ - return spatial.getLocalTranslation(); - } - return spatial.getWorldTranslation(); - } - - private Quaternion getSpatialRotation(){ - if(motionState.isApplyPhysicsLocal()){ - return spatial.getLocalRotation(); - } - return spatial.getWorldRotation(); - } - - public void update(float tpf) { - if (enabled && spatial != null) { - if (isKinematic() && kinematicSpatial) { - super.setPhysicsLocation(getSpatialTranslation()); - super.setPhysicsRotation(getSpatialRotation()); - } else { - getMotionState().applyTransform(spatial); - } - } - } - - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (debugShape == null) { - attachDebugShape(space.getDebugManager()); - } - //TODO: using spatial traslation/rotation.. - debugShape.setLocalTranslation(spatial.getWorldTranslation()); - debugShape.setLocalRotation(spatial.getWorldRotation()); - debugShape.updateLogicalState(0); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if(this.space==space) return; - space.addCollisionObject(this); - added = true; - } - this.space = space; - } - - public PhysicsSpace getPhysicsSpace() { - return space; - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(enabled, "enabled", true); - oc.write(motionState.isApplyPhysicsLocal(), "applyLocalPhysics", false); - oc.write(kinematicSpatial, "kinematicSpatial", true); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - enabled = ic.readBoolean("enabled", true); - kinematicSpatial = ic.readBoolean("kinematicSpatial", true); - spatial = (Spatial) ic.readSavable("spatial", null); - motionState.setApplyPhysicsLocal(ic.readBoolean("applyLocalPhysics", false)); - setUserObject(spatial); - } -} diff --git a/engine/src/bullet/com/jme3/bullet/control/VehicleControl.java b/engine/src/bullet/com/jme3/bullet/control/VehicleControl.java deleted file mode 100644 index 4e6f416e4..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/VehicleControl.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.bullet.joints.PhysicsJoint; -import com.jme3.bullet.objects.PhysicsVehicle; -import com.jme3.bullet.objects.VehicleWheel; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import com.jme3.scene.debug.Arrow; -import java.io.IOException; -import java.util.Iterator; - -/** - * - * @author normenhansen - */ -public class VehicleControl extends PhysicsVehicle implements PhysicsControl { - - protected Spatial spatial; - protected boolean enabled = true; - protected PhysicsSpace space = null; - protected boolean added = false; - - public VehicleControl() { - } - - /** - * Creates a new PhysicsNode with the supplied collision shape - * @param child - * @param shape - */ - public VehicleControl(CollisionShape shape) { - super(shape); - } - - public VehicleControl(CollisionShape shape, float mass) { - super(shape, mass); - } - - public boolean isApplyPhysicsLocal() { - return motionState.isApplyPhysicsLocal(); - } - - /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial - * @param applyPhysicsLocal - */ - public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { - motionState.setApplyPhysicsLocal(applyPhysicsLocal); - for (Iterator it = wheels.iterator(); it.hasNext();) { - VehicleWheel vehicleWheel = it.next(); - vehicleWheel.setApplyLocal(applyPhysicsLocal); - } - } - - private Vector3f getSpatialTranslation(){ - if(motionState.isApplyPhysicsLocal()){ - return spatial.getLocalTranslation(); - } - return spatial.getWorldTranslation(); - } - - private Quaternion getSpatialRotation(){ - if(motionState.isApplyPhysicsLocal()){ - return spatial.getLocalRotation(); - } - return spatial.getWorldRotation(); - } - - public Control cloneForSpatial(Spatial spatial) { - VehicleControl control = new VehicleControl(collisionShape, mass); - control.setAngularFactor(getAngularFactor()); - control.setAngularSleepingThreshold(getAngularSleepingThreshold()); - control.setAngularVelocity(getAngularVelocity()); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setDamping(getLinearDamping(), getAngularDamping()); - control.setFriction(getFriction()); - control.setGravity(getGravity()); - control.setKinematic(isKinematic()); - control.setLinearSleepingThreshold(getLinearSleepingThreshold()); - control.setLinearVelocity(getLinearVelocity()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setPhysicsRotation(getPhysicsRotationMatrix()); - control.setRestitution(getRestitution()); - - control.setFrictionSlip(getFrictionSlip()); - control.setMaxSuspensionTravelCm(getMaxSuspensionTravelCm()); - control.setSuspensionStiffness(getSuspensionStiffness()); - control.setSuspensionCompression(tuning.suspensionCompression); - control.setSuspensionDamping(tuning.suspensionDamping); - control.setMaxSuspensionForce(getMaxSuspensionForce()); - - for (Iterator it = wheels.iterator(); it.hasNext();) { - VehicleWheel wheel = it.next(); - VehicleWheel newWheel = control.addWheel(wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), wheel.isFrontWheel()); - newWheel.setFrictionSlip(wheel.getFrictionSlip()); - newWheel.setMaxSuspensionTravelCm(wheel.getMaxSuspensionTravelCm()); - newWheel.setSuspensionStiffness(wheel.getSuspensionStiffness()); - newWheel.setWheelsDampingCompression(wheel.getWheelsDampingCompression()); - newWheel.setWheelsDampingRelaxation(wheel.getWheelsDampingRelaxation()); - newWheel.setMaxSuspensionForce(wheel.getMaxSuspensionForce()); - - //TODO: bad way finding children! - if (spatial instanceof Node) { - Node node = (Node) spatial; - Spatial wheelSpat = node.getChild(wheel.getWheelSpatial().getName()); - if (wheelSpat != null) { - newWheel.setWheelSpatial(wheelSpat); - } - } - } - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - - control.setSpatial(spatial); - return control; - } - - public void setSpatial(Spatial spatial) { - if (getUserObject() == null || getUserObject() == this.spatial) { - setUserObject(spatial); - } - this.spatial = spatial; - if (spatial == null) { - if (getUserObject() == spatial) { - setUserObject(null); - } - this.spatial = null; - this.collisionShape = null; - return; - } - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - if (space != null) { - if (enabled && !added) { - if(spatial!=null){ - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - space.addCollisionObject(this); - added = true; - } else if (!enabled && added) { - space.removeCollisionObject(this); - added = false; - } - } - } - - public boolean isEnabled() { - return enabled; - } - - public void update(float tpf) { - if (enabled && spatial != null) { - if (getMotionState().applyTransform(spatial)) { - spatial.getWorldTransform(); - applyWheelTransforms(); - } - } else if (enabled) { - applyWheelTransforms(); - } - } - - @Override - protected Spatial getDebugShape() { - return super.getDebugShape(); - } - - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (debugShape == null) { - attachDebugShape(space.getDebugManager()); - } - Node debugNode = (Node) debugShape; - debugShape.setLocalTranslation(spatial.getWorldTranslation()); - debugShape.setLocalRotation(spatial.getWorldRotation()); - int i = 0; - for (Iterator it = wheels.iterator(); it.hasNext();) { - VehicleWheel physicsVehicleWheel = it.next(); - Vector3f location = physicsVehicleWheel.getLocation().clone(); - Vector3f direction = physicsVehicleWheel.getDirection().clone(); - Vector3f axle = physicsVehicleWheel.getAxle().clone(); - float restLength = physicsVehicleWheel.getRestLength(); - float radius = physicsVehicleWheel.getRadius(); - - Geometry locGeom = (Geometry) debugNode.getChild("WheelLocationDebugShape" + i); - Geometry dirGeom = (Geometry) debugNode.getChild("WheelDirectionDebugShape" + i); - Geometry axleGeom = (Geometry) debugNode.getChild("WheelAxleDebugShape" + i); - Geometry wheelGeom = (Geometry) debugNode.getChild("WheelRadiusDebugShape" + i); - - Arrow locArrow = (Arrow) locGeom.getMesh(); - locArrow.setArrowExtent(location); - Arrow axleArrow = (Arrow) axleGeom.getMesh(); - axleArrow.setArrowExtent(axle.normalizeLocal().multLocal(0.3f)); - Arrow wheelArrow = (Arrow) wheelGeom.getMesh(); - wheelArrow.setArrowExtent(direction.normalizeLocal().multLocal(radius)); - Arrow dirArrow = (Arrow) dirGeom.getMesh(); - dirArrow.setArrowExtent(direction.normalizeLocal().multLocal(restLength)); - - dirGeom.setLocalTranslation(location); - axleGeom.setLocalTranslation(location.addLocal(direction)); - wheelGeom.setLocalTranslation(location); - i++; - } - debugShape.updateLogicalState(0); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - - public void setPhysicsSpace(PhysicsSpace space) { - createVehicle(space); - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if(this.space==space) return; - space.addCollisionObject(this); - added = true; - } - this.space = space; - } - - public PhysicsSpace getPhysicsSpace() { - return space; - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(enabled, "enabled", true); - oc.write(motionState.isApplyPhysicsLocal(), "applyLocalPhysics", false); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - enabled = ic.readBoolean("enabled", true); - spatial = (Spatial) ic.readSavable("spatial", null); - motionState.setApplyPhysicsLocal(ic.readBoolean("applyLocalPhysics", false)); - setUserObject(spatial); - } -} diff --git a/engine/src/bullet/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java b/engine/src/bullet/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java deleted file mode 100644 index 06eeab052..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control.ragdoll; - -import com.jme3.math.FastMath; - -/** - * - * @author Nehon - */ -public class HumanoidRagdollPreset extends RagdollPreset { - - @Override - protected void initBoneMap() { - boneMap.put("head", new JointPreset(FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - boneMap.put("torso", new JointPreset(FastMath.QUARTER_PI, -FastMath.QUARTER_PI, 0, 0, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - boneMap.put("upperleg", new JointPreset(FastMath.PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI/2, -FastMath.QUARTER_PI/2, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - boneMap.put("lowerleg", new JointPreset(0, -FastMath.PI, 0, 0, 0, 0)); - - boneMap.put("foot", new JointPreset(0, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - boneMap.put("upperarm", new JointPreset(FastMath.HALF_PI, -FastMath.QUARTER_PI, 0, 0, FastMath.HALF_PI, -FastMath.QUARTER_PI)); - - boneMap.put("lowerarm", new JointPreset(FastMath.HALF_PI, 0, 0, 0, 0, 0)); - - boneMap.put("hand", new JointPreset(FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - } - - @Override - protected void initLexicon() { - LexiconEntry entry = new LexiconEntry(); - entry.addSynonym("head", 100); - lexicon.put("head", entry); - - entry = new LexiconEntry(); - entry.addSynonym("torso", 100); - entry.addSynonym("chest", 100); - entry.addSynonym("spine", 45); - entry.addSynonym("high", 25); - lexicon.put("torso", entry); - - entry = new LexiconEntry(); - entry.addSynonym("upperleg", 100); - entry.addSynonym("thigh", 100); - entry.addSynonym("hip", 75); - entry.addSynonym("leg", 40); - entry.addSynonym("high", 10); - entry.addSynonym("up", 15); - entry.addSynonym("upper", 15); - lexicon.put("upperleg", entry); - - entry = new LexiconEntry(); - entry.addSynonym("lowerleg", 100); - entry.addSynonym("calf", 100); - entry.addSynonym("knee", 75); - entry.addSynonym("leg", 50); - entry.addSynonym("low", 10); - entry.addSynonym("lower", 10); - lexicon.put("lowerleg", entry); - - entry = new LexiconEntry(); - entry.addSynonym("foot", 100); - entry.addSynonym("ankle", 75); - lexicon.put("foot", entry); - - - entry = new LexiconEntry(); - entry.addSynonym("upperarm", 100); - entry.addSynonym("humerus", 100); - entry.addSynonym("shoulder", 50); - entry.addSynonym("arm", 40); - entry.addSynonym("high", 10); - entry.addSynonym("up", 15); - entry.addSynonym("upper", 15); - lexicon.put("upperarm", entry); - - entry = new LexiconEntry(); - entry.addSynonym("lowerarm", 100); - entry.addSynonym("ulna", 100); - entry.addSynonym("elbow", 75); - entry.addSynonym("arm", 50); - entry.addSynonym("low", 10); - entry.addSynonym("lower", 10); - lexicon.put("lowerarm", entry); - - entry = new LexiconEntry(); - entry.addSynonym("hand", 100); - entry.addSynonym("fist", 100); - entry.addSynonym("wrist", 75); - lexicon.put("hand", entry); - - } -} diff --git a/engine/src/bullet/com/jme3/bullet/control/ragdoll/RagdollPreset.java b/engine/src/bullet/com/jme3/bullet/control/ragdoll/RagdollPreset.java deleted file mode 100644 index 51bf4babf..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/ragdoll/RagdollPreset.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control.ragdoll; - -import com.jme3.bullet.joints.SixDofJoint; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author Nehon - */ -public abstract class RagdollPreset { - - protected static final Logger logger = Logger.getLogger(RagdollPreset.class.getName()); - protected Map boneMap = new HashMap(); - protected Map lexicon = new HashMap(); - - protected abstract void initBoneMap(); - - protected abstract void initLexicon(); - - public void setupJointForBone(String boneName, SixDofJoint joint) { - - if (boneMap.isEmpty()) { - initBoneMap(); - } - if (lexicon.isEmpty()) { - initLexicon(); - } - String resultName = ""; - int resultScore = 0; - - for (String key : lexicon.keySet()) { - - int score = lexicon.get(key).getScore(boneName); - if (score > resultScore) { - resultScore = score; - resultName = key; - } - - } - - JointPreset preset = boneMap.get(resultName); - - if (preset != null && resultScore >= 50) { - logger.log(Level.INFO, "Found matching joint for bone {0} : {1} with score {2}", new Object[]{boneName, resultName, resultScore}); - preset.setupJoint(joint); - } else { - logger.log(Level.INFO, "No joint match found for bone {0}", boneName); - if (resultScore > 0) { - logger.log(Level.INFO, "Best match found is {0} with score {1}", new Object[]{resultName, resultScore}); - } - new JointPreset().setupJoint(joint); - } - - } - - protected class JointPreset { - - private float maxX, minX, maxY, minY, maxZ, minZ; - - public JointPreset() { - } - - public JointPreset(float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { - this.maxX = maxX; - this.minX = minX; - this.maxY = maxY; - this.minY = minY; - this.maxZ = maxZ; - this.minZ = minZ; - } - - public void setupJoint(SixDofJoint joint) { - joint.getRotationalLimitMotor(0).setHiLimit(maxX); - joint.getRotationalLimitMotor(0).setLoLimit(minX); - joint.getRotationalLimitMotor(1).setHiLimit(maxY); - joint.getRotationalLimitMotor(1).setLoLimit(minY); - joint.getRotationalLimitMotor(2).setHiLimit(maxZ); - joint.getRotationalLimitMotor(2).setLoLimit(minZ); - } - } - - protected class LexiconEntry extends HashMap { - - public void addSynonym(String word, int score) { - put(word.toLowerCase(), score); - } - - public int getScore(String word) { - int score = 0; - String searchWord = word.toLowerCase(); - for (String key : this.keySet()) { - if (searchWord.indexOf(key) >= 0) { - score += get(key); - } - } - return score; - } - } -} diff --git a/engine/src/bullet/com/jme3/bullet/control/ragdoll/RagdollUtils.java b/engine/src/bullet/com/jme3/bullet/control/ragdoll/RagdollUtils.java deleted file mode 100644 index 7aeb3a901..000000000 --- a/engine/src/bullet/com/jme3/bullet/control/ragdoll/RagdollUtils.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control.ragdoll; - -import com.jme3.animation.Bone; -import com.jme3.animation.Skeleton; -import com.jme3.bullet.collision.shapes.HullCollisionShape; -import com.jme3.bullet.joints.SixDofJoint; -import com.jme3.math.Quaternion; -import com.jme3.math.Transform; -import com.jme3.math.Vector3f; -import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.VertexBuffer.Type; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * - * @author Nehon - */ -public class RagdollUtils { - - public static void setJointLimit(SixDofJoint joint, float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { - - joint.getRotationalLimitMotor(0).setHiLimit(maxX); - joint.getRotationalLimitMotor(0).setLoLimit(minX); - joint.getRotationalLimitMotor(1).setHiLimit(maxY); - joint.getRotationalLimitMotor(1).setLoLimit(minY); - joint.getRotationalLimitMotor(2).setHiLimit(maxZ); - joint.getRotationalLimitMotor(2).setLoLimit(minZ); - } - - public static Map> buildPointMap(Spatial model) { - - - Map> map = new HashMap>(); - if (model instanceof Geometry) { - Geometry g = (Geometry) model; - buildPointMapForMesh(g.getMesh(), map); - } else if (model instanceof Node) { - Node node = (Node) model; - for (Spatial s : node.getChildren()) { - if (s instanceof Geometry) { - Geometry g = (Geometry) s; - buildPointMapForMesh(g.getMesh(), map); - } - } - } - return map; - } - - private static Map> buildPointMapForMesh(Mesh mesh, Map> map) { - - FloatBuffer vertices = mesh.getFloatBuffer(Type.Position); - ByteBuffer boneIndices = (ByteBuffer) mesh.getBuffer(Type.BoneIndex).getData(); - FloatBuffer boneWeight = (FloatBuffer) mesh.getBuffer(Type.BoneWeight).getData(); - - vertices.rewind(); - boneIndices.rewind(); - boneWeight.rewind(); - - int vertexComponents = mesh.getVertexCount() * 3; - int k, start, index; - float maxWeight = 0; - - for (int i = 0; i < vertexComponents; i += 3) { - - - start = i / 3 * 4; - index = 0; - maxWeight = -1; - for (k = start; k < start + 4; k++) { - float weight = boneWeight.get(k); - if (weight > maxWeight) { - maxWeight = weight; - index = boneIndices.get(k); - } - } - List points = map.get(index); - if (points == null) { - points = new ArrayList(); - map.put(index, points); - } - points.add(vertices.get(i)); - points.add(vertices.get(i + 1)); - points.add(vertices.get(i + 2)); - } - return map; - } - - /** - * Create a hull collision shape from linked vertices to this bone. - * Vertices have to be previoulsly gathered in a map using buildPointMap method - * @param link - * @param model - * @return - */ - public static HullCollisionShape makeShapeFromPointMap(Map> pointsMap, List boneIndices, Vector3f initialScale, Vector3f initialPosition) { - - ArrayList points = new ArrayList(); - for (Integer index : boneIndices) { - List l = pointsMap.get(index); - if (l != null) { - - for (int i = 0; i < l.size(); i += 3) { - Vector3f pos = new Vector3f(); - pos.x = l.get(i); - pos.y = l.get(i + 1); - pos.z = l.get(i + 2); - pos.subtractLocal(initialPosition).multLocal(initialScale); - points.add(pos.x); - points.add(pos.y); - points.add(pos.z); - } - } - } - - float[] p = new float[points.size()]; - for (int i = 0; i < points.size(); i++) { - p[i] = points.get(i); - } - - - return new HullCollisionShape(p); - } - - //retruns the list of bone indices of the given bone and its child(if they are not in the boneList) - public static List getBoneIndices(Bone bone, Skeleton skeleton, Set boneList) { - List list = new LinkedList(); - if (boneList.isEmpty()) { - list.add(skeleton.getBoneIndex(bone)); - } else { - list.add(skeleton.getBoneIndex(bone)); - for (Bone chilBone : bone.getChildren()) { - if (!boneList.contains(chilBone.getName())) { - list.addAll(getBoneIndices(chilBone, skeleton, boneList)); - } - } - } - return list; - } - - /** - * Create a hull collision shape from linked vertices to this bone. - * - * @param link - * @param model - * @return - */ - public static HullCollisionShape makeShapeFromVerticeWeights(Spatial model, List boneIndices, Vector3f initialScale, Vector3f initialPosition, float weightThreshold) { - - ArrayList points = new ArrayList(); - if (model instanceof Geometry) { - Geometry g = (Geometry) model; - for (Integer index : boneIndices) { - points.addAll(getPoints(g.getMesh(), index, initialScale, initialPosition, weightThreshold)); - } - } else if (model instanceof Node) { - Node node = (Node) model; - for (Spatial s : node.getChildren()) { - if (s instanceof Geometry) { - Geometry g = (Geometry) s; - for (Integer index : boneIndices) { - points.addAll(getPoints(g.getMesh(), index, initialScale, initialPosition, weightThreshold)); - } - - } - } - } - float[] p = new float[points.size()]; - for (int i = 0; i < points.size(); i++) { - p[i] = points.get(i); - } - - - return new HullCollisionShape(p); - } - - /** - * returns a list of points for the given bone - * @param mesh - * @param boneIndex - * @param offset - * @param link - * @return - */ - private static List getPoints(Mesh mesh, int boneIndex, Vector3f initialScale, Vector3f offset, float weightThreshold) { - - FloatBuffer vertices = mesh.getFloatBuffer(Type.Position); - ByteBuffer boneIndices = (ByteBuffer) mesh.getBuffer(Type.BoneIndex).getData(); - FloatBuffer boneWeight = (FloatBuffer) mesh.getBuffer(Type.BoneWeight).getData(); - - vertices.rewind(); - boneIndices.rewind(); - boneWeight.rewind(); - - ArrayList results = new ArrayList(); - - int vertexComponents = mesh.getVertexCount() * 3; - - for (int i = 0; i < vertexComponents; i += 3) { - int k; - boolean add = false; - int start = i / 3 * 4; - for (k = start; k < start + 4; k++) { - if (boneIndices.get(k) == boneIndex && boneWeight.get(k) >= weightThreshold) { - add = true; - break; - } - } - if (add) { - - Vector3f pos = new Vector3f(); - pos.x = vertices.get(i); - pos.y = vertices.get(i + 1); - pos.z = vertices.get(i + 2); - pos.subtractLocal(offset).multLocal(initialScale); - results.add(pos.x); - results.add(pos.y); - results.add(pos.z); - - } - } - - return results; - } - - /** - * Updates a bone position and rotation. - * if the child bones are not in the bone list this means, they are not associated with a physic shape. - * So they have to be updated - * @param bone the bone - * @param pos the position - * @param rot the rotation - */ - public static void setTransform(Bone bone, Vector3f pos, Quaternion rot, boolean restoreBoneControl, Set boneList) { - //we ensure that we have the control - if (restoreBoneControl) { - bone.setUserControl(true); - } - //we set te user transforms of the bone - bone.setUserTransformsWorld(pos, rot); - for (Bone childBone : bone.getChildren()) { - //each child bone that is not in the list is updated - if (!boneList.contains(childBone.getName())) { - Transform t = childBone.getCombinedTransform(pos, rot); - setTransform(childBone, t.getTranslation(), t.getRotation(), restoreBoneControl, boneList); - } - } - //we give back the control to the keyframed animation - if (restoreBoneControl) { - bone.setUserControl(false); - } - } - - public static void setUserControl(Bone bone, boolean bool) { - bone.setUserControl(bool); - for (Bone child : bone.getChildren()) { - setUserControl(child, bool); - } - } -} diff --git a/engine/src/bullet/native/android/Android.mk b/engine/src/bullet/native/android/Android.mk deleted file mode 100644 index 3db035184..000000000 --- a/engine/src/bullet/native/android/Android.mk +++ /dev/null @@ -1,259 +0,0 @@ -# /* -# Bullet Continuous Collision Detection and Physics Library for Android NDK -# Copyright (c) 2006-2009 Noritsuna Imamura http://www.siprop.org/ -# -# This software is provided 'as-is', without any express or implied warranty. -# In no event will the authors be held liable for any damages arising from the use of this software. -# Permission is granted to anyone to use this software for any purpose, -# including commercial applications, and to alter it and redistribute it freely, -# subject to the following restrictions: -# -# 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -# 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -# 3. This notice may not be removed or altered from any source distribution. -# */ -LOCAL_PATH:= $(call my-dir) -JME3_PATH:= -BULLET_PATH:= - -include $(CLEAR_VARS) - -LOCAL_MODULE := bulletjme -LOCAL_C_INCLUDES := $(BULLET_PATH)/\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch\ - $(BULLET_PATH)/BulletCollision/CollisionShapes\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver\ - $(BULLET_PATH)/BulletDynamics/Dynamics\ - $(BULLET_PATH)/BulletDynamics/Vehicle\ - $(BULLET_PATH)/LinearMath\ - $(BULLET_PATH)/BulletCollision\ - $(BULLET_PATH)/BulletDynamics\ - $(BULLET_PATH)/BulletMultiThreaded\ - $(BULLET_PATH)/BulletSoftBody\ - $(BULLET_PATH)/ibmsdk\ - $(BULLET_PATH)/LinearMath\ - $(BULLET_PATH)/MiniCL\ - $(BULLET_PATH)/vectormath\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch\ - $(BULLET_PATH)/BulletCollision/CollisionShapes\ - $(BULLET_PATH)/BulletCollision/Gimpact\ - $(BULLET_PATH)/BulletCollision/ibmsdk\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision\ - $(BULLET_PATH)/BulletDynamics/Character\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver\ - $(BULLET_PATH)/BulletDynamics/Dynamics\ - $(BULLET_PATH)/BulletDynamics/ibmsdk\ - $(BULLET_PATH)/BulletDynamics/Vehicle\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers\ - $(BULLET_PATH)/BulletMultiThreaded/out\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask\ - $(BULLET_PATH)/BulletMultiThreaded/SpuSampleTask\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/CPU\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/DX11\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/AMD\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/Apple\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/MiniCL\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/NVidia\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC10\ - $(BULLET_PATH)/LinearMath/ibmsdk\ - $(BULLET_PATH)/MiniCL/MiniCLTask\ - $(BULLET_PATH)/vectormath/scalar\ - $(BULLET_PATH)/vectormath/sse - -LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -lm -llog - -LOCAL_SRC_FILES := $(JME3_PATH)/com_jme3_bullet_collision_PhysicsCollisionEvent.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_PhysicsCollisionObject.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_BoxCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_CollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_CompoundCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_ConeCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_CylinderCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_GImpactCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_HullCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_MeshCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_PlaneCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_SimplexCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_SphereCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_ConeJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_HingeJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_motors_RotationalLimitMotor.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_PhysicsJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_Point2PointJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_SixDofJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_SixDofSpringJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_SliderJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_infos_RigidBodyMotionState.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_PhysicsCharacter.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_PhysicsGhostObject.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_PhysicsRigidBody.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_PhysicsVehicle.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_VehicleWheel.cpp\ - $(JME3_PATH)/com_jme3_bullet_PhysicsSpace.cpp\ - $(JME3_PATH)/com_jme3_bullet_util_DebugShapeFactory.cpp\ - $(JME3_PATH)/com_jme3_bullet_util_NativeMeshUtil.cpp\ - $(JME3_PATH)/jmeBulletUtil.cpp\ - $(JME3_PATH)/jmeClasses.cpp\ - $(JME3_PATH)/jmeMotionState.cpp\ - $(JME3_PATH)/jmePhysicsSpace.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btDbvt.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btDispatcher.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btCollisionObject.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btCollisionWorld.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btGhostObject.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btManifoldResult.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btUnionFind.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btBox2dShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btBoxShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btCapsuleShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btCollisionShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btCompoundShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConcaveShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConeShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvex2dShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexHullShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexInternalShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btCylinderShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btEmptyShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btMultiSphereShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btOptimizedBvh.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btShapeHull.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btSphereShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTetrahedronShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleBuffer.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleCallback.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleMesh.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btUniformScalingShape.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btContactProcessing.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGenericPoolAllocator.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGImpactBvh.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGImpactShape.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btTriangleShapeEx.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/gim_box_set.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/gim_contact.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/gim_memory.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/gim_tri_collision.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btConvexCast.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp\ - $(BULLET_PATH)/BulletDynamics/Character/btKinematicCharacterController.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btContactConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp\ - $(BULLET_PATH)/BulletDynamics/Dynamics/btRigidBody.cpp\ - $(BULLET_PATH)/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp\ - $(BULLET_PATH)/BulletDynamics/Dynamics/Bullet-C-API.cpp\ - $(BULLET_PATH)/BulletDynamics/Vehicle/btRaycastVehicle.cpp\ - $(BULLET_PATH)/BulletDynamics/Vehicle/btWheelInfo.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/btGpu3DGridBroadphase.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/btParallelConstraintSolver.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/btThreadSupportInterface.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/PosixThreadSupport.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SequentialThreadSupport.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuCollisionObjectWrapper.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuCollisionTaskProcess.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuFakeDma.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuGatheringCollisionDispatcher.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuLibspe2Support.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuSampleTaskProcess.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/Win32ThreadSupport.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/MiniCL/MiniCLTaskWrap.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/boxBoxDistance.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuCollisionShapes.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuContactResult.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuMinkowskiPenetrationDepthSolver.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.cpp\ - $(BULLET_PATH)/BulletSoftBody/btDefaultSoftBodySolver.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftBody.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftBodyHelpers.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftRigidDynamicsWorld.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp\ - $(BULLET_PATH)/LinearMath/btAlignedAllocator.cpp\ - $(BULLET_PATH)/LinearMath/btConvexHull.cpp\ - $(BULLET_PATH)/LinearMath/btConvexHullComputer.cpp\ - $(BULLET_PATH)/LinearMath/btGeometryUtil.cpp\ - $(BULLET_PATH)/LinearMath/btQuickprof.cpp\ - $(BULLET_PATH)/LinearMath/btSerializer.cpp\ - $(BULLET_PATH)/MiniCL/MiniCL.cpp\ - $(BULLET_PATH)/MiniCL/MiniCLTaskScheduler.cpp\ - $(BULLET_PATH)/MiniCL/MiniCLTask/MiniCLTask.cpp - -include $(BUILD_SHARED_LIBRARY) diff --git a/engine/src/bullet/native/android/Application.mk b/engine/src/bullet/native/android/Application.mk deleted file mode 100644 index 9e8be3571..000000000 --- a/engine/src/bullet/native/android/Application.mk +++ /dev/null @@ -1,2 +0,0 @@ -APP_MODULES := bulletjme -APP_ABI := all \ No newline at end of file diff --git a/engine/src/bullet/native/android/jmePhysicsSpace.cpp b/engine/src/bullet/native/android/jmePhysicsSpace.cpp deleted file mode 100644 index efed1b612..000000000 --- a/engine/src/bullet/native/android/jmePhysicsSpace.cpp +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "jmePhysicsSpace.h" -#include "jmeBulletUtil.h" -#include - -/** - * Author: Normen Hansen - */ -jmePhysicsSpace::jmePhysicsSpace(JNIEnv* env, jobject javaSpace) { - //TODO: global ref? maybe not -> cleaning, rather callback class? - this->javaPhysicsSpace = env->NewWeakGlobalRef(javaSpace); - this->env = env; - env->GetJavaVM(&vm); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } -} - -void jmePhysicsSpace::attachThread() { -#ifdef JNI_VERSION_1_2 - vm->AttachCurrentThread((JNIEnv**) &env, NULL); -#else - vm->AttachCurrentThread(&env, NULL); -#endif -} - -JNIEnv* jmePhysicsSpace::getEnv() { - attachThread(); - return this->env; -} - -void jmePhysicsSpace::stepSimulation(jfloat tpf, jint maxSteps, jfloat accuracy) { - dynamicsWorld->stepSimulation(tpf, maxSteps, accuracy); -} - -btThreadSupportInterface* jmePhysicsSpace::createSolverThreadSupport(int maxNumThreads) { -#ifdef _WIN32 - Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads", SolverThreadFunc, SolverlsMemoryFunc, maxNumThreads); - Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo); - threadSupport->startSPU(); -#elif defined (USE_PTHREADS) - PosixThreadSupport::ThreadConstructionInfo constructionInfo("collision", SolverThreadFunc, - SolverlsMemoryFunc, maxNumThreads); - PosixThreadSupport* threadSupport = new PosixThreadSupport(constructionInfo); - threadSupport->startSPU(); -#else - SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads", SolverThreadFunc, SolverlsMemoryFunc); - SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci); - threadSupport->startSPU(); -#endif - return threadSupport; -} - -btThreadSupportInterface* jmePhysicsSpace::createDispatchThreadSupport(int maxNumThreads) { -#ifdef _WIN32 - Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads", processCollisionTask, createCollisionLocalStoreMemory, maxNumThreads); - Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo); - threadSupport->startSPU(); -#elif defined (USE_PTHREADS) - PosixThreadSupport::ThreadConstructionInfo solverConstructionInfo("solver", processCollisionTask, - createCollisionLocalStoreMemory, maxNumThreads); - PosixThreadSupport* threadSupport = new PosixThreadSupport(solverConstructionInfo); - threadSupport->startSPU(); -#else - SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads", processCollisionTask, createCollisionLocalStoreMemory); - SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci); - threadSupport->startSPU(); -#endif - return threadSupport; -} - -void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, jfloat maxX, jfloat maxY, jfloat maxZ, jint broadphaseId, jboolean threading) { - // collision configuration contains default setup for memory, collision setup - btDefaultCollisionConstructionInfo cci; - // if(threading){ - // cci.m_defaultMaxPersistentManifoldPoolSize = 32768; - // } - btCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(cci); - - btVector3 min = btVector3(minX, minY, minZ); - btVector3 max = btVector3(maxX, maxY, maxZ); - - btBroadphaseInterface* broadphase; - - switch (broadphaseId) { - case 0: - broadphase = new btSimpleBroadphase(); - break; - case 1: - broadphase = new btAxisSweep3(min, max); - break; - case 2: - //TODO: 32bit! - broadphase = new btAxisSweep3(min, max); - break; - case 3: - broadphase = new btDbvtBroadphase(); - break; - case 4: - // broadphase = new btGpu3DGridBroadphase( - // min, max, - // 20, 20, 20, - // 10000, 1000, 25); - break; - } - - btCollisionDispatcher* dispatcher; - btConstraintSolver* solver; - // use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - if (threading) { - btThreadSupportInterface* dispatchThreads = createDispatchThreadSupport(4); - dispatcher = new SpuGatheringCollisionDispatcher(dispatchThreads, 4, collisionConfiguration); - dispatcher->setDispatcherFlags(btCollisionDispatcher::CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION); - } else { - dispatcher = new btCollisionDispatcher(collisionConfiguration); - } - - // the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) - if (threading) { - btThreadSupportInterface* solverThreads = createSolverThreadSupport(4); - solver = new btParallelConstraintSolver(solverThreads); - } else { - solver = new btSequentialImpulseConstraintSolver; - } - - //create dynamics world - btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); - dynamicsWorld = world; - dynamicsWorld->setWorldUserInfo(this); - - //parallel solver requires the contacts to be in a contiguous pool, so avoid dynamic allocation - if (threading) { - world->getSimulationIslandManager()->setSplitIslands(false); - world->getSolverInfo().m_numIterations = 4; - world->getSolverInfo().m_solverMode = SOLVER_SIMD + SOLVER_USE_WARMSTARTING; //+SOLVER_RANDMIZE_ORDER; - world->getDispatchInfo().m_enableSPU = true; - } - - broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); - - dynamicsWorld->setGravity(btVector3(0, -9.81f, 0)); - - struct jmeFilterCallback : public btOverlapFilterCallback { - // return true when pairs need collision - - virtual bool needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy * proxy1) const { - // bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - // collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - if (collides) { - btCollisionObject* co0 = (btCollisionObject*) proxy0->m_clientObject; - btCollisionObject* co1 = (btCollisionObject*) proxy1->m_clientObject; - jmeUserPointer *up0 = (jmeUserPointer*) co0 -> getUserPointer(); - jmeUserPointer *up1 = (jmeUserPointer*) co1 -> getUserPointer(); - if (up0 != NULL && up1 != NULL) { - collides = (up0->group & up1->groups) != 0; - collides = collides && (up1->group & up0->groups); - - //add some additional logic here that modified 'collides' - return collides; - } - return false; - } - return collides; - } - }; - dynamicsWorld->getPairCache()->setOverlapFilterCallback(new jmeFilterCallback()); - dynamicsWorld->setInternalTickCallback(&jmePhysicsSpace::preTickCallback, static_cast (this), true); - dynamicsWorld->setInternalTickCallback(&jmePhysicsSpace::postTickCallback, static_cast (this)); - if (gContactProcessedCallback == NULL) { - gContactProcessedCallback = &jmePhysicsSpace::contactProcessedCallback; - } -} - -void jmePhysicsSpace::preTickCallback(btDynamicsWorld *world, btScalar timeStep) { - jmePhysicsSpace* dynamicsWorld = (jmePhysicsSpace*) world->getWorldUserInfo(); - JNIEnv* env = dynamicsWorld->getEnv(); - jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); - if (javaPhysicsSpace != NULL) { - env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_preTick, timeStep); - env->DeleteLocalRef(javaPhysicsSpace); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - } -} - -void jmePhysicsSpace::postTickCallback(btDynamicsWorld *world, btScalar timeStep) { - jmePhysicsSpace* dynamicsWorld = (jmePhysicsSpace*) world->getWorldUserInfo(); - JNIEnv* env = dynamicsWorld->getEnv(); - jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); - if (javaPhysicsSpace != NULL) { - env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_postTick, timeStep); - env->DeleteLocalRef(javaPhysicsSpace); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - } -} - -bool jmePhysicsSpace::contactProcessedCallback(btManifoldPoint &cp, void *body0, void *body1) { - // printf("contactProcessedCallback %d %dn", body0, body1); - btCollisionObject* co0 = (btCollisionObject*) body0; - jmeUserPointer *up0 = (jmeUserPointer*) co0 -> getUserPointer(); - btCollisionObject* co1 = (btCollisionObject*) body1; - jmeUserPointer *up1 = (jmeUserPointer*) co1 -> getUserPointer(); - if (up0 != NULL) { - jmePhysicsSpace *dynamicsWorld = (jmePhysicsSpace *)up0->space; - if (dynamicsWorld != NULL) { - JNIEnv* env = dynamicsWorld->getEnv(); - jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); - if (javaPhysicsSpace != NULL) { - jobject javaCollisionObject0 = env->NewLocalRef(up0->javaCollisionObject); - jobject javaCollisionObject1 = env->NewLocalRef(up1->javaCollisionObject); - env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_addCollisionEvent, javaCollisionObject0, javaCollisionObject1, (jlong) & cp); - env->DeleteLocalRef(javaPhysicsSpace); - env->DeleteLocalRef(javaCollisionObject0); - env->DeleteLocalRef(javaCollisionObject1); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return true; - } - } - } - } - return true; -} - -btDynamicsWorld* jmePhysicsSpace::getDynamicsWorld() { - return dynamicsWorld; -} - -jobject jmePhysicsSpace::getJavaPhysicsSpace() { - return javaPhysicsSpace; -} - -jmePhysicsSpace::~jmePhysicsSpace() { - delete(dynamicsWorld); -} \ No newline at end of file diff --git a/engine/src/bullet/native/build.xml b/engine/src/bullet/native/build.xml deleted file mode 100644 index 0fc92893b..000000000 --- a/engine/src/bullet/native/build.xml +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/bullet/native/bullet-native-build.txt b/engine/src/bullet/native/bullet-native-build.txt deleted file mode 100644 index e9e4bcd84..000000000 --- a/engine/src/bullet/native/bullet-native-build.txt +++ /dev/null @@ -1,169 +0,0 @@ -*********************************** -* Build info for bulletjme * -* (c) 2011 Normen Hansen * -*********************************** - -This document outlines the process of building bullet-jme on different platforms. -Since bullet-jme is a native java library and bullet gets included statically, -building requires you to download and build the bullet source first. - - - -*********************************** -* Building bullet * -*********************************** - ------------------------------------ -General info ------------------------------------ -Note that the compilation of bullet should not produce dll / so / dylib files -but static *.a libraries which can later be compiled into the binary of bullet-jme. - ------------------------------------ -Downloading and extracting bullet ------------------------------------ -Requirements: -- Bullet source: http://bullet.googlecode.com/ - -Extract bullet source and build bullet (see below) - ------------------------------------ -Building on Mac OSX ------------------------------------ -Requirements: -- Apple Developer tools: http://developer.apple.com/ -- CMake: http://www.cmake.org/ (or via http://www.macports.org) - -Commands: -> cd bullet-trunk -> cmake -DBUILD_SHARED_LIBS=OFF -DBUILD_STATIC_LIBS=ON \ - -DCMAKE_OSX_ARCHITECTURES='ppc;i386;x86_64' \ - -DBUILD_EXTRAS=off -DBUILD_DEMOS=off -DCMAKE_BUILD_TYPE=Release -> make - ------------------------------------ -Building on WINDOWS (MinGW/GCC, Recommended) ------------------------------------ -Requirements: -- GNU C++ Compiler: http://www.mingw.org/ - http://mingw-w64.sourceforge.net/ -- CMake: http://www.cmake.org/ - -Commands: -> cd bullet-trunk -> cmake . -DBUILD_SHARED_LIBS=OFF -DBUILD_DEMOS:BOOL=OFF -DBUILD_EXTRAS:BOOL=OFF -DCMAKE_BUILD_TYPE=Release . -G "MinGW Makefiles" -> mingw32-make - ------------------------------------ -Building on WINDOWS (VisualStudio, untested) ------------------------------------ -Requirements: -- Microsoft Visual Studio http://msdn.microsoft.com/ - -Bullet comes with autogenerated Project Files for Microsoft Visual Studio 6, 7, 7.1 and 8. -The main Workspace/Solution is located in Bullet/msvc/8/wksbullet.sln (replace 8 with your version). - -Build the project to create static libraries. - - ------------------------------------ -Building bullet on LINUX ------------------------------------ -Requirements: -- Gnu C++ Compiler: http://gcc.gnu.org/ -- CMake: http://www.cmake.org/ (or via your package manager of choice) - -Commands: -> cd bullet-trunk -> cmake -DBUILD_SHARED_LIBS=OFF -DBUILD_STATIC_LIBS=ON -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC"\ - -DBUILD_EXTRAS=off -DBUILD_DEMOS=off -DCMAKE_BUILD_TYPE=Release -> make - ------------------------------------ -More info on building bullet ------------------------------------ -http://www.bulletphysics.org/mediawiki-1.5.8/index.php?title=Installation - - - -*********************************** -* Building bulletjme * -*********************************** - ------------------------------------ -Requirements ------------------------------------ -- Java SDK 1.5+: http://java.sun.com -- Apache ANT: http://ant.apache.org -- C++ Compiler: (see below) -- jme3 Source: http://jmonkeyengine.googlecode.com/ -- Statically compiled bullet source (see above) - ------------------------------------ -Preparation ------------------------------------ -- copy/link bullet-trunk folder into the same folder where the bullet-jme folder is: - -disk - | - +-root folder - | - +-engine - | - +-sdk - | - +-bullet-trunk - -- You can alter options in the "src/bullet/native/bullet.properties" file, such as the used bullet - version, native compilation options etc. (see below) - ------------------------------------ -Building bulletjme native ------------------------------------ -Commands: -> cd engine -> ant jar -> ant build-bullet-natives - -Thats all. ANT takes care building native binaries and copies them to th elib directory. - -If you get compilation errors, try setting "native.java.include" in the build.properties file to your -JDK include directory, e.g. /opt/java/include or "c:\Program Files\Java\jdk1.6.0_20\include". - ------------------------------------ -Altering the native build process ------------------------------------ -bullet-jme uses cpptasks to compile native code. - -To change the used compiler, edit the "native.platform.compiler" entry in the -"build.properties" file. The following c++ compilers work with cpptasks: - -gcc GCC C++ compiler -g++ GCC C++ compiler -c++ GCC C++ compiler -msvc Microsoft Visual C++ -bcc Borland C++ Compiler -icl Intel C++ compiler for Windows (IA-32) -ecl Intel C++ compiler for Windows (IA-64) -icc Intel C++ compiler for Linux (IA-32) -ecc Intel C++ compiler for Linux (IA-64) -CC Sun ONE C++ compiler -aCC HP aC++ C++ Compiler -wcl OpenWatcom C/C++ compiler - -In the "nbproject" folder you can find "build-native-platform.xml" files containing the commands -to compile bullet-jme on different platforms. If you want to alter the process, -you can copy and modify one of the files and import it in the "build.xml" file instead -of the old one. - ------------------------------------ -Netbeans Project ------------------------------------ -The project also includes a Netbeans project to edit and build -the source in the Netbeans IDE in the /src/bullet/ subfolder. - -To have correct syntax highlighting in .cpp/.h files: - -- in Netbeans Settings -> C/C++ -> Code Assistance -> C++ - - add bullet-2.77/src as include directories for c++ - - add JAVA_HOME/include as include directories for c++ diff --git a/engine/src/bullet/native/bullet.properties b/engine/src/bullet/native/bullet.properties deleted file mode 100644 index 0e6a0309a..000000000 --- a/engine/src/bullet/native/bullet.properties +++ /dev/null @@ -1,35 +0,0 @@ -##################################################### -# these are the ant build properties for bullet-jme # -##################################################### -bullet.library.name=bulletjme -bullet.library.version=0.9 - -# change if bullet folder has different location -bullet.folder=../bullet-2.79 - -# compile options -bullet.compile.debug=false - -# native library compilation options -bullet.osx.compiler=g++ -bullet.osx.syslibroot=/Developer/SDKs/MacOSX10.6.sdk -# change this to msvc for MS Visual Studio compiler -bullet.windows.compiler=g++ -bullet.linux.compiler=g++ -bullet.solaris.compiler=g++ -# native header include directories -bullet.java.include=${java.home}/../include -# OSX has no JRE, only JDK -bullet.osx.java.include=/System/Library/Frameworks/JavaVM.framework/Headers - -# location of Android NDK -ndk.dir=/opt/android-ndk-r7 - -# dont change these.. -bullet.bullet.include=${bullet.folder}/src -bullet.build.dir=build/bullet/ -bullet.source.dir=src/bullet/native -bullet.output.base=lib/bullet -bullet.output.dir=${bullet.output.base}/jarcontent/native -bullet.jme.dir=dist -bullet.lib.dir=dist/lib diff --git a/engine/src/bullet/native/com_jme3_bullet_PhysicsSpace.cpp b/engine/src/bullet/native/com_jme3_bullet_PhysicsSpace.cpp deleted file mode 100644 index 8116f90a4..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_PhysicsSpace.cpp +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "com_jme3_bullet_PhysicsSpace.h" -#include "jmePhysicsSpace.h" -#include "jmeBulletUtil.h" - -/** - * Author: Normen Hansen - */ -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: createPhysicsSpace - * Signature: (FFFFFFI)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_PhysicsSpace_createPhysicsSpace - (JNIEnv * env, jobject object, jfloat minX, jfloat minY, jfloat minZ, jfloat maxX, jfloat maxY, jfloat maxZ, jint broadphase, jboolean threading) { - jmeClasses::initJavaClasses(env); - jmePhysicsSpace* space = new jmePhysicsSpace(env, object); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space has not been created."); - return 0; - } - space->createPhysicsSpace(minX, minY, minZ, maxX, maxY, maxZ, broadphase, threading); - return reinterpret_cast(space); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: stepSimulation - * Signature: (JFIF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_stepSimulation - (JNIEnv * env, jobject object, jlong spaceId, jfloat tpf, jint maxSteps, jfloat accuracy) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - space->stepSimulation(tpf, maxSteps, accuracy); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addCollisionObject - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addCollisionObject - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The collision object does not exist."); - return; - } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - userPointer -> space = space; - - space->getDynamicsWorld()->addCollisionObject(collisionObject); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeCollisionObject - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeCollisionObject - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The collision object does not exist."); - return; - } - space->getDynamicsWorld()->removeCollisionObject(collisionObject); - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - userPointer -> space = NULL; - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addRigidBody - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addRigidBody - (JNIEnv * env, jobject object, jlong spaceId, jlong rigidBodyId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btRigidBody* collisionObject = reinterpret_cast(rigidBodyId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The collision object does not exist."); - return; - } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - userPointer -> space = space; - space->getDynamicsWorld()->addRigidBody(collisionObject); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeRigidBody - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeRigidBody - (JNIEnv * env, jobject object, jlong spaceId, jlong rigidBodyId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btRigidBody* collisionObject = reinterpret_cast(rigidBodyId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The collision object does not exist."); - return; - } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - userPointer -> space = NULL; - space->getDynamicsWorld()->removeRigidBody(collisionObject); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addCharacterObject - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addCharacterObject - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The collision object does not exist."); - return; - } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - userPointer -> space = space; - space->getDynamicsWorld()->addCollisionObject(collisionObject, - btBroadphaseProxy::CharacterFilter, - btBroadphaseProxy::StaticFilter | btBroadphaseProxy::DefaultFilter - ); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeCharacterObject - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeCharacterObject - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The collision object does not exist."); - return; - } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - userPointer -> space = NULL; - space->getDynamicsWorld()->removeCollisionObject(collisionObject); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addAction - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addAction - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btActionInterface* actionObject = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (actionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The action object does not exist."); - return; - } - space->getDynamicsWorld()->addAction(actionObject); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeAction - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeAction - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btActionInterface* actionObject = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (actionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The action object does not exist."); - return; - } - space->getDynamicsWorld()->removeAction(actionObject); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addVehicle - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addVehicle - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btActionInterface* actionObject = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (actionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The vehicle object does not exist."); - return; - } - space->getDynamicsWorld()->addVehicle(actionObject); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeVehicle - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeVehicle - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btActionInterface* actionObject = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (actionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The action object does not exist."); - return; - } - space->getDynamicsWorld()->removeVehicle(actionObject); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addConstraint - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addConstraint - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btTypedConstraint* constraint = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (constraint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The constraint object does not exist."); - return; - } - space->getDynamicsWorld()->addConstraint(constraint); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeConstraint - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeConstraint - (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btTypedConstraint* constraint = reinterpret_cast(objectId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - if (constraint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The constraint object does not exist."); - return; - } - space->getDynamicsWorld()->removeConstraint(constraint); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: setGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_setGravity - (JNIEnv * env, jobject object, jlong spaceId, jobject vector) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - btVector3 gravity = btVector3(); - jmeBulletUtil::convert(env, vector, &gravity); - space->getDynamicsWorld()->setGravity(gravity); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: initNativePhysics - * Signature: ()V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_initNativePhysics - (JNIEnv * env, jclass clazz) { - jmeClasses::initJavaClasses(env); - } - - /* - * Class: com_jme3_bullet_PhysicsSpace - * Method: finalizeNative - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_finalizeNative - (JNIEnv * env, jobject object, jlong spaceId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - if (space == NULL) { - return; - } - delete(space); - } - - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_rayTest_1native - (JNIEnv * env, jobject object, jobject to, jobject from, jlong spaceId, jobject resultlist) { - - jmePhysicsSpace* space = reinterpret_cast (spaceId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The physics space does not exist."); - return; - } - - struct AllRayResultCallback : public btCollisionWorld::RayResultCallback { - - AllRayResultCallback(const btVector3& rayFromWorld, const btVector3 & rayToWorld) : m_rayFromWorld(rayFromWorld), m_rayToWorld(rayToWorld) { - } - jobject resultlist; - JNIEnv* env; - btVector3 m_rayFromWorld; //used to calculate hitPointWorld from hitFraction - btVector3 m_rayToWorld; - - btVector3 m_hitNormalWorld; - btVector3 m_hitPointWorld; - - virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace) { - if (normalInWorldSpace) { - m_hitNormalWorld = rayResult.m_hitNormalLocal; - } else { - m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis() * rayResult.m_hitNormalLocal; - } - m_hitPointWorld.setInterpolate3(m_rayFromWorld, m_rayToWorld, rayResult.m_hitFraction); - - jmeBulletUtil::addResult(env, resultlist, m_hitNormalWorld, m_hitPointWorld, rayResult.m_hitFraction, rayResult.m_collisionObject); - - return 1.f; - } - }; - - btVector3 native_to = btVector3(); - jmeBulletUtil::convert(env, to, &native_to); - - btVector3 native_from = btVector3(); - jmeBulletUtil::convert(env, from, &native_from); - - AllRayResultCallback resultCallback(native_from, native_to); - resultCallback.env = env; - resultCallback.resultlist = resultlist; - space->getDynamicsWorld()->rayTest(native_from, native_to, resultCallback); - return; - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_PhysicsSpace.h b/engine/src/bullet/native/com_jme3_bullet_PhysicsSpace.h deleted file mode 100644 index 3b14a7512..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_PhysicsSpace.h +++ /dev/null @@ -1,165 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_PhysicsSpace */ - -#ifndef _Included_com_jme3_bullet_PhysicsSpace -#define _Included_com_jme3_bullet_PhysicsSpace -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_PhysicsSpace_AXIS_X -#define com_jme3_bullet_PhysicsSpace_AXIS_X 0L -#undef com_jme3_bullet_PhysicsSpace_AXIS_Y -#define com_jme3_bullet_PhysicsSpace_AXIS_Y 1L -#undef com_jme3_bullet_PhysicsSpace_AXIS_Z -#define com_jme3_bullet_PhysicsSpace_AXIS_Z 2L -/* Inaccessible static: pQueueTL */ -/* Inaccessible static: physicsSpaceTL */ -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: createPhysicsSpace - * Signature: (FFFFFFIZ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_PhysicsSpace_createPhysicsSpace - (JNIEnv *, jobject, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jint, jboolean); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: stepSimulation - * Signature: (JFIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_stepSimulation - (JNIEnv *, jobject, jlong, jfloat, jint, jfloat); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addCollisionObject - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addCollisionObject - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeCollisionObject - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeCollisionObject - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addRigidBody - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addRigidBody - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeRigidBody - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeRigidBody - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addCharacterObject - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addCharacterObject - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeCharacterObject - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeCharacterObject - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addAction - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addAction - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeAction - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeAction - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addVehicle - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addVehicle - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeVehicle - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeVehicle - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addConstraint - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addConstraint - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeConstraint - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeConstraint - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: setGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_setGravity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: rayTest_native - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;JLjava/util/List;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_rayTest_1native - (JNIEnv *, jobject, jobject, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: initNativePhysics - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_initNativePhysics - (JNIEnv *, jclass); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionEvent.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionEvent.cpp deleted file mode 100644 index e9199d496..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionEvent.cpp +++ /dev/null @@ -1,308 +0,0 @@ -#include "jmeBulletUtil.h" -#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h" -#include "com_jme3_bullet_collision_PhysicsCollisionEvent.h" - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulse - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulse - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_appliedImpulse; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulseLateral1 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulseLateral1 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_appliedImpulseLateral1; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulseLateral2 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulseLateral2 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_appliedImpulseLateral2; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getCombinedFriction - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getCombinedFriction - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_combinedFriction; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getCombinedRestitution - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getCombinedRestitution - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_combinedRestitution; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getDistance1 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getDistance1 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_distance1; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getIndex0 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getIndex0 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_index0; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getIndex1 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getIndex1 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_index1; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLateralFrictionDir1 - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLateralFrictionDir1 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId, jobject lateralFrictionDir1) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return; - } - jmeBulletUtil::convert(env, &mp -> m_lateralFrictionDir1, lateralFrictionDir1); -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLateralFrictionDir2 - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLateralFrictionDir2 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId, jobject lateralFrictionDir2) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return; - } - jmeBulletUtil::convert(env, &mp -> m_lateralFrictionDir2, lateralFrictionDir2); -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: isLateralFrictionInitialized - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_isLateralFrictionInitialized - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_lateralFrictionInitialized; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLifeTime - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLifeTime - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_lifeTime; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLocalPointA - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLocalPointA - (JNIEnv * env, jobject object, jlong manifoldPointObjectId, jobject localPointA) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return; - } - jmeBulletUtil::convert(env, &mp -> m_localPointA, localPointA); -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLocalPointB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLocalPointB - (JNIEnv * env, jobject object, jlong manifoldPointObjectId, jobject localPointB) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return; - } - jmeBulletUtil::convert(env, &mp -> m_localPointB, localPointB); -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getNormalWorldOnB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getNormalWorldOnB - (JNIEnv * env, jobject object, jlong manifoldPointObjectId, jobject normalWorldOnB) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return; - } - jmeBulletUtil::convert(env, &mp -> m_normalWorldOnB, normalWorldOnB); -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPartId0 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPartId0 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_partId0; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPartId1 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPartId1 - (JNIEnv * env, jobject object, jlong manifoldPointObjectId) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return 0; - } - return mp -> m_partId1; -} - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPositionWorldOnA - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPositionWorldOnA - (JNIEnv * env, jobject object, jlong manifoldPointObjectId, jobject positionWorldOnA) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return; - } - jmeBulletUtil::convert(env, &mp -> m_positionWorldOnA, positionWorldOnA); -} - - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPositionWorldOnB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPositionWorldOnB - (JNIEnv * env, jobject object, jlong manifoldPointObjectId, jobject positionWorldOnB) { - btManifoldPoint* mp = reinterpret_cast(manifoldPointObjectId); - if (mp == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The manifoldPoint does not exist."); - return; - } - jmeBulletUtil::convert(env, &mp -> m_positionWorldOnB, positionWorldOnB); -} diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionEvent.h b/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionEvent.h deleted file mode 100644 index 2dd9dcf3b..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionEvent.h +++ /dev/null @@ -1,173 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_PhysicsCollisionEvent */ - -#ifndef _Included_com_jme3_bullet_collision_PhysicsCollisionEvent -#define _Included_com_jme3_bullet_collision_PhysicsCollisionEvent -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_collision_PhysicsCollisionEvent_serialVersionUID -#define com_jme3_bullet_collision_PhysicsCollisionEvent_serialVersionUID 5516075349620653480LL -#undef com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_ADDED -#define com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_ADDED 0L -#undef com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_PROCESSED -#define com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_PROCESSED 1L -#undef com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_DESTROYED -#define com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_DESTROYED 2L -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulse - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulse - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulseLateral1 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulseLateral1 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulseLateral2 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulseLateral2 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getCombinedFriction - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getCombinedFriction - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getCombinedRestitution - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getCombinedRestitution - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getDistance1 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getDistance1 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getIndex0 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getIndex0 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getIndex1 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getIndex1 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLateralFrictionDir1 - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLateralFrictionDir1 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLateralFrictionDir2 - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLateralFrictionDir2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: isLateralFrictionInitialized - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_isLateralFrictionInitialized - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLifeTime - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLifeTime - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLocalPointA - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLocalPointA - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLocalPointB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLocalPointB - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getNormalWorldOnB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getNormalWorldOnB - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPartId0 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPartId0 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPartId1 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPartId1 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPositionWorldOnA - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPositionWorldOnA - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPositionWorldOnB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPositionWorldOnB - (JNIEnv *, jobject, jlong, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionObject.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionObject.cpp deleted file mode 100644 index 5dc75b355..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionObject.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_PhysicsCollisionObject.h" -#include "jmeBulletUtil.h" -#include "jmePhysicsSpace.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: attachCollisionShape - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_attachCollisionShape - (JNIEnv * env, jobject object, jlong objectId, jlong shapeId) { - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/IllegalStateException"); - env->ThrowNew(newExc, "The collision object does not exist."); - return; - } - btCollisionShape* collisionShape = reinterpret_cast(shapeId); - if (collisionShape == NULL) { - jclass newExc = env->FindClass("java/lang/IllegalStateException"); - env->ThrowNew(newExc, "The collision shape does not exist."); - return; - } - collisionObject->setCollisionShape(collisionShape); - } - - /* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: finalizeNative - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_finalizeNative - (JNIEnv * env, jobject object, jlong objectId) { - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - if (collisionObject -> getUserPointer() != NULL){ - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - delete(userPointer); - } - delete(collisionObject); - } - /* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: initUserPointer - * Signature: (JII)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_initUserPointer - (JNIEnv *env, jobject object, jlong objectId, jint group, jint groups) { - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - if (userPointer != NULL) { -// delete(userPointer); - } - userPointer = new jmeUserPointer(); - userPointer -> javaCollisionObject = env->NewWeakGlobalRef(object); - userPointer -> group = group; - userPointer -> groups = groups; - userPointer -> space = NULL; - collisionObject -> setUserPointer(userPointer); - } - /* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: setCollisionGroup - * Signature: (JI)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_setCollisionGroup - (JNIEnv *env, jobject object, jlong objectId, jint group) { - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - if (userPointer != NULL){ - userPointer -> group = group; - } - } - /* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: setCollideWithGroups - * Signature: (JI)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_setCollideWithGroups - (JNIEnv *env, jobject object, jlong objectId, jint groups) { - btCollisionObject* collisionObject = reinterpret_cast(objectId); - if (collisionObject == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); - if (userPointer != NULL){ - userPointer -> groups = groups; - } - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionObject.h b/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionObject.h deleted file mode 100644 index db5bf7aaf..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_PhysicsCollisionObject.h +++ /dev/null @@ -1,87 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_PhysicsCollisionObject */ - -#ifndef _Included_com_jme3_bullet_collision_PhysicsCollisionObject -#define _Included_com_jme3_bullet_collision_PhysicsCollisionObject -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_NONE -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_01 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_02 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_03 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_04 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_05 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_06 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_07 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_08 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_09 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_10 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_11 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_12 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_13 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_14 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_15 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_16 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: initUserPointer - * Signature: (JII)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_initUserPointer - (JNIEnv *, jobject, jlong, jint, jint); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: attachCollisionShape - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_attachCollisionShape - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: setCollisionGroup - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_setCollisionGroup - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: setCollideWithGroups - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_setCollideWithGroups - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_BoxCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_BoxCollisionShape.cpp deleted file mode 100644 index 3d2f0e3dc..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_BoxCollisionShape.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_BoxCollisionShape.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_BoxCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_BoxCollisionShape_createShape - (JNIEnv *env, jobject object, jobject halfExtents) { - jmeClasses::initJavaClasses(env); - btVector3 extents = btVector3(); - jmeBulletUtil::convert(env, halfExtents, &extents); - btBoxShape* shape = new btBoxShape(extents); - return reinterpret_cast(shape); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_BoxCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_BoxCollisionShape.h deleted file mode 100644 index 5602a0dd3..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_BoxCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_BoxCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_BoxCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_BoxCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_BoxCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_BoxCollisionShape_createShape - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.cpp deleted file mode 100644 index b3d4a8ed5..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_CapsuleCollisionShape.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_CapsuleCollisionShape - * Method: createShape - * Signature: (IFF)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CapsuleCollisionShape_createShape - (JNIEnv * env, jobject object, jint axis, jfloat radius, jfloat height) { - jmeClasses::initJavaClasses(env); - btCollisionShape* shape; - switch(axis){ - case 0: - shape = new btCapsuleShapeX(radius, height); - break; - case 1: - shape = new btCapsuleShape(radius, height); - break; - case 2: - shape = new btCapsuleShapeZ(radius, height); - break; - } - return reinterpret_cast(shape); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.h deleted file mode 100644 index 4d706748d..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_CapsuleCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_CapsuleCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_CapsuleCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_CapsuleCollisionShape - * Method: createShape - * Signature: (IFF)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CapsuleCollisionShape_createShape - (JNIEnv *, jobject, jint, jfloat, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CollisionShape.cpp deleted file mode 100644 index efd7990e0..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CollisionShape.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_CollisionShape.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: getMargin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_getMargin - (JNIEnv * env, jobject object, jlong shapeId) { - btCollisionShape* shape = reinterpret_cast(shapeId); - if (shape == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return shape->getMargin(); - } - - /* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: setLocalScaling - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_setLocalScaling - (JNIEnv * env, jobject object, jlong shapeId, jobject scale) { - btCollisionShape* shape = reinterpret_cast(shapeId); - if (shape == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 scl = btVector3(); - jmeBulletUtil::convert(env, scale, &scl); - shape->setLocalScaling(scl); - } - - /* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: setMargin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_setMargin - (JNIEnv * env, jobject object, jlong shapeId, jfloat newMargin) { - btCollisionShape* shape = reinterpret_cast(shapeId); - if (shape == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - shape->setMargin(newMargin); - } - - /* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: finalizeNative - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_finalizeNative - (JNIEnv * env, jobject object, jlong shapeId) { - btCollisionShape* shape = reinterpret_cast(shapeId); - if (shape == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - delete(shape); - } -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CollisionShape.h deleted file mode 100644 index cd5d70f21..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CollisionShape.h +++ /dev/null @@ -1,45 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_CollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_CollisionShape -#define _Included_com_jme3_bullet_collision_shapes_CollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: getMargin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_getMargin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: setLocalScaling - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_setLocalScaling - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: setMargin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_setMargin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CompoundCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CompoundCollisionShape.cpp deleted file mode 100644 index 52821757b..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CompoundCollisionShape.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_CompoundCollisionShape.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: createShape - * Signature: ()J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_createShape - (JNIEnv *env, jobject object) { - jmeClasses::initJavaClasses(env); - btCompoundShape* shape = new btCompoundShape(); - return reinterpret_cast(shape); - } - - /* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: addChildShape - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_addChildShape - (JNIEnv *env, jobject object, jlong compoundId, jlong childId, jobject childLocation, jobject childRotation) { - btCompoundShape* shape = reinterpret_cast(compoundId); - if (shape == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - btCollisionShape* child = reinterpret_cast(childId); - if (shape == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - btMatrix3x3 mtx = btMatrix3x3(); - btTransform trans = btTransform(mtx); - jmeBulletUtil::convert(env, childLocation, &trans.getOrigin()); - jmeBulletUtil::convert(env, childRotation, &trans.getBasis()); - shape->addChildShape(trans, child); - return 0; - } - - /* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: removeChildShape - * Signature: (JJ)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_removeChildShape - (JNIEnv * env, jobject object, jlong compoundId, jlong childId) { - btCompoundShape* shape = reinterpret_cast(compoundId); - if (shape == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - btCollisionShape* child = reinterpret_cast(childId); - if (shape == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - shape->removeChildShape(child); - return 0; - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CompoundCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CompoundCollisionShape.h deleted file mode 100644 index 18783ce1d..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CompoundCollisionShape.h +++ /dev/null @@ -1,37 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_CompoundCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_CompoundCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_CompoundCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: createShape - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_createShape - (JNIEnv *, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: addChildShape - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_addChildShape - (JNIEnv *, jobject, jlong, jlong, jobject, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: removeChildShape - * Signature: (JJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_removeChildShape - (JNIEnv *, jobject, jlong, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_ConeCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_ConeCollisionShape.cpp deleted file mode 100644 index 06de8ddaf..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_ConeCollisionShape.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_ConeCollisionShape.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_ConeCollisionShape - * Method: createShape - * Signature: (IFF)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_ConeCollisionShape_createShape - (JNIEnv * env, jobject object, jint axis, jfloat radius, jfloat height) { - jmeClasses::initJavaClasses(env); - btCollisionShape* shape; - switch (axis) { - case 0: - shape = new btConeShapeX(radius, height); - break; - case 1: - shape = new btConeShape(radius, height); - break; - case 2: - shape = new btConeShapeZ(radius, height); - break; - } - return reinterpret_cast(shape); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_ConeCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_ConeCollisionShape.h deleted file mode 100644 index 711276ebb..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_ConeCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_ConeCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_ConeCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_ConeCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_ConeCollisionShape - * Method: createShape - * Signature: (IFF)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_ConeCollisionShape_createShape - (JNIEnv *, jobject, jint, jfloat, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CylinderCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CylinderCollisionShape.cpp deleted file mode 100644 index fd82f13a3..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CylinderCollisionShape.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_CylinderCollisionShape.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_CylinderCollisionShape - * Method: createShape - * Signature: (ILcom/jme3/math/Vector3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CylinderCollisionShape_createShape - (JNIEnv * env, jobject object, jint axis, jobject halfExtents) { - jmeClasses::initJavaClasses(env); - btVector3 extents = btVector3(); - jmeBulletUtil::convert(env, halfExtents, &extents); - btCollisionShape* shape; - switch (axis) { - case 0: - shape = new btCylinderShapeX(extents); - break; - case 1: - shape = new btCylinderShape(extents); - break; - case 2: - shape = new btCylinderShapeZ(extents); - break; - } - return reinterpret_cast(shape); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CylinderCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CylinderCollisionShape.h deleted file mode 100644 index 48a665ac7..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_CylinderCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_CylinderCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_CylinderCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_CylinderCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_CylinderCollisionShape - * Method: createShape - * Signature: (ILcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CylinderCollisionShape_createShape - (JNIEnv *, jobject, jint, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_GImpactCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_GImpactCollisionShape.cpp deleted file mode 100644 index 43ceb3d56..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_GImpactCollisionShape.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_GImpactCollisionShape.h" -#include "jmeBulletUtil.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_GImpactCollisionShape - * Method: createShape - * Signature: (J)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_GImpactCollisionShape_createShape - (JNIEnv * env, jobject object, jlong meshId) { - jmeClasses::initJavaClasses(env); - btTriangleIndexVertexArray* array = reinterpret_cast(meshId); - btGImpactMeshShape* shape = new btGImpactMeshShape(array); - return reinterpret_cast(shape); - } - - /* - * Class: com_jme3_bullet_collision_shapes_GImpactCollisionShape - * Method: finalizeNative - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_GImpactCollisionShape_finalizeNative - (JNIEnv * env, jobject object, jlong meshId) { - btTriangleIndexVertexArray* array = reinterpret_cast (meshId); - delete(array); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_GImpactCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_GImpactCollisionShape.h deleted file mode 100644 index f08d3ebf8..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_GImpactCollisionShape.h +++ /dev/null @@ -1,29 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_GImpactCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_GImpactCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_GImpactCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_GImpactCollisionShape - * Method: createShape - * Signature: (J)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_GImpactCollisionShape_createShape - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_shapes_GImpactCollisionShape - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_GImpactCollisionShape_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.cpp deleted file mode 100644 index 06698a1f0..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.h" -#include "jmeBulletUtil.h" -#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_HeightfieldCollisionShape - * Method: createShape - * Signature: (II[FFFFIZ)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_HeightfieldCollisionShape_createShape - (JNIEnv * env, jobject object, jint heightStickWidth, jint heightStickLength, jobject heightfieldData, jfloat heightScale, jfloat minHeight, jfloat maxHeight, jint upAxis, jboolean flipQuadEdges) { - jmeClasses::initJavaClasses(env); - void* data = env->GetDirectBufferAddress(heightfieldData); - btHeightfieldTerrainShape* shape=new btHeightfieldTerrainShape(heightStickWidth, heightStickLength, data, heightScale, minHeight, maxHeight, upAxis, PHY_FLOAT, flipQuadEdges); - return reinterpret_cast(shape); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.h deleted file mode 100644 index a3d1621b8..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_HeightfieldCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_HeightfieldCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_HeightfieldCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_HeightfieldCollisionShape - * Method: createShape - * Signature: (IILjava/nio/ByteBuffer;FFFIZ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_HeightfieldCollisionShape_createShape - (JNIEnv *, jobject, jint, jint, jobject, jfloat, jfloat, jfloat, jint, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HullCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HullCollisionShape.cpp deleted file mode 100644 index 5789bd9ab..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HullCollisionShape.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_HullCollisionShape.h" -#include "jmeBulletUtil.h" -#include "BulletCollision/CollisionShapes/btConvexHullShape.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_HullCollisionShape - * Method: createShape - * Signature: ([F)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_HullCollisionShape_createShape - (JNIEnv *env, jobject object, jobject array) { - jmeClasses::initJavaClasses(env); - float* data = (float*) env->GetDirectBufferAddress(array); - //TODO: capacity will not always be length! - int length = env->GetDirectBufferCapacity(array)/4; - btConvexHullShape* shape = new btConvexHullShape(); - for (int i = 0; i < length; i+=3) { - btVector3 vect = btVector3(data[i], - data[i + 1], - data[i + 2]); - - shape->addPoint(vect); - } - - return reinterpret_cast(shape); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HullCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HullCollisionShape.h deleted file mode 100644 index 42a267216..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_HullCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_HullCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_HullCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_HullCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_HullCollisionShape - * Method: createShape - * Signature: (Ljava/nio/ByteBuffer;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_HullCollisionShape_createShape - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_MeshCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_MeshCollisionShape.cpp deleted file mode 100644 index 346d47ef9..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_MeshCollisionShape.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_MeshCollisionShape.h" -#include "jmeBulletUtil.h" -#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_MeshCollisionShape - * Method: createShape - * Signature: (J)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_MeshCollisionShape_createShape - (JNIEnv * env, jobject object, jlong arrayId) { - jmeClasses::initJavaClasses(env); - btTriangleIndexVertexArray* array = reinterpret_cast(arrayId); - btBvhTriangleMeshShape* shape = new btBvhTriangleMeshShape(array, true, true); - return reinterpret_cast(shape); - } - - /* - * Class: com_jme3_bullet_collision_shapes_MeshCollisionShape - * Method: finalizeNative - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_MeshCollisionShape_finalizeNative - (JNIEnv * env, jobject object, jlong arrayId){ - btTriangleIndexVertexArray* array = reinterpret_cast(arrayId); - delete(array); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_MeshCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_MeshCollisionShape.h deleted file mode 100644 index 4dd6aa28a..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_MeshCollisionShape.h +++ /dev/null @@ -1,29 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_MeshCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_MeshCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_MeshCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_MeshCollisionShape - * Method: createShape - * Signature: (J)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_MeshCollisionShape_createShape - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_shapes_MeshCollisionShape - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_MeshCollisionShape_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_PlaneCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_PlaneCollisionShape.cpp deleted file mode 100644 index b8c9adc2d..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_PlaneCollisionShape.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_PlaneCollisionShape.h" -#include "jmeBulletUtil.h" -#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_PlaneCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;F)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_PlaneCollisionShape_createShape - (JNIEnv * env, jobject object, jobject normal, jfloat constant) { - jmeClasses::initJavaClasses(env); - btVector3 norm = btVector3(); - jmeBulletUtil::convert(env, normal, &norm); - btStaticPlaneShape* shape = new btStaticPlaneShape(norm, constant); - return reinterpret_cast(shape); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_PlaneCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_PlaneCollisionShape.h deleted file mode 100644 index 7e7a22bdf..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_PlaneCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_PlaneCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_PlaneCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_PlaneCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_PlaneCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;F)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_PlaneCollisionShape_createShape - (JNIEnv *, jobject, jobject, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SimplexCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SimplexCollisionShape.cpp deleted file mode 100644 index 733794538..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SimplexCollisionShape.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_SimplexCollisionShape.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2 - (JNIEnv *env, jobject object, jobject vector1) { - jmeClasses::initJavaClasses(env); - btVector3 vec1 = btVector3(); - jmeBulletUtil::convert(env, vector1, &vec1); - btBU_Simplex1to4* simplexShape = new btBU_Simplex1to4(vec1); - return reinterpret_cast(simplexShape); - } - - /* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv *env, jobject object, jobject vector1, jobject vector2) { - jmeClasses::initJavaClasses(env); - btVector3 vec1 = btVector3(); - jmeBulletUtil::convert(env, vector1, &vec1); - btVector3 vec2 = btVector3(); - jmeBulletUtil::convert(env, vector2, &vec2); - btBU_Simplex1to4* simplexShape = new btBU_Simplex1to4(vec1, vec2); - return reinterpret_cast(simplexShape); - } - /* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv * env, jobject object, jobject vector1, jobject vector2, jobject vector3) { - jmeClasses::initJavaClasses(env); - btVector3 vec1 = btVector3(); - jmeBulletUtil::convert(env, vector1, &vec1); - btVector3 vec2 = btVector3(); - jmeBulletUtil::convert(env, vector2, &vec2); - btVector3 vec3 = btVector3(); - jmeBulletUtil::convert(env, vector3, &vec3); - btBU_Simplex1to4* simplexShape = new btBU_Simplex1to4(vec1, vec2, vec3); - return reinterpret_cast(simplexShape); - } - /* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv * env, jobject object, jobject vector1, jobject vector2, jobject vector3, jobject vector4) { - jmeClasses::initJavaClasses(env); - btVector3 vec1 = btVector3(); - jmeBulletUtil::convert(env, vector1, &vec1); - btVector3 vec2 = btVector3(); - jmeBulletUtil::convert(env, vector2, &vec2); - btVector3 vec3 = btVector3(); - jmeBulletUtil::convert(env, vector3, &vec3); - btVector3 vec4 = btVector3(); - jmeBulletUtil::convert(env, vector4, &vec4); - btBU_Simplex1to4* simplexShape = new btBU_Simplex1to4(vec1, vec2, vec3, vec4); - return reinterpret_cast(simplexShape); - } -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SimplexCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SimplexCollisionShape.h deleted file mode 100644 index e50d06226..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SimplexCollisionShape.h +++ /dev/null @@ -1,45 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_SimplexCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_SimplexCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_SimplexCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2 - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv *, jobject, jobject, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv *, jobject, jobject, jobject, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv *, jobject, jobject, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SphereCollisionShape.cpp b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SphereCollisionShape.cpp deleted file mode 100644 index 8f4b9840f..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SphereCollisionShape.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_collision_shapes_SphereCollisionShape.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_collision_shapes_SphereCollisionShape - * Method: createShape - * Signature: (F)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SphereCollisionShape_createShape - (JNIEnv *env, jobject object, jfloat radius) { - jmeClasses::initJavaClasses(env); - btSphereShape* shape=new btSphereShape(radius); - return reinterpret_cast(shape); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SphereCollisionShape.h b/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SphereCollisionShape.h deleted file mode 100644 index ef1b2cbed..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_collision_shapes_SphereCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_SphereCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_SphereCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_SphereCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_SphereCollisionShape - * Method: createShape - * Signature: (F)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SphereCollisionShape_createShape - (JNIEnv *, jobject, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_ConeJoint.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_ConeJoint.cpp deleted file mode 100644 index cade120fa..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_ConeJoint.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_ConeJoint.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: setLimit - * Signature: (JFFF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_ConeJoint_setLimit - (JNIEnv * env, jobject object, jlong jointId, jfloat swingSpan1, jfloat swingSpan2, jfloat twistSpan) { - btConeTwistConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - //TODO: extended setLimit! - joint->setLimit(swingSpan1, swingSpan2, twistSpan); - } - - /* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: setAngularOnly - * Signature: (JZ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_ConeJoint_setAngularOnly - (JNIEnv * env, jobject object, jlong jointId, jboolean angularOnly) { - btConeTwistConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setAngularOnly(angularOnly); - } - - /* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_ConeJoint_createJoint - (JNIEnv * env, jobject object, jlong bodyIdA, jlong bodyIdB, jobject pivotA, jobject rotA, jobject pivotB, jobject rotB) { - jmeClasses::initJavaClasses(env); - btRigidBody* bodyA = reinterpret_cast(bodyIdA); - btRigidBody* bodyB = reinterpret_cast(bodyIdB); - btMatrix3x3 mtx1 = btMatrix3x3(); - btMatrix3x3 mtx2 = btMatrix3x3(); - btTransform transA = btTransform(mtx1); - jmeBulletUtil::convert(env, pivotA, &transA.getOrigin()); - jmeBulletUtil::convert(env, rotA, &transA.getBasis()); - btTransform transB = btTransform(mtx2); - jmeBulletUtil::convert(env, pivotB, &transB.getOrigin()); - jmeBulletUtil::convert(env, rotB, &transB.getBasis()); - btConeTwistConstraint* joint = new btConeTwistConstraint(*bodyA, *bodyB, transA, transB); - return reinterpret_cast(joint); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_ConeJoint.h b/engine/src/bullet/native/com_jme3_bullet_joints_ConeJoint.h deleted file mode 100644 index 327b47f25..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_ConeJoint.h +++ /dev/null @@ -1,37 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_ConeJoint */ - -#ifndef _Included_com_jme3_bullet_joints_ConeJoint -#define _Included_com_jme3_bullet_joints_ConeJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: setLimit - * Signature: (JFFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_ConeJoint_setLimit - (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: setAngularOnly - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_ConeJoint_setAngularOnly - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_ConeJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_HingeJoint.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_HingeJoint.cpp deleted file mode 100644 index 56a6fecde..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_HingeJoint.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_HingeJoint.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: enableMotor - * Signature: (JZFF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_enableMotor - (JNIEnv * env, jobject object, jlong jointId, jboolean enable, jfloat targetVelocity, jfloat maxMotorImpulse) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->enableAngularMotor(enable, targetVelocity, maxMotorImpulse); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getEnableAngularMotor - * Signature: (J)Z - */ - JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_HingeJoint_getEnableAngularMotor - (JNIEnv * env, jobject object, jlong jointId) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return false; - } - return joint->getEnableAngularMotor(); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getMotorTargetVelocity - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getMotorTargetVelocity - (JNIEnv * env, jobject object, jlong jointId) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getMotorTargetVelosity(); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getMaxMotorImpulse - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getMaxMotorImpulse - (JNIEnv * env, jobject object, jlong jointId) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getMaxMotorImpulse(); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setLimit - * Signature: (JFF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setLimit__JFF - (JNIEnv * env, jobject object, jlong jointId, jfloat low, jfloat high) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - return joint->setLimit(low, high); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setLimit - * Signature: (JFFFFF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setLimit__JFFFFF - (JNIEnv * env, jobject object, jlong jointId, jfloat low, jfloat high, jfloat softness, jfloat biasFactor, jfloat relaxationFactor) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - return joint->setLimit(low, high, softness, biasFactor, relaxationFactor); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getUpperLimit - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getUpperLimit - (JNIEnv * env, jobject object, jlong jointId) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getUpperLimit(); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getLowerLimit - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getLowerLimit - (JNIEnv * env, jobject object, jlong jointId) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getLowerLimit(); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setAngularOnly - * Signature: (JZ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setAngularOnly - (JNIEnv * env, jobject object, jlong jointId, jboolean angular) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setAngularOnly(angular); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getHingeAngle - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getHingeAngle - (JNIEnv * env, jobject object, jlong jointId) { - btHingeConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getHingeAngle(); - } - - /* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_HingeJoint_createJoint - (JNIEnv * env, jobject object, jlong bodyIdA, jlong bodyIdB, jobject pivotA, jobject axisA, jobject pivotB, jobject axisB) { - jmeClasses::initJavaClasses(env); - btRigidBody* bodyA = reinterpret_cast(bodyIdA); - btRigidBody* bodyB = reinterpret_cast(bodyIdB); - btVector3 vec1 = btVector3(); - btVector3 vec2 = btVector3(); - btVector3 vec3 = btVector3(); - btVector3 vec4 = btVector3(); - jmeBulletUtil::convert(env, pivotA, &vec1); - jmeBulletUtil::convert(env, pivotB, &vec2); - jmeBulletUtil::convert(env, axisA, &vec3); - jmeBulletUtil::convert(env, axisB, &vec4); - btHingeConstraint* joint = new btHingeConstraint(*bodyA, *bodyB, vec1, vec2, vec3, vec4); - return reinterpret_cast(joint); - } -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_HingeJoint.h b/engine/src/bullet/native/com_jme3_bullet_joints_HingeJoint.h deleted file mode 100644 index ab6e0034f..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_HingeJoint.h +++ /dev/null @@ -1,101 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_HingeJoint */ - -#ifndef _Included_com_jme3_bullet_joints_HingeJoint -#define _Included_com_jme3_bullet_joints_HingeJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: enableMotor - * Signature: (JZFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_enableMotor - (JNIEnv *, jobject, jlong, jboolean, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getEnableAngularMotor - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_HingeJoint_getEnableAngularMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getMotorTargetVelocity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getMotorTargetVelocity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getMaxMotorImpulse - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getMaxMotorImpulse - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setLimit - * Signature: (JFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setLimit__JFF - (JNIEnv *, jobject, jlong, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setLimit - * Signature: (JFFFFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setLimit__JFFFFF - (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getUpperLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getUpperLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getLowerLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getLowerLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setAngularOnly - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setAngularOnly - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getHingeAngle - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getHingeAngle - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_HingeJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_PhysicsJoint.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_PhysicsJoint.cpp deleted file mode 100644 index c5ae9c1b1..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_PhysicsJoint.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_PhysicsJoint.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_joints_PhysicsJoint - * Method: getAppliedImpulse - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_PhysicsJoint_getAppliedImpulse - (JNIEnv * env, jobject object, jlong jointId) { - btTypedConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getAppliedImpulse(); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_PhysicsJoint.h b/engine/src/bullet/native/com_jme3_bullet_joints_PhysicsJoint.h deleted file mode 100644 index 63e21a7d3..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_PhysicsJoint.h +++ /dev/null @@ -1,29 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_PhysicsJoint */ - -#ifndef _Included_com_jme3_bullet_joints_PhysicsJoint -#define _Included_com_jme3_bullet_joints_PhysicsJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_PhysicsJoint - * Method: getAppliedImpulse - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_PhysicsJoint_getAppliedImpulse - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_PhysicsJoint - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_PhysicsJoint_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_Point2PointJoint.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_Point2PointJoint.cpp deleted file mode 100644 index e019b9b23..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_Point2PointJoint.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_Point2PointJoint.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setDamping - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setDamping - (JNIEnv * env, jobject object, jlong jointId, jfloat damping) { - btPoint2PointConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->m_setting.m_damping = damping; - } - - /* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setImpulseClamp - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setImpulseClamp - (JNIEnv * env, jobject object, jlong jointId, jfloat clamp) { - btPoint2PointConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->m_setting.m_impulseClamp = clamp; - } - - /* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setTau - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setTau - (JNIEnv * env, jobject object, jlong jointId, jfloat tau) { - btPoint2PointConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->m_setting.m_tau = tau; - } - - /* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getDamping - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getDamping - (JNIEnv * env, jobject object, jlong jointId) { - btPoint2PointConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->m_setting.m_damping; - } - - /* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getImpulseClamp - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getImpulseClamp - (JNIEnv * env, jobject object, jlong jointId) { - btPoint2PointConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->m_setting.m_damping; - } - - /* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getTau - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getTau - (JNIEnv * env, jobject object, jlong jointId) { - btPoint2PointConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->m_setting.m_damping; - } - - /* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_createJoint - (JNIEnv * env, jobject object, jlong bodyIdA, jlong bodyIdB, jobject pivotA, jobject pivotB) { - jmeClasses::initJavaClasses(env); - btRigidBody* bodyA = reinterpret_cast(bodyIdA); - btRigidBody* bodyB = reinterpret_cast(bodyIdB); - //TODO: matrix not needed? - btMatrix3x3 mtx1 = btMatrix3x3(); - btMatrix3x3 mtx2 = btMatrix3x3(); - btTransform transA = btTransform(mtx1); - jmeBulletUtil::convert(env, pivotA, &transA.getOrigin()); - btTransform transB = btTransform(mtx2); - jmeBulletUtil::convert(env, pivotB, &transB.getOrigin()); - btHingeConstraint* joint = new btHingeConstraint(*bodyA, *bodyB, transA, transB); - return reinterpret_cast(joint); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_Point2PointJoint.h b/engine/src/bullet/native/com_jme3_bullet_joints_Point2PointJoint.h deleted file mode 100644 index 5cb8188a8..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_Point2PointJoint.h +++ /dev/null @@ -1,69 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_Point2PointJoint */ - -#ifndef _Included_com_jme3_bullet_joints_Point2PointJoint -#define _Included_com_jme3_bullet_joints_Point2PointJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setDamping - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setImpulseClamp - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setImpulseClamp - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setTau - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setTau - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getImpulseClamp - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getImpulseClamp - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getTau - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getTau - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_SixDofJoint.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_SixDofJoint.cpp deleted file mode 100644 index 9611a1456..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_SixDofJoint.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_SixDofJoint.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: getRotationalLimitMotor - * Signature: (JI)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_getRotationalLimitMotor - (JNIEnv * env, jobject object, jlong jointId, jint index) { - btGeneric6DofConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return reinterpret_cast(joint->getRotationalLimitMotor(index)); - } - - /* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: getTranslationalLimitMotor - * Signature: (J)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_getTranslationalLimitMotor - (JNIEnv * env, jobject object, jlong jointId) { - btGeneric6DofConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return reinterpret_cast(joint->getTranslationalLimitMotor()); - } - - /* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setLinearUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setLinearUpperLimit - (JNIEnv * env, jobject object, jlong jointId, jobject vector) { - btGeneric6DofConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, vector, &vec); - joint->setLinearUpperLimit(vec); - } - - /* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setLinearLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setLinearLowerLimit - (JNIEnv * env, jobject object, jlong jointId, jobject vector) { - btGeneric6DofConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, vector, &vec); - joint->setLinearLowerLimit(vec); - } - - /* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setAngularUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setAngularUpperLimit - (JNIEnv * env, jobject object, jlong jointId, jobject vector) { - btGeneric6DofConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, vector, &vec); - joint->setAngularUpperLimit(vec); - } - - /* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setAngularLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setAngularLowerLimit - (JNIEnv * env, jobject object, jlong jointId, jobject vector) { - btGeneric6DofConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, vector, &vec); - joint->setAngularLowerLimit(vec); - } - - /* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_createJoint - (JNIEnv * env, jobject object, jlong bodyIdA, jlong bodyIdB, jobject pivotA, jobject rotA, jobject pivotB, jobject rotB, jboolean useLinearReferenceFrameA) { - jmeClasses::initJavaClasses(env); - btRigidBody* bodyA = reinterpret_cast(bodyIdA); - btRigidBody* bodyB = reinterpret_cast(bodyIdB); - btMatrix3x3 mtx1 = btMatrix3x3(); - btMatrix3x3 mtx2 = btMatrix3x3(); - btTransform transA = btTransform(mtx1); - jmeBulletUtil::convert(env, pivotA, &transA.getOrigin()); - jmeBulletUtil::convert(env, rotA, &transA.getBasis()); - btTransform transB = btTransform(mtx2); - jmeBulletUtil::convert(env, pivotB, &transB.getOrigin()); - jmeBulletUtil::convert(env, rotB, &transB.getBasis()); - btGeneric6DofConstraint* joint = new btGeneric6DofConstraint(*bodyA, *bodyB, transA, transB, useLinearReferenceFrameA); - return reinterpret_cast(joint); - } -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_SixDofJoint.h b/engine/src/bullet/native/com_jme3_bullet_joints_SixDofJoint.h deleted file mode 100644 index 86e610234..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_SixDofJoint.h +++ /dev/null @@ -1,69 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_SixDofJoint */ - -#ifndef _Included_com_jme3_bullet_joints_SixDofJoint -#define _Included_com_jme3_bullet_joints_SixDofJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: getRotationalLimitMotor - * Signature: (JI)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_getRotationalLimitMotor - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: getTranslationalLimitMotor - * Signature: (J)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_getTranslationalLimitMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setLinearUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setLinearUpperLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setLinearLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setLinearLowerLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setAngularUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setAngularUpperLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setAngularLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setAngularLowerLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_SixDofSpringJoint.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_SixDofSpringJoint.cpp deleted file mode 100644 index 97724c626..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_SixDofSpringJoint.cpp +++ /dev/null @@ -1,94 +0,0 @@ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_SixDofSpringJoint.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: enableString - * Signature: (JIZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_enableSpring - (JNIEnv *env, jobject object, jlong jointId, jint index, jboolean onOff) { - btGeneric6DofSpringConstraint* joint = reinterpret_cast(jointId); - joint -> enableSpring(index, onOff); -} - - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setStiffness - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setStiffness - (JNIEnv *env, jobject object, jlong jointId, jint index, jfloat stiffness) { - btGeneric6DofSpringConstraint* joint = reinterpret_cast(jointId); - joint -> setStiffness(index, stiffness); -} - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setDamping - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setDamping - (JNIEnv *env, jobject object, jlong jointId, jint index, jfloat damping) { - btGeneric6DofSpringConstraint* joint = reinterpret_cast(jointId); - joint -> setDamping(index, damping); -} - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setEquilibriumPoint - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setEquilibriumPoint__J - (JNIEnv *env, jobject object, jlong jointId) { - btGeneric6DofSpringConstraint* joint = reinterpret_cast(jointId); - joint -> setEquilibriumPoint(); -} - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setEquilibriumPoint - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setEquilibriumPoint__JI - (JNIEnv *env, jobject object, jlong jointId, jint index) { - btGeneric6DofSpringConstraint* joint = reinterpret_cast(jointId); - joint -> setEquilibriumPoint(index); -} - - - - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_createJoint - (JNIEnv * env, jobject object, jlong bodyIdA, jlong bodyIdB, jobject pivotA, jobject rotA, jobject pivotB, jobject rotB, jboolean useLinearReferenceFrameA) { - jmeClasses::initJavaClasses(env); - btRigidBody* bodyA = reinterpret_cast(bodyIdA); - btRigidBody* bodyB = reinterpret_cast(bodyIdB); - btTransform transA; - jmeBulletUtil::convert(env, pivotA, &transA.getOrigin()); - jmeBulletUtil::convert(env, rotA, &transA.getBasis()); - btTransform transB; - jmeBulletUtil::convert(env, pivotB, &transB.getOrigin()); - jmeBulletUtil::convert(env, rotB, &transB.getBasis()); - - btGeneric6DofSpringConstraint* joint = new btGeneric6DofSpringConstraint(*bodyA, *bodyB, transA, transB, useLinearReferenceFrameA); - return reinterpret_cast(joint); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_SixDofSpringJoint.h b/engine/src/bullet/native/com_jme3_bullet_joints_SixDofSpringJoint.h deleted file mode 100644 index b4fced0c9..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_SixDofSpringJoint.h +++ /dev/null @@ -1,61 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_SixDofSpringJoint */ - -#ifndef _Included_com_jme3_bullet_joints_SixDofSpringJoint -#define _Included_com_jme3_bullet_joints_SixDofSpringJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: enableSpring - * Signature: (JIZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_enableSpring - (JNIEnv *, jobject, jlong, jint, jboolean); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setStiffness - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setStiffness - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setDamping - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setDamping - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setEquilibriumPoint - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setEquilibriumPoint__J - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setEquilibriumPoint - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setEquilibriumPoint__JI - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_SliderJoint.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_SliderJoint.cpp deleted file mode 100644 index c6e704d56..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_SliderJoint.cpp +++ /dev/null @@ -1,963 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_SliderJoint.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getLowerLinLimit - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getLowerLinLimit - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getLowerLinLimit(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setLowerLinLimit - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setLowerLinLimit - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setLowerLinLimit(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getUpperLinLimit - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getUpperLinLimit - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getUpperLinLimit(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setUpperLinLimit - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setUpperLinLimit - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setUpperLinLimit(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getLowerAngLimit - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getLowerAngLimit - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getLowerAngLimit(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setLowerAngLimit - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setLowerAngLimit - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setLowerAngLimit(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getUpperAngLimit - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getUpperAngLimit - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getUpperAngLimit(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setUpperAngLimit - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setUpperAngLimit - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setUpperAngLimit(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessDirLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessDirLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getSoftnessDirLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessDirLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessDirLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setSoftnessDirLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionDirLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionDirLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getRestitutionDirLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionDirLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionDirLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setRestitutionDirLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingDirLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingDirLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getDampingDirLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingDirLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingDirLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setDampingDirLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessDirAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessDirAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getSoftnessDirAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessDirAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessDirAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setSoftnessDirAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionDirAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionDirAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getRestitutionDirAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionDirAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionDirAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setRestitutionDirAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingDirAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingDirAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getDampingDirAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingDirAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingDirAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setDampingDirAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessLimLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessLimLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getSoftnessLimLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessLimLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessLimLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setSoftnessLimLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionLimLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionLimLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getRestitutionLimLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionLimLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionLimLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setRestitutionLimLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingLimLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingLimLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getDampingLimLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingLimLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingLimLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setDampingLimLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessLimAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessLimAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getSoftnessLimAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessLimAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessLimAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setSoftnessLimAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionLimAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionLimAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getRestitutionLimAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionLimAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionLimAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setRestitutionLimAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingLimAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingLimAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getDampingLimAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingLimAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingLimAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setDampingLimAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessOrthoLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessOrthoLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getSoftnessOrthoLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessOrthoLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessOrthoLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setSoftnessOrthoLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionOrthoLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionOrthoLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getRestitutionOrthoLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionOrthoLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionOrthoLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setRestitutionOrthoLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingOrthoLin - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingOrthoLin - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getDampingOrthoLin(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingOrthoLin - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingOrthoLin - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setDampingOrthoLin(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessOrthoAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessOrthoAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getSoftnessOrthoAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessOrthoAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessOrthoAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setSoftnessOrthoAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionOrthoAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionOrthoAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getRestitutionOrthoAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionOrthoAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionOrthoAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setRestitutionOrthoAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingOrthoAng - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingOrthoAng - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getDampingOrthoAng(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingOrthoAng - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingOrthoAng - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setDampingOrthoAng(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: isPoweredLinMotor - * Signature: (J)Z - */ - JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_SliderJoint_isPoweredLinMotor - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return false; - } - return joint->getPoweredLinMotor(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setPoweredLinMotor - * Signature: (JZ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setPoweredLinMotor - (JNIEnv * env, jobject object, jlong jointId, jboolean value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setPoweredLinMotor(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getTargetLinMotorVelocity - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getTargetLinMotorVelocity - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getTargetLinMotorVelocity(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setTargetLinMotorVelocity - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setTargetLinMotorVelocity - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setTargetLinMotorVelocity(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getMaxLinMotorForce - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getMaxLinMotorForce - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getMaxLinMotorForce(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setMaxLinMotorForce - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setMaxLinMotorForce - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setMaxLinMotorForce(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: isPoweredAngMotor - * Signature: (J)Z - */ - JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_SliderJoint_isPoweredAngMotor - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return false; - } - return joint->getPoweredAngMotor(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setPoweredAngMotor - * Signature: (JZ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setPoweredAngMotor - (JNIEnv * env, jobject object, jlong jointId, jboolean value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setPoweredAngMotor(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getTargetAngMotorVelocity - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getTargetAngMotorVelocity - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getTargetAngMotorVelocity(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setTargetAngMotorVelocity - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setTargetAngMotorVelocity - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setTargetAngMotorVelocity(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getMaxAngMotorForce - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getMaxAngMotorForce - (JNIEnv * env, jobject object, jlong jointId) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return joint->getMaxAngMotorForce(); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setMaxAngMotorForce - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setMaxAngMotorForce - (JNIEnv * env, jobject object, jlong jointId, jfloat value) { - btSliderConstraint* joint = reinterpret_cast(jointId); - if (joint == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - joint->setMaxAngMotorForce(value); - } - - /* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SliderJoint_createJoint - (JNIEnv * env, jobject object, jlong bodyIdA, jlong bodyIdB, jobject pivotA, jobject rotA, jobject pivotB, jobject rotB, jboolean useLinearReferenceFrameA) { - jmeClasses::initJavaClasses(env); - btRigidBody* bodyA = reinterpret_cast(bodyIdA); - btRigidBody* bodyB = reinterpret_cast(bodyIdB); - btMatrix3x3 mtx1 = btMatrix3x3(); - btMatrix3x3 mtx2 = btMatrix3x3(); - btTransform transA = btTransform(mtx1); - jmeBulletUtil::convert(env, pivotA, &transA.getOrigin()); - jmeBulletUtil::convert(env, rotA, &transA.getBasis()); - btTransform transB = btTransform(mtx2); - jmeBulletUtil::convert(env, pivotB, &transB.getOrigin()); - jmeBulletUtil::convert(env, rotB, &transB.getBasis()); - btSliderConstraint* joint = new btSliderConstraint(*bodyA, *bodyB, transA, transB, useLinearReferenceFrameA); - return reinterpret_cast(joint); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_SliderJoint.h b/engine/src/bullet/native/com_jme3_bullet_joints_SliderJoint.h deleted file mode 100644 index 7afd66a56..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_SliderJoint.h +++ /dev/null @@ -1,469 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_SliderJoint */ - -#ifndef _Included_com_jme3_bullet_joints_SliderJoint -#define _Included_com_jme3_bullet_joints_SliderJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getLowerLinLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getLowerLinLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setLowerLinLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setLowerLinLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getUpperLinLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getUpperLinLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setUpperLinLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setUpperLinLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getLowerAngLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getLowerAngLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setLowerAngLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setLowerAngLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getUpperAngLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getUpperAngLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setUpperAngLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setUpperAngLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessDirLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessDirLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessDirLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessDirLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionDirLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionDirLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionDirLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionDirLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingDirLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingDirLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingDirLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingDirLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessDirAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessDirAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessDirAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessDirAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionDirAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionDirAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionDirAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionDirAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingDirAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingDirAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingDirAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingDirAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessLimLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessLimLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessLimLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessLimLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionLimLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionLimLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionLimLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionLimLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingLimLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingLimLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingLimLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingLimLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessLimAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessLimAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessLimAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessLimAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionLimAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionLimAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionLimAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionLimAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingLimAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingLimAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingLimAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingLimAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessOrthoLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessOrthoLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessOrthoLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessOrthoLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionOrthoLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionOrthoLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionOrthoLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionOrthoLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingOrthoLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingOrthoLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingOrthoLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingOrthoLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessOrthoAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessOrthoAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessOrthoAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessOrthoAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionOrthoAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionOrthoAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionOrthoAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionOrthoAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingOrthoAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingOrthoAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingOrthoAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingOrthoAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: isPoweredLinMotor - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_SliderJoint_isPoweredLinMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setPoweredLinMotor - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setPoweredLinMotor - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getTargetLinMotorVelocity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getTargetLinMotorVelocity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setTargetLinMotorVelocity - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setTargetLinMotorVelocity - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getMaxLinMotorForce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getMaxLinMotorForce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setMaxLinMotorForce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setMaxLinMotorForce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: isPoweredAngMotor - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_SliderJoint_isPoweredAngMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setPoweredAngMotor - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setPoweredAngMotor - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getTargetAngMotorVelocity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getTargetAngMotorVelocity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setTargetAngMotorVelocity - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setTargetAngMotorVelocity - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getMaxAngMotorForce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getMaxAngMotorForce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setMaxAngMotorForce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setMaxAngMotorForce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SliderJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_motors_RotationalLimitMotor.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_motors_RotationalLimitMotor.cpp deleted file mode 100644 index e9da298c5..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_motors_RotationalLimitMotor.cpp +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_motors_RotationalLimitMotor.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getLoLimit - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getLoLimit - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_loLimit; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setLoLimit - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setLoLimit - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_loLimit = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getHiLimit - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getHiLimit - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_hiLimit; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setHiLimit - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setHiLimit - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_hiLimit = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getTargetVelocity - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getTargetVelocity - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_targetVelocity; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setTargetVelocity - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setTargetVelocity - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_targetVelocity = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getMaxMotorForce - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getMaxMotorForce - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_maxMotorForce; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setMaxMotorForce - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setMaxMotorForce - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_maxMotorForce = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getMaxLimitForce - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getMaxLimitForce - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_maxLimitForce; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setMaxLimitForce - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setMaxLimitForce - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_maxLimitForce = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getDamping - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getDamping - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_damping; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setDamping - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setDamping - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_damping = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getLimitSoftness - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getLimitSoftness - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_limitSoftness; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setLimitSoftness - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setLimitSoftness - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_limitSoftness = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getERP - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getERP - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_stopERP; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setERP - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setERP - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_stopERP = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getBounce - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getBounce - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_bounce; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setBounce - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setBounce - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_bounce = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: isEnableMotor - * Signature: (J)Z - */ - JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_isEnableMotor - (JNIEnv *env, jobject object, jlong motorId) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return false; - } - return motor->m_enableMotor; - } - - /* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setEnableMotor - * Signature: (JZ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setEnableMotor - (JNIEnv *env, jobject object, jlong motorId, jboolean value) { - btRotationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_enableMotor = value; - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_motors_RotationalLimitMotor.h b/engine/src/bullet/native/com_jme3_bullet_joints_motors_RotationalLimitMotor.h deleted file mode 100644 index b14bf1d73..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_motors_RotationalLimitMotor.h +++ /dev/null @@ -1,173 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_motors_RotationalLimitMotor */ - -#ifndef _Included_com_jme3_bullet_joints_motors_RotationalLimitMotor -#define _Included_com_jme3_bullet_joints_motors_RotationalLimitMotor -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getLoLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getLoLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setLoLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setLoLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getHiLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getHiLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setHiLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setHiLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getTargetVelocity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getTargetVelocity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setTargetVelocity - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setTargetVelocity - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getMaxMotorForce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getMaxMotorForce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setMaxMotorForce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setMaxMotorForce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getMaxLimitForce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getMaxLimitForce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setMaxLimitForce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setMaxLimitForce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setDamping - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getLimitSoftness - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getLimitSoftness - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setLimitSoftness - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setLimitSoftness - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getERP - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getERP - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setERP - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setERP - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getBounce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getBounce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setBounce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setBounce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: isEnableMotor - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_isEnableMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setEnableMotor - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setEnableMotor - (JNIEnv *, jobject, jlong, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp b/engine/src/bullet/native/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp deleted file mode 100644 index 64f0de001..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_joints_motors_TranslationalLimitMotor.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getLowerLimit - (JNIEnv *env, jobject object, jlong motorId, jobject vector) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &motor->m_lowerLimit, vector); - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setLowerLimit - (JNIEnv *env, jobject object, jlong motorId, jobject vector) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, vector, &motor->m_lowerLimit); - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getUpperLimit - (JNIEnv *env, jobject object, jlong motorId, jobject vector) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &motor->m_upperLimit, vector); - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setUpperLimit - (JNIEnv *env, jobject object, jlong motorId, jobject vector) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, vector, &motor->m_upperLimit); - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getAccumulatedImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getAccumulatedImpulse - (JNIEnv *env, jobject object, jlong motorId, jobject vector) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &motor->m_accumulatedImpulse, vector); - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setAccumulatedImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setAccumulatedImpulse - (JNIEnv *env, jobject object, jlong motorId, jobject vector) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, vector, &motor->m_accumulatedImpulse); - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getLimitSoftness - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getLetLimitSoftness - (JNIEnv *env, jobject object, jlong motorId) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_limitSoftness; - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setLimitSoftness - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setLimitSoftness - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_limitSoftness = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getDamping - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getDamping - (JNIEnv *env, jobject object, jlong motorId) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_damping; - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setDamping - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setDamping - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_damping = value; - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getRestitution - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getRestitution - (JNIEnv *env, jobject object, jlong motorId) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return motor->m_restitution; - } - - /* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setRestitution - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setRestitution - (JNIEnv *env, jobject object, jlong motorId, jfloat value) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); - if (motor == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - motor->m_restitution = value; - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_joints_motors_TranslationalLimitMotor.h b/engine/src/bullet/native/com_jme3_bullet_joints_motors_TranslationalLimitMotor.h deleted file mode 100644 index 0ea93e2b1..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_joints_motors_TranslationalLimitMotor.h +++ /dev/null @@ -1,109 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_motors_TranslationalLimitMotor */ - -#ifndef _Included_com_jme3_bullet_joints_motors_TranslationalLimitMotor -#define _Included_com_jme3_bullet_joints_motors_TranslationalLimitMotor -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getLowerLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setLowerLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getUpperLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setUpperLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getAccumulatedImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getAccumulatedImpulse - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setAccumulatedImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setAccumulatedImpulse - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getLimitSoftness - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getLimitSoftness - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setLimitSoftness - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setLimitSoftness - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setDamping - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getRestitution - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getRestitution - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setRestitution - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setRestitution - (JNIEnv *, jobject, jlong, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsCharacter.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsCharacter.cpp deleted file mode 100644 index f64cc3aa7..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsCharacter.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ - -#include "com_jme3_bullet_objects_PhysicsCharacter.h" -#include "jmeBulletUtil.h" -#include "BulletCollision/CollisionDispatch/btGhostObject.h" -#include "BulletDynamics/Character/btKinematicCharacterController.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: createGhostObject - * Signature: ()J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_createGhostObject - (JNIEnv * env, jobject object) { - jmeClasses::initJavaClasses(env); - btPairCachingGhostObject* ghost = new btPairCachingGhostObject(); - return reinterpret_cast(ghost); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCharacterFlags - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCharacterFlags - (JNIEnv *env, jobject object, jlong ghostId) { - btPairCachingGhostObject* ghost = reinterpret_cast(ghostId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - ghost->setCollisionFlags(/*ghost->getCollisionFlags() |*/ btCollisionObject::CF_CHARACTER_OBJECT); - ghost->setCollisionFlags(ghost->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: createCharacterObject - * Signature: (JJF)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_createCharacterObject - (JNIEnv *env, jobject object, jlong objectId, jlong shapeId, jfloat stepHeight) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - //TODO: check convexshape! - btConvexShape* shape = reinterpret_cast(shapeId); - btKinematicCharacterController* character = new btKinematicCharacterController(ghost, shape, stepHeight); - return reinterpret_cast(character); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: warp - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_warp - (JNIEnv *env, jobject object, jlong objectId, jobject vector) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, vector, &vec); - character->warp(vec); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setWalkDirection - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setWalkDirection - (JNIEnv *env, jobject object, jlong objectId, jobject vector) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, vector, &vec); - character->setWalkDirection(vec); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setUpAxis - * Signature: (JI)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setUpAxis - (JNIEnv *env, jobject object, jlong objectId, jint value) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - character->setUpAxis(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setFallSpeed - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setFallSpeed - (JNIEnv *env, jobject object, jlong objectId, jfloat value) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - character->setFallSpeed(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setJumpSpeed - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setJumpSpeed - (JNIEnv *env, jobject object, jlong objectId, jfloat value) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - character->setJumpSpeed(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setGravity - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setGravity - (JNIEnv *env, jobject object, jlong objectId, jfloat value) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - character->setGravity(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getGravity - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getGravity - (JNIEnv *env, jobject object, jlong objectId) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return character->getGravity(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setMaxSlope - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setMaxSlope - (JNIEnv *env, jobject object, jlong objectId, jfloat value) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - character->setMaxSlope(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getMaxSlope - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getMaxSlope - (JNIEnv *env, jobject object, jlong objectId) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return character->getMaxSlope(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: onGround - * Signature: (J)Z - */ - JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_onGround - (JNIEnv *env, jobject object, jlong objectId) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return false; - } - return character->onGround(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: jump - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_jump - (JNIEnv *env, jobject object, jlong objectId) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - character->jump(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getPhysicsLocation - (JNIEnv *env, jobject object, jlong objectId, jobject value) { - btGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &ghost->getWorldTransform().getOrigin(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdSweptSphereRadius - (JNIEnv *env, jobject object, jlong objectId, jfloat value) { - btGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - ghost->setCcdSweptSphereRadius(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdMotionThreshold - (JNIEnv *env, jobject object, jlong objectId, jfloat value) { - btGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - ghost->setCcdMotionThreshold(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSweptSphereRadius - (JNIEnv *env, jobject object, jlong objectId) { - btGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return ghost->getCcdSweptSphereRadius(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdMotionThreshold - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdMotionThreshold - (JNIEnv *env, jobject object, jlong objectId) { - btGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return ghost->getCcdMotionThreshold(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSquareMotionThreshold - (JNIEnv *env, jobject object, jlong objectId) { - btGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return ghost->getCcdSquareMotionThreshold(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: finalizeNativeCharacter - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_finalizeNativeCharacter - (JNIEnv *env, jobject object, jlong objectId) { - btKinematicCharacterController* character = reinterpret_cast(objectId); - if (character == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - delete(character); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsCharacter.h b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsCharacter.h deleted file mode 100644 index 210198c01..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsCharacter.h +++ /dev/null @@ -1,215 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_PhysicsCharacter */ - -#ifndef _Included_com_jme3_bullet_objects_PhysicsCharacter -#define _Included_com_jme3_bullet_objects_PhysicsCharacter -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_NONE -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_01 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_02 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_03 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_04 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_05 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_06 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_07 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_08 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_09 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_10 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_11 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_12 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_13 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_14 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_15 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_16 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: createGhostObject - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_createGhostObject - (JNIEnv *, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCharacterFlags - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCharacterFlags - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: createCharacterObject - * Signature: (JJF)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_createCharacterObject - (JNIEnv *, jobject, jlong, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: warp - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_warp - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setWalkDirection - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setWalkDirection - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setUpAxis - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setUpAxis - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setFallSpeed - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setFallSpeed - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setJumpSpeed - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setJumpSpeed - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setGravity - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setGravity - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getGravity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getGravity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setMaxSlope - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setMaxSlope - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getMaxSlope - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getMaxSlope - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: onGround - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_onGround - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: jump - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_jump - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdSweptSphereRadius - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdMotionThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSweptSphereRadius - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSquareMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: finalizeNativeCharacter - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_finalizeNativeCharacter - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.cpp deleted file mode 100644 index 092805d76..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ - -#include - -#include "com_jme3_bullet_objects_PhysicsGhostObject.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" -#include "jmeBulletUtil.h" -#include "jmePhysicsSpace.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: createGhostObject - * Signature: ()J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_createGhostObject - (JNIEnv * env, jobject object) { - jmeClasses::initJavaClasses(env); - btPairCachingGhostObject* ghost = new btPairCachingGhostObject(); - return reinterpret_cast(ghost); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setGhostFlags - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setGhostFlags - (JNIEnv *env, jobject object, jlong objectId) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - ghost->setCollisionFlags(ghost->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsLocation - (JNIEnv *env, jobject object, jlong objectId, jobject value) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, value, &ghost->getWorldTransform().getOrigin()); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsRotation__JLcom_jme3_math_Matrix3f_2 - (JNIEnv *env, jobject object, jlong objectId, jobject value) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, value, &ghost->getWorldTransform().getBasis()); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsRotation__JLcom_jme3_math_Quaternion_2 - (JNIEnv *env, jobject object, jlong objectId, jobject value) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convertQuat(env, value, &ghost->getWorldTransform().getBasis()); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsLocation - (JNIEnv *env, jobject object, jlong objectId, jobject value) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &ghost->getWorldTransform().getOrigin(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsRotation - (JNIEnv *env, jobject object, jlong objectId, jobject value) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convertQuat(env, &ghost->getWorldTransform().getBasis(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsRotationMatrix - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsRotationMatrix - (JNIEnv *env, jobject object, jlong objectId, jobject value) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &ghost->getWorldTransform().getBasis(), value); - } - - class jmeGhostOverlapCallback : public btOverlapCallback { - JNIEnv* m_env; - jobject m_object; - public: - jmeGhostOverlapCallback(JNIEnv *env, jobject object) - :m_env(env), - m_object(object) - { - } - virtual ~jmeGhostOverlapCallback() {} - virtual bool processOverlap(btBroadphasePair& pair) - { - btCollisionObject *co1 = (btCollisionObject *)pair.m_pProxy0->m_clientObject; - jmeUserPointer *up1 = (jmeUserPointer*)co1 -> getUserPointer(); - jobject javaCollisionObject1 = m_env->NewLocalRef(up1->javaCollisionObject); - m_env->CallVoidMethod(m_object, jmeClasses::PhysicsGhostObject_addOverlappingObject, javaCollisionObject1); - m_env->DeleteLocalRef(javaCollisionObject1); - if (m_env->ExceptionCheck()) { - m_env->Throw(m_env->ExceptionOccurred()); - return false; - } - - return false; - } - }; - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getOverlappingObjects - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getOverlappingObjects - (JNIEnv *env, jobject object, jlong objectId) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btHashedOverlappingPairCache * pc = ghost->getOverlappingPairCache(); - jmeGhostOverlapCallback cb(env, object); - pc -> processAllOverlappingPairs(&cb, NULL); - } - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getOverlappingCount - * Signature: (J)I - */ - JNIEXPORT jint JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getOverlappingCount - (JNIEnv *env, jobject object, jlong objectId) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return ghost->getNumOverlappingObjects(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setCcdSweptSphereRadius - (JNIEnv *env, jobject object, jlong objectId, jfloat value) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - ghost->setCcdSweptSphereRadius(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setCcdMotionThreshold - (JNIEnv *env, jobject object, jlong objectId, jfloat value) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - ghost->setCcdMotionThreshold(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdSweptSphereRadius - (JNIEnv *env, jobject object, jlong objectId) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return ghost->getCcdSweptSphereRadius(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdMotionThreshold - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdMotionThreshold - (JNIEnv *env, jobject object, jlong objectId) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return ghost->getCcdMotionThreshold(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdSquareMotionThreshold - (JNIEnv *env, jobject object, jlong objectId) { - btPairCachingGhostObject* ghost = reinterpret_cast(objectId); - if (ghost == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return ghost->getCcdSquareMotionThreshold(); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.h b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.h deleted file mode 100644 index cf98e5970..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.h +++ /dev/null @@ -1,167 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_PhysicsGhostObject */ - -#ifndef _Included_com_jme3_bullet_objects_PhysicsGhostObject -#define _Included_com_jme3_bullet_objects_PhysicsGhostObject -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_NONE -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_01 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_02 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_03 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_04 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_05 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_06 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_07 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_08 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_09 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_10 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_11 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_12 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_13 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_14 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_15 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_16 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: createGhostObject - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_createGhostObject - (JNIEnv *, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setGhostFlags - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setGhostFlags - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsRotation__JLcom_jme3_math_Matrix3f_2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsRotation__JLcom_jme3_math_Quaternion_2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsRotation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsRotationMatrix - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsRotationMatrix - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getOverlappingObjects - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getOverlappingObjects - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getOverlappingCount - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getOverlappingCount - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setCcdSweptSphereRadius - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setCcdMotionThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdSweptSphereRadius - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdSquareMotionThreshold - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsRigidBody.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsRigidBody.cpp deleted file mode 100644 index 4794cdecd..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsRigidBody.cpp +++ /dev/null @@ -1,849 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_objects_PhysicsRigidBody.h" -#include "jmeBulletUtil.h" -#include "jmeMotionState.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: createRigidBody - * Signature: (FJJ)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_createRigidBody - (JNIEnv *env, jobject object, jfloat mass, jlong motionstatId, jlong shapeId) { - jmeClasses::initJavaClasses(env); - btMotionState* motionState = reinterpret_cast(motionstatId); - btCollisionShape* shape = reinterpret_cast(shapeId); - btVector3 localInertia = btVector3(); - shape->calculateLocalInertia(mass, localInertia); - btRigidBody* body = new btRigidBody(mass, motionState, shape, localInertia); - body->setUserPointer(NULL); - return reinterpret_cast(body); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: isInWorld - * Signature: (J)Z - */ - JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_isInWorld - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return false; - } - return body->isInWorld(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsLocation - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - // if (body->isStaticOrKinematicObject() || !body->isInWorld()) - ((jmeMotionState*) body->getMotionState())->setKinematicLocation(env, value); - body->setCenterOfMassTransform(((jmeMotionState*) body->getMotionState())->worldTransform); - // else{ - // btMatrix3x3* mtx = &btMatrix3x3(); - // btTransform* trans = &btTransform(*mtx); - // trans->setBasis(body->getCenterOfMassTransform().getBasis()); - // jmeBulletUtil::convert(env, value, &trans->getOrigin()); - // body->setCenterOfMassTransform(*trans); - // } - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsRotation__JLcom_jme3_math_Matrix3f_2 - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - // if (body->isStaticOrKinematicObject() || !body->isInWorld()) - ((jmeMotionState*) body->getMotionState())->setKinematicRotation(env, value); - body->setCenterOfMassTransform(((jmeMotionState*) body->getMotionState())->worldTransform); - // else{ - // btMatrix3x3* mtx = &btMatrix3x3(); - // btTransform* trans = &btTransform(*mtx); - // trans->setOrigin(body->getCenterOfMassTransform().getOrigin()); - // jmeBulletUtil::convert(env, value, &trans->getBasis()); - // body->setCenterOfMassTransform(*trans); - // } - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsRotation__JLcom_jme3_math_Quaternion_2 - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - // if (body->isStaticOrKinematicObject() || !body->isInWorld()) - ((jmeMotionState*) body->getMotionState())->setKinematicRotationQuat(env, value); - body->setCenterOfMassTransform(((jmeMotionState*) body->getMotionState())->worldTransform); - // else{ - // btMatrix3x3* mtx = &btMatrix3x3(); - // btTransform* trans = &btTransform(*mtx); - // trans->setOrigin(body->getCenterOfMassTransform().getOrigin()); - // jmeBulletUtil::convertQuat(env, value, &trans->getBasis()); - // body->setCenterOfMassTransform(*trans); - // } - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsLocation - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &body->getWorldTransform().getOrigin(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsRotation - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convertQuat(env, &body->getWorldTransform().getBasis(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsRotationMatrix - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsRotationMatrix - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &body->getWorldTransform().getBasis(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setKinematic - * Signature: (JZ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setKinematic - (JNIEnv *env, jobject object, jlong bodyId, jboolean value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - if (value) { - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - body->setActivationState(DISABLE_DEACTIVATION); - } else { - body->setCollisionFlags(body->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); - body->setActivationState(ACTIVE_TAG); - } - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCcdSweptSphereRadius - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setCcdSweptSphereRadius(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCcdMotionThreshold - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setCcdMotionThreshold(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdSweptSphereRadius - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getCcdSweptSphereRadius(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdMotionThreshold - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdMotionThreshold - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getCcdMotionThreshold(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdSquareMotionThreshold - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getCcdSquareMotionThreshold(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setStatic - * Signature: (JZ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setStatic - (JNIEnv *env, jobject object, jlong bodyId, jboolean value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - if (value) { - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); - } else { - body->setCollisionFlags(body->getCollisionFlags() & ~btCollisionObject::CF_STATIC_OBJECT); - } - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: updateMassProps - * Signature: (JJF)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_updateMassProps - (JNIEnv *env, jobject object, jlong bodyId, jlong shapeId, jfloat mass) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - btCollisionShape* shape = reinterpret_cast(shapeId); - btVector3 localInertia = btVector3(); - shape->calculateLocalInertia(mass, localInertia); - body->setMassProps(mass, localInertia); - return reinterpret_cast(body); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getGravity - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &body->getGravity(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setGravity - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, value, &vec); - body->setGravity(vec); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getFriction - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getFriction - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getFriction(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setFriction - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setFriction - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setFriction(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setDamping - * Signature: (JFF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setDamping - (JNIEnv *env, jobject object, jlong bodyId, jfloat value1, jfloat value2) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setDamping(value1, value2); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularDamping - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularDamping - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setDamping(body->getAngularDamping(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearDamping - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearDamping - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getLinearDamping(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularDamping - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularDamping - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getAngularDamping(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getRestitution - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getRestitution - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getRestitution(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setRestitution - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setRestitution - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setRestitution(value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularVelocity - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &body->getAngularVelocity(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularVelocity - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, value, &vec); - body->setAngularVelocity(vec); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearVelocity - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &body->getLinearVelocity(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setLinearVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearVelocity - (JNIEnv *env, jobject object, jlong bodyId, jobject value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec = btVector3(); - jmeBulletUtil::convert(env, value, &vec); - body->setLinearVelocity(vec); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyForce - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyForce - (JNIEnv *env, jobject object, jlong bodyId, jobject force, jobject location) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec1 = btVector3(); - btVector3 vec2 = btVector3(); - jmeBulletUtil::convert(env, force, &vec1); - jmeBulletUtil::convert(env, location, &vec2); - body->applyForce(vec1, vec2); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyCentralForce - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyCentralForce - (JNIEnv *env, jobject object, jlong bodyId, jobject force) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec1 = btVector3(); - jmeBulletUtil::convert(env, force, &vec1); - body->applyCentralForce(vec1); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyTorque - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyTorque - (JNIEnv *env, jobject object, jlong bodyId, jobject force) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec1 = btVector3(); - jmeBulletUtil::convert(env, force, &vec1); - body->applyTorque(vec1); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyImpulse - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyImpulse - (JNIEnv *env, jobject object, jlong bodyId, jobject force, jobject location) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec1 = btVector3(); - btVector3 vec2 = btVector3(); - jmeBulletUtil::convert(env, force, &vec1); - jmeBulletUtil::convert(env, location, &vec2); - body->applyImpulse(vec1, vec2); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyTorqueImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyTorqueImpulse - (JNIEnv *env, jobject object, jlong bodyId, jobject force) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec1 = btVector3(); - jmeBulletUtil::convert(env, force, &vec1); - body->applyTorqueImpulse(vec1); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: clearForces - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_clearForces - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->clearForces(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCollisionShape - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCollisionShape - (JNIEnv *env, jobject object, jlong bodyId, jlong shapeId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btCollisionShape* shape = reinterpret_cast(shapeId); - body->setCollisionShape(shape); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: activate - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_activate - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->activate(false); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: isActive - * Signature: (J)Z - */ - JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_isActive - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return false; - } - return body->isActive(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setSleepingThresholds - * Signature: (JFF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setSleepingThresholds - (JNIEnv *env, jobject object, jlong bodyId, jfloat linear, jfloat angular) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setSleepingThresholds(linear, angular); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setLinearSleepingThreshold - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearSleepingThreshold - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setSleepingThresholds(value, body->getLinearSleepingThreshold()); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularSleepingThreshold - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularSleepingThreshold - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - body->setSleepingThresholds(body->getAngularSleepingThreshold(), value); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearSleepingThreshold - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearSleepingThreshold - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getLinearSleepingThreshold(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularSleepingThreshold - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularSleepingThreshold - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getAngularSleepingThreshold(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularFactor - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularFactor - (JNIEnv *env, jobject object, jlong bodyId) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return body->getAngularFactor().getX(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularFactor - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec1 = btVector3(); - vec1.setX(value); - vec1.setY(value); - vec1.setZ(value); - body->setAngularFactor(vec1); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsRigidBody.h b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsRigidBody.h deleted file mode 100644 index aa09a620a..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsRigidBody.h +++ /dev/null @@ -1,415 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_PhysicsRigidBody */ - -#ifndef _Included_com_jme3_bullet_objects_PhysicsRigidBody -#define _Included_com_jme3_bullet_objects_PhysicsRigidBody -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_NONE -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_01 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_02 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_03 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_04 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_05 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_06 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_07 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_08 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_09 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_10 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_11 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_12 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_13 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_14 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_15 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_16 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: createRigidBody - * Signature: (FJJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_createRigidBody - (JNIEnv *, jobject, jfloat, jlong, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: isInWorld - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_isInWorld - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsRotation__JLcom_jme3_math_Matrix3f_2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsRotation__JLcom_jme3_math_Quaternion_2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsRotation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsRotationMatrix - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsRotationMatrix - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setKinematic - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setKinematic - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCcdSweptSphereRadius - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCcdMotionThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdSweptSphereRadius - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdSquareMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setStatic - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setStatic - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: updateMassProps - * Signature: (JJF)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_updateMassProps - (JNIEnv *, jobject, jlong, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getGravity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setGravity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getFriction - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getFriction - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setFriction - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setFriction - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setDamping - * Signature: (JFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setDamping - (JNIEnv *, jobject, jlong, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularDamping - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getRestitution - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getRestitution - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setRestitution - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setRestitution - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularVelocity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularVelocity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearVelocity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setLinearVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearVelocity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyForce - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyForce - (JNIEnv *, jobject, jlong, jobject, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyCentralForce - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyCentralForce - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyTorque - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyTorque - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyImpulse - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyImpulse - (JNIEnv *, jobject, jlong, jobject, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyTorqueImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyTorqueImpulse - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: clearForces - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_clearForces - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCollisionShape - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCollisionShape - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: activate - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_activate - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: isActive - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_isActive - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setSleepingThresholds - * Signature: (JFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setSleepingThresholds - (JNIEnv *, jobject, jlong, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setLinearSleepingThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearSleepingThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularSleepingThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularSleepingThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearSleepingThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearSleepingThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularSleepingThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularSleepingThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularFactor - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularFactor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularFactor - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor - (JNIEnv *, jobject, jlong, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.cpp deleted file mode 100644 index b96f08bf7..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.cpp +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ - -#include "com_jme3_bullet_objects_PhysicsVehicle.h" -#include "jmeBulletUtil.h" -#include "jmePhysicsSpace.h" -#include "BulletDynamics/Vehicle/btRaycastVehicle.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: updateWheelTransform - * Signature: (JIZ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_updateWheelTransform - (JNIEnv *env, jobject object, jlong vehicleId, jint wheel, jboolean interpolated) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - vehicle->updateWheelTransform(wheel, interpolated); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: createVehicleRaycaster - * Signature: (JJ)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_createVehicleRaycaster - (JNIEnv *env, jobject object, jlong bodyId, jlong spaceId) { - //btRigidBody* body = reinterpret_cast bodyId; - jmeClasses::initJavaClasses(env); - jmePhysicsSpace *space = reinterpret_cast(spaceId); - if (space == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - btDefaultVehicleRaycaster* caster = new btDefaultVehicleRaycaster(space->getDynamicsWorld()); - return reinterpret_cast(caster); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: createRaycastVehicle - * Signature: (JJ)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_createRaycastVehicle - (JNIEnv *env, jobject object, jlong objectId, jlong casterId) { - jmeClasses::initJavaClasses(env); - btRigidBody* body = reinterpret_cast(objectId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - body->setActivationState(DISABLE_DEACTIVATION); - btVehicleRaycaster* caster = reinterpret_cast(casterId); - if (caster == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - btRaycastVehicle::btVehicleTuning tuning; - btRaycastVehicle* vehicle = new btRaycastVehicle(tuning, body, caster); - return reinterpret_cast(vehicle); - - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: setCoordinateSystem - * Signature: (JIII)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_setCoordinateSystem - (JNIEnv *env, jobject object, jlong vehicleId, jint right, jint up, jint forward) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - vehicle->setCoordinateSystem(right, up, forward); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: addWheel - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;FFLcom/jme3/bullet/objects/infos/VehicleTuning;Z)J - */ - JNIEXPORT jint JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_addWheel - (JNIEnv *env, jobject object, jlong vehicleId, jobject location, jobject direction, jobject axle, jfloat restLength, jfloat radius, jobject tuning, jboolean frontWheel) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - btVector3 vec1 = btVector3(); - btVector3 vec2 = btVector3(); - btVector3 vec3 = btVector3(); - jmeBulletUtil::convert(env, location, &vec1); - jmeBulletUtil::convert(env, direction, &vec2); - jmeBulletUtil::convert(env, axle, &vec3); - btRaycastVehicle::btVehicleTuning tune; - btWheelInfo* info = &vehicle->addWheel(vec1, vec2, vec3, restLength, radius, tune, frontWheel); - int idx = vehicle->getNumWheels(); - return idx-1; - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: resetSuspension - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_resetSuspension - (JNIEnv *env, jobject object, jlong vehicleId) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - vehicle->resetSuspension(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: applyEngineForce - * Signature: (JIF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_applyEngineForce - (JNIEnv *env, jobject object, jlong vehicleId, jint wheel, jfloat force) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - vehicle->applyEngineForce(force, wheel); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: steer - * Signature: (JIF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_steer - (JNIEnv *env, jobject object, jlong vehicleId, jint wheel, jfloat value) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - vehicle->setSteeringValue(value, wheel); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: brake - * Signature: (JIF)F - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_brake - (JNIEnv *env, jobject object, jlong vehicleId, jint wheel, jfloat value) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - vehicle->setBrake(value, wheel); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: getCurrentVehicleSpeedKmHour - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_getCurrentVehicleSpeedKmHour - (JNIEnv *env, jobject object, jlong vehicleId) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return vehicle->getCurrentSpeedKmHour(); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: getForwardVector - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_getForwardVector - (JNIEnv *env, jobject object, jlong vehicleId, jobject out) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 forwardVector = vehicle->getForwardVector(); - jmeBulletUtil::convert(env, &forwardVector, out); - } - - /* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: finalizeNative - * Signature: (JJ)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_finalizeNative - (JNIEnv *env, jobject object, jlong casterId, jlong vehicleId) { - btVehicleRaycaster* rayCaster = reinterpret_cast(casterId); - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - delete(vehicle); - if (rayCaster == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - delete(rayCaster); - } - -#ifdef __cplusplus -} -#endif - diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.h b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.h deleted file mode 100644 index 821e384cc..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.h +++ /dev/null @@ -1,143 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_PhysicsVehicle */ - -#ifndef _Included_com_jme3_bullet_objects_PhysicsVehicle -#define _Included_com_jme3_bullet_objects_PhysicsVehicle -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_NONE -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_01 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_02 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_03 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_04 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_05 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_06 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_07 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_08 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_09 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_10 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_11 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_12 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_13 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_14 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_15 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_16 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: updateWheelTransform - * Signature: (JIZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_updateWheelTransform - (JNIEnv *, jobject, jlong, jint, jboolean); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: createVehicleRaycaster - * Signature: (JJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_createVehicleRaycaster - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: createRaycastVehicle - * Signature: (JJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_createRaycastVehicle - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: setCoordinateSystem - * Signature: (JIII)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_setCoordinateSystem - (JNIEnv *, jobject, jlong, jint, jint, jint); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: addWheel - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;FFLcom/jme3/bullet/objects/infos/VehicleTuning;Z)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_addWheel - (JNIEnv *, jobject, jlong, jobject, jobject, jobject, jfloat, jfloat, jobject, jboolean); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: resetSuspension - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_resetSuspension - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: applyEngineForce - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_applyEngineForce - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: steer - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_steer - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: brake - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_brake - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: getCurrentVehicleSpeedKmHour - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_getCurrentVehicleSpeedKmHour - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: getForwardVector - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_getForwardVector - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: finalizeNative - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_finalizeNative - (JNIEnv *, jobject, jlong, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.cpp deleted file mode 100644 index e95bd6aca..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ - -#include "com_jme3_bullet_objects_VehicleWheel.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getWheelLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelLocation - (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jobject out) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &vehicle->getWheelInfo(wheelIndex).m_worldTransform.getOrigin(), out); - } - - /* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getWheelRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelRotation - (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jobject out) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &vehicle->getWheelInfo(wheelIndex).m_worldTransform.getBasis(), out); - } - - /* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: applyInfo - * Signature: (JFFFFFFFFZF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_applyInfo - (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jfloat suspensionStiffness, jfloat wheelsDampingRelaxation, jfloat wheelsDampingCompression, jfloat frictionSlip, jfloat rollInfluence, jfloat maxSuspensionTravelCm, jfloat maxSuspensionForce, jfloat radius, jboolean frontWheel, jfloat restLength) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - vehicle->getWheelInfo(wheelIndex).m_suspensionStiffness = suspensionStiffness; - vehicle->getWheelInfo(wheelIndex).m_wheelsDampingRelaxation = wheelsDampingRelaxation; - vehicle->getWheelInfo(wheelIndex).m_wheelsDampingCompression = wheelsDampingCompression; - vehicle->getWheelInfo(wheelIndex).m_frictionSlip = frictionSlip; - vehicle->getWheelInfo(wheelIndex).m_rollInfluence = rollInfluence; - vehicle->getWheelInfo(wheelIndex).m_maxSuspensionTravelCm = maxSuspensionTravelCm; - vehicle->getWheelInfo(wheelIndex).m_maxSuspensionForce = maxSuspensionForce; - vehicle->getWheelInfo(wheelIndex).m_wheelsRadius = radius; - vehicle->getWheelInfo(wheelIndex).m_bIsFrontWheel = frontWheel; - vehicle->getWheelInfo(wheelIndex).m_suspensionRestLength1 = restLength; - - } - - /* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getCollisionLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionLocation - (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jobject out) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &vehicle->getWheelInfo(wheelIndex).m_raycastInfo.m_contactPointWS, out); - } - - /* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getCollisionNormal - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionNormal - (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jobject out) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &vehicle->getWheelInfo(wheelIndex).m_raycastInfo.m_contactNormalWS, out); - } - - /* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getSkidInfo - * Signature: (J)F - */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getSkidInfo - (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex) { - btRaycastVehicle* vehicle = reinterpret_cast(vehicleId); - if (vehicle == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return 0; - } - return vehicle->getWheelInfo(wheelIndex).m_skidInfo; - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.h b/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.h deleted file mode 100644 index b3dad4bd7..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.h +++ /dev/null @@ -1,61 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_VehicleWheel */ - -#ifndef _Included_com_jme3_bullet_objects_VehicleWheel -#define _Included_com_jme3_bullet_objects_VehicleWheel -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getWheelLocation - * Signature: (JILcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelLocation - (JNIEnv *, jobject, jlong, jint, jobject); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getWheelRotation - * Signature: (JILcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelRotation - (JNIEnv *, jobject, jlong, jint, jobject); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: applyInfo - * Signature: (JIFFFFFFFFZF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_applyInfo - (JNIEnv *, jobject, jlong, jint, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jboolean, jfloat); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getCollisionLocation - * Signature: (JILcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionLocation - (JNIEnv *, jobject, jlong, jint, jobject); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getCollisionNormal - * Signature: (JILcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionNormal - (JNIEnv *, jobject, jlong, jint, jobject); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getSkidInfo - * Signature: (JI)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getSkidInfo - (JNIEnv *, jobject, jlong, jint); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_infos_RigidBodyMotionState.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_infos_RigidBodyMotionState.cpp deleted file mode 100644 index f61a376ca..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_infos_RigidBodyMotionState.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_objects_infos_RigidBodyMotionState.h" -#include "jmeBulletUtil.h" -#include "jmeMotionState.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: createMotionState - * Signature: ()J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_createMotionState - (JNIEnv *env, jobject object) { - jmeClasses::initJavaClasses(env); - jmeMotionState* motionState = new jmeMotionState(); - return reinterpret_cast(motionState); - } - - /* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: applyTransform - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Quaternion;)Z - */ - JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_applyTransform - (JNIEnv *env, jobject object, jlong stateId, jobject location, jobject rotation) { - jmeMotionState* motionState = reinterpret_cast(stateId); - if (motionState == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return false; - } - return motionState->applyTransform(env, location, rotation); - } - - /* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldLocation - (JNIEnv *env, jobject object, jlong stateId, jobject value) { - jmeMotionState* motionState = reinterpret_cast(stateId); - if (motionState == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &motionState->worldTransform.getOrigin(), value); - } - - /* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldRotation - (JNIEnv *env, jobject object, jlong stateId, jobject value) { - jmeMotionState* motionState = reinterpret_cast(stateId); - if (motionState == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convert(env, &motionState->worldTransform.getBasis(), value); - } - - /* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldRotationQuat - * Signature: (JLcom/jme3/math/Quaternion;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldRotationQuat - (JNIEnv *env, jobject object, jlong stateId, jobject value) { - jmeMotionState* motionState = reinterpret_cast(stateId); - if (motionState == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - jmeBulletUtil::convertQuat(env, &motionState->worldTransform.getBasis(), value); - } - - /* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: finalizeNative - * Signature: (J)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_finalizeNative - (JNIEnv *env, jobject object, jlong stateId) { - jmeMotionState* motionState = reinterpret_cast(stateId); - if (motionState == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - delete(motionState); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_infos_RigidBodyMotionState.h b/engine/src/bullet/native/com_jme3_bullet_objects_infos_RigidBodyMotionState.h deleted file mode 100644 index 7939038d2..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_objects_infos_RigidBodyMotionState.h +++ /dev/null @@ -1,61 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_infos_RigidBodyMotionState */ - -#ifndef _Included_com_jme3_bullet_objects_infos_RigidBodyMotionState -#define _Included_com_jme3_bullet_objects_infos_RigidBodyMotionState -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: createMotionState - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_createMotionState - (JNIEnv *, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: applyTransform - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Quaternion;)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_applyTransform - (JNIEnv *, jobject, jlong, jobject, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldRotation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldRotationQuat - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldRotationQuat - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.cpp b/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.cpp deleted file mode 100644 index 7d6c0b0a8..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen, CJ Hare - */ -#include "com_jme3_bullet_util_DebugShapeFactory.h" -#include "jmeBulletUtil.h" -#include "BulletCollision/CollisionShapes/btShapeHull.h" - -class DebugCallback : public btTriangleCallback, public btInternalTriangleIndexCallback { -public: - JNIEnv* env; - jobject callback; - - DebugCallback(JNIEnv* env, jobject object) { - this->env = env; - this->callback = object; - } - - virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex) { - processTriangle(triangle, partId, triangleIndex); - } - - virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex) { - btVector3 vertexA, vertexB, vertexC; - vertexA = triangle[0]; - vertexB = triangle[1]; - vertexC = triangle[2]; - env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexA.getX(), vertexA.getY(), vertexA.getZ(), partId, triangleIndex); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } -// triangle = - env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexB.getX(), vertexB.getY(), vertexB.getZ(), partId, triangleIndex); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexC.getX(), vertexC.getY(), vertexC.getZ(), partId, triangleIndex); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - } -}; - -#ifdef __cplusplus -extern "C" { -#endif - - /* Inaccessible static: _00024assertionsDisabled */ - - /* - * Class: com_jme3_bullet_util_DebugShapeFactory - * Method: getVertices - * Signature: (JLcom/jme3/bullet/util/DebugMeshCallback;)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_util_DebugShapeFactory_getVertices - (JNIEnv *env, jclass clazz, jlong shapeId, jobject callback) { - btCollisionShape* shape = reinterpret_cast(shapeId); - if (shape->isConcave()) { - btConcaveShape* concave = reinterpret_cast(shape); - DebugCallback* clb = new DebugCallback(env, callback); - btVector3 min = btVector3(-1e30, -1e30, -1e30); - btVector3 max = btVector3(1e30, 1e30, 1e30); - concave->processAllTriangles(clb, min, max); - delete(clb); - } else if (shape->isConvex()) { - btConvexShape* convexShape = reinterpret_cast(shape); - // Check there is a hull shape to render - if (convexShape->getUserPointer() == NULL) { - // create a hull approximation - btShapeHull* hull = new btShapeHull(convexShape); - float margin = convexShape->getMargin(); - hull->buildHull(margin); - convexShape->setUserPointer(hull); - } - - btShapeHull* hull = (btShapeHull*) convexShape->getUserPointer(); - - int numberOfTriangles = hull->numTriangles(); - int numberOfFloats = 3 * 3 * numberOfTriangles; - int byteBufferSize = numberOfFloats * 4; - - // Loop variables - const unsigned int* hullIndices = hull->getIndexPointer(); - const btVector3* hullVertices = hull->getVertexPointer(); - btVector3 vertexA, vertexB, vertexC; - int index = 0; - - for (int i = 0; i < numberOfTriangles; i++) { - // Grab the data for this triangle from the hull - vertexA = hullVertices[hullIndices[index++]]; - vertexB = hullVertices[hullIndices[index++]]; - vertexC = hullVertices[hullIndices[index++]]; - - // Put the verticies into the vertex buffer - env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexA.getX(), vertexA.getY(), vertexA.getZ()); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexB.getX(), vertexB.getY(), vertexB.getZ()); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexC.getX(), vertexC.getY(), vertexC.getZ()); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - } - delete hull; - convexShape->setUserPointer(NULL); - } - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.h b/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.h deleted file mode 100644 index 757696fcc..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_util_DebugShapeFactory */ - -#ifndef _Included_com_jme3_bullet_util_DebugShapeFactory -#define _Included_com_jme3_bullet_util_DebugShapeFactory -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_util_DebugShapeFactory - * Method: getVertices - * Signature: (JLcom/jme3/bullet/util/DebugMeshCallback;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_util_DebugShapeFactory_getVertices - (JNIEnv *, jclass, jlong, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_util_NativeMeshUtil.cpp b/engine/src/bullet/native/com_jme3_bullet_util_NativeMeshUtil.cpp deleted file mode 100644 index bf0b478b5..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_util_NativeMeshUtil.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * Author: Normen Hansen - */ -#include "com_jme3_bullet_util_NativeMeshUtil.h" -#include "jmeBulletUtil.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* - * Class: com_jme3_bullet_util_NativeMeshUtil - * Method: createTriangleIndexVertexArray - * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;IIII)J - */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_util_NativeMeshUtil_createTriangleIndexVertexArray - (JNIEnv * env, jclass cls, jobject triangleIndexBase, jobject vertexIndexBase, jint numTriangles, jint numVertices, jint vertexStride, jint triangleIndexStride) { - jmeClasses::initJavaClasses(env); - int* triangles = (int*) env->GetDirectBufferAddress(triangleIndexBase); - float* vertices = (float*) env->GetDirectBufferAddress(vertexIndexBase); - btTriangleIndexVertexArray* array = new btTriangleIndexVertexArray(numTriangles, triangles, triangleIndexStride, numVertices, vertices, vertexStride); - return reinterpret_cast(array); - } - -#ifdef __cplusplus -} -#endif diff --git a/engine/src/bullet/native/com_jme3_bullet_util_NativeMeshUtil.h b/engine/src/bullet/native/com_jme3_bullet_util_NativeMeshUtil.h deleted file mode 100644 index 0be9f4d5a..000000000 --- a/engine/src/bullet/native/com_jme3_bullet_util_NativeMeshUtil.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_util_NativeMeshUtil */ - -#ifndef _Included_com_jme3_bullet_util_NativeMeshUtil -#define _Included_com_jme3_bullet_util_NativeMeshUtil -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_util_NativeMeshUtil - * Method: createTriangleIndexVertexArray - * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;IIII)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_util_NativeMeshUtil_createTriangleIndexVertexArray - (JNIEnv *, jclass, jobject, jobject, jint, jint, jint, jint); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/engine/src/bullet/native/jmeBulletUtil.cpp b/engine/src/bullet/native/jmeBulletUtil.cpp deleted file mode 100644 index 4bc899d45..000000000 --- a/engine/src/bullet/native/jmeBulletUtil.cpp +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include -#include "jmeBulletUtil.h" - -/** - * Author: Normen Hansen,Empire Phoenix, Lutherion - */ -void jmeBulletUtil::convert(JNIEnv* env, jobject in, btVector3* out) { - if (in == NULL || out == NULL) { - jmeClasses::throwNPE(env); - } - float x = env->GetFloatField(in, jmeClasses::Vector3f_x); //env->CallFloatMethod(in, jmeClasses::Vector3f_getX); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float y = env->GetFloatField(in, jmeClasses::Vector3f_y); //env->CallFloatMethod(in, jmeClasses::Vector3f_getY); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float z = env->GetFloatField(in, jmeClasses::Vector3f_z); //env->CallFloatMethod(in, jmeClasses::Vector3f_getZ); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - out->setX(x); - out->setY(y); - out->setZ(z); -} - -void jmeBulletUtil::convert(JNIEnv* env, const btVector3* in, jobject out) { - if (in == NULL || out == NULL) { - jmeClasses::throwNPE(env); - } - float x = in->getX(); - float y = in->getY(); - float z = in->getZ(); - env->SetFloatField(out, jmeClasses::Vector3f_x, x); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Vector3f_y, y); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Vector3f_z, z); - // env->CallObjectMethod(out, jmeClasses::Vector3f_set, x, y, z); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } -} - -void jmeBulletUtil::convert(JNIEnv* env, jobject in, btMatrix3x3* out) { - if (in == NULL || out == NULL) { - jmeClasses::throwNPE(env); - } - float m00 = env->GetFloatField(in, jmeClasses::Matrix3f_m00); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float m01 = env->GetFloatField(in, jmeClasses::Matrix3f_m01); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float m02 = env->GetFloatField(in, jmeClasses::Matrix3f_m02); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float m10 = env->GetFloatField(in, jmeClasses::Matrix3f_m10); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float m11 = env->GetFloatField(in, jmeClasses::Matrix3f_m11); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float m12 = env->GetFloatField(in, jmeClasses::Matrix3f_m12); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float m20 = env->GetFloatField(in, jmeClasses::Matrix3f_m20); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float m21 = env->GetFloatField(in, jmeClasses::Matrix3f_m21); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float m22 = env->GetFloatField(in, jmeClasses::Matrix3f_m22); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - out->setValue(m00, m01, m02, m10, m11, m12, m20, m21, m22); -} - -void jmeBulletUtil::convert(JNIEnv* env, const btMatrix3x3* in, jobject out) { - if (in == NULL || out == NULL) { - jmeClasses::throwNPE(env); - } - float m00 = in->getRow(0).m_floats[0]; - float m01 = in->getRow(0).m_floats[1]; - float m02 = in->getRow(0).m_floats[2]; - float m10 = in->getRow(1).m_floats[0]; - float m11 = in->getRow(1).m_floats[1]; - float m12 = in->getRow(1).m_floats[2]; - float m20 = in->getRow(2).m_floats[0]; - float m21 = in->getRow(2).m_floats[1]; - float m22 = in->getRow(2).m_floats[2]; - env->SetFloatField(out, jmeClasses::Matrix3f_m00, m00); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Matrix3f_m01, m01); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Matrix3f_m02, m02); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Matrix3f_m10, m10); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Matrix3f_m11, m11); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Matrix3f_m12, m12); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Matrix3f_m20, m20); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Matrix3f_m21, m21); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Matrix3f_m22, m22); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } -} - -void jmeBulletUtil::convertQuat(JNIEnv* env, jobject in, btMatrix3x3* out) { - if (in == NULL || out == NULL) { - jmeClasses::throwNPE(env); - } - float x = env->GetFloatField(in, jmeClasses::Quaternion_x); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float y = env->GetFloatField(in, jmeClasses::Quaternion_y); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float z = env->GetFloatField(in, jmeClasses::Quaternion_z); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - float w = env->GetFloatField(in, jmeClasses::Quaternion_w); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - float norm = w * w + x * x + y * y + z * z; - float s = (norm == 1.0) ? 2.0 : (norm > 0.1) ? 2.0 / norm : 0.0; - - // compute xs/ys/zs first to save 6 multiplications, since xs/ys/zs - // will be used 2-4 times each. - float xs = x * s; - float ys = y * s; - float zs = z * s; - float xx = x * xs; - float xy = x * ys; - float xz = x * zs; - float xw = w * xs; - float yy = y * ys; - float yz = y * zs; - float yw = w * ys; - float zz = z * zs; - float zw = w * zs; - - // using s=2/norm (instead of 1/norm) saves 9 multiplications by 2 here - out->setValue(1.0 - (yy + zz), (xy - zw), (xz + yw), - (xy + zw), 1 - (xx + zz), (yz - xw), - (xz - yw), (yz + xw), 1.0 - (xx + yy)); -} - -void jmeBulletUtil::convertQuat(JNIEnv* env, const btMatrix3x3* in, jobject out) { - if (in == NULL || out == NULL) { - jmeClasses::throwNPE(env); - } - // the trace is the sum of the diagonal elements; see - // http://mathworld.wolfram.com/MatrixTrace.html - float t = in->getRow(0).m_floats[0] + in->getRow(1).m_floats[1] + in->getRow(2).m_floats[2]; - float w, x, y, z; - // we protect the division by s by ensuring that s>=1 - if (t >= 0) { // |w| >= .5 - float s = sqrt(t + 1); // |s|>=1 ... - w = 0.5f * s; - s = 0.5f / s; // so this division isn't bad - x = (in->getRow(2).m_floats[1] - in->getRow(1).m_floats[2]) * s; - y = (in->getRow(0).m_floats[2] - in->getRow(2).m_floats[0]) * s; - z = (in->getRow(1).m_floats[0] - in->getRow(0).m_floats[1]) * s; - } else if ((in->getRow(0).m_floats[0] > in->getRow(1).m_floats[1]) && (in->getRow(0).m_floats[0] > in->getRow(2).m_floats[2])) { - float s = sqrt(1.0f + in->getRow(0).m_floats[0] - in->getRow(1).m_floats[1] - in->getRow(2).m_floats[2]); // |s|>=1 - x = s * 0.5f; // |x| >= .5 - s = 0.5f / s; - y = (in->getRow(1).m_floats[0] + in->getRow(0).m_floats[1]) * s; - z = (in->getRow(0).m_floats[2] + in->getRow(2).m_floats[0]) * s; - w = (in->getRow(2).m_floats[1] - in->getRow(1).m_floats[2]) * s; - } else if (in->getRow(1).m_floats[1] > in->getRow(2).m_floats[2]) { - float s = sqrt(1.0f + in->getRow(1).m_floats[1] - in->getRow(0).m_floats[0] - in->getRow(2).m_floats[2]); // |s|>=1 - y = s * 0.5f; // |y| >= .5 - s = 0.5f / s; - x = (in->getRow(1).m_floats[0] + in->getRow(0).m_floats[1]) * s; - z = (in->getRow(2).m_floats[1] + in->getRow(1).m_floats[2]) * s; - w = (in->getRow(0).m_floats[2] - in->getRow(2).m_floats[0]) * s; - } else { - float s = sqrt(1.0f + in->getRow(2).m_floats[2] - in->getRow(0).m_floats[0] - in->getRow(1).m_floats[1]); // |s|>=1 - z = s * 0.5f; // |z| >= .5 - s = 0.5f / s; - x = (in->getRow(0).m_floats[2] + in->getRow(2).m_floats[0]) * s; - y = (in->getRow(2).m_floats[1] + in->getRow(1).m_floats[2]) * s; - w = (in->getRow(1).m_floats[0] - in->getRow(0).m_floats[1]) * s; - } - - env->SetFloatField(out, jmeClasses::Quaternion_x, x); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Quaternion_y, y); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Quaternion_z, z); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - env->SetFloatField(out, jmeClasses::Quaternion_w, w); - // env->CallObjectMethod(out, jmeClasses::Quaternion_set, x, y, z, w); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } -} - -void jmeBulletUtil::addResult(JNIEnv* env, jobject resultlist, btVector3 hitnormal, btVector3 m_hitPointWorld, btScalar m_hitFraction, btCollisionObject* hitobject) { - - jobject singleresult = env->AllocObject(jmeClasses::PhysicsRay_Class); - jobject hitnormalvec = env->AllocObject(jmeClasses::Vector3f); - - convert(env, const_cast (&hitnormal), hitnormalvec); - jmeUserPointer *up1 = (jmeUserPointer*) hitobject -> getUserPointer(); - - env->SetObjectField(singleresult, jmeClasses::PhysicsRay_normalInWorldSpace, hitnormalvec); - env->SetFloatField(singleresult, jmeClasses::PhysicsRay_hitfraction, m_hitFraction); - - env->SetObjectField(singleresult, jmeClasses::PhysicsRay_collisionObject, up1->javaCollisionObject); - env->CallVoidMethod(resultlist, jmeClasses::PhysicsRay_addmethod, singleresult); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } -} diff --git a/engine/src/bullet/native/jmeBulletUtil.h b/engine/src/bullet/native/jmeBulletUtil.h deleted file mode 100644 index bd211fd00..000000000 --- a/engine/src/bullet/native/jmeBulletUtil.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "jmeClasses.h" -#include "btBulletDynamicsCommon.h" -#include "btBulletCollisionCommon.h" -#include "LinearMath/btVector3.h" - -/** - * Author: Normen Hansen - */ -class jmeBulletUtil{ -public: - static void convert(JNIEnv* env, jobject in, btVector3* out); - static void convert(JNIEnv* env, const btVector3* in, jobject out); - static void convert(JNIEnv* env, jobject in, btMatrix3x3* out); - static void convert(JNIEnv* env, const btMatrix3x3* in, jobject out); - static void convertQuat(JNIEnv* env, jobject in, btMatrix3x3* out); - static void convertQuat(JNIEnv* env, const btMatrix3x3* in, jobject out); - static void addResult(JNIEnv* env, jobject resultlist, const btVector3 hitnormal,const btVector3 m_hitPointWorld,const btScalar m_hitFraction,btCollisionObject* hitobject); -private: - jmeBulletUtil(){}; - ~jmeBulletUtil(){}; - -}; - -class jmeUserPointer { -public: - jobject javaCollisionObject; - jint group; - jint groups; - void *space; -}; \ No newline at end of file diff --git a/engine/src/bullet/native/jmeClasses.cpp b/engine/src/bullet/native/jmeClasses.cpp deleted file mode 100644 index ce79ffa7a..000000000 --- a/engine/src/bullet/native/jmeClasses.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "jmeClasses.h" -#include - -/** - * Author: Normen Hansen,Empire Phoenix, Lutherion - */ -//public fields -jclass jmeClasses::PhysicsSpace; -jmethodID jmeClasses::PhysicsSpace_preTick; -jmethodID jmeClasses::PhysicsSpace_postTick; -jmethodID jmeClasses::PhysicsSpace_addCollisionEvent; - -jclass jmeClasses::PhysicsGhostObject; -jmethodID jmeClasses::PhysicsGhostObject_addOverlappingObject; - -jclass jmeClasses::Vector3f; -jmethodID jmeClasses::Vector3f_set; -jmethodID jmeClasses::Vector3f_toArray; -jmethodID jmeClasses::Vector3f_getX; -jmethodID jmeClasses::Vector3f_getY; -jmethodID jmeClasses::Vector3f_getZ; -jfieldID jmeClasses::Vector3f_x; -jfieldID jmeClasses::Vector3f_y; -jfieldID jmeClasses::Vector3f_z; - -jclass jmeClasses::Quaternion; -jmethodID jmeClasses::Quaternion_set; -jmethodID jmeClasses::Quaternion_getX; -jmethodID jmeClasses::Quaternion_getY; -jmethodID jmeClasses::Quaternion_getZ; -jmethodID jmeClasses::Quaternion_getW; -jfieldID jmeClasses::Quaternion_x; -jfieldID jmeClasses::Quaternion_y; -jfieldID jmeClasses::Quaternion_z; -jfieldID jmeClasses::Quaternion_w; - -jclass jmeClasses::Matrix3f; -jmethodID jmeClasses::Matrix3f_set; -jmethodID jmeClasses::Matrix3f_get; -jfieldID jmeClasses::Matrix3f_m00; -jfieldID jmeClasses::Matrix3f_m01; -jfieldID jmeClasses::Matrix3f_m02; -jfieldID jmeClasses::Matrix3f_m10; -jfieldID jmeClasses::Matrix3f_m11; -jfieldID jmeClasses::Matrix3f_m12; -jfieldID jmeClasses::Matrix3f_m20; -jfieldID jmeClasses::Matrix3f_m21; -jfieldID jmeClasses::Matrix3f_m22; - -jclass jmeClasses::DebugMeshCallback; -jmethodID jmeClasses::DebugMeshCallback_addVector; - -jclass jmeClasses::PhysicsRay_Class; -jmethodID jmeClasses::PhysicsRay_newSingleResult; - -jfieldID jmeClasses::PhysicsRay_normalInWorldSpace; -jfieldID jmeClasses::PhysicsRay_hitfraction; -jfieldID jmeClasses::PhysicsRay_collisionObject; - -jclass jmeClasses::PhysicsRay_listresult; -jmethodID jmeClasses::PhysicsRay_addmethod; - -//private fields -//JNIEnv* jmeClasses::env; -JavaVM* jmeClasses::vm; - -void jmeClasses::initJavaClasses(JNIEnv* env) { -// if (env != NULL) { -// fprintf(stdout, "Check Java VM state\n"); -// fflush(stdout); -// int res = vm->AttachCurrentThread((void**) &jmeClasses::env, NULL); -// if (res < 0) { -// fprintf(stdout, "** ERROR: getting Java env!\n"); -// if (res == JNI_EVERSION) fprintf(stdout, "GetEnv Error because of different JNI Version!\n"); -// fflush(stdout); -// } -// return; -// } - if(PhysicsSpace!=NULL) return; - fprintf(stdout, "Bullet-Native: Initializing java classes\n"); - fflush(stdout); -// jmeClasses::env = env; - env->GetJavaVM(&vm); - - PhysicsSpace = (jclass)env->NewGlobalRef(env->FindClass("com/jme3/bullet/PhysicsSpace")); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - PhysicsSpace_preTick = env->GetMethodID(PhysicsSpace, "preTick_native", "(F)V"); - PhysicsSpace_postTick = env->GetMethodID(PhysicsSpace, "postTick_native", "(F)V"); - PhysicsSpace_addCollisionEvent = env->GetMethodID(PhysicsSpace, "addCollisionEvent_native","(Lcom/jme3/bullet/collision/PhysicsCollisionObject;Lcom/jme3/bullet/collision/PhysicsCollisionObject;J)V"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - PhysicsGhostObject = (jclass)env->NewGlobalRef(env->FindClass("com/jme3/bullet/objects/PhysicsGhostObject")); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - PhysicsGhostObject_addOverlappingObject = env->GetMethodID(PhysicsGhostObject, "addOverlappingObject_native","(Lcom/jme3/bullet/collision/PhysicsCollisionObject;)V"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - Vector3f = (jclass)env->NewGlobalRef(env->FindClass("com/jme3/math/Vector3f")); - Vector3f_set = env->GetMethodID(Vector3f, "set", "(FFF)Lcom/jme3/math/Vector3f;"); - Vector3f_toArray = env->GetMethodID(Vector3f, "toArray", "([F)[F"); - Vector3f_getX = env->GetMethodID(Vector3f, "getX", "()F"); - Vector3f_getY = env->GetMethodID(Vector3f, "getY", "()F"); - Vector3f_getZ = env->GetMethodID(Vector3f, "getZ", "()F"); - Vector3f_x = env->GetFieldID(Vector3f, "x", "F"); - Vector3f_y = env->GetFieldID(Vector3f, "y", "F"); - Vector3f_z = env->GetFieldID(Vector3f, "z", "F"); - - Quaternion = (jclass)env->NewGlobalRef(env->FindClass("com/jme3/math/Quaternion")); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - Quaternion_set = env->GetMethodID(Quaternion, "set", "(FFFF)Lcom/jme3/math/Quaternion;"); - Quaternion_getW = env->GetMethodID(Quaternion, "getW", "()F"); - Quaternion_getX = env->GetMethodID(Quaternion, "getX", "()F"); - Quaternion_getY = env->GetMethodID(Quaternion, "getY", "()F"); - Quaternion_getZ = env->GetMethodID(Quaternion, "getZ", "()F"); - Quaternion_x = env->GetFieldID(Quaternion, "x", "F"); - Quaternion_y = env->GetFieldID(Quaternion, "y", "F"); - Quaternion_z = env->GetFieldID(Quaternion, "z", "F"); - Quaternion_w = env->GetFieldID(Quaternion, "w", "F"); - - Matrix3f = (jclass)env->NewGlobalRef(env->FindClass("com/jme3/math/Matrix3f")); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - Matrix3f_set = env->GetMethodID(Matrix3f, "set", "(IIF)Lcom/jme3/math/Matrix3f;"); - Matrix3f_get = env->GetMethodID(Matrix3f, "get", "(II)F"); - Matrix3f_m00 = env->GetFieldID(Matrix3f, "m00", "F"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - Matrix3f_m01 = env->GetFieldID(Matrix3f, "m01", "F"); - Matrix3f_m02 = env->GetFieldID(Matrix3f, "m02", "F"); - Matrix3f_m10 = env->GetFieldID(Matrix3f, "m10", "F"); - Matrix3f_m11 = env->GetFieldID(Matrix3f, "m11", "F"); - Matrix3f_m12 = env->GetFieldID(Matrix3f, "m12", "F"); - Matrix3f_m20 = env->GetFieldID(Matrix3f, "m20", "F"); - Matrix3f_m21 = env->GetFieldID(Matrix3f, "m21", "F"); - Matrix3f_m22 = env->GetFieldID(Matrix3f, "m22", "F"); - - DebugMeshCallback = (jclass)env->NewGlobalRef(env->FindClass("com/jme3/bullet/util/DebugMeshCallback")); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - DebugMeshCallback_addVector = env->GetMethodID(DebugMeshCallback, "addVector", "(FFFII)V"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - PhysicsRay_Class = (jclass)env->NewGlobalRef(env->FindClass("com/jme3/bullet/collision/PhysicsRayTestResult")); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - PhysicsRay_newSingleResult = env->GetMethodID(PhysicsRay_Class,"","()V"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - PhysicsRay_normalInWorldSpace = env->GetFieldID(PhysicsRay_Class,"hitNormalLocal","Lcom/jme3/math/Vector3f;"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - - PhysicsRay_hitfraction = env->GetFieldID(PhysicsRay_Class,"hitFraction","F"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - - PhysicsRay_collisionObject = env->GetFieldID(PhysicsRay_Class,"collisionObject","Lcom/jme3/bullet/collision/PhysicsCollisionObject;"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - PhysicsRay_listresult = env->FindClass("java/util/List"); - PhysicsRay_listresult = (jclass)env->NewGlobalRef(PhysicsRay_listresult); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - - PhysicsRay_addmethod = env->GetMethodID(PhysicsRay_listresult,"add","(Ljava/lang/Object;)Z"); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } -} - -void jmeClasses::throwNPE(JNIEnv* env) { - if (env == NULL) return; - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, ""); - return; -} diff --git a/engine/src/bullet/native/jmeClasses.h b/engine/src/bullet/native/jmeClasses.h deleted file mode 100644 index 731b86f7b..000000000 --- a/engine/src/bullet/native/jmeClasses.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include - -/** - * Author: Normen Hansen - */ - -class jmeClasses { -public: - static void initJavaClasses(JNIEnv* env); -// static JNIEnv* env; - static JavaVM* vm; - static jclass PhysicsSpace; - static jmethodID PhysicsSpace_preTick; - static jmethodID PhysicsSpace_postTick; - static jmethodID PhysicsSpace_addCollisionEvent; - static jclass PhysicsGhostObject; - static jmethodID PhysicsGhostObject_addOverlappingObject; - - static jclass Vector3f; - static jmethodID Vector3f_set; - static jmethodID Vector3f_getX; - static jmethodID Vector3f_getY; - static jmethodID Vector3f_getZ; - static jmethodID Vector3f_toArray; - static jfieldID Vector3f_x; - static jfieldID Vector3f_y; - static jfieldID Vector3f_z; - - static jclass Quaternion; - static jmethodID Quaternion_set; - static jmethodID Quaternion_getX; - static jmethodID Quaternion_getY; - static jmethodID Quaternion_getZ; - static jmethodID Quaternion_getW; - static jfieldID Quaternion_x; - static jfieldID Quaternion_y; - static jfieldID Quaternion_z; - static jfieldID Quaternion_w; - - static jclass Matrix3f; - static jmethodID Matrix3f_get; - static jmethodID Matrix3f_set; - static jfieldID Matrix3f_m00; - static jfieldID Matrix3f_m01; - static jfieldID Matrix3f_m02; - static jfieldID Matrix3f_m10; - static jfieldID Matrix3f_m11; - static jfieldID Matrix3f_m12; - static jfieldID Matrix3f_m20; - static jfieldID Matrix3f_m21; - static jfieldID Matrix3f_m22; - - static jclass PhysicsRay_Class; - static jmethodID PhysicsRay_newSingleResult; - static jfieldID PhysicsRay_normalInWorldSpace; - static jfieldID PhysicsRay_hitfraction; - static jfieldID PhysicsRay_collisionObject; - static jclass PhysicsRay_listresult; - static jmethodID PhysicsRay_addmethod; - - static jclass DebugMeshCallback; - static jmethodID DebugMeshCallback_addVector; - - static void throwNPE(JNIEnv* env); -private: - jmeClasses(){}; - ~jmeClasses(){}; -}; \ No newline at end of file diff --git a/engine/src/bullet/native/jmeMotionState.cpp b/engine/src/bullet/native/jmeMotionState.cpp deleted file mode 100644 index 0c61f9b2f..000000000 --- a/engine/src/bullet/native/jmeMotionState.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "jmeMotionState.h" -#include "jmeBulletUtil.h" - -/** - * Author: Normen Hansen - */ - -jmeMotionState::jmeMotionState() { - trans = new btTransform(); - trans -> setIdentity(); - worldTransform = *trans; - dirty = true; -} - -void jmeMotionState::getWorldTransform(btTransform& worldTrans) const { - worldTrans = worldTransform; -} - -void jmeMotionState::setWorldTransform(const btTransform& worldTrans) { - worldTransform = worldTrans; - dirty = true; -} - -void jmeMotionState::setKinematicTransform(const btTransform& worldTrans) { - worldTransform = worldTrans; - dirty = true; -} - -void jmeMotionState::setKinematicLocation(JNIEnv* env, jobject location) { - jmeBulletUtil::convert(env, location, &worldTransform.getOrigin()); - dirty = true; -} - -void jmeMotionState::setKinematicRotation(JNIEnv* env, jobject rotation) { - jmeBulletUtil::convert(env, rotation, &worldTransform.getBasis()); - dirty = true; -} - -void jmeMotionState::setKinematicRotationQuat(JNIEnv* env, jobject rotation) { - jmeBulletUtil::convertQuat(env, rotation, &worldTransform.getBasis()); - dirty = true; -} - -bool jmeMotionState::applyTransform(JNIEnv* env, jobject location, jobject rotation) { - if (dirty) { - // fprintf(stdout, "Apply world translation\n"); - // fflush(stdout); - jmeBulletUtil::convert(env, &worldTransform.getOrigin(), location); - jmeBulletUtil::convertQuat(env, &worldTransform.getBasis(), rotation); - dirty = false; - return true; - } - return false; -} - -jmeMotionState::~jmeMotionState() { - free(trans); -} diff --git a/engine/src/bullet/native/jmeMotionState.h b/engine/src/bullet/native/jmeMotionState.h deleted file mode 100644 index b9e6ebb9e..000000000 --- a/engine/src/bullet/native/jmeMotionState.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include - -/** - * Author: Normen Hansen - */ - -#include "btBulletDynamicsCommon.h" -//#include "btBulletCollisionCommon.h" - -class jmeMotionState : public btMotionState { -private: - bool dirty; - btTransform* trans; -public: - jmeMotionState(); - virtual ~jmeMotionState(); - - btTransform worldTransform; - virtual void getWorldTransform(btTransform& worldTrans) const; - virtual void setWorldTransform(const btTransform& worldTrans); - void setKinematicTransform(const btTransform& worldTrans); - void setKinematicLocation(JNIEnv*, jobject); - void setKinematicRotation(JNIEnv*, jobject); - void setKinematicRotationQuat(JNIEnv*, jobject); - bool applyTransform(JNIEnv* env, jobject location, jobject rotation); -}; diff --git a/engine/src/bullet/native/jmePhysicsSpace.cpp b/engine/src/bullet/native/jmePhysicsSpace.cpp deleted file mode 100644 index 984517ac1..000000000 --- a/engine/src/bullet/native/jmePhysicsSpace.cpp +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "jmePhysicsSpace.h" -#include "jmeBulletUtil.h" -#include - -/** - * Author: Normen Hansen - */ -jmePhysicsSpace::jmePhysicsSpace(JNIEnv* env, jobject javaSpace) { - //TODO: global ref? maybe not -> cleaning, rather callback class? - this->javaPhysicsSpace = env->NewWeakGlobalRef(javaSpace); - this->env = env; - env->GetJavaVM(&vm); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } -} - -void jmePhysicsSpace::attachThread() { -#ifdef JNI_VERSION_1_2 - vm->AttachCurrentThread((void**) &env, NULL); -#else - vm->AttachCurrentThread(&env, NULL); -#endif -} - -JNIEnv* jmePhysicsSpace::getEnv() { - attachThread(); - return this->env; -} - -void jmePhysicsSpace::stepSimulation(jfloat tpf, jint maxSteps, jfloat accuracy) { - dynamicsWorld->stepSimulation(tpf, maxSteps, accuracy); -} - -btThreadSupportInterface* jmePhysicsSpace::createSolverThreadSupport(int maxNumThreads) { -#ifdef _WIN32 - Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads", SolverThreadFunc, SolverlsMemoryFunc, maxNumThreads); - Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo); - threadSupport->startSPU(); -#elif defined (USE_PTHREADS) - PosixThreadSupport::ThreadConstructionInfo constructionInfo("collision", SolverThreadFunc, - SolverlsMemoryFunc, maxNumThreads); - PosixThreadSupport* threadSupport = new PosixThreadSupport(constructionInfo); - threadSupport->startSPU(); -#else - SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads", SolverThreadFunc, SolverlsMemoryFunc); - SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci); - threadSupport->startSPU(); -#endif - return threadSupport; -} - -btThreadSupportInterface* jmePhysicsSpace::createDispatchThreadSupport(int maxNumThreads) { -#ifdef _WIN32 - Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads", processCollisionTask, createCollisionLocalStoreMemory, maxNumThreads); - Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo); - threadSupport->startSPU(); -#elif defined (USE_PTHREADS) - PosixThreadSupport::ThreadConstructionInfo solverConstructionInfo("solver", processCollisionTask, - createCollisionLocalStoreMemory, maxNumThreads); - PosixThreadSupport* threadSupport = new PosixThreadSupport(solverConstructionInfo); - threadSupport->startSPU(); -#else - SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads", processCollisionTask, createCollisionLocalStoreMemory); - SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci); - threadSupport->startSPU(); -#endif - return threadSupport; -} - -void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, jfloat maxX, jfloat maxY, jfloat maxZ, jint broadphaseId, jboolean threading) { - // collision configuration contains default setup for memory, collision setup - btDefaultCollisionConstructionInfo cci; - // if(threading){ - // cci.m_defaultMaxPersistentManifoldPoolSize = 32768; - // } - btCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(cci); - - btVector3 min = btVector3(minX, minY, minZ); - btVector3 max = btVector3(maxX, maxY, maxZ); - - btBroadphaseInterface* broadphase; - - switch (broadphaseId) { - case 0: - broadphase = new btSimpleBroadphase(); - break; - case 1: - broadphase = new btAxisSweep3(min, max); - break; - case 2: - //TODO: 32bit! - broadphase = new btAxisSweep3(min, max); - break; - case 3: - broadphase = new btDbvtBroadphase(); - break; - case 4: - // broadphase = new btGpu3DGridBroadphase( - // min, max, - // 20, 20, 20, - // 10000, 1000, 25); - break; - } - - btCollisionDispatcher* dispatcher; - btConstraintSolver* solver; - // use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - if (threading) { - btThreadSupportInterface* dispatchThreads = createDispatchThreadSupport(4); - dispatcher = new SpuGatheringCollisionDispatcher(dispatchThreads, 4, collisionConfiguration); - dispatcher->setDispatcherFlags(btCollisionDispatcher::CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION); - } else { - dispatcher = new btCollisionDispatcher(collisionConfiguration); - } - - // the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) - if (threading) { - btThreadSupportInterface* solverThreads = createSolverThreadSupport(4); - solver = new btParallelConstraintSolver(solverThreads); - } else { - solver = new btSequentialImpulseConstraintSolver; - } - - //create dynamics world - btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); - dynamicsWorld = world; - dynamicsWorld->setWorldUserInfo(this); - - //parallel solver requires the contacts to be in a contiguous pool, so avoid dynamic allocation - if (threading) { - world->getSimulationIslandManager()->setSplitIslands(false); - world->getSolverInfo().m_numIterations = 4; - world->getSolverInfo().m_solverMode = SOLVER_SIMD + SOLVER_USE_WARMSTARTING; //+SOLVER_RANDMIZE_ORDER; - world->getDispatchInfo().m_enableSPU = true; - } - - broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); - - dynamicsWorld->setGravity(btVector3(0, -9.81f, 0)); - - struct jmeFilterCallback : public btOverlapFilterCallback { - // return true when pairs need collision - - virtual bool needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy * proxy1) const { - // bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - // collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - if (collides) { - btCollisionObject* co0 = (btCollisionObject*) proxy0->m_clientObject; - btCollisionObject* co1 = (btCollisionObject*) proxy1->m_clientObject; - jmeUserPointer *up0 = (jmeUserPointer*) co0 -> getUserPointer(); - jmeUserPointer *up1 = (jmeUserPointer*) co1 -> getUserPointer(); - if (up0 != NULL && up1 != NULL) { - collides = (up0->group & up1->groups) != 0; - collides = collides && (up1->group & up0->groups); - - //add some additional logic here that modified 'collides' - return collides; - } - return false; - } - return collides; - } - }; - dynamicsWorld->getPairCache()->setOverlapFilterCallback(new jmeFilterCallback()); - dynamicsWorld->setInternalTickCallback(&jmePhysicsSpace::preTickCallback, static_cast (this), true); - dynamicsWorld->setInternalTickCallback(&jmePhysicsSpace::postTickCallback, static_cast (this)); - if (gContactProcessedCallback == NULL) { - gContactProcessedCallback = &jmePhysicsSpace::contactProcessedCallback; - } -} - -void jmePhysicsSpace::preTickCallback(btDynamicsWorld *world, btScalar timeStep) { - jmePhysicsSpace* dynamicsWorld = (jmePhysicsSpace*) world->getWorldUserInfo(); - JNIEnv* env = dynamicsWorld->getEnv(); - jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); - if (javaPhysicsSpace != NULL) { - env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_preTick, timeStep); - env->DeleteLocalRef(javaPhysicsSpace); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - } -} - -void jmePhysicsSpace::postTickCallback(btDynamicsWorld *world, btScalar timeStep) { - jmePhysicsSpace* dynamicsWorld = (jmePhysicsSpace*) world->getWorldUserInfo(); - JNIEnv* env = dynamicsWorld->getEnv(); - jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); - if (javaPhysicsSpace != NULL) { - env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_postTick, timeStep); - env->DeleteLocalRef(javaPhysicsSpace); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; - } - } -} - -bool jmePhysicsSpace::contactProcessedCallback(btManifoldPoint &cp, void *body0, void *body1) { - // printf("contactProcessedCallback %d %dn", body0, body1); - btCollisionObject* co0 = (btCollisionObject*) body0; - jmeUserPointer *up0 = (jmeUserPointer*) co0 -> getUserPointer(); - btCollisionObject* co1 = (btCollisionObject*) body1; - jmeUserPointer *up1 = (jmeUserPointer*) co1 -> getUserPointer(); - if (up0 != NULL) { - jmePhysicsSpace *dynamicsWorld = (jmePhysicsSpace *)up0->space; - if (dynamicsWorld != NULL) { - JNIEnv* env = dynamicsWorld->getEnv(); - jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); - if (javaPhysicsSpace != NULL) { - jobject javaCollisionObject0 = env->NewLocalRef(up0->javaCollisionObject); - jobject javaCollisionObject1 = env->NewLocalRef(up1->javaCollisionObject); - env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_addCollisionEvent, javaCollisionObject0, javaCollisionObject1, (jlong) & cp); - env->DeleteLocalRef(javaPhysicsSpace); - env->DeleteLocalRef(javaCollisionObject0); - env->DeleteLocalRef(javaCollisionObject1); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return true; - } - } - } - } - return true; -} - -btDynamicsWorld* jmePhysicsSpace::getDynamicsWorld() { - return dynamicsWorld; -} - -jobject jmePhysicsSpace::getJavaPhysicsSpace() { - return javaPhysicsSpace; -} - -jmePhysicsSpace::~jmePhysicsSpace() { - delete(dynamicsWorld); -} \ No newline at end of file diff --git a/engine/src/bullet/native/jmePhysicsSpace.h b/engine/src/bullet/native/jmePhysicsSpace.h deleted file mode 100644 index 7ba4c06f4..000000000 --- a/engine/src/bullet/native/jmePhysicsSpace.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include -#include "btBulletDynamicsCommon.h" -#include "btBulletCollisionCommon.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include "BulletCollision/CollisionDispatch/btGhostObject.h" -#include "BulletDynamics/Character/btKinematicCharacterController.h" -#ifdef _WIN32 -#include "BulletMultiThreaded/Win32ThreadSupport.h" -#else -#include "BulletMultiThreaded/PosixThreadSupport.h" -#endif -#include "BulletMultiThreaded/btParallelConstraintSolver.h" -#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" -#include "BulletMultiThreaded/SpuCollisionTaskProcess.h" -#include "BulletMultiThreaded/SequentialThreadSupport.h" -#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" -#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" - -/** - * Author: Normen Hansen - */ -class jmePhysicsSpace { -private: - JNIEnv* env; - JavaVM* vm; - btDynamicsWorld* dynamicsWorld; - jobject javaPhysicsSpace; - btThreadSupportInterface* createSolverThreadSupport(int); - btThreadSupportInterface* createDispatchThreadSupport(int); - void attachThread(); -public: - jmePhysicsSpace(){}; - ~jmePhysicsSpace(); - jmePhysicsSpace(JNIEnv*, jobject); - void stepSimulation(jfloat, jint, jfloat); - void createPhysicsSpace(jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jint, jboolean); - btDynamicsWorld* getDynamicsWorld(); - jobject getJavaPhysicsSpace(); - JNIEnv* getEnv(); - static void preTickCallback(btDynamicsWorld*, btScalar); - static void postTickCallback(btDynamicsWorld*, btScalar); - static bool contactProcessedCallback(btManifoldPoint &, void *, void *); -}; \ No newline at end of file diff --git a/engine/src/bullet/native/nativeclasses.txt b/engine/src/bullet/native/nativeclasses.txt deleted file mode 100644 index cf6bcc6bb..000000000 --- a/engine/src/bullet/native/nativeclasses.txt +++ /dev/null @@ -1,6 +0,0 @@ -Classes that differ from the jbullet implementation: -- com.jme3.bullet.PhysicsSpace -- com.jme3.bullet.collision.PhysicsCollisionObject -- All classes in com.jme3.bullet.objects -- All classes in com.jme3.bullet.joints -- All classes in com.jme3.bullet.collision.shapes diff --git a/engine/src/bullet/nbproject/project.xml b/engine/src/bullet/nbproject/project.xml deleted file mode 100644 index 5f5eaf189..000000000 --- a/engine/src/bullet/nbproject/project.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - org.netbeans.modules.ant.freeform - - - - Bullet Native - - ../../build.xml - - - - - . - - - - java - . - - - - - - build-bullet-natives - - - - clean - - - - clean - build-bullet-natives - - - - run-bullet-native - - - - - - - . - - - ${ant.script} - - - - - - - - - - - - - - . - ../../dist/jMonkeyEngine3.jar - 1.5 - - - - diff --git a/engine/src/desktop/com/jme3/asset/AssetCache.java b/engine/src/desktop/com/jme3/asset/AssetCache.java deleted file mode 100644 index 5dde799e7..000000000 --- a/engine/src/desktop/com/jme3/asset/AssetCache.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset; - -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.WeakHashMap; - -/** - * An AssetCache allows storage of loaded resources in order - * to improve their access time if they are requested again in a short period - * of time. The AssetCache stores weak references to the resources, allowing - * Java's garbage collector to request deletion of rarely used resources - * when heap memory is low. - */ -public class AssetCache { - - public static final class SmartAssetInfo { - public WeakReference smartKey; - public Asset asset; - } - - private final WeakHashMap smartCache - = new WeakHashMap(); - private final HashMap regularCache = new HashMap(); - - /** - * Adds a resource to the cache. - *

- * Thread-safe. - * @see #getFromCache(java.lang.String) - */ - public void addToCache(AssetKey key, Object obj){ - synchronized (regularCache){ - if (obj instanceof Asset && key.useSmartCache()){ - // put in smart cache - Asset asset = (Asset) obj; - asset.setKey(null); // no circular references - SmartAssetInfo smartInfo = new SmartAssetInfo(); - smartInfo.asset = asset; - // use the original key as smart key - smartInfo.smartKey = new WeakReference(key); - smartCache.put(key, smartInfo); - }else{ - // put in regular cache - regularCache.put(key, obj); - } - } - } - - /** - * Delete an asset from the cache, returns true if it was deleted successfuly. - *

- * Thread-safe. - */ - public boolean deleteFromCache(AssetKey key){ - synchronized (regularCache){ - if (key.useSmartCache()){ - return smartCache.remove(key) != null; - }else{ - return regularCache.remove(key) != null; - } - } - } - - /** - * Gets an object from the cache given an asset key. - *

- * Thread-safe. - * @param key - * @return - */ - public Object getFromCache(AssetKey key){ - synchronized (regularCache){ - if (key.useSmartCache()) { - return smartCache.get(key).asset; - } else { - return regularCache.get(key); - } - } - } - - /** - * Retrieves smart asset info from the cache. - * @param key - * @return - */ - public SmartAssetInfo getFromSmartCache(AssetKey key){ - return smartCache.get(key); - } - - /** - * Deletes all the assets in the regular cache. - */ - public void deleteAllAssets(){ - synchronized (regularCache){ - regularCache.clear(); - smartCache.clear(); - } - } -} diff --git a/engine/src/desktop/com/jme3/asset/Desktop.cfg b/engine/src/desktop/com/jme3/asset/Desktop.cfg deleted file mode 100644 index 93dafb785..000000000 --- a/engine/src/desktop/com/jme3/asset/Desktop.cfg +++ /dev/null @@ -1,22 +0,0 @@ -LOCATOR / com.jme3.asset.plugins.ClasspathLocator - -LOADER com.jme3.texture.plugins.AWTLoader : jpg, bmp, gif, png, jpeg -LOADER com.jme3.audio.plugins.WAVLoader : wav -LOADER com.jme3.audio.plugins.OGGLoader : ogg -LOADER com.jme3.material.plugins.J3MLoader : j3m -LOADER com.jme3.material.plugins.J3MLoader : j3md -LOADER com.jme3.font.plugins.BitmapFontLoader : fnt -LOADER com.jme3.texture.plugins.DDSLoader : dds -LOADER com.jme3.texture.plugins.PFMLoader : pfm -LOADER com.jme3.texture.plugins.HDRLoader : hdr -LOADER com.jme3.texture.plugins.TGALoader : tga -LOADER com.jme3.export.binary.BinaryImporter : j3o -LOADER com.jme3.export.binary.BinaryImporter : j3f -LOADER com.jme3.scene.plugins.OBJLoader : obj -LOADER com.jme3.scene.plugins.MTLLoader : mtl -LOADER com.jme3.scene.plugins.ogre.MeshLoader : meshxml, mesh.xml -LOADER com.jme3.scene.plugins.ogre.SkeletonLoader : skeletonxml, skeleton.xml -LOADER com.jme3.scene.plugins.ogre.MaterialLoader : material -LOADER com.jme3.scene.plugins.ogre.SceneLoader : scene -LOADER com.jme3.scene.plugins.blender.BlenderModelLoader : blend -LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, glsl, glsllib \ No newline at end of file diff --git a/engine/src/desktop/com/jme3/asset/DesktopAssetManager.java b/engine/src/desktop/com/jme3/asset/DesktopAssetManager.java deleted file mode 100644 index e1c25abd6..000000000 --- a/engine/src/desktop/com/jme3/asset/DesktopAssetManager.java +++ /dev/null @@ -1,421 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset; - -import com.jme3.asset.AssetCache.SmartAssetInfo; -import com.jme3.audio.AudioKey; -import com.jme3.audio.AudioData; -import com.jme3.font.BitmapFont; -import com.jme3.material.Material; -import com.jme3.scene.Spatial; -import com.jme3.shader.Shader; -import com.jme3.shader.ShaderKey; -import com.jme3.texture.Texture; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * AssetManager is the primary method for managing and loading - * assets inside jME. - * - * @author Kirill Vainer - */ -public class DesktopAssetManager implements AssetManager { - - private static final Logger logger = Logger.getLogger(AssetManager.class.getName()); - - private final AssetCache cache = new AssetCache(); - private final ImplHandler handler = new ImplHandler(this); - - private AssetEventListener eventListener = null; - private List classLoaders; - -// private final ThreadingManager threadingMan = new ThreadingManager(this); -// private final Set alreadyLoadingSet = new HashSet(); - - public DesktopAssetManager(){ - this(null); - } - - @Deprecated - public DesktopAssetManager(boolean loadDefaults){ - this(Thread.currentThread().getContextClassLoader().getResource("com/jme3/asset/Desktop.cfg")); - } - - public DesktopAssetManager(URL configFile){ - if (configFile != null){ - InputStream stream = null; - try{ - AssetConfig cfg = new AssetConfig(this); - stream = configFile.openStream(); - cfg.loadText(stream); - }catch (IOException ex){ - logger.log(Level.SEVERE, "Failed to load asset config", ex); - }finally{ - if (stream != null) - try{ - stream.close(); - }catch (IOException ex){ - } - } - } - logger.info("DesktopAssetManager created."); - } - - public void addClassLoader(ClassLoader loader){ - if(classLoaders == null) - classLoaders = Collections.synchronizedList(new ArrayList()); - synchronized(classLoaders) { - classLoaders.add(loader); - } - } - - public void removeClassLoader(ClassLoader loader){ - if(classLoaders != null) synchronized(classLoaders) { - classLoaders.remove(loader); - } - } - - public List getClassLoaders(){ - return classLoaders; - } - - public void setAssetEventListener(AssetEventListener listener){ - eventListener = listener; - } - - public void registerLoader(Class loader, String ... extensions){ - handler.addLoader(loader, extensions); - if (logger.isLoggable(Level.FINER)){ - logger.log(Level.FINER, "Registered loader: {0} for extensions {1}", - new Object[]{loader.getSimpleName(), Arrays.toString(extensions)}); - } - } - - public void registerLoader(String clsName, String ... extensions){ - Class clazz = null; - try{ - clazz = (Class) Class.forName(clsName); - }catch (ClassNotFoundException ex){ - logger.log(Level.WARNING, "Failed to find loader: "+clsName, ex); - }catch (NoClassDefFoundError ex){ - logger.log(Level.WARNING, "Failed to find loader: "+clsName, ex); - } - if (clazz != null){ - registerLoader(clazz, extensions); - } - } - - public void registerLocator(String rootPath, Class locatorClass){ - handler.addLocator(locatorClass, rootPath); - if (logger.isLoggable(Level.FINER)){ - logger.log(Level.FINER, "Registered locator: {0}", - locatorClass.getSimpleName()); - } - } - - public void registerLocator(String rootPath, String clsName){ - Class clazz = null; - try{ - clazz = (Class) Class.forName(clsName); - }catch (ClassNotFoundException ex){ - logger.log(Level.WARNING, "Failed to find locator: "+clsName, ex); - }catch (NoClassDefFoundError ex){ - logger.log(Level.WARNING, "Failed to find loader: "+clsName, ex); - } - if (clazz != null){ - registerLocator(rootPath, clazz); - } - } - - public void unregisterLocator(String rootPath, Class clazz){ - handler.removeLocator(clazz, rootPath); - if (logger.isLoggable(Level.FINER)){ - logger.log(Level.FINER, "Unregistered locator: {0}", - clazz.getSimpleName()); - } - } - - public void clearCache(){ - cache.deleteAllAssets(); - } - - /** - * Delete an asset from the cache, returns true if it was deleted - * successfully. - *

- * Thread-safe. - */ - public boolean deleteFromCache(AssetKey key){ - return cache.deleteFromCache(key); - } - - /** - * Adds a resource to the cache. - *

- * Thread-safe. - */ - public void addToCache(AssetKey key, Object asset){ - cache.addToCache(key, asset); - } - - public AssetInfo locateAsset(AssetKey key){ - if (handler.getLocatorCount() == 0){ - logger.warning("There are no locators currently"+ - " registered. Use AssetManager."+ - "registerLocator() to register a"+ - " locator."); - return null; - } - - AssetInfo info = handler.tryLocate(key); - if (info == null){ - logger.log(Level.WARNING, "Cannot locate resource: {0}", key); - } - - return info; - } - - /** - * Thread-safe. - * - * @param - * @param key - * @return - */ - public T loadAsset(AssetKey key){ - if (key == null) - throw new IllegalArgumentException("key cannot be null"); - - if (eventListener != null) - eventListener.assetRequested(key); - - AssetKey smartKey = null; - Object o = null; - if (key.shouldCache()){ - if (key.useSmartCache()){ - SmartAssetInfo smartInfo = cache.getFromSmartCache(key); - if (smartInfo != null){ - smartKey = smartInfo.smartKey.get(); - if (smartKey != null){ - o = smartInfo.asset; - } - } - }else{ - o = cache.getFromCache(key); - } - } - if (o == null){ - AssetLoader loader = handler.aquireLoader(key); - if (loader == null){ - throw new IllegalStateException("No loader registered for type \"" + - key.getExtension() + "\""); - } - - if (handler.getLocatorCount() == 0){ - throw new IllegalStateException("There are no locators currently"+ - " registered. Use AssetManager."+ - "registerLocator() to register a"+ - " locator."); - } - - AssetInfo info = handler.tryLocate(key); - if (info == null){ - if (handler.getParentKey() != null && eventListener != null){ - // Inform event listener that an asset has failed to load. - // If the parent AssetLoader chooses not to propagate - // the exception, this is the only means of finding - // that something went wrong. - eventListener.assetDependencyNotFound(handler.getParentKey(), key); - } - throw new AssetNotFoundException(key.toString()); - } - - try { - handler.establishParentKey(key); - o = loader.load(info); - } catch (IOException ex) { - throw new AssetLoadException("An exception has occured while loading asset: " + key, ex); - } finally { - handler.releaseParentKey(key); - } - if (o == null){ - throw new AssetLoadException("Error occured while loading asset \"" + key + "\" using" + loader.getClass().getSimpleName()); - }else{ - if (logger.isLoggable(Level.FINER)){ - logger.log(Level.FINER, "Loaded {0} with {1}", - new Object[]{key, loader.getClass().getSimpleName()}); - } - - // do processing on asset before caching - o = key.postProcess(o); - - if (key.shouldCache()) - cache.addToCache(key, o); - - if (eventListener != null) - eventListener.assetLoaded(key); - } - } - - // object o is the asset - // create an instance for user - T clone = (T) key.createClonedInstance(o); - - if (key.useSmartCache()){ - if (smartKey != null){ - // smart asset was already cached, use original key - ((Asset)clone).setKey(smartKey); - }else{ - // smart asset was cached on this call, use our key - ((Asset)clone).setKey(key); - } - } - - return clone; - } - - public Object loadAsset(String name){ - return loadAsset(new AssetKey(name)); - } - - /** - * Loads a texture. - * - * @return - */ - public Texture loadTexture(TextureKey key){ - return (Texture) loadAsset(key); - } - - public Material loadMaterial(String name){ - return (Material) loadAsset(new MaterialKey(name)); - } - - /** - * Loads a texture. - * - * @param name - * @param generateMipmaps Enable if applying texture to 3D objects, disable - * for GUI/HUD elements. - * @return - */ - public Texture loadTexture(String name, boolean generateMipmaps){ - TextureKey key = new TextureKey(name, true); - key.setGenerateMips(generateMipmaps); - key.setAsCube(false); - return loadTexture(key); - } - - public Texture loadTexture(String name, boolean generateMipmaps, boolean flipY, boolean asCube, int aniso){ - TextureKey key = new TextureKey(name, flipY); - key.setGenerateMips(generateMipmaps); - key.setAsCube(asCube); - key.setAnisotropy(aniso); - return loadTexture(key); - } - - public Texture loadTexture(String name){ - return loadTexture(name, true); - } - - public AudioData loadAudio(AudioKey key){ - return (AudioData) loadAsset(key); - } - - public AudioData loadAudio(String name){ - return loadAudio(new AudioKey(name, false)); - } - - /** - * Loads a bitmap font with the given name. - * - * @param name - * @return - */ - public BitmapFont loadFont(String name){ - return (BitmapFont) loadAsset(new AssetKey(name)); - } - - public InputStream loadGLSLLibrary(AssetKey key){ - return (InputStream) loadAsset(key); - } - - /** - * Load a vertex/fragment shader combo. - * - * @param key - * @return - */ - public Shader loadShader(ShaderKey key){ - // cache abuse in method - // that doesn't use loaders/locators - Shader s = (Shader) cache.getFromCache(key); - if (s == null){ - String vertName = key.getVertName(); - String fragName = key.getFragName(); - - String vertSource = (String) loadAsset(new AssetKey(vertName)); - String fragSource = (String) loadAsset(new AssetKey(fragName)); - - s = new Shader(key.getLanguage()); - s.addSource(Shader.ShaderType.Vertex, vertName, vertSource, key.getDefines().getCompiled()); - s.addSource(Shader.ShaderType.Fragment, fragName, fragSource, key.getDefines().getCompiled()); - - cache.addToCache(key, s); - } - return s; - } - - public Spatial loadModel(ModelKey key){ - return (Spatial) loadAsset(key); - } - - /** - * Load a model. - * - * @param name - * @return - */ - public Spatial loadModel(String name){ - return loadModel(new ModelKey(name)); - } - -} diff --git a/engine/src/desktop/com/jme3/asset/ImplHandler.java b/engine/src/desktop/com/jme3/asset/ImplHandler.java deleted file mode 100644 index 6362ac865..000000000 --- a/engine/src/desktop/com/jme3/asset/ImplHandler.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * ImplHandler manages the asset loader and asset locator - * implementations in a thread safe way. This allows implementations - * which store local persistent data to operate with a multi-threaded system. - * This is done by keeping an instance of each asset loader and asset - * locator object in a thread local. - */ -public class ImplHandler { - - private static final Logger logger = Logger.getLogger(ImplHandler.class.getName()); - - private final AssetManager owner; - - private final ThreadLocal parentAssetKey - = new ThreadLocal(); - - private final ArrayList genericLocators = - new ArrayList(); - - private final HashMap loaders = - new HashMap(); - - public ImplHandler(AssetManager owner){ - this.owner = owner; - } - - protected class ImplThreadLocal extends ThreadLocal { - - private final Class type; - private final String path; - - public ImplThreadLocal(Class type){ - this.type = type; - path = null; - } - - public ImplThreadLocal(Class type, String path){ - this.type = type; - this.path = path; - } - - public String getPath() { - return path; - } - - public Class getTypeClass(){ - return type; - } - - @Override - protected Object initialValue(){ - try { - return type.newInstance(); - } catch (InstantiationException ex) { - logger.log(Level.SEVERE,"Cannot create locator of type {0}, does" - + " the class have an empty and publically accessible"+ - " constructor?", type.getName()); - logger.throwing(type.getName(), "", ex); - } catch (IllegalAccessException ex) { - logger.log(Level.SEVERE,"Cannot create locator of type {0}, " - + "does the class have an empty and publically " - + "accessible constructor?", type.getName()); - logger.throwing(type.getName(), "", ex); - } - return null; - } - } - - /** - * Establishes the asset key that is used for tracking dependent assets - * that have failed to load. When set, the {@link DesktopAssetManager} - * gets a hint that it should suppress {@link AssetNotFoundException}s - * and instead call the listener callback (if set). - * - * @param key The parent key - */ - public void establishParentKey(AssetKey parentKey){ - if (parentAssetKey.get() == null){ - parentAssetKey.set(parentKey); - } - } - - public void releaseParentKey(AssetKey parentKey){ - if (parentAssetKey.get() == parentKey){ - parentAssetKey.set(null); - } - } - - public AssetKey getParentKey(){ - return parentAssetKey.get(); - } - - /** - * Attempts to locate the given resource name. - * @param name The full name of the resource. - * @return The AssetInfo containing resource information required for - * access, or null if not found. - */ - public AssetInfo tryLocate(AssetKey key){ - synchronized (genericLocators){ - if (genericLocators.isEmpty()) - return null; - - for (ImplThreadLocal local : genericLocators){ - AssetLocator locator = (AssetLocator) local.get(); - if (local.getPath() != null){ - locator.setRootPath((String) local.getPath()); - } - AssetInfo info = locator.locate(owner, key); - if (info != null) - return info; - } - } - return null; - } - - public int getLocatorCount(){ - synchronized (genericLocators){ - return genericLocators.size(); - } - } - - /** - * Returns the AssetLoader registered for the given extension - * of the current thread. - * @return AssetLoader registered with addLoader. - */ - public AssetLoader aquireLoader(AssetKey key){ - synchronized (loaders){ - ImplThreadLocal local = loaders.get(key.getExtension()); - if (local != null){ - AssetLoader loader = (AssetLoader) local.get(); - return loader; - } - return null; - } - } - - public void addLoader(final Class loaderType, String ... extensions){ - ImplThreadLocal local = new ImplThreadLocal(loaderType); - for (String extension : extensions){ - extension = extension.toLowerCase(); - synchronized (loaders){ - loaders.put(extension, local); - } - } - } - - public void addLocator(final Class locatorType, String rootPath){ - ImplThreadLocal local = new ImplThreadLocal(locatorType, rootPath); - synchronized (genericLocators){ - genericLocators.add(local); - } - } - - public void removeLocator(final Class locatorType, String rootPath){ - synchronized (genericLocators){ - Iterator it = genericLocators.iterator(); - while (it.hasNext()){ - ImplThreadLocal locator = it.next(); - if (locator.getPath().equals(rootPath) && - locator.getTypeClass().equals(locatorType)){ - it.remove(); - } - } - } - } - -} diff --git a/engine/src/desktop/com/jme3/asset/ThreadingManager.java b/engine/src/desktop/com/jme3/asset/ThreadingManager.java deleted file mode 100644 index 6ed2c742e..000000000 --- a/engine/src/desktop/com/jme3/asset/ThreadingManager.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; - -/** - * ThreadingManager manages the threads used to load content - * within the Content Manager system. A pool of threads and a task queue - * is used to load resource data and perform I/O while the application's - * render thread is active. - */ -public class ThreadingManager { - - protected final ExecutorService executor = - Executors.newFixedThreadPool(2, - new LoadingThreadFactory()); - - protected final AssetManager owner; - - protected int nextThreadId = 0; - - public ThreadingManager(AssetManager owner){ - this.owner = owner; - } - - protected class LoadingThreadFactory implements ThreadFactory { - public Thread newThread(Runnable r) { - Thread t = new Thread(r, "pool" + (nextThreadId++)); - t.setDaemon(true); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } - } - - protected class LoadingTask implements Callable { - private final String resourceName; - public LoadingTask(String resourceName){ - this.resourceName = resourceName; - } - public Object call() throws Exception { - return owner.loadAsset(new AssetKey(resourceName)); - } - } - -// protected class MultiLoadingTask implements Callable { -// private final String[] resourceNames; -// public MultiLoadingTask(String[] resourceNames){ -// this.resourceNames = resourceNames; -// } -// public Void call(){ -// owner.loadContents(resourceNames); -// return null; -// } -// } - -// public Future loadContents(String ... names){ -// return executor.submit(new MultiLoadingTask(names)); -// } - -// public Future loadContent(String name) { -// return executor.submit(new LoadingTask(name)); -// } - - public static boolean isLoadingThread() { - return Thread.currentThread().getName().startsWith("pool"); - } - - -} diff --git a/engine/src/desktop/com/jme3/asset/plugins/ClasspathLocator.java b/engine/src/desktop/com/jme3/asset/plugins/ClasspathLocator.java deleted file mode 100644 index d4c84e479..000000000 --- a/engine/src/desktop/com/jme3/asset/plugins/ClasspathLocator.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.plugins; - -import com.jme3.asset.AssetInfo; -import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetLoadException; -import com.jme3.asset.AssetLocator; -import com.jme3.asset.AssetManager; -import com.jme3.asset.AssetNotFoundException; -import com.jme3.system.JmeSystem; -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.logging.Logger; - -/** - * The ClasspathLocator looks up an asset in the classpath. - * @author Kirill Vainer - */ -public class ClasspathLocator implements AssetLocator { - - private static final Logger logger = Logger.getLogger(ClasspathLocator.class.getName()); - private String root = ""; - - public ClasspathLocator(){ - } - - public void setRootPath(String rootPath) { - this.root = rootPath; - if (root.equals("/")) - root = ""; - else if (root.length() > 1){ - if (root.startsWith("/")){ - root = root.substring(1); - } - if (!root.endsWith("/")) - root += "/"; - } - } - - public AssetInfo locate(AssetManager manager, AssetKey key) { - URL url; - String name = key.getName(); - if (name.startsWith("/")) - name = name.substring(1); - - name = root + name; -// if (!name.startsWith(root)){ -// name = root + name; -// } - - if (JmeSystem.isLowPermissions()){ - url = ClasspathLocator.class.getResource("/" + name); - }else{ - url = Thread.currentThread().getContextClassLoader().getResource(name); - } - if (url == null) - return null; - - if (url.getProtocol().equals("file")){ - try { - String path = new File(url.toURI()).getCanonicalPath(); - - // convert to / for windows - if (File.separatorChar == '\\'){ - path = path.replace('\\', '/'); - } - - // compare path - if (!path.endsWith(name)){ - throw new AssetNotFoundException("Asset name doesn't match requirements.\n"+ - "\"" + path + "\" doesn't match \"" + name + "\""); - } - } catch (URISyntaxException ex) { - throw new AssetLoadException("Error converting URL to URI", ex); - } catch (IOException ex){ - throw new AssetLoadException("Failed to get canonical path for " + url, ex); - } - } - - try{ - return UrlAssetInfo.create(manager, key, url); - }catch (IOException ex){ - // This is different handling than URL locator - // since classpath locating would return null at the getResource() - // call, otherwise there's a more critical error... - throw new AssetLoadException("Failed to read URL " + url, ex); - } - } -} diff --git a/engine/src/desktop/com/jme3/asset/plugins/FileLocator.java b/engine/src/desktop/com/jme3/asset/plugins/FileLocator.java deleted file mode 100644 index be5aa1fb4..000000000 --- a/engine/src/desktop/com/jme3/asset/plugins/FileLocator.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.plugins; - -import com.jme3.asset.AssetInfo; -import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetLoadException; -import com.jme3.asset.AssetLocator; -import com.jme3.asset.AssetManager; -import com.jme3.asset.AssetNotFoundException; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - -/** - * FileLocator allows you to specify a folder where to - * look for assets. - * @author Kirill Vainer - */ -public class FileLocator implements AssetLocator { - - private File root; - - public void setRootPath(String rootPath) { - if (rootPath == null) - throw new NullPointerException(); - - try { - root = new File(rootPath).getCanonicalFile(); - if (!root.isDirectory()){ - throw new IllegalArgumentException("Given root path \"" + root + "\" not a directory"); - } - } catch (IOException ex) { - throw new AssetLoadException("Root path is invalid", ex); - } - } - - private static class AssetInfoFile extends AssetInfo { - - private File file; - - public AssetInfoFile(AssetManager manager, AssetKey key, File file){ - super(manager, key); - this.file = file; - } - - @Override - public InputStream openStream() { - try{ - return new FileInputStream(file); - }catch (FileNotFoundException ex){ - // NOTE: Can still happen even if file.exists() is true, e.g. - // permissions issue and similar - throw new AssetLoadException("Failed to open file: " + file, ex); - } - } - } - - public AssetInfo locate(AssetManager manager, AssetKey key) { - String name = key.getName(); - File file = new File(root, name); - if (file.exists() && file.isFile()){ - try { - // Now, check asset name requirements - String canonical = file.getCanonicalPath(); - String absolute = file.getAbsolutePath(); - if (!canonical.endsWith(absolute)){ - throw new AssetNotFoundException("Asset name doesn't match requirements.\n"+ - "\"" + canonical + "\" doesn't match \"" + absolute + "\""); - } - } catch (IOException ex) { - throw new AssetLoadException("Failed to get file canonical path " + file, ex); - } - - return new AssetInfoFile(manager, key, file); - }else{ - return null; - } - } - -} diff --git a/engine/src/desktop/com/jme3/asset/plugins/HttpZipLocator.java b/engine/src/desktop/com/jme3/asset/plugins/HttpZipLocator.java deleted file mode 100644 index f5fbfd13c..000000000 --- a/engine/src/desktop/com/jme3/asset/plugins/HttpZipLocator.java +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.plugins; - -import com.jme3.asset.AssetInfo; -import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetLocator; -import com.jme3.asset.AssetManager; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.Charset; -import java.nio.charset.CharsetDecoder; -import java.nio.charset.CoderResult; -import java.util.HashMap; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.zip.Inflater; -import java.util.zip.InflaterInputStream; -import java.util.zip.ZipEntry; - -public class HttpZipLocator implements AssetLocator { - - private static final Logger logger = Logger.getLogger(HttpZipLocator.class.getName()); - - private URL zipUrl; - private String rootPath = ""; - private int numEntries; - private int tableOffset; - private int tableLength; - private HashMap entries; - - private static final ByteBuffer byteBuf = ByteBuffer.allocate(250); - private static final CharBuffer charBuf = CharBuffer.allocate(250); - private static final CharsetDecoder utf8Decoder; - - static { - Charset utf8 = Charset.forName("UTF-8"); - utf8Decoder = utf8.newDecoder(); - } - - private static class ZipEntry2 { - String name; - int length; - int offset; - int compSize; - long crc; - boolean deflate; - - @Override - public String toString(){ - return "ZipEntry[name=" + name + - ", length=" + length + - ", compSize=" + compSize + - ", offset=" + offset + "]"; - } - } - - private static int get16(byte[] b, int off) { - return (b[off++] & 0xff) | - ((b[off] & 0xff) << 8); - } - - private static int get32(byte[] b, int off) { - return (b[off++] & 0xff) | - ((b[off++] & 0xff) << 8) | - ((b[off++] & 0xff) << 16) | - ((b[off] & 0xff) << 24); - } - - private static long getu32(byte[] b, int off) throws IOException{ - return (b[off++]&0xff) | - ((b[off++]&0xff) << 8) | - ((b[off++]&0xff) << 16) | - (((long)(b[off]&0xff)) << 24); - } - - private static String getUTF8String(byte[] b, int off, int len) throws CharacterCodingException { - StringBuilder sb = new StringBuilder(); - - int read = 0; - while (read < len){ - // Either read n remaining bytes in b or 250 if n is higher. - int toRead = Math.min(len - read, byteBuf.capacity()); - - boolean endOfInput = toRead < byteBuf.capacity(); - - // read 'toRead' bytes into byteBuf - byteBuf.put(b, off + read, toRead); - - // set limit to position and set position to 0 - // so data can be decoded - byteBuf.flip(); - - // decode data in byteBuf - CoderResult result = utf8Decoder.decode(byteBuf, charBuf, endOfInput); - - // if the result is not an underflow its an error - // that cannot be handled. - // if the error is an underflow and its the end of input - // then the decoder expects more bytes but there are no more => error - if (!result.isUnderflow() || !endOfInput){ - result.throwException(); - } - - // flip the char buf to get the string just decoded - charBuf.flip(); - - // append the decoded data into the StringBuilder - sb.append(charBuf.toString()); - - // clear buffers for next use - byteBuf.clear(); - charBuf.clear(); - - read += toRead; - } - - return sb.toString(); - } - - private InputStream readData(int offset, int length) throws IOException{ - HttpURLConnection conn = (HttpURLConnection) zipUrl.openConnection(); - conn.setDoOutput(false); - conn.setUseCaches(false); - conn.setInstanceFollowRedirects(false); - String range = "-"; - if (offset != Integer.MAX_VALUE){ - range = offset + range; - } - if (length != Integer.MAX_VALUE){ - if (offset != Integer.MAX_VALUE){ - range = range + (offset + length - 1); - }else{ - range = range + length; - } - } - - conn.setRequestProperty("Range", "bytes=" + range); - conn.connect(); - if (conn.getResponseCode() == HttpURLConnection.HTTP_PARTIAL){ - return conn.getInputStream(); - }else if (conn.getResponseCode() == HttpURLConnection.HTTP_OK){ - throw new IOException("Your server does not support HTTP feature Content-Range. Please contact your server administrator."); - }else{ - throw new IOException(conn.getResponseCode() + " " + conn.getResponseMessage()); - } - } - - private int readTableEntry(byte[] table, int offset) throws IOException{ - if (get32(table, offset) != ZipEntry.CENSIG){ - throw new IOException("Central directory error, expected 'PK12'"); - } - - int nameLen = get16(table, offset + ZipEntry.CENNAM); - int extraLen = get16(table, offset + ZipEntry.CENEXT); - int commentLen = get16(table, offset + ZipEntry.CENCOM); - int newOffset = offset + ZipEntry.CENHDR + nameLen + extraLen + commentLen; - - int flags = get16(table, offset + ZipEntry.CENFLG); - if ((flags & 1) == 1){ - // ignore this entry, it uses encryption - return newOffset; - } - - int method = get16(table, offset + ZipEntry.CENHOW); - if (method != ZipEntry.DEFLATED && method != ZipEntry.STORED){ - // ignore this entry, it uses unknown compression method - return newOffset; - } - - String name = getUTF8String(table, offset + ZipEntry.CENHDR, nameLen); - if (name.charAt(name.length()-1) == '/'){ - // ignore this entry, it is directory node - // or it has no name (?) - return newOffset; - } - - ZipEntry2 entry = new ZipEntry2(); - entry.name = name; - entry.deflate = (method == ZipEntry.DEFLATED); - entry.crc = getu32(table, offset + ZipEntry.CENCRC); - entry.length = get32(table, offset + ZipEntry.CENLEN); - entry.compSize = get32(table, offset + ZipEntry.CENSIZ); - entry.offset = get32(table, offset + ZipEntry.CENOFF); - - // we want offset directly into file data .. - // move the offset forward to skip the LOC header - entry.offset += ZipEntry.LOCHDR + nameLen + extraLen; - - entries.put(entry.name, entry); - - return newOffset; - } - - private void fillByteArray(byte[] array, InputStream source) throws IOException{ - int total = 0; - int length = array.length; - while (total < length) { - int read = source.read(array, total, length - total); - if (read < 0) - throw new IOException("Failed to read entire array"); - - total += read; - } - } - - private void readCentralDirectory() throws IOException{ - InputStream in = readData(tableOffset, tableLength); - byte[] header = new byte[tableLength]; - - // Fix for "PK12 bug in town.zip": sometimes - // not entire byte array will be read with InputStream.read() - // (especially for big headers) - fillByteArray(header, in); - -// in.read(header); - in.close(); - - entries = new HashMap(numEntries); - int offset = 0; - for (int i = 0; i < numEntries; i++){ - offset = readTableEntry(header, offset); - } - } - - private void readEndHeader() throws IOException{ - -// InputStream in = readData(Integer.MAX_VALUE, ZipEntry.ENDHDR); -// byte[] header = new byte[ZipEntry.ENDHDR]; -// fillByteArray(header, in); -// in.close(); -// -// if (get32(header, 0) != ZipEntry.ENDSIG){ -// throw new IOException("End header error, expected 'PK56'"); -// } - - // Fix for "PK56 bug in town.zip": - // If there's a zip comment inside the end header, - // PK56 won't appear in the -22 position relative to the end of the - // file! - // In that case, we have to search for it. - // Increase search space to 200 bytes - - InputStream in = readData(Integer.MAX_VALUE, 200); - byte[] header = new byte[200]; - fillByteArray(header, in); - in.close(); - - int offset = -1; - for (int i = 200 - 22; i >= 0; i--){ - if (header[i] == (byte) (ZipEntry.ENDSIG & 0xff) - && get32(header, i) == ZipEntry.ENDSIG){ - // found location - offset = i; - break; - } - } - if (offset == -1) - throw new IOException("Cannot find Zip End Header in file!"); - - numEntries = get16(header, offset + ZipEntry.ENDTOT); - tableLength = get32(header, offset + ZipEntry.ENDSIZ); - tableOffset = get32(header, offset + ZipEntry.ENDOFF); - } - - public void load(URL url) throws IOException { - if (!url.getProtocol().equals("http")) - throw new UnsupportedOperationException(); - - zipUrl = url; - readEndHeader(); - readCentralDirectory(); - } - - private InputStream openStream(ZipEntry2 entry) throws IOException{ - InputStream in = readData(entry.offset, entry.compSize); - if (entry.deflate){ - return new InflaterInputStream(in, new Inflater(true)); - } - return in; - } - - public InputStream openStream(String name) throws IOException{ - ZipEntry2 entry = entries.get(name); - if (entry == null) - throw new RuntimeException("Entry not found: "+name); - - return openStream(entry); - } - - public void setRootPath(String path){ - if (!rootPath.equals(path)){ - rootPath = path; - try { - load(new URL(path)); - } catch (IOException ex) { - logger.log(Level.WARNING, "Failed to set root path "+path, ex); - } - } - } - - public AssetInfo locate(AssetManager manager, AssetKey key){ - final ZipEntry2 entry = entries.get(key.getName()); - if (entry == null) - return null; - - return new AssetInfo(manager, key){ - @Override - public InputStream openStream() { - try { - return HttpZipLocator.this.openStream(entry); - } catch (IOException ex) { - logger.log(Level.WARNING, "Error retrieving "+entry.name, ex); - return null; - } - } - }; - } - -} diff --git a/engine/src/desktop/com/jme3/asset/plugins/UrlAssetInfo.java b/engine/src/desktop/com/jme3/asset/plugins/UrlAssetInfo.java deleted file mode 100644 index a9494a27f..000000000 --- a/engine/src/desktop/com/jme3/asset/plugins/UrlAssetInfo.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jme3.asset.plugins; - -import com.jme3.asset.AssetInfo; -import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetLoadException; -import com.jme3.asset.AssetManager; -import com.jme3.asset.AssetNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; - -/** - * Handles loading of assets from a URL - * - * @author Kirill Vainer - */ -public class UrlAssetInfo extends AssetInfo { - - private URL url; - private InputStream in; - - public static UrlAssetInfo create(AssetManager assetManager, AssetKey key, URL url) throws IOException { - // Check if URL can be reached. This will throw - // IOException which calling code will handle. - URLConnection conn = url.openConnection(); - conn.setUseCaches(false); - InputStream in = conn.getInputStream(); - - // For some reason url cannot be reached? - if (in == null){ - return null; - }else{ - return new UrlAssetInfo(assetManager, key, url, in); - } - } - - private UrlAssetInfo(AssetManager assetManager, AssetKey key, URL url, InputStream in) throws IOException { - super(assetManager, key); - this.url = url; - this.in = in; - } - - public boolean hasInitialConnection(){ - return in != null; - } - - @Override - public InputStream openStream() { - if (in != null){ - // Reuse the already existing stream (only once) - InputStream in2 = in; - in = null; - return in2; - }else{ - // Create a new stream for subsequent invocations. - try { - URLConnection conn = url.openConnection(); - conn.setUseCaches(false); - return conn.getInputStream(); - } catch (IOException ex) { - throw new AssetLoadException("Failed to read URL " + url, ex); - } - } - } -} diff --git a/engine/src/desktop/com/jme3/asset/plugins/UrlLocator.java b/engine/src/desktop/com/jme3/asset/plugins/UrlLocator.java deleted file mode 100644 index 9c7ac5701..000000000 --- a/engine/src/desktop/com/jme3/asset/plugins/UrlLocator.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.plugins; - -import com.jme3.asset.*; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * UrlLocator is a locator that combines a root URL - * and the given path in the AssetKey to construct a new URL - * that allows locating the asset. - * @author Kirill Vainer - */ -public class UrlLocator implements AssetLocator { - - private static final Logger logger = Logger.getLogger(UrlLocator.class.getName()); - private URL root; - - public void setRootPath(String rootPath) { - try { - this.root = new URL(rootPath); - } catch (MalformedURLException ex) { - throw new IllegalArgumentException("Invalid rootUrl specified", ex); - } - } - - public AssetInfo locate(AssetManager manager, AssetKey key) { - String name = key.getName(); - try{ - //TODO: remove workaround for SDK -// URL url = new URL(root, name); - if(name.startsWith("/")){ - name = name.substring(1); - } - URL url = new URL(root.toExternalForm() + name); - return UrlAssetInfo.create(manager, key, url); - }catch (FileNotFoundException e){ - return null; - }catch (IOException ex){ - logger.log(Level.WARNING, "Error while locating " + name, ex); - return null; - } - } - - -} diff --git a/engine/src/desktop/com/jme3/asset/plugins/ZipLocator.java b/engine/src/desktop/com/jme3/asset/plugins/ZipLocator.java deleted file mode 100644 index 499ca9371..000000000 --- a/engine/src/desktop/com/jme3/asset/plugins/ZipLocator.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.plugins; - -import com.jme3.asset.AssetInfo; -import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetLoadException; -import com.jme3.asset.AssetLocator; -import com.jme3.asset.AssetManager; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.logging.Logger; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -/** - * ZipLocator is a locator that looks up resources in a .ZIP file. - * @author Kirill Vainer - */ -public class ZipLocator implements AssetLocator { - - private ZipFile zipfile; - private static final Logger logger = Logger.getLogger(ZipLocator.class.getName()); - - private class JarAssetInfo extends AssetInfo { - - private final ZipEntry entry; - - public JarAssetInfo(AssetManager manager, AssetKey key, ZipEntry entry){ - super(manager, key); - this.entry = entry; - } - - public InputStream openStream(){ - try{ - return zipfile.getInputStream(entry); - }catch (IOException ex){ - throw new AssetLoadException("Failed to load zip entry: "+entry, ex); - } - } - } - - public void setRootPath(String rootPath) { - try{ - zipfile = new ZipFile(new File(rootPath), ZipFile.OPEN_READ); - }catch (IOException ex){ - throw new AssetLoadException("Failed to open zip file: " + rootPath, ex); - } - } - - public AssetInfo locate(AssetManager manager, AssetKey key) { - String name = key.getName(); - ZipEntry entry = zipfile.getEntry(name); - if (entry == null) - return null; - - return new JarAssetInfo(manager, key, entry); - } - -} diff --git a/engine/src/games/jme3game/cubefield/CubeField.java b/engine/src/games/jme3game/cubefield/CubeField.java deleted file mode 100644 index 4c287de33..000000000 --- a/engine/src/games/jme3game/cubefield/CubeField.java +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package jme3game.cubefield; - -import java.util.ArrayList; - -import com.jme3.app.SimpleApplication; -import com.jme3.bounding.BoundingVolume; -import com.jme3.font.BitmapFont; -import com.jme3.font.BitmapText; -import com.jme3.input.KeyInput; -import com.jme3.input.controls.AnalogListener; -import com.jme3.input.controls.KeyTrigger; -import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial.CullHint; -import com.jme3.scene.shape.Box; -import com.jme3.scene.shape.Dome; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author Kyle "bonechilla" Williams - */ -public class CubeField extends SimpleApplication implements AnalogListener { - - public static void main(String[] args) { - CubeField app = new CubeField(); - app.start(); - } - - private BitmapFont defaultFont; - - private boolean START; - private int difficulty, Score, colorInt, highCap, lowCap,diffHelp; - private Node player; - private Geometry fcube; - private ArrayList cubeField; - private ArrayList obstacleColors; - private float speed, coreTime,coreTime2; - private float camAngle = 0; - private BitmapText fpsScoreText, pressStart; - - private boolean solidBox = true; - private Material playerMaterial; - private Material floorMaterial; - - private float fpsRate = 1000f / 1f; - - /** - * Initializes game - */ - @Override - public void simpleInitApp() { - Logger.getLogger("com.jme3").setLevel(Level.WARNING); - - flyCam.setEnabled(false); - statsView.setCullHint(CullHint.Always); - - Keys(); - - defaultFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); - pressStart = new BitmapText(defaultFont, false); - fpsScoreText = new BitmapText(defaultFont, false); - - loadText(fpsScoreText, "Current Score: 0", defaultFont, 0, 2, 0); - loadText(pressStart, "PRESS ENTER", defaultFont, 0, 5, 0); - - player = createPlayer(); - rootNode.attachChild(player); - cubeField = new ArrayList(); - obstacleColors = new ArrayList(); - - gameReset(); - } - /** - * Used to reset cubeField - */ - private void gameReset(){ - Score = 0; - lowCap = 10; - colorInt = 0; - highCap = 40; - difficulty = highCap; - - for (Geometry cube : cubeField){ - cube.removeFromParent(); - } - cubeField.clear(); - - if (fcube != null){ - fcube.removeFromParent(); - } - fcube = createFirstCube(); - - obstacleColors.clear(); - obstacleColors.add(ColorRGBA.Orange); - obstacleColors.add(ColorRGBA.Red); - obstacleColors.add(ColorRGBA.Yellow); - renderer.setBackgroundColor(ColorRGBA.White); - speed = lowCap / 400f; - coreTime = 20.0f; - coreTime2 = 10.0f; - diffHelp=lowCap; - player.setLocalTranslation(0,0,0); - } - - @Override - public void simpleUpdate(float tpf) { - camTakeOver(tpf); - if (START){ - gameLogic(tpf); - } - colorLogic(); - } - /** - * Forcefully takes over Camera adding functionality and placing it behind the character - * @param tpf Tickes Per Frame - */ - private void camTakeOver(float tpf) { - cam.setLocation(player.getLocalTranslation().add(-8, 2, 0)); - cam.lookAt(player.getLocalTranslation(), Vector3f.UNIT_Y); - - Quaternion rot = new Quaternion(); - rot.fromAngleNormalAxis(camAngle, Vector3f.UNIT_Z); - cam.setRotation(cam.getRotation().mult(rot)); - camAngle *= FastMath.pow(.99f, fpsRate * tpf); - } - - @Override - public void requestClose(boolean esc) { - if (!esc){ - System.out.println("The game was quit."); - }else{ - System.out.println("Player has Collided. Final Score is " + Score); - } - context.destroy(false); - } - /** - * Randomly Places a cube on the map between 30 and 90 paces away from player - */ - private void randomizeCube() { - Geometry cube = fcube.clone(); - int playerX = (int) player.getLocalTranslation().getX(); - int playerZ = (int) player.getLocalTranslation().getZ(); -// float x = FastMath.nextRandomInt(playerX + difficulty + 10, playerX + difficulty + 150); - float x = FastMath.nextRandomInt(playerX + difficulty + 30, playerX + difficulty + 90); - float z = FastMath.nextRandomInt(playerZ - difficulty - 50, playerZ + difficulty + 50); - cube.getLocalTranslation().set(x, 0, z); - -// playerX+difficulty+30,playerX+difficulty+90 - - Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - if (!solidBox){ - mat.getAdditionalRenderState().setWireframe(true); - } - mat.setColor("Color", obstacleColors.get(FastMath.nextRandomInt(0, obstacleColors.size() - 1))); - cube.setMaterial(mat); - - rootNode.attachChild(cube); - cubeField.add(cube); - } - - private Geometry createFirstCube() { - Vector3f loc = player.getLocalTranslation(); - loc.addLocal(4, 0, 0); - Box b = new Box(loc, 1, 1, 1); - - Geometry geom = new Geometry("Box", b); - Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - mat.setColor("Color", ColorRGBA.Blue); - geom.setMaterial(mat); - - return geom; - } - - private Node createPlayer() { - Dome b = new Dome(Vector3f.ZERO, 10, 100, 1); - Geometry playerMesh = new Geometry("Box", b); - - playerMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - playerMaterial.setColor("Color", ColorRGBA.Red); - playerMesh.setMaterial(playerMaterial); - playerMesh.setName("player"); - - Box floor = new Box(Vector3f.ZERO.add(playerMesh.getLocalTranslation().getX(), - playerMesh.getLocalTranslation().getY() - 1, 0), 100, 0, 100); - Geometry floorMesh = new Geometry("Box", floor); - - floorMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - floorMaterial.setColor("Color", ColorRGBA.LightGray); - floorMesh.setMaterial(floorMaterial); - floorMesh.setName("floor"); - - Node playerNode = new Node(); - playerNode.attachChild(playerMesh); - playerNode.attachChild(floorMesh); - - return playerNode; - } - - /** - * If Game is Lost display Score and Reset the Game - */ - private void gameLost(){ - START = false; - loadText(pressStart, "You lost! Press enter to try again.", defaultFont, 0, 5, 0); - gameReset(); - } - - /** - * Core Game Logic - */ - private void gameLogic(float tpf){ - //Subtract difficulty level in accordance to speed every 10 seconds - if(timer.getTimeInSeconds()>=coreTime2){ - coreTime2=timer.getTimeInSeconds()+10; - if(difficulty<=lowCap){ - difficulty=lowCap; - } - else if(difficulty>lowCap){ - difficulty-=5; - diffHelp+=1; - } - } - - if(speed<.1f){ - speed+=.000001f*tpf*fpsRate; - } - - player.move(speed * tpf * fpsRate, 0, 0); - if (cubeField.size() > difficulty){ - cubeField.remove(0); - }else if (cubeField.size() != difficulty){ - randomizeCube(); - } - - if (cubeField.isEmpty()){ - requestClose(false); - }else{ - for (int i = 0; i < cubeField.size(); i++){ - - //better way to check collision - Geometry playerModel = (Geometry) player.getChild(0); - Geometry cubeModel = cubeField.get(i); - cubeModel.updateGeometricState(); - - BoundingVolume pVol = playerModel.getWorldBound(); - BoundingVolume vVol = cubeModel.getWorldBound(); - - if (pVol.intersects(vVol)){ - gameLost(); - return; - } - //Remove cube if 10 world units behind player - if (cubeField.get(i).getLocalTranslation().getX() + 10 < player.getLocalTranslation().getX()){ - cubeField.get(i).removeFromParent(); - cubeField.remove(cubeField.get(i)); - } - - } - } - - Score += fpsRate * tpf; - fpsScoreText.setText("Current Score: "+Score); - } - /** - * Sets up the keyboard bindings - */ - private void Keys() { - inputManager.addMapping("START", new KeyTrigger(KeyInput.KEY_RETURN)); - inputManager.addMapping("Left", new KeyTrigger(KeyInput.KEY_LEFT)); - inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_RIGHT)); - inputManager.addListener(this, "START", "Left", "Right"); - } - - public void onAnalog(String binding, float value, float tpf) { - if (binding.equals("START") && !START){ - START = true; - guiNode.detachChild(pressStart); - System.out.println("START"); - }else if (START == true && binding.equals("Left")){ - player.move(0, 0, -(speed / 2f) * value * fpsRate); - camAngle -= value*tpf; - }else if (START == true && binding.equals("Right")){ - player.move(0, 0, (speed / 2f) * value * fpsRate); - camAngle += value*tpf; - } - } - - /** - * Determines the colors of the player, floor, obstacle and background - */ - private void colorLogic() { - if (timer.getTimeInSeconds() >= coreTime){ - - colorInt++; - coreTime = timer.getTimeInSeconds() + 20; - - - switch (colorInt){ - case 1: - obstacleColors.clear(); - solidBox = false; - obstacleColors.add(ColorRGBA.Green); - renderer.setBackgroundColor(ColorRGBA.Black); - playerMaterial.setColor("Color", ColorRGBA.White); - floorMaterial.setColor("Color", ColorRGBA.Black); - break; - case 2: - obstacleColors.set(0, ColorRGBA.Black); - solidBox = true; - renderer.setBackgroundColor(ColorRGBA.White); - playerMaterial.setColor("Color", ColorRGBA.Gray); - floorMaterial.setColor("Color", ColorRGBA.LightGray); - break; - case 3: - obstacleColors.set(0, ColorRGBA.Pink); - break; - case 4: - obstacleColors.set(0, ColorRGBA.Cyan); - obstacleColors.add(ColorRGBA.Magenta); - renderer.setBackgroundColor(ColorRGBA.Gray); - floorMaterial.setColor("Color", ColorRGBA.Gray); - playerMaterial.setColor("Color", ColorRGBA.White); - break; - case 5: - obstacleColors.remove(0); - renderer.setBackgroundColor(ColorRGBA.Pink); - solidBox = false; - playerMaterial.setColor("Color", ColorRGBA.White); - break; - case 6: - obstacleColors.set(0, ColorRGBA.White); - solidBox = true; - renderer.setBackgroundColor(ColorRGBA.Black); - playerMaterial.setColor("Color", ColorRGBA.Gray); - floorMaterial.setColor("Color", ColorRGBA.LightGray); - break; - case 7: - obstacleColors.set(0, ColorRGBA.Green); - renderer.setBackgroundColor(ColorRGBA.Gray); - playerMaterial.setColor("Color", ColorRGBA.Black); - floorMaterial.setColor("Color", ColorRGBA.Orange); - break; - case 8: - obstacleColors.set(0, ColorRGBA.Red); - floorMaterial.setColor("Color", ColorRGBA.Pink); - break; - case 9: - obstacleColors.set(0, ColorRGBA.Orange); - obstacleColors.add(ColorRGBA.Red); - obstacleColors.add(ColorRGBA.Yellow); - renderer.setBackgroundColor(ColorRGBA.White); - playerMaterial.setColor("Color", ColorRGBA.Red); - floorMaterial.setColor("Color", ColorRGBA.Gray); - colorInt=0; - break; - default: - break; - } - } - } - /** - * Sets up a BitmapText to be displayed - * @param txt the Bitmap Text - * @param text the - * @param font the font of the text - * @param x - * @param y - * @param z - */ - private void loadText(BitmapText txt, String text, BitmapFont font, float x, float y, float z) { - txt.setSize(font.getCharSet().getRenderedSize()); - txt.setLocalTranslation(txt.getLineWidth() * x, txt.getLineHeight() * y, z); - txt.setText(text); - guiNode.attachChild(txt); - } -} \ No newline at end of file diff --git a/engine/src/jbullet/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java b/engine/src/jbullet/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java deleted file mode 100644 index cc721d0f1..000000000 --- a/engine/src/jbullet/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.collision.shapes.infos; - -import com.jme3.bullet.collision.shapes.BoxCollisionShape; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.export.Savable; -import com.jme3.math.Matrix3f; -import com.jme3.math.Vector3f; -import java.io.IOException; - -/** - * - * @author normenhansen - */ -public class ChildCollisionShape implements Savable { - - public Vector3f location; - public Matrix3f rotation; - public CollisionShape shape; - - public ChildCollisionShape() { - } - - public ChildCollisionShape(Vector3f location, Matrix3f rotation, CollisionShape shape) { - this.location = location; - this.rotation = rotation; - this.shape = shape; - } - - public void write(JmeExporter ex) throws IOException { - OutputCapsule capsule = ex.getCapsule(this); - capsule.write(location, "location", new Vector3f()); - capsule.write(rotation, "rotation", new Matrix3f()); - capsule.write(shape, "shape", new BoxCollisionShape(new Vector3f(1, 1, 1))); - } - - public void read(JmeImporter im) throws IOException { - InputCapsule capsule = im.getCapsule(this); - location = (Vector3f) capsule.readSavable("location", new Vector3f()); - rotation = (Matrix3f) capsule.readSavable("rotation", new Matrix3f()); - shape = (CollisionShape) capsule.readSavable("shape", new BoxCollisionShape(new Vector3f(1, 1, 1))); - } -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/CharacterControl.java b/engine/src/jbullet/com/jme3/bullet/control/CharacterControl.java deleted file mode 100644 index 2acac5316..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/CharacterControl.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.bullet.objects.PhysicsCharacter; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import java.io.IOException; - -/** - * - * @author normenhansen - */ -public class CharacterControl extends PhysicsCharacter implements PhysicsControl { - - protected Spatial spatial; - protected boolean enabled = true; - protected boolean added = false; - protected PhysicsSpace space = null; - protected Vector3f viewDirection = new Vector3f(Vector3f.UNIT_Z); - protected boolean useViewDirection = true; - protected boolean applyLocal = false; - - public CharacterControl() { - } - - public CharacterControl(CollisionShape shape, float stepHeight) { - super(shape, stepHeight); - } - - public boolean isApplyPhysicsLocal() { - return applyLocal; - } - - /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial - * @param applyPhysicsLocal - */ - public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { - applyLocal = applyPhysicsLocal; - } - - private Vector3f getSpatialTranslation() { - if (applyLocal) { - return spatial.getLocalTranslation(); - } - return spatial.getWorldTranslation(); - } - - public Control cloneForSpatial(Spatial spatial) { - CharacterControl control = new CharacterControl(collisionShape, stepHeight); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setFallSpeed(getFallSpeed()); - control.setGravity(getGravity()); - control.setJumpSpeed(getJumpSpeed()); - control.setMaxSlope(getMaxSlope()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setUpAxis(getUpAxis()); - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - - control.setSpatial(spatial); - return control; - } - - public void setSpatial(Spatial spatial) { - if (getUserObject() == null || getUserObject() == this.spatial) { - setUserObject(spatial); - } - this.spatial = spatial; - if (spatial == null) { - if (getUserObject() == spatial) { - setUserObject(null); - } - return; - } - setPhysicsLocation(getSpatialTranslation()); - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - if (space != null) { - if (enabled && !added) { - if (spatial != null) { - warp(getSpatialTranslation()); - } - space.addCollisionObject(this); - added = true; - } else if (!enabled && added) { - space.removeCollisionObject(this); - added = false; - } - } - } - - public boolean isEnabled() { - return enabled; - } - - public void setViewDirection(Vector3f vec) { - viewDirection.set(vec); - } - - public Vector3f getViewDirection() { - return viewDirection; - } - - public boolean isUseViewDirection() { - return useViewDirection; - } - - public void setUseViewDirection(boolean viewDirectionEnabled) { - this.useViewDirection = viewDirectionEnabled; - } - - public void update(float tpf) { - if (enabled && spatial != null) { - Quaternion localRotationQuat = spatial.getLocalRotation(); - Vector3f localLocation = spatial.getLocalTranslation(); - if (!applyLocal && spatial.getParent() != null) { - getPhysicsLocation(localLocation); - localLocation.subtractLocal(spatial.getParent().getWorldTranslation()); - localLocation.divideLocal(spatial.getParent().getWorldScale()); - tmp_inverseWorldRotation.set(spatial.getParent().getWorldRotation()).inverseLocal().multLocal(localLocation); - spatial.setLocalTranslation(localLocation); - - if (useViewDirection) { - localRotationQuat.lookAt(viewDirection, Vector3f.UNIT_Y); - spatial.setLocalRotation(localRotationQuat); - } - } else { - spatial.setLocalTranslation(getPhysicsLocation()); - localRotationQuat.lookAt(viewDirection, Vector3f.UNIT_Y); - spatial.setLocalRotation(localRotationQuat); - } - } - } - - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (debugShape == null) { - attachDebugShape(space.getDebugManager()); - } - debugShape.setLocalTranslation(getPhysicsLocation()); - debugShape.updateLogicalState(0); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if (this.space == space) { - return; - } - space.addCollisionObject(this); - added = true; - } - this.space = space; - } - - public PhysicsSpace getPhysicsSpace() { - return space; - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(enabled, "enabled", true); - oc.write(applyLocal, "applyLocalPhysics", false); - oc.write(useViewDirection, "viewDirectionEnabled", true); - oc.write(viewDirection, "viewDirection", new Vector3f(Vector3f.UNIT_Z)); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - enabled = ic.readBoolean("enabled", true); - useViewDirection = ic.readBoolean("viewDirectionEnabled", true); - viewDirection = (Vector3f) ic.readSavable("viewDirection", new Vector3f(Vector3f.UNIT_Z)); - applyLocal = ic.readBoolean("applyLocalPhysics", false); - spatial = (Spatial) ic.readSavable("spatial", null); - setUserObject(spatial); - } -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/GhostControl.java b/engine/src/jbullet/com/jme3/bullet/control/GhostControl.java deleted file mode 100644 index 99e598480..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/GhostControl.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.bullet.objects.PhysicsGhostObject; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import java.io.IOException; - -/** - * A GhostControl moves with the spatial it is attached to and can be used to check - * overlaps with other physics objects (e.g. aggro radius). - * @author normenhansen - */ -public class GhostControl extends PhysicsGhostObject implements PhysicsControl { - - protected Spatial spatial; - protected boolean enabled = true; - protected boolean added = false; - protected PhysicsSpace space = null; - protected boolean applyLocal = false; - - public GhostControl() { - } - - public GhostControl(CollisionShape shape) { - super(shape); - } - - public boolean isApplyPhysicsLocal() { - return applyLocal; - } - - /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial - * @param applyPhysicsLocal - */ - public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { - applyLocal = applyPhysicsLocal; - } - - private Vector3f getSpatialTranslation() { - if (applyLocal) { - return spatial.getLocalTranslation(); - } - return spatial.getWorldTranslation(); - } - - private Quaternion getSpatialRotation() { - if (applyLocal) { - return spatial.getLocalRotation(); - } - return spatial.getWorldRotation(); - } - - public Control cloneForSpatial(Spatial spatial) { - GhostControl control = new GhostControl(collisionShape); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setPhysicsRotation(getPhysicsRotationMatrix()); - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - - control.setSpatial(spatial); - return control; - } - - public void setSpatial(Spatial spatial) { - if (getUserObject() == null || getUserObject() == this.spatial) { - setUserObject(spatial); - } - this.spatial = spatial; - if (spatial == null) { - if (getUserObject() == spatial) { - setUserObject(null); - } - return; - } - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - if (space != null) { - if (enabled && !added) { - if (spatial != null) { - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - space.addCollisionObject(this); - added = true; - } else if (!enabled && added) { - space.removeCollisionObject(this); - added = false; - } - } - } - - public boolean isEnabled() { - return enabled; - } - - public void update(float tpf) { - if (!enabled) { - return; - } - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (debugShape == null) { - attachDebugShape(space.getDebugManager()); - } - debugShape.setLocalTranslation(spatial.getWorldTranslation()); - debugShape.setLocalRotation(spatial.getWorldRotation()); - debugShape.updateLogicalState(0); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if (this.space == space) { - return; - } - space.addCollisionObject(this); - added = true; - } - this.space = space; - } - - public PhysicsSpace getPhysicsSpace() { - return space; - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(enabled, "enabled", true); - oc.write(applyLocal, "applyLocalPhysics", false); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - enabled = ic.readBoolean("enabled", true); - spatial = (Spatial) ic.readSavable("spatial", null); - applyLocal = ic.readBoolean("applyLocalPhysics", false); - setUserObject(spatial); - } -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/KinematicRagdollControl.java b/engine/src/jbullet/com/jme3/bullet/control/KinematicRagdollControl.java deleted file mode 100644 index 3470153c8..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/KinematicRagdollControl.java +++ /dev/null @@ -1,873 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.control.ragdoll.RagdollPreset; -import com.jme3.bullet.control.ragdoll.HumanoidRagdollPreset; -import com.jme3.animation.AnimControl; -import com.jme3.animation.Bone; -import com.jme3.animation.Skeleton; -import com.jme3.animation.SkeletonControl; -import com.jme3.asset.AssetManager; -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.PhysicsCollisionEvent; -import com.jme3.bullet.collision.PhysicsCollisionListener; -import com.jme3.bullet.collision.PhysicsCollisionObject; -import com.jme3.bullet.collision.RagdollCollisionListener; -import com.jme3.bullet.collision.shapes.BoxCollisionShape; -import com.jme3.bullet.collision.shapes.HullCollisionShape; -import com.jme3.bullet.control.ragdoll.RagdollUtils; -import com.jme3.bullet.joints.SixDofJoint; -import com.jme3.bullet.objects.PhysicsRigidBody; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import com.jme3.util.TempVars; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import java.util.logging.Level; -import java.util.logging.Logger; - -/**This control is still a WIP, use it at your own risk
- * To use this control you need a model with an AnimControl and a SkeletonControl.
- * This should be the case if you imported an animated model from Ogre or blender.
- * Note enabling/disabling the control add/removes it from the physic space
- *

- * This control creates collision shapes for each bones of the skeleton when you call spatial.addControl(ragdollControl). - *

    - *
  • The shape is HullCollision shape based on the vertices associated with each bone and based on a tweakable weight threshold (see setWeightThreshold)
  • - *
  • If you don't want each bone to be a collision shape, you can specify what bone to use by using the addBoneName method
    - * By using this method, bone that are not used to create a shape, are "merged" to their parent to create the collision shape. - *
  • - *
- *

- *

- *There are 2 modes for this control : - *

    - *
  • The kinematic modes :
    - * this is the default behavior, this means that the collision shapes of the body are able to interact with physics enabled objects. - * in this mode physic shapes follow the moovements of the animated skeleton (for example animated by a key framed animation) - * this mode is enabled by calling setKinematicMode(); - *
  • - *
  • The ragdoll modes :
    - * To enable this behavior, you need to call setRagdollMode() method. - * In this mode the charater is entirely controled by physics, so it will fall under the gravity and move if any force is applied to it. - *
  • - *
- *

- * - * @author Normen Hansen and Rémy Bouquet (Nehon) - */ -public class KinematicRagdollControl implements PhysicsControl, PhysicsCollisionListener { - - protected static final Logger logger = Logger.getLogger(KinematicRagdollControl.class.getName()); - protected Map boneLinks = new HashMap(); - protected Skeleton skeleton; - protected PhysicsSpace space; - protected boolean enabled = true; - protected boolean debug = false; - protected PhysicsRigidBody baseRigidBody; - protected float weightThreshold = -1.0f; - protected Spatial targetModel; - protected Vector3f initScale; - protected Mode mode = Mode.Kinetmatic; - protected boolean blendedControl = false; - protected float blendTime = 1.0f; - protected float blendStart = 0.0f; - protected List listeners; - protected float eventDispatchImpulseThreshold = 10; - protected RagdollPreset preset = new HumanoidRagdollPreset(); - protected Set boneList = new TreeSet(); - protected Vector3f modelPosition = new Vector3f(); - protected Quaternion modelRotation = new Quaternion(); - protected float rootMass = 15; - protected float totalMass = 0; - protected boolean added = false; - - public static enum Mode { - - Kinetmatic, - Ragdoll - } - - protected class PhysicsBoneLink { - - protected Bone bone; - protected Quaternion initalWorldRotation; - protected SixDofJoint joint; - protected PhysicsRigidBody rigidBody; - protected Quaternion startBlendingRot = new Quaternion(); - protected Vector3f startBlendingPos = new Vector3f(); - } - - /** - * contruct a KinematicRagdollControl - */ - public KinematicRagdollControl() { - } - - public KinematicRagdollControl(float weightThreshold) { - this.weightThreshold = weightThreshold; - } - - public KinematicRagdollControl(RagdollPreset preset, float weightThreshold) { - this.preset = preset; - this.weightThreshold = weightThreshold; - } - - public KinematicRagdollControl(RagdollPreset preset) { - this.preset = preset; - } - - public void update(float tpf) { - if (!enabled) { - return; - } - TempVars vars = TempVars.get(); - - Quaternion tmpRot1 = vars.quat1; - Quaternion tmpRot2 = vars.quat2; - - //if the ragdoll has the control of the skeleton, we update each bone with its position in physic world space. - if (mode == mode.Ragdoll && targetModel.getLocalTranslation().equals(modelPosition)) { - for (PhysicsBoneLink link : boneLinks.values()) { - - Vector3f position = vars.vect1; - - //retrieving bone position in physic world space - Vector3f p = link.rigidBody.getMotionState().getWorldLocation(); - //transforming this position with inverse transforms of the model - targetModel.getWorldTransform().transformInverseVector(p, position); - - //retrieving bone rotation in physic world space - Quaternion q = link.rigidBody.getMotionState().getWorldRotationQuat(); - - //multiplying this rotation by the initialWorld rotation of the bone, - //then transforming it with the inverse world rotation of the model - tmpRot1.set(q).multLocal(link.initalWorldRotation); - tmpRot2.set(targetModel.getWorldRotation()).inverseLocal().mult(tmpRot1, tmpRot1); - tmpRot1.normalizeLocal(); - - //if the bone is the root bone, we apply the physic's transform to the model, so its position and rotation are correctly updated - if (link.bone.getParent() == null) { - - //offsetting the physic's position/rotation by the root bone inverse model space position/rotaion - modelPosition.set(p).subtractLocal(link.bone.getWorldBindPosition()); - targetModel.getParent().getWorldTransform().transformInverseVector(modelPosition, modelPosition); - modelRotation.set(q).multLocal(tmpRot2.set(link.bone.getWorldBindRotation()).inverseLocal()); - - - //applying transforms to the model - targetModel.setLocalTranslation(modelPosition); - - targetModel.setLocalRotation(modelRotation); - - //Applying computed transforms to the bone - link.bone.setUserTransformsWorld(position, tmpRot1); - - } else { - //if boneList is empty, this means that every bone in the ragdoll has a collision shape, - //so we just update the bone position - if (boneList.isEmpty()) { - link.bone.setUserTransformsWorld(position, tmpRot1); - } else { - //boneList is not empty, this means some bones of the skeleton might not be associated with a collision shape. - //So we update them recusively - RagdollUtils.setTransform(link.bone, position, tmpRot1, false, boneList); - } - } - } - } else { - //the ragdoll does not have the controll, so the keyframed animation updates the physic position of the physic bonces - for (PhysicsBoneLink link : boneLinks.values()) { - - Vector3f position = vars.vect1; - - //if blended control this means, keyframed animation is updating the skeleton, - //but to allow smooth transition, we blend this transformation with the saved position of the ragdoll - if (blendedControl) { - Vector3f position2 = vars.vect2; - //initializing tmp vars with the start position/rotation of the ragdoll - position.set(link.startBlendingPos); - tmpRot1.set(link.startBlendingRot); - - //interpolating between ragdoll position/rotation and keyframed position/rotation - tmpRot2.set(tmpRot1).nlerp(link.bone.getModelSpaceRotation(), blendStart / blendTime); - position2.set(position).interpolate(link.bone.getModelSpacePosition(), blendStart / blendTime); - tmpRot1.set(tmpRot2); - position.set(position2); - - //updating bones transforms - if (boneList.isEmpty()) { - //we ensure we have the control to update the bone - link.bone.setUserControl(true); - link.bone.setUserTransformsWorld(position, tmpRot1); - //we give control back to the key framed animation. - link.bone.setUserControl(false); - } else { - RagdollUtils.setTransform(link.bone, position, tmpRot1, true, boneList); - } - - } - //setting skeleton transforms to the ragdoll - matchPhysicObjectToBone(link, position, tmpRot1); - modelPosition.set(targetModel.getLocalTranslation()); - - } - - //time control for blending - if (blendedControl) { - blendStart += tpf; - if (blendStart > blendTime) { - blendedControl = false; - } - } - } - vars.release(); - - } - - /** - * Set the transforms of a rigidBody to match the transforms of a bone. - * this is used to make the ragdoll follow the skeleton motion while in Kinematic mode - * @param link the link containing the bone and the rigidBody - * @param position just a temp vector for position - * @param tmpRot1 just a temp quaternion for rotation - */ - private void matchPhysicObjectToBone(PhysicsBoneLink link, Vector3f position, Quaternion tmpRot1) { - //computing position from rotation and scale - targetModel.getWorldTransform().transformVector(link.bone.getModelSpacePosition(), position); - - //computing rotation - tmpRot1.set(link.bone.getModelSpaceRotation()).multLocal(link.bone.getWorldBindInverseRotation()); - targetModel.getWorldRotation().mult(tmpRot1, tmpRot1); - tmpRot1.normalizeLocal(); - - //updating physic location/rotation of the physic bone - link.rigidBody.setPhysicsLocation(position); - link.rigidBody.setPhysicsRotation(tmpRot1); - - } - - public Control cloneForSpatial(Spatial spatial) { - throw new UnsupportedOperationException("Not supported yet."); - } - - /** - * rebuild the ragdoll - * this is useful if you applied scale on the ragdoll after it's been initialized - */ - public void reBuild() { - setSpatial(targetModel); - addToPhysicsSpace(); - } - - public void setSpatial(Spatial model) { - if (model == null) { - removeFromPhysicsSpace(); - clearData(); - return; - } - targetModel = model; - Node parent = model.getParent(); - - - Vector3f initPosition = model.getLocalTranslation().clone(); - Quaternion initRotation = model.getLocalRotation().clone(); - initScale = model.getLocalScale().clone(); - - model.removeFromParent(); - model.setLocalTranslation(Vector3f.ZERO); - model.setLocalRotation(Quaternion.IDENTITY); - model.setLocalScale(1); - //HACK ALERT change this - //I remove the skeletonControl and readd it to the spatial to make sure it's after the ragdollControl in the stack - //Find a proper way to order the controls. - SkeletonControl sc = model.getControl(SkeletonControl.class); - model.removeControl(sc); - model.addControl(sc); - //---- - - removeFromPhysicsSpace(); - clearData(); - // put into bind pose and compute bone transforms in model space - // maybe dont reset to ragdoll out of animations? - scanSpatial(model); - - - if (parent != null) { - parent.attachChild(model); - - } - model.setLocalTranslation(initPosition); - model.setLocalRotation(initRotation); - model.setLocalScale(initScale); - - logger.log(Level.INFO, "Created physics ragdoll for skeleton {0}", skeleton); - } - - /** - * Add a bone name to this control - * Using this method you can specify which bones of the skeleton will be used to build the collision shapes. - * @param name - */ - public void addBoneName(String name) { - boneList.add(name); - } - - private void scanSpatial(Spatial model) { - AnimControl animControl = model.getControl(AnimControl.class); - Map> pointsMap = null; - if (weightThreshold == -1.0f) { - pointsMap = RagdollUtils.buildPointMap(model); - } - - skeleton = animControl.getSkeleton(); - skeleton.resetAndUpdate(); - for (int i = 0; i < skeleton.getRoots().length; i++) { - Bone childBone = skeleton.getRoots()[i]; - if (childBone.getParent() == null) { - logger.log(Level.INFO, "Found root bone in skeleton {0}", skeleton); - baseRigidBody = new PhysicsRigidBody(new BoxCollisionShape(Vector3f.UNIT_XYZ.mult(0.1f)), 1); - baseRigidBody.setKinematic(mode == Mode.Kinetmatic); - boneRecursion(model, childBone, baseRigidBody, 1, pointsMap); - } - } - } - - private void boneRecursion(Spatial model, Bone bone, PhysicsRigidBody parent, int reccount, Map> pointsMap) { - PhysicsRigidBody parentShape = parent; - if (boneList.isEmpty() || boneList.contains(bone.getName())) { - - PhysicsBoneLink link = new PhysicsBoneLink(); - link.bone = bone; - - //creating the collision shape - HullCollisionShape shape = null; - if (pointsMap != null) { - //build a shape for the bone, using the vertices that are most influenced by this bone - shape = RagdollUtils.makeShapeFromPointMap(pointsMap, RagdollUtils.getBoneIndices(link.bone, skeleton, boneList), initScale, link.bone.getModelSpacePosition()); - } else { - //build a shape for the bone, using the vertices associated with this bone with a weight above the threshold - shape = RagdollUtils.makeShapeFromVerticeWeights(model, RagdollUtils.getBoneIndices(link.bone, skeleton, boneList), initScale, link.bone.getModelSpacePosition(), weightThreshold); - } - - PhysicsRigidBody shapeNode = new PhysicsRigidBody(shape, rootMass / (float) reccount); - - shapeNode.setKinematic(mode == Mode.Kinetmatic); - totalMass += rootMass / (float) reccount; - - link.rigidBody = shapeNode; - link.initalWorldRotation = bone.getModelSpaceRotation().clone(); - - if (parent != null) { - //get joint position for parent - Vector3f posToParent = new Vector3f(); - if (bone.getParent() != null) { - bone.getModelSpacePosition().subtract(bone.getParent().getModelSpacePosition(), posToParent).multLocal(initScale); - } - - SixDofJoint joint = new SixDofJoint(parent, shapeNode, posToParent, new Vector3f(0, 0, 0f), true); - preset.setupJointForBone(bone.getName(), joint); - - link.joint = joint; - joint.setCollisionBetweenLinkedBodys(false); - } - boneLinks.put(bone.getName(), link); - shapeNode.setUserObject(link); - parentShape = shapeNode; - } - - for (Iterator it = bone.getChildren().iterator(); it.hasNext();) { - Bone childBone = it.next(); - boneRecursion(model, childBone, parentShape, reccount + 1, pointsMap); - } - } - - /** - * Set the joint limits for the joint between the given bone and its parent. - * This method can't work before attaching the control to a spatial - * @param boneName the name of the bone - * @param maxX the maximum rotation on the x axis (in radians) - * @param minX the minimum rotation on the x axis (in radians) - * @param maxY the maximum rotation on the y axis (in radians) - * @param minY the minimum rotation on the z axis (in radians) - * @param maxZ the maximum rotation on the z axis (in radians) - * @param minZ the minimum rotation on the z axis (in radians) - */ - public void setJointLimit(String boneName, float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - RagdollUtils.setJointLimit(link.joint, maxX, minX, maxY, minY, maxZ, minZ); - } else { - logger.log(Level.WARNING, "Not joint was found for bone {0}. make sure you call spatial.addControl(ragdoll) before setting joints limit", boneName); - } - } - - /** - * Return the joint between the given bone and its parent. - * This return null if it's called before attaching the control to a spatial - * @param boneName the name of the bone - * @return the joint between the given bone and its parent - */ - public SixDofJoint getJoint(String boneName) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - return link.joint; - } else { - logger.log(Level.WARNING, "Not joint was found for bone {0}. make sure you call spatial.addControl(ragdoll) before setting joints limit", boneName); - return null; - } - } - - private void clearData() { - boneLinks.clear(); - baseRigidBody = null; - } - - private void addToPhysicsSpace() { - if (space == null) { - return; - } - if (baseRigidBody != null) { - space.add(baseRigidBody); - added = true; - } - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - if (physicsBoneLink.rigidBody != null) { - space.add(physicsBoneLink.rigidBody); - if (physicsBoneLink.joint != null) { - space.add(physicsBoneLink.joint); - - } - added = true; - } - } - } - - protected void removeFromPhysicsSpace() { - if (space == null) { - return; - } - if (baseRigidBody != null) { - space.remove(baseRigidBody); - } - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - if (physicsBoneLink.joint != null) { - space.remove(physicsBoneLink.joint); - if (physicsBoneLink.rigidBody != null) { - space.remove(physicsBoneLink.rigidBody); - } - } - } - added = false; - } - - /** - * enable or disable the control - * note that if enabled is true and that the physic space has been set on the ragdoll, the ragdoll is added to the physic space - * if enabled is false the ragdoll is removed from physic space. - * @param enabled - */ - public void setEnabled(boolean enabled) { - if (this.enabled == enabled) { - return; - } - this.enabled = enabled; - if (!enabled && space != null) { - removeFromPhysicsSpace(); - } else if (enabled && space != null) { - addToPhysicsSpace(); - } - } - - /** - * returns true if the control is enabled - * @return - */ - public boolean isEnabled() { - return enabled; - } - - protected void attachDebugShape(AssetManager manager) { - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - physicsBoneLink.rigidBody.createDebugShape(manager); - } - debug = true; - } - - protected void detachDebugShape() { - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - physicsBoneLink.rigidBody.detachDebugShape(); - } - debug = false; - } - - /** - * For internal use only - * specific render for the ragdoll(if debugging) - * @param rm - * @param vp - */ - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (!debug) { - attachDebugShape(space.getDebugManager()); - } - for (Iterator it = boneLinks.values().iterator(); it.hasNext();) { - PhysicsBoneLink physicsBoneLink = it.next(); - Spatial debugShape = physicsBoneLink.rigidBody.debugShape(); - if (debugShape != null) { - debugShape.setLocalTranslation(physicsBoneLink.rigidBody.getMotionState().getWorldLocation()); - debugShape.setLocalRotation(physicsBoneLink.rigidBody.getMotionState().getWorldRotationQuat()); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - } - } - - /** - * set the physic space to this ragdoll - * @param space - */ - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - removeFromPhysicsSpace(); - this.space = space; - } else { - if (this.space == space) { - return; - } - this.space = space; - addToPhysicsSpace(); - this.space.addCollisionListener(this); - } - } - - /** - * returns the physic space - * @return - */ - public PhysicsSpace getPhysicsSpace() { - return space; - } - - /** - * serialize this control - * @param ex - * @throws IOException - */ - public void write(JmeExporter ex) throws IOException { - throw new UnsupportedOperationException("Not supported yet."); - } - - /** - * de-serialize this control - * @param im - * @throws IOException - */ - public void read(JmeImporter im) throws IOException { - throw new UnsupportedOperationException("Not supported yet."); - } - - /** - * For internal use only - * callback for collisionevent - * @param event - */ - public void collision(PhysicsCollisionEvent event) { - PhysicsCollisionObject objA = event.getObjectA(); - PhysicsCollisionObject objB = event.getObjectB(); - - //excluding collisions that involve 2 parts of the ragdoll - if (event.getNodeA() == null && event.getNodeB() == null) { - return; - } - - //discarding low impulse collision - if (event.getAppliedImpulse() < eventDispatchImpulseThreshold) { - return; - } - - boolean hit = false; - Bone hitBone = null; - PhysicsCollisionObject hitObject = null; - - //Computing which bone has been hit - if (objA.getUserObject() instanceof PhysicsBoneLink) { - PhysicsBoneLink link = (PhysicsBoneLink) objA.getUserObject(); - if (link != null) { - hit = true; - hitBone = link.bone; - hitObject = objB; - } - } - - if (objB.getUserObject() instanceof PhysicsBoneLink) { - PhysicsBoneLink link = (PhysicsBoneLink) objB.getUserObject(); - if (link != null) { - hit = true; - hitBone = link.bone; - hitObject = objA; - - } - } - - //dispatching the event if the ragdoll has been hit - if (hit && listeners != null) { - for (RagdollCollisionListener listener : listeners) { - listener.collide(hitBone, hitObject, event); - } - } - - } - - /** - * Enable or disable the ragdoll behaviour. - * if ragdollEnabled is true, the character motion will only be powerd by physics - * else, the characted will be animated by the keyframe animation, - * but will be able to physically interact with its physic environnement - * @param ragdollEnabled - */ - protected void setMode(Mode mode) { - this.mode = mode; - AnimControl animControl = targetModel.getControl(AnimControl.class); - animControl.setEnabled(mode == Mode.Kinetmatic); - - baseRigidBody.setKinematic(mode == Mode.Kinetmatic); - TempVars vars = TempVars.get(); - - for (PhysicsBoneLink link : boneLinks.values()) { - link.rigidBody.setKinematic(mode == Mode.Kinetmatic); - if (mode == Mode.Ragdoll) { - Quaternion tmpRot1 = vars.quat1; - Vector3f position = vars.vect1; - //making sure that the ragdoll is at the correct place. - matchPhysicObjectToBone(link, position, tmpRot1); - } - - } - vars.release(); - - for (Bone bone : skeleton.getRoots()) { - RagdollUtils.setUserControl(bone, mode == Mode.Ragdoll); - } - } - - /** - * Smoothly blend from Ragdoll mode to Kinematic mode - * This is useful to blend ragdoll actual position to a keyframe animation for example - * @param blendTime the blending time between ragdoll to anim. - */ - public void blendToKinematicMode(float blendTime) { - if (mode == Mode.Kinetmatic) { - return; - } - blendedControl = true; - this.blendTime = blendTime; - mode = Mode.Kinetmatic; - AnimControl animControl = targetModel.getControl(AnimControl.class); - animControl.setEnabled(true); - - - TempVars vars = TempVars.get(); - for (PhysicsBoneLink link : boneLinks.values()) { - - Vector3f p = link.rigidBody.getMotionState().getWorldLocation(); - Vector3f position = vars.vect1; - - targetModel.getWorldTransform().transformInverseVector(p, position); - - Quaternion q = link.rigidBody.getMotionState().getWorldRotationQuat(); - Quaternion q2 = vars.quat1; - Quaternion q3 = vars.quat2; - - q2.set(q).multLocal(link.initalWorldRotation).normalizeLocal(); - q3.set(targetModel.getWorldRotation()).inverseLocal().mult(q2, q2); - q2.normalizeLocal(); - link.startBlendingPos.set(position); - link.startBlendingRot.set(q2); - link.rigidBody.setKinematic(true); - } - vars.release(); - - for (Bone bone : skeleton.getRoots()) { - RagdollUtils.setUserControl(bone, false); - } - - blendStart = 0; - } - - /** - * Set the control into Kinematic mode - * In theis mode, the collision shapes follow the movements of the skeleton, - * and can interact with physical environement - */ - public void setKinematicMode() { - if (mode != Mode.Kinetmatic) { - setMode(Mode.Kinetmatic); - } - } - - /** - * Sets the control into Ragdoll mode - * The skeleton is entirely controlled by physics. - */ - public void setRagdollMode() { - if (mode != Mode.Ragdoll) { - setMode(Mode.Ragdoll); - } - } - - /** - * retruns the mode of this control - * @return - */ - public Mode getMode() { - return mode; - } - - /** - * add a - * @param listener - */ - public void addCollisionListener(RagdollCollisionListener listener) { - if (listeners == null) { - listeners = new ArrayList(); - } - listeners.add(listener); - } - - public void setRootMass(float rootMass) { - this.rootMass = rootMass; - } - - public float getTotalMass() { - return totalMass; - } - - public float getWeightThreshold() { - return weightThreshold; - } - - public void setWeightThreshold(float weightThreshold) { - this.weightThreshold = weightThreshold; - } - - public float getEventDispatchImpulseThreshold() { - return eventDispatchImpulseThreshold; - } - - public void setEventDispatchImpulseThreshold(float eventDispatchImpulseThreshold) { - this.eventDispatchImpulseThreshold = eventDispatchImpulseThreshold; - } - - /** - * Set the CcdMotionThreshold of all the bone's rigidBodies of the ragdoll - * @see PhysicsRigidBody#setCcdMotionThreshold(float) - * @param value - */ - public void setCcdMotionThreshold(float value) { - for (PhysicsBoneLink link : boneLinks.values()) { - link.rigidBody.setCcdMotionThreshold(value); - } - } - - /** - * Set the CcdSweptSphereRadius of all the bone's rigidBodies of the ragdoll - * @see PhysicsRigidBody#setCcdSweptSphereRadius(float) - * @param value - */ - public void setCcdSweptSphereRadius(float value) { - for (PhysicsBoneLink link : boneLinks.values()) { - link.rigidBody.setCcdSweptSphereRadius(value); - } - } - - /** - * Set the CcdMotionThreshold of the given bone's rigidBodies of the ragdoll - * @see PhysicsRigidBody#setCcdMotionThreshold(float) - * @param value - * @deprecated use getBoneRigidBody(String BoneName).setCcdMotionThreshold(float) instead - */ - @Deprecated - public void setBoneCcdMotionThreshold(String boneName, float value) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - link.rigidBody.setCcdMotionThreshold(value); - } - } - - /** - * Set the CcdSweptSphereRadius of the given bone's rigidBodies of the ragdoll - * @see PhysicsRigidBody#setCcdSweptSphereRadius(float) - * @param value - * @deprecated use getBoneRigidBody(String BoneName).setCcdSweptSphereRadius(float) instead - */ - @Deprecated - public void setBoneCcdSweptSphereRadius(String boneName, float value) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - link.rigidBody.setCcdSweptSphereRadius(value); - } - } - - /** - * return the rigidBody associated to the given bone - * @param boneName the name of the bone - * @return the associated rigidBody. - */ - public PhysicsRigidBody getBoneRigidBody(String boneName) { - PhysicsBoneLink link = boneLinks.get(boneName); - if (link != null) { - return link.rigidBody; - } - return null; - } -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/PhysicsControl.java b/engine/src/jbullet/com/jme3/bullet/control/PhysicsControl.java deleted file mode 100644 index ba6515789..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/PhysicsControl.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.scene.control.Control; - -/** - * - * @author normenhansen - */ -public interface PhysicsControl extends Control { - - public void setPhysicsSpace(PhysicsSpace space); - - public PhysicsSpace getPhysicsSpace(); - - /** - * The physics object is removed from the physics space when the control - * is disabled. When the control is enabled again the physics object is - * moved to the current location of the spatial and then added to the physics - * space. This allows disabling/enabling physics to move the spatial freely. - * @param state - */ - public void setEnabled(boolean state); -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/RigidBodyControl.java b/engine/src/jbullet/com/jme3/bullet/control/RigidBodyControl.java deleted file mode 100644 index be40b58c3..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/RigidBodyControl.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.shapes.BoxCollisionShape; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.bullet.collision.shapes.SphereCollisionShape; -import com.jme3.bullet.objects.PhysicsRigidBody; -import com.jme3.bullet.util.CollisionShapeFactory; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import com.jme3.scene.shape.Box; -import com.jme3.scene.shape.Sphere; -import java.io.IOException; - -/** - * - * @author normenhansen - */ -public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl { - - protected Spatial spatial; - protected boolean enabled = true; - protected boolean added = false; - protected PhysicsSpace space = null; - protected boolean kinematicSpatial = true; - - public RigidBodyControl() { - } - - /** - * When using this constructor, the CollisionShape for the RigidBody is generated - * automatically when the Control is added to a Spatial. - * @param mass When not 0, a HullCollisionShape is generated, otherwise a MeshCollisionShape is used. For geometries with box or sphere meshes the proper box or sphere collision shape is used. - */ - public RigidBodyControl(float mass) { - this.mass = mass; - } - - /** - * Creates a new PhysicsNode with the supplied collision shape and mass 1 - * @param child - * @param shape - */ - public RigidBodyControl(CollisionShape shape) { - super(shape); - } - - public RigidBodyControl(CollisionShape shape, float mass) { - super(shape, mass); - } - - public Control cloneForSpatial(Spatial spatial) { - RigidBodyControl control = new RigidBodyControl(collisionShape, mass); - control.setAngularFactor(getAngularFactor()); - control.setAngularSleepingThreshold(getAngularSleepingThreshold()); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setDamping(getLinearDamping(), getAngularDamping()); - control.setFriction(getFriction()); - control.setGravity(getGravity()); - control.setKinematic(isKinematic()); - control.setKinematicSpatial(isKinematicSpatial()); - control.setLinearSleepingThreshold(getLinearSleepingThreshold()); - control.setPhysicsLocation(getPhysicsLocation(null)); - control.setPhysicsRotation(getPhysicsRotationMatrix(null)); - control.setRestitution(getRestitution()); - - if (mass > 0) { - control.setAngularVelocity(getAngularVelocity()); - control.setLinearVelocity(getLinearVelocity()); - } - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - - control.setSpatial(spatial); - return control; - } - - public void setSpatial(Spatial spatial) { - if (getUserObject() == null || getUserObject() == this.spatial) { - setUserObject(spatial); - } - this.spatial = spatial; - if (spatial == null) { - if (getUserObject() == spatial) { - setUserObject(null); - } - spatial = null; - collisionShape = null; - return; - } - if (collisionShape == null) { - createCollisionShape(); - rebuildRigidBody(); - } - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - - protected void createCollisionShape() { - if (spatial == null) { - return; - } - if (spatial instanceof Geometry) { - Geometry geom = (Geometry) spatial; - Mesh mesh = geom.getMesh(); - if (mesh instanceof Sphere) { - collisionShape = new SphereCollisionShape(((Sphere) mesh).getRadius()); - return; - } else if (mesh instanceof Box) { - collisionShape = new BoxCollisionShape(new Vector3f(((Box) mesh).getXExtent(), ((Box) mesh).getYExtent(), ((Box) mesh).getZExtent())); - return; - } - } - if (mass > 0) { - collisionShape = CollisionShapeFactory.createDynamicMeshShape(spatial); - } else { - collisionShape = CollisionShapeFactory.createMeshShape(spatial); - } - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - if (space != null) { - if (enabled && !added) { - if (spatial != null) { - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - space.addCollisionObject(this); - added = true; - } else if (!enabled && added) { - space.removeCollisionObject(this); - added = false; - } - } - } - - public boolean isEnabled() { - return enabled; - } - - /** - * Checks if this control is in kinematic spatial mode. - * @return true if the spatial location is applied to this kinematic rigidbody - */ - public boolean isKinematicSpatial() { - return kinematicSpatial; - } - - /** - * Sets this control to kinematic spatial mode so that the spatials transform will - * be applied to the rigidbody in kinematic mode, defaults to true. - * @param kinematicSpatial - */ - public void setKinematicSpatial(boolean kinematicSpatial) { - this.kinematicSpatial = kinematicSpatial; - } - - public boolean isApplyPhysicsLocal() { - return motionState.isApplyPhysicsLocal(); - } - - /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial instead of the world traslation. - * @param applyPhysicsLocal - */ - public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { - motionState.setApplyPhysicsLocal(applyPhysicsLocal); - } - - private Vector3f getSpatialTranslation(){ - if(motionState.isApplyPhysicsLocal()){ - return spatial.getLocalTranslation(); - } - return spatial.getWorldTranslation(); - } - - private Quaternion getSpatialRotation(){ - if(motionState.isApplyPhysicsLocal()){ - return spatial.getLocalRotation(); - } - return spatial.getWorldRotation(); - } - - public void update(float tpf) { - if (enabled && spatial != null) { - if (isKinematic() && kinematicSpatial) { - super.setPhysicsLocation(getSpatialTranslation()); - super.setPhysicsRotation(getSpatialRotation()); - } else { - getMotionState().applyTransform(spatial); - } - } - } - - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (debugShape == null) { - attachDebugShape(space.getDebugManager()); - } - //TODO: using spatial traslation/rotation.. - debugShape.setLocalTranslation(spatial.getWorldTranslation()); - debugShape.setLocalRotation(spatial.getWorldRotation()); - debugShape.updateLogicalState(0); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if(this.space==space) return; - space.addCollisionObject(this); - added = true; - } - this.space = space; - } - - public PhysicsSpace getPhysicsSpace() { - return space; - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(enabled, "enabled", true); - oc.write(motionState.isApplyPhysicsLocal(), "applyLocalPhysics", false); - oc.write(kinematicSpatial, "kinematicSpatial", true); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - enabled = ic.readBoolean("enabled", true); - kinematicSpatial = ic.readBoolean("kinematicSpatial", true); - spatial = (Spatial) ic.readSavable("spatial", null); - motionState.setApplyPhysicsLocal(ic.readBoolean("applyLocalPhysics", false)); - setUserObject(spatial); - } -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/VehicleControl.java b/engine/src/jbullet/com/jme3/bullet/control/VehicleControl.java deleted file mode 100644 index 4e6f416e4..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/VehicleControl.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control; - -import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.shapes.CollisionShape; -import com.jme3.bullet.joints.PhysicsJoint; -import com.jme3.bullet.objects.PhysicsVehicle; -import com.jme3.bullet.objects.VehicleWheel; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import com.jme3.scene.debug.Arrow; -import java.io.IOException; -import java.util.Iterator; - -/** - * - * @author normenhansen - */ -public class VehicleControl extends PhysicsVehicle implements PhysicsControl { - - protected Spatial spatial; - protected boolean enabled = true; - protected PhysicsSpace space = null; - protected boolean added = false; - - public VehicleControl() { - } - - /** - * Creates a new PhysicsNode with the supplied collision shape - * @param child - * @param shape - */ - public VehicleControl(CollisionShape shape) { - super(shape); - } - - public VehicleControl(CollisionShape shape, float mass) { - super(shape, mass); - } - - public boolean isApplyPhysicsLocal() { - return motionState.isApplyPhysicsLocal(); - } - - /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial - * @param applyPhysicsLocal - */ - public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { - motionState.setApplyPhysicsLocal(applyPhysicsLocal); - for (Iterator it = wheels.iterator(); it.hasNext();) { - VehicleWheel vehicleWheel = it.next(); - vehicleWheel.setApplyLocal(applyPhysicsLocal); - } - } - - private Vector3f getSpatialTranslation(){ - if(motionState.isApplyPhysicsLocal()){ - return spatial.getLocalTranslation(); - } - return spatial.getWorldTranslation(); - } - - private Quaternion getSpatialRotation(){ - if(motionState.isApplyPhysicsLocal()){ - return spatial.getLocalRotation(); - } - return spatial.getWorldRotation(); - } - - public Control cloneForSpatial(Spatial spatial) { - VehicleControl control = new VehicleControl(collisionShape, mass); - control.setAngularFactor(getAngularFactor()); - control.setAngularSleepingThreshold(getAngularSleepingThreshold()); - control.setAngularVelocity(getAngularVelocity()); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setDamping(getLinearDamping(), getAngularDamping()); - control.setFriction(getFriction()); - control.setGravity(getGravity()); - control.setKinematic(isKinematic()); - control.setLinearSleepingThreshold(getLinearSleepingThreshold()); - control.setLinearVelocity(getLinearVelocity()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setPhysicsRotation(getPhysicsRotationMatrix()); - control.setRestitution(getRestitution()); - - control.setFrictionSlip(getFrictionSlip()); - control.setMaxSuspensionTravelCm(getMaxSuspensionTravelCm()); - control.setSuspensionStiffness(getSuspensionStiffness()); - control.setSuspensionCompression(tuning.suspensionCompression); - control.setSuspensionDamping(tuning.suspensionDamping); - control.setMaxSuspensionForce(getMaxSuspensionForce()); - - for (Iterator it = wheels.iterator(); it.hasNext();) { - VehicleWheel wheel = it.next(); - VehicleWheel newWheel = control.addWheel(wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), wheel.isFrontWheel()); - newWheel.setFrictionSlip(wheel.getFrictionSlip()); - newWheel.setMaxSuspensionTravelCm(wheel.getMaxSuspensionTravelCm()); - newWheel.setSuspensionStiffness(wheel.getSuspensionStiffness()); - newWheel.setWheelsDampingCompression(wheel.getWheelsDampingCompression()); - newWheel.setWheelsDampingRelaxation(wheel.getWheelsDampingRelaxation()); - newWheel.setMaxSuspensionForce(wheel.getMaxSuspensionForce()); - - //TODO: bad way finding children! - if (spatial instanceof Node) { - Node node = (Node) spatial; - Spatial wheelSpat = node.getChild(wheel.getWheelSpatial().getName()); - if (wheelSpat != null) { - newWheel.setWheelSpatial(wheelSpat); - } - } - } - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - - control.setSpatial(spatial); - return control; - } - - public void setSpatial(Spatial spatial) { - if (getUserObject() == null || getUserObject() == this.spatial) { - setUserObject(spatial); - } - this.spatial = spatial; - if (spatial == null) { - if (getUserObject() == spatial) { - setUserObject(null); - } - this.spatial = null; - this.collisionShape = null; - return; - } - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - if (space != null) { - if (enabled && !added) { - if(spatial!=null){ - setPhysicsLocation(getSpatialTranslation()); - setPhysicsRotation(getSpatialRotation()); - } - space.addCollisionObject(this); - added = true; - } else if (!enabled && added) { - space.removeCollisionObject(this); - added = false; - } - } - } - - public boolean isEnabled() { - return enabled; - } - - public void update(float tpf) { - if (enabled && spatial != null) { - if (getMotionState().applyTransform(spatial)) { - spatial.getWorldTransform(); - applyWheelTransforms(); - } - } else if (enabled) { - applyWheelTransforms(); - } - } - - @Override - protected Spatial getDebugShape() { - return super.getDebugShape(); - } - - public void render(RenderManager rm, ViewPort vp) { - if (enabled && space != null && space.getDebugManager() != null) { - if (debugShape == null) { - attachDebugShape(space.getDebugManager()); - } - Node debugNode = (Node) debugShape; - debugShape.setLocalTranslation(spatial.getWorldTranslation()); - debugShape.setLocalRotation(spatial.getWorldRotation()); - int i = 0; - for (Iterator it = wheels.iterator(); it.hasNext();) { - VehicleWheel physicsVehicleWheel = it.next(); - Vector3f location = physicsVehicleWheel.getLocation().clone(); - Vector3f direction = physicsVehicleWheel.getDirection().clone(); - Vector3f axle = physicsVehicleWheel.getAxle().clone(); - float restLength = physicsVehicleWheel.getRestLength(); - float radius = physicsVehicleWheel.getRadius(); - - Geometry locGeom = (Geometry) debugNode.getChild("WheelLocationDebugShape" + i); - Geometry dirGeom = (Geometry) debugNode.getChild("WheelDirectionDebugShape" + i); - Geometry axleGeom = (Geometry) debugNode.getChild("WheelAxleDebugShape" + i); - Geometry wheelGeom = (Geometry) debugNode.getChild("WheelRadiusDebugShape" + i); - - Arrow locArrow = (Arrow) locGeom.getMesh(); - locArrow.setArrowExtent(location); - Arrow axleArrow = (Arrow) axleGeom.getMesh(); - axleArrow.setArrowExtent(axle.normalizeLocal().multLocal(0.3f)); - Arrow wheelArrow = (Arrow) wheelGeom.getMesh(); - wheelArrow.setArrowExtent(direction.normalizeLocal().multLocal(radius)); - Arrow dirArrow = (Arrow) dirGeom.getMesh(); - dirArrow.setArrowExtent(direction.normalizeLocal().multLocal(restLength)); - - dirGeom.setLocalTranslation(location); - axleGeom.setLocalTranslation(location.addLocal(direction)); - wheelGeom.setLocalTranslation(location); - i++; - } - debugShape.updateLogicalState(0); - debugShape.updateGeometricState(); - rm.renderScene(debugShape, vp); - } - } - - public void setPhysicsSpace(PhysicsSpace space) { - createVehicle(space); - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if(this.space==space) return; - space.addCollisionObject(this); - added = true; - } - this.space = space; - } - - public PhysicsSpace getPhysicsSpace() { - return space; - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(enabled, "enabled", true); - oc.write(motionState.isApplyPhysicsLocal(), "applyLocalPhysics", false); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - enabled = ic.readBoolean("enabled", true); - spatial = (Spatial) ic.readSavable("spatial", null); - motionState.setApplyPhysicsLocal(ic.readBoolean("applyLocalPhysics", false)); - setUserObject(spatial); - } -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java b/engine/src/jbullet/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java deleted file mode 100644 index 06eeab052..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control.ragdoll; - -import com.jme3.math.FastMath; - -/** - * - * @author Nehon - */ -public class HumanoidRagdollPreset extends RagdollPreset { - - @Override - protected void initBoneMap() { - boneMap.put("head", new JointPreset(FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - boneMap.put("torso", new JointPreset(FastMath.QUARTER_PI, -FastMath.QUARTER_PI, 0, 0, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - boneMap.put("upperleg", new JointPreset(FastMath.PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI/2, -FastMath.QUARTER_PI/2, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - boneMap.put("lowerleg", new JointPreset(0, -FastMath.PI, 0, 0, 0, 0)); - - boneMap.put("foot", new JointPreset(0, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - boneMap.put("upperarm", new JointPreset(FastMath.HALF_PI, -FastMath.QUARTER_PI, 0, 0, FastMath.HALF_PI, -FastMath.QUARTER_PI)); - - boneMap.put("lowerarm", new JointPreset(FastMath.HALF_PI, 0, 0, 0, 0, 0)); - - boneMap.put("hand", new JointPreset(FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); - - } - - @Override - protected void initLexicon() { - LexiconEntry entry = new LexiconEntry(); - entry.addSynonym("head", 100); - lexicon.put("head", entry); - - entry = new LexiconEntry(); - entry.addSynonym("torso", 100); - entry.addSynonym("chest", 100); - entry.addSynonym("spine", 45); - entry.addSynonym("high", 25); - lexicon.put("torso", entry); - - entry = new LexiconEntry(); - entry.addSynonym("upperleg", 100); - entry.addSynonym("thigh", 100); - entry.addSynonym("hip", 75); - entry.addSynonym("leg", 40); - entry.addSynonym("high", 10); - entry.addSynonym("up", 15); - entry.addSynonym("upper", 15); - lexicon.put("upperleg", entry); - - entry = new LexiconEntry(); - entry.addSynonym("lowerleg", 100); - entry.addSynonym("calf", 100); - entry.addSynonym("knee", 75); - entry.addSynonym("leg", 50); - entry.addSynonym("low", 10); - entry.addSynonym("lower", 10); - lexicon.put("lowerleg", entry); - - entry = new LexiconEntry(); - entry.addSynonym("foot", 100); - entry.addSynonym("ankle", 75); - lexicon.put("foot", entry); - - - entry = new LexiconEntry(); - entry.addSynonym("upperarm", 100); - entry.addSynonym("humerus", 100); - entry.addSynonym("shoulder", 50); - entry.addSynonym("arm", 40); - entry.addSynonym("high", 10); - entry.addSynonym("up", 15); - entry.addSynonym("upper", 15); - lexicon.put("upperarm", entry); - - entry = new LexiconEntry(); - entry.addSynonym("lowerarm", 100); - entry.addSynonym("ulna", 100); - entry.addSynonym("elbow", 75); - entry.addSynonym("arm", 50); - entry.addSynonym("low", 10); - entry.addSynonym("lower", 10); - lexicon.put("lowerarm", entry); - - entry = new LexiconEntry(); - entry.addSynonym("hand", 100); - entry.addSynonym("fist", 100); - entry.addSynonym("wrist", 75); - lexicon.put("hand", entry); - - } -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/ragdoll/RagdollPreset.java b/engine/src/jbullet/com/jme3/bullet/control/ragdoll/RagdollPreset.java deleted file mode 100644 index 51bf4babf..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/ragdoll/RagdollPreset.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control.ragdoll; - -import com.jme3.bullet.joints.SixDofJoint; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author Nehon - */ -public abstract class RagdollPreset { - - protected static final Logger logger = Logger.getLogger(RagdollPreset.class.getName()); - protected Map boneMap = new HashMap(); - protected Map lexicon = new HashMap(); - - protected abstract void initBoneMap(); - - protected abstract void initLexicon(); - - public void setupJointForBone(String boneName, SixDofJoint joint) { - - if (boneMap.isEmpty()) { - initBoneMap(); - } - if (lexicon.isEmpty()) { - initLexicon(); - } - String resultName = ""; - int resultScore = 0; - - for (String key : lexicon.keySet()) { - - int score = lexicon.get(key).getScore(boneName); - if (score > resultScore) { - resultScore = score; - resultName = key; - } - - } - - JointPreset preset = boneMap.get(resultName); - - if (preset != null && resultScore >= 50) { - logger.log(Level.INFO, "Found matching joint for bone {0} : {1} with score {2}", new Object[]{boneName, resultName, resultScore}); - preset.setupJoint(joint); - } else { - logger.log(Level.INFO, "No joint match found for bone {0}", boneName); - if (resultScore > 0) { - logger.log(Level.INFO, "Best match found is {0} with score {1}", new Object[]{resultName, resultScore}); - } - new JointPreset().setupJoint(joint); - } - - } - - protected class JointPreset { - - private float maxX, minX, maxY, minY, maxZ, minZ; - - public JointPreset() { - } - - public JointPreset(float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { - this.maxX = maxX; - this.minX = minX; - this.maxY = maxY; - this.minY = minY; - this.maxZ = maxZ; - this.minZ = minZ; - } - - public void setupJoint(SixDofJoint joint) { - joint.getRotationalLimitMotor(0).setHiLimit(maxX); - joint.getRotationalLimitMotor(0).setLoLimit(minX); - joint.getRotationalLimitMotor(1).setHiLimit(maxY); - joint.getRotationalLimitMotor(1).setLoLimit(minY); - joint.getRotationalLimitMotor(2).setHiLimit(maxZ); - joint.getRotationalLimitMotor(2).setLoLimit(minZ); - } - } - - protected class LexiconEntry extends HashMap { - - public void addSynonym(String word, int score) { - put(word.toLowerCase(), score); - } - - public int getScore(String word) { - int score = 0; - String searchWord = word.toLowerCase(); - for (String key : this.keySet()) { - if (searchWord.indexOf(key) >= 0) { - score += get(key); - } - } - return score; - } - } -} diff --git a/engine/src/jbullet/com/jme3/bullet/control/ragdoll/RagdollUtils.java b/engine/src/jbullet/com/jme3/bullet/control/ragdoll/RagdollUtils.java deleted file mode 100644 index 7aeb3a901..000000000 --- a/engine/src/jbullet/com/jme3/bullet/control/ragdoll/RagdollUtils.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.bullet.control.ragdoll; - -import com.jme3.animation.Bone; -import com.jme3.animation.Skeleton; -import com.jme3.bullet.collision.shapes.HullCollisionShape; -import com.jme3.bullet.joints.SixDofJoint; -import com.jme3.math.Quaternion; -import com.jme3.math.Transform; -import com.jme3.math.Vector3f; -import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.VertexBuffer.Type; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * - * @author Nehon - */ -public class RagdollUtils { - - public static void setJointLimit(SixDofJoint joint, float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { - - joint.getRotationalLimitMotor(0).setHiLimit(maxX); - joint.getRotationalLimitMotor(0).setLoLimit(minX); - joint.getRotationalLimitMotor(1).setHiLimit(maxY); - joint.getRotationalLimitMotor(1).setLoLimit(minY); - joint.getRotationalLimitMotor(2).setHiLimit(maxZ); - joint.getRotationalLimitMotor(2).setLoLimit(minZ); - } - - public static Map> buildPointMap(Spatial model) { - - - Map> map = new HashMap>(); - if (model instanceof Geometry) { - Geometry g = (Geometry) model; - buildPointMapForMesh(g.getMesh(), map); - } else if (model instanceof Node) { - Node node = (Node) model; - for (Spatial s : node.getChildren()) { - if (s instanceof Geometry) { - Geometry g = (Geometry) s; - buildPointMapForMesh(g.getMesh(), map); - } - } - } - return map; - } - - private static Map> buildPointMapForMesh(Mesh mesh, Map> map) { - - FloatBuffer vertices = mesh.getFloatBuffer(Type.Position); - ByteBuffer boneIndices = (ByteBuffer) mesh.getBuffer(Type.BoneIndex).getData(); - FloatBuffer boneWeight = (FloatBuffer) mesh.getBuffer(Type.BoneWeight).getData(); - - vertices.rewind(); - boneIndices.rewind(); - boneWeight.rewind(); - - int vertexComponents = mesh.getVertexCount() * 3; - int k, start, index; - float maxWeight = 0; - - for (int i = 0; i < vertexComponents; i += 3) { - - - start = i / 3 * 4; - index = 0; - maxWeight = -1; - for (k = start; k < start + 4; k++) { - float weight = boneWeight.get(k); - if (weight > maxWeight) { - maxWeight = weight; - index = boneIndices.get(k); - } - } - List points = map.get(index); - if (points == null) { - points = new ArrayList(); - map.put(index, points); - } - points.add(vertices.get(i)); - points.add(vertices.get(i + 1)); - points.add(vertices.get(i + 2)); - } - return map; - } - - /** - * Create a hull collision shape from linked vertices to this bone. - * Vertices have to be previoulsly gathered in a map using buildPointMap method - * @param link - * @param model - * @return - */ - public static HullCollisionShape makeShapeFromPointMap(Map> pointsMap, List boneIndices, Vector3f initialScale, Vector3f initialPosition) { - - ArrayList points = new ArrayList(); - for (Integer index : boneIndices) { - List l = pointsMap.get(index); - if (l != null) { - - for (int i = 0; i < l.size(); i += 3) { - Vector3f pos = new Vector3f(); - pos.x = l.get(i); - pos.y = l.get(i + 1); - pos.z = l.get(i + 2); - pos.subtractLocal(initialPosition).multLocal(initialScale); - points.add(pos.x); - points.add(pos.y); - points.add(pos.z); - } - } - } - - float[] p = new float[points.size()]; - for (int i = 0; i < points.size(); i++) { - p[i] = points.get(i); - } - - - return new HullCollisionShape(p); - } - - //retruns the list of bone indices of the given bone and its child(if they are not in the boneList) - public static List getBoneIndices(Bone bone, Skeleton skeleton, Set boneList) { - List list = new LinkedList(); - if (boneList.isEmpty()) { - list.add(skeleton.getBoneIndex(bone)); - } else { - list.add(skeleton.getBoneIndex(bone)); - for (Bone chilBone : bone.getChildren()) { - if (!boneList.contains(chilBone.getName())) { - list.addAll(getBoneIndices(chilBone, skeleton, boneList)); - } - } - } - return list; - } - - /** - * Create a hull collision shape from linked vertices to this bone. - * - * @param link - * @param model - * @return - */ - public static HullCollisionShape makeShapeFromVerticeWeights(Spatial model, List boneIndices, Vector3f initialScale, Vector3f initialPosition, float weightThreshold) { - - ArrayList points = new ArrayList(); - if (model instanceof Geometry) { - Geometry g = (Geometry) model; - for (Integer index : boneIndices) { - points.addAll(getPoints(g.getMesh(), index, initialScale, initialPosition, weightThreshold)); - } - } else if (model instanceof Node) { - Node node = (Node) model; - for (Spatial s : node.getChildren()) { - if (s instanceof Geometry) { - Geometry g = (Geometry) s; - for (Integer index : boneIndices) { - points.addAll(getPoints(g.getMesh(), index, initialScale, initialPosition, weightThreshold)); - } - - } - } - } - float[] p = new float[points.size()]; - for (int i = 0; i < points.size(); i++) { - p[i] = points.get(i); - } - - - return new HullCollisionShape(p); - } - - /** - * returns a list of points for the given bone - * @param mesh - * @param boneIndex - * @param offset - * @param link - * @return - */ - private static List getPoints(Mesh mesh, int boneIndex, Vector3f initialScale, Vector3f offset, float weightThreshold) { - - FloatBuffer vertices = mesh.getFloatBuffer(Type.Position); - ByteBuffer boneIndices = (ByteBuffer) mesh.getBuffer(Type.BoneIndex).getData(); - FloatBuffer boneWeight = (FloatBuffer) mesh.getBuffer(Type.BoneWeight).getData(); - - vertices.rewind(); - boneIndices.rewind(); - boneWeight.rewind(); - - ArrayList results = new ArrayList(); - - int vertexComponents = mesh.getVertexCount() * 3; - - for (int i = 0; i < vertexComponents; i += 3) { - int k; - boolean add = false; - int start = i / 3 * 4; - for (k = start; k < start + 4; k++) { - if (boneIndices.get(k) == boneIndex && boneWeight.get(k) >= weightThreshold) { - add = true; - break; - } - } - if (add) { - - Vector3f pos = new Vector3f(); - pos.x = vertices.get(i); - pos.y = vertices.get(i + 1); - pos.z = vertices.get(i + 2); - pos.subtractLocal(offset).multLocal(initialScale); - results.add(pos.x); - results.add(pos.y); - results.add(pos.z); - - } - } - - return results; - } - - /** - * Updates a bone position and rotation. - * if the child bones are not in the bone list this means, they are not associated with a physic shape. - * So they have to be updated - * @param bone the bone - * @param pos the position - * @param rot the rotation - */ - public static void setTransform(Bone bone, Vector3f pos, Quaternion rot, boolean restoreBoneControl, Set boneList) { - //we ensure that we have the control - if (restoreBoneControl) { - bone.setUserControl(true); - } - //we set te user transforms of the bone - bone.setUserTransformsWorld(pos, rot); - for (Bone childBone : bone.getChildren()) { - //each child bone that is not in the list is updated - if (!boneList.contains(childBone.getName())) { - Transform t = childBone.getCombinedTransform(pos, rot); - setTransform(childBone, t.getTranslation(), t.getRotation(), restoreBoneControl, boneList); - } - } - //we give back the control to the keyframed animation - if (restoreBoneControl) { - bone.setUserControl(false); - } - } - - public static void setUserControl(Bone bone, boolean bool) { - bone.setUserControl(bool); - for (Bone child : bone.getChildren()) { - setUserControl(child, bool); - } - } -} diff --git a/engine/src/jogl/com/jme3/renderer/jogl/JoglRenderer.java b/engine/src/jogl/com/jme3/renderer/jogl/JoglRenderer.java deleted file mode 100644 index e1febde85..000000000 --- a/engine/src/jogl/com/jme3/renderer/jogl/JoglRenderer.java +++ /dev/null @@ -1,1114 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.renderer.jogl; - -import com.jme3.light.DirectionalLight; -import com.jme3.light.Light; -import com.jme3.light.LightList; -import com.jme3.light.PointLight; -import com.jme3.material.RenderState; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Matrix4f; -import com.jme3.renderer.Caps; -import com.jme3.renderer.GLObjectManager; -import com.jme3.renderer.IDList; -import com.jme3.renderer.RenderContext; -import com.jme3.renderer.Renderer; -import com.jme3.renderer.Statistics; -import com.jme3.scene.Mesh; -import com.jme3.scene.Mesh.Mode; -import com.jme3.scene.VertexBuffer; -import com.jme3.scene.VertexBuffer.Type; -import com.jme3.scene.VertexBuffer.Usage; -import com.jme3.shader.Shader; -import com.jme3.shader.Shader.ShaderSource; -import com.jme3.texture.FrameBuffer; -import com.jme3.texture.Image; -import com.jme3.texture.Texture; -import com.jme3.texture.Texture.WrapAxis; -import com.jme3.util.BufferUtils; -import com.jme3.util.IntMap; -import com.jme3.util.IntMap.Entry; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.util.EnumSet; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.media.opengl.GL; - -public class JoglRenderer implements Renderer { - - private static final Logger logger = Logger.getLogger(JoglRenderer.class.getName()); - protected Statistics statistics = new Statistics(); - protected Matrix4f worldMatrix = new Matrix4f(); - protected Matrix4f viewMatrix = new Matrix4f(); - protected Matrix4f projMatrix = new Matrix4f(); - protected FloatBuffer fb16 = BufferUtils.createFloatBuffer(16); - protected IntBuffer ib1 = BufferUtils.createIntBuffer(1); - protected GL gl; - private RenderContext context = new RenderContext(); - private GLObjectManager objManager = new GLObjectManager(); - private EnumSet caps = EnumSet.noneOf(Caps.class); - private boolean powerOf2 = false; - private boolean hardwareMips = false; - private boolean vbo = false; - private int vpX, vpY, vpW, vpH; - - public JoglRenderer(GL gl) { - this.gl = gl; - } - - public void setGL(GL gl) { - this.gl = gl; - } - - public Statistics getStatistics() { - return statistics; - } - - public void initialize() { - logger.log(Level.INFO, "Vendor: {0}", gl.glGetString(gl.GL_VENDOR)); - logger.log(Level.INFO, "Renderer: {0}", gl.glGetString(gl.GL_RENDERER)); - logger.log(Level.INFO, "Version: {0}", gl.glGetString(gl.GL_VERSION)); - - applyRenderState(RenderState.DEFAULT); - - powerOf2 = gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two"); - hardwareMips = gl.isExtensionAvailable("GL_SGIS_generate_mipmap"); - vbo = gl.isExtensionAvailable("GL_ARB_vertex_buffer_object"); - } - - public EnumSet getCaps() { - return caps; - } - - public void setBackgroundColor(ColorRGBA color) { - gl.glClearColor(color.r, color.g, color.b, color.a); - } - - public void cleanup() { - objManager.deleteAllObjects(this); - } - - public void resetGLObjects() { - objManager.resetObjects(); - } - - public void clearBuffers(boolean color, boolean depth, boolean stencil) { - int bits = 0; - if (color) { - bits = gl.GL_COLOR_BUFFER_BIT; - } - if (depth) { - bits |= gl.GL_DEPTH_BUFFER_BIT; - } - if (stencil) { - bits |= gl.GL_STENCIL_BUFFER_BIT; - } - if (bits != 0) { - gl.glClear(bits); - } - } - - public void applyRenderState(RenderState state) { - - if (state.isWireframe() && !context.wireframe) { - gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE); - context.wireframe = true; - } else if (!state.isWireframe() && context.wireframe) { - gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL); - context.wireframe = false; - } - - - if (state.isDepthTest() && !context.depthTestEnabled) { - gl.glEnable(gl.GL_DEPTH_TEST); - gl.glDepthFunc(gl.GL_LEQUAL); - context.depthTestEnabled = true; - } else if (!state.isDepthTest() && context.depthTestEnabled) { - gl.glDisable(gl.GL_DEPTH_TEST); - context.depthTestEnabled = false; - } - if (state.isAlphaTest() && !context.alphaTestEnabled) { - gl.glEnable(gl.GL_ALPHA_TEST); - gl.glAlphaFunc(gl.GL_GREATER, state.getAlphaFallOff()); - context.alphaTestEnabled = true; - } else if (!state.isAlphaTest() && context.alphaTestEnabled) { - gl.glDisable(gl.GL_ALPHA_TEST); - context.alphaTestEnabled = false; - } - if (state.isDepthWrite() && !context.depthWriteEnabled) { - gl.glDepthMask(true); - context.depthWriteEnabled = true; - } else if (!state.isDepthWrite() && context.depthWriteEnabled) { - gl.glDepthMask(false); - context.depthWriteEnabled = false; - } - if (state.isColorWrite() && !context.colorWriteEnabled) { - gl.glColorMask(true, true, true, true); - context.colorWriteEnabled = true; - } else if (!state.isColorWrite() && context.colorWriteEnabled) { - gl.glColorMask(false, false, false, false); - context.colorWriteEnabled = false; - } - if (state.isPointSprite() && !context.pointSprite) { - gl.glEnable(GL.GL_POINT_SPRITE); - gl.glTexEnvi(GL.GL_POINT_SPRITE, GL.GL_COORD_REPLACE, GL.GL_TRUE); - gl.glPointParameterf(GL.GL_POINT_SIZE_MIN, 1.0f); - } else if (!state.isPointSprite() && context.pointSprite) { - gl.glDisable(GL.GL_POINT_SPRITE); - } - if (state.isPolyOffset()) { - if (!context.polyOffsetEnabled) { - gl.glEnable(gl.GL_POLYGON_OFFSET_FILL); - gl.glPolygonOffset(state.getPolyOffsetFactor(), - state.getPolyOffsetUnits()); - context.polyOffsetEnabled = true; - context.polyOffsetFactor = state.getPolyOffsetFactor(); - context.polyOffsetUnits = state.getPolyOffsetUnits(); - } else { - if (state.getPolyOffsetFactor() != context.polyOffsetFactor - || state.getPolyOffsetUnits() != context.polyOffsetUnits) { - gl.glPolygonOffset(state.getPolyOffsetFactor(), - state.getPolyOffsetUnits()); - context.polyOffsetFactor = state.getPolyOffsetFactor(); - context.polyOffsetUnits = state.getPolyOffsetUnits(); - } - } - } else { - if (context.polyOffsetEnabled) { - gl.glDisable(gl.GL_POLYGON_OFFSET_FILL); - context.polyOffsetEnabled = false; - context.polyOffsetFactor = 0; - context.polyOffsetUnits = 0; - } - } - if (state.getFaceCullMode() != context.cullMode) { - if (state.getFaceCullMode() == RenderState.FaceCullMode.Off) { - gl.glDisable(gl.GL_CULL_FACE); - } else { - gl.glEnable(gl.GL_CULL_FACE); - } - - switch (state.getFaceCullMode()) { - case Off: - break; - case Back: - gl.glCullFace(gl.GL_BACK); - break; - case Front: - gl.glCullFace(gl.GL_FRONT); - break; - case FrontAndBack: - gl.glCullFace(gl.GL_FRONT_AND_BACK); - break; - default: - throw new UnsupportedOperationException("Unrecognized face cull mode: " - + state.getFaceCullMode()); - } - - context.cullMode = state.getFaceCullMode(); - } - if (state.getBlendMode() != context.blendMode) { - if (state.getBlendMode() == RenderState.BlendMode.Off) { - gl.glDisable(gl.GL_BLEND); - } else { - gl.glEnable(gl.GL_BLEND); - } - - switch (state.getBlendMode()) { - case Off: - break; - case Additive: - gl.glBlendFunc(gl.GL_ONE, gl.GL_ONE); - break; - case AlphaAdditive: - gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE); - break; - case Alpha: - gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA); - break; - case Color: - gl.glBlendFunc(gl.GL_ONE, gl.GL_ONE_MINUS_SRC_COLOR); - break; - case PremultAlpha: - gl.glBlendFunc(gl.GL_ONE, gl.GL_ONE_MINUS_SRC_ALPHA); - break; - case Modulate: - gl.glBlendFunc(gl.GL_DST_COLOR, gl.GL_ZERO); - break; - case ModulateX2: - gl.glBlendFunc(gl.GL_DST_COLOR, gl.GL_SRC_COLOR); - break; - default: - throw new UnsupportedOperationException("Unrecognized blend mode: " - + state.getBlendMode()); - } - - context.blendMode = state.getBlendMode(); - } - - } - - public void onFrame() { - objManager.deleteUnused(this); - } - - public void setDepthRange(float start, float end) { - gl.glDepthRange(start, end); - } - - public void setViewPort(int x, int y, int width, int height) { - gl.glViewport(x, y, width, height); - vpX = x; - vpY = y; - vpW = width; - vpH = height; - } - - public void setClipRect(int x, int y, int width, int height) { - if (!context.clipRectEnabled) { - gl.glEnable(gl.GL_SCISSOR_TEST); - context.clipRectEnabled = true; - } - gl.glScissor(x, y, width, height); - } - - public void clearClipRect() { - if (context.clipRectEnabled) { - gl.glDisable(gl.GL_SCISSOR_TEST); - context.clipRectEnabled = false; - } - } - - private FloatBuffer storeMatrix(Matrix4f matrix, FloatBuffer store) { - store.rewind(); - matrix.fillFloatBuffer(store, true); - store.rewind(); - return store; - } - - public void setViewProjectionMatrices(Matrix4f viewMatrix, Matrix4f projMatrix) { - this.viewMatrix.set(viewMatrix); - this.projMatrix.set(projMatrix); - - if (context.matrixMode != gl.GL_PROJECTION) { - gl.glMatrixMode(gl.GL_PROJECTION); - context.matrixMode = gl.GL_PROJECTION; - } - - gl.glLoadMatrixf(storeMatrix(projMatrix, fb16)); - } - - public void setWorldMatrix(Matrix4f worldMatrix) { - this.worldMatrix.set(worldMatrix); - - if (context.matrixMode != gl.GL_MODELVIEW) { - gl.glMatrixMode(gl.GL_MODELVIEW); - context.matrixMode = gl.GL_MODELVIEW; - } - - gl.glLoadMatrixf(storeMatrix(viewMatrix, fb16)); - gl.glMultMatrixf(storeMatrix(worldMatrix, fb16)); - } - - public void setLighting(LightList list) { - if (list == null || list.size() == 0) { - // turn off lighting - gl.glDisable(gl.GL_LIGHTING); - return; - } - - gl.glEnable(gl.GL_LIGHTING); - gl.glShadeModel(gl.GL_SMOOTH); - - float[] temp = new float[4]; - - // reset model view to specify - // light positions in world space - // instead of model space -// gl.glPushMatrix(); -// gl.glLoadIdentity(); - - for (int i = 0; i < list.size() + 1; i++) { - - int lightId = gl.GL_LIGHT0 + i; - - if (list.size() <= i) { - // goes beyond the num lights we need - // disable it - gl.glDisable(lightId); - break; - } - - Light l = list.get(i); - - if (!l.isEnabled()) { - gl.glDisable(lightId); - continue; - } - - ColorRGBA color = l.getColor(); - color.toArray(temp); - - gl.glEnable(lightId); - gl.glLightfv(lightId, gl.GL_DIFFUSE, temp, 0); - gl.glLightfv(lightId, gl.GL_SPECULAR, temp, 0); - - ColorRGBA.Black.toArray(temp); - gl.glLightfv(lightId, gl.GL_AMBIENT, temp, 0); - - switch (l.getType()) { - case Directional: - DirectionalLight dl = (DirectionalLight) l; - dl.getDirection().toArray(temp); - temp[3] = 0f; // marks to GL its a directional light - gl.glLightfv(lightId, gl.GL_POSITION, temp, 0); - break; - case Point: - PointLight pl = (PointLight) l; - pl.getPosition().toArray(temp); - temp[3] = 1f; // marks to GL its a point light - gl.glLightfv(lightId, gl.GL_POSITION, temp, 0); - break; - } - - } - - // restore modelview to original value -// gl.glPopMatrix(); - } - - public void deleteShaderSource(ShaderSource source) { - } - - public void setShader(Shader shader) { - } - - public void deleteShader(Shader shader) { - } - - public void copyFrameBuffer(FrameBuffer src, FrameBuffer dst) { - } - - public void setFrameBuffer(FrameBuffer fb) { - } - - public void deleteFrameBuffer(FrameBuffer fb) { - } - - public void readFrameBuffer(FrameBuffer fb, ByteBuffer byteBuf) { - if (fb != null) { - return; - } - - gl.glReadPixels(vpX, vpY, vpW, vpH, gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, byteBuf); - } - - private int convertTextureType(Texture.Type type) { - switch (type) { - case TwoDimensional: - return gl.GL_TEXTURE_2D; - case TwoDimensionalArray: - return gl.GL_TEXTURE_2D_ARRAY_EXT; - case ThreeDimensional: - return gl.GL_TEXTURE_3D; - case CubeMap: - return gl.GL_TEXTURE_CUBE_MAP; - default: - throw new UnsupportedOperationException("Unknown texture type: " + type); - } - } - - private int convertMagFilter(Texture.MagFilter filter) { - switch (filter) { - case Bilinear: - return gl.GL_LINEAR; - case Nearest: - return gl.GL_NEAREST; - default: - throw new UnsupportedOperationException("Unknown mag filter: " + filter); - } - } - - private int convertMinFilter(Texture.MinFilter filter) { - switch (filter) { - case Trilinear: - return gl.GL_LINEAR_MIPMAP_LINEAR; - case BilinearNearestMipMap: - return gl.GL_LINEAR_MIPMAP_NEAREST; - case NearestLinearMipMap: - return gl.GL_NEAREST_MIPMAP_LINEAR; - case NearestNearestMipMap: - return gl.GL_NEAREST_MIPMAP_NEAREST; - case BilinearNoMipMaps: - return gl.GL_LINEAR; - case NearestNoMipMaps: - return gl.GL_NEAREST; - default: - throw new UnsupportedOperationException("Unknown min filter: " + filter); - } - } - - private int convertWrapMode(Texture.WrapMode mode) { - switch (mode) { - case BorderClamp: - return gl.GL_CLAMP_TO_BORDER; - case Clamp: - return gl.GL_CLAMP; - case EdgeClamp: - return gl.GL_CLAMP_TO_EDGE; - case Repeat: - return gl.GL_REPEAT; - case MirroredRepeat: - return gl.GL_MIRRORED_REPEAT; - default: - throw new UnsupportedOperationException("Unknown wrap mode: " + mode); - } - } - - private void setupTextureParams(Texture tex) { - int target = convertTextureType(tex.getType()); - - // filter things - int minFilter = convertMinFilter(tex.getMinFilter()); - int magFilter = convertMagFilter(tex.getMagFilter()); - gl.glTexParameteri(target, gl.GL_TEXTURE_MIN_FILTER, minFilter); - gl.glTexParameteri(target, gl.GL_TEXTURE_MAG_FILTER, magFilter); - - // repeat modes - switch (tex.getType()) { - case ThreeDimensional: - case CubeMap: - gl.glTexParameteri(target, gl.GL_TEXTURE_WRAP_R, convertWrapMode(tex.getWrap(WrapAxis.R))); - case TwoDimensional: - gl.glTexParameteri(target, gl.GL_TEXTURE_WRAP_T, convertWrapMode(tex.getWrap(WrapAxis.T))); - // fall down here is intentional.. -// case OneDimensional: - gl.glTexParameteri(target, gl.GL_TEXTURE_WRAP_S, convertWrapMode(tex.getWrap(WrapAxis.S))); - break; - default: - throw new UnsupportedOperationException("Unknown texture type: " + tex.getType()); - } - - // R to Texture compare mode - if (tex.getShadowCompareMode() != Texture.ShadowCompareMode.Off) { - gl.glTexParameteri(target, GL.GL_TEXTURE_COMPARE_MODE, GL.GL_COMPARE_R_TO_TEXTURE); - gl.glTexParameteri(target, GL.GL_DEPTH_TEXTURE_MODE, GL.GL_INTENSITY); - if (tex.getShadowCompareMode() == Texture.ShadowCompareMode.GreaterOrEqual) { - gl.glTexParameteri(target, GL.GL_TEXTURE_COMPARE_FUNC, GL.GL_GEQUAL); - } else { - gl.glTexParameteri(target, GL.GL_TEXTURE_COMPARE_FUNC, GL.GL_LEQUAL); - } - } - } - - public void updateTexImageData(Image image, Texture.Type type, boolean mips) { - int texId = image.getId(); - if (texId == -1) { - // create texture - gl.glGenTextures(1, ib1); - texId = ib1.get(0); - image.setId(texId); - objManager.registerForCleanup(image); - - statistics.onNewTexture(); - } - - // bind texture - int target = convertTextureType(type); - if (context.boundTextures[0] != image) { - if (context.boundTextureUnit != 0) { - gl.glActiveTexture(gl.GL_TEXTURE0); - context.boundTextureUnit = 0; - } - - gl.glBindTexture(target, texId); - context.boundTextures[0] = image; - } - - boolean generateMips = false; - if (!image.hasMipmaps() && mips) { - // No pregenerated mips available, - // generate from base level if required - if (hardwareMips) { - gl.glTexParameteri(target, GL.GL_GENERATE_MIPMAP, gl.GL_TRUE); - } else { - generateMips = true; - } - } - - TextureUtil.uploadTexture(gl, image, 0, generateMips, powerOf2); - - - image.clearUpdateNeeded(); - } - - private void checkTexturingUsed() { - IDList textureList = context.textureIndexList; - // old mesh used texturing, new mesh doesn't use it - // should actually go through entire oldLen and - // disable texturing for each unit.. but that's for later. - if (textureList.oldLen > 0 && textureList.newLen == 0) { - gl.glDisable(gl.GL_TEXTURE_2D); - } - } - - public void setTexture(int unit, Texture tex) { - Image image = tex.getImage(); - if (image.isUpdateNeeded()) { - updateTexImageData(image, tex.getType(), tex.getMinFilter().usesMipMapLevels()); - } - - int texId = image.getId(); - assert texId != -1; - - Image[] textures = context.boundTextures; - - int type = convertTextureType(tex.getType()); - if (!context.textureIndexList.moveToNew(unit)) { - if (context.boundTextureUnit != unit) { - gl.glActiveTexture(gl.GL_TEXTURE0 + unit); - context.boundTextureUnit = unit; - } - - gl.glEnable(type); - } - - if (textures[unit] != image) { - if (context.boundTextureUnit != unit) { - gl.glActiveTexture(gl.GL_TEXTURE0 + unit); - context.boundTextureUnit = unit; - } - - gl.glBindTexture(type, texId); - textures[unit] = image; - } - } - - public void clearTextureUnits() { - IDList textureList = context.textureIndexList; - Image[] textures = context.boundTextures; - for (int i = 0; i < textureList.oldLen; i++) { - int idx = textureList.oldList[i]; - - if (context.boundTextureUnit != idx) { - gl.glActiveTexture(gl.GL_TEXTURE0 + idx); - context.boundTextureUnit = idx; - } - // XXX: Uncomment me - //gl.glDisable(convertTextureType(textures[idx].getType())); - textures[idx] = null; - } - context.textureIndexList.copyNewToOld(); - } - - public void deleteImage(Image image) { - int texId = image.getId(); - if (texId != -1) { - ib1.put(0, texId); - ib1.position(0).limit(1); - gl.glDeleteTextures(1, ib1); - image.resetObject(); - } - } - - private int convertUsage(Usage usage) { - switch (usage) { - case Static: - return gl.GL_STATIC_DRAW; - case Dynamic: - return gl.GL_DYNAMIC_DRAW; - case Stream: - return gl.GL_STREAM_DRAW; - default: - throw new RuntimeException("Unknown usage type: " + usage); - } - } - - public void updateBufferData(VertexBuffer vb) { - int bufId = vb.getId(); - if (bufId == -1) { - // create buffer - gl.glGenBuffers(1, ib1); - bufId = ib1.get(0); - vb.setId(bufId); - objManager.registerForCleanup(vb); - } - - int target; - if (vb.getBufferType() == VertexBuffer.Type.Index) { - target = gl.GL_ELEMENT_ARRAY_BUFFER; - if (context.boundElementArrayVBO != bufId) { - gl.glBindBuffer(target, bufId); - context.boundElementArrayVBO = bufId; - } - } else { - target = gl.GL_ARRAY_BUFFER; - if (context.boundArrayVBO != bufId) { - gl.glBindBuffer(target, bufId); - context.boundArrayVBO = bufId; - } - } - - int usage = convertUsage(vb.getUsage()); - Buffer data = vb.getData(); - data.rewind(); - - gl.glBufferData(target, - data.capacity() * vb.getFormat().getComponentSize(), - data, - usage); - - vb.clearUpdateNeeded(); - } - - public void deleteBuffer(VertexBuffer vb) { - int bufId = vb.getId(); - if (bufId != -1) { - // delete buffer - ib1.put(0, bufId); - ib1.position(0).limit(1); - gl.glDeleteBuffers(1, ib1); - vb.resetObject(); - } - } - - private int convertArrayType(VertexBuffer.Type type) { - switch (type) { - case Position: - return gl.GL_VERTEX_ARRAY; - case Normal: - return gl.GL_NORMAL_ARRAY; - case TexCoord: - return gl.GL_TEXTURE_COORD_ARRAY; - case Color: - return gl.GL_COLOR_ARRAY; - default: - return -1; // unsupported - } - } - - private int convertVertexFormat(VertexBuffer.Format fmt) { - switch (fmt) { - case Byte: - return gl.GL_BYTE; - case Double: - return gl.GL_DOUBLE; - case Float: - return gl.GL_FLOAT; - case Half: - return gl.GL_HALF_FLOAT_ARB; - case Int: - return gl.GL_INT; - case Short: - return gl.GL_SHORT; - case UnsignedByte: - return gl.GL_UNSIGNED_BYTE; - case UnsignedInt: - return gl.GL_UNSIGNED_INT; - case UnsignedShort: - return gl.GL_UNSIGNED_SHORT; - default: - throw new UnsupportedOperationException("Unrecognized vertex format: " + fmt); - } - } - - private int convertElementMode(Mesh.Mode mode) { - switch (mode) { - case Points: - return gl.GL_POINTS; - case Lines: - return gl.GL_LINES; - case LineLoop: - return gl.GL_LINE_LOOP; - case LineStrip: - return gl.GL_LINE_STRIP; - case Triangles: - return gl.GL_TRIANGLES; - case TriangleFan: - return gl.GL_TRIANGLE_FAN; - case TriangleStrip: - return gl.GL_TRIANGLE_STRIP; - default: - throw new UnsupportedOperationException("Unrecognized mesh mode: " + mode); - } - } - - private void setVertexAttribVBO(VertexBuffer vb, VertexBuffer idb) { - int arrayType = convertArrayType(vb.getBufferType()); - if (arrayType == -1) { - return; // unsupported - } - if (vb.isUpdateNeeded() && idb == null) { - updateBufferData(vb); - } - - int bufId = idb != null ? idb.getId() : vb.getId(); - if (context.boundArrayVBO != bufId) { - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, bufId); - context.boundArrayVBO = bufId; - } - - gl.glEnableClientState(arrayType); - context.boundAttribs[vb.getBufferType().ordinal()] = vb; - - if (vb.getBufferType() == Type.Normal) { - // normalize if requested - if (vb.isNormalized() && !context.normalizeEnabled) { - gl.glEnable(gl.GL_NORMALIZE); - context.normalizeEnabled = true; - } else if (!vb.isNormalized() && context.normalizeEnabled) { - gl.glDisable(gl.GL_NORMALIZE); - context.normalizeEnabled = false; - } - } - - int comps = vb.getNumComponents(); - int type = convertVertexFormat(vb.getFormat()); - - switch (vb.getBufferType()) { - case Position: - gl.glVertexPointer(comps, type, vb.getStride(), vb.getOffset()); - break; - case Normal: - gl.glNormalPointer(type, vb.getStride(), vb.getOffset()); - break; - case Color: - gl.glColorPointer(comps, type, vb.getStride(), vb.getOffset()); - break; - case TexCoord: - gl.glTexCoordPointer(comps, type, vb.getStride(), vb.getOffset()); - break; - } - } - - private void drawTriangleListVBO(VertexBuffer indexBuf, Mesh mesh, int count) { - if (indexBuf.getBufferType() != VertexBuffer.Type.Index) { - throw new IllegalArgumentException("Only index buffers are allowed as triangle lists."); - } - - if (indexBuf.isUpdateNeeded()) { - updateBufferData(indexBuf); - } - - int bufId = indexBuf.getId(); - assert bufId != -1; - - if (context.boundElementArrayVBO != bufId) { - gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, bufId); - context.boundElementArrayVBO = bufId; - } - - if (mesh.getMode() == Mode.Hybrid) { - int[] modeStart = mesh.getModeStart(); - int[] elementLengths = mesh.getElementLengths(); - - int elMode = convertElementMode(Mode.Triangles); - int fmt = convertVertexFormat(indexBuf.getFormat()); - int elSize = indexBuf.getFormat().getComponentSize(); -// int listStart = modeStart[0]; - int stripStart = modeStart[1]; - int fanStart = modeStart[2]; - int curOffset = 0; - for (int i = 0; i < elementLengths.length; i++) { - if (i == stripStart) { - elMode = convertElementMode(Mode.TriangleStrip); - } else if (i == fanStart) { - elMode = convertElementMode(Mode.TriangleStrip); - } - int elementLength = elementLengths[i]; - gl.glDrawElements(elMode, - elementLength, - fmt, - curOffset); - curOffset += elementLength * elSize; - } - } else { - gl.glDrawElements(convertElementMode(mesh.getMode()), - indexBuf.getData().capacity(), - convertVertexFormat(indexBuf.getFormat()), - 0); - } - } - - public void setVertexAttrib(VertexBuffer vb, VertexBuffer idb) { - int arrayType = convertArrayType(vb.getBufferType()); - if (arrayType == -1) { - return; // unsupported - } - gl.glEnableClientState(arrayType); - context.boundAttribs[vb.getBufferType().ordinal()] = vb; - - if (vb.getBufferType() == Type.Normal) { - // normalize if requested - if (vb.isNormalized() && !context.normalizeEnabled) { - gl.glEnable(gl.GL_NORMALIZE); - context.normalizeEnabled = true; - } else if (!vb.isNormalized() && context.normalizeEnabled) { - gl.glDisable(gl.GL_NORMALIZE); - context.normalizeEnabled = false; - } - } - - // NOTE: Use data from interleaved buffer if specified - Buffer data = idb != null ? idb.getData() : vb.getData(); - int comps = vb.getNumComponents(); - int type = convertVertexFormat(vb.getFormat()); - data.clear(); - data.position(vb.getOffset()); - - switch (vb.getBufferType()) { - case Position: - gl.glVertexPointer(comps, type, vb.getStride(), data); - break; - case Normal: - gl.glNormalPointer(type, vb.getStride(), data); - break; - case Color: - gl.glColorPointer(comps, type, vb.getStride(), data); - break; - case TexCoord: - gl.glTexCoordPointer(comps, type, vb.getStride(), data); - break; - } - } - - public void setVertexAttrib(VertexBuffer vb) { - setVertexAttrib(vb, null); - } - - public void clearVertexAttribs() { - for (int i = 0; i < 16; i++) { - VertexBuffer vb = context.boundAttribs[i]; - if (vb != null) { - int arrayType = convertArrayType(vb.getBufferType()); - gl.glDisableClientState(arrayType); - context.boundAttribs[vb.getBufferType().ordinal()] = null; - } - } - } - - public void drawTriangleList(VertexBuffer indexBuf, Mesh mesh, int count) { - Mesh.Mode mode = mesh.getMode(); - - Buffer indexData = indexBuf.getData(); - indexData.clear(); - if (mesh.getMode() == Mode.Hybrid) { - int[] modeStart = mesh.getModeStart(); - int[] elementLengths = mesh.getElementLengths(); - - int elMode = convertElementMode(Mode.Triangles); - int fmt = convertVertexFormat(indexBuf.getFormat()); -// int elSize = indexBuf.getFormat().getComponentSize(); -// int listStart = modeStart[0]; - int stripStart = modeStart[1]; - int fanStart = modeStart[2]; - int curOffset = 0; - for (int i = 0; i < elementLengths.length; i++) { - if (i == stripStart) { - elMode = convertElementMode(Mode.TriangleStrip); - } else if (i == fanStart) { - elMode = convertElementMode(Mode.TriangleStrip); - } - int elementLength = elementLengths[i]; - indexData.position(curOffset); - gl.glDrawElements(elMode, - elementLength, - fmt, - indexData); - curOffset += elementLength; - } - } else { - gl.glDrawElements(convertElementMode(mode), - indexData.capacity(), - convertVertexFormat(indexBuf.getFormat()), - indexData); - } - } - - private void renderMeshDefault(Mesh mesh, int lod, int count) { - VertexBuffer indices = null; - VertexBuffer interleavedData = mesh.getBuffer(Type.InterleavedData); - IntMap buffers = mesh.getBuffers(); - if (mesh.getNumLodLevels() > 0) { - indices = mesh.getLodLevel(lod); - } else { - indices = buffers.get(Type.Index.ordinal()); - } - for (Entry entry : buffers) { - VertexBuffer vb = entry.getValue(); - - if (vb.getBufferType() == Type.InterleavedData - || vb.getUsage() == Usage.CpuOnly) // ignore cpu-only buffers - { - continue; - } - - if (vb.getBufferType() == Type.Index) { - indices = vb; - } else { - if (vb.getStride() == 0) { - // not interleaved - setVertexAttrib(vb); - } else { - // interleaved - setVertexAttrib(vb, interleavedData); - } - } - } - - if (indices != null) { - drawTriangleList(indices, mesh, count); - } else { - gl.glDrawArrays(convertElementMode(mesh.getMode()), 0, mesh.getVertexCount()); - } - clearVertexAttribs(); - clearTextureUnits(); - } - - private void renderMeshVBO(Mesh mesh, int lod, int count) { - VertexBuffer indices = null; - VertexBuffer interleavedData = mesh.getBuffer(Type.InterleavedData); - if (interleavedData != null && interleavedData.isUpdateNeeded()) { - updateBufferData(interleavedData); - } - IntMap buffers = mesh.getBuffers(); - if (mesh.getNumLodLevels() > 0) { - indices = mesh.getLodLevel(lod); - } else { - indices = buffers.get(Type.Index.ordinal()); - } - for (Entry entry : buffers) { - VertexBuffer vb = entry.getValue(); - - if (vb.getBufferType() == Type.InterleavedData - || vb.getUsage() == Usage.CpuOnly // ignore cpu-only buffers - || vb.getBufferType() == Type.Index) { - continue; - } - - if (vb.getStride() == 0) { - // not interleaved - setVertexAttribVBO(vb, null); - } else { - // interleaved - setVertexAttribVBO(vb, interleavedData); - } - } - - if (indices != null) { - drawTriangleListVBO(indices, mesh, count); - } else { - gl.glDrawArrays(convertElementMode(mesh.getMode()), 0, mesh.getVertexCount()); - } - clearVertexAttribs(); - clearTextureUnits(); - } - - private void updateDisplayList(Mesh mesh) { - if (mesh.getId() != -1) { - // delete list first - gl.glDeleteLists(mesh.getId(), mesh.getId()); - mesh.setId(-1); - } - - // create new display list - // first set state to NULL - applyRenderState(RenderState.NULL); - - // disable lighting - setLighting(null); - - int id = gl.glGenLists(1); - mesh.setId(id); - gl.glNewList(id, gl.GL_COMPILE); - renderMeshDefault(mesh, 0, 1); - gl.glEndList(); - } - - private void renderMeshDisplayList(Mesh mesh) { - if (mesh.getId() == -1) { - updateDisplayList(mesh); - } - gl.glCallList(mesh.getId()); - } - - public void renderMesh(Mesh mesh, int lod, int count) { - if (mesh.getVertexCount() == 0) - return; - if (context.pointSize != mesh.getPointSize()) { - gl.glPointSize(mesh.getPointSize()); - context.pointSize = mesh.getPointSize(); - } - if (context.lineWidth != mesh.getLineWidth()) { - gl.glLineWidth(mesh.getLineWidth()); - context.lineWidth = mesh.getLineWidth(); - } - - checkTexturingUsed(); - - if (vbo) { - renderMeshVBO(mesh, lod, count); - } else { - boolean dynamic = false; - if (mesh.getNumLodLevels() == 0) { - IntMap bufs = mesh.getBuffers(); - for (Entry entry : bufs) { - if (entry.getValue().getUsage() != VertexBuffer.Usage.Static) { - dynamic = true; - break; - } - } - } else { - dynamic = true; - } - - if (!dynamic) { - // dealing with a static object, generate display list - renderMeshDisplayList(mesh); - } else { - renderMeshDefault(mesh, lod, count); - } - } - } - - public void setAlphaToCoverage(boolean value) { - if (value) { - gl.glEnable(gl.GL_SAMPLE_ALPHA_TO_COVERAGE); - } else { - gl.glDisable(gl.GL_SAMPLE_ALPHA_TO_COVERAGE); - } - } -} diff --git a/engine/src/jogl/com/jme3/renderer/jogl/TextureUtil.java b/engine/src/jogl/com/jme3/renderer/jogl/TextureUtil.java deleted file mode 100644 index dcc41f31f..000000000 --- a/engine/src/jogl/com/jme3/renderer/jogl/TextureUtil.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.renderer.jogl; - -import com.jme3.texture.Image; -import com.jme3.texture.Image.Format; -import java.nio.ByteBuffer; -import javax.media.opengl.GL; - -public class TextureUtil { - - public static int convertTextureFormat(Format fmt){ - switch (fmt){ - case Alpha16: - case Alpha8: - return GL.GL_ALPHA; - case Luminance8Alpha8: - case Luminance16Alpha16: - return GL.GL_LUMINANCE_ALPHA; - case Luminance8: - case Luminance16: - return GL.GL_LUMINANCE; - case RGB10: - case RGB16: - case BGR8: - case RGB8: - case RGB565: - return GL.GL_RGB; - case RGB5A1: - case RGBA16: - case RGBA8: - return GL.GL_RGBA; - default: - throw new UnsupportedOperationException("Unrecognized format: "+fmt); - } - } - - public static void uploadTexture(GL gl, - Image img, - int index, - boolean generateMips, - boolean powerOf2){ - - Image.Format fmt = img.getFormat(); - ByteBuffer data; - if (index >= 0 || img.getData() != null && img.getData().size() > 0){ - data = img.getData(index); - }else{ - data = null; - } - - int width = img.getWidth(); - int height = img.getHeight(); -// int depth = img.getDepth(); - - boolean compress = false; - int format = -1; - int internalFormat = -1; - int dataType = -1; - - switch (fmt){ - case Alpha16: - format = gl.GL_ALPHA; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_ALPHA16; - break; - case Alpha8: - format = gl.GL_ALPHA; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_ALPHA8; - break; - case Luminance8: - format = gl.GL_LUMINANCE; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_LUMINANCE8; - break; - case Luminance8Alpha8: - format = gl.GL_LUMINANCE_ALPHA; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_LUMINANCE8_ALPHA8; - break; - case Luminance16Alpha16: - format = gl.GL_LUMINANCE_ALPHA; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_LUMINANCE16_ALPHA16; - break; - case Luminance16: - format = gl.GL_LUMINANCE; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_LUMINANCE16; - break; - case RGB565: - format = gl.GL_RGB; - dataType = gl.GL_UNSIGNED_SHORT_5_6_5; - internalFormat = gl.GL_RGB8; - break; - case ARGB4444: - format = gl.GL_RGBA; - dataType = gl.GL_UNSIGNED_SHORT_4_4_4_4; - internalFormat = gl.GL_RGBA4; - break; - case RGB10: - format = gl.GL_RGB; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_RGB10; - break; - case RGB16: - format = gl.GL_RGB; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_RGB16; - break; - case RGB5A1: - format = gl.GL_RGBA; - dataType = gl.GL_UNSIGNED_SHORT_5_5_5_1; - internalFormat = gl.GL_RGB5_A1; - break; - case RGB8: - format = gl.GL_RGB; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_RGB8; - break; - case BGR8: - format = gl.GL_BGR; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_RGB8; - break; - case RGBA16: - format = gl.GL_RGBA; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_RGBA16; - break; - case RGBA8: - format = gl.GL_RGBA; - dataType = gl.GL_UNSIGNED_BYTE; - internalFormat = gl.GL_RGBA8; - break; - case DXT1: - compress = true; - internalFormat = gl.GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - format = gl.GL_RGB; - dataType = gl.GL_UNSIGNED_BYTE; - break; - case DXT1A: - compress = true; - internalFormat = gl.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; - format = gl.GL_RGBA; - dataType = gl.GL_UNSIGNED_BYTE; - break; - case DXT3: - compress = true; - internalFormat = gl.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - format = gl.GL_RGBA; - dataType = gl.GL_UNSIGNED_BYTE; - break; - case DXT5: - compress = true; - internalFormat = gl.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - format = gl.GL_RGBA; - dataType = gl.GL_UNSIGNED_BYTE; - break; - default: - throw new UnsupportedOperationException("Unrecognized format: "+fmt); - } - - if (data != null) - gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1); - - int[] mipSizes = img.getMipMapSizes(); - int pos = 0; - if (mipSizes == null){ - if (data != null) - mipSizes = new int[]{ data.capacity() }; - else - mipSizes = new int[]{ width * height * fmt.getBitsPerPixel() / 8 }; - } - - for (int i = 0; i < mipSizes.length; i++){ - int mipWidth = Math.max(1, width >> i); - int mipHeight = Math.max(1, height >> i); -// int mipDepth = Math.max(1, depth >> i); - - if (data != null){ - data.position(pos); - data.limit(pos + mipSizes[i]); - } - - if (compress && data != null){ - gl.glCompressedTexImage2D(gl.GL_TEXTURE_2D, - i, - internalFormat, - mipWidth, - mipHeight, - 0, - data.remaining(), - data); - }else{ - gl.glTexImage2D(gl.GL_TEXTURE_2D, - i, - internalFormat, - mipWidth, - mipHeight, - 0, - format, - dataType, - data); - } - - pos += mipSizes[i]; - } - } - -} diff --git a/engine/src/jogl/com/jme3/system/jogl/JoglAbstractDisplay.java b/engine/src/jogl/com/jme3/system/jogl/JoglAbstractDisplay.java deleted file mode 100644 index cb2cef859..000000000 --- a/engine/src/jogl/com/jme3/system/jogl/JoglAbstractDisplay.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.system.jogl; - -import com.jme3.input.KeyInput; -import com.jme3.input.MouseInput; -import com.jme3.input.awt.AwtKeyInput; -import com.jme3.input.awt.AwtMouseInput; -import com.jme3.renderer.jogl.JoglRenderer; -import com.sun.opengl.util.Animator; -import com.sun.opengl.util.FPSAnimator; -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.logging.Logger; -import javax.media.opengl.DebugGL; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCanvas; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.TraceGL; - -public abstract class JoglAbstractDisplay extends JoglContext implements GLEventListener { - - private static final Logger logger = Logger.getLogger(JoglAbstractDisplay.class.getName()); - - protected GraphicsDevice device; - protected GLCanvas canvas; - protected Animator animator; - protected AtomicBoolean active = new AtomicBoolean(false); - - protected boolean wasActive = false; - protected int frameRate; - protected boolean useAwt = true; - protected AtomicBoolean autoFlush = new AtomicBoolean(true); - protected boolean wasAnimating = false; - - protected void initGLCanvas(){ - device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); - - GLCapabilities caps = new GLCapabilities(); - caps.setHardwareAccelerated(true); - caps.setDoubleBuffered(true); - caps.setStencilBits(settings.getStencilBits()); - caps.setDepthBits(settings.getDepthBits()); - - if (settings.getSamples() > 1){ - caps.setSampleBuffers(true); - caps.setNumSamples(settings.getSamples()); - } - - canvas = new GLCanvas(caps){ - @Override - public void addNotify(){ - super.addNotify(); - onCanvasAdded(); - } - @Override - public void removeNotify(){ - onCanvasRemoved(); - super.removeNotify(); - } - }; - if (settings.isVSync()){ - canvas.getGL().setSwapInterval(1); - } - canvas.setFocusable(true); - canvas.setIgnoreRepaint(true); - canvas.addGLEventListener(this); - - GL gl = canvas.getGL(); -// if (false){ - // trace mode - // jME already uses err stream, use out instead -// gl = new TraceGL(gl, System.out); -// }else if (false){ - // debug mode -// gl = new DebugGL(gl); -// }else{ - // production mode -// } - renderer = new JoglRenderer(gl); - } - - protected void startGLCanvas(){ - if (frameRate > 0){ - animator = new FPSAnimator(canvas, frameRate); - animator.setRunAsFastAsPossible(true); - }else{ - animator = new Animator(canvas); - animator.setRunAsFastAsPossible(true); - } - - animator.start(); - wasAnimating = true; - } - - protected void onCanvasAdded(){ - } - - protected void onCanvasRemoved(){ - } - - @Override - public KeyInput getKeyInput(){ - return new AwtKeyInput(canvas); - } - - @Override - public MouseInput getMouseInput(){ - return new AwtMouseInput(canvas); - } - - public void setAutoFlushFrames(boolean enabled){ - autoFlush.set(enabled); - } - - /** - * Callback. - */ - public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { - listener.reshape(width, height); - } - - /** - * Callback. - */ - public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { - } - -} diff --git a/engine/src/jogl/com/jme3/system/jogl/JoglCanvas.java b/engine/src/jogl/com/jme3/system/jogl/JoglCanvas.java deleted file mode 100644 index f85a9cb2d..000000000 --- a/engine/src/jogl/com/jme3/system/jogl/JoglCanvas.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.system.jogl; - -import com.jme3.system.JmeCanvasContext; -import java.awt.Canvas; -import java.util.logging.Logger; -import javax.media.opengl.GLAutoDrawable; - -public class JoglCanvas extends JoglAbstractDisplay implements JmeCanvasContext { - - private static final Logger logger = Logger.getLogger(JoglCanvas.class.getName()); - private int width, height; - - public JoglCanvas(){ - super(); - initGLCanvas(); - } - - public Type getType() { - return Type.Canvas; - } - - public void setTitle(String title) { - } - - public void restart() { - } - - public void create(boolean waitFor){ - if (waitFor) - waitFor(true); - } - - public void destroy(boolean waitFor){ - if (waitFor) - waitFor(false); - } - - @Override - protected void onCanvasRemoved(){ - super.onCanvasRemoved(); - created.set(false); - waitFor(false); - } - - @Override - protected void onCanvasAdded(){ - startGLCanvas(); - } - - public void init(GLAutoDrawable drawable) { - canvas.requestFocus(); - - super.internalCreate(); - logger.info("Display created."); - - renderer.initialize(); - listener.initialize(); - } - - public void display(GLAutoDrawable glad) { - if (!created.get() && renderer != null){ - listener.destroy(); - logger.info("Canvas destroyed."); - super.internalDestroy(); - return; - } - - if (width != canvas.getWidth() || height != canvas.getHeight()){ - width = canvas.getWidth(); - height = canvas.getHeight(); - if (listener != null) - listener.reshape(width, height); - } - - boolean flush = autoFlush.get(); - if (flush && !wasAnimating){ - animator.start(); - wasAnimating = true; - }else if (!flush && wasAnimating){ - animator.stop(); - wasAnimating = false; - } - - listener.update(); - renderer.onFrame(); - - } - - public Canvas getCanvas() { - return canvas; - } - -} diff --git a/engine/src/jogl/com/jme3/system/jogl/JoglContext.java b/engine/src/jogl/com/jme3/system/jogl/JoglContext.java deleted file mode 100644 index 6f36f3092..000000000 --- a/engine/src/jogl/com/jme3/system/jogl/JoglContext.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.system.jogl; - -import com.jme3.input.JoyInput; -import com.jme3.input.KeyInput; -import com.jme3.input.MouseInput; -import com.jme3.input.awt.AwtKeyInput; -import com.jme3.input.awt.AwtMouseInput; -import com.jme3.renderer.Renderer; -import com.jme3.renderer.jogl.JoglRenderer; -import com.jme3.system.AppSettings; -import com.jme3.system.SystemListener; -import com.jme3.system.JmeContext; -import com.jme3.system.NanoTimer; -import com.jme3.system.Timer; -import java.util.concurrent.atomic.AtomicBoolean; - -public abstract class JoglContext implements JmeContext { - - protected AtomicBoolean created = new AtomicBoolean(false); - protected final Object createdLock = new Object(); - - protected AppSettings settings = new AppSettings(true); - protected JoglRenderer renderer; - protected Timer timer; - protected SystemListener listener; - - protected AwtKeyInput keyInput; - protected AwtMouseInput mouseInput; - - public void setSystemListener(SystemListener listener){ - this.listener = listener; - } - - public void setSettings(AppSettings settings) { - this.settings.copyFrom(settings); - } - - public AppSettings getSettings() { - return settings; - } - - public Renderer getRenderer() { - return renderer; - } - - public MouseInput getMouseInput() { - return mouseInput; - } - - public KeyInput getKeyInput() { - return keyInput; - } - - public JoyInput getJoyInput() { - return null; - } - - public Timer getTimer() { - return timer; - } - - public boolean isCreated() { - return created.get(); - } - - public void create(){ - create(false); - } - - public void destroy(){ - destroy(false); - } - - protected void waitFor(boolean createdVal){ - synchronized (createdLock){ - while (created.get() != createdVal){ - try { - createdLock.wait(); - } catch (InterruptedException ex) { - } - } - } - } - - public void internalCreate() { - timer = new NanoTimer(); - synchronized (createdLock){ - created.set(true); - createdLock.notifyAll(); - } - // renderer initialization must happen in subclass. - } - - protected void internalDestroy() { - renderer = null; - timer = null; - - synchronized (createdLock){ - created.set(false); - createdLock.notifyAll(); - } - } - -} diff --git a/engine/src/jogl/com/jme3/system/jogl/JoglDisplay.java b/engine/src/jogl/com/jme3/system/jogl/JoglDisplay.java deleted file mode 100644 index 738423b79..000000000 --- a/engine/src/jogl/com/jme3/system/jogl/JoglDisplay.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.system.jogl; - -import com.jme3.system.AppSettings; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.DisplayMode; -import java.awt.Frame; -import java.awt.Toolkit; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.media.opengl.GLAutoDrawable; -import javax.swing.JFrame; -import javax.swing.SwingUtilities; - -public class JoglDisplay extends JoglAbstractDisplay { - - private static final Logger logger = Logger.getLogger(JoglDisplay.class.getName()); - - protected AtomicBoolean windowCloseRequest = new AtomicBoolean(false); - protected AtomicBoolean needClose = new AtomicBoolean(false); - protected AtomicBoolean needRestart = new AtomicBoolean(false); - protected boolean wasInited = false; - protected Frame frame; - - public Type getType() { - return Type.Display; - } - - protected DisplayMode getFullscreenDisplayMode(DisplayMode[] modes, int width, int height, int bpp, int freq){ - for (DisplayMode mode : modes){ - if (mode.getWidth() == width - && mode.getHeight() == height - && (mode.getBitDepth() == DisplayMode.BIT_DEPTH_MULTI - || mode.getBitDepth() == bpp - || (mode.getBitDepth() == 32 && bpp==24)) - && mode.getRefreshRate() == freq){ - return mode; - } - } - return null; - } - - protected void createGLFrame(){ - Container contentPane; - if (useAwt){ - frame = new Frame(settings.getTitle()); - contentPane = frame; - }else{ - frame = new JFrame(settings.getTitle()); - contentPane = ((JFrame)frame).getContentPane(); - } - - contentPane.setLayout(new BorderLayout()); - - applySettings(settings); - - frame.setResizable(false); - frame.setFocusable(true); - - if (settings.getIcons() != null) { - try { - Method setIconImages = frame.getClass().getMethod("setIconImages", List.class); - setIconImages.invoke(frame, Arrays.asList(settings.getIcons())); - } catch (Exception e) { - e.printStackTrace(); - } - } - - // only add canvas after frame is visible - contentPane.add(canvas, BorderLayout.CENTER); - frame.pack(); -// frame.setSize(contentPane.getPreferredSize()); - - if (device.getFullScreenWindow() == null){ - // now that canvas is attached, - // determine optimal size to contain it - - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation((screenSize.width - frame.getWidth()) / 2, - (screenSize.height - frame.getHeight()) / 2); - } - - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent evt) { - windowCloseRequest.set(true); - } - @Override - public void windowActivated(WindowEvent evt) { - active.set(true); - } - - @Override - public void windowDeactivated(WindowEvent evt) { - active.set(false); - } - }); - } - - protected void applySettings(AppSettings settings){ - DisplayMode displayMode; - if (settings.getWidth() <= 0 || settings.getHeight() <= 0){ - displayMode = device.getDisplayMode(); - settings.setResolution(displayMode.getWidth(), displayMode.getHeight()); - }else if (settings.isFullscreen()){ - displayMode = getFullscreenDisplayMode(device.getDisplayModes(), - settings.getWidth(), settings.getHeight(), - settings.getBitsPerPixel(), settings.getFrequency()); - if (displayMode == null) - throw new RuntimeException("Unable to find fullscreen display mode matching settings"); - }else{ - displayMode = new DisplayMode(settings.getWidth(), settings.getHeight(), 0, 0); - } - - // FIXME: seems to return false even though - // it is supported.. -// if (!device.isDisplayChangeSupported()){ -// // must use current device mode if display mode change not supported -// displayMode = device.getDisplayMode(); -// settings.setResolution(displayMode.getWidth(), displayMode.getHeight()); -// } - - frameRate = settings.getFrameRate(); - logger.log(Level.INFO, "Selected display mode: {0}x{1}x{2} @{3}", - new Object[]{displayMode.getWidth(), - displayMode.getHeight(), - displayMode.getBitDepth(), - displayMode.getRefreshRate()}); - - canvas.setSize(displayMode.getWidth(), displayMode.getHeight()); - - DisplayMode prevDisplayMode = device.getDisplayMode(); - - if (settings.isFullscreen() && device.isFullScreenSupported()){ - frame.setUndecorated(true); - - try{ - device.setFullScreenWindow(frame); - if (!prevDisplayMode.equals(displayMode) - && device.isDisplayChangeSupported()){ - device.setDisplayMode(displayMode); - } - } catch (Throwable t){ - logger.log(Level.SEVERE, "Failed to enter fullscreen mode", t); - device.setFullScreenWindow(null); - } - }else{ - if (!device.isFullScreenSupported()){ - logger.warning("Fullscreen not supported."); - }else{ - frame.setUndecorated(false); - device.setFullScreenWindow(null); - } - - frame.setVisible(true); - } - } - - private void initInEDT(){ - initGLCanvas(); - - createGLFrame(); - - startGLCanvas(); - } - - public void init(GLAutoDrawable drawable){ - // prevent initializing twice on restart - if (!wasInited){ - canvas.requestFocus(); - - super.internalCreate(); - logger.info("Display created."); - - renderer.initialize(); - listener.initialize(); - - wasInited = true; - } - } - - public void create(boolean waitFor){ - try { - if (waitFor){ - try{ - SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - initInEDT(); - } - }); - } catch (InterruptedException ex) { - listener.handleError("Interrupted", ex); - } - }else{ - SwingUtilities.invokeLater(new Runnable() { - public void run() { - initInEDT(); - } - }); - } - } catch (InvocationTargetException ex) { - throw new AssertionError(); // can never happen - } - } - - public void destroy(boolean waitFor){ - needClose.set(true); - if (waitFor){ - waitFor(false); - } - } - - public void restart() { - if (created.get()){ - needRestart.set(true); - }else{ - throw new IllegalStateException("Display not started yet. Cannot restart"); - } - } - - public void setTitle(String title){ - if (frame != null) - frame.setTitle(title); - } - - /** - * Callback. - */ - public void display(GLAutoDrawable drawable) { - if (needClose.get()) { - listener.destroy(); - animator.stop(); - if (settings.isFullscreen()) { - device.setFullScreenWindow(null); - } - frame.dispose(); - logger.info("Display destroyed."); - super.internalDestroy(); - return; - } - - if (windowCloseRequest.get()){ - listener.requestClose(false); - windowCloseRequest.set(false); - } - - if (needRestart.getAndSet(false)){ - // for restarting contexts - if (frame.isVisible()){ - animator.stop(); - frame.dispose(); - createGLFrame(); - startGLCanvas(); - } - } - -// boolean flush = autoFlush.get(); -// if (animator.isAnimating() != flush){ -// if (flush) -// animator.stop(); -// else -// animator.start(); -// } - - if (wasActive != active.get()){ - if (!wasActive){ - listener.gainFocus(); - wasActive = true; - }else{ - listener.loseFocus(); - wasActive = false; - } - } - - listener.update(); - renderer.onFrame(); - } -} diff --git a/engine/src/jogl2/com/jme3/glhelper/Helper.java b/engine/src/jogl2/com/jme3/glhelper/Helper.java deleted file mode 100644 index dc9f85006..000000000 --- a/engine/src/jogl2/com/jme3/glhelper/Helper.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.jme3.glhelper; - -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; - -import com.jme3.math.ColorRGBA; -import com.jme3.shader.Shader; - -/** - * OpenGL helper that does not rely on a specific binding. Its main purpose is to allow - * to move the binding-agnostic OpenGL logic from the source code of the both renderers - * to a single abstract renderer in order to ease the maintenance - * - * @author Julien Gouesse - * - */ -public interface Helper { - - public static final int TEXTURE0 = 33984; - - //TODO: add Array, Format, TargetBuffer, TextureType, ShaderType, ShadeModel, BlendMode, CullFace, FillMode, DepthFunc, AlphaFunc - - public enum MatrixMode{ - - MODELVIEW(0x1700),PROJECTION(0x1701); - - private final int glConstant; - - private MatrixMode(int glConstant){ - this.glConstant = glConstant; - } - - public final int getGLConstant(){ - return glConstant; - } - }; - - public enum BufferBit{ - COLOR_BUFFER(16384),DEPTH_BUFFER(256),STENCIL_BUFFER(1024),ACCUM_BUFFER(512); - - private final int glConstant; - - private BufferBit(int glConstant){ - this.glConstant = glConstant; - } - - public final int getGLConstant(){ - return glConstant; - } - } - - public enum Filter{ - NEAREST(9728),LINEAR(9729); - - private final int glConstant; - - private Filter(int glConstant){ - this.glConstant = glConstant; - } - - public final int getGLConstant(){ - return glConstant; - } - } - - public void useProgram(int program); - - public void setMatrixMode(MatrixMode matrixMode); - - public void loadMatrixf(FloatBuffer m); - - public void multMatrixf(FloatBuffer m); - - public void setViewPort(int x, int y, int width, int height); - - public void setBackgroundColor(ColorRGBA color); - - public void clear(BufferBit bufferBit); - - public void setDepthRange(float start, float end); - - public void setScissor(int x, int y, int width, int height); - - public int getUniformLocation(Shader shader,String name,ByteBuffer nameBuffer); -} diff --git a/engine/src/jogl2/com/jme3/glhelper/jogl/JoglHelper.java b/engine/src/jogl2/com/jme3/glhelper/jogl/JoglHelper.java deleted file mode 100644 index 242bca348..000000000 --- a/engine/src/jogl2/com/jme3/glhelper/jogl/JoglHelper.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.jme3.glhelper.jogl; - -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; - -import javax.media.opengl.GL; -import javax.media.opengl.GLContext; - -import com.jme3.glhelper.Helper; -import com.jme3.math.ColorRGBA; -import com.jme3.shader.Shader; - -/** - * OpenGL helper that relies on a specific binding. The main purposes of this helper is to contain - * the type-safe OpenGL logic that is specific to a particular binding and to support several kinds - * of hardware by delegating tasks supported by only some "profiles" to separate helpers - * (desktop shader-based, desktop fixed pipeline, embedded shader-based, embedded fixed pipeline) - * - * @author Julien Gouesse - * - */ -public class JoglHelper implements Helper { - - - public JoglHelper(){ - //TODO: get the current GL and choose the best fitted delegate depending on the hardware (Desktop, Embedded) - GL gl = GLContext.getCurrentGL(); - if(gl.isGL2ES1()){ - //embedded fixed pipeline - } - else{ - if(gl.isGL2ES2()){ - //embedded shader-based - } - else{ - if(gl.isGL3()&&!gl.isGL3bc()||gl.isGL4()&&!gl.isGL4bc()){ - //desktop shader-based (forward compatible) - } - else{ - //if GLSL is supported, use desktop shader-based (backward compatible) - //otherwise use desktop fixed pipeline - } - } - } - } - - @Override - public void useProgram(int program) { - GLContext.getCurrentGL().getGL2().glUseProgram(program); - } - - @Override - public void setMatrixMode(MatrixMode matrixMode){ - GLContext.getCurrentGL().getGL2().glMatrixMode(matrixMode.getGLConstant()); - } - - @Override - public void loadMatrixf(FloatBuffer m){ - GLContext.getCurrentGL().getGL2().glLoadMatrixf(m); - } - - @Override - public void multMatrixf(FloatBuffer m){ - GLContext.getCurrentGL().getGL2().glMultMatrixf(m); - } - - @Override - public void setViewPort(int x, int y, int width, int height){ - GLContext.getCurrentGL().glViewport(x, y, width, height); - } - - @Override - public void setBackgroundColor(ColorRGBA color){ - GLContext.getCurrentGL().glClearColor(color.r, color.g, color.b, color.a); - } - - @Override - public void clear(BufferBit bufferBit){ - GLContext.getCurrentGL().glClear(bufferBit.getGLConstant()); - } - - @Override - public void setDepthRange(float start, float end) { - GLContext.getCurrentGL().glDepthRange(start, end); - } - - @Override - public void setScissor(int x, int y, int width, int height){ - GLContext.getCurrentGL().glScissor(x, y, width, height); - } - - @Override - public int getUniformLocation(Shader shader,String name,ByteBuffer nameBuffer){ - return GLContext.getCurrentGL().getGL2ES2().glGetUniformLocation(shader.getId(),name); - } -} diff --git a/engine/src/jogl2/com/jme3/renderer/AbstractRenderer.java b/engine/src/jogl2/com/jme3/renderer/AbstractRenderer.java deleted file mode 100644 index 6fe59a06f..000000000 --- a/engine/src/jogl2/com/jme3/renderer/AbstractRenderer.java +++ /dev/null @@ -1,756 +0,0 @@ -package com.jme3.renderer; - -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.util.EnumSet; -import java.util.logging.Level; -import java.util.logging.Logger; -import com.jme3.glhelper.Helper; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Matrix4f; -import com.jme3.scene.Mesh; -import com.jme3.scene.Mesh.Mode; -import com.jme3.scene.VertexBuffer; -import com.jme3.scene.VertexBuffer.Format; -import com.jme3.scene.VertexBuffer.Type; -import com.jme3.scene.VertexBuffer.Usage; -import com.jme3.shader.Shader; -import com.jme3.shader.Shader.ShaderSource; -import com.jme3.shader.Uniform; -import com.jme3.texture.FrameBuffer; -import com.jme3.texture.Texture; -import com.jme3.texture.FrameBuffer.RenderBuffer; -import com.jme3.util.BufferUtils; -import com.jme3.util.IntMap; -import com.jme3.util.IntMap.Entry; -import com.jme3.util.ListMap; - -/** - * OpenGL renderer that does not rely on a specific binding, that uses low-level OpenGL operations to - * perform higher-level tasks except those that requires the use of binding-specific features and that - * handles binding-agnostic OpenGL operations that cannot be easily made type-safe (enable, disable, ...) - * - * @author Julien Gouesse - * - */ -public abstract class AbstractRenderer implements Renderer { - - protected static final Logger logger = Logger.getLogger(AbstractRenderer.class.getName()); - - protected static final boolean VALIDATE_SHADER = false; - - protected final ByteBuffer nameBuf = BufferUtils.createByteBuffer(250); - - protected final StringBuilder stringBuf = new StringBuilder(250); - - protected Statistics statistics = new Statistics(); - - protected final IntBuffer intBuf1 = BufferUtils.createIntBuffer(1); - - protected final IntBuffer intBuf16 = BufferUtils.createIntBuffer(16); - - protected RenderContext context = new RenderContext(); - - protected GLObjectManager objManager = new GLObjectManager(); - - protected EnumSet caps = EnumSet.noneOf(Caps.class); - - protected Shader boundShader; - - protected int initialDrawBuf, initialReadBuf; - - protected int glslVer; - - protected int vertexTextureUnits; - - protected int fragTextureUnits; - - protected int vertexUniforms; - - protected int fragUniforms; - - protected int vertexAttribs; - - protected int maxFBOSamples; - - protected int maxFBOAttachs; - - protected int maxMRTFBOAttachs; - - protected int maxRBSize; - - protected int maxTexSize; - - protected int maxCubeTexSize; - - protected int maxVertCount; - - protected int maxTriCount; - - protected boolean tdc; - - protected int vpX, vpY, vpW, vpH; - - protected FrameBuffer lastFb = null; - - protected Matrix4f worldMatrix = new Matrix4f(); - - protected Matrix4f viewMatrix = new Matrix4f(); - - protected Matrix4f projMatrix = new Matrix4f(); - - protected FloatBuffer fb16 = BufferUtils.createFloatBuffer(16); - - // TODO: these flags should be moved into the Caps flags - protected boolean powerOf2 = false; - - protected boolean hardwareMips = false; - - protected boolean vbo = false; - - protected boolean framebufferBlit = false; - - protected boolean renderbufferStorageMultisample = false; - - protected Helper helper; - - protected FloatBuffer storeMatrix(Matrix4f matrix, FloatBuffer store) { - store.rewind(); - matrix.fillFloatBuffer(store, true); - store.rewind(); - return store; - } - - protected void updateNameBuffer() { - int len = stringBuf.length(); - - nameBuf.position(0); - nameBuf.limit(len); - for (int i = 0; i < len; i++) { - nameBuf.put((byte) stringBuf.charAt(i)); - } - - nameBuf.rewind(); - } - - public Statistics getStatistics() { - return statistics; - } - - public EnumSet getCaps() { - return caps; - } - - public void cleanup() { - objManager.deleteAllObjects(this); - statistics.clearMemory(); - } - - public void setBackgroundColor(ColorRGBA color) { - helper.setBackgroundColor(color); - } - - public void resetGLObjects() { - objManager.resetObjects(); - statistics.clearMemory(); - boundShader = null; - lastFb = null; - context.reset(); - } - - public void onFrame() { - objManager.deleteUnused(this); - // statistics.clearFrame(); - } - - protected void updateShaderUniforms(Shader shader) { - ListMap uniforms = shader.getUniformMap(); - // for (Uniform uniform : shader.getUniforms()){ - for (int i = 0; i < uniforms.size(); i++) { - Uniform uniform = uniforms.getValue(i); - if (uniform.isUpdateNeeded()) { - updateUniform(shader, uniform); - } - } - } - - protected void updateUniform(Shader shader, Uniform uniform) { - if (glslVer != -1) { - int shaderId = shader.getId(); - - assert uniform.getName() != null; - assert shader.getId() > 0; - if (context.boundShaderProgram != shaderId) { - helper.useProgram(shaderId); - statistics.onShaderUse(shader, true); - boundShader = shader; - context.boundShaderProgram = shaderId; - } - else { - statistics.onShaderUse(shader, false); - } - - updateUniformVar(shader, uniform); - } - } - - protected void resetUniformLocations(Shader shader) { - ListMap uniforms = shader.getUniformMap(); - // for (Uniform uniform : shader.getUniforms()){ - for (int i = 0; i < uniforms.size(); i++) { - Uniform uniform = uniforms.getValue(i); - uniform.reset(); // e.g check location again - } - } - - protected void renderMeshDefault(Mesh mesh, int lod, int count) { - VertexBuffer indices = null; - VertexBuffer interleavedData = mesh.getBuffer(Type.InterleavedData); - if (interleavedData != null && interleavedData.isUpdateNeeded()) { - updateBufferData(interleavedData); - } - IntMap buffers = mesh.getBuffers(); - if (mesh.getNumLodLevels() > 0) { - indices = mesh.getLodLevel(lod); - } - else { - indices = buffers.get(Type.Index.ordinal()); - } - for (Entry entry : buffers) { - VertexBuffer vb = entry.getValue(); - - if (vb.getBufferType() == Type.InterleavedData || vb.getUsage() == Usage.CpuOnly - || vb.getBufferType() == Type.Index) { - continue; - } - - /*if (vb.getBufferType() == Type.Index) { - indices = vb; - } - else {*/ - if (vb.getStride() == 0) { - // not interleaved - setVertexAttrib(vb); - } - else { - // interleaved - setVertexAttrib(vb, interleavedData); - } - /*}*/ - } - - if (indices != null) { - drawTriangleList(indices, mesh, count); - } - else { - drawArrays(mesh); - } - clearVertexAttribs(); - clearTextureUnits(); - } - - protected void renderMeshVBO(Mesh mesh, int lod, int count) { - VertexBuffer indices = null; - VertexBuffer interleavedData = mesh.getBuffer(Type.InterleavedData); - if (interleavedData != null && interleavedData.isUpdateNeeded()) { - updateBufferData(interleavedData); - } - IntMap buffers = mesh.getBuffers(); - if (mesh.getNumLodLevels() > 0) { - indices = mesh.getLodLevel(lod); - } - else { - indices = buffers.get(Type.Index.ordinal()); - } - for (Entry entry : buffers) { - VertexBuffer vb = entry.getValue(); - - if (vb.getBufferType() == Type.InterleavedData || vb.getUsage() == Usage.CpuOnly // ignore - // cpu-only - // buffers - || vb.getBufferType() == Type.Index) { - continue; - } - - if (vb.getStride() == 0) { - // not interleaved - setVertexAttribVBO(vb, null); - } - else { - // interleaved - setVertexAttribVBO(vb, interleavedData); - } - } - - if (indices != null) { - drawTriangleListVBO(indices, mesh, count); - } - else { - drawArrays(mesh); - } - clearVertexAttribs(); - clearTextureUnits(); - } - - protected abstract void setVertexAttribVBO(VertexBuffer vb, VertexBuffer idb); - - public abstract void setVertexAttrib(VertexBuffer vb, VertexBuffer idb); - - public void setVertexAttrib(VertexBuffer vb) { - setVertexAttrib(vb, null); - } - - public void drawTriangleList(VertexBuffer indexBuf, Mesh mesh, int count) { - Mesh.Mode mode = mesh.getMode(); - Buffer indexData = indexBuf.getData(); - indexData.clear(); - if (mesh.getMode() == Mode.Hybrid) { - int[] modeStart = mesh.getModeStart(); - int[] elementLengths = mesh.getElementLengths(); - - Mode elMode = Mode.Triangles; - // int elSize = indexBuf.getFormat().getComponentSize(); - // int listStart = modeStart[0]; - int stripStart = modeStart[1]; - int fanStart = modeStart[2]; - int curOffset = 0; - for (int i = 0; i < elementLengths.length; i++) { - if (i == stripStart) { - elMode = Mode.TriangleStrip; - } - else if (i == fanStart) { - elMode = Mode.TriangleStrip; - } - int elementLength = elementLengths[i]; - indexData.position(curOffset); - drawElements(elMode, elementLength, indexBuf.getFormat(), indexData); - curOffset += elementLength; - } - } - else { - drawElements(mode, indexData.capacity(), indexBuf.getFormat(), indexData); - } - } - - protected abstract void drawElements(Mode mode, int count, Format format, Buffer indices); - - protected abstract void drawRangeElements(Mode mode, int start, int end, int count, - Format format, long indices_buffer_offset); - - protected abstract void drawElementsInstanced(Mode mode, int indices_count, Format format, - long indices_buffer_offset, int primcount); - - protected abstract void bindElementArrayBuffer(int buffer); - - protected int convertMagFilter(Texture.MagFilter filter) { - switch (filter) { - case Bilinear: - return Helper.Filter.LINEAR.getGLConstant(); - case Nearest: - return Helper.Filter.NEAREST.getGLConstant(); - default: - throw new UnsupportedOperationException("Unknown mag filter: " + filter); - } - } - - public void drawTriangleListVBO(VertexBuffer indexBuf, Mesh mesh, int count) { - if (indexBuf.getBufferType() != VertexBuffer.Type.Index) { - throw new IllegalArgumentException("Only index buffers are allowed as triangle lists."); - } - - if (indexBuf.isUpdateNeeded()) { - updateBufferData(indexBuf); - } - - int bufId = indexBuf.getId(); - assert bufId != -1; - - if (context.boundElementArrayVBO != bufId) { - bindElementArrayBuffer(bufId); - context.boundElementArrayVBO = bufId; - } - - int vertCount = mesh.getVertexCount(); - boolean useInstancing = count > 1 && caps.contains(Caps.MeshInstancing); - - if (mesh.getMode() == Mode.Hybrid) { - int[] modeStart = mesh.getModeStart(); - int[] elementLengths = mesh.getElementLengths(); - - Mode elMode = Mode.Triangles; - int elSize = indexBuf.getFormat().getComponentSize(); - // int listStart = modeStart[0]; - int stripStart = modeStart[1]; - int fanStart = modeStart[2]; - int curOffset = 0; - for (int i = 0; i < elementLengths.length; i++) { - if (i == stripStart) { - elMode = Mode.TriangleStrip; - } - else if (i == fanStart) { - elMode = Mode.TriangleStrip; - } - int elementLength = elementLengths[i]; - - if (useInstancing) { - drawElementsInstanced(elMode, elementLength, indexBuf.getFormat(), curOffset, - count); - } - else { - drawRangeElements(elMode, 0, vertCount, elementLength, indexBuf.getFormat(), - curOffset); - } - - curOffset += elementLength * elSize; - } - } - else { - if (useInstancing) { - drawElementsInstanced(mesh.getMode(), indexBuf.getData().capacity(), - indexBuf.getFormat(), 0, count); - } - else { - drawRangeElements(mesh.getMode(), 0, vertCount, indexBuf.getData().capacity(), - indexBuf.getFormat(), 0); - } - } - } - - protected abstract int convertVertexFormat(VertexBuffer.Format fmt); - - protected abstract int convertFormat(Format format); - - protected abstract int convertElementMode(Mesh.Mode mode); - - protected abstract void drawArrays(Mesh mesh); - - protected abstract void deleteFramebuffer(); - - protected abstract void deleteRenderBuffer(FrameBuffer fb, RenderBuffer rb); - - protected abstract void bindFramebuffer(int framebuffer); - - public void deleteFrameBuffer(FrameBuffer fb) { - if (fb.getId() != -1) { - if (context.boundFBO == fb.getId()) { - bindFramebuffer(0); - context.boundFBO = 0; - } - if (fb.getDepthBuffer() != null) { - deleteRenderBuffer(fb, fb.getDepthBuffer()); - } - if (fb.getColorBuffer() != null) { - deleteRenderBuffer(fb, fb.getColorBuffer()); - } - - intBuf1.put(0, fb.getId()); - deleteFramebuffer(); - fb.resetObject(); - - statistics.onDeleteFrameBuffer(); - } - } - - protected int getUniformLocation(Shader shader) { - return helper.getUniformLocation(shader, stringBuf.toString(),nameBuf); - } - - protected void updateUniformLocation(Shader shader, Uniform uniform) { - if (glslVer != -1) { - stringBuf.setLength(0); - stringBuf.append(uniform.getName()).append('\0'); - updateNameBuffer(); - int loc = getUniformLocation(shader); - if (loc < 0) { - uniform.setLocation(-1); - // uniform is not declared in shader - logger.log(Level.WARNING, "Uniform {0} is not declared in shader.", - uniform.getName()); - } - else { - uniform.setLocation(loc); - } - } - } - - protected abstract void updateUniformVar(Shader shader, Uniform uniform); - - protected abstract void deleteShader(ShaderSource source); - - public void deleteShaderSource(ShaderSource source) { - if (glslVer != -1) { - if (source.getId() < 0) { - logger.warning("Shader source is not uploaded to GPU, cannot delete."); - return; - } - source.setUsable(false); - source.clearUpdateNeeded(); - deleteShader(source); - source.resetObject(); - } - } - - protected abstract boolean isShaderValid(Shader shader); - - public void setShader(Shader shader) { - if (glslVer != -1) { - if (shader == null) { - if (context.boundShaderProgram > 0) { - helper.useProgram(0); - statistics.onShaderUse(null, true); - context.boundShaderProgram = 0; - boundShader = null; - } - } - else { - if (shader.isUpdateNeeded()) { - updateShaderData(shader); - } - - // NOTE: might want to check if any of the - // sources need an update? - - if (!shader.isUsable()) { - return; - } - - assert shader.getId() > 0; - - updateShaderUniforms(shader); - if (context.boundShaderProgram != shader.getId()) { - if (VALIDATE_SHADER) { - // check if shader can be used - // with current state - boolean validateOK = isShaderValid(shader); - if (validateOK) { - logger.fine("shader validate success"); - } - else { - logger.warning("shader validate failure"); - } - } - - helper.useProgram(shader.getId()); - statistics.onShaderUse(shader, true); - context.boundShaderProgram = shader.getId(); - boundShader = shader; - } - else { - statistics.onShaderUse(shader, false); - } - } - } - } - - public abstract void updateShaderData(Shader shader); - - protected abstract void bindDrawFramebuffer(int framebuffer); - - protected abstract void bindReadFramebuffer(int framebuffer); - - protected abstract void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, - int dstY0, int dstX1, int dstY1, int mask, int filter); - - public void copyFrameBuffer(FrameBuffer src, FrameBuffer dst) { - if (framebufferBlit) { - int srcW = 0; - int srcH = 0; - int dstW = 0; - int dstH = 0; - int prevFBO = context.boundFBO; - - if (src != null && src.isUpdateNeeded()) { - updateFrameBuffer(src); - } - - if (dst != null && dst.isUpdateNeeded()) { - updateFrameBuffer(dst); - } - - if (src == null) { - bindReadFramebuffer(0); - // srcW = viewWidth; - // srcH = viewHeight; - } - else { - bindReadFramebuffer(src.getId()); - srcW = src.getWidth(); - srcH = src.getHeight(); - } - if (dst == null) { - bindDrawFramebuffer(0); - // dstW = viewWidth; - // dstH = viewHeight; - } - else { - bindDrawFramebuffer(dst.getId()); - dstW = dst.getWidth(); - dstH = dst.getHeight(); - } - blitFramebuffer(0, 0, srcW, srcH, 0, 0, dstW, dstH, Helper.BufferBit.COLOR_BUFFER.getGLConstant() - | Helper.BufferBit.DEPTH_BUFFER.getGLConstant(), Helper.Filter.NEAREST.getGLConstant()); - - bindFramebuffer(prevFBO); - try { - checkFrameBufferError(); - } - catch (IllegalStateException ex) { - logger.log(Level.SEVERE, "Source FBO:\n{0}", src); - logger.log(Level.SEVERE, "Dest FBO:\n{0}", dst); - throw ex; - } - } - else { - throw new UnsupportedOperationException("EXT_framebuffer_blit required."); - // TODO: support non-blit copies? - } - } - - protected abstract void checkFrameBufferError(); - - protected abstract int genFramebufferId(); - - public void updateFrameBuffer(FrameBuffer fb) { - int id = fb.getId(); - if (id == -1) { - // create FBO - id = genFramebufferId(); - fb.setId(id); - objManager.registerForCleanup(fb); - - statistics.onNewFrameBuffer(); - } - - if (context.boundFBO != id) { - bindFramebuffer(id); - // binding an FBO automatically sets draw buf to GL_COLOR_ATTACHMENT0 - context.boundDrawBuf = 0; - context.boundFBO = id; - } - - FrameBuffer.RenderBuffer depthBuf = fb.getDepthBuffer(); - if (depthBuf != null) { - updateFrameBufferAttachment(fb, depthBuf); - } - - for (int i = 0; i < fb.getNumColorBuffers(); i++) { - FrameBuffer.RenderBuffer colorBuf = fb.getColorBuffer(i); - updateFrameBufferAttachment(fb, colorBuf); - } - - fb.clearUpdateNeeded(); - } - - public abstract void updateFrameBufferAttachment(FrameBuffer fb, RenderBuffer rb); - - protected abstract void deleteTexture(); - - public void deleteTexture(Texture tex) { - int texId = tex.getId(); - if (texId != -1) { - intBuf1.put(0, texId); - intBuf1.position(0).limit(1); - deleteTexture(); - tex.resetObject(); - } - } - - protected abstract int convertTextureType(Texture.Type type); - - public void clearTextureUnits() { - IDList textureList = context.textureIndexList; - Texture[] textures = context.boundTextures; - for (int i = 0; i < textureList.oldLen; i++) { - int idx = textureList.oldList[i]; - - if (context.boundTextureUnit != idx) { - setActiveTexture(Helper.TEXTURE0 + idx); - context.boundTextureUnit = idx; - } - disable(convertTextureType(textures[idx].getType())); - textures[idx] = null; - } - context.textureIndexList.copyNewToOld(); - } - - protected abstract void enable(int cap); - - protected abstract void disable(int cap); - - protected abstract void setActiveTexture(int unit); - - protected abstract void bindTexture(int type,int id); - - public void clearClipRect() { - if (context.clipRectEnabled) { - disable(Helper.TEXTURE0); - context.clipRectEnabled = false; - } - } - - protected abstract void disableClientState(int cap); - - public void clearVertexAttribs() { - for (int i = 0; i < 16; i++) { - VertexBuffer vb = context.boundAttribs[i]; - if (vb != null) { - int arrayType = convertArrayType(vb.getBufferType()); - disableClientState(arrayType); - context.boundAttribs[vb.getBufferType().ordinal()] = null; - } - } - } - - protected abstract int convertArrayType(VertexBuffer.Type type); - - protected abstract void deleteBuffer(); - - public void deleteBuffer(VertexBuffer vb) { - int bufId = vb.getId(); - if (bufId != -1) { - // delete buffer - intBuf1.put(0, bufId); - intBuf1.position(0).limit(1); - deleteBuffer(); - vb.resetObject(); - } - } - - public void setViewProjectionMatrices(Matrix4f viewMatrix, Matrix4f projMatrix) { - if (glslVer == -1) { - this.viewMatrix.set(viewMatrix); - this.projMatrix.set(projMatrix); - if (context.matrixMode != Helper.MatrixMode.PROJECTION.getGLConstant()) { - helper.setMatrixMode(Helper.MatrixMode.PROJECTION); - context.matrixMode = Helper.MatrixMode.PROJECTION.getGLConstant(); - } - helper.loadMatrixf(storeMatrix(projMatrix, fb16)); - } - } - - public void setWorldMatrix(Matrix4f worldMatrix) { - if (glslVer == -1) { - this.worldMatrix.set(worldMatrix); - if (context.matrixMode != Helper.MatrixMode.MODELVIEW.getGLConstant()) { - helper.setMatrixMode(Helper.MatrixMode.MODELVIEW); - context.matrixMode = Helper.MatrixMode.MODELVIEW.getGLConstant(); - } - helper.loadMatrixf(storeMatrix(viewMatrix, fb16)); - helper.multMatrixf(storeMatrix(worldMatrix, fb16)); - } - } - - public void setViewPort(int x, int y, int width, int height) { - helper.setViewPort(x, y, width, height); - vpX = x; - vpY = y; - vpW = width; - vpH = height; - } - - public void setDepthRange(float start, float end) { - helper.setDepthRange(start, end); - } -} diff --git a/engine/src/jogl2/com/jme3/renderer/jogl/JoglRenderer.java b/engine/src/jogl2/com/jme3/renderer/jogl/JoglRenderer.java deleted file mode 100644 index 2763e0452..000000000 --- a/engine/src/jogl2/com/jme3/renderer/jogl/JoglRenderer.java +++ /dev/null @@ -1,1743 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.renderer.jogl; - -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.util.logging.Level; - -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2ES1; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLContext; -import javax.media.opengl.fixedfunc.GLLightingFunc; -import javax.media.opengl.fixedfunc.GLPointerFunc; - -import com.jme3.glhelper.Helper; -import com.jme3.glhelper.jogl.JoglHelper; -import com.jme3.light.DirectionalLight; -import com.jme3.light.Light; -import com.jme3.light.LightList; -import com.jme3.light.PointLight; -import com.jme3.material.RenderState; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; -import com.jme3.renderer.AbstractRenderer; -import com.jme3.renderer.Caps; -import com.jme3.renderer.IDList; -import com.jme3.renderer.RendererException; -import com.jme3.scene.Mesh; -import com.jme3.scene.Mesh.Mode; -import com.jme3.scene.VertexBuffer; -import com.jme3.scene.VertexBuffer.Format; -import com.jme3.scene.VertexBuffer.Type; -import com.jme3.scene.VertexBuffer.Usage; -import com.jme3.shader.Attribute; -import com.jme3.shader.Shader; -import com.jme3.shader.Shader.ShaderSource; -import com.jme3.shader.Shader.ShaderType; -import com.jme3.shader.Uniform; -import com.jme3.texture.FrameBuffer; -import com.jme3.texture.FrameBuffer.RenderBuffer; -import com.jme3.texture.Image; -import com.jme3.texture.Texture; -import com.jme3.texture.Texture.WrapAxis; -import com.jme3.util.BufferUtils; -import com.jme3.util.IntMap; -import com.jme3.util.IntMap.Entry; - -/** - * OpenGL renderer that relies on a specific OpenGL binding. It handles operations that can hardly be - * done in a binding-agnostic way (detection of available extensions, capabilities, manipulation of - * shader sources, ...) - * - */ -public class JoglRenderer extends AbstractRenderer { - - public JoglRenderer() { - } - - public void initialize() { - helper = new JoglHelper(); - GL gl = GLContext.getCurrentGL(); - logger.log(Level.INFO, "Vendor: {0}", gl.glGetString(GL.GL_VENDOR)); - logger.log(Level.INFO, "Renderer: {0}", gl.glGetString(GL.GL_RENDERER)); - logger.log(Level.INFO, "Version: {0}", gl.glGetString(GL.GL_VERSION)); - - applyRenderState(RenderState.DEFAULT); - - powerOf2 = gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two"); - hardwareMips = gl.isExtensionAvailable("GL_SGIS_generate_mipmap"); - vbo = gl.isExtensionAvailable("GL_ARB_vertex_buffer_object"); - - // TODO: use gl.glGetString(GL.GL_VERSION) - /*if (ctxCaps.OpenGL20) { - caps.add(Caps.OpenGL20); - } - if (ctxCaps.OpenGL21) { - caps.add(Caps.OpenGL21); - } - if (ctxCaps.OpenGL30) { - caps.add(Caps.OpenGL30); - }*/ - - final boolean glslSupported = gl.isExtensionAvailable("GL_ARB_shader_objects") - && gl.isExtensionAvailable("GL_ARB_fragment_shader") && gl.isExtensionAvailable("GL_ARB_vertex_shader") - && gl.isExtensionAvailable("GL_ARB_shading_language_100"); - String versionStr = glslSupported?gl.glGetString(GL2ES2.GL_SHADING_LANGUAGE_VERSION):null; - if (versionStr == null || versionStr.equals("")) { - glslVer = -1; - // no, I need the support of low end graphics cards too - } - else { - int spaceIdx = versionStr.indexOf(" "); - if (spaceIdx >= 1) { - versionStr = versionStr.substring(0, spaceIdx); - } - float version = Float.parseFloat(versionStr); - glslVer = (int) (version * 100); - switch (glslVer) { - default: - if (glslVer < 400) { - break; - } - - // so that future OpenGL revisions wont break jme3 - - // fall through intentional - case 400: - case 330: - case 150: - caps.add(Caps.GLSL150); - case 140: - caps.add(Caps.GLSL140); - case 130: - caps.add(Caps.GLSL130); - case 120: - caps.add(Caps.GLSL120); - case 110: - caps.add(Caps.GLSL110); - case 100: - caps.add(Caps.GLSL100); - break; - } - // N.B: do NOT force GLSL100 support - } - - gl.glGetIntegerv(GL2GL3.GL_DRAW_BUFFER, intBuf1); - initialDrawBuf = intBuf1.get(0); - gl.glGetIntegerv(GL2GL3.GL_READ_BUFFER, intBuf1); - initialReadBuf = intBuf1.get(0); - - gl.glGetIntegerv(GL2ES2.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, intBuf16); - vertexTextureUnits = intBuf16.get(0); - logger.log(Level.FINER, "VTF Units: {0}", vertexTextureUnits); - if (vertexTextureUnits > 0) { - caps.add(Caps.VertexTextureFetch); - } - - gl.glGetIntegerv(GL2ES2.GL_MAX_TEXTURE_IMAGE_UNITS, intBuf16); - fragTextureUnits = intBuf16.get(0); - logger.log(Level.FINER, "Texture Units: {0}", fragTextureUnits); - - gl.glGetIntegerv(GL2GL3.GL_MAX_VERTEX_UNIFORM_COMPONENTS, intBuf16); - vertexUniforms = intBuf16.get(0); - logger.log(Level.FINER, "Vertex Uniforms: {0}", vertexUniforms); - - gl.glGetIntegerv(GL2GL3.GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, intBuf16); - fragUniforms = intBuf16.get(0); - logger.log(Level.FINER, "Fragment Uniforms: {0}", fragUniforms); - - gl.glGetIntegerv(GL2ES2.GL_MAX_VERTEX_ATTRIBS, intBuf16); - vertexAttribs = intBuf16.get(0); - logger.log(Level.FINER, "Vertex Attributes: {0}", vertexAttribs); - - gl.glGetIntegerv(GL2GL3.GL_MAX_VARYING_FLOATS, intBuf16); - int varyingFloats = intBuf16.get(0); - logger.log(Level.FINER, "Varying Floats: {0}", varyingFloats); - - gl.glGetIntegerv(GL.GL_SUBPIXEL_BITS, intBuf16); - int subpixelBits = intBuf16.get(0); - logger.log(Level.FINER, "Subpixel Bits: {0}", subpixelBits); - - gl.glGetIntegerv(GL2GL3.GL_MAX_ELEMENTS_VERTICES, intBuf16); - maxVertCount = intBuf16.get(0); - logger.log(Level.FINER, "Preferred Batch Vertex Count: {0}", maxVertCount); - - gl.glGetIntegerv(GL2GL3.GL_MAX_ELEMENTS_INDICES, intBuf16); - maxTriCount = intBuf16.get(0); - logger.log(Level.FINER, "Preferred Batch Index Count: {0}", maxTriCount); - - gl.glGetIntegerv(GL.GL_MAX_TEXTURE_SIZE, intBuf16); - maxTexSize = intBuf16.get(0); - logger.log(Level.FINER, "Maximum Texture Resolution: {0}", maxTexSize); - - gl.glGetIntegerv(GL.GL_MAX_CUBE_MAP_TEXTURE_SIZE, intBuf16); - maxCubeTexSize = intBuf16.get(0); - logger.log(Level.FINER, "Maximum CubeMap Resolution: {0}", maxCubeTexSize); - - if (gl.isExtensionAvailable("GL_ARB_color_buffer_float")) { - // XXX: Require both 16 and 32 bit float support for FloatColorBuffer. - if (gl.isExtensionAvailable("GL_ARB_half_float_pixel")) { - caps.add(Caps.FloatColorBuffer); - } - } - - if (gl.isExtensionAvailable("GL_ARB_depth_buffer_float")) { - caps.add(Caps.FloatDepthBuffer); - } - - if (gl.isExtensionAvailable("GL_ARB_draw_instanced")) { - caps.add(Caps.MeshInstancing); - } - - if (gl.isExtensionAvailable("GL_ARB_fragment_program")) { - caps.add(Caps.ARBprogram); - } - - if (gl.isExtensionAvailable("GL_ARB_texture_buffer_object")) { - caps.add(Caps.TextureBuffer); - } - - if (gl.isExtensionAvailable("GL_ARB_texture_float")) { - if (gl.isExtensionAvailable("GL_ARB_half_float_pixel")) { - caps.add(Caps.FloatTexture); - } - } - - if (gl.isExtensionAvailable("GL_ARB_vertex_array_object")) { - caps.add(Caps.VertexBufferArray); - } - - boolean latc = gl.isExtensionAvailable("GL_EXT_texture_compression_latc"); - boolean atdc = gl.isExtensionAvailable("GL_ATI_texture_compression_3dc"); - if (latc || atdc) { - caps.add(Caps.TextureCompressionLATC); - if (atdc && !latc) { - tdc = true; - } - } - - if (gl.isExtensionAvailable("GL_EXT_packed_float")) { - caps.add(Caps.PackedFloatColorBuffer); - if (gl.isExtensionAvailable("GL_ARB_half_float_pixel")) { - // because textures are usually uploaded as RGB16F - // need half-float pixel - caps.add(Caps.PackedFloatTexture); - } - } - - if (gl.isExtensionAvailable("GL_EXT_texture_array")) { - caps.add(Caps.TextureArray); - } - - if (gl.isExtensionAvailable("GL_EXT_texture_shared_exponent")) { - caps.add(Caps.SharedExponentTexture); - } - - if (gl.isExtensionAvailable("GL_EXT_framebuffer_object")) { - caps.add(Caps.FrameBuffer); - - gl.glGetIntegerv(GL.GL_MAX_RENDERBUFFER_SIZE, intBuf16); - maxRBSize = intBuf16.get(0); - logger.log(Level.FINER, "FBO RB Max Size: {0}", maxRBSize); - - gl.glGetIntegerv(GL2GL3.GL_MAX_COLOR_ATTACHMENTS, intBuf16); - maxFBOAttachs = intBuf16.get(0); - logger.log(Level.FINER, "FBO Max renderbuffers: {0}", maxFBOAttachs); - - if (gl.isExtensionAvailable("GL_EXT_framebuffer_multisample")) { - caps.add(Caps.FrameBufferMultisample); - - gl.glGetIntegerv(GL2GL3.GL_MAX_SAMPLES, intBuf16); - maxFBOSamples = intBuf16.get(0); - logger.log(Level.FINER, "FBO Max Samples: {0}", maxFBOSamples); - } - - if (gl.isExtensionAvailable("GL_ARB_draw_buffers")) { - caps.add(Caps.FrameBufferMRT); - gl.glGetIntegerv(GL2GL3.GL_MAX_DRAW_BUFFERS, intBuf16); - maxMRTFBOAttachs = intBuf16.get(0); - logger.log(Level.FINER, "FBO Max MRT renderbuffers: {0}", maxMRTFBOAttachs); - } - } - - if (gl.isExtensionAvailable("GL_ARB_multisample")) { - gl.glGetIntegerv(GL.GL_SAMPLE_BUFFERS, intBuf16); - boolean available = intBuf16.get(0) != 0; - gl.glGetIntegerv(GL.GL_SAMPLES, intBuf16); - int samples = intBuf16.get(0); - logger.log(Level.FINER, "Samples: {0}", samples); - boolean enabled = gl.glIsEnabled(GL.GL_MULTISAMPLE); - if (samples > 0 && available && !enabled) { - gl.glEnable(GL.GL_MULTISAMPLE); - } - } - framebufferBlit = gl.isExtensionAvailable("GL_EXT_framebuffer_blit"); - renderbufferStorageMultisample = gl.isExtensionAvailable("GL_EXT_framebuffer_multisample") - && gl.isFunctionAvailable("glRenderbufferStorageMultisample"); - } - - public void clearBuffers(boolean color, boolean depth, boolean stencil) { - int bits = 0; - if (color) { - bits = Helper.BufferBit.COLOR_BUFFER.getGLConstant(); - } - if (depth) { - bits |= Helper.BufferBit.DEPTH_BUFFER.getGLConstant(); - } - if (stencil) { - bits |= Helper.BufferBit.STENCIL_BUFFER.getGLConstant(); - } - if (bits != 0) { - //TODO: use helper.clear(BufferBit bufferBit) - GLContext.getCurrentGL().glClear(bits); - } - } - - public void applyRenderState(RenderState state) { - GL gl = GLContext.getCurrentGL(); - if (state.isWireframe() && !context.wireframe) { - gl.getGL2().glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_LINE); - context.wireframe = true; - } - else if (!state.isWireframe() && context.wireframe) { - gl.getGL2().glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_FILL); - context.wireframe = false; - } - if (state.isDepthTest() && !context.depthTestEnabled) { - gl.glEnable(GL.GL_DEPTH_TEST); - gl.glDepthFunc(GL.GL_LEQUAL); - context.depthTestEnabled = true; - } - else if (!state.isDepthTest() && context.depthTestEnabled) { - gl.glDisable(GL.GL_DEPTH_TEST); - context.depthTestEnabled = false; - } - if (state.isAlphaTest() && !context.alphaTestEnabled) { - gl.glEnable(GL2ES1.GL_ALPHA_TEST); - gl.getGL2().glAlphaFunc(GL.GL_GREATER, state.getAlphaFallOff()); - context.alphaTestEnabled = true; - } - else if (!state.isAlphaTest() && context.alphaTestEnabled) { - gl.glDisable(GL2ES1.GL_ALPHA_TEST); - context.alphaTestEnabled = false; - } - if (state.isDepthWrite() && !context.depthWriteEnabled) { - gl.glDepthMask(true); - context.depthWriteEnabled = true; - } - else if (!state.isDepthWrite() && context.depthWriteEnabled) { - gl.glDepthMask(false); - context.depthWriteEnabled = false; - } - if (state.isColorWrite() && !context.colorWriteEnabled) { - gl.glColorMask(true, true, true, true); - context.colorWriteEnabled = true; - } - else if (!state.isColorWrite() && context.colorWriteEnabled) { - gl.glColorMask(false, false, false, false); - context.colorWriteEnabled = false; - } - if (state.isPolyOffset()) { - if (!context.polyOffsetEnabled) { - gl.glEnable(GL.GL_POLYGON_OFFSET_FILL); - gl.glPolygonOffset(state.getPolyOffsetFactor(), state.getPolyOffsetUnits()); - context.polyOffsetEnabled = true; - context.polyOffsetFactor = state.getPolyOffsetFactor(); - context.polyOffsetUnits = state.getPolyOffsetUnits(); - } - else { - if (state.getPolyOffsetFactor() != context.polyOffsetFactor - || state.getPolyOffsetUnits() != context.polyOffsetUnits) { - gl.glPolygonOffset(state.getPolyOffsetFactor(), state.getPolyOffsetUnits()); - context.polyOffsetFactor = state.getPolyOffsetFactor(); - context.polyOffsetUnits = state.getPolyOffsetUnits(); - } - } - } - else { - if (context.polyOffsetEnabled) { - disable(GL.GL_POLYGON_OFFSET_FILL); - context.polyOffsetEnabled = false; - context.polyOffsetFactor = 0; - context.polyOffsetUnits = 0; - } - } - if (state.getFaceCullMode() != context.cullMode) { - if (state.getFaceCullMode() == RenderState.FaceCullMode.Off) { - disable(GL.GL_CULL_FACE); - } - else { - enable(GL.GL_CULL_FACE); - } - - switch (state.getFaceCullMode()) { - case Off: - break; - case Back: - gl.glCullFace(GL.GL_BACK); - break; - case Front: - gl.glCullFace(GL.GL_FRONT); - break; - case FrontAndBack: - gl.glCullFace(GL.GL_FRONT_AND_BACK); - break; - default: - throw new UnsupportedOperationException("Unrecognized face cull mode: " - + state.getFaceCullMode()); - } - - context.cullMode = state.getFaceCullMode(); - } - - if (state.getBlendMode() != context.blendMode) { - if (state.getBlendMode() == RenderState.BlendMode.Off) { - disable(GL.GL_BLEND); - } - else { - enable(GL.GL_BLEND); - } - - switch (state.getBlendMode()) { - case Off: - break; - case Additive: - gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE); - break; - case AlphaAdditive: - gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE); - break; - case Alpha: - gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); - break; - case Color: - gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_COLOR); - break; - case PremultAlpha: - gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA); - break; - case Modulate: - gl.glBlendFunc(GL.GL_DST_COLOR, GL.GL_ZERO); - break; - case ModulateX2: - gl.glBlendFunc(GL.GL_DST_COLOR, GL.GL_SRC_COLOR); - break; - default: - throw new UnsupportedOperationException("Unrecognized blend mode: " - + state.getBlendMode()); - } - - context.blendMode = state.getBlendMode(); - } - } - - public void setClipRect(int x, int y, int width, int height) { - if (!context.clipRectEnabled) { - enable(GL.GL_SCISSOR_TEST); - context.clipRectEnabled = true; - } - helper.setScissor(x, y, width, height); - } - - @Override - protected void updateUniformVar(Shader shader, Uniform uniform) { - int loc = uniform.getLocation(); - if (loc == -1) { - return; - } - - if (loc == -2) { - // get uniform location - updateUniformLocation(shader, uniform); - if (uniform.getLocation() == -1) { - // not declared, ignore - uniform.clearUpdateNeeded(); - return; - } - loc = uniform.getLocation(); - } - - if (uniform.getVarType() == null) { - return; // value not set yet.. - } - - statistics.onUniformSet(); - - uniform.clearUpdateNeeded(); - FloatBuffer fb; - GL gl = GLContext.getCurrentGL(); - switch (uniform.getVarType()) { - case Float: - Float f = (Float) uniform.getValue(); - gl.getGL2().glUniform1f(loc, f.floatValue()); - break; - case Vector2: - Vector2f v2 = (Vector2f) uniform.getValue(); - gl.getGL2().glUniform2f(loc, v2.getX(), v2.getY()); - break; - case Vector3: - Vector3f v3 = (Vector3f) uniform.getValue(); - gl.getGL2().glUniform3f(loc, v3.getX(), v3.getY(), v3.getZ()); - break; - case Vector4: - Object val = uniform.getValue(); - if (val instanceof ColorRGBA) { - ColorRGBA c = (ColorRGBA) val; - gl.getGL2().glUniform4f(loc, c.r, c.g, c.b, c.a); - } - else { - Quaternion c = (Quaternion) uniform.getValue(); - gl.getGL2().glUniform4f(loc, c.getX(), c.getY(), c.getZ(), c.getW()); - } - break; - case Boolean: - Boolean b = (Boolean) uniform.getValue(); - gl.getGL2().glUniform1i(loc, b.booleanValue() ? GL.GL_TRUE : GL.GL_FALSE); - break; - case Matrix3: - fb = (FloatBuffer) uniform.getValue(); - assert fb.remaining() == 9; - gl.getGL2().glUniformMatrix3fv(loc, 1, false, fb); - break; - case Matrix4: - fb = (FloatBuffer) uniform.getValue(); - assert fb.remaining() == 16; - gl.getGL2().glUniformMatrix4fv(loc, 1, false, fb); - break; - case FloatArray: - fb = (FloatBuffer) uniform.getValue(); - gl.getGL2().glUniform1fv(loc, 1, fb); - break; - case Vector2Array: - fb = (FloatBuffer) uniform.getValue(); - gl.getGL2().glUniform2fv(loc, 1, fb); - break; - case Vector3Array: - fb = (FloatBuffer) uniform.getValue(); - gl.getGL2().glUniform3fv(loc, 1, fb); - break; - case Vector4Array: - fb = (FloatBuffer) uniform.getValue(); - gl.getGL2().glUniform4fv(loc, 1, fb); - break; - case Matrix4Array: - fb = (FloatBuffer) uniform.getValue(); - gl.getGL2().glUniformMatrix4fv(loc, 1, false, fb); - break; - case Int: - Integer i = (Integer) uniform.getValue(); - gl.getGL2().glUniform1i(loc, i.intValue()); - break; - default: - throw new UnsupportedOperationException("Unsupported uniform type: " - + uniform.getVarType()); - } - } - - public void setLighting(LightList list) { - if (glslVer == -1) { - GL gl = GLContext.getCurrentGL(); - if (list == null || list.size() == 0) { - // turn off lighting - gl.glDisable(GLLightingFunc.GL_LIGHTING); - return; - } - - gl.glEnable(GLLightingFunc.GL_LIGHTING); - gl.getGL2().glShadeModel(GLLightingFunc.GL_SMOOTH); - - float[] temp = new float[4]; - - // reset model view to specify - // light positions in world space - // instead of model space - // gl.glPushMatrix(); - // gl.glLoadIdentity(); - - for (int i = 0; i < list.size() + 1; i++) { - - int lightId = GLLightingFunc.GL_LIGHT0 + i; - - if (list.size() <= i) { - // goes beyond the num lights we need - // disable it - gl.glDisable(lightId); - break; - } - - Light l = list.get(i); - - if (!l.isEnabled()) { - gl.glDisable(lightId); - continue; - } - - ColorRGBA color = l.getColor(); - color.toArray(temp); - - gl.glEnable(lightId); - gl.getGL2().glLightfv(lightId, GLLightingFunc.GL_DIFFUSE, temp, 0); - gl.getGL2().glLightfv(lightId, GLLightingFunc.GL_SPECULAR, temp, 0); - - ColorRGBA.Black.toArray(temp); - gl.getGL2().glLightfv(lightId, GLLightingFunc.GL_AMBIENT, temp, 0); - - switch (l.getType()) { - case Directional: - DirectionalLight dl = (DirectionalLight) l; - dl.getDirection().toArray(temp); - temp[3] = 0f; // marks to GL its a directional light - gl.getGL2().glLightfv(lightId, GLLightingFunc.GL_POSITION, temp, 0); - break; - case Point: - PointLight pl = (PointLight) l; - pl.getPosition().toArray(temp); - temp[3] = 1f; // marks to GL its a point light - gl.getGL2().glLightfv(lightId, GLLightingFunc.GL_POSITION, temp, 0); - break; - } - - } - // restore modelview to original value - // gl.glPopMatrix(); - } - } - - public int convertShaderType(ShaderType type) { - switch (type) { - case Fragment: - return GL2ES2.GL_FRAGMENT_SHADER; - case Vertex: - return GL2ES2.GL_VERTEX_SHADER; - // case Geometry: - // return ARBGeometryShader4.GL_GEOMETRY_SHADER_ARB; - default: - throw new RuntimeException("Unrecognized shader type."); - } - } - - @Override - protected void deleteShader(ShaderSource source) { - GL gl = GLContext.getCurrentGL(); - gl.getGL2().glDeleteShader(source.getId()); - } - - @Override - public void updateShaderData(Shader shader) { - if (glslVer != -1) { - GL gl = GLContext.getCurrentGL(); - int id = shader.getId(); - boolean needRegister = false; - if (id == -1) { - // create program - id = gl.getGL2().glCreateProgram(); - if (id <= 0) { - throw new RendererException( - "Invalid ID received when trying to create shader program."); - } - - shader.setId(id); - needRegister = true; - } - - for (ShaderSource source : shader.getSources()) { - if (source.isUpdateNeeded()) { - updateShaderSourceData(source, shader.getLanguage()); - // shader has been compiled here - } - - if (!source.isUsable()) { - // it's useless.. just forget about everything.. - shader.setUsable(false); - shader.clearUpdateNeeded(); - return; - } - gl.getGL2().glAttachShader(id, source.getId()); - } - // link shaders to program - gl.getGL2().glLinkProgram(id); - - gl.getGL2().glGetProgramiv(id, GL2ES2.GL_LINK_STATUS, intBuf1); - boolean linkOK = intBuf1.get(0) == GL.GL_TRUE; - String infoLog = null; - - if (VALIDATE_SHADER || !linkOK) { - gl.getGL2().glGetProgramiv(id, GL2ES2.GL_INFO_LOG_LENGTH, intBuf1); - int length = intBuf1.get(0); - if (length > 3) { - // get infos - ByteBuffer logBuf = BufferUtils.createByteBuffer(length); - gl.getGL2().glGetProgramInfoLog(id, logBuf.limit(), intBuf1, logBuf); - - // convert to string, etc - byte[] logBytes = new byte[length]; - logBuf.get(logBytes, 0, length); - infoLog = new String(logBytes); - } - } - - if (linkOK) { - if (infoLog != null) { - logger.log(Level.INFO, "shader link success. \n{0}", infoLog); - } - else { - logger.fine("shader link success"); - } - } - else { - if (infoLog != null) { - logger.log(Level.WARNING, "shader link failure. \n{0}", infoLog); - } - else { - logger.warning("shader link failure"); - } - } - - shader.clearUpdateNeeded(); - if (!linkOK) { - // failure.. forget about everything - shader.resetSources(); - shader.setUsable(false); - deleteShader(shader); - } - else { - shader.setUsable(true); - if (needRegister) { - objManager.registerForCleanup(shader); - statistics.onNewShader(); - } - else { - // OpenGL spec: uniform locations may change after re-link - resetUniformLocations(shader); - } - } - } - } - - public void updateShaderSourceData(ShaderSource source, String language) { - if (glslVer != -1) { - GL gl = GLContext.getCurrentGL(); - int id = source.getId(); - if (id == -1) { - // create id - id = gl.getGL2().glCreateShader(convertShaderType(source.getType())); - if (id <= 0) { - throw new RendererException("Invalid ID received when trying to create shader."); - } - - source.setId(id); - } - - // upload shader source - // merge the defines and source code - byte[] versionData = new byte[] {};// "#version 140\n".getBytes(); - // versionData = "#define INSTANCING 1\n".getBytes(); - byte[] definesCodeData = source.getDefines().getBytes(); - byte[] sourceCodeData = source.getSource().getBytes(); - ByteBuffer codeBuf = BufferUtils.createByteBuffer(versionData.length - + definesCodeData.length + sourceCodeData.length); - codeBuf.put(versionData); - codeBuf.put(definesCodeData); - codeBuf.put(sourceCodeData); - codeBuf.flip(); - - final byte[] array = new byte[codeBuf.limit()]; - codeBuf.get(array); - gl.getGL2().glShaderSourceARB(id, 1, new String[] { new String(array) }, - new int[] { array.length }, 0); - gl.getGL2().glCompileShader(id); - - gl.getGL2().glGetShaderiv(id, GL2ES2.GL_COMPILE_STATUS, intBuf1); - - boolean compiledOK = intBuf1.get(0) == GL.GL_TRUE; - String infoLog = null; - - if (VALIDATE_SHADER || !compiledOK) { - // even if compile succeeded, check - // log for warnings - gl.getGL2().glGetShaderiv(id, GL2ES2.GL_INFO_LOG_LENGTH, intBuf1); - int length = intBuf1.get(0); - if (length > 3) { - // get infos - ByteBuffer logBuf = BufferUtils.createByteBuffer(length); - gl.getGL2().glGetShaderInfoLog(id, logBuf.limit(), intBuf1, logBuf); - byte[] logBytes = new byte[length]; - logBuf.get(logBytes, 0, length); - // convert to string, etc - infoLog = new String(logBytes); - } - } - - if (compiledOK) { - if (infoLog != null) { - logger.log(Level.INFO, "{0} compile success\n{1}", - new Object[] { source.getName(), infoLog }); - } - else { - logger.log(Level.FINE, "{0} compile success", source.getName()); - } - } - else { - if (infoLog != null) { - logger.log(Level.WARNING, "{0} compile error: {1}", - new Object[] { source.getName(), infoLog }); - } - else { - logger.log(Level.WARNING, "{0} compile error: ?", source.getName()); - } - logger.log(Level.WARNING, "{0}{1}", - new Object[] { source.getDefines(), source.getSource() }); - } - - source.clearUpdateNeeded(); - // only usable if compiled - source.setUsable(compiledOK); - if (!compiledOK) { - // make sure to dispose id cause all program's - // shaders will be cleared later. - gl.getGL2().glDeleteShader(id); - } - else { - // register for cleanup since the ID is usable - objManager.registerForCleanup(source); - } - } - } - - @Override - protected boolean isShaderValid(Shader shader) { - GL gl = GLContext.getCurrentGL(); - gl.getGL2().glValidateProgram(shader.getId()); - gl.getGL2().glGetProgramiv(shader.getId(), GL2ES2.GL_VALIDATE_STATUS, intBuf1); - return intBuf1.get(0) == GL.GL_TRUE; - } - - public void deleteShader(Shader shader) { - if (glslVer != -1) { - if (shader.getId() == -1) { - logger.warning("Shader is not uploaded to GPU, cannot delete."); - return; - } - GL gl = GLContext.getCurrentGL(); - for (ShaderSource source : shader.getSources()) { - if (source.getId() != -1) { - gl.getGL2().glDetachShader(shader.getId(), source.getId()); - // the next part is done by the GLObjectManager automatically - // glDeleteShader(source.getId()); - } - } - // kill all references so sources can be collected - // if needed. - shader.resetSources(); - gl.getGL2().glDeleteProgram(shader.getId()); - - statistics.onDeleteShader(); - } - } - - @Override - protected void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, - int dstY0, int dstX1, int dstY1, int mask, int filter) { - GL gl = GLContext.getCurrentGL(); - gl.getGL2().glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, - filter); - } - - public void setFrameBuffer(FrameBuffer fb) { - if (lastFb == fb) { - return; - } - - GL gl = GLContext.getCurrentGL(); - if (fb == null) { - // unbind any fbos - if (context.boundFBO != 0) { - bindFramebuffer(0); - statistics.onFrameBufferUse(null, true); - - context.boundFBO = 0; - } - // select back buffer - if (context.boundDrawBuf != -1) { - gl.getGL2().glDrawBuffer(initialDrawBuf); - context.boundDrawBuf = -1; - } - if (context.boundReadBuf != -1) { - gl.getGL2().glReadBuffer(initialReadBuf); - context.boundReadBuf = -1; - } - - lastFb = null; - } - else { - if (fb.isUpdateNeeded()) { - updateFrameBuffer(fb); - } - - if (context.boundFBO != fb.getId()) { - bindFramebuffer(fb.getId()); - statistics.onFrameBufferUse(fb, true); - - // update viewport to reflect framebuffer's resolution - setViewPort(0, 0, fb.getWidth(), fb.getHeight()); - - context.boundFBO = fb.getId(); - } - else { - statistics.onFrameBufferUse(fb, false); - } - if (fb.getNumColorBuffers() == 0) { - // make sure to select NONE as draw buf - // no color buffer attached. select NONE - if (context.boundDrawBuf != -2) { - gl.getGL2().glDrawBuffer(GL.GL_NONE); - context.boundDrawBuf = -2; - } - if (context.boundReadBuf != -2) { - gl.getGL2().glReadBuffer(GL.GL_NONE); - context.boundReadBuf = -2; - } - } - else { - if (fb.isMultiTarget()) { - if (fb.getNumColorBuffers() > maxMRTFBOAttachs) { - throw new UnsupportedOperationException("Framebuffer has more" - + " targets than are supported" + " on the system!"); - } - - if (context.boundDrawBuf != 100 + fb.getNumColorBuffers()) { - intBuf16.clear(); - for (int i = 0; i < fb.getNumColorBuffers(); i++) { - intBuf16.put(GL.GL_COLOR_ATTACHMENT0 + i); - } - - intBuf16.flip(); - gl.getGL2().glDrawBuffers(intBuf16.limit(), intBuf16); - context.boundDrawBuf = 100 + fb.getNumColorBuffers(); - } - } - else { - RenderBuffer rb = fb.getColorBuffer(fb.getTargetIndex()); - // select this draw buffer - if (context.boundDrawBuf != rb.getSlot()) { - gl.getGL2().glDrawBuffer(GL.GL_COLOR_ATTACHMENT0 + rb.getSlot()); - context.boundDrawBuf = rb.getSlot(); - } - } - } - - assert fb.getId() >= 0; - assert context.boundFBO == fb.getId(); - lastFb = fb; - } - - try { - checkFrameBufferError(); - } - catch (IllegalStateException ex) { - logger.log(Level.SEVERE, "Problem FBO:\n{0}", fb); - throw ex; - } - } - - @Override - protected int genFramebufferId() { - GL gl = GLContext.getCurrentGL(); - gl.glGenFramebuffers(1, intBuf1); - return intBuf1.get(0); - } - - private int convertAttachmentSlot(int attachmentSlot) { - // can also add support for stencil here - if (attachmentSlot == -100) { - return GL.GL_DEPTH_ATTACHMENT; - } - else if (attachmentSlot < 0 || attachmentSlot >= 16) { - throw new UnsupportedOperationException("Invalid FBO attachment slot: " - + attachmentSlot); - } - - return GL.GL_COLOR_ATTACHMENT0 + attachmentSlot; - } - - public void updateRenderTexture(FrameBuffer fb, RenderBuffer rb) { - GL gl = GLContext.getCurrentGL(); - Texture tex = rb.getTexture(); - if (tex.isUpdateNeeded()) { - updateTextureData(tex); - } - - gl.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, convertAttachmentSlot(rb.getSlot()), - convertTextureType(tex.getType()), tex.getId(), 0); - } - - @Override - public void updateFrameBufferAttachment(FrameBuffer fb, RenderBuffer rb) { - boolean needAttach; - if (rb.getTexture() == null) { - // if it hasn't been created yet, then attach is required. - needAttach = rb.getId() == -1; - updateRenderBuffer(fb, rb); - } - else { - needAttach = false; - updateRenderTexture(fb, rb); - } - if (needAttach) { - GL gl = GLContext.getCurrentGL(); - gl.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER, convertAttachmentSlot(rb.getSlot()), - GL.GL_RENDERBUFFER, rb.getId()); - } - } - - @Override - protected void checkFrameBufferError() { - GL gl = GLContext.getCurrentGL(); - int status = gl.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER); - switch (status) { - case GL.GL_FRAMEBUFFER_COMPLETE: - break; - case GL.GL_FRAMEBUFFER_UNSUPPORTED: - // Choose different formats - throw new IllegalStateException("Framebuffer object format is " - + "unsupported by the video hardware."); - case GL.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: - throw new IllegalStateException("Framebuffer has erronous attachment."); - case GL.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: - throw new IllegalStateException("Framebuffer is missing required attachment."); - case GL.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: - throw new IllegalStateException( - "Framebuffer attachments must have same dimensions."); - case GL.GL_FRAMEBUFFER_INCOMPLETE_FORMATS: - throw new IllegalStateException("Framebuffer attachments must have same formats."); - case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: - throw new IllegalStateException("Incomplete draw buffer."); - case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: - throw new IllegalStateException("Incomplete read buffer."); - case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: - throw new IllegalStateException("Incomplete multisample buffer."); - default: - // Programming error; will fail on all hardware - throw new IllegalStateException("Some video driver error " - + "or programming error occured. " - + "Framebuffer object status is invalid. "); - } - } - - private void updateRenderBuffer(FrameBuffer fb, RenderBuffer rb) { - GL gl = GLContext.getCurrentGL(); - int id = rb.getId(); - if (id == -1) { - gl.glGenRenderbuffers(1, intBuf1); - id = intBuf1.get(0); - rb.setId(id); - } - - if (context.boundRB != id) { - gl.glBindRenderbuffer(GL.GL_RENDERBUFFER, id); - context.boundRB = id; - } - - if (fb.getWidth() > maxRBSize || fb.getHeight() > maxRBSize) { - throw new UnsupportedOperationException("Resolution " + fb.getWidth() + ":" - + fb.getHeight() + " is not supported."); - } - - if (fb.getSamples() > 0 && renderbufferStorageMultisample) { - int samples = fb.getSamples(); - if (maxFBOSamples < samples) { - samples = maxFBOSamples; - } - gl.getGL2() - .glRenderbufferStorageMultisample(GL.GL_RENDERBUFFER, samples, - TextureUtil.convertTextureFormat(rb.getFormat()), fb.getWidth(), - fb.getHeight()); - } - else { - gl.glRenderbufferStorage(GL.GL_RENDERBUFFER, - TextureUtil.convertTextureFormat(rb.getFormat()), fb.getWidth(), fb.getHeight()); - } - } - - @Override - protected void deleteFramebuffer() { - GL gl = GLContext.getCurrentGL(); - gl.getGL2().glDeleteFramebuffers(1, intBuf1); - } - - @Override - protected void bindFramebuffer(int framebuffer) { - GL gl = GLContext.getCurrentGL(); - gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, framebuffer); - } - - @Override - protected void bindDrawFramebuffer(int framebuffer) { - GL gl = GLContext.getCurrentGL(); - gl.glBindFramebuffer(GL2GL3.GL_DRAW_FRAMEBUFFER, framebuffer); - } - - @Override - protected void bindReadFramebuffer(int framebuffer) { - GL gl = GLContext.getCurrentGL(); - gl.glBindFramebuffer(GL2GL3.GL_READ_FRAMEBUFFER, framebuffer); - } - - @Override - protected void deleteRenderBuffer(FrameBuffer fb, RenderBuffer rb) { - intBuf1.put(0, rb.getId()); - GL gl = GLContext.getCurrentGL(); - gl.getGL2().glDeleteRenderbuffers(1, intBuf1); - } - - public void readFrameBuffer(FrameBuffer fb, ByteBuffer byteBuf) { - GL gl = GLContext.getCurrentGL(); - if (fb != null) { - RenderBuffer rb = fb.getColorBuffer(); - if (rb == null) { - throw new IllegalArgumentException("Specified framebuffer" - + " does not have a colorbuffer"); - } - setFrameBuffer(fb); - if (context.boundReadBuf != rb.getSlot()) { - gl.getGL2().glReadBuffer(GL.GL_COLOR_ATTACHMENT0 + rb.getSlot()); - context.boundReadBuf = rb.getSlot(); - } - } - else { - setFrameBuffer(null); - } - gl.glReadPixels(vpX, vpY, vpW, vpH, GL2GL3.GL_BGRA, GL.GL_UNSIGNED_BYTE, byteBuf); - } - - @Override - protected int convertTextureType(Texture.Type type) { - switch (type) { - case TwoDimensional: - return GL.GL_TEXTURE_2D; - case TwoDimensionalArray: - return GL.GL_TEXTURE_2D_ARRAY; - case ThreeDimensional: - return GL2GL3.GL_TEXTURE_3D; - case CubeMap: - return GL.GL_TEXTURE_CUBE_MAP; - default: - throw new UnsupportedOperationException("Unknown texture type: " + type); - } - } - - private int convertMinFilter(Texture.MinFilter filter) { - switch (filter) { - case Trilinear: - return GL.GL_LINEAR_MIPMAP_LINEAR; - case BilinearNearestMipMap: - return GL.GL_LINEAR_MIPMAP_NEAREST; - case NearestLinearMipMap: - return GL.GL_NEAREST_MIPMAP_LINEAR; - case NearestNearestMipMap: - return GL.GL_NEAREST_MIPMAP_NEAREST; - case BilinearNoMipMaps: - return GL.GL_LINEAR; - case NearestNoMipMaps: - return GL.GL_NEAREST; - default: - throw new UnsupportedOperationException("Unknown min filter: " + filter); - } - } - - private int convertWrapMode(Texture.WrapMode mode) { - switch (mode) { - case BorderClamp: - return GL2GL3.GL_CLAMP_TO_BORDER; - case Clamp: - return GL2.GL_CLAMP; - case EdgeClamp: - return GL.GL_CLAMP_TO_EDGE; - case Repeat: - return GL.GL_REPEAT; - case MirroredRepeat: - return GL.GL_MIRRORED_REPEAT; - default: - throw new UnsupportedOperationException("Unknown wrap mode: " + mode); - } - } - - public void updateTextureData(Texture tex) { - int texId = tex.getId(); - GL gl = GLContext.getCurrentGL(); - if (texId == -1) { - // create texture - gl.glGenTextures(1, intBuf1); - texId = intBuf1.get(0); - tex.setId(texId); - objManager.registerForCleanup(tex); - } - - // bind texture - int target = convertTextureType(tex.getType()); - if (context.boundTextures[0] != tex) { - if (context.boundTextureUnit != 0) { - setActiveTexture(GL.GL_TEXTURE0); - context.boundTextureUnit = 0; - } - - bindTexture(target, texId); - context.boundTextures[0] = tex; - } - - // filter things - int minFilter = convertMinFilter(tex.getMinFilter()); - int magFilter = convertMagFilter(tex.getMagFilter()); - gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, minFilter); - gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, magFilter); - - // repeat modes - switch (tex.getType()) { - case ThreeDimensional: - case CubeMap: - gl.glTexParameteri(target, GL2GL3.GL_TEXTURE_WRAP_R, - convertWrapMode(tex.getWrap(WrapAxis.R))); - case TwoDimensional: - gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, - convertWrapMode(tex.getWrap(WrapAxis.T))); - // fall down here is intentional.. - // case OneDimensional: - gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, - convertWrapMode(tex.getWrap(WrapAxis.S))); - break; - default: - throw new UnsupportedOperationException("Unknown texture type: " + tex.getType()); - } - - Image img = tex.getImage(); - if (img != null) { - boolean generateMips = false; - if (!img.hasMipmaps() && tex.getMinFilter().usesMipMapLevels()) { - // No pregenerated mips available, - // generate from base level if required - if (hardwareMips) { - gl.glTexParameteri(target, GL2ES1.GL_GENERATE_MIPMAP, GL.GL_TRUE); - } - else { - generateMips = true; - } - } - - TextureUtil.uploadTexture(gl, img, tex.getImageDataIndex(), generateMips, powerOf2); - } - - tex.clearUpdateNeeded(); - } - - private void checkTexturingUsed() { - IDList textureList = context.textureIndexList; - GL gl = GLContext.getCurrentGL(); - // old mesh used texturing, new mesh doesn't use it - // should actually go through entire oldLen and - // disable texturing for each unit.. but that's for later. - if (textureList.oldLen > 0 && textureList.newLen == 0) { - gl.glDisable(GL.GL_TEXTURE_2D); - } - } - - public void setTexture(int unit, Texture tex) { - if (tex.isUpdateNeeded()) { - updateTextureData(tex); - } - - int texId = tex.getId(); - assert texId != -1; - - Texture[] textures = context.boundTextures; - - int type = convertTextureType(tex.getType()); - if (!context.textureIndexList.moveToNew(unit)) { - if (context.boundTextureUnit != unit) { - setActiveTexture(GL.GL_TEXTURE0 + unit); - context.boundTextureUnit = unit; - } - - enable(type); - } - - if (textures[unit] != tex) { - if (context.boundTextureUnit != unit) { - setActiveTexture(GL.GL_TEXTURE0 + unit); - context.boundTextureUnit = unit; - } - - bindTexture(type, texId); - textures[unit] = tex; - } - } - - @Override - protected void enable(int cap){ - GLContext.getCurrentGL().glEnable(cap); - } - - @Override - protected void disable(int cap){ - GLContext.getCurrentGL().glDisable(cap); - } - - @Override - protected void setActiveTexture(int unit){ - GLContext.getCurrentGL().glActiveTexture(unit); - } - - @Override - protected void bindTexture(int type,int id){ - GLContext.getCurrentGL().glBindTexture(type, id); - } - - protected void deleteTexture(){ - GL gl = GLContext.getCurrentGL(); - gl.glDeleteTextures(1, intBuf1); - } - - private int convertUsage(Usage usage) { - switch (usage) { - case Static: - return GL.GL_STATIC_DRAW; - case Dynamic: - return GL.GL_DYNAMIC_DRAW; - case Stream: - return GL2ES2.GL_STREAM_DRAW; - default: - throw new RuntimeException("Unknown usage type: " + usage); - } - } - - @Override - protected int convertFormat(Format format) { - switch (format) { - case Byte: - return GL.GL_BYTE; - case UnsignedByte: - return GL.GL_UNSIGNED_BYTE; - case Short: - return GL.GL_SHORT; - case UnsignedShort: - return GL.GL_UNSIGNED_SHORT; - case Int: - return GL2ES2.GL_INT; - case UnsignedInt: - return GL2ES2.GL_UNSIGNED_INT; - case Half: - return GL.GL_HALF_FLOAT; - case Float: - return GL.GL_FLOAT; - case Double: - return GL2GL3.GL_DOUBLE; - default: - throw new RuntimeException("Unknown buffer format."); - - } - } - - public void updateBufferData(VertexBuffer vb) { - GL gl = GLContext.getCurrentGL(); - int bufId = vb.getId(); - if (bufId == -1) { - // create buffer - gl.glGenBuffers(1, intBuf1); - bufId = intBuf1.get(0); - vb.setId(bufId); - objManager.registerForCleanup(vb); - } - - int target; - if (vb.getBufferType() == VertexBuffer.Type.Index) { - target = GL.GL_ELEMENT_ARRAY_BUFFER; - if (context.boundElementArrayVBO != bufId) { - gl.glBindBuffer(target, bufId); - context.boundElementArrayVBO = bufId; - } - } - else { - target = GL.GL_ARRAY_BUFFER; - if (context.boundArrayVBO != bufId) { - gl.glBindBuffer(target, bufId); - context.boundArrayVBO = bufId; - } - } - - int usage = convertUsage(vb.getUsage()); - Buffer data = vb.getData(); - data.rewind(); - - gl.glBufferData(target, data.capacity() * vb.getFormat().getComponentSize(), data, usage); - - vb.clearUpdateNeeded(); - } - - @Override - protected void deleteBuffer(){ - GLContext.getCurrentGL().glDeleteBuffers(1, intBuf1); - } - - @Override - protected int convertArrayType(VertexBuffer.Type type) { - switch (type) { - case Position: - return GLPointerFunc.GL_VERTEX_ARRAY; - case Normal: - return GLPointerFunc.GL_NORMAL_ARRAY; - case TexCoord: - return GLPointerFunc.GL_TEXTURE_COORD_ARRAY; - case Color: - return GLPointerFunc.GL_COLOR_ARRAY; - default: - return -1; // unsupported - } - } - - @Override - protected int convertVertexFormat(VertexBuffer.Format fmt) { - switch (fmt) { - case Byte: - return GL.GL_BYTE; - case Double: - return GL2GL3.GL_DOUBLE; - case Float: - return GL.GL_FLOAT; - case Half: - return GL.GL_HALF_FLOAT; - case Int: - return GL2ES2.GL_INT; - case Short: - return GL.GL_SHORT; - case UnsignedByte: - return GL.GL_UNSIGNED_BYTE; - case UnsignedInt: - return GL2ES2.GL_UNSIGNED_INT; - case UnsignedShort: - return GL.GL_UNSIGNED_SHORT; - default: - throw new UnsupportedOperationException("Unrecognized vertex format: " + fmt); - } - } - - @Override - protected int convertElementMode(Mesh.Mode mode) { - switch (mode) { - case Points: - return GL.GL_POINTS; - case Lines: - return GL.GL_LINES; - case LineLoop: - return GL.GL_LINE_LOOP; - case LineStrip: - return GL.GL_LINE_STRIP; - case Triangles: - return GL.GL_TRIANGLES; - case TriangleFan: - return GL.GL_TRIANGLE_FAN; - case TriangleStrip: - return GL.GL_TRIANGLE_STRIP; - default: - throw new UnsupportedOperationException("Unrecognized mesh mode: " + mode); - } - } - - @Override - protected void setVertexAttribVBO(VertexBuffer vb, VertexBuffer idb) { - GL gl = GLContext.getCurrentGL(); - int arrayType = convertArrayType(vb.getBufferType()); - if (arrayType == -1) { - return; // unsupported - } - - if (vb.isUpdateNeeded() && idb == null) { - updateBufferData(vb); - } - - int bufId = idb != null ? idb.getId() : vb.getId(); - if (context.boundArrayVBO != bufId) { - gl.glBindBuffer(GL.GL_ARRAY_BUFFER, bufId); - context.boundArrayVBO = bufId; - } - - gl.getGL2().glEnableClientState(arrayType); - context.boundAttribs[vb.getBufferType().ordinal()] = vb; - - if (vb.getBufferType() == Type.Normal) { - // normalize if requested - if (vb.isNormalized() && !context.normalizeEnabled) { - gl.glEnable(GLLightingFunc.GL_NORMALIZE); - context.normalizeEnabled = true; - } - else if (!vb.isNormalized() && context.normalizeEnabled) { - gl.glDisable(GLLightingFunc.GL_NORMALIZE); - context.normalizeEnabled = false; - } - } - - int comps = vb.getNumComponents(); - int type = convertVertexFormat(vb.getFormat()); - - switch (vb.getBufferType()) { - case Position: - gl.getGL2().glVertexPointer(comps, type, vb.getStride(), vb.getOffset()); - break; - case Normal: - gl.getGL2().glNormalPointer(type, vb.getStride(), vb.getOffset()); - break; - case Color: - gl.getGL2().glColorPointer(comps, type, vb.getStride(), vb.getOffset()); - break; - case TexCoord: - gl.getGL2().glTexCoordPointer(comps, type, vb.getStride(), vb.getOffset()); - break; - } - } - - @Override - protected void bindElementArrayBuffer(int buffer) { - GL gl = GLContext.getCurrentGL(); - gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, buffer); - } - - @Override - public void setVertexAttrib(VertexBuffer vb, VertexBuffer idb) { - if (vb.getBufferType() == VertexBuffer.Type.Index) { - throw new IllegalArgumentException( - "Index buffers not allowed to be set to vertex attrib"); - } - - if (vb.isUpdateNeeded() && idb == null) { - updateBufferData(vb); - } - - int programId = context.boundShaderProgram; - GL gl = GLContext.getCurrentGL(); - if (glslVer != -1 && programId > 0) { - Attribute attrib = boundShader.getAttribute(vb.getBufferType().name()); - int loc = attrib.getLocation(); - if (loc == -1) { - return; // not defined - } - - if (loc == -2) { - stringBuf.setLength(0); - stringBuf.append("in").append(vb.getBufferType().name()).append('\0'); - updateNameBuffer(); - loc = gl.getGL2().glGetAttribLocation(programId, stringBuf.toString()); - - // not really the name of it in the shader (inPosition\0) but - // the internal name of the enum (Position). - if (loc < 0) { - attrib.setLocation(-1); - return; // not available in shader. - } - else { - attrib.setLocation(loc); - } - } - - VertexBuffer[] attribs = context.boundAttribs; - if (!context.attribIndexList.moveToNew(loc)) { - gl.getGL2().glEnableVertexAttribArrayARB(loc); - // System.out.println("Enabled ATTRIB IDX: "+loc); - } - if (attribs[loc] != vb) { - // NOTE: Use id from interleaved buffer if specified - int bufId = idb != null ? idb.getId() : vb.getId(); - assert bufId != -1; - if (context.boundArrayVBO != bufId) { - gl.glBindBuffer(GL.GL_ARRAY_BUFFER, bufId); - context.boundArrayVBO = bufId; - } - - gl.getGL2().glVertexAttribPointer(loc, vb.getNumComponents(), - convertFormat(vb.getFormat()), vb.isNormalized(), vb.getStride(), - vb.getOffset()); - - attribs[loc] = vb; - } - } - else { - int arrayType = convertArrayType(vb.getBufferType()); - if (arrayType == -1) { - return; // unsupported - } - - gl.getGL2().glEnableClientState(arrayType); - context.boundAttribs[vb.getBufferType().ordinal()] = vb; - - if (vb.getBufferType() == Type.Normal) { - // normalize if requested - if (vb.isNormalized() && !context.normalizeEnabled) { - gl.glEnable(GLLightingFunc.GL_NORMALIZE); - context.normalizeEnabled = true; - } - else if (!vb.isNormalized() && context.normalizeEnabled) { - gl.glDisable(GLLightingFunc.GL_NORMALIZE); - context.normalizeEnabled = false; - } - } - - // NOTE: Use data from interleaved buffer if specified - Buffer data = idb != null ? idb.getData() : vb.getData(); - int comps = vb.getNumComponents(); - int type = convertVertexFormat(vb.getFormat()); - data.clear(); - data.position(vb.getOffset()); - - switch (vb.getBufferType()) { - case Position: - gl.getGL2().glVertexPointer(comps, type, vb.getStride(), data); - break; - case Normal: - gl.getGL2().glNormalPointer(type, vb.getStride(), data); - break; - case Color: - gl.getGL2().glColorPointer(comps, type, vb.getStride(), data); - break; - case TexCoord: - gl.getGL2().glTexCoordPointer(comps, type, vb.getStride(), data); - break; - } - } - } - - @Override - protected void disableClientState(int cap){ - GLContext.getCurrentGL().getGL2().glDisableClientState(cap); - } - - @Override - protected void drawElements(Mode mode, int count, Format format, Buffer indices) { - GLContext.getCurrentGL().glDrawElements(convertElementMode(mode), count, convertVertexFormat(format), indices); - } - - @Override - protected void drawRangeElements(Mode mode, int start, int end, int count, Format format, - long indices_buffer_offset) { - GLContext.getCurrentGL().getGL2().glDrawRangeElements(convertElementMode(mode), start, end, count, - convertVertexFormat(format), indices_buffer_offset); - } - - @Override - protected void drawElementsInstanced(Mode mode, int indices_count, Format format, - long indices_buffer_offset, int primcount) { - // GL gl = GLContext.getCurrentGL(); - // FIXME: not yet in JOGL - // gl.getGL2GL3().glDrawElementsInstanced(convertElementMode(mode), indices_count, - // convertVertexFormat(format), indices_buffer_offset, primcount); - } - - @Override - protected void drawArrays(Mesh mesh) { - GLContext.getCurrentGL().glDrawArrays(convertElementMode(mesh.getMode()), 0, mesh.getVertexCount()); - } - - private void updateDisplayList(Mesh mesh) { - GL gl = GLContext.getCurrentGL(); - if (mesh.getId() != -1) { - // delete list first - gl.getGL2().glDeleteLists(mesh.getId(), mesh.getId()); - mesh.setId(-1); - } - - // create new display list - // first set state to NULL - applyRenderState(RenderState.NULL); - - // disable lighting - setLighting(null); - - int id = gl.getGL2().glGenLists(1); - mesh.setId(id); - gl.getGL2().glNewList(id, GL2.GL_COMPILE); - renderMeshDefault(mesh, 0, 1); - gl.getGL2().glEndList(); - } - - private void renderMeshDisplayList(Mesh mesh) { - if (mesh.getId() == -1) { - updateDisplayList(mesh); - } - GLContext.getCurrentGL().getGL2().glCallList(mesh.getId()); - } - - public void renderMesh(Mesh mesh, int lod, int count) { - GL gl = GLContext.getCurrentGL(); - if (context.pointSize != mesh.getPointSize()) { - gl.getGL2().glPointSize(mesh.getPointSize()); - context.pointSize = mesh.getPointSize(); - } - if (context.lineWidth != mesh.getLineWidth()) { - gl.glLineWidth(mesh.getLineWidth()); - context.lineWidth = mesh.getLineWidth(); - } - - checkTexturingUsed(); - - if (vbo) { - renderMeshVBO(mesh, lod, count); - } - else { - boolean dynamic = false; - if (mesh.getNumLodLevels() == 0) { - IntMap bufs = mesh.getBuffers(); - for (Entry entry : bufs) { - if (entry.getValue().getUsage() != VertexBuffer.Usage.Static) { - dynamic = true; - break; - } - } - } - else { - dynamic = true; - } - - if (!dynamic) { - // dealing with a static object, generate display list - renderMeshDisplayList(mesh); - } - else { - renderMeshDefault(mesh, lod, count); - } - } - } - -} diff --git a/engine/src/jogl2/com/jme3/renderer/jogl/TextureUtil.java b/engine/src/jogl2/com/jme3/renderer/jogl/TextureUtil.java deleted file mode 100644 index 2aca6666d..000000000 --- a/engine/src/jogl2/com/jme3/renderer/jogl/TextureUtil.java +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.renderer.jogl; - -import java.nio.ByteBuffer; - -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL2GL3; - -import com.jme3.texture.Image; -import com.jme3.texture.Image.Format; - -public class TextureUtil { - - public static int convertTextureFormat(Format fmt) { - switch (fmt) { - case Alpha16: - case Alpha8: - return GL.GL_ALPHA; - case Luminance8Alpha8: - case Luminance16Alpha16: - return GL.GL_LUMINANCE_ALPHA; - case Luminance8: - case Luminance16: - return GL.GL_LUMINANCE; - case RGB10: - case RGB16: - case BGR8: - case RGB8: - case RGB565: - return GL.GL_RGB; - case RGB5A1: - case RGBA16: - case RGBA8: - return GL.GL_RGBA; - case Depth: - return GL2ES2.GL_DEPTH_COMPONENT; - default: - throw new UnsupportedOperationException("Unrecognized format: " + fmt); - } - } - - public static void uploadTexture(GL gl, Image img, int index, boolean generateMips, - boolean powerOf2) { - - Image.Format fmt = img.getFormat(); - ByteBuffer data; - if (index >= 0 && img.getData() != null && img.getData().size() > 0) { - data = img.getData(index); - } - else { - data = null; - } - - int width = img.getWidth(); - int height = img.getHeight(); - // int depth = img.getDepth(); - - boolean compress = false; - int format = -1; - int internalFormat = -1; - int dataType = -1; - - switch (fmt) { - case Alpha16: - format = GL.GL_ALPHA; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2.GL_ALPHA16; - break; - case Alpha8: - format = GL.GL_ALPHA; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2.GL_ALPHA8; - break; - case Luminance8: - format = GL.GL_LUMINANCE; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2.GL_LUMINANCE8; - break; - case Luminance8Alpha8: - format = GL.GL_LUMINANCE_ALPHA; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2.GL_LUMINANCE8_ALPHA8; - break; - case Luminance16Alpha16: - format = GL.GL_LUMINANCE_ALPHA; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2.GL_LUMINANCE16_ALPHA16; - break; - case Luminance16: - format = GL.GL_LUMINANCE; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2.GL_LUMINANCE16; - break; - case RGB565: - format = GL.GL_RGB; - dataType = GL.GL_UNSIGNED_SHORT_5_6_5; - internalFormat = GL.GL_RGB8; - break; - case ARGB4444: - format = GL.GL_RGBA; - dataType = GL.GL_UNSIGNED_SHORT_4_4_4_4; - internalFormat = GL.GL_RGBA4; - break; - case RGB10: - format = GL.GL_RGB; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2GL3.GL_RGB10; - break; - case RGB16: - format = GL.GL_RGB; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2GL3.GL_RGB16; - break; - case RGB5A1: - format = GL.GL_RGBA; - dataType = GL.GL_UNSIGNED_SHORT_5_5_5_1; - internalFormat = GL.GL_RGB5_A1; - break; - case RGB8: - format = GL.GL_RGB; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL.GL_RGB8; - break; - case BGR8: - format = GL2GL3.GL_BGR; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL.GL_RGB8; - break; - case RGBA16: - format = GL.GL_RGBA; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL2GL3.GL_RGBA16; - break; - case RGBA8: - format = GL.GL_RGBA; - dataType = GL.GL_UNSIGNED_BYTE; - internalFormat = GL.GL_RGBA8; - break; - case DXT1: - compress = true; - internalFormat = GL.GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - format = GL.GL_RGB; - dataType = GL.GL_UNSIGNED_BYTE; - break; - case DXT1A: - compress = true; - internalFormat = GL.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; - format = GL.GL_RGBA; - dataType = GL.GL_UNSIGNED_BYTE; - break; - case DXT3: - compress = true; - internalFormat = GL.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - format = GL.GL_RGBA; - dataType = GL.GL_UNSIGNED_BYTE; - break; - case DXT5: - compress = true; - internalFormat = GL.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - format = GL.GL_RGBA; - dataType = GL.GL_UNSIGNED_BYTE; - break; - case Depth: - internalFormat = GL2ES2.GL_DEPTH_COMPONENT; - format = GL2ES2.GL_DEPTH_COMPONENT; - dataType = GL.GL_UNSIGNED_BYTE; - break; - default: - throw new UnsupportedOperationException("Unrecognized format: " + fmt); - } - - if (data != null) { - gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1); - } - - int[] mipSizes = img.getMipMapSizes(); - int pos = 0; - if (mipSizes == null) { - if (data != null) { - mipSizes = new int[] { data.capacity() }; - } - else { - mipSizes = new int[] { width * height * fmt.getBitsPerPixel() / 8 }; - } - } - - for (int i = 0; i < mipSizes.length; i++) { - int mipWidth = Math.max(1, width >> i); - int mipHeight = Math.max(1, height >> i); - // int mipDepth = Math.max(1, depth >> i); - - if (data != null) { - data.position(pos); - data.limit(pos + mipSizes[i]); - } - - if (compress && data != null) { - gl.glCompressedTexImage2D(GL.GL_TEXTURE_2D, i, internalFormat, mipWidth, mipHeight, - 0, data.remaining(), data); - } - else { - gl.glTexImage2D(GL.GL_TEXTURE_2D, i, internalFormat, mipWidth, mipHeight, 0, - format, dataType, data); - } - - pos += mipSizes[i]; - } - } - -} diff --git a/engine/src/jogl2/com/jme3/system/jogl/JoglAbstractDisplay.java b/engine/src/jogl2/com/jme3/system/jogl/JoglAbstractDisplay.java deleted file mode 100644 index 7f3a7467d..000000000 --- a/engine/src/jogl2/com/jme3/system/jogl/JoglAbstractDisplay.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.system.jogl; - -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.logging.Logger; - -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLContext; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.GLProfile; -import javax.media.opengl.awt.GLCanvas; - -import com.jme3.input.KeyInput; -import com.jme3.input.MouseInput; -import com.jme3.input.awt.AwtKeyInput; -import com.jme3.input.awt.AwtMouseInput; -import com.jme3.renderer.jogl.JoglRenderer; -import com.jogamp.opengl.util.Animator; -import com.jogamp.opengl.util.AnimatorBase; -import com.jogamp.opengl.util.FPSAnimator; - -public abstract class JoglAbstractDisplay extends JoglContext implements GLEventListener { - - private static final Logger logger = Logger.getLogger(JoglAbstractDisplay.class.getName()); - - protected GraphicsDevice device; - - protected GLCanvas canvas; - - protected AnimatorBase animator; - - protected AtomicBoolean active = new AtomicBoolean(false); - - protected boolean wasActive = false; - - protected int frameRate; - - protected boolean useAwt = true; - - protected AtomicBoolean autoFlush = new AtomicBoolean(true); - - protected boolean wasAnimating = false; - - static { - // FIXME: should be called as early as possible before any GUI task - GLProfile.initSingleton(); - } - - protected void initGLCanvas() { - device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); - - GLCapabilities caps = new GLCapabilities(GLProfile.getDefault()); - caps.setHardwareAccelerated(true); - caps.setDoubleBuffered(true); - caps.setStencilBits(settings.getStencilBits()); - caps.setDepthBits(settings.getDepthBits()); - - if (settings.getSamples() > 1) { - caps.setSampleBuffers(true); - caps.setNumSamples(settings.getSamples()); - } - - canvas = new GLCanvas(caps) { - @Override - public void addNotify() { - super.addNotify(); - onCanvasAdded(); - } - - @Override - public void removeNotify() { - onCanvasRemoved(); - super.removeNotify(); - } - }; - // TODO: add a check on the settings - // set the size of the canvas as early as possible to avoid further useless reshape attempts - canvas.setSize(settings.getWidth(), settings.getHeight()); - if (settings.isVSync()) { - GLContext.getCurrentGL().setSwapInterval(1); - } - canvas.setFocusable(true); - canvas.setIgnoreRepaint(true); - canvas.addGLEventListener(this); - - // N.B: it is too early to get the GL instance from the canvas - // if (false){ - // trace mode - // jME already uses err stream, use out instead - // gl = new TraceGL(gl, System.out); - // }else if (false){ - // debug mode - // gl = new DebugGL(gl); - // }else{ - // production mode - // } - renderer = new JoglRenderer(); - } - - protected void startGLCanvas() { - if (frameRate > 0) { - animator = new FPSAnimator(canvas, frameRate); - // ((FPSAnimator)animator).setRunAsFastAsPossible(true); - } - else { - animator = new Animator(canvas); - ((Animator) animator).setRunAsFastAsPossible(true); - } - - animator.start(); - wasAnimating = true; - } - - protected void onCanvasAdded() { - } - - protected void onCanvasRemoved() { - } - - @Override - public KeyInput getKeyInput() { - return new AwtKeyInput(canvas); - } - - @Override - public MouseInput getMouseInput() { - return new AwtMouseInput(canvas); - } - - public void setAutoFlushFrames(boolean enabled) { - autoFlush.set(enabled); - } - - /** - * Callback. - */ - public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { - listener.reshape(width, height); - } - - /** - * Callback. - */ - public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { - } - - /** - * Callback - */ - public void dispose(GLAutoDrawable drawable) { - - } -} diff --git a/engine/src/jogl2/com/jme3/system/jogl/JoglCanvas.java b/engine/src/jogl2/com/jme3/system/jogl/JoglCanvas.java deleted file mode 100644 index c91cab8e8..000000000 --- a/engine/src/jogl2/com/jme3/system/jogl/JoglCanvas.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.system.jogl; - -import com.jme3.system.JmeCanvasContext; -import java.awt.Canvas; -import java.util.logging.Logger; -import javax.media.opengl.GLAutoDrawable; - -public class JoglCanvas extends JoglAbstractDisplay implements JmeCanvasContext { - - private static final Logger logger = Logger.getLogger(JoglCanvas.class.getName()); - private int width, height; - - public JoglCanvas(){ - super(); - initGLCanvas(); - } - - public Type getType() { - return Type.Canvas; - } - - public void setTitle(String title) { - } - - public void restart() { - } - - public void create(boolean waitFor){ - if (waitFor) - waitFor(true); - } - - public void destroy(boolean waitFor){ - if (waitFor) - waitFor(false); - } - - @Override - protected void onCanvasRemoved(){ - super.onCanvasRemoved(); - created.set(false); - waitFor(false); - } - - @Override - protected void onCanvasAdded(){ - startGLCanvas(); - } - - public void init(GLAutoDrawable drawable) { - canvas.requestFocus(); - - super.internalCreate(); - logger.info("Display created."); - - renderer.initialize(); - listener.initialize(); - } - - public void display(GLAutoDrawable glad) { - if (!created.get() && renderer != null){ - listener.destroy(); - logger.info("Canvas destroyed."); - super.internalDestroy(); - return; - } - - if (width != canvas.getWidth() || height != canvas.getHeight()){ - width = canvas.getWidth(); - height = canvas.getHeight(); - if (listener != null) - listener.reshape(width, height); - } - - boolean flush = autoFlush.get(); - if (flush && !wasAnimating){ - animator.start(); - wasAnimating = true; - }else if (!flush && wasAnimating){ - animator.stop(); - wasAnimating = false; - } - - listener.update(); - renderer.onFrame(); - - } - - public Canvas getCanvas() { - return canvas; - } - - @Override - public void dispose(GLAutoDrawable arg0) { - } - -} diff --git a/engine/src/jogl2/com/jme3/system/jogl/JoglContext.java b/engine/src/jogl2/com/jme3/system/jogl/JoglContext.java deleted file mode 100644 index 6f36f3092..000000000 --- a/engine/src/jogl2/com/jme3/system/jogl/JoglContext.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.system.jogl; - -import com.jme3.input.JoyInput; -import com.jme3.input.KeyInput; -import com.jme3.input.MouseInput; -import com.jme3.input.awt.AwtKeyInput; -import com.jme3.input.awt.AwtMouseInput; -import com.jme3.renderer.Renderer; -import com.jme3.renderer.jogl.JoglRenderer; -import com.jme3.system.AppSettings; -import com.jme3.system.SystemListener; -import com.jme3.system.JmeContext; -import com.jme3.system.NanoTimer; -import com.jme3.system.Timer; -import java.util.concurrent.atomic.AtomicBoolean; - -public abstract class JoglContext implements JmeContext { - - protected AtomicBoolean created = new AtomicBoolean(false); - protected final Object createdLock = new Object(); - - protected AppSettings settings = new AppSettings(true); - protected JoglRenderer renderer; - protected Timer timer; - protected SystemListener listener; - - protected AwtKeyInput keyInput; - protected AwtMouseInput mouseInput; - - public void setSystemListener(SystemListener listener){ - this.listener = listener; - } - - public void setSettings(AppSettings settings) { - this.settings.copyFrom(settings); - } - - public AppSettings getSettings() { - return settings; - } - - public Renderer getRenderer() { - return renderer; - } - - public MouseInput getMouseInput() { - return mouseInput; - } - - public KeyInput getKeyInput() { - return keyInput; - } - - public JoyInput getJoyInput() { - return null; - } - - public Timer getTimer() { - return timer; - } - - public boolean isCreated() { - return created.get(); - } - - public void create(){ - create(false); - } - - public void destroy(){ - destroy(false); - } - - protected void waitFor(boolean createdVal){ - synchronized (createdLock){ - while (created.get() != createdVal){ - try { - createdLock.wait(); - } catch (InterruptedException ex) { - } - } - } - } - - public void internalCreate() { - timer = new NanoTimer(); - synchronized (createdLock){ - created.set(true); - createdLock.notifyAll(); - } - // renderer initialization must happen in subclass. - } - - protected void internalDestroy() { - renderer = null; - timer = null; - - synchronized (createdLock){ - created.set(false); - createdLock.notifyAll(); - } - } - -} diff --git a/engine/src/jogl2/com/jme3/system/jogl/JoglDisplay.java b/engine/src/jogl2/com/jme3/system/jogl/JoglDisplay.java deleted file mode 100644 index 042f3faa6..000000000 --- a/engine/src/jogl2/com/jme3/system/jogl/JoglDisplay.java +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.system.jogl; - -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.DisplayMode; -import java.awt.Frame; -import java.awt.Toolkit; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.media.opengl.GLAutoDrawable; -import javax.swing.JFrame; -import javax.swing.SwingUtilities; - -import com.jme3.system.AppSettings; - -public class JoglDisplay extends JoglAbstractDisplay { - - private static final Logger logger = Logger.getLogger(JoglDisplay.class.getName()); - - protected AtomicBoolean windowCloseRequest = new AtomicBoolean(false); - - protected AtomicBoolean needClose = new AtomicBoolean(false); - - protected AtomicBoolean needRestart = new AtomicBoolean(false); - - protected boolean wasInited = false; - - protected Frame frame; - - public Type getType() { - return Type.Display; - } - - private int getClosestValidBitDepth(DisplayMode[] modes, final int bpp) { - final int validBitsPerPixels; - // check the bit depth (bits per pixel) - boolean isBitDepthValid = false; - for (DisplayMode mode : modes) { - if (mode != null && mode.getBitDepth() == bpp) { - isBitDepthValid = true; - break; - } - } - if (!isBitDepthValid) { - // use the closest valid bit depth - int bestSupportedBitDepth = Integer.MAX_VALUE; - int biggestBitDepth = -Integer.MIN_VALUE; - for (DisplayMode mode : modes) { - if (mode != null) { - if (Math.abs(mode.getBitDepth() - bpp) < Math.abs(bestSupportedBitDepth - bpp)) { - bestSupportedBitDepth = mode.getBitDepth(); - } - if (mode.getBitDepth() > biggestBitDepth) { - biggestBitDepth = mode.getBitDepth(); - } - } - - } - if (bestSupportedBitDepth == Integer.MAX_VALUE) { - validBitsPerPixels = biggestBitDepth; - } - else { - validBitsPerPixels = bestSupportedBitDepth; - } - } - else { - validBitsPerPixels = bpp; - } - return validBitsPerPixels; - } - - private Dimension getClosestValidDisplaySize(DisplayMode[] modes, final int width, - final int height) { - Dimension validDisplaySize = new Dimension(width, height); - if (width <= 0 || height <= 0) { - // leave the size unchanged - validDisplaySize.width = device.getDisplayMode().getWidth(); - validDisplaySize.height = device.getDisplayMode().getHeight(); - } - else { - boolean isDimensionValid = false; - for (DisplayMode mode : modes) { - if (mode.getWidth() == width && mode.getHeight() == height) { - isDimensionValid = true; - break; - } - } - if (!isDimensionValid) { - int bestSupportedWidth = Integer.MAX_VALUE; - int bestSupportedHeight = Integer.MAX_VALUE; - int biggestSupportedWidth = Integer.MIN_VALUE; - int biggestSupportedHeight = Integer.MIN_VALUE; - // use the closest supported width - for (DisplayMode mode : modes) { - if (Math.abs(mode.getWidth() - width) < Math.abs(bestSupportedWidth - width)) { - bestSupportedWidth = mode.getWidth(); - bestSupportedHeight = mode.getHeight(); - } - if (mode.getWidth() > biggestSupportedWidth) { - biggestSupportedWidth = mode.getWidth(); - biggestSupportedHeight = mode.getHeight(); - } - } - // if the width was really too big, use the screen width - if (bestSupportedWidth == Integer.MAX_VALUE) { - validDisplaySize.width = biggestSupportedWidth; - validDisplaySize.height = biggestSupportedHeight; - } - else { - validDisplaySize.width = bestSupportedWidth; - validDisplaySize.height = bestSupportedHeight; - } - } - } - // keep only valid modes - for (int modeIndex = 0; modeIndex < modes.length; modeIndex++) { - if (modes[modeIndex] != null && modes[modeIndex].getWidth() != validDisplaySize.width - && modes[modeIndex].getHeight() != validDisplaySize.height) { - modes[modeIndex] = null; - } - } - return validDisplaySize; - } - - private int getClosestValidRefreshRate(DisplayMode[] modes, final int freq) { - final int validRefreshRate; - boolean isRefreshRateValid = false; - for (DisplayMode mode : modes) { - if (mode != null && mode.getRefreshRate() == freq) { - isRefreshRateValid = true; - break; - } - } - if (!isRefreshRateValid) { - int bestSupportedRefreshRate = Integer.MAX_VALUE; - int biggestRefreshRate = -Integer.MIN_VALUE; - for (DisplayMode mode : modes) { - if (mode != null) { - if (Math.abs(mode.getRefreshRate() - freq) < Math.abs(bestSupportedRefreshRate - - freq)) { - bestSupportedRefreshRate = mode.getRefreshRate(); - } - if (mode.getRefreshRate() > biggestRefreshRate) { - biggestRefreshRate = mode.getRefreshRate(); - } - } - } - if (bestSupportedRefreshRate == Integer.MAX_VALUE) { - validRefreshRate = biggestRefreshRate; - } - else { - validRefreshRate = bestSupportedRefreshRate; - } - } - else { - validRefreshRate = freq; - } - return validRefreshRate; - } - - protected DisplayMode getFullscreenDisplayMode(final DisplayMode[] modes, int width, - int height, int bpp, int freq) { - DisplayMode[] validModes = new DisplayMode[modes.length]; - System.arraycopy(modes, 0, validModes, 0, modes.length); - Dimension validDisplaySize = getClosestValidDisplaySize(validModes, width, height); - bpp = getClosestValidBitDepth(validModes, bpp); - width = validDisplaySize.width; - height = validDisplaySize.height; - freq = getClosestValidRefreshRate(validModes, freq); - // Now, the bit depth, the refresh rate, the width and the height are valid - for (DisplayMode mode : validModes) { - if (mode != null - && (mode.getWidth() == width && mode.getHeight() == height - && mode.getBitDepth() == bpp || (mode.getBitDepth() == 32 && bpp == 24) - && mode.getRefreshRate() == freq)) { - return mode; - } - } - return null; - } - - protected void createGLFrame() { - Container contentPane; - if (useAwt) { - frame = new Frame(settings.getTitle()); - contentPane = frame; - } - else { - frame = new JFrame(settings.getTitle()); - contentPane = ((JFrame) frame).getContentPane(); - } - - contentPane.setLayout(new BorderLayout()); - - applySettings(settings); - - frame.setResizable(false); - frame.setFocusable(true); - - if (settings.getIcons() != null) { - try { - Method setIconImages = frame.getClass().getMethod("setIconImages", List.class); - setIconImages.invoke(frame, Arrays.asList(settings.getIcons())); - } catch (Exception e) { - e.printStackTrace(); - } - } - - canvas.setSize(settings.getWidth(), settings.getHeight()); - // only add canvas after frame is visible - contentPane.add(canvas, BorderLayout.CENTER); - if (!useAwt) { - contentPane.setSize(settings.getWidth(), settings.getHeight()); - } - frame.setSize(settings.getWidth(), settings.getHeight()); - frame.setPreferredSize(new Dimension(settings.getWidth(), settings.getHeight())); - // N.B: do not use pack() - - if (device.getFullScreenWindow() == null) { - // now that canvas is attached, - // determine optimal size to contain it - - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation((screenSize.width - frame.getWidth()) / 2, - (screenSize.height - frame.getHeight()) / 2); - } - - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent evt) { - windowCloseRequest.set(true); - } - - @Override - public void windowActivated(WindowEvent evt) { - active.set(true); - } - - @Override - public void windowDeactivated(WindowEvent evt) { - active.set(false); - } - }); - } - - protected void applySettings(AppSettings settings) { - DisplayMode displayMode; - if (settings.getWidth() <= 0 || settings.getHeight() <= 0) { - displayMode = device.getDisplayMode(); - settings.setResolution(displayMode.getWidth(), displayMode.getHeight()); - } - else if (settings.isFullscreen()) { - displayMode = getFullscreenDisplayMode(device.getDisplayModes(), settings.getWidth(), - settings.getHeight(), settings.getBitsPerPixel(), settings.getFrequency()); - if (displayMode == null) { - throw new RuntimeException( - "Unable to find fullscreen display mode matching settings"); - } - } - else { - displayMode = getFullscreenDisplayMode(device.getDisplayModes(), settings.getWidth(), - settings.getHeight(), settings.getBitsPerPixel(), settings.getFrequency()); - } - settings.setWidth(displayMode.getWidth()); - settings.setHeight(displayMode.getHeight()); - settings.setBitsPerPixel(displayMode.getBitDepth()); - settings.setFrequency(displayMode.getRefreshRate()); - - // FIXME: seems to return false even though - // it is supported.. - // if (!device.isDisplayChangeSupported()){ - // // must use current device mode if display mode change not supported - // displayMode = device.getDisplayMode(); - // settings.setResolution(displayMode.getWidth(), displayMode.getHeight()); - // } - - frameRate = settings.getFrameRate(); - logger.log( - Level.INFO, - "Selected display mode: {0}x{1}x{2} @{3}", - new Object[] { settings.getWidth(), settings.getHeight(), - settings.getBitsPerPixel(), settings.getFrequency() }); - - canvas.setSize(settings.getWidth(), settings.getHeight()); - - DisplayMode prevDisplayMode = device.getDisplayMode(); - - frame.setUndecorated(settings.isFullscreen()); - if (settings.isFullscreen()) { - if (device.isFullScreenSupported()) { - try { - device.setFullScreenWindow(frame); - if (!prevDisplayMode.equals(displayMode) && device.isDisplayChangeSupported()) { - device.setDisplayMode(displayMode); - } - } - catch (Throwable t) { - logger.log(Level.SEVERE, "Failed to enter fullscreen mode", t); - device.setFullScreenWindow(null); - } - } - else { - logger.warning("Fullscreen not supported."); - } - } - else { - if (device.getFullScreenWindow() == frame) { - device.setFullScreenWindow(null); - } - } - frame.setVisible(true); - } - - private void initInEDT() { - initGLCanvas(); - - createGLFrame(); - - startGLCanvas(); - } - - public void init(GLAutoDrawable drawable) { - // prevent initializing twice on restart - if (!wasInited) { - canvas.requestFocus(); - - super.internalCreate(); - logger.info("Display created."); - - renderer.initialize(); - listener.initialize(); - - wasInited = true; - } - } - - public void create(boolean waitFor) { - try { - if (waitFor) { - try { - SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - initInEDT(); - } - }); - } - catch (InterruptedException ex) { - listener.handleError("Interrupted", ex); - } - } - else { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - initInEDT(); - } - }); - } - } - catch (InvocationTargetException ex) { - throw new AssertionError(); // can never happen - } - } - - public void destroy(boolean waitFor) { - needClose.set(true); - if (waitFor) { - waitFor(false); - } - } - - public void restart() { - if (created.get()) { - needRestart.set(true); - } - else { - throw new IllegalStateException("Display not started yet. Cannot restart"); - } - } - - public void setTitle(String title) { - if (frame != null) { - frame.setTitle(title); - } - } - - /** - * Callback. - */ - public void display(GLAutoDrawable drawable) { - if (needClose.get()) { - listener.destroy(); - animator.stop(); - if (settings.isFullscreen()) { - device.setFullScreenWindow(null); - } - frame.dispose(); - logger.info("Display destroyed."); - super.internalDestroy(); - return; - } - - if (windowCloseRequest.get()) { - listener.requestClose(false); - windowCloseRequest.set(false); - } - - if (needRestart.getAndSet(false)) { - // for restarting contexts - if (frame.isVisible()) { - animator.stop(); - frame.dispose(); - createGLFrame(); - startGLCanvas(); - } - } - - // boolean flush = autoFlush.get(); - // if (animator.isAnimating() != flush){ - // if (flush) - // animator.stop(); - // else - // animator.start(); - // } - - if (wasActive != active.get()) { - if (!wasActive) { - listener.gainFocus(); - wasActive = true; - } - else { - listener.loseFocus(); - wasActive = false; - } - } - - listener.update(); - renderer.onFrame(); - } -} diff --git a/engine/src/lwjgl-oal/com/jme3/audio/lwjgl/LwjglAudioRenderer.java b/engine/src/lwjgl/com/jme3/audio/lwjgl/LwjglAudioRenderer.java similarity index 100% rename from engine/src/lwjgl-oal/com/jme3/audio/lwjgl/LwjglAudioRenderer.java rename to engine/src/lwjgl/com/jme3/audio/lwjgl/LwjglAudioRenderer.java diff --git a/engine/src/lwjgl-ogl/com/jme3/input/lwjgl/JInputJoyInput.java b/engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/input/lwjgl/JInputJoyInput.java rename to engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java diff --git a/engine/src/lwjgl-ogl/com/jme3/input/lwjgl/LwjglKeyInput.java b/engine/src/lwjgl/com/jme3/input/lwjgl/LwjglKeyInput.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/input/lwjgl/LwjglKeyInput.java rename to engine/src/lwjgl/com/jme3/input/lwjgl/LwjglKeyInput.java diff --git a/engine/src/lwjgl-ogl/com/jme3/input/lwjgl/LwjglMouseInput.java b/engine/src/lwjgl/com/jme3/input/lwjgl/LwjglMouseInput.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/input/lwjgl/LwjglMouseInput.java rename to engine/src/lwjgl/com/jme3/input/lwjgl/LwjglMouseInput.java diff --git a/engine/src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java b/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java rename to engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java diff --git a/engine/src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java b/engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglRenderer.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java rename to engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglRenderer.java diff --git a/engine/src/lwjgl-ogl/com/jme3/renderer/lwjgl/TextureUtil.java b/engine/src/lwjgl/com/jme3/renderer/lwjgl/TextureUtil.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/renderer/lwjgl/TextureUtil.java rename to engine/src/lwjgl/com/jme3/renderer/lwjgl/TextureUtil.java diff --git a/engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglAbstractDisplay.java b/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglAbstractDisplay.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglAbstractDisplay.java rename to engine/src/lwjgl/com/jme3/system/lwjgl/LwjglAbstractDisplay.java diff --git a/engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglCanvas.java b/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglCanvas.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglCanvas.java rename to engine/src/lwjgl/com/jme3/system/lwjgl/LwjglCanvas.java diff --git a/engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglContext.java b/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglContext.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglContext.java rename to engine/src/lwjgl/com/jme3/system/lwjgl/LwjglContext.java diff --git a/engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglDisplay.java b/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglDisplay.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglDisplay.java rename to engine/src/lwjgl/com/jme3/system/lwjgl/LwjglDisplay.java diff --git a/engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java b/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java rename to engine/src/lwjgl/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java diff --git a/engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglSmoothingTimer.java b/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglSmoothingTimer.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglSmoothingTimer.java rename to engine/src/lwjgl/com/jme3/system/lwjgl/LwjglSmoothingTimer.java diff --git a/engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglTimer.java b/engine/src/lwjgl/com/jme3/system/lwjgl/LwjglTimer.java similarity index 100% rename from engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglTimer.java rename to engine/src/lwjgl/com/jme3/system/lwjgl/LwjglTimer.java diff --git a/engine/src/pack/com/jme3/asset/pack/FileRangeChannel.java b/engine/src/pack/com/jme3/asset/pack/FileRangeChannel.java deleted file mode 100644 index fe10a2874..000000000 --- a/engine/src/pack/com/jme3/asset/pack/FileRangeChannel.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.pack; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ClosedChannelException; -import java.nio.channels.FileChannel; -import java.nio.channels.ReadableByteChannel; - -public class FileRangeChannel implements ReadableByteChannel { - - private FileChannel channel; - private long position; - private long limit; - - public FileRangeChannel(FileChannel channel, long position, int length){ - if (channel == null) - throw new NullPointerException(); - - if (position < 0 || length <= 0) - throw new IllegalArgumentException(); - - this.channel = channel; - this.position = position; - this.limit = position + length; - } - - public int read(ByteBuffer dst) throws IOException { - if (!channel.isOpen()) - throw new ClosedChannelException(); - - if (dst == null || !dst.hasRemaining()) - return 0; - - int prevLim = dst.limit(); - int toRead = (int) Math.min(dst.remaining(), limit - position); - dst.limit(dst.position() + toRead); - int read = channel.read(dst, position); - position += read; - dst.limit(prevLim); - - return read; - } - - public boolean isOpen() { - return channel.isOpen(); - } - - public void close() throws IOException { - channel.close(); - } - -} diff --git a/engine/src/pack/com/jme3/asset/pack/PackerInputStream.java b/engine/src/pack/com/jme3/asset/pack/PackerInputStream.java deleted file mode 100644 index 3c891b9e8..000000000 --- a/engine/src/pack/com/jme3/asset/pack/PackerInputStream.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.pack; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -public class PackerInputStream extends FilterInputStream { - - private ProgressListener listener; - - public PackerInputStream(InputStream in, ProgressListener listener){ - super(in); - this.listener = listener; - } - - public int read(byte[] buf, int off, int len) throws IOException{ - int read = super.read(buf, off, len); - if (read > 0) - listener.onProgress(read); - return read; - } - - public int read(byte[] buf) throws IOException{ - int read = super.read(buf); - if (read > 0) - listener.onProgress(read); - return read; - } - - @Override - public int read() throws IOException{ - int read = super.read(); - if (read != -1) - listener.onProgress(1); - return read; - } - - public long skip(long bytes) throws IOException{ - long skipped = super.skip(bytes); - if (skipped > 0) - listener.onProgress((int)skipped); - return skipped; - } - -} diff --git a/engine/src/pack/com/jme3/asset/pack/ProgressListener.java b/engine/src/pack/com/jme3/asset/pack/ProgressListener.java deleted file mode 100644 index f95b11500..000000000 --- a/engine/src/pack/com/jme3/asset/pack/ProgressListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.pack; - -public interface ProgressListener { - public void onMaxProgress(int maxProgress); - public void onProgress(int addProgress); - public void onText(String text); - public void onError(String text, Throwable err); -} diff --git a/engine/src/pack/com/jme3/asset/pack/ReadableBufferChannel.java b/engine/src/pack/com/jme3/asset/pack/ReadableBufferChannel.java deleted file mode 100644 index 7dab45522..000000000 --- a/engine/src/pack/com/jme3/asset/pack/ReadableBufferChannel.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.jme3.asset.pack; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ClosedChannelException; -import java.nio.channels.ReadableByteChannel; - -/** - * Channel implementation for reading from ByteBuffers. - */ -public class ReadableBufferChannel implements ReadableByteChannel { - - private ByteBuffer bb; - - public ReadableBufferChannel(ByteBuffer bb){ - if (bb == null) - throw new NullPointerException(); - - this.bb = bb; - } - - public int read(ByteBuffer dst) throws IOException { - if (bb == null) - throw new ClosedChannelException(); - - int toRead = Math.min(dst.remaining(), bb.remaining()); - if (toRead == 0) - return -1; // end of stream - - int prevLim = bb.limit(); - int newLim = bb.position() + toRead; - assert newLim <= prevLim; - bb.limit(newLim); - assert bb.remaining() == toRead; - dst.put(bb); - bb.limit(prevLim); - return toRead; - } - - public boolean isOpen() { - return bb != null; - } - - public void close() throws IOException { - bb = null; - } - -} diff --git a/engine/src/test-data/Blender/2.4x/BaseMesh_249.blend b/engine/src/test-data/Blender/2.4x/BaseMesh_249.blend deleted file mode 100644 index 617711c51..000000000 Binary files a/engine/src/test-data/Blender/2.4x/BaseMesh_249.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/BaseScene.blend b/engine/src/test-data/Blender/2.4x/BaseScene.blend deleted file mode 100644 index f4149af04..000000000 Binary files a/engine/src/test-data/Blender/2.4x/BaseScene.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/MountainValley_Track.blend b/engine/src/test-data/Blender/2.4x/MountainValley_Track.blend deleted file mode 100644 index f2f794f14..000000000 Binary files a/engine/src/test-data/Blender/2.4x/MountainValley_Track.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/ObjectAnimation.blend b/engine/src/test-data/Blender/2.4x/ObjectAnimation.blend deleted file mode 100644 index ea0404c87..000000000 Binary files a/engine/src/test-data/Blender/2.4x/ObjectAnimation.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/SimpleAnimation.blend b/engine/src/test-data/Blender/2.4x/SimpleAnimation.blend deleted file mode 100644 index 8ca887d09..000000000 Binary files a/engine/src/test-data/Blender/2.4x/SimpleAnimation.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/Sinbad.blend b/engine/src/test-data/Blender/2.4x/Sinbad.blend deleted file mode 100644 index 3737d0085..000000000 Binary files a/engine/src/test-data/Blender/2.4x/Sinbad.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/WoodCrate_lighter - (Inverted Normal Map).png b/engine/src/test-data/Blender/2.4x/WoodCrate_lighter - (Inverted Normal Map).png deleted file mode 100644 index cfe461db2..000000000 Binary files a/engine/src/test-data/Blender/2.4x/WoodCrate_lighter - (Inverted Normal Map).png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/WoodCrate_lighter - Height Map.png b/engine/src/test-data/Blender/2.4x/WoodCrate_lighter - Height Map.png deleted file mode 100644 index 20caf5007..000000000 Binary files a/engine/src/test-data/Blender/2.4x/WoodCrate_lighter - Height Map.png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/WoodCrate_lighter.png b/engine/src/test-data/Blender/2.4x/WoodCrate_lighter.png deleted file mode 100644 index 29d6867ab..000000000 Binary files a/engine/src/test-data/Blender/2.4x/WoodCrate_lighter.png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/animtest.blend b/engine/src/test-data/Blender/2.4x/animtest.blend deleted file mode 100644 index eabd593dc..000000000 Binary files a/engine/src/test-data/Blender/2.4x/animtest.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/constraints.blend b/engine/src/test-data/Blender/2.4x/constraints.blend deleted file mode 100644 index 53976ad01..000000000 Binary files a/engine/src/test-data/Blender/2.4x/constraints.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/curves.blend b/engine/src/test-data/Blender/2.4x/curves.blend deleted file mode 100644 index 9e9b73b1a..000000000 Binary files a/engine/src/test-data/Blender/2.4x/curves.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/kerrigan.blend b/engine/src/test-data/Blender/2.4x/kerrigan.blend deleted file mode 100644 index 51b4266eb..000000000 Binary files a/engine/src/test-data/Blender/2.4x/kerrigan.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/kerrigan_diffuse.png b/engine/src/test-data/Blender/2.4x/kerrigan_diffuse.png deleted file mode 100644 index 3776ea017..000000000 Binary files a/engine/src/test-data/Blender/2.4x/kerrigan_diffuse.png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/materials.blend b/engine/src/test-data/Blender/2.4x/materials.blend deleted file mode 100644 index e38be7355..000000000 Binary files a/engine/src/test-data/Blender/2.4x/materials.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/modifiers.blend b/engine/src/test-data/Blender/2.4x/modifiers.blend deleted file mode 100644 index d722d851f..000000000 Binary files a/engine/src/test-data/Blender/2.4x/modifiers.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/nurbs.blend b/engine/src/test-data/Blender/2.4x/nurbs.blend deleted file mode 100644 index 84b291b73..000000000 Binary files a/engine/src/test-data/Blender/2.4x/nurbs.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/particles.blend b/engine/src/test-data/Blender/2.4x/particles.blend deleted file mode 100644 index ba7ee53ee..000000000 Binary files a/engine/src/test-data/Blender/2.4x/particles.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/positions.blend b/engine/src/test-data/Blender/2.4x/positions.blend deleted file mode 100644 index d22e89796..000000000 Binary files a/engine/src/test-data/Blender/2.4x/positions.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/sinbad_body.tga b/engine/src/test-data/Blender/2.4x/sinbad_body.tga deleted file mode 100644 index 0074ecd4c..000000000 Binary files a/engine/src/test-data/Blender/2.4x/sinbad_body.tga and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/sinbad_clothes.tga b/engine/src/test-data/Blender/2.4x/sinbad_clothes.tga deleted file mode 100644 index 51bf211bd..000000000 Binary files a/engine/src/test-data/Blender/2.4x/sinbad_clothes.tga and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/sinbad_sword.tga b/engine/src/test-data/Blender/2.4x/sinbad_sword.tga deleted file mode 100644 index 2cabb79e8..000000000 Binary files a/engine/src/test-data/Blender/2.4x/sinbad_sword.tga and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/texturedPlaneTest.blend b/engine/src/test-data/Blender/2.4x/texturedPlaneTest.blend deleted file mode 100644 index da8128d6b..000000000 Binary files a/engine/src/test-data/Blender/2.4x/texturedPlaneTest.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/textures.blend b/engine/src/test-data/Blender/2.4x/textures.blend deleted file mode 100644 index 183fc88d1..000000000 Binary files a/engine/src/test-data/Blender/2.4x/textures.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/textures/Concrete_Wall.PNG b/engine/src/test-data/Blender/2.4x/textures/Concrete_Wall.PNG deleted file mode 100644 index b6713622e..000000000 Binary files a/engine/src/test-data/Blender/2.4x/textures/Concrete_Wall.PNG and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/textures/Grass_256.png b/engine/src/test-data/Blender/2.4x/textures/Grass_256.png deleted file mode 100644 index 4b6cd8466..000000000 Binary files a/engine/src/test-data/Blender/2.4x/textures/Grass_256.png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/textures/SandDesert_StartTower.png b/engine/src/test-data/Blender/2.4x/textures/SandDesert_StartTower.png deleted file mode 100644 index 7b2e6ddd2..000000000 Binary files a/engine/src/test-data/Blender/2.4x/textures/SandDesert_StartTower.png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/textures/SkyBox-Mountain.png b/engine/src/test-data/Blender/2.4x/textures/SkyBox-Mountain.png deleted file mode 100644 index ac0821d56..000000000 Binary files a/engine/src/test-data/Blender/2.4x/textures/SkyBox-Mountain.png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/textures/Tar_Cracked.png b/engine/src/test-data/Blender/2.4x/textures/Tar_Cracked.png deleted file mode 100644 index 27ba25f32..000000000 Binary files a/engine/src/test-data/Blender/2.4x/textures/Tar_Cracked.png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.4x/textures/WarningStrip.png b/engine/src/test-data/Blender/2.4x/textures/WarningStrip.png deleted file mode 100644 index 05366a7af..000000000 Binary files a/engine/src/test-data/Blender/2.4x/textures/WarningStrip.png and /dev/null differ diff --git a/engine/src/test-data/Blender/2.5x/BaseMesh_256.blend b/engine/src/test-data/Blender/2.5x/BaseMesh_256.blend deleted file mode 100644 index 2d058d196..000000000 Binary files a/engine/src/test-data/Blender/2.5x/BaseMesh_256.blend and /dev/null differ diff --git a/engine/src/test-data/Blender/2.5x/textures.blend b/engine/src/test-data/Blender/2.5x/textures.blend deleted file mode 100644 index a4f743c17..000000000 Binary files a/engine/src/test-data/Blender/2.5x/textures.blend and /dev/null differ diff --git a/engine/src/test-data/Effects/Explosion/Debris.png b/engine/src/test-data/Effects/Explosion/Debris.png deleted file mode 100644 index c6eab7bac..000000000 Binary files a/engine/src/test-data/Effects/Explosion/Debris.png and /dev/null differ diff --git a/engine/src/test-data/Effects/Explosion/flame.png b/engine/src/test-data/Effects/Explosion/flame.png deleted file mode 100644 index d3a31f792..000000000 Binary files a/engine/src/test-data/Effects/Explosion/flame.png and /dev/null differ diff --git a/engine/src/test-data/Effects/Explosion/flash.png b/engine/src/test-data/Effects/Explosion/flash.png deleted file mode 100644 index d24091751..000000000 Binary files a/engine/src/test-data/Effects/Explosion/flash.png and /dev/null differ diff --git a/engine/src/test-data/Effects/Explosion/roundspark.png b/engine/src/test-data/Effects/Explosion/roundspark.png deleted file mode 100644 index bb2b5d84f..000000000 Binary files a/engine/src/test-data/Effects/Explosion/roundspark.png and /dev/null differ diff --git a/engine/src/test-data/Effects/Explosion/shockwave.png b/engine/src/test-data/Effects/Explosion/shockwave.png deleted file mode 100644 index 62856bd1c..000000000 Binary files a/engine/src/test-data/Effects/Explosion/shockwave.png and /dev/null differ diff --git a/engine/src/test-data/Effects/Explosion/smoketrail.png b/engine/src/test-data/Effects/Explosion/smoketrail.png deleted file mode 100644 index 5b965182a..000000000 Binary files a/engine/src/test-data/Effects/Explosion/smoketrail.png and /dev/null differ diff --git a/engine/src/test-data/Effects/Explosion/spark.png b/engine/src/test-data/Effects/Explosion/spark.png deleted file mode 100644 index fa2d25a04..000000000 Binary files a/engine/src/test-data/Effects/Explosion/spark.png and /dev/null differ diff --git a/engine/src/test-data/Effects/Smoke/Smoke.png b/engine/src/test-data/Effects/Smoke/Smoke.png deleted file mode 100644 index ec46564ba..000000000 Binary files a/engine/src/test-data/Effects/Smoke/Smoke.png and /dev/null differ diff --git a/engine/src/test-data/Interface/Logo/Cursor.png b/engine/src/test-data/Interface/Logo/Cursor.png deleted file mode 100644 index ce5f4229d..000000000 Binary files a/engine/src/test-data/Interface/Logo/Cursor.png and /dev/null differ diff --git a/engine/src/test-data/Interface/Logo/Logo.j3m b/engine/src/test-data/Interface/Logo/Logo.j3m deleted file mode 100644 index 7c086b6d8..000000000 --- a/engine/src/test-data/Interface/Logo/Logo.j3m +++ /dev/null @@ -1,5 +0,0 @@ -Material jME Logo : Common/MatDefs/Misc/Unshaded.j3md { - MaterialParameters { - ColorMap : Interface/Logo/Monkey.jpg - } -} \ No newline at end of file diff --git a/engine/src/test-data/Interface/Logo/Monkey.jpg b/engine/src/test-data/Interface/Logo/Monkey.jpg deleted file mode 100644 index cfe465de1..000000000 Binary files a/engine/src/test-data/Interface/Logo/Monkey.jpg and /dev/null differ diff --git a/engine/src/test-data/Interface/Logo/Monkey.png b/engine/src/test-data/Interface/Logo/Monkey.png deleted file mode 100644 index e1c8c3d8b..000000000 Binary files a/engine/src/test-data/Interface/Logo/Monkey.png and /dev/null differ diff --git a/engine/src/test-data/Interface/Nifty/CinematicTest.xml b/engine/src/test-data/Interface/Nifty/CinematicTest.xml deleted file mode 100644 index 46e681257..000000000 --- a/engine/src/test-data/Interface/Nifty/CinematicTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/engine/src/test-data/Interface/Nifty/HelloJme.xml b/engine/src/test-data/Interface/Nifty/HelloJme.xml deleted file mode 100644 index c945de6e2..000000000 --- a/engine/src/test-data/Interface/Nifty/HelloJme.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Interface/icons/SmartMonkey128.png b/engine/src/test-data/Interface/icons/SmartMonkey128.png deleted file mode 100644 index 555c72276..000000000 Binary files a/engine/src/test-data/Interface/icons/SmartMonkey128.png and /dev/null differ diff --git a/engine/src/test-data/Interface/icons/SmartMonkey16.png b/engine/src/test-data/Interface/icons/SmartMonkey16.png deleted file mode 100644 index 34a91c428..000000000 Binary files a/engine/src/test-data/Interface/icons/SmartMonkey16.png and /dev/null differ diff --git a/engine/src/test-data/Interface/icons/SmartMonkey256.png b/engine/src/test-data/Interface/icons/SmartMonkey256.png deleted file mode 100644 index 02417f986..000000000 Binary files a/engine/src/test-data/Interface/icons/SmartMonkey256.png and /dev/null differ diff --git a/engine/src/test-data/Interface/icons/SmartMonkey32.png b/engine/src/test-data/Interface/icons/SmartMonkey32.png deleted file mode 100644 index ee5e2093c..000000000 Binary files a/engine/src/test-data/Interface/icons/SmartMonkey32.png and /dev/null differ diff --git a/engine/src/test-data/Models/Boat/boat.j3m b/engine/src/test-data/Models/Boat/boat.j3m deleted file mode 100644 index d33459c7d..000000000 --- a/engine/src/test-data/Models/Boat/boat.j3m +++ /dev/null @@ -1,6 +0,0 @@ -Material My Material : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - DiffuseMap : Models/Boat/boat.png - NormalMap : Models/Boat/boat_normal.png - } -} diff --git a/engine/src/test-data/Models/Boat/boat.j3o b/engine/src/test-data/Models/Boat/boat.j3o deleted file mode 100644 index c93d3b03f..000000000 Binary files a/engine/src/test-data/Models/Boat/boat.j3o and /dev/null differ diff --git a/engine/src/test-data/Models/Boat/boat.mesh.xml b/engine/src/test-data/Models/Boat/boat.mesh.xml deleted file mode 100644 index 069bfe6c8..000000000 --- a/engine/src/test-data/Models/Boat/boat.mesh.xml +++ /dev/null @@ -1,3731 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Boat/boat.png b/engine/src/test-data/Models/Boat/boat.png deleted file mode 100644 index d6ffea96b..000000000 Binary files a/engine/src/test-data/Models/Boat/boat.png and /dev/null differ diff --git a/engine/src/test-data/Models/Boat/boat_normal.png b/engine/src/test-data/Models/Boat/boat_normal.png deleted file mode 100644 index 4fc03b15c..000000000 Binary files a/engine/src/test-data/Models/Boat/boat_normal.png and /dev/null differ diff --git a/engine/src/test-data/Models/Buggy/Buggy.j3m b/engine/src/test-data/Models/Buggy/Buggy.j3m deleted file mode 100644 index 65a96a1d3..000000000 --- a/engine/src/test-data/Models/Buggy/Buggy.j3m +++ /dev/null @@ -1,9 +0,0 @@ -Material My Material : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - DiffuseMap : Models/Buggy/buggy_diffuse.jpg - GlowMap : Models/Buggy/buggy_glow.jpg - SpecularMap : Models/Buggy/buggy_specular.jpg - Shininess : 10 - NormalMap : Models/Buggy/buggy_normals.png - } -} diff --git a/engine/src/test-data/Models/Buggy/Buggy.j3o b/engine/src/test-data/Models/Buggy/Buggy.j3o deleted file mode 100644 index 20f09b818..000000000 Binary files a/engine/src/test-data/Models/Buggy/Buggy.j3o and /dev/null differ diff --git a/engine/src/test-data/Models/Buggy/buggy_diffuse.jpg b/engine/src/test-data/Models/Buggy/buggy_diffuse.jpg deleted file mode 100644 index 45a8fa843..000000000 Binary files a/engine/src/test-data/Models/Buggy/buggy_diffuse.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Buggy/buggy_glow.jpg b/engine/src/test-data/Models/Buggy/buggy_glow.jpg deleted file mode 100644 index 952c66a15..000000000 Binary files a/engine/src/test-data/Models/Buggy/buggy_glow.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Buggy/buggy_normals.png b/engine/src/test-data/Models/Buggy/buggy_normals.png deleted file mode 100644 index dd9feefd7..000000000 Binary files a/engine/src/test-data/Models/Buggy/buggy_normals.png and /dev/null differ diff --git a/engine/src/test-data/Models/Buggy/buggy_specular.jpg b/engine/src/test-data/Models/Buggy/buggy_specular.jpg deleted file mode 100644 index a2745594b..000000000 Binary files a/engine/src/test-data/Models/Buggy/buggy_specular.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Elephant/Elephant.j3m b/engine/src/test-data/Models/Elephant/Elephant.j3m deleted file mode 100644 index 4a58ec394..000000000 --- a/engine/src/test-data/Models/Elephant/Elephant.j3m +++ /dev/null @@ -1,8 +0,0 @@ -Material ElephantBody : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 16.0 - DiffuseMap: Models/Elephant/Elephant.jpg - NormalMap: Models/Elephant/Elephant_normal.jpg - - } -} \ No newline at end of file diff --git a/engine/src/test-data/Models/Elephant/Elephant.jpg b/engine/src/test-data/Models/Elephant/Elephant.jpg deleted file mode 100644 index b4b4014d1..000000000 Binary files a/engine/src/test-data/Models/Elephant/Elephant.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Elephant/Elephant.material b/engine/src/test-data/Models/Elephant/Elephant.material deleted file mode 100644 index 268d6cc4c..000000000 --- a/engine/src/test-data/Models/Elephant/Elephant.material +++ /dev/null @@ -1,76 +0,0 @@ -material ElphSkin -{ - technique - { - pass - { - ambient 0 0 0 1 - diffuse 1 1 1 1 - specular 1 1 1 25.6 - emissive 0 0 0 - - texture_unit - { - texture Elephant.jpg - tex_coord_set 0 - } - } - } -} -material Ele_Tuskh -{ - technique - { - pass - { - ambient 0 0 0 1 - diffuse 1 1 1 1 - specular 1 1 1 25.6 - emissive 0 0 0 - - texture_unit - { - texture ElephantTusk.jpg - tex_coord_set 0 - } - } - } -} -material leftEyeShader -{ - technique - { - pass - { - ambient 0 0 0 1 - diffuse 1 1 1 1 - specular 0.5 0.5 0.5 25.6 - emissive 0 0 0 - - texture_unit - { - texture ElephantEye.jpg - tex_coord_set 0 - } - } - } -} -material rightEyeShader -{ - technique - { - pass - { - ambient 0 0 0 1 - diffuse 1 1 1 1 - specular 0.5 0.5 0.5 25.6 - emissive 0 0 0 - - texture_unit - { - texture ElephantEye.jpg - tex_coord_set 0 - } - } - } -} diff --git a/engine/src/test-data/Models/Elephant/Elephant.mesh.xml b/engine/src/test-data/Models/Elephant/Elephant.mesh.xml deleted file mode 100644 index 8bffa1a5e..000000000 --- a/engine/src/test-data/Models/Elephant/Elephant.mesh.xml +++ /dev/null @@ -1,62928 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Elephant/Elephant.skeleton.xml b/engine/src/test-data/Models/Elephant/Elephant.skeleton.xml deleted file mode 100644 index 79da840d4..000000000 --- a/engine/src/test-data/Models/Elephant/Elephant.skeleton.xml +++ /dev/null @@ -1,1422 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Elephant/ElephantEye.jpg b/engine/src/test-data/Models/Elephant/ElephantEye.jpg deleted file mode 100644 index 6eb7b18bc..000000000 Binary files a/engine/src/test-data/Models/Elephant/ElephantEye.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Elephant/ElephantTusk.jpg b/engine/src/test-data/Models/Elephant/ElephantTusk.jpg deleted file mode 100644 index e9d534d34..000000000 Binary files a/engine/src/test-data/Models/Elephant/ElephantTusk.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Elephant/Elephant_normal.jpg b/engine/src/test-data/Models/Elephant/Elephant_normal.jpg deleted file mode 100644 index 7df4c4355..000000000 Binary files a/engine/src/test-data/Models/Elephant/Elephant_normal.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Ferrari/Car.jpg b/engine/src/test-data/Models/Ferrari/Car.jpg deleted file mode 100644 index 56d3f63e5..000000000 Binary files a/engine/src/test-data/Models/Ferrari/Car.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Ferrari/Car.material b/engine/src/test-data/Models/Ferrari/Car.material deleted file mode 100644 index f6c9b99be..000000000 --- a/engine/src/test-data/Models/Ferrari/Car.material +++ /dev/null @@ -1,15 +0,0 @@ -material fskin.002/SOLID/TEX/fskin.jpg -{ - technique - { - pass - { - diffuse 0.505882 0.505882 0.505882 - specular 0.500000 0.500000 0.500000 12.500000 - texture_unit - { - texture Car.jpg - } - } - } -} diff --git a/engine/src/test-data/Models/Ferrari/Car.mesh.xml b/engine/src/test-data/Models/Ferrari/Car.mesh.xml deleted file mode 100644 index 8668bda73..000000000 --- a/engine/src/test-data/Models/Ferrari/Car.mesh.xml +++ /dev/null @@ -1,5083 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Ferrari/Car.scene b/engine/src/test-data/Models/Ferrari/Car.scene deleted file mode 100644 index 5ff38600d..000000000 --- a/engine/src/test-data/Models/Ferrari/Car.scene +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Ferrari/WheelBackLeft.mesh.xml b/engine/src/test-data/Models/Ferrari/WheelBackLeft.mesh.xml deleted file mode 100644 index 75999b2cc..000000000 --- a/engine/src/test-data/Models/Ferrari/WheelBackLeft.mesh.xml +++ /dev/null @@ -1,1126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Ferrari/WheelBackRight.mesh.xml b/engine/src/test-data/Models/Ferrari/WheelBackRight.mesh.xml deleted file mode 100644 index d0d7f1f4f..000000000 --- a/engine/src/test-data/Models/Ferrari/WheelBackRight.mesh.xml +++ /dev/null @@ -1,1126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Ferrari/WheelFrontLeft.mesh.xml b/engine/src/test-data/Models/Ferrari/WheelFrontLeft.mesh.xml deleted file mode 100644 index 57e308c4f..000000000 --- a/engine/src/test-data/Models/Ferrari/WheelFrontLeft.mesh.xml +++ /dev/null @@ -1,1126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Ferrari/WheelFrontRight.mesh.xml b/engine/src/test-data/Models/Ferrari/WheelFrontRight.mesh.xml deleted file mode 100644 index 6dc7ee46f..000000000 --- a/engine/src/test-data/Models/Ferrari/WheelFrontRight.mesh.xml +++ /dev/null @@ -1,1126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/HoverTank/Tank2.mesh.xml b/engine/src/test-data/Models/HoverTank/Tank2.mesh.xml deleted file mode 100644 index 514061cb9..000000000 --- a/engine/src/test-data/Models/HoverTank/Tank2.mesh.xml +++ /dev/null @@ -1,80192 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/HoverTank/tank.j3m b/engine/src/test-data/Models/HoverTank/tank.j3m deleted file mode 100644 index 5621dbeee..000000000 --- a/engine/src/test-data/Models/HoverTank/tank.j3m +++ /dev/null @@ -1,13 +0,0 @@ -Material My Material : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - SpecularMap : Models/HoverTank/tank_specular.jpg - Shininess : 8 - NormalMap : Models/HoverTank/tank_normals.png - DiffuseMap : Models/HoverTank/tank_diffuse.jpg - GlowMap : Models/HoverTank/tank_glow_map.jpg - UseMaterialColors : true - Ambient : 0.0 0.0 0.0 1.0 - Diffuse : 1.0 1.0 1.0 1.0 - Specular : 1.0 1.0 1.0 1.0 - } -} diff --git a/engine/src/test-data/Models/HoverTank/tankFinalExport.blend b/engine/src/test-data/Models/HoverTank/tankFinalExport.blend deleted file mode 100644 index 17aceb474..000000000 Binary files a/engine/src/test-data/Models/HoverTank/tankFinalExport.blend and /dev/null differ diff --git a/engine/src/test-data/Models/HoverTank/tank_diffuse.jpg b/engine/src/test-data/Models/HoverTank/tank_diffuse.jpg deleted file mode 100644 index 0820ac593..000000000 Binary files a/engine/src/test-data/Models/HoverTank/tank_diffuse.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/HoverTank/tank_glow_map.jpg b/engine/src/test-data/Models/HoverTank/tank_glow_map.jpg deleted file mode 100644 index a0d15fd0f..000000000 Binary files a/engine/src/test-data/Models/HoverTank/tank_glow_map.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/HoverTank/tank_normals.png b/engine/src/test-data/Models/HoverTank/tank_normals.png deleted file mode 100644 index 794218793..000000000 Binary files a/engine/src/test-data/Models/HoverTank/tank_normals.png and /dev/null differ diff --git a/engine/src/test-data/Models/HoverTank/tank_specular.jpg b/engine/src/test-data/Models/HoverTank/tank_specular.jpg deleted file mode 100644 index 66aad2bc6..000000000 Binary files a/engine/src/test-data/Models/HoverTank/tank_specular.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/MonkeyHead/MonkeyHead.j3m b/engine/src/test-data/Models/MonkeyHead/MonkeyHead.j3m deleted file mode 100644 index 62568d094..000000000 --- a/engine/src/test-data/Models/MonkeyHead/MonkeyHead.j3m +++ /dev/null @@ -1,8 +0,0 @@ -Material Monkey Head : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess : 4.0 - DiffuseMap : Models/MonkeyHead/MonkeyHead_diffuse.jpg - NormalMap : Models/MonkeyHead/MonkeyHead_normal.jpg - SpecularMap : Models/MonkeyHead/MonkeyHead_spec.jpg - } -} \ No newline at end of file diff --git a/engine/src/test-data/Models/MonkeyHead/MonkeyHead.mesh.xml b/engine/src/test-data/Models/MonkeyHead/MonkeyHead.mesh.xml deleted file mode 100644 index de1f88b54..000000000 --- a/engine/src/test-data/Models/MonkeyHead/MonkeyHead.mesh.xml +++ /dev/null @@ -1,28388 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/MonkeyHead/MonkeyHead_diffuse.jpg b/engine/src/test-data/Models/MonkeyHead/MonkeyHead_diffuse.jpg deleted file mode 100644 index cfd825430..000000000 Binary files a/engine/src/test-data/Models/MonkeyHead/MonkeyHead_diffuse.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/MonkeyHead/MonkeyHead_normal.jpg b/engine/src/test-data/Models/MonkeyHead/MonkeyHead_normal.jpg deleted file mode 100644 index a36b2f986..000000000 Binary files a/engine/src/test-data/Models/MonkeyHead/MonkeyHead_normal.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/MonkeyHead/MonkeyHead_spec.jpg b/engine/src/test-data/Models/MonkeyHead/MonkeyHead_spec.jpg deleted file mode 100644 index 0e1748887..000000000 Binary files a/engine/src/test-data/Models/MonkeyHead/MonkeyHead_spec.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Ninja/Ninja.jpg b/engine/src/test-data/Models/Ninja/Ninja.jpg deleted file mode 100644 index 9397f5d91..000000000 Binary files a/engine/src/test-data/Models/Ninja/Ninja.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Ninja/Ninja.material b/engine/src/test-data/Models/Ninja/Ninja.material deleted file mode 100644 index 71df902ef..000000000 --- a/engine/src/test-data/Models/Ninja/Ninja.material +++ /dev/null @@ -1,20 +0,0 @@ -material Ninja -{ - technique - { - pass - { - ambient 0 0 0 1 - diffuse 1 1 1 1 - specular 1 1 1 25.6 - emissive 0 0 0 - - texture_unit - { - texture Ninja.jpg - tex_coord_set 0 - } - } - } -} - diff --git a/engine/src/test-data/Models/Ninja/Ninja.mesh.xml b/engine/src/test-data/Models/Ninja/Ninja.mesh.xml deleted file mode 100644 index e51900827..000000000 --- a/engine/src/test-data/Models/Ninja/Ninja.mesh.xml +++ /dev/null @@ -1,7773 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Ninja/Ninja.skeleton.xml b/engine/src/test-data/Models/Ninja/Ninja.skeleton.xml deleted file mode 100644 index 632539e31..000000000 --- a/engine/src/test-data/Models/Ninja/Ninja.skeleton.xml +++ /dev/null @@ -1,13299 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Oto/Oto.j3m b/engine/src/test-data/Models/Oto/Oto.j3m deleted file mode 100644 index 7ffd8660e..000000000 --- a/engine/src/test-data/Models/Oto/Oto.j3m +++ /dev/null @@ -1,6 +0,0 @@ -Material OTO Lit : phong_lighting.j3md { - MaterialParameters { - Shininess: 8.0 - DiffuseMap: Models/Oto/Oto.jpg - } -} \ No newline at end of file diff --git a/engine/src/test-data/Models/Oto/Oto.jpg b/engine/src/test-data/Models/Oto/Oto.jpg deleted file mode 100644 index 2178a5e1e..000000000 Binary files a/engine/src/test-data/Models/Oto/Oto.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Oto/Oto.material b/engine/src/test-data/Models/Oto/Oto.material deleted file mode 100644 index b73faf413..000000000 --- a/engine/src/test-data/Models/Oto/Oto.material +++ /dev/null @@ -1,15 +0,0 @@ -material Material.002/SOLID/TEX/bluewarrior1024.j/VertCol -{ - technique - { - pass - { - diffuse vertexcolour - specular 0.000000 0.000000 0.000000 0.250000 - texture_unit - { - texture Oto.jpg - } - } - } -} diff --git a/engine/src/test-data/Models/Oto/Oto.mesh.xml b/engine/src/test-data/Models/Oto/Oto.mesh.xml deleted file mode 100644 index a1c7f95b5..000000000 --- a/engine/src/test-data/Models/Oto/Oto.mesh.xml +++ /dev/null @@ -1,29285 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Oto/Oto.skeleton.xml b/engine/src/test-data/Models/Oto/Oto.skeleton.xml deleted file mode 100644 index 9e256af1a..000000000 --- a/engine/src/test-data/Models/Oto/Oto.skeleton.xml +++ /dev/null @@ -1,8801 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Sign Post/Sign Post.j3m b/engine/src/test-data/Models/Sign Post/Sign Post.j3m deleted file mode 100644 index 91967d5c4..000000000 --- a/engine/src/test-data/Models/Sign Post/Sign Post.j3m +++ /dev/null @@ -1,12 +0,0 @@ -Material Signpost : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 4.0 - DiffuseMap: Models/Sign Post/Sign Post.jpg - NormalMap: Models/Sign Post/Sign Post_normal.jpg - SpecularMap: Models/Sign Post/Sign Post_specular.jpg - UseMaterialColors : true - Ambient : 0.5 0.5 0.5 1.0 - Diffuse : 1.0 1.0 1.0 1.0 - Specular : 1.0 1.0 1.0 1.0 - } -} \ No newline at end of file diff --git a/engine/src/test-data/Models/Sign Post/Sign Post.jpg b/engine/src/test-data/Models/Sign Post/Sign Post.jpg deleted file mode 100644 index 193a0e64b..000000000 Binary files a/engine/src/test-data/Models/Sign Post/Sign Post.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Sign Post/Sign Post.material b/engine/src/test-data/Models/Sign Post/Sign Post.material deleted file mode 100644 index b4d3436df..000000000 --- a/engine/src/test-data/Models/Sign Post/Sign Post.material +++ /dev/null @@ -1,15 +0,0 @@ -material Signpost/SOLID/TEX/signpost_color.jpg -{ - technique - { - pass - { - diffuse 1.000000 1.000000 1.000000 - specular 0.500000 0.500000 0.500000 12.500000 - texture_unit - { - texture signpost_color.jpg - } - } - } -} diff --git a/engine/src/test-data/Models/Sign Post/Sign Post.mesh.xml b/engine/src/test-data/Models/Sign Post/Sign Post.mesh.xml deleted file mode 100644 index 8fcd4334b..000000000 --- a/engine/src/test-data/Models/Sign Post/Sign Post.mesh.xml +++ /dev/null @@ -1,1547 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Sign Post/Sign Post_normal.jpg b/engine/src/test-data/Models/Sign Post/Sign Post_normal.jpg deleted file mode 100644 index bb8a0c893..000000000 Binary files a/engine/src/test-data/Models/Sign Post/Sign Post_normal.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Sign Post/Sign Post_specular.jpg b/engine/src/test-data/Models/Sign Post/Sign Post_specular.jpg deleted file mode 100644 index 67468106a..000000000 Binary files a/engine/src/test-data/Models/Sign Post/Sign Post_specular.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Sinbad/README-LICENSE.txt b/engine/src/test-data/Models/Sinbad/README-LICENSE.txt deleted file mode 100644 index 7a0f73383..000000000 --- a/engine/src/test-data/Models/Sinbad/README-LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ ------------------------------ -About: Sinbad Character Model ------------------------------ - -Artist: Zi Ye -Date: 2009-2010 -E-mail: omniter@gmail.com - -This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. -To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a -letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. - -This character is a gift to the OGRE community (http://www.ogre3d.org). -You do not need to give credit to the artist, but it would be appreciated. =) - -This license applies to the following files: -- Sinbad.mesh -- Sinbad.skeleton -- Sinbad.blend -- sinbad_body.tga -- sinbad_clothes.tga -- sinbad_sword.tga -- Sword.mesh diff --git a/engine/src/test-data/Models/Sinbad/Sinbad.material b/engine/src/test-data/Models/Sinbad/Sinbad.material deleted file mode 100644 index 9ee737cdf..000000000 --- a/engine/src/test-data/Models/Sinbad/Sinbad.material +++ /dev/null @@ -1,125 +0,0 @@ -material Sinbad/Body -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - - texture_unit - { - texture sinbad_body.jpg - } - } - } -} -material Sinbad/Gold -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 0.8 0.8 0.8 1 - specular 0.3 0.3 0.2 5.5 - - texture_unit - { - texture sinbad_clothes.jpg - } - } - } -} -material Sinbad/Sheaths -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - specular 0.2 0.1 0.1 1.0 50.0 - - texture_unit - { - texture sinbad_sword.jpg - } - } - } -} -material Sinbad/Clothes -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - specular 0.05 0.05 0.05 12.5 - - texture_unit - { - texture sinbad_clothes.jpg - } - } - } -} -material Sinbad/Teeth -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - specular 0.25 0.25 0.25 10.5 - - texture_unit - { - texture sinbad_body.jpg - } - } - } -} -material Sinbad/Eyes -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - specular 0.75 0.75 0.75 55.5 - - texture_unit - { - texture sinbad_body.jpg - } - } - } -} -material Sinbad/Spikes -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - specular 0.75 0.75 0.75 20.5 - - texture_unit - { - texture sinbad_clothes.jpg - } - } - } -} diff --git a/engine/src/test-data/Models/Sinbad/Sinbad.mesh.xml b/engine/src/test-data/Models/Sinbad/Sinbad.mesh.xml deleted file mode 100644 index 1909ec0cd..000000000 --- a/engine/src/test-data/Models/Sinbad/Sinbad.mesh.xml +++ /dev/null @@ -1,44303 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Sinbad/Sinbad.skeleton.xml b/engine/src/test-data/Models/Sinbad/Sinbad.skeleton.xml deleted file mode 100644 index 798212dbb..000000000 --- a/engine/src/test-data/Models/Sinbad/Sinbad.skeleton.xml +++ /dev/null @@ -1,126454 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Sinbad/Sword.material b/engine/src/test-data/Models/Sinbad/Sword.material deleted file mode 100644 index 2baa89c18..000000000 --- a/engine/src/test-data/Models/Sinbad/Sword.material +++ /dev/null @@ -1,72 +0,0 @@ -material Sinbad/Blade -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - specular 1 1 1 10.5 - - texture_unit - { - texture sinbad_sword.jpg - } - } - } -} -material Sinbad/Ruby -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - specular 0.75 0.75 0.75 20.5 - - texture_unit - { - texture sinbad_sword.jpg - } - } - } -} -material Sinbad/Hilt -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 0.8 0.8 0.8 1 - specular 0.3 0.3 0.2 5.5 - - texture_unit - { - texture sinbad_sword.jpg - } - } - } -} -material Sinbad/Handle -{ - receive_shadows on - technique - { - pass - { - ambient 0.75 0.75 0.75 - diffuse 1 1 1 1 - specular 0.05 0.05 0.05 12.5 - - texture_unit - { - texture sinbad_sword.jpg - } - } - } -} diff --git a/engine/src/test-data/Models/Sinbad/Sword.mesh.xml b/engine/src/test-data/Models/Sinbad/Sword.mesh.xml deleted file mode 100644 index eafa077b2..000000000 --- a/engine/src/test-data/Models/Sinbad/Sword.mesh.xml +++ /dev/null @@ -1,2193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Sinbad/sinbad_body.jpg b/engine/src/test-data/Models/Sinbad/sinbad_body.jpg deleted file mode 100644 index e9679d971..000000000 Binary files a/engine/src/test-data/Models/Sinbad/sinbad_body.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Sinbad/sinbad_clothes.jpg b/engine/src/test-data/Models/Sinbad/sinbad_clothes.jpg deleted file mode 100644 index f52e014ca..000000000 Binary files a/engine/src/test-data/Models/Sinbad/sinbad_clothes.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Sinbad/sinbad_sword.jpg b/engine/src/test-data/Models/Sinbad/sinbad_sword.jpg deleted file mode 100644 index f555eabdc..000000000 Binary files a/engine/src/test-data/Models/Sinbad/sinbad_sword.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/SpaceCraft/Rocket.material b/engine/src/test-data/Models/SpaceCraft/Rocket.material deleted file mode 100644 index 9939857f2..000000000 --- a/engine/src/test-data/Models/SpaceCraft/Rocket.material +++ /dev/null @@ -1,13 +0,0 @@ -material SOLID/TEX/Rocket.tga -{ - technique - { - pass - { - texture_unit - { - texture Rocket.png - } - } - } -} diff --git a/engine/src/test-data/Models/SpaceCraft/Rocket.mesh.xml b/engine/src/test-data/Models/SpaceCraft/Rocket.mesh.xml deleted file mode 100644 index 14164245c..000000000 --- a/engine/src/test-data/Models/SpaceCraft/Rocket.mesh.xml +++ /dev/null @@ -1,1150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/SpaceCraft/Rocket.png b/engine/src/test-data/Models/SpaceCraft/Rocket.png deleted file mode 100644 index ffb94aa4f..000000000 Binary files a/engine/src/test-data/Models/SpaceCraft/Rocket.png and /dev/null differ diff --git a/engine/src/test-data/Models/Sponza/Sponza.j3o b/engine/src/test-data/Models/Sponza/Sponza.j3o deleted file mode 100644 index ac71efa10..000000000 Binary files a/engine/src/test-data/Models/Sponza/Sponza.j3o and /dev/null differ diff --git a/engine/src/test-data/Models/TangentBugs/test.blend b/engine/src/test-data/Models/TangentBugs/test.blend deleted file mode 100644 index 51890a238..000000000 Binary files a/engine/src/test-data/Models/TangentBugs/test.blend and /dev/null differ diff --git a/engine/src/test-data/Models/TangentBugs/test_normal.png b/engine/src/test-data/Models/TangentBugs/test_normal.png deleted file mode 100644 index f586e8dc8..000000000 Binary files a/engine/src/test-data/Models/TangentBugs/test_normal.png and /dev/null differ diff --git a/engine/src/test-data/Models/Teapot/Teapot.mesh.xml b/engine/src/test-data/Models/Teapot/Teapot.mesh.xml deleted file mode 100644 index b0aed3c42..000000000 --- a/engine/src/test-data/Models/Teapot/Teapot.mesh.xml +++ /dev/null @@ -1,34297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Teapot/Teapot.mtl b/engine/src/test-data/Models/Teapot/Teapot.mtl deleted file mode 100644 index 11afe1167..000000000 --- a/engine/src/test-data/Models/Teapot/Teapot.mtl +++ /dev/null @@ -1,12 +0,0 @@ -# Blender3D MTL File: -# Material Count: 1 -newmtl m1 -Ns 96.078431 -Ka 0.000000 0.000000 0.000000 -Kd 0.640000 0.640000 0.640000 -Ks 0.500000 0.500000 0.500000 -Ni 1.000000 -d 1.000000 -illum 2 - - diff --git a/engine/src/test-data/Models/Teapot/Teapot.obj b/engine/src/test-data/Models/Teapot/Teapot.obj deleted file mode 100644 index 779b3b877..000000000 --- a/engine/src/test-data/Models/Teapot/Teapot.obj +++ /dev/null @@ -1,15997 +0,0 @@ -# Blender3D v248 OBJ File: -# www.blender3d.org -mtllib Teapot.mtl -v 0.350000 0.600000 -0.000000 -v 0.345492 0.600000 0.057428 -v 0.342019 0.608859 0.056851 -v 0.346481 0.608859 -0.000000 -v 0.340655 0.615750 0.056624 -v 0.345100 0.615750 -0.000000 -v 0.341105 0.620672 0.056699 -v 0.345556 0.620672 -0.000000 -v 0.343074 0.623625 0.057026 -v 0.347550 0.623625 -0.000000 -v 0.346263 0.624609 0.057556 -v 0.350781 0.624609 -0.000000 -v 0.350378 0.623625 0.058240 -v 0.354950 0.623625 -0.000000 -v 0.355123 0.620672 0.059029 -v 0.359756 0.620672 -0.000000 -v 0.360200 0.615750 0.059873 -v 0.364900 0.615750 -0.000000 -v 0.365315 0.608859 0.060723 -v 0.370081 0.608859 -0.000000 -v 0.370170 0.600000 0.061530 -v 0.375000 0.600000 -0.000000 -v 0.332416 0.600000 0.111664 -v 0.329074 0.608859 0.110541 -v 0.327762 0.615750 0.110101 -v 0.328196 0.620672 0.110246 -v 0.330089 0.623625 0.110882 -v 0.333158 0.624609 0.111913 -v 0.337117 0.623625 0.113243 -v 0.341682 0.620672 0.114777 -v 0.346567 0.615750 0.116418 -v 0.351488 0.608859 0.118071 -v 0.356160 0.600000 0.119640 -v 0.311444 0.600000 0.162036 -v 0.308313 0.608859 0.160407 -v 0.307084 0.615750 0.159767 -v 0.307490 0.620672 0.159979 -v 0.309264 0.623625 0.160902 -v 0.312139 0.624609 0.162398 -v 0.315849 0.623625 0.164328 -v 0.320125 0.620672 0.166553 -v 0.324703 0.615750 0.168934 -v 0.329313 0.608859 0.171333 -v 0.333690 0.600000 0.173610 -v 0.283248 0.600000 0.207872 -v 0.280400 0.608859 0.205782 -v 0.279283 0.615750 0.204962 -v 0.279652 0.620672 0.205233 -v 0.281265 0.623625 0.206417 -v 0.283880 0.624609 0.208336 -v 0.287254 0.623625 0.210812 -v 0.291144 0.620672 0.213666 -v 0.295306 0.615750 0.216721 -v 0.299499 0.608859 0.219799 -v 0.303480 0.600000 0.222720 -v 0.248500 0.600000 0.248500 -v 0.246002 0.608859 0.246002 -v 0.245021 0.615750 0.245021 -v 0.245345 0.620672 0.245345 -v 0.246761 0.623625 0.246760 -v 0.249055 0.624609 0.249055 -v 0.252014 0.623625 0.252014 -v 0.255427 0.620672 0.255427 -v 0.259079 0.615750 0.259079 -v 0.262758 0.608859 0.262758 -v 0.266250 0.600000 0.266250 -v 0.207872 0.600000 0.283248 -v 0.205782 0.608859 0.280400 -v 0.204962 0.615750 0.279283 -v 0.205233 0.620672 0.279652 -v 0.206417 0.623625 0.281265 -v 0.208336 0.624609 0.283880 -v 0.210812 0.623625 0.287254 -v 0.213666 0.620672 0.291144 -v 0.216721 0.615750 0.295306 -v 0.219799 0.608859 0.299499 -v 0.222720 0.600000 0.303480 -v 0.162036 0.600000 0.311444 -v 0.160407 0.608859 0.308313 -v 0.159767 0.615750 0.307084 -v 0.159979 0.620672 0.307490 -v 0.160902 0.623625 0.309264 -v 0.162398 0.624609 0.312139 -v 0.164328 0.623625 0.315849 -v 0.166553 0.620672 0.320126 -v 0.168934 0.615750 0.324703 -v 0.171333 0.608859 0.329313 -v 0.173610 0.600000 0.333690 -v 0.111664 0.600000 0.332416 -v 0.110541 0.608859 0.329074 -v 0.110101 0.615750 0.327762 -v 0.110246 0.620672 0.328196 -v 0.110882 0.623625 0.330089 -v 0.111913 0.624609 0.333158 -v 0.113243 0.623625 0.337117 -v 0.114777 0.620672 0.341682 -v 0.116418 0.615750 0.346567 -v 0.118071 0.608859 0.351488 -v 0.119640 0.600000 0.356160 -v 0.057428 0.600000 0.345492 -v 0.056851 0.608859 0.342019 -v 0.056624 0.615750 0.340655 -v 0.056699 0.620672 0.341105 -v 0.057026 0.623625 0.343074 -v 0.057556 0.624609 0.346263 -v 0.058240 0.623625 0.350378 -v 0.059029 0.620672 0.355123 -v 0.059873 0.615750 0.360200 -v 0.060723 0.608859 0.365315 -v 0.061530 0.600000 0.370170 -v -0.000000 0.600000 0.350000 -v -0.000000 0.608859 0.346481 -v -0.000000 0.615750 0.345100 -v -0.000000 0.620672 0.345556 -v -0.000000 0.623625 0.347550 -v -0.000000 0.624609 0.350781 -v -0.000000 0.623625 0.354950 -v -0.000000 0.620672 0.359756 -v -0.000000 0.615750 0.364900 -v -0.000000 0.608859 0.370081 -v -0.000000 0.600000 0.375000 -v -0.062895 0.600000 0.345492 -v -0.060836 0.608859 0.342019 -v -0.059423 0.615750 0.340655 -v -0.058574 0.620672 0.341105 -v -0.058207 0.623625 0.343074 -v -0.058240 0.624609 0.346263 -v -0.058590 0.623625 0.350378 -v -0.059176 0.620672 0.355123 -v -0.059917 0.615750 0.360200 -v -0.060728 0.608859 0.365315 -v -0.061530 0.600000 0.370170 -v -0.120304 0.600000 0.332416 -v -0.116840 0.608859 0.329074 -v -0.114524 0.615750 0.327762 -v -0.113210 0.620672 0.328196 -v -0.112749 0.623625 0.330089 -v -0.112993 0.624609 0.333158 -v -0.113796 0.623625 0.337117 -v -0.115010 0.620672 0.341682 -v -0.116487 0.615750 0.346567 -v -0.118079 0.608859 0.351488 -v -0.119640 0.600000 0.356160 -v -0.171959 0.600000 0.311444 -v -0.167640 0.608859 0.308313 -v -0.164848 0.615750 0.307084 -v -0.163382 0.620672 0.307490 -v -0.163045 0.623625 0.309264 -v -0.163638 0.624609 0.312139 -v -0.164963 0.623625 0.315849 -v -0.166821 0.620672 0.320125 -v -0.169014 0.615750 0.324703 -v -0.171343 0.608859 0.329313 -v -0.173610 0.600000 0.333690 -v -0.217592 0.600000 0.283248 -v -0.212868 0.608859 0.280400 -v -0.209938 0.615750 0.279283 -v -0.208567 0.620672 0.279652 -v -0.208516 0.623625 0.281265 -v -0.209551 0.624609 0.283880 -v -0.211434 0.623625 0.287254 -v -0.213929 0.620672 0.291144 -v -0.216799 0.615750 0.295306 -v -0.219808 0.608859 0.299499 -v -0.222720 0.600000 0.303480 -v -0.256938 0.600000 0.248500 -v -0.252153 0.608859 0.246002 -v -0.249341 0.615750 0.245021 -v -0.248239 0.620672 0.245345 -v -0.248583 0.623625 0.246760 -v -0.250109 0.624609 0.249055 -v -0.252555 0.623625 0.252014 -v -0.255655 0.620672 0.255427 -v -0.259146 0.615750 0.259079 -v -0.262766 0.608859 0.262758 -v -0.266250 0.600000 0.266250 -v -0.289728 0.600000 0.207872 -v -0.285124 0.608859 0.205782 -v -0.282600 0.615750 0.204962 -v -0.281874 0.620672 0.205233 -v -0.282665 0.623625 0.206417 -v -0.284690 0.624609 0.208336 -v -0.287669 0.623625 0.210812 -v -0.291319 0.620672 0.213666 -v -0.295358 0.615750 0.216721 -v -0.299506 0.608859 0.219799 -v -0.303480 0.600000 0.222720 -v -0.315697 0.600000 0.162036 -v -0.311413 0.608859 0.160407 -v -0.309261 0.615750 0.159767 -v -0.308948 0.620672 0.159979 -v -0.310182 0.623625 0.160902 -v -0.312671 0.624609 0.162398 -v -0.316121 0.623625 0.164328 -v -0.320240 0.620672 0.166553 -v -0.324737 0.615750 0.168934 -v -0.329317 0.608859 0.171333 -v -0.333690 0.600000 0.173610 -v -0.334576 0.600000 0.111664 -v -0.330649 0.608859 0.110541 -v -0.328868 0.615750 0.110101 -v -0.328936 0.620672 0.110246 -v -0.330556 0.623625 0.110882 -v -0.333428 0.624609 0.111913 -v -0.337256 0.623625 0.113243 -v -0.341740 0.620672 0.114777 -v -0.346585 0.615750 0.116418 -v -0.351491 0.608859 0.118071 -v -0.356160 0.600000 0.119640 -v -0.346099 0.600000 0.057428 -v -0.342461 0.608859 0.056851 -v -0.340966 0.615750 0.056624 -v -0.341314 0.620672 0.056699 -v -0.343205 0.623625 0.057026 -v -0.346339 0.624609 0.057556 -v -0.350417 0.623625 0.058240 -v -0.355139 0.620672 0.059029 -v -0.360205 0.615750 0.059873 -v -0.365315 0.608859 0.060723 -v -0.370170 0.600000 0.061530 -v -0.350000 0.600000 -0.000000 -v -0.346481 0.608859 -0.000000 -v -0.345100 0.615750 -0.000000 -v -0.345556 0.620672 -0.000000 -v -0.347550 0.623625 -0.000000 -v -0.350781 0.624609 -0.000000 -v -0.354950 0.623625 -0.000000 -v -0.359756 0.620672 -0.000000 -v -0.364900 0.615750 -0.000000 -v -0.370081 0.608859 -0.000000 -v -0.375000 0.600000 -0.000000 -v -0.345492 0.600000 -0.057428 -v -0.342019 0.608859 -0.056851 -v -0.340655 0.615750 -0.056624 -v -0.341105 0.620672 -0.056699 -v -0.343074 0.623625 -0.057026 -v -0.346263 0.624609 -0.057556 -v -0.350378 0.623625 -0.058240 -v -0.355123 0.620672 -0.059029 -v -0.360200 0.615750 -0.059873 -v -0.365315 0.608859 -0.060723 -v -0.370170 0.600000 -0.061530 -v -0.332416 0.600000 -0.111664 -v -0.329074 0.608859 -0.110541 -v -0.327762 0.615750 -0.110101 -v -0.328196 0.620672 -0.110246 -v -0.330089 0.623625 -0.110882 -v -0.333158 0.624609 -0.111913 -v -0.337117 0.623625 -0.113243 -v -0.341682 0.620672 -0.114777 -v -0.346567 0.615750 -0.116418 -v -0.351488 0.608859 -0.118071 -v -0.356160 0.600000 -0.119640 -v -0.311444 0.600000 -0.162036 -v -0.308313 0.608859 -0.160407 -v -0.307084 0.615750 -0.159768 -v -0.307490 0.620672 -0.159979 -v -0.309264 0.623625 -0.160902 -v -0.312139 0.624609 -0.162398 -v -0.315849 0.623625 -0.164328 -v -0.320125 0.620672 -0.166553 -v -0.324703 0.615750 -0.168934 -v -0.329313 0.608859 -0.171333 -v -0.333690 0.600000 -0.173610 -v -0.283248 0.600000 -0.207872 -v -0.280400 0.608859 -0.205782 -v -0.279283 0.615750 -0.204962 -v -0.279652 0.620672 -0.205233 -v -0.281265 0.623625 -0.206417 -v -0.283880 0.624609 -0.208336 -v -0.287254 0.623625 -0.210812 -v -0.291144 0.620672 -0.213666 -v -0.295306 0.615750 -0.216721 -v -0.299499 0.608859 -0.219799 -v -0.303480 0.600000 -0.222720 -v -0.248500 0.600000 -0.248500 -v -0.246002 0.608859 -0.246002 -v -0.245021 0.615750 -0.245021 -v -0.245345 0.620672 -0.245345 -v -0.246761 0.623625 -0.246761 -v -0.249055 0.624609 -0.249055 -v -0.252014 0.623625 -0.252015 -v -0.255427 0.620672 -0.255427 -v -0.259079 0.615750 -0.259079 -v -0.262758 0.608859 -0.262758 -v -0.266250 0.600000 -0.266250 -v -0.207872 0.600000 -0.283248 -v -0.205782 0.608859 -0.280400 -v -0.204962 0.615750 -0.279283 -v -0.205233 0.620672 -0.279652 -v -0.206417 0.623625 -0.281265 -v -0.208336 0.624609 -0.283880 -v -0.210812 0.623625 -0.287254 -v -0.213666 0.620672 -0.291144 -v -0.216721 0.615750 -0.295306 -v -0.219799 0.608859 -0.299499 -v -0.222720 0.600000 -0.303480 -v -0.162036 0.600000 -0.311444 -v -0.160407 0.608859 -0.308313 -v -0.159767 0.615750 -0.307084 -v -0.159979 0.620672 -0.307490 -v -0.160902 0.623625 -0.309264 -v -0.162398 0.624609 -0.312139 -v -0.164328 0.623625 -0.315849 -v -0.166553 0.620672 -0.320126 -v -0.168934 0.615750 -0.324703 -v -0.171333 0.608859 -0.329313 -v -0.173610 0.600000 -0.333690 -v -0.111664 0.600000 -0.332416 -v -0.110541 0.608859 -0.329074 -v -0.110101 0.615750 -0.327762 -v -0.110246 0.620672 -0.328196 -v -0.110882 0.623625 -0.330089 -v -0.111913 0.624609 -0.333158 -v -0.113243 0.623625 -0.337117 -v -0.114777 0.620672 -0.341682 -v -0.116418 0.615750 -0.346567 -v -0.118071 0.608859 -0.351488 -v -0.119640 0.600000 -0.356160 -v -0.057428 0.600000 -0.345492 -v -0.056851 0.608859 -0.342019 -v -0.056624 0.615750 -0.340655 -v -0.056699 0.620672 -0.341106 -v -0.057026 0.623625 -0.343074 -v -0.057556 0.624609 -0.346263 -v -0.058240 0.623625 -0.350378 -v -0.059029 0.620672 -0.355123 -v -0.059873 0.615750 -0.360200 -v -0.060723 0.608859 -0.365315 -v -0.061530 0.600000 -0.370170 -v 0.000000 0.600000 -0.350000 -v 0.000000 0.608859 -0.346481 -v 0.000000 0.615750 -0.345100 -v 0.000000 0.620672 -0.345556 -v 0.000000 0.623625 -0.347550 -v 0.000000 0.624609 -0.350781 -v 0.000000 0.623625 -0.354950 -v 0.000000 0.620672 -0.359756 -v 0.000000 0.615750 -0.364900 -v 0.000000 0.608859 -0.370081 -v 0.000000 0.600000 -0.375000 -v 0.057428 0.600000 -0.345492 -v 0.056851 0.608859 -0.342019 -v 0.056624 0.615750 -0.340655 -v 0.056699 0.620672 -0.341106 -v 0.057026 0.623625 -0.343074 -v 0.057556 0.624609 -0.346263 -v 0.058240 0.623625 -0.350378 -v 0.059029 0.620672 -0.355123 -v 0.059873 0.615750 -0.360200 -v 0.060723 0.608859 -0.365315 -v 0.061530 0.600000 -0.370170 -v 0.111664 0.600000 -0.332416 -v 0.110541 0.608859 -0.329074 -v 0.110101 0.615750 -0.327762 -v 0.110246 0.620672 -0.328196 -v 0.110882 0.623625 -0.330089 -v 0.111913 0.624609 -0.333158 -v 0.113243 0.623625 -0.337117 -v 0.114777 0.620672 -0.341682 -v 0.116418 0.615750 -0.346567 -v 0.118071 0.608859 -0.351488 -v 0.119640 0.600000 -0.356160 -v 0.162036 0.600000 -0.311444 -v 0.160407 0.608859 -0.308313 -v 0.159768 0.615750 -0.307084 -v 0.159979 0.620672 -0.307490 -v 0.160902 0.623625 -0.309264 -v 0.162398 0.624609 -0.312139 -v 0.164328 0.623625 -0.315849 -v 0.166553 0.620672 -0.320126 -v 0.168934 0.615750 -0.324703 -v 0.171333 0.608859 -0.329313 -v 0.173610 0.600000 -0.333690 -v 0.207872 0.600000 -0.283248 -v 0.205782 0.608859 -0.280400 -v 0.204962 0.615750 -0.279283 -v 0.205233 0.620672 -0.279652 -v 0.206417 0.623625 -0.281265 -v 0.208336 0.624609 -0.283880 -v 0.210812 0.623625 -0.287254 -v 0.213666 0.620672 -0.291144 -v 0.216721 0.615750 -0.295306 -v 0.219799 0.608859 -0.299499 -v 0.222720 0.600000 -0.303480 -v 0.248500 0.600000 -0.248500 -v 0.246002 0.608859 -0.246002 -v 0.245021 0.615750 -0.245021 -v 0.245345 0.620672 -0.245345 -v 0.246761 0.623625 -0.246761 -v 0.249055 0.624609 -0.249055 -v 0.252014 0.623625 -0.252015 -v 0.255427 0.620672 -0.255427 -v 0.259079 0.615750 -0.259079 -v 0.262758 0.608859 -0.262758 -v 0.266250 0.600000 -0.266250 -v 0.283248 0.600000 -0.207872 -v 0.280400 0.608859 -0.205782 -v 0.279283 0.615750 -0.204962 -v 0.279652 0.620672 -0.205233 -v 0.281265 0.623625 -0.206417 -v 0.283880 0.624609 -0.208336 -v 0.287254 0.623625 -0.210812 -v 0.291144 0.620672 -0.213666 -v 0.295306 0.615750 -0.216721 -v 0.299499 0.608859 -0.219799 -v 0.303480 0.600000 -0.222720 -v 0.311444 0.600000 -0.162036 -v 0.308313 0.608859 -0.160407 -v 0.307084 0.615750 -0.159768 -v 0.307490 0.620672 -0.159979 -v 0.309264 0.623625 -0.160902 -v 0.312139 0.624609 -0.162398 -v 0.315849 0.623625 -0.164328 -v 0.320126 0.620672 -0.166553 -v 0.324703 0.615750 -0.168934 -v 0.329313 0.608859 -0.171333 -v 0.333690 0.600000 -0.173610 -v 0.332416 0.600000 -0.111664 -v 0.329074 0.608859 -0.110541 -v 0.327762 0.615750 -0.110101 -v 0.328196 0.620672 -0.110246 -v 0.330089 0.623625 -0.110882 -v 0.333158 0.624609 -0.111913 -v 0.337117 0.623625 -0.113243 -v 0.341682 0.620672 -0.114777 -v 0.346567 0.615750 -0.116418 -v 0.351488 0.608859 -0.118071 -v 0.356160 0.600000 -0.119640 -v 0.345492 0.600000 -0.057428 -v 0.342019 0.608859 -0.056851 -v 0.340655 0.615750 -0.056624 -v 0.341105 0.620672 -0.056699 -v 0.343074 0.623625 -0.057026 -v 0.346263 0.624609 -0.057556 -v 0.350378 0.623625 -0.058240 -v 0.355123 0.620672 -0.059029 -v 0.360200 0.615750 -0.059873 -v 0.365315 0.608859 -0.060723 -v 0.370170 0.600000 -0.061530 -v 0.388617 0.560644 0.064596 -v 0.393687 0.560644 -0.000000 -v 0.406693 0.521400 0.067601 -v 0.412000 0.521400 -0.000000 -v 0.424030 0.482381 0.070483 -v 0.429563 0.482381 -0.000000 -v 0.440256 0.443700 0.073180 -v 0.446000 0.443700 -0.000000 -v 0.455001 0.405469 0.075631 -v 0.460938 0.405469 -0.000000 -v 0.467895 0.367800 0.077774 -v 0.474000 0.367800 -0.000000 -v 0.478568 0.330806 0.079548 -v 0.484812 0.330806 -0.000000 -v 0.486650 0.294600 0.080891 -v 0.493000 0.294600 -0.000000 -v 0.491771 0.259294 0.081743 -v 0.498187 0.259294 -0.000000 -v 0.493560 0.225000 0.082040 -v 0.500000 0.225000 -0.000000 -v 0.373909 0.560644 0.125602 -v 0.391301 0.521400 0.131444 -v 0.407981 0.482381 0.137048 -v 0.423593 0.443700 0.142292 -v 0.437780 0.405469 0.147057 -v 0.450186 0.367800 0.151225 -v 0.460456 0.330806 0.154675 -v 0.468232 0.294600 0.157287 -v 0.473159 0.259294 0.158942 -v 0.474880 0.225000 0.159520 -v 0.350319 0.560644 0.182262 -v 0.366614 0.521400 0.190740 -v 0.382242 0.482381 0.198870 -v 0.396869 0.443700 0.206480 -v 0.410161 0.405469 0.213396 -v 0.421784 0.367800 0.219443 -v 0.431406 0.330806 0.224449 -v 0.438691 0.294600 0.228239 -v 0.443307 0.259294 0.230641 -v 0.444920 0.225000 0.231480 -v 0.318603 0.560644 0.233819 -v 0.333423 0.521400 0.244695 -v 0.347636 0.482381 0.255126 -v 0.360939 0.443700 0.264888 -v 0.373028 0.405469 0.273760 -v 0.383599 0.367800 0.281518 -v 0.392349 0.330806 0.287940 -v 0.398975 0.294600 0.292803 -v 0.403173 0.259294 0.295884 -v 0.404640 0.225000 0.296960 -v 0.279518 0.560644 0.279518 -v 0.292520 0.521400 0.292520 -v 0.304989 0.482381 0.304989 -v 0.316660 0.443700 0.316660 -v 0.327266 0.405469 0.327266 -v 0.336540 0.367800 0.336540 -v 0.344217 0.330806 0.344217 -v 0.350030 0.294600 0.350030 -v 0.353713 0.259294 0.353713 -v 0.355000 0.225000 0.355000 -v 0.233819 0.560644 0.318603 -v 0.244695 0.521400 0.333423 -v 0.255126 0.482381 0.347636 -v 0.264888 0.443700 0.360939 -v 0.273760 0.405469 0.373027 -v 0.281518 0.367800 0.383599 -v 0.287940 0.330806 0.392349 -v 0.292803 0.294600 0.398975 -v 0.295884 0.259294 0.403173 -v 0.296960 0.225000 0.404640 -v 0.182262 0.560644 0.350319 -v 0.190740 0.521400 0.366614 -v 0.198870 0.482381 0.382242 -v 0.206480 0.443700 0.396869 -v 0.213396 0.405469 0.410161 -v 0.219443 0.367800 0.421784 -v 0.224449 0.330806 0.431406 -v 0.228239 0.294600 0.438691 -v 0.230641 0.259294 0.443307 -v 0.231480 0.225000 0.444920 -v 0.125602 0.560644 0.373909 -v 0.131444 0.521400 0.391301 -v 0.137048 0.482381 0.407981 -v 0.142292 0.443700 0.423593 -v 0.147057 0.405469 0.437780 -v 0.151225 0.367800 0.450186 -v 0.154675 0.330806 0.460456 -v 0.157287 0.294600 0.468232 -v 0.158942 0.259294 0.473159 -v 0.159520 0.225000 0.474880 -v 0.064596 0.560644 0.388617 -v 0.067601 0.521400 0.406693 -v 0.070483 0.482381 0.424030 -v 0.073180 0.443700 0.440256 -v 0.075631 0.405469 0.455001 -v 0.077774 0.367800 0.467895 -v 0.079548 0.330806 0.478568 -v 0.080891 0.294600 0.486650 -v 0.081743 0.259294 0.491771 -v 0.082040 0.225000 0.493560 -v -0.000000 0.560644 0.393687 -v -0.000000 0.521400 0.412000 -v -0.000000 0.482381 0.429563 -v -0.000000 0.443700 0.446000 -v -0.000000 0.405469 0.460938 -v -0.000000 0.367800 0.474000 -v -0.000000 0.330806 0.484812 -v -0.000000 0.294600 0.493000 -v -0.000000 0.259294 0.498187 -v -0.000000 0.225000 0.500000 -v -0.064596 0.560644 0.388617 -v -0.067601 0.521400 0.406693 -v -0.070483 0.482381 0.424030 -v -0.073180 0.443700 0.440256 -v -0.075631 0.405469 0.455001 -v -0.077774 0.367800 0.467895 -v -0.079548 0.330806 0.478568 -v -0.080891 0.294600 0.486650 -v -0.081743 0.259294 0.491771 -v -0.082040 0.225000 0.493560 -v -0.125602 0.560644 0.373909 -v -0.131444 0.521400 0.391301 -v -0.137048 0.482381 0.407981 -v -0.142292 0.443700 0.423593 -v -0.147058 0.405469 0.437780 -v -0.151225 0.367800 0.450186 -v -0.154675 0.330806 0.460456 -v -0.157287 0.294600 0.468232 -v -0.158942 0.259294 0.473159 -v -0.159520 0.225000 0.474880 -v -0.182262 0.560644 0.350319 -v -0.190740 0.521400 0.366614 -v -0.198870 0.482381 0.382242 -v -0.206480 0.443700 0.396869 -v -0.213396 0.405469 0.410161 -v -0.219443 0.367800 0.421784 -v -0.224449 0.330806 0.431406 -v -0.228239 0.294600 0.438691 -v -0.230641 0.259294 0.443307 -v -0.231480 0.225000 0.444920 -v -0.233819 0.560644 0.318603 -v -0.244695 0.521400 0.333423 -v -0.255126 0.482381 0.347636 -v -0.264888 0.443700 0.360939 -v -0.273760 0.405469 0.373027 -v -0.281518 0.367800 0.383599 -v -0.287940 0.330806 0.392349 -v -0.292803 0.294600 0.398975 -v -0.295884 0.259294 0.403173 -v -0.296960 0.225000 0.404640 -v -0.279518 0.560644 0.279518 -v -0.292520 0.521400 0.292520 -v -0.304989 0.482381 0.304989 -v -0.316660 0.443700 0.316660 -v -0.327266 0.405469 0.327266 -v -0.336540 0.367800 0.336540 -v -0.344217 0.330806 0.344217 -v -0.350030 0.294600 0.350030 -v -0.353713 0.259294 0.353713 -v -0.355000 0.225000 0.355000 -v -0.318603 0.560644 0.233819 -v -0.333423 0.521400 0.244695 -v -0.347636 0.482381 0.255126 -v -0.360939 0.443700 0.264888 -v -0.373028 0.405469 0.273760 -v -0.383599 0.367800 0.281518 -v -0.392349 0.330806 0.287940 -v -0.398975 0.294600 0.292803 -v -0.403173 0.259294 0.295884 -v -0.404640 0.225000 0.296960 -v -0.350319 0.560644 0.182262 -v -0.366614 0.521400 0.190739 -v -0.382242 0.482381 0.198870 -v -0.396869 0.443700 0.206480 -v -0.410161 0.405469 0.213396 -v -0.421784 0.367800 0.219443 -v -0.431406 0.330806 0.224449 -v -0.438691 0.294600 0.228239 -v -0.443307 0.259294 0.230641 -v -0.444920 0.225000 0.231480 -v -0.373909 0.560644 0.125602 -v -0.391301 0.521400 0.131444 -v -0.407981 0.482381 0.137048 -v -0.423593 0.443700 0.142292 -v -0.437780 0.405469 0.147057 -v -0.450186 0.367800 0.151225 -v -0.460456 0.330806 0.154675 -v -0.468232 0.294600 0.157287 -v -0.473159 0.259294 0.158942 -v -0.474880 0.225000 0.159520 -v -0.388617 0.560644 0.064596 -v -0.406693 0.521400 0.067601 -v -0.424030 0.482381 0.070482 -v -0.440256 0.443700 0.073180 -v -0.455001 0.405469 0.075630 -v -0.467895 0.367800 0.077774 -v -0.478568 0.330806 0.079548 -v -0.486650 0.294600 0.080891 -v -0.491771 0.259294 0.081742 -v -0.493560 0.225000 0.082040 -v -0.393687 0.560644 -0.000000 -v -0.412000 0.521400 -0.000000 -v -0.429563 0.482381 -0.000000 -v -0.446000 0.443700 -0.000000 -v -0.460938 0.405469 -0.000000 -v -0.474000 0.367800 -0.000000 -v -0.484812 0.330806 -0.000000 -v -0.493000 0.294600 -0.000000 -v -0.498187 0.259294 -0.000000 -v -0.388617 0.560644 -0.064596 -v -0.406693 0.521400 -0.067601 -v -0.424030 0.482381 -0.070483 -v -0.440256 0.443700 -0.073180 -v -0.455001 0.405469 -0.075631 -v -0.467895 0.367800 -0.077774 -v -0.478568 0.330806 -0.079548 -v -0.486650 0.294600 -0.080892 -v -0.491771 0.259294 -0.081743 -v -0.493560 0.225000 -0.082040 -v -0.373909 0.560644 -0.125602 -v -0.391301 0.521400 -0.131445 -v -0.407981 0.482381 -0.137048 -v -0.423593 0.443700 -0.142292 -v -0.437780 0.405469 -0.147058 -v -0.450186 0.367800 -0.151225 -v -0.460456 0.330806 -0.154675 -v -0.468232 0.294600 -0.157287 -v -0.473159 0.259294 -0.158942 -v -0.474880 0.225000 -0.159520 -v -0.350319 0.560644 -0.182262 -v -0.366614 0.521400 -0.190740 -v -0.382242 0.482381 -0.198870 -v -0.396869 0.443700 -0.206480 -v -0.410161 0.405469 -0.213396 -v -0.421784 0.367800 -0.219443 -v -0.431406 0.330806 -0.224449 -v -0.438691 0.294600 -0.228239 -v -0.443307 0.259294 -0.230641 -v -0.444920 0.225000 -0.231480 -v -0.318603 0.560644 -0.233819 -v -0.333423 0.521400 -0.244695 -v -0.347636 0.482381 -0.255126 -v -0.360939 0.443700 -0.264888 -v -0.373028 0.405469 -0.273760 -v -0.383599 0.367800 -0.281518 -v -0.392349 0.330806 -0.287940 -v -0.398975 0.294600 -0.292803 -v -0.403173 0.259294 -0.295884 -v -0.404640 0.225000 -0.296960 -v -0.279518 0.560644 -0.279518 -v -0.292520 0.521400 -0.292520 -v -0.304989 0.482381 -0.304989 -v -0.316660 0.443700 -0.316660 -v -0.327266 0.405469 -0.327266 -v -0.336540 0.367800 -0.336540 -v -0.344217 0.330806 -0.344217 -v -0.350030 0.294600 -0.350030 -v -0.353713 0.259294 -0.353713 -v -0.355000 0.225000 -0.355000 -v -0.233819 0.560644 -0.318603 -v -0.244695 0.521400 -0.333423 -v -0.255126 0.482381 -0.347636 -v -0.264888 0.443700 -0.360939 -v -0.273760 0.405469 -0.373028 -v -0.281518 0.367800 -0.383599 -v -0.287940 0.330806 -0.392349 -v -0.292803 0.294600 -0.398975 -v -0.295884 0.259294 -0.403173 -v -0.296960 0.225000 -0.404640 -v -0.182262 0.560644 -0.350319 -v -0.190740 0.521400 -0.366614 -v -0.198870 0.482381 -0.382242 -v -0.206480 0.443700 -0.396869 -v -0.213396 0.405469 -0.410161 -v -0.219443 0.367800 -0.421784 -v -0.224449 0.330806 -0.431406 -v -0.228239 0.294600 -0.438691 -v -0.230641 0.259294 -0.443307 -v -0.231480 0.225000 -0.444920 -v -0.125602 0.560644 -0.373909 -v -0.131444 0.521400 -0.391301 -v -0.137048 0.482381 -0.407981 -v -0.142292 0.443700 -0.423593 -v -0.147057 0.405469 -0.437780 -v -0.151225 0.367800 -0.450186 -v -0.154675 0.330806 -0.460456 -v -0.157287 0.294600 -0.468232 -v -0.158942 0.259294 -0.473159 -v -0.159520 0.225000 -0.474880 -v -0.064596 0.560644 -0.388617 -v -0.067601 0.521400 -0.406693 -v -0.070483 0.482381 -0.424030 -v -0.073180 0.443700 -0.440256 -v -0.075631 0.405469 -0.455001 -v -0.077774 0.367800 -0.467895 -v -0.079548 0.330806 -0.478568 -v -0.080891 0.294600 -0.486650 -v -0.081743 0.259294 -0.491771 -v -0.082040 0.225000 -0.493560 -v 0.000000 0.560644 -0.393688 -v 0.000000 0.521400 -0.412000 -v 0.000000 0.482381 -0.429563 -v 0.000000 0.443700 -0.446000 -v 0.000000 0.405469 -0.460938 -v 0.000000 0.367800 -0.474000 -v 0.000000 0.330806 -0.484812 -v 0.000000 0.294600 -0.493000 -v 0.000000 0.259294 -0.498187 -v 0.000000 0.225000 -0.500000 -v 0.064596 0.560644 -0.388617 -v 0.067601 0.521400 -0.406693 -v 0.070483 0.482381 -0.424030 -v 0.073180 0.443700 -0.440256 -v 0.075631 0.405469 -0.455001 -v 0.077774 0.367800 -0.467895 -v 0.079548 0.330806 -0.478568 -v 0.080891 0.294600 -0.486650 -v 0.081743 0.259294 -0.491771 -v 0.082040 0.225000 -0.493560 -v 0.125602 0.560644 -0.373909 -v 0.131444 0.521400 -0.391301 -v 0.137048 0.482381 -0.407981 -v 0.142292 0.443700 -0.423593 -v 0.147058 0.405469 -0.437780 -v 0.151225 0.367800 -0.450186 -v 0.154675 0.330806 -0.460456 -v 0.157287 0.294600 -0.468232 -v 0.158942 0.259294 -0.473159 -v 0.159520 0.225000 -0.474880 -v 0.182262 0.560644 -0.350319 -v 0.190740 0.521400 -0.366614 -v 0.198870 0.482381 -0.382242 -v 0.206480 0.443700 -0.396869 -v 0.213396 0.405469 -0.410161 -v 0.219443 0.367800 -0.421784 -v 0.224449 0.330806 -0.431406 -v 0.228239 0.294600 -0.438691 -v 0.230641 0.259294 -0.443307 -v 0.231480 0.225000 -0.444920 -v 0.233819 0.560644 -0.318603 -v 0.244695 0.521400 -0.333423 -v 0.255126 0.482381 -0.347636 -v 0.264888 0.443700 -0.360939 -v 0.273760 0.405469 -0.373028 -v 0.281518 0.367800 -0.383599 -v 0.287940 0.330806 -0.392349 -v 0.292803 0.294600 -0.398975 -v 0.295884 0.259294 -0.403173 -v 0.296960 0.225000 -0.404640 -v 0.279518 0.560644 -0.279518 -v 0.292520 0.521400 -0.292520 -v 0.304989 0.482381 -0.304989 -v 0.316660 0.443700 -0.316660 -v 0.327266 0.405469 -0.327266 -v 0.336540 0.367800 -0.336540 -v 0.344217 0.330806 -0.344217 -v 0.350030 0.294600 -0.350030 -v 0.353713 0.259294 -0.353713 -v 0.355000 0.225000 -0.355000 -v 0.318603 0.560644 -0.233819 -v 0.333423 0.521400 -0.244695 -v 0.347636 0.482381 -0.255126 -v 0.360939 0.443700 -0.264888 -v 0.373028 0.405469 -0.273760 -v 0.383599 0.367800 -0.281518 -v 0.392349 0.330806 -0.287940 -v 0.398975 0.294600 -0.292803 -v 0.403173 0.259294 -0.295884 -v 0.404640 0.225000 -0.296960 -v 0.350319 0.560644 -0.182262 -v 0.366614 0.521400 -0.190740 -v 0.382242 0.482381 -0.198870 -v 0.396869 0.443700 -0.206480 -v 0.410161 0.405469 -0.213396 -v 0.421784 0.367800 -0.219443 -v 0.431406 0.330806 -0.224449 -v 0.438691 0.294600 -0.228239 -v 0.443307 0.259294 -0.230641 -v 0.444920 0.225000 -0.231480 -v 0.373909 0.560644 -0.125602 -v 0.391301 0.521400 -0.131444 -v 0.407981 0.482381 -0.137048 -v 0.423593 0.443700 -0.142292 -v 0.437780 0.405469 -0.147057 -v 0.450186 0.367800 -0.151225 -v 0.460456 0.330806 -0.154675 -v 0.468232 0.294600 -0.157287 -v 0.473159 0.259294 -0.158942 -v 0.474880 0.225000 -0.159520 -v 0.388617 0.560644 -0.064596 -v 0.406693 0.521400 -0.067601 -v 0.424030 0.482381 -0.070483 -v 0.440256 0.443700 -0.073180 -v 0.455001 0.405469 -0.075631 -v 0.467895 0.367800 -0.077774 -v 0.478568 0.330806 -0.079548 -v 0.486650 0.294600 -0.080891 -v 0.491771 0.259294 -0.081743 -v 0.493560 0.225000 -0.082040 -v 0.490105 0.192919 0.081466 -v 0.496500 0.192919 -0.000000 -v 0.480727 0.164100 0.079907 -v 0.487000 0.164100 -0.000000 -v 0.466908 0.138431 0.077610 -v 0.473000 0.138431 -0.000000 -v 0.450127 0.115800 0.074820 -v 0.456000 0.115800 -0.000000 -v 0.431865 0.096094 0.071785 -v 0.437500 0.096094 -0.000000 -v 0.413603 0.079200 0.068750 -v 0.419000 0.079200 -0.000000 -v 0.396822 0.065006 0.065960 -v 0.402000 0.065006 -0.000000 -v 0.383003 0.053400 0.063663 -v 0.388000 0.053400 -0.000000 -v 0.373625 0.044269 0.062104 -v 0.378500 0.044269 -0.000000 -v 0.370170 0.037500 0.061530 -v 0.375000 0.037500 -0.000000 -v 0.471556 0.192919 0.158403 -v 0.462533 0.164100 0.155372 -v 0.449236 0.138431 0.150906 -v 0.433091 0.115800 0.145482 -v 0.415520 0.096094 0.139580 -v 0.397949 0.079200 0.133678 -v 0.381804 0.065006 0.128254 -v 0.368507 0.053400 0.123788 -v 0.359484 0.044269 0.120757 -v 0.356160 0.037500 0.119640 -v 0.441806 0.192919 0.229860 -v 0.433352 0.164100 0.225462 -v 0.420894 0.138431 0.218980 -v 0.405767 0.115800 0.211110 -v 0.389305 0.096094 0.202545 -v 0.372843 0.079200 0.193980 -v 0.357716 0.065006 0.186110 -v 0.345258 0.053400 0.179628 -v 0.336804 0.044269 0.175230 -v 0.333690 0.037500 0.173610 -v 0.401807 0.192919 0.294881 -v 0.394119 0.164100 0.289239 -v 0.382789 0.138431 0.280924 -v 0.369032 0.115800 0.270828 -v 0.354060 0.096094 0.259840 -v 0.339088 0.079200 0.248852 -v 0.325331 0.065006 0.238756 -v 0.314001 0.053400 0.230441 -v 0.306312 0.044269 0.224799 -v 0.303480 0.037500 0.222720 -v 0.352515 0.192919 0.352515 -v 0.345770 0.164100 0.345770 -v 0.335830 0.138431 0.335830 -v 0.323760 0.115800 0.323760 -v 0.310625 0.096094 0.310625 -v 0.297490 0.079200 0.297490 -v 0.285420 0.065006 0.285420 -v 0.275480 0.053400 0.275480 -v 0.268735 0.044269 0.268735 -v 0.266250 0.037500 0.266250 -v 0.294881 0.192919 0.401808 -v 0.289239 0.164100 0.394119 -v 0.280924 0.138431 0.382789 -v 0.270828 0.115800 0.369032 -v 0.259840 0.096094 0.354060 -v 0.248852 0.079200 0.339088 -v 0.238756 0.065006 0.325331 -v 0.230441 0.053400 0.314001 -v 0.224799 0.044269 0.306312 -v 0.222720 0.037500 0.303480 -v 0.229860 0.192919 0.441806 -v 0.225462 0.164100 0.433352 -v 0.218980 0.138431 0.420894 -v 0.211110 0.115800 0.405767 -v 0.202545 0.096094 0.389305 -v 0.193980 0.079200 0.372843 -v 0.186110 0.065006 0.357716 -v 0.179628 0.053400 0.345258 -v 0.175230 0.044269 0.336804 -v 0.173610 0.037500 0.333690 -v 0.158403 0.192919 0.471556 -v 0.155372 0.164100 0.462533 -v 0.150906 0.138431 0.449236 -v 0.145482 0.115800 0.433091 -v 0.139580 0.096094 0.415520 -v 0.133678 0.079200 0.397949 -v 0.128254 0.065006 0.381804 -v 0.123787 0.053400 0.368507 -v 0.120757 0.044269 0.359484 -v 0.119640 0.037500 0.356160 -v 0.081466 0.192919 0.490105 -v 0.079907 0.164100 0.480727 -v 0.077610 0.138431 0.466908 -v 0.074820 0.115800 0.450127 -v 0.071785 0.096094 0.431865 -v 0.068750 0.079200 0.413603 -v 0.065960 0.065006 0.396822 -v 0.063663 0.053400 0.383003 -v 0.062104 0.044269 0.373625 -v 0.061530 0.037500 0.370170 -v -0.000000 0.192919 0.496500 -v -0.000000 0.164100 0.487000 -v -0.000000 0.138431 0.473000 -v -0.000000 0.115800 0.456000 -v -0.000000 0.096094 0.437500 -v -0.000000 0.079200 0.419000 -v -0.000000 0.065006 0.402000 -v -0.000000 0.053400 0.388000 -v -0.000000 0.044269 0.378500 -v -0.000000 0.037500 0.375000 -v -0.081466 0.192919 0.490105 -v -0.079907 0.164100 0.480727 -v -0.077610 0.138431 0.466908 -v -0.074821 0.115800 0.450127 -v -0.071785 0.096094 0.431865 -v -0.068750 0.079200 0.413603 -v -0.065960 0.065006 0.396822 -v -0.063663 0.053400 0.383003 -v -0.062104 0.044269 0.373625 -v -0.061530 0.037500 0.370170 -v -0.158403 0.192919 0.471556 -v -0.155372 0.164100 0.462533 -v -0.150906 0.138431 0.449236 -v -0.145482 0.115800 0.433091 -v -0.139580 0.096094 0.415520 -v -0.133678 0.079200 0.397949 -v -0.128254 0.065006 0.381804 -v -0.123788 0.053400 0.368507 -v -0.120757 0.044269 0.359484 -v -0.119640 0.037500 0.356160 -v -0.229860 0.192919 0.441806 -v -0.225462 0.164100 0.433352 -v -0.218980 0.138431 0.420894 -v -0.211110 0.115800 0.405767 -v -0.202545 0.096094 0.389305 -v -0.193980 0.079200 0.372843 -v -0.186110 0.065006 0.357716 -v -0.179628 0.053400 0.345258 -v -0.175230 0.044269 0.336804 -v -0.173610 0.037500 0.333690 -v -0.294881 0.192919 0.401807 -v -0.289239 0.164100 0.394119 -v -0.280924 0.138431 0.382789 -v -0.270828 0.115800 0.369032 -v -0.259840 0.096094 0.354060 -v -0.248852 0.079200 0.339088 -v -0.238756 0.065006 0.325331 -v -0.230441 0.053400 0.314001 -v -0.224799 0.044269 0.306312 -v -0.222720 0.037500 0.303480 -v -0.352515 0.192919 0.352515 -v -0.345770 0.164100 0.345770 -v -0.335830 0.138431 0.335830 -v -0.323760 0.115800 0.323760 -v -0.310625 0.096094 0.310625 -v -0.297490 0.079200 0.297490 -v -0.285420 0.065006 0.285420 -v -0.275480 0.053400 0.275480 -v -0.268735 0.044269 0.268735 -v -0.266250 0.037500 0.266250 -v -0.401808 0.192919 0.294881 -v -0.394119 0.164100 0.289239 -v -0.382789 0.138431 0.280924 -v -0.369032 0.115800 0.270828 -v -0.354060 0.096094 0.259840 -v -0.339088 0.079200 0.248852 -v -0.325331 0.065006 0.238756 -v -0.314001 0.053400 0.230441 -v -0.306312 0.044269 0.224799 -v -0.303480 0.037500 0.222720 -v -0.441806 0.192919 0.229860 -v -0.433352 0.164100 0.225462 -v -0.420894 0.138431 0.218980 -v -0.405767 0.115800 0.211110 -v -0.389305 0.096094 0.202545 -v -0.372843 0.079200 0.193980 -v -0.357716 0.065006 0.186110 -v -0.345258 0.053400 0.179628 -v -0.336804 0.044269 0.175230 -v -0.333690 0.037500 0.173610 -v -0.471556 0.192919 0.158403 -v -0.462533 0.164100 0.155372 -v -0.449236 0.138431 0.150906 -v -0.433091 0.115800 0.145482 -v -0.415520 0.096094 0.139580 -v -0.397949 0.079200 0.133678 -v -0.381804 0.065006 0.128254 -v -0.368507 0.053400 0.123787 -v -0.359484 0.044269 0.120757 -v -0.356160 0.037500 0.119640 -v -0.490105 0.192919 0.081466 -v -0.480727 0.164100 0.079907 -v -0.466908 0.138431 0.077610 -v -0.450127 0.115800 0.074820 -v -0.431865 0.096094 0.071785 -v -0.413603 0.079200 0.068750 -v -0.396822 0.065006 0.065960 -v -0.383003 0.053400 0.063663 -v -0.373625 0.044269 0.062104 -v -0.370170 0.037500 0.061530 -v -0.496500 0.192919 -0.000000 -v -0.487000 0.164100 -0.000000 -v -0.473000 0.138431 -0.000000 -v -0.456000 0.115800 -0.000000 -v -0.437500 0.096094 -0.000000 -v -0.419000 0.079200 -0.000000 -v -0.402000 0.065006 -0.000000 -v -0.388000 0.053400 -0.000000 -v -0.378500 0.044269 -0.000000 -v -0.375000 0.037500 -0.000000 -v -0.490105 0.192919 -0.081466 -v -0.480727 0.164100 -0.079907 -v -0.466908 0.138431 -0.077610 -v -0.450127 0.115800 -0.074821 -v -0.431865 0.096094 -0.071785 -v -0.413603 0.079200 -0.068750 -v -0.396822 0.065006 -0.065960 -v -0.383003 0.053400 -0.063663 -v -0.373625 0.044269 -0.062104 -v -0.370170 0.037500 -0.061530 -v -0.471556 0.192919 -0.158403 -v -0.462533 0.164100 -0.155373 -v -0.449236 0.138431 -0.150906 -v -0.433091 0.115800 -0.145482 -v -0.415520 0.096094 -0.139580 -v -0.397949 0.079200 -0.133678 -v -0.381804 0.065006 -0.128254 -v -0.368507 0.053400 -0.123788 -v -0.359484 0.044269 -0.120757 -v -0.356160 0.037500 -0.119640 -v -0.441806 0.192919 -0.229860 -v -0.433352 0.164100 -0.225462 -v -0.420894 0.138431 -0.218980 -v -0.405767 0.115800 -0.211110 -v -0.389305 0.096094 -0.202545 -v -0.372843 0.079200 -0.193980 -v -0.357716 0.065006 -0.186110 -v -0.345258 0.053400 -0.179628 -v -0.336804 0.044269 -0.175230 -v -0.333690 0.037500 -0.173610 -v -0.401807 0.192919 -0.294881 -v -0.394119 0.164100 -0.289239 -v -0.382789 0.138431 -0.280924 -v -0.369032 0.115800 -0.270828 -v -0.354060 0.096094 -0.259840 -v -0.339088 0.079200 -0.248852 -v -0.325331 0.065006 -0.238756 -v -0.314001 0.053400 -0.230441 -v -0.306312 0.044269 -0.224799 -v -0.303480 0.037500 -0.222720 -v -0.352515 0.192919 -0.352515 -v -0.345770 0.164100 -0.345770 -v -0.335830 0.138431 -0.335830 -v -0.323760 0.115800 -0.323760 -v -0.310625 0.096094 -0.310625 -v -0.297490 0.079200 -0.297490 -v -0.285420 0.065006 -0.285420 -v -0.275480 0.053400 -0.275480 -v -0.268735 0.044269 -0.268735 -v -0.266250 0.037500 -0.266250 -v -0.294881 0.192919 -0.401808 -v -0.289239 0.164100 -0.394119 -v -0.280924 0.138431 -0.382789 -v -0.270828 0.115800 -0.369032 -v -0.259840 0.096094 -0.354060 -v -0.248852 0.079200 -0.339088 -v -0.238756 0.065006 -0.325331 -v -0.230441 0.053400 -0.314001 -v -0.224799 0.044269 -0.306312 -v -0.222720 0.037500 -0.303480 -v -0.229860 0.192919 -0.441806 -v -0.225462 0.164100 -0.433352 -v -0.218980 0.138431 -0.420894 -v -0.211110 0.115800 -0.405767 -v -0.202545 0.096094 -0.389305 -v -0.193980 0.079200 -0.372843 -v -0.186110 0.065006 -0.357716 -v -0.179628 0.053400 -0.345258 -v -0.175230 0.044269 -0.336804 -v -0.173610 0.037500 -0.333690 -v -0.158403 0.192919 -0.471556 -v -0.155372 0.164100 -0.462533 -v -0.150906 0.138431 -0.449236 -v -0.145482 0.115800 -0.433091 -v -0.139580 0.096094 -0.415520 -v -0.133678 0.079200 -0.397949 -v -0.128254 0.065006 -0.381804 -v -0.123787 0.053400 -0.368507 -v -0.120757 0.044269 -0.359484 -v -0.119640 0.037500 -0.356160 -v -0.081466 0.192919 -0.490105 -v -0.079907 0.164100 -0.480727 -v -0.077610 0.138431 -0.466908 -v -0.074820 0.115800 -0.450127 -v -0.071785 0.096094 -0.431865 -v -0.068750 0.079200 -0.413603 -v -0.065960 0.065006 -0.396822 -v -0.063663 0.053400 -0.383003 -v -0.062104 0.044269 -0.373625 -v -0.061530 0.037500 -0.370170 -v 0.000000 0.192919 -0.496500 -v 0.000000 0.164100 -0.487000 -v 0.000000 0.138431 -0.473000 -v 0.000000 0.115800 -0.456000 -v 0.000000 0.096094 -0.437500 -v 0.000000 0.079200 -0.419000 -v 0.000000 0.065006 -0.402000 -v 0.000000 0.053400 -0.388000 -v 0.000000 0.044269 -0.378500 -v 0.000000 0.037500 -0.375000 -v 0.081466 0.192919 -0.490105 -v 0.079907 0.164100 -0.480727 -v 0.077610 0.138431 -0.466908 -v 0.074821 0.115800 -0.450127 -v 0.071785 0.096094 -0.431865 -v 0.068750 0.079200 -0.413603 -v 0.065960 0.065006 -0.396822 -v 0.063663 0.053400 -0.383003 -v 0.062104 0.044269 -0.373625 -v 0.061530 0.037500 -0.370170 -v 0.158403 0.192919 -0.471556 -v 0.155372 0.164100 -0.462533 -v 0.150906 0.138431 -0.449236 -v 0.145482 0.115800 -0.433091 -v 0.139580 0.096094 -0.415520 -v 0.133678 0.079200 -0.397949 -v 0.128254 0.065006 -0.381804 -v 0.123788 0.053400 -0.368507 -v 0.120757 0.044269 -0.359484 -v 0.119640 0.037500 -0.356160 -v 0.229860 0.192919 -0.441806 -v 0.225462 0.164100 -0.433352 -v 0.218980 0.138431 -0.420894 -v 0.211110 0.115800 -0.405767 -v 0.202545 0.096094 -0.389305 -v 0.193980 0.079200 -0.372843 -v 0.186110 0.065006 -0.357716 -v 0.179628 0.053400 -0.345258 -v 0.175230 0.044269 -0.336804 -v 0.173610 0.037500 -0.333690 -v 0.294881 0.192919 -0.401807 -v 0.289239 0.164100 -0.394119 -v 0.280924 0.138431 -0.382789 -v 0.270828 0.115800 -0.369032 -v 0.259840 0.096094 -0.354060 -v 0.248852 0.079200 -0.339088 -v 0.238756 0.065006 -0.325331 -v 0.230441 0.053400 -0.314001 -v 0.224799 0.044269 -0.306312 -v 0.222720 0.037500 -0.303480 -v 0.352515 0.192919 -0.352515 -v 0.345770 0.164100 -0.345770 -v 0.335830 0.138431 -0.335830 -v 0.323760 0.115800 -0.323760 -v 0.310625 0.096094 -0.310625 -v 0.297490 0.079200 -0.297490 -v 0.285420 0.065006 -0.285420 -v 0.275480 0.053400 -0.275480 -v 0.268735 0.044269 -0.268735 -v 0.266250 0.037500 -0.266250 -v 0.401808 0.192919 -0.294881 -v 0.394119 0.164100 -0.289239 -v 0.382789 0.138431 -0.280924 -v 0.369032 0.115800 -0.270828 -v 0.354060 0.096094 -0.259840 -v 0.339088 0.079200 -0.248852 -v 0.325331 0.065006 -0.238756 -v 0.314001 0.053400 -0.230441 -v 0.306312 0.044269 -0.224799 -v 0.303480 0.037500 -0.222720 -v 0.441806 0.192919 -0.229860 -v 0.433352 0.164100 -0.225462 -v 0.420894 0.138431 -0.218980 -v 0.405767 0.115800 -0.211110 -v 0.389305 0.096094 -0.202545 -v 0.372843 0.079200 -0.193980 -v 0.357716 0.065006 -0.186110 -v 0.345258 0.053400 -0.179628 -v 0.336804 0.044269 -0.175230 -v 0.333690 0.037500 -0.173610 -v 0.471556 0.192919 -0.158403 -v 0.462533 0.164100 -0.155372 -v 0.449236 0.138431 -0.150906 -v 0.433091 0.115800 -0.145482 -v 0.415520 0.096094 -0.139580 -v 0.397949 0.079200 -0.133678 -v 0.381804 0.065006 -0.128254 -v 0.368507 0.053400 -0.123787 -v 0.359484 0.044269 -0.120757 -v 0.356160 0.037500 -0.119640 -v 0.490105 0.192919 -0.081466 -v 0.480727 0.164100 -0.079907 -v 0.466908 0.138431 -0.077610 -v 0.450127 0.115800 -0.074820 -v 0.431865 0.096094 -0.071785 -v 0.413603 0.079200 -0.068750 -v 0.396822 0.065006 -0.065960 -v 0.383003 0.053400 -0.063663 -v 0.373625 0.044269 -0.062104 -v 0.370170 0.037500 -0.061530 -v 0.369300 0.031894 0.061385 -v 0.374119 0.031894 -0.000000 -v 0.365432 0.026400 0.060742 -v 0.370200 0.026400 -0.000000 -v 0.356677 0.021131 0.059287 -v 0.361331 0.021131 -0.000000 -v 0.341149 0.016200 0.056706 -v 0.345600 0.016200 -0.000000 -v 0.316958 0.011719 0.052685 -v 0.321094 0.011719 -0.000000 -v 0.282218 0.007800 0.046911 -v 0.285900 0.007800 -0.000000 -v 0.235039 0.004556 0.039069 -v 0.238106 0.004556 -0.000000 -v 0.173536 0.002100 0.028845 -v 0.175800 0.002100 -0.000000 -v 0.095818 0.000544 0.015927 -v 0.097069 0.000544 -0.000000 -v 0.000000 -0.000000 0.000000 -v 0.355323 0.031894 0.119359 -v 0.351601 0.026400 0.118109 -v 0.343178 0.021131 0.115279 -v 0.328237 0.016200 0.110260 -v 0.304962 0.011719 0.102442 -v 0.271536 0.007800 0.091214 -v 0.226144 0.004556 0.075965 -v 0.166968 0.002100 0.056087 -v 0.092192 0.000544 0.030969 -v 0.332906 0.031894 0.173202 -v 0.329419 0.026400 0.171388 -v 0.321527 0.021131 0.167282 -v 0.307529 0.016200 0.159999 -v 0.285722 0.011719 0.148654 -v 0.254405 0.007800 0.132360 -v 0.211876 0.004556 0.110234 -v 0.156434 0.002100 0.081388 -v 0.086376 0.000544 0.044939 -v 0.302767 0.031894 0.222197 -v 0.299595 0.026400 0.219869 -v 0.292418 0.021131 0.214602 -v 0.279687 0.016200 0.205259 -v 0.259855 0.011719 0.190704 -v 0.231373 0.007800 0.169802 -v 0.192695 0.004556 0.141416 -v 0.142271 0.002100 0.104411 -v 0.078556 0.000544 0.057651 -v 0.265624 0.031894 0.265624 -v 0.262842 0.026400 0.262842 -v 0.256545 0.021131 0.256545 -v 0.245376 0.016200 0.245376 -v 0.227977 0.011719 0.227977 -v 0.202989 0.007800 0.202989 -v 0.169055 0.004556 0.169055 -v 0.124818 0.002100 0.124818 -v 0.068919 0.000544 0.068919 -v 0.222197 0.031894 0.302767 -v 0.219869 0.026400 0.299595 -v 0.214602 0.021131 0.292418 -v 0.205259 0.016200 0.279687 -v 0.190704 0.011719 0.259855 -v 0.169802 0.007800 0.231373 -v 0.141416 0.004556 0.192695 -v 0.104411 0.002100 0.142271 -v 0.057651 0.000544 0.078556 -v 0.173202 0.031894 0.332906 -v 0.171388 0.026400 0.329419 -v 0.167282 0.021131 0.321527 -v 0.159999 0.016200 0.307529 -v 0.148654 0.011719 0.285722 -v 0.132360 0.007800 0.254405 -v 0.110234 0.004556 0.211876 -v 0.081388 0.002100 0.156434 -v 0.044939 0.000544 0.086376 -v 0.119359 0.031894 0.355323 -v 0.118109 0.026400 0.351601 -v 0.115279 0.021131 0.343178 -v 0.110260 0.016200 0.328237 -v 0.102442 0.011719 0.304962 -v 0.091214 0.007800 0.271536 -v 0.075965 0.004556 0.226144 -v 0.056087 0.002100 0.166968 -v 0.030969 0.000544 0.092192 -v 0.061385 0.031894 0.369300 -v 0.060742 0.026400 0.365432 -v 0.059287 0.021131 0.356677 -v 0.056706 0.016200 0.341149 -v 0.052685 0.011719 0.316958 -v 0.046910 0.007800 0.282218 -v 0.039068 0.004556 0.235039 -v 0.028845 0.002100 0.173536 -v 0.015927 0.000544 0.095818 -v -0.000000 0.031894 0.374119 -v -0.000000 0.026400 0.370200 -v -0.000000 0.021131 0.361331 -v -0.000000 0.016200 0.345600 -v -0.000000 0.011719 0.321094 -v -0.000000 0.007800 0.285900 -v -0.000000 0.004556 0.238106 -v -0.000000 0.002100 0.175800 -v -0.000000 0.000544 0.097069 -v -0.061385 0.031894 0.369300 -v -0.060742 0.026400 0.365432 -v -0.059287 0.021131 0.356677 -v -0.056706 0.016200 0.341149 -v -0.052685 0.011719 0.316958 -v -0.046911 0.007800 0.282218 -v -0.039069 0.004556 0.235039 -v -0.028845 0.002100 0.173536 -v -0.015927 0.000544 0.095818 -v -0.119359 0.031894 0.355323 -v -0.118109 0.026400 0.351601 -v -0.115279 0.021131 0.343178 -v -0.110260 0.016200 0.328237 -v -0.102442 0.011719 0.304962 -v -0.091214 0.007800 0.271536 -v -0.075965 0.004556 0.226144 -v -0.056087 0.002100 0.166968 -v -0.030969 0.000544 0.092192 -v -0.173202 0.031894 0.332906 -v -0.171388 0.026400 0.329419 -v -0.167282 0.021131 0.321527 -v -0.159999 0.016200 0.307529 -v -0.148654 0.011719 0.285722 -v -0.132360 0.007800 0.254405 -v -0.110234 0.004556 0.211876 -v -0.081388 0.002100 0.156434 -v -0.044939 0.000544 0.086376 -v -0.222197 0.031894 0.302767 -v -0.219869 0.026400 0.299595 -v -0.214602 0.021131 0.292418 -v -0.205259 0.016200 0.279687 -v -0.190704 0.011719 0.259855 -v -0.169802 0.007800 0.231373 -v -0.141416 0.004556 0.192695 -v -0.104411 0.002100 0.142271 -v -0.057651 0.000544 0.078556 -v -0.265624 0.031894 0.265624 -v -0.262842 0.026400 0.262842 -v -0.256545 0.021131 0.256545 -v -0.245376 0.016200 0.245376 -v -0.227977 0.011719 0.227977 -v -0.202989 0.007800 0.202989 -v -0.169055 0.004556 0.169055 -v -0.124818 0.002100 0.124818 -v -0.068919 0.000544 0.068919 -v -0.302767 0.031894 0.222197 -v -0.299595 0.026400 0.219869 -v -0.292418 0.021131 0.214602 -v -0.279687 0.016200 0.205259 -v -0.259855 0.011719 0.190704 -v -0.231373 0.007800 0.169802 -v -0.192695 0.004556 0.141416 -v -0.142271 0.002100 0.104411 -v -0.078556 0.000544 0.057651 -v -0.332906 0.031894 0.173202 -v -0.329419 0.026400 0.171388 -v -0.321527 0.021131 0.167282 -v -0.307529 0.016200 0.159999 -v -0.285722 0.011719 0.148654 -v -0.254405 0.007800 0.132360 -v -0.211876 0.004556 0.110234 -v -0.156434 0.002100 0.081388 -v -0.086376 0.000544 0.044939 -v -0.355323 0.031894 0.119359 -v -0.351601 0.026400 0.118109 -v -0.343178 0.021131 0.115279 -v -0.328237 0.016200 0.110260 -v -0.304962 0.011719 0.102442 -v -0.271536 0.007800 0.091214 -v -0.226144 0.004556 0.075965 -v -0.166968 0.002100 0.056087 -v -0.092192 0.000544 0.030969 -v -0.369300 0.031894 0.061385 -v -0.365432 0.026400 0.060742 -v -0.356677 0.021131 0.059287 -v -0.341149 0.016200 0.056706 -v -0.316958 0.011719 0.052685 -v -0.282218 0.007800 0.046910 -v -0.235039 0.004556 0.039068 -v -0.173536 0.002100 0.028845 -v -0.095818 0.000544 0.015927 -v -0.374119 0.031894 -0.000000 -v -0.370200 0.026400 -0.000000 -v -0.361331 0.021131 -0.000000 -v -0.345600 0.016200 -0.000000 -v -0.321094 0.011719 -0.000000 -v -0.285900 0.007800 -0.000000 -v -0.238106 0.004556 -0.000000 -v -0.175800 0.002100 -0.000000 -v -0.097069 0.000544 -0.000000 -v -0.369300 0.031894 -0.061385 -v -0.365432 0.026400 -0.060742 -v -0.356677 0.021131 -0.059287 -v -0.341149 0.016200 -0.056706 -v -0.316958 0.011719 -0.052685 -v -0.282218 0.007800 -0.046911 -v -0.235039 0.004556 -0.039069 -v -0.173536 0.002100 -0.028845 -v -0.095818 0.000544 -0.015927 -v -0.355323 0.031894 -0.119359 -v -0.351601 0.026400 -0.118109 -v -0.343178 0.021131 -0.115279 -v -0.328237 0.016200 -0.110260 -v -0.304962 0.011719 -0.102442 -v -0.271536 0.007800 -0.091214 -v -0.226144 0.004556 -0.075965 -v -0.166968 0.002100 -0.056087 -v -0.092192 0.000544 -0.030969 -v -0.332906 0.031894 -0.173202 -v -0.329419 0.026400 -0.171388 -v -0.321527 0.021131 -0.167282 -v -0.307529 0.016200 -0.159999 -v -0.285722 0.011719 -0.148654 -v -0.254405 0.007800 -0.132360 -v -0.211876 0.004556 -0.110234 -v -0.156434 0.002100 -0.081388 -v -0.086376 0.000544 -0.044939 -v -0.302767 0.031894 -0.222197 -v -0.299595 0.026400 -0.219869 -v -0.292418 0.021131 -0.214602 -v -0.279687 0.016200 -0.205259 -v -0.259855 0.011719 -0.190704 -v -0.231373 0.007800 -0.169802 -v -0.192695 0.004556 -0.141416 -v -0.142271 0.002100 -0.104411 -v -0.078556 0.000544 -0.057651 -v -0.265624 0.031894 -0.265624 -v -0.262842 0.026400 -0.262842 -v -0.256545 0.021131 -0.256545 -v -0.245376 0.016200 -0.245376 -v -0.227977 0.011719 -0.227977 -v -0.202989 0.007800 -0.202989 -v -0.169055 0.004556 -0.169055 -v -0.124818 0.002100 -0.124818 -v -0.068919 0.000544 -0.068919 -v -0.222197 0.031894 -0.302767 -v -0.219869 0.026400 -0.299595 -v -0.214602 0.021131 -0.292418 -v -0.205259 0.016200 -0.279687 -v -0.190704 0.011719 -0.259855 -v -0.169802 0.007800 -0.231373 -v -0.141416 0.004556 -0.192695 -v -0.104411 0.002100 -0.142271 -v -0.057651 0.000544 -0.078556 -v -0.173202 0.031894 -0.332906 -v -0.171388 0.026400 -0.329419 -v -0.167282 0.021131 -0.321527 -v -0.159999 0.016200 -0.307529 -v -0.148654 0.011719 -0.285722 -v -0.132360 0.007800 -0.254405 -v -0.110234 0.004556 -0.211876 -v -0.081388 0.002100 -0.156434 -v -0.044939 0.000544 -0.086376 -v -0.119359 0.031894 -0.355323 -v -0.118109 0.026400 -0.351601 -v -0.115279 0.021131 -0.343178 -v -0.110260 0.016200 -0.328237 -v -0.102442 0.011719 -0.304962 -v -0.091214 0.007800 -0.271536 -v -0.075965 0.004556 -0.226144 -v -0.056087 0.002100 -0.166968 -v -0.030969 0.000544 -0.092192 -v -0.061385 0.031894 -0.369300 -v -0.060742 0.026400 -0.365432 -v -0.059287 0.021131 -0.356677 -v -0.056706 0.016200 -0.341149 -v -0.052685 0.011719 -0.316958 -v -0.046910 0.007800 -0.282218 -v -0.039068 0.004556 -0.235039 -v -0.028845 0.002100 -0.173536 -v -0.015927 0.000544 -0.095818 -v 0.000000 0.031894 -0.374119 -v 0.000000 0.026400 -0.370200 -v 0.000000 0.021131 -0.361331 -v 0.000000 0.016200 -0.345600 -v 0.000000 0.011719 -0.321094 -v 0.000000 0.007800 -0.285900 -v 0.000000 0.004556 -0.238106 -v 0.000000 0.002100 -0.175800 -v 0.000000 0.000544 -0.097069 -v 0.061385 0.031894 -0.369300 -v 0.060742 0.026400 -0.365432 -v 0.059287 0.021131 -0.356677 -v 0.056706 0.016200 -0.341149 -v 0.052685 0.011719 -0.316958 -v 0.046911 0.007800 -0.282218 -v 0.039069 0.004556 -0.235039 -v 0.028845 0.002100 -0.173536 -v 0.015927 0.000544 -0.095818 -v 0.119359 0.031894 -0.355323 -v 0.118109 0.026400 -0.351601 -v 0.115279 0.021131 -0.343178 -v 0.110260 0.016200 -0.328237 -v 0.102442 0.011719 -0.304962 -v 0.091214 0.007800 -0.271536 -v 0.075965 0.004556 -0.226144 -v 0.056087 0.002100 -0.166968 -v 0.030969 0.000544 -0.092192 -v 0.173202 0.031894 -0.332906 -v 0.171388 0.026400 -0.329419 -v 0.167282 0.021131 -0.321527 -v 0.159999 0.016200 -0.307529 -v 0.148654 0.011719 -0.285722 -v 0.132360 0.007800 -0.254405 -v 0.110234 0.004556 -0.211876 -v 0.081388 0.002100 -0.156434 -v 0.044939 0.000544 -0.086376 -v 0.222197 0.031894 -0.302767 -v 0.219869 0.026400 -0.299595 -v 0.214602 0.021131 -0.292418 -v 0.205259 0.016200 -0.279687 -v 0.190704 0.011719 -0.259855 -v 0.169802 0.007800 -0.231373 -v 0.141416 0.004556 -0.192695 -v 0.104411 0.002100 -0.142271 -v 0.057651 0.000544 -0.078556 -v 0.265624 0.031894 -0.265624 -v 0.262842 0.026400 -0.262842 -v 0.256545 0.021131 -0.256545 -v 0.245376 0.016200 -0.245376 -v 0.227977 0.011719 -0.227977 -v 0.202989 0.007800 -0.202989 -v 0.169055 0.004556 -0.169055 -v 0.124818 0.002100 -0.124818 -v 0.068919 0.000544 -0.068919 -v 0.302767 0.031894 -0.222197 -v 0.299595 0.026400 -0.219869 -v 0.292418 0.021131 -0.214602 -v 0.279687 0.016200 -0.205259 -v 0.259855 0.011719 -0.190704 -v 0.231373 0.007800 -0.169802 -v 0.192695 0.004556 -0.141416 -v 0.142271 0.002100 -0.104411 -v 0.078556 0.000544 -0.057651 -v 0.332906 0.031894 -0.173202 -v 0.329419 0.026400 -0.171388 -v 0.321527 0.021131 -0.167282 -v 0.307529 0.016200 -0.159999 -v 0.285722 0.011719 -0.148654 -v 0.254405 0.007800 -0.132360 -v 0.211876 0.004556 -0.110234 -v 0.156434 0.002100 -0.081388 -v 0.086376 0.000544 -0.044939 -v 0.355323 0.031894 -0.119359 -v 0.351601 0.026400 -0.118109 -v 0.343178 0.021131 -0.115279 -v 0.328237 0.016200 -0.110260 -v 0.304962 0.011719 -0.102442 -v 0.271536 0.007800 -0.091214 -v 0.226144 0.004556 -0.075965 -v 0.166968 0.002100 -0.056087 -v 0.092192 0.000544 -0.030969 -v 0.369300 0.031894 -0.061385 -v 0.365432 0.026400 -0.060742 -v 0.356677 0.021131 -0.059287 -v 0.341149 0.016200 -0.056706 -v 0.316958 0.011719 -0.052685 -v 0.282218 0.007800 -0.046910 -v 0.235039 0.004556 -0.039068 -v 0.173536 0.002100 -0.028845 -v 0.095818 0.000544 -0.015927 -v -0.400000 0.506250 -0.000000 -v -0.399300 0.507825 0.020250 -v -0.450114 0.507767 0.020250 -v -0.450225 0.506194 -0.000000 -v -0.496198 0.507362 0.020250 -v -0.495800 0.505800 -0.000000 -v -0.537406 0.506264 0.020250 -v -0.536575 0.504731 -0.000000 -v -0.573593 0.504124 0.020250 -v -0.572400 0.502650 -0.000000 -v -0.604612 0.500597 0.020250 -v -0.603125 0.499219 -0.000000 -v -0.630319 0.495335 0.020250 -v -0.628600 0.494100 -0.000000 -v -0.650567 0.487991 0.020250 -v -0.648675 0.486956 -0.000000 -v -0.665210 0.478219 0.020250 -v -0.663200 0.477450 -0.000000 -v -0.674103 0.465671 0.020250 -v -0.672025 0.465244 -0.000000 -v -0.677100 0.450000 0.020250 -v -0.675000 0.450000 -0.000000 -v -0.397400 0.512100 0.036000 -v -0.449812 0.512038 0.036000 -v -0.497277 0.511603 0.036000 -v -0.539661 0.510423 0.036000 -v -0.576830 0.508126 0.036000 -v -0.608650 0.504338 0.036000 -v -0.634986 0.498686 0.036000 -v -0.655703 0.490800 0.036000 -v -0.670667 0.480305 0.036000 -v -0.679744 0.466829 0.036000 -v -0.682800 0.450000 0.036000 -v -0.394600 0.518400 0.047250 -v -0.449366 0.518332 0.047250 -v -0.498867 0.517853 0.047250 -v -0.542985 0.516553 0.047250 -v -0.581602 0.514022 0.047250 -v -0.614600 0.509850 0.047250 -v -0.641862 0.503626 0.047250 -v -0.663271 0.494939 0.047250 -v -0.678709 0.483379 0.047250 -v -0.688058 0.468536 0.047250 -v -0.691200 0.450000 0.047250 -v -0.391200 0.526050 0.054000 -v -0.448826 0.525974 0.054000 -v -0.500798 0.525442 0.054000 -v -0.547021 0.523997 0.054000 -v -0.587395 0.521183 0.054000 -v -0.621825 0.516544 0.054000 -v -0.650213 0.509623 0.054000 -v -0.672461 0.499965 0.054000 -v -0.688474 0.487112 0.054000 -v -0.698152 0.470610 0.054000 -v -0.701400 0.450000 0.054000 -v -0.387500 0.534375 0.056250 -v -0.448238 0.534291 0.056250 -v -0.502900 0.533700 0.056250 -v -0.551413 0.532097 0.056250 -v -0.593700 0.528975 0.056250 -v -0.629688 0.523828 0.056250 -v -0.659300 0.516150 0.056250 -v -0.682463 0.505434 0.056250 -v -0.699100 0.491175 0.056250 -v -0.709137 0.472866 0.056250 -v -0.712500 0.450000 0.056250 -v -0.383800 0.542700 0.054000 -v -0.447649 0.542607 0.054000 -v -0.505002 0.541958 0.054000 -v -0.555804 0.540197 0.054000 -v -0.600005 0.536767 0.054000 -v -0.637550 0.531112 0.054000 -v -0.668387 0.522677 0.054000 -v -0.692464 0.510904 0.054000 -v -0.709726 0.495238 0.054000 -v -0.720123 0.475122 0.054000 -v -0.723600 0.450000 0.054000 -v -0.380400 0.550350 0.047250 -v -0.447109 0.550250 0.047250 -v -0.506933 0.549547 0.047250 -v -0.559840 0.547641 0.047250 -v -0.605798 0.543928 0.047250 -v -0.644775 0.537806 0.047250 -v -0.676738 0.528674 0.047250 -v -0.701654 0.515930 0.047250 -v -0.719491 0.498971 0.047250 -v -0.730217 0.477195 0.047250 -v -0.733800 0.450000 0.047250 -v -0.377600 0.556650 0.036000 -v -0.446663 0.556543 0.036000 -v -0.508523 0.555797 0.036000 -v -0.563164 0.553770 0.036000 -v -0.610570 0.549824 0.036000 -v -0.650725 0.543319 0.036000 -v -0.683614 0.533614 0.036000 -v -0.709222 0.520069 0.036000 -v -0.727533 0.502045 0.036000 -v -0.738531 0.478902 0.036000 -v -0.742200 0.450000 0.036000 -v -0.375700 0.560925 0.020250 -v -0.446361 0.560814 0.020250 -v -0.509602 0.560038 0.020250 -v -0.565419 0.557930 0.020250 -v -0.613807 0.553826 0.020250 -v -0.654763 0.547059 0.020250 -v -0.688281 0.536965 0.020250 -v -0.714358 0.522878 0.020250 -v -0.732990 0.504131 0.020250 -v -0.744172 0.480061 0.020250 -v -0.747900 0.450000 0.020250 -v -0.375000 0.562500 -0.000000 -v -0.446250 0.562388 -0.000000 -v -0.510000 0.561600 -0.000000 -v -0.566250 0.559462 -0.000000 -v -0.615000 0.555300 -0.000000 -v -0.656250 0.548438 -0.000000 -v -0.690000 0.538200 -0.000000 -v -0.716250 0.523912 -0.000000 -v -0.735000 0.504900 -0.000000 -v -0.746250 0.480487 -0.000000 -v -0.750000 0.450000 -0.000000 -v -0.375700 0.560925 -0.020250 -v -0.446361 0.560814 -0.020250 -v -0.509602 0.560038 -0.020250 -v -0.565419 0.557930 -0.020250 -v -0.613807 0.553826 -0.020250 -v -0.654763 0.547059 -0.020250 -v -0.688281 0.536965 -0.020250 -v -0.714358 0.522878 -0.020250 -v -0.732990 0.504131 -0.020250 -v -0.744172 0.480061 -0.020250 -v -0.747900 0.450000 -0.020250 -v -0.377600 0.556650 -0.036000 -v -0.446663 0.556543 -0.036000 -v -0.508523 0.555797 -0.036000 -v -0.563164 0.553770 -0.036000 -v -0.610570 0.549824 -0.036000 -v -0.650725 0.543319 -0.036000 -v -0.683614 0.533614 -0.036000 -v -0.709222 0.520069 -0.036000 -v -0.727533 0.502045 -0.036000 -v -0.738531 0.478902 -0.036000 -v -0.742200 0.450000 -0.036000 -v -0.380400 0.550350 -0.047250 -v -0.447109 0.550250 -0.047250 -v -0.506933 0.549547 -0.047250 -v -0.559840 0.547641 -0.047250 -v -0.605798 0.543928 -0.047250 -v -0.644775 0.537806 -0.047250 -v -0.676738 0.528674 -0.047250 -v -0.701654 0.515930 -0.047250 -v -0.719491 0.498971 -0.047250 -v -0.730217 0.477195 -0.047250 -v -0.733800 0.450000 -0.047250 -v -0.383800 0.542700 -0.054000 -v -0.447649 0.542607 -0.054000 -v -0.505002 0.541958 -0.054000 -v -0.555804 0.540197 -0.054000 -v -0.600005 0.536767 -0.054000 -v -0.637550 0.531112 -0.054000 -v -0.668387 0.522677 -0.054000 -v -0.692464 0.510904 -0.054000 -v -0.709726 0.495238 -0.054000 -v -0.720123 0.475122 -0.054000 -v -0.723600 0.450000 -0.054000 -v -0.387500 0.534375 -0.056250 -v -0.448238 0.534291 -0.056250 -v -0.502900 0.533700 -0.056250 -v -0.551413 0.532097 -0.056250 -v -0.593700 0.528975 -0.056250 -v -0.629688 0.523828 -0.056250 -v -0.659300 0.516150 -0.056250 -v -0.682463 0.505434 -0.056250 -v -0.699100 0.491175 -0.056250 -v -0.709137 0.472866 -0.056250 -v -0.712500 0.450000 -0.056250 -v -0.391200 0.526050 -0.054000 -v -0.448826 0.525974 -0.054000 -v -0.500798 0.525442 -0.054000 -v -0.547021 0.523997 -0.054000 -v -0.587395 0.521183 -0.054000 -v -0.621825 0.516544 -0.054000 -v -0.650213 0.509623 -0.054000 -v -0.672461 0.499965 -0.054000 -v -0.688474 0.487112 -0.054000 -v -0.698152 0.470610 -0.054000 -v -0.701400 0.450000 -0.054000 -v -0.394600 0.518400 -0.047250 -v -0.449366 0.518332 -0.047250 -v -0.498867 0.517853 -0.047250 -v -0.542985 0.516553 -0.047250 -v -0.581602 0.514022 -0.047250 -v -0.614600 0.509850 -0.047250 -v -0.641862 0.503626 -0.047250 -v -0.663271 0.494939 -0.047250 -v -0.678709 0.483379 -0.047250 -v -0.688058 0.468536 -0.047250 -v -0.691200 0.450000 -0.047250 -v -0.397400 0.512100 -0.036000 -v -0.449812 0.512038 -0.036000 -v -0.497277 0.511603 -0.036000 -v -0.539661 0.510423 -0.036000 -v -0.576830 0.508126 -0.036000 -v -0.608650 0.504338 -0.036000 -v -0.634986 0.498686 -0.036000 -v -0.655703 0.490800 -0.036000 -v -0.670667 0.480305 -0.036000 -v -0.679744 0.466829 -0.036000 -v -0.682800 0.450000 -0.036000 -v -0.399300 0.507825 -0.020250 -v -0.450114 0.507767 -0.020250 -v -0.496198 0.507362 -0.020250 -v -0.537406 0.506264 -0.020250 -v -0.573593 0.504124 -0.020250 -v -0.604612 0.500597 -0.020250 -v -0.630319 0.495335 -0.020250 -v -0.650567 0.487991 -0.020250 -v -0.665210 0.478219 -0.020250 -v -0.674103 0.465671 -0.020250 -v -0.677100 0.450000 -0.020250 -v -0.675544 0.431130 0.020250 -v -0.673475 0.431550 -0.000000 -v -0.670777 0.409652 0.020250 -v -0.668800 0.410400 -0.000000 -v -0.662651 0.386226 0.020250 -v -0.660825 0.387225 -0.000000 -v -0.651018 0.361507 0.020250 -v -0.649400 0.362700 -0.000000 -v -0.635731 0.336155 0.020250 -v -0.634375 0.337500 -0.000000 -v -0.616642 0.310826 0.020250 -v -0.615600 0.312300 -0.000000 -v -0.593602 0.286178 0.020250 -v -0.592925 0.287775 -0.000000 -v -0.566463 0.262870 0.020250 -v -0.566200 0.264600 -0.000000 -v -0.535079 0.241558 0.020250 -v -0.535275 0.243450 -0.000000 -v -0.499300 0.222900 0.020250 -v -0.500000 0.225000 -0.000000 -v -0.681159 0.429989 0.036000 -v -0.676142 0.407623 0.036000 -v -0.667607 0.383513 0.036000 -v -0.655411 0.358270 0.036000 -v -0.639412 0.332503 0.036000 -v -0.619469 0.306824 0.036000 -v -0.595438 0.281844 0.036000 -v -0.567178 0.258173 0.036000 -v -0.534546 0.236421 0.036000 -v -0.497400 0.217200 0.036000 -v -0.689435 0.428308 0.047250 -v -0.684050 0.404633 0.047250 -v -0.674911 0.379516 0.047250 -v -0.661885 0.353498 0.047250 -v -0.644837 0.327122 0.047250 -v -0.623635 0.300928 0.047250 -v -0.598144 0.275457 0.047250 -v -0.568230 0.251251 0.047250 -v -0.533760 0.228852 0.047250 -v -0.494600 0.208800 0.047250 -v -0.699483 0.426267 0.054000 -v -0.693651 0.401002 0.054000 -v -0.683780 0.374662 0.054000 -v -0.669746 0.347705 0.054000 -v -0.651425 0.320588 0.054000 -v -0.628694 0.293767 0.054000 -v -0.601430 0.267701 0.054000 -v -0.569509 0.242846 0.054000 -v -0.532807 0.219660 0.054000 -v -0.491200 0.198600 0.054000 -v -0.710419 0.424045 0.056250 -v -0.704100 0.397050 0.056250 -v -0.693431 0.369380 0.056250 -v -0.678300 0.341400 0.056250 -v -0.658594 0.313477 0.056250 -v -0.634200 0.285975 0.056250 -v -0.605006 0.259261 0.056250 -v -0.570900 0.233700 0.056250 -v -0.531769 0.209658 0.056250 -v -0.487500 0.187500 0.056250 -v -0.721354 0.421824 0.054000 -v -0.714549 0.393098 0.054000 -v -0.703083 0.364097 0.054000 -v -0.686854 0.335095 0.054000 -v -0.665763 0.306366 0.054000 -v -0.639706 0.278183 0.054000 -v -0.608582 0.250821 0.054000 -v -0.572291 0.224554 0.054000 -v -0.530731 0.199655 0.054000 -v -0.483800 0.176400 0.054000 -v -0.731403 0.419783 0.047250 -v -0.724150 0.389467 0.047250 -v -0.711952 0.359244 0.047250 -v -0.694715 0.329302 0.047250 -v -0.672350 0.299831 0.047250 -v -0.644765 0.271022 0.047250 -v -0.611868 0.243065 0.047250 -v -0.573570 0.216149 0.047250 -v -0.529777 0.190464 0.047250 -v -0.480400 0.166200 0.047250 -v -0.739678 0.418102 0.036000 -v -0.732058 0.386477 0.036000 -v -0.719255 0.355246 0.036000 -v -0.701189 0.324530 0.036000 -v -0.677775 0.294450 0.036000 -v -0.648931 0.265126 0.036000 -v -0.614575 0.236678 0.036000 -v -0.574622 0.209227 0.036000 -v -0.528992 0.182894 0.036000 -v -0.477600 0.157800 0.036000 -v -0.745294 0.416961 0.020250 -v -0.737423 0.384448 0.020250 -v -0.724212 0.352534 0.020250 -v -0.705582 0.321293 0.020250 -v -0.681456 0.290798 0.020250 -v -0.651758 0.261124 0.020250 -v -0.616411 0.232344 0.020250 -v -0.575337 0.204530 0.020250 -v -0.528459 0.177758 0.020250 -v -0.475700 0.152100 0.020250 -v -0.747363 0.416541 -0.000000 -v -0.739400 0.383700 -0.000000 -v -0.726038 0.351534 -0.000000 -v -0.707200 0.320100 -0.000000 -v -0.682812 0.289453 -0.000000 -v -0.652800 0.259650 -0.000000 -v -0.617087 0.230747 -0.000000 -v -0.575600 0.202800 -0.000000 -v -0.528262 0.175866 -0.000000 -v -0.475000 0.150000 -0.000000 -v -0.745294 0.416961 -0.020250 -v -0.737423 0.384448 -0.020250 -v -0.724212 0.352534 -0.020250 -v -0.705582 0.321293 -0.020250 -v -0.681456 0.290798 -0.020250 -v -0.651758 0.261124 -0.020250 -v -0.616411 0.232344 -0.020250 -v -0.575337 0.204530 -0.020250 -v -0.528459 0.177758 -0.020250 -v -0.475700 0.152100 -0.020250 -v -0.739678 0.418102 -0.036000 -v -0.732058 0.386477 -0.036000 -v -0.719255 0.355246 -0.036000 -v -0.701189 0.324530 -0.036000 -v -0.677775 0.294450 -0.036000 -v -0.648931 0.265126 -0.036000 -v -0.614575 0.236678 -0.036000 -v -0.574622 0.209227 -0.036000 -v -0.528992 0.182894 -0.036000 -v -0.477600 0.157800 -0.036000 -v -0.731403 0.419783 -0.047250 -v -0.724150 0.389467 -0.047250 -v -0.711952 0.359244 -0.047250 -v -0.694715 0.329302 -0.047250 -v -0.672350 0.299831 -0.047250 -v -0.644765 0.271022 -0.047250 -v -0.611868 0.243065 -0.047250 -v -0.573570 0.216149 -0.047250 -v -0.529777 0.190464 -0.047250 -v -0.480400 0.166200 -0.047250 -v -0.721354 0.421824 -0.054000 -v -0.714549 0.393098 -0.054000 -v -0.703083 0.364097 -0.054000 -v -0.686854 0.335095 -0.054000 -v -0.665763 0.306366 -0.054000 -v -0.639706 0.278183 -0.054000 -v -0.608582 0.250821 -0.054000 -v -0.572291 0.224554 -0.054000 -v -0.530731 0.199655 -0.054000 -v -0.483800 0.176400 -0.054000 -v -0.710419 0.424045 -0.056250 -v -0.704100 0.397050 -0.056250 -v -0.693431 0.369380 -0.056250 -v -0.678300 0.341400 -0.056250 -v -0.658594 0.313477 -0.056250 -v -0.634200 0.285975 -0.056250 -v -0.605006 0.259261 -0.056250 -v -0.570900 0.233700 -0.056250 -v -0.531769 0.209658 -0.056250 -v -0.487500 0.187500 -0.056250 -v -0.699483 0.426267 -0.054000 -v -0.693651 0.401002 -0.054000 -v -0.683780 0.374662 -0.054000 -v -0.669746 0.347705 -0.054000 -v -0.651425 0.320588 -0.054000 -v -0.628694 0.293767 -0.054000 -v -0.601430 0.267701 -0.054000 -v -0.569509 0.242846 -0.054000 -v -0.532807 0.219660 -0.054000 -v -0.491200 0.198600 -0.054000 -v -0.689435 0.428308 -0.047250 -v -0.684050 0.404633 -0.047250 -v -0.674911 0.379516 -0.047250 -v -0.661885 0.353498 -0.047250 -v -0.644837 0.327122 -0.047250 -v -0.623635 0.300928 -0.047250 -v -0.598144 0.275457 -0.047250 -v -0.568230 0.251251 -0.047250 -v -0.533760 0.228852 -0.047250 -v -0.494600 0.208800 -0.047250 -v -0.681159 0.429989 -0.036000 -v -0.676142 0.407623 -0.036000 -v -0.667607 0.383513 -0.036000 -v -0.655411 0.358270 -0.036000 -v -0.639412 0.332503 -0.036000 -v -0.619469 0.306824 -0.036000 -v -0.595438 0.281844 -0.036000 -v -0.567178 0.258173 -0.036000 -v -0.534546 0.236421 -0.036000 -v -0.497400 0.217200 -0.036000 -v -0.675544 0.431130 -0.020250 -v -0.670777 0.409652 -0.020250 -v -0.662651 0.386226 -0.020250 -v -0.651018 0.361507 -0.020250 -v -0.635731 0.336155 -0.020250 -v -0.616642 0.310826 -0.020250 -v -0.593602 0.286178 -0.020250 -v -0.566463 0.262870 -0.020250 -v -0.535079 0.241558 -0.020250 -v -0.499300 0.222900 -0.020250 -v 0.425000 0.356250 -0.000000 -v 0.425000 0.350475 0.044550 -v 0.484849 0.355805 0.043775 -v 0.483975 0.361050 -0.000000 -v 0.529245 0.369780 0.041672 -v 0.527800 0.374400 -0.000000 -v 0.561114 0.390793 0.038572 -v 0.559325 0.394725 -0.000000 -v 0.583382 0.417237 0.034808 -v 0.581400 0.420450 -0.000000 -v 0.598975 0.447506 0.030712 -v 0.596875 0.450000 -0.000000 -v 0.610818 0.479994 0.026617 -v 0.608600 0.481800 -0.000000 -v 0.621836 0.513094 0.022853 -v 0.619425 0.514275 -0.000000 -v 0.634955 0.545199 0.019753 -v 0.632200 0.545850 -0.000000 -v 0.653101 0.574703 0.017650 -v 0.649775 0.574950 -0.000000 -v 0.679200 0.600000 0.016875 -v 0.675000 0.600000 -0.000000 -v 0.425000 0.334800 0.079200 -v 0.487220 0.341569 0.077822 -v 0.533166 0.357240 0.074083 -v 0.565971 0.380120 0.068573 -v 0.588763 0.408516 0.061882 -v 0.604675 0.440737 0.054600 -v 0.616837 0.475092 0.047318 -v 0.628379 0.509888 0.040627 -v 0.642434 0.543432 0.035117 -v 0.662130 0.574034 0.031378 -v 0.690600 0.600000 0.030000 -v 0.425000 0.311700 0.103950 -v 0.490714 0.320590 0.102142 -v 0.538946 0.338760 0.097234 -v 0.573127 0.364390 0.090002 -v 0.596693 0.395664 0.081220 -v 0.613075 0.430762 0.071662 -v 0.625707 0.467868 0.062105 -v 0.638023 0.505162 0.053323 -v 0.653454 0.540828 0.046091 -v 0.675436 0.573047 0.041183 -v 0.707400 0.600000 0.039375 -v 0.425000 0.283650 0.118800 -v 0.494957 0.295116 0.116734 -v 0.545963 0.316320 0.111125 -v 0.581818 0.345291 0.102859 -v 0.606322 0.380058 0.092822 -v 0.623275 0.418650 0.081900 -v 0.636478 0.459096 0.070978 -v 0.649732 0.499425 0.060941 -v 0.666837 0.537666 0.052675 -v 0.691593 0.571848 0.047066 -v 0.727800 0.600000 0.045000 -v 0.425000 0.253125 0.123750 -v 0.499575 0.267394 0.121597 -v 0.553600 0.291900 0.115755 -v 0.591275 0.324506 0.107145 -v 0.616800 0.363075 0.096690 -v 0.634375 0.405469 0.085312 -v 0.648200 0.449550 0.073935 -v 0.662475 0.493181 0.063480 -v 0.681400 0.534225 0.054870 -v 0.709175 0.570544 0.049027 -v 0.750000 0.600000 0.046875 -v 0.425000 0.222600 0.118800 -v 0.504193 0.239671 0.116734 -v 0.561237 0.267480 0.111125 -v 0.600732 0.303721 0.102859 -v 0.627278 0.346092 0.092822 -v 0.645475 0.392287 0.081900 -v 0.659922 0.440004 0.070978 -v 0.675218 0.486938 0.060941 -v 0.695963 0.530784 0.052675 -v 0.726757 0.569240 0.047066 -v 0.772200 0.600000 0.045000 -v 0.425000 0.194550 0.103950 -v 0.508436 0.214197 0.102142 -v 0.568254 0.245040 0.097234 -v 0.609423 0.284622 0.090002 -v 0.636907 0.330486 0.081220 -v 0.655675 0.380175 0.071662 -v 0.670693 0.431232 0.062105 -v 0.686927 0.481200 0.053323 -v 0.709346 0.527622 0.046091 -v 0.742914 0.568041 0.041183 -v 0.792600 0.600000 0.039375 -v 0.425000 0.171450 0.079200 -v 0.511930 0.193218 0.077822 -v 0.574034 0.226560 0.074083 -v 0.616579 0.268893 0.068573 -v 0.644837 0.317634 0.061882 -v 0.664075 0.370200 0.054600 -v 0.679563 0.424008 0.047318 -v 0.696571 0.476475 0.040627 -v 0.720366 0.525018 0.035117 -v 0.756220 0.567054 0.031378 -v 0.809400 0.600000 0.030000 -v 0.425000 0.155775 0.044550 -v 0.514301 0.178982 0.043775 -v 0.577955 0.214020 0.041672 -v 0.621436 0.258220 0.038572 -v 0.650218 0.308913 0.034808 -v 0.669775 0.363431 0.030712 -v 0.685582 0.419106 0.026617 -v 0.703114 0.473269 0.022853 -v 0.727845 0.523251 0.019753 -v 0.765249 0.566384 0.017650 -v 0.820800 0.600000 0.016875 -v 0.425000 0.150000 -0.000000 -v 0.515175 0.173738 -0.000000 -v 0.579400 0.209400 -0.000000 -v 0.623225 0.254288 -0.000000 -v 0.652200 0.305700 -0.000000 -v 0.671875 0.360938 -0.000000 -v 0.687800 0.417300 -0.000000 -v 0.705525 0.472088 -0.000000 -v 0.730600 0.522600 -0.000000 -v 0.768575 0.566138 -0.000000 -v 0.825000 0.600000 -0.000000 -v 0.425000 0.155775 -0.044550 -v 0.514301 0.178982 -0.043775 -v 0.577955 0.214020 -0.041672 -v 0.621436 0.258220 -0.038572 -v 0.650218 0.308913 -0.034808 -v 0.669775 0.363431 -0.030713 -v 0.685582 0.419106 -0.026617 -v 0.703114 0.473269 -0.022853 -v 0.727845 0.523251 -0.019753 -v 0.765249 0.566384 -0.017650 -v 0.820800 0.600000 -0.016875 -v 0.425000 0.171450 -0.079200 -v 0.511930 0.193218 -0.077822 -v 0.574034 0.226560 -0.074083 -v 0.616579 0.268893 -0.068573 -v 0.644837 0.317634 -0.061882 -v 0.664075 0.370200 -0.054600 -v 0.679563 0.424008 -0.047318 -v 0.696571 0.476475 -0.040627 -v 0.720366 0.525018 -0.035117 -v 0.756220 0.567054 -0.031378 -v 0.809400 0.600000 -0.030000 -v 0.425000 0.194550 -0.103950 -v 0.508436 0.214197 -0.102142 -v 0.568254 0.245040 -0.097234 -v 0.609423 0.284622 -0.090002 -v 0.636907 0.330486 -0.081220 -v 0.655675 0.380175 -0.071663 -v 0.670693 0.431232 -0.062105 -v 0.686927 0.481200 -0.053323 -v 0.709346 0.527622 -0.046091 -v 0.742914 0.568041 -0.041183 -v 0.792600 0.600000 -0.039375 -v 0.425000 0.222600 -0.118800 -v 0.504193 0.239671 -0.116734 -v 0.561237 0.267480 -0.111125 -v 0.600732 0.303721 -0.102859 -v 0.627278 0.346092 -0.092822 -v 0.645475 0.392287 -0.081900 -v 0.659922 0.440004 -0.070978 -v 0.675218 0.486938 -0.060941 -v 0.695963 0.530784 -0.052675 -v 0.726757 0.569240 -0.047066 -v 0.772200 0.600000 -0.045000 -v 0.425000 0.253125 -0.123750 -v 0.499575 0.267394 -0.121598 -v 0.553600 0.291900 -0.115755 -v 0.591275 0.324506 -0.107145 -v 0.616800 0.363075 -0.096690 -v 0.634375 0.405469 -0.085313 -v 0.648200 0.449550 -0.073935 -v 0.662475 0.493181 -0.063480 -v 0.681400 0.534225 -0.054870 -v 0.709175 0.570544 -0.049028 -v 0.750000 0.600000 -0.046875 -v 0.425000 0.283650 -0.118800 -v 0.494957 0.295116 -0.116734 -v 0.545963 0.316320 -0.111125 -v 0.581818 0.345291 -0.102859 -v 0.606322 0.380058 -0.092822 -v 0.623275 0.418650 -0.081900 -v 0.636478 0.459096 -0.070978 -v 0.649732 0.499425 -0.060941 -v 0.666837 0.537666 -0.052675 -v 0.691593 0.571848 -0.047066 -v 0.727800 0.600000 -0.045000 -v 0.425000 0.311700 -0.103950 -v 0.490714 0.320591 -0.102142 -v 0.538946 0.338760 -0.097234 -v 0.573127 0.364390 -0.090002 -v 0.596693 0.395664 -0.081220 -v 0.613075 0.430762 -0.071663 -v 0.625707 0.467868 -0.062105 -v 0.638023 0.505163 -0.053323 -v 0.653454 0.540828 -0.046091 -v 0.675436 0.573047 -0.041183 -v 0.707400 0.600000 -0.039375 -v 0.425000 0.334800 -0.079200 -v 0.487220 0.341570 -0.077822 -v 0.533166 0.357240 -0.074083 -v 0.565971 0.380120 -0.068573 -v 0.588763 0.408516 -0.061882 -v 0.604675 0.440738 -0.054600 -v 0.616837 0.475092 -0.047318 -v 0.628379 0.509888 -0.040627 -v 0.642434 0.543432 -0.035117 -v 0.662130 0.574034 -0.031378 -v 0.690600 0.600000 -0.030000 -v 0.425000 0.350475 -0.044550 -v 0.484849 0.355805 -0.043775 -v 0.529245 0.369780 -0.041672 -v 0.561114 0.390793 -0.038572 -v 0.583382 0.417237 -0.034808 -v 0.598975 0.447506 -0.030713 -v 0.610818 0.479994 -0.026617 -v 0.621836 0.513094 -0.022853 -v 0.634955 0.545199 -0.019753 -v 0.653101 0.574703 -0.017650 -v 0.679200 0.600000 -0.016875 -v 0.686852 0.605101 0.016686 -v 0.682450 0.605062 -0.000000 -v 0.694091 0.609076 0.016173 -v 0.689600 0.609000 -0.000000 -v 0.700632 0.611920 0.015417 -v 0.696150 0.611812 -0.000000 -v 0.706188 0.613632 0.014499 -v 0.701800 0.613500 -0.000000 -v 0.710472 0.614210 0.013500 -v 0.706250 0.614062 -0.000000 -v 0.713198 0.613651 0.012501 -v 0.709200 0.613500 -0.000000 -v 0.714081 0.611953 0.011583 -v 0.710350 0.611812 -0.000000 -v 0.712833 0.609113 0.010827 -v 0.709400 0.609000 -0.000000 -v 0.709168 0.605130 0.010314 -v 0.706050 0.605062 -0.000000 -v 0.702800 0.600000 0.010125 -v 0.700000 0.600000 -0.000000 -v 0.698800 0.605207 0.029664 -v 0.706282 0.609281 0.028752 -v 0.712797 0.612212 0.027408 -v 0.718097 0.613991 0.025776 -v 0.721931 0.614611 0.024000 -v 0.724051 0.614062 0.022224 -v 0.724207 0.612335 0.020592 -v 0.722150 0.609421 0.019248 -v 0.717631 0.605313 0.018336 -v 0.710400 0.600000 0.018000 -v 0.716407 0.605363 0.038934 -v 0.724246 0.609583 0.037737 -v 0.730725 0.612642 0.035973 -v 0.735647 0.614521 0.033831 -v 0.738819 0.615202 0.031500 -v 0.740045 0.614666 0.029169 -v 0.739131 0.612897 0.027027 -v 0.735882 0.609875 0.025263 -v 0.730103 0.605582 0.024066 -v 0.721600 0.600000 0.023625 -v 0.737787 0.605553 0.044496 -v 0.746061 0.609950 0.043128 -v 0.752494 0.613164 0.041112 -v 0.756958 0.615163 0.038664 -v 0.759325 0.615919 0.036000 -v 0.759466 0.615401 0.033336 -v 0.757252 0.613580 0.030888 -v 0.752555 0.610426 0.028872 -v 0.745247 0.605909 0.027504 -v 0.735200 0.600000 0.027000 -v 0.761053 0.605759 0.046350 -v 0.769800 0.610350 0.044925 -v 0.776184 0.613732 0.042825 -v 0.780150 0.615862 0.040275 -v 0.781641 0.616699 0.037500 -v 0.780600 0.616200 0.034725 -v 0.776972 0.614323 0.032175 -v 0.770700 0.611025 0.030075 -v 0.761728 0.606265 0.028650 -v 0.750000 0.600000 0.028125 -v 0.784320 0.605965 0.044496 -v 0.793539 0.610750 0.043128 -v 0.799875 0.614300 0.041112 -v 0.803342 0.616562 0.038664 -v 0.803956 0.617480 0.036000 -v 0.801734 0.616999 0.033336 -v 0.796692 0.615066 0.030888 -v 0.788845 0.611624 0.028872 -v 0.778209 0.606621 0.027504 -v 0.764800 0.600000 0.027000 -v 0.805700 0.606154 0.038934 -v 0.815354 0.611117 0.037737 -v 0.821644 0.614822 0.035973 -v 0.824653 0.617204 0.033831 -v 0.824463 0.618197 0.031500 -v 0.821155 0.617734 0.029169 -v 0.814813 0.615748 0.027027 -v 0.805518 0.612175 0.025263 -v 0.793353 0.606948 0.024066 -v 0.778400 0.600000 0.023625 -v 0.823307 0.606310 0.029664 -v 0.833318 0.611419 0.028752 -v 0.839572 0.615252 0.027408 -v 0.842203 0.617734 0.025776 -v 0.841350 0.618788 0.024000 -v 0.837149 0.618338 0.022224 -v 0.829736 0.616311 0.020592 -v 0.819250 0.612629 0.019248 -v 0.805825 0.607217 0.018336 -v 0.789600 0.600000 0.018000 -v 0.835254 0.606416 0.016686 -v 0.845509 0.611624 0.016173 -v 0.851737 0.615544 0.015417 -v 0.854112 0.618093 0.014499 -v 0.852809 0.619188 0.013500 -v 0.848002 0.618749 0.012501 -v 0.839863 0.616692 0.011583 -v 0.828567 0.612937 0.010827 -v 0.814288 0.607400 0.010314 -v 0.797200 0.600000 0.010125 -v 0.839656 0.606455 -0.000000 -v 0.850000 0.611700 -0.000000 -v 0.856219 0.615652 -0.000000 -v 0.858500 0.618225 -0.000000 -v 0.857031 0.619336 -0.000000 -v 0.852000 0.618900 -0.000000 -v 0.843594 0.616833 -0.000000 -v 0.832000 0.613050 -0.000000 -v 0.817406 0.607467 -0.000000 -v 0.800000 0.600000 -0.000000 -v 0.835254 0.606416 -0.016686 -v 0.845509 0.611624 -0.016173 -v 0.851737 0.615544 -0.015417 -v 0.854112 0.618093 -0.014499 -v 0.852809 0.619188 -0.013500 -v 0.848002 0.618749 -0.012501 -v 0.839863 0.616692 -0.011583 -v 0.828567 0.612937 -0.010827 -v 0.814288 0.607400 -0.010314 -v 0.797200 0.600000 -0.010125 -v 0.823307 0.606310 -0.029664 -v 0.833318 0.611419 -0.028752 -v 0.839572 0.615252 -0.027408 -v 0.842203 0.617734 -0.025776 -v 0.841350 0.618788 -0.024000 -v 0.837149 0.618338 -0.022224 -v 0.829736 0.616311 -0.020592 -v 0.819250 0.612629 -0.019248 -v 0.805825 0.607217 -0.018336 -v 0.789600 0.600000 -0.018000 -v 0.805700 0.606154 -0.038934 -v 0.815354 0.611117 -0.037737 -v 0.821644 0.614822 -0.035973 -v 0.824653 0.617204 -0.033831 -v 0.824463 0.618197 -0.031500 -v 0.821155 0.617734 -0.029169 -v 0.814813 0.615748 -0.027027 -v 0.805518 0.612175 -0.025263 -v 0.793353 0.606948 -0.024066 -v 0.778400 0.600000 -0.023625 -v 0.784320 0.605965 -0.044496 -v 0.793539 0.610750 -0.043128 -v 0.799875 0.614300 -0.041112 -v 0.803342 0.616562 -0.038664 -v 0.803956 0.617480 -0.036000 -v 0.801734 0.616999 -0.033336 -v 0.796692 0.615066 -0.030888 -v 0.788845 0.611624 -0.028872 -v 0.778209 0.606621 -0.027504 -v 0.764800 0.600000 -0.027000 -v 0.761053 0.605759 -0.046350 -v 0.769800 0.610350 -0.044925 -v 0.776184 0.613732 -0.042825 -v 0.780150 0.615862 -0.040275 -v 0.781641 0.616699 -0.037500 -v 0.780600 0.616200 -0.034725 -v 0.776972 0.614323 -0.032175 -v 0.770700 0.611025 -0.030075 -v 0.761728 0.606265 -0.028650 -v 0.750000 0.600000 -0.028125 -v 0.737787 0.605553 -0.044496 -v 0.746061 0.609950 -0.043128 -v 0.752494 0.613164 -0.041112 -v 0.756958 0.615163 -0.038664 -v 0.759325 0.615919 -0.036000 -v 0.759466 0.615401 -0.033336 -v 0.757252 0.613580 -0.030888 -v 0.752555 0.610426 -0.028872 -v 0.745247 0.605909 -0.027504 -v 0.735200 0.600000 -0.027000 -v 0.716407 0.605363 -0.038934 -v 0.724246 0.609583 -0.037737 -v 0.730725 0.612642 -0.035973 -v 0.735647 0.614521 -0.033831 -v 0.738819 0.615202 -0.031500 -v 0.740045 0.614666 -0.029169 -v 0.739131 0.612897 -0.027027 -v 0.735882 0.609875 -0.025263 -v 0.730103 0.605582 -0.024066 -v 0.721600 0.600000 -0.023625 -v 0.698799 0.605207 -0.029664 -v 0.706282 0.609281 -0.028752 -v 0.712797 0.612212 -0.027408 -v 0.718097 0.613991 -0.025776 -v 0.721931 0.614611 -0.024000 -v 0.724051 0.614062 -0.022224 -v 0.724207 0.612335 -0.020592 -v 0.722150 0.609421 -0.019248 -v 0.717631 0.605313 -0.018336 -v 0.710400 0.600000 -0.018000 -v 0.686852 0.605101 -0.016686 -v 0.694091 0.609076 -0.016173 -v 0.700632 0.611920 -0.015417 -v 0.706188 0.613632 -0.014499 -v 0.710472 0.614210 -0.013500 -v 0.713198 0.613651 -0.012501 -v 0.714081 0.611953 -0.011583 -v 0.712833 0.609113 -0.010827 -v 0.709168 0.605130 -0.010314 -v 0.702800 0.600000 -0.010125 -v 0.000000 0.787500 -0.000000 -v 0.048027 0.785363 0.008012 -v 0.048650 0.785363 -0.000000 -v 0.076211 0.779400 0.012714 -v 0.077200 0.779400 -0.000000 -v 0.088403 0.770288 0.014747 -v 0.089550 0.770288 -0.000000 -v 0.088452 0.758700 0.014754 -v 0.089600 0.758700 -0.000000 -v 0.080209 0.745312 0.013377 -v 0.081250 0.745312 -0.000000 -v 0.067523 0.730800 0.011258 -v 0.068400 0.730800 -0.000000 -v 0.054245 0.715837 0.009039 -v 0.054950 0.715837 -0.000000 -v 0.044224 0.701100 0.007362 -v 0.044800 0.701100 -0.000000 -v 0.041311 0.687262 0.006870 -v 0.041850 0.687262 -0.000000 -v 0.049356 0.675000 0.008204 -v 0.050000 0.675000 -0.000000 -v 0.046218 0.785363 0.015568 -v 0.073340 0.779400 0.024704 -v 0.085072 0.770288 0.028655 -v 0.085119 0.758700 0.028669 -v 0.077186 0.745312 0.025994 -v 0.064977 0.730800 0.021878 -v 0.052198 0.715837 0.017567 -v 0.042554 0.701100 0.014311 -v 0.039749 0.687262 0.013357 -v 0.047488 0.675000 0.015952 -v 0.043314 0.785363 0.022577 -v 0.068732 0.779400 0.035825 -v 0.079727 0.770288 0.041555 -v 0.079770 0.758700 0.041576 -v 0.072335 0.745312 0.037698 -v 0.060892 0.730800 0.031730 -v 0.048915 0.715837 0.025481 -v 0.039874 0.701100 0.020762 -v 0.037242 0.687262 0.019381 -v 0.044492 0.675000 0.023148 -v 0.039407 0.785363 0.028947 -v 0.062532 0.779400 0.045933 -v 0.072535 0.770288 0.053281 -v 0.072574 0.758700 0.053308 -v 0.065808 0.745312 0.048337 -v 0.055396 0.730800 0.040686 -v 0.044497 0.715837 0.032677 -v 0.036270 0.701100 0.026628 -v 0.033872 0.687262 0.024861 -v 0.040464 0.675000 0.029696 -v 0.034587 0.785363 0.034587 -v 0.054884 0.779400 0.054884 -v 0.063663 0.770288 0.063663 -v 0.063697 0.758700 0.063697 -v 0.057758 0.745312 0.057758 -v 0.048618 0.730800 0.048618 -v 0.039050 0.715837 0.039050 -v 0.031826 0.701100 0.031826 -v 0.029719 0.687262 0.029718 -v 0.035500 0.675000 0.035500 -v 0.028947 0.785363 0.039406 -v 0.045934 0.779400 0.062532 -v 0.053281 0.770288 0.072534 -v 0.053308 0.758700 0.072574 -v 0.048337 0.745312 0.065808 -v 0.040686 0.730800 0.055396 -v 0.032677 0.715837 0.044497 -v 0.026628 0.701100 0.036269 -v 0.024861 0.687262 0.033872 -v 0.029696 0.675000 0.040464 -v 0.022577 0.785363 0.043314 -v 0.035825 0.779400 0.068732 -v 0.041555 0.770288 0.079727 -v 0.041577 0.758700 0.079770 -v 0.037698 0.745312 0.072335 -v 0.031730 0.730800 0.060892 -v 0.025481 0.715837 0.048914 -v 0.020762 0.701100 0.039874 -v 0.019381 0.687262 0.037242 -v 0.023148 0.675000 0.044492 -v 0.015568 0.785363 0.046217 -v 0.024704 0.779400 0.073340 -v 0.028655 0.770288 0.085072 -v 0.028669 0.758700 0.085119 -v 0.025994 0.745312 0.077186 -v 0.021878 0.730800 0.064977 -v 0.017568 0.715837 0.052198 -v 0.014311 0.701100 0.042554 -v 0.013357 0.687262 0.039749 -v 0.015952 0.675000 0.047488 -v 0.008012 0.785363 0.048027 -v 0.012714 0.779400 0.076211 -v 0.014747 0.770288 0.088402 -v 0.014754 0.758700 0.088452 -v 0.013377 0.745312 0.080208 -v 0.011258 0.730800 0.067523 -v 0.009039 0.715837 0.054245 -v 0.007362 0.701100 0.044224 -v 0.006870 0.687262 0.041311 -v 0.008204 0.675000 0.049356 -v -0.000000 0.785363 0.048650 -v -0.000000 0.779400 0.077200 -v -0.000000 0.770288 0.089550 -v -0.000000 0.758700 0.089600 -v -0.000000 0.745312 0.081250 -v -0.000000 0.730800 0.068400 -v -0.000000 0.715837 0.054950 -v -0.000000 0.701100 0.044800 -v -0.000000 0.687262 0.041850 -v -0.000000 0.675000 0.050000 -v -0.008012 0.785363 0.048027 -v -0.012714 0.779400 0.076211 -v -0.014747 0.770288 0.088402 -v -0.014754 0.758700 0.088452 -v -0.013377 0.745312 0.080208 -v -0.011258 0.730800 0.067523 -v -0.009039 0.715837 0.054245 -v -0.007362 0.701100 0.044224 -v -0.006870 0.687262 0.041311 -v -0.008204 0.675000 0.049356 -v -0.015568 0.785363 0.046217 -v -0.024704 0.779400 0.073340 -v -0.028655 0.770288 0.085072 -v -0.028669 0.758700 0.085119 -v -0.025994 0.745312 0.077186 -v -0.021878 0.730800 0.064977 -v -0.017568 0.715837 0.052198 -v -0.014311 0.701100 0.042554 -v -0.013357 0.687262 0.039749 -v -0.015952 0.675000 0.047488 -v -0.022577 0.785363 0.043314 -v -0.035825 0.779400 0.068732 -v -0.041555 0.770288 0.079727 -v -0.041577 0.758700 0.079770 -v -0.037698 0.745312 0.072335 -v -0.031730 0.730800 0.060892 -v -0.025481 0.715837 0.048914 -v -0.020762 0.701100 0.039874 -v -0.019381 0.687262 0.037242 -v -0.023148 0.675000 0.044492 -v -0.028947 0.785363 0.039406 -v -0.045934 0.779400 0.062532 -v -0.053281 0.770288 0.072534 -v -0.053308 0.758700 0.072574 -v -0.048337 0.745312 0.065808 -v -0.040686 0.730800 0.055396 -v -0.032677 0.715837 0.044497 -v -0.026628 0.701100 0.036269 -v -0.024861 0.687262 0.033872 -v -0.029696 0.675000 0.040464 -v -0.034587 0.785363 0.034587 -v -0.054884 0.779400 0.054884 -v -0.063663 0.770288 0.063663 -v -0.063697 0.758700 0.063697 -v -0.057758 0.745312 0.057758 -v -0.048618 0.730800 0.048618 -v -0.039050 0.715837 0.039050 -v -0.031826 0.701100 0.031826 -v -0.029719 0.687262 0.029718 -v -0.035500 0.675000 0.035500 -v -0.039407 0.785363 0.028947 -v -0.062532 0.779400 0.045933 -v -0.072535 0.770288 0.053281 -v -0.072574 0.758700 0.053308 -v -0.065808 0.745312 0.048337 -v -0.055396 0.730800 0.040686 -v -0.044497 0.715837 0.032677 -v -0.036270 0.701100 0.026628 -v -0.033872 0.687262 0.024861 -v -0.040464 0.675000 0.029696 -v -0.043314 0.785363 0.022576 -v -0.068732 0.779400 0.035825 -v -0.079727 0.770288 0.041555 -v -0.079770 0.758700 0.041576 -v -0.072335 0.745312 0.037698 -v -0.060892 0.730800 0.031730 -v -0.048915 0.715837 0.025481 -v -0.039874 0.701100 0.020762 -v -0.037242 0.687262 0.019381 -v -0.044492 0.675000 0.023148 -v -0.046218 0.785363 0.015568 -v -0.073340 0.779400 0.024704 -v -0.085072 0.770288 0.028655 -v -0.085119 0.758700 0.028669 -v -0.077186 0.745312 0.025994 -v -0.064977 0.730800 0.021878 -v -0.052198 0.715837 0.017567 -v -0.042554 0.701100 0.014311 -v -0.039749 0.687262 0.013357 -v -0.047488 0.675000 0.015952 -v -0.048027 0.785363 0.008012 -v -0.076211 0.779400 0.012714 -v -0.088403 0.770288 0.014747 -v -0.088452 0.758700 0.014754 -v -0.080209 0.745312 0.013377 -v -0.067523 0.730800 0.011258 -v -0.054245 0.715837 0.009039 -v -0.044224 0.701100 0.007362 -v -0.041311 0.687262 0.006870 -v -0.049356 0.675000 0.008204 -v -0.048650 0.785363 -0.000000 -v -0.077200 0.779400 -0.000000 -v -0.089550 0.770288 -0.000000 -v -0.089600 0.758700 -0.000000 -v -0.081250 0.745312 -0.000000 -v -0.068400 0.730800 -0.000000 -v -0.054950 0.715837 -0.000000 -v -0.044800 0.701100 -0.000000 -v -0.041850 0.687262 -0.000000 -v -0.050000 0.675000 -0.000000 -v -0.048027 0.785363 -0.008012 -v -0.076211 0.779400 -0.012714 -v -0.088403 0.770288 -0.014747 -v -0.088452 0.758700 -0.014754 -v -0.080209 0.745312 -0.013377 -v -0.067523 0.730800 -0.011258 -v -0.054245 0.715837 -0.009039 -v -0.044224 0.701100 -0.007363 -v -0.041311 0.687262 -0.006870 -v -0.049356 0.675000 -0.008204 -v -0.046218 0.785363 -0.015568 -v -0.073340 0.779400 -0.024704 -v -0.085072 0.770288 -0.028655 -v -0.085119 0.758700 -0.028669 -v -0.077186 0.745312 -0.025994 -v -0.064977 0.730800 -0.021878 -v -0.052198 0.715837 -0.017568 -v -0.042554 0.701100 -0.014312 -v -0.039749 0.687262 -0.013357 -v -0.047488 0.675000 -0.015952 -v -0.043314 0.785363 -0.022577 -v -0.068732 0.779400 -0.035825 -v -0.079727 0.770288 -0.041555 -v -0.079770 0.758700 -0.041577 -v -0.072335 0.745312 -0.037698 -v -0.060892 0.730800 -0.031730 -v -0.048915 0.715837 -0.025481 -v -0.039874 0.701100 -0.020762 -v -0.037242 0.687262 -0.019381 -v -0.044492 0.675000 -0.023148 -v -0.039407 0.785363 -0.028947 -v -0.062532 0.779400 -0.045934 -v -0.072535 0.770288 -0.053281 -v -0.072574 0.758700 -0.053309 -v -0.065808 0.745312 -0.048337 -v -0.055396 0.730800 -0.040686 -v -0.044497 0.715837 -0.032677 -v -0.036270 0.701100 -0.026628 -v -0.033872 0.687262 -0.024861 -v -0.040464 0.675000 -0.029696 -v -0.034587 0.785363 -0.034587 -v -0.054884 0.779400 -0.054884 -v -0.063663 0.770288 -0.063663 -v -0.063697 0.758700 -0.063697 -v -0.057758 0.745312 -0.057758 -v -0.048618 0.730800 -0.048618 -v -0.039050 0.715837 -0.039050 -v -0.031826 0.701100 -0.031826 -v -0.029719 0.687262 -0.029719 -v -0.035500 0.675000 -0.035500 -v -0.028947 0.785363 -0.039407 -v -0.045934 0.779400 -0.062532 -v -0.053281 0.770288 -0.072535 -v -0.053308 0.758700 -0.072574 -v -0.048337 0.745312 -0.065808 -v -0.040686 0.730800 -0.055396 -v -0.032677 0.715837 -0.044497 -v -0.026628 0.701100 -0.036270 -v -0.024861 0.687262 -0.033872 -v -0.029696 0.675000 -0.040464 -v -0.022577 0.785363 -0.043314 -v -0.035825 0.779400 -0.068732 -v -0.041555 0.770288 -0.079727 -v -0.041577 0.758700 -0.079771 -v -0.037698 0.745312 -0.072335 -v -0.031730 0.730800 -0.060892 -v -0.025481 0.715837 -0.048915 -v -0.020762 0.701100 -0.039874 -v -0.019381 0.687262 -0.037242 -v -0.023148 0.675000 -0.044492 -v -0.015568 0.785363 -0.046218 -v -0.024704 0.779400 -0.073340 -v -0.028655 0.770288 -0.085072 -v -0.028669 0.758700 -0.085119 -v -0.025994 0.745312 -0.077186 -v -0.021878 0.730800 -0.064977 -v -0.017568 0.715837 -0.052198 -v -0.014311 0.701100 -0.042554 -v -0.013357 0.687262 -0.039749 -v -0.015952 0.675000 -0.047488 -v -0.008012 0.785363 -0.048027 -v -0.012714 0.779400 -0.076211 -v -0.014747 0.770288 -0.088403 -v -0.014754 0.758700 -0.088452 -v -0.013377 0.745312 -0.080209 -v -0.011258 0.730800 -0.067523 -v -0.009039 0.715837 -0.054245 -v -0.007362 0.701100 -0.044224 -v -0.006870 0.687262 -0.041311 -v -0.008204 0.675000 -0.049356 -v 0.000000 0.785363 -0.048650 -v 0.000000 0.779400 -0.077200 -v 0.000000 0.770288 -0.089550 -v 0.000000 0.758700 -0.089600 -v 0.000000 0.745312 -0.081250 -v 0.000000 0.730800 -0.068400 -v 0.000000 0.715837 -0.054950 -v 0.000000 0.701100 -0.044800 -v 0.000000 0.687262 -0.041850 -v 0.000000 0.675000 -0.050000 -v 0.008012 0.785363 -0.048027 -v 0.012714 0.779400 -0.076211 -v 0.014747 0.770288 -0.088403 -v 0.014754 0.758700 -0.088452 -v 0.013377 0.745312 -0.080209 -v 0.011258 0.730800 -0.067523 -v 0.009039 0.715837 -0.054245 -v 0.007362 0.701100 -0.044224 -v 0.006870 0.687262 -0.041311 -v 0.008204 0.675000 -0.049356 -v 0.015568 0.785363 -0.046218 -v 0.024704 0.779400 -0.073340 -v 0.028655 0.770288 -0.085072 -v 0.028669 0.758700 -0.085119 -v 0.025994 0.745312 -0.077186 -v 0.021878 0.730800 -0.064977 -v 0.017568 0.715837 -0.052198 -v 0.014311 0.701100 -0.042554 -v 0.013357 0.687262 -0.039749 -v 0.015952 0.675000 -0.047488 -v 0.022577 0.785363 -0.043314 -v 0.035825 0.779400 -0.068732 -v 0.041555 0.770288 -0.079727 -v 0.041577 0.758700 -0.079771 -v 0.037698 0.745312 -0.072335 -v 0.031730 0.730800 -0.060892 -v 0.025481 0.715837 -0.048915 -v 0.020762 0.701100 -0.039874 -v 0.019381 0.687262 -0.037242 -v 0.023148 0.675000 -0.044492 -v 0.028947 0.785363 -0.039407 -v 0.045934 0.779400 -0.062532 -v 0.053281 0.770288 -0.072535 -v 0.053308 0.758700 -0.072574 -v 0.048337 0.745312 -0.065808 -v 0.040686 0.730800 -0.055396 -v 0.032677 0.715837 -0.044497 -v 0.026628 0.701100 -0.036270 -v 0.024861 0.687262 -0.033872 -v 0.029696 0.675000 -0.040464 -v 0.034587 0.785363 -0.034587 -v 0.054884 0.779400 -0.054884 -v 0.063663 0.770288 -0.063663 -v 0.063697 0.758700 -0.063697 -v 0.057758 0.745312 -0.057758 -v 0.048618 0.730800 -0.048618 -v 0.039050 0.715837 -0.039050 -v 0.031826 0.701100 -0.031826 -v 0.029719 0.687262 -0.029719 -v 0.035500 0.675000 -0.035500 -v 0.039407 0.785363 -0.028947 -v 0.062532 0.779400 -0.045934 -v 0.072535 0.770288 -0.053281 -v 0.072574 0.758700 -0.053309 -v 0.065808 0.745312 -0.048337 -v 0.055396 0.730800 -0.040686 -v 0.044497 0.715837 -0.032677 -v 0.036270 0.701100 -0.026628 -v 0.033872 0.687262 -0.024861 -v 0.040464 0.675000 -0.029696 -v 0.043314 0.785363 -0.022577 -v 0.068732 0.779400 -0.035825 -v 0.079727 0.770288 -0.041555 -v 0.079770 0.758700 -0.041577 -v 0.072335 0.745312 -0.037698 -v 0.060892 0.730800 -0.031730 -v 0.048915 0.715837 -0.025481 -v 0.039874 0.701100 -0.020762 -v 0.037242 0.687262 -0.019381 -v 0.044492 0.675000 -0.023148 -v 0.046218 0.785363 -0.015568 -v 0.073340 0.779400 -0.024704 -v 0.085072 0.770288 -0.028655 -v 0.085119 0.758700 -0.028669 -v 0.077186 0.745312 -0.025994 -v 0.064977 0.730800 -0.021878 -v 0.052198 0.715837 -0.017568 -v 0.042554 0.701100 -0.014311 -v 0.039749 0.687262 -0.013357 -v 0.047488 0.675000 -0.015952 -v 0.048027 0.785363 -0.008012 -v 0.076211 0.779400 -0.012714 -v 0.088403 0.770288 -0.014747 -v 0.088452 0.758700 -0.014754 -v 0.080209 0.745312 -0.013377 -v 0.067523 0.730800 -0.011258 -v 0.054245 0.715837 -0.009039 -v 0.044224 0.701100 -0.007363 -v 0.041311 0.687262 -0.006870 -v 0.049356 0.675000 -0.008204 -v 0.068950 0.664800 0.011461 -v 0.069850 0.664800 -0.000000 -v 0.096540 0.656400 0.016047 -v 0.097800 0.656400 -0.000000 -v 0.129757 0.649350 0.021568 -v 0.131450 0.649350 -0.000000 -v 0.166231 0.643200 0.027631 -v 0.168400 0.643200 -0.000000 -v 0.203593 0.637500 0.033841 -v 0.206250 0.637500 -0.000000 -v 0.239475 0.631800 0.039806 -v 0.242600 0.631800 -0.000000 -v 0.271507 0.625650 0.045130 -v 0.275050 0.625650 -0.000000 -v 0.297321 0.618600 0.049421 -v 0.301200 0.618600 -0.000000 -v 0.314546 0.610200 0.052284 -v 0.318650 0.610200 -0.000000 -v 0.320814 0.600000 0.053326 -v 0.325000 0.600000 -0.000000 -v 0.066341 0.664800 0.022285 -v 0.092887 0.656400 0.031202 -v 0.124846 0.649350 0.041938 -v 0.159940 0.643200 0.053726 -v 0.195888 0.637500 0.065802 -v 0.230412 0.631800 0.077399 -v 0.261231 0.625650 0.087752 -v 0.286068 0.618600 0.096095 -v 0.302641 0.610200 0.101662 -v 0.308672 0.600000 0.103688 -v 0.062155 0.664800 0.032338 -v 0.087026 0.656400 0.045277 -v 0.116969 0.649350 0.060856 -v 0.149849 0.643200 0.077962 -v 0.183529 0.637500 0.095485 -v 0.215875 0.631800 0.112314 -v 0.244750 0.625650 0.127337 -v 0.268020 0.618600 0.139444 -v 0.283548 0.610200 0.147522 -v 0.289198 0.600000 0.150462 -v 0.056528 0.664800 0.041485 -v 0.079148 0.656400 0.058085 -v 0.106380 0.649350 0.078071 -v 0.136283 0.643200 0.100016 -v 0.166914 0.637500 0.122496 -v 0.196331 0.631800 0.144085 -v 0.222592 0.625650 0.163358 -v 0.243755 0.618600 0.178889 -v 0.257877 0.610200 0.189253 -v 0.263016 0.600000 0.193024 -v 0.049594 0.664800 0.049593 -v 0.069438 0.656400 0.069438 -v 0.093330 0.649350 0.093329 -v 0.119564 0.643200 0.119564 -v 0.146438 0.637500 0.146437 -v 0.172246 0.631800 0.172246 -v 0.195285 0.625650 0.195285 -v 0.213852 0.618600 0.213852 -v 0.226241 0.610200 0.226241 -v 0.230750 0.600000 0.230750 -v 0.041485 0.664800 0.056528 -v 0.058085 0.656400 0.079148 -v 0.078071 0.649350 0.106380 -v 0.100016 0.643200 0.136283 -v 0.122496 0.637500 0.166914 -v 0.144085 0.631800 0.196331 -v 0.163358 0.625650 0.222592 -v 0.178889 0.618600 0.243755 -v 0.189253 0.610200 0.257877 -v 0.193024 0.600000 0.263016 -v 0.032338 0.664800 0.062155 -v 0.045278 0.656400 0.087026 -v 0.060856 0.649350 0.116969 -v 0.077963 0.643200 0.149849 -v 0.095486 0.637500 0.183529 -v 0.112314 0.631800 0.215875 -v 0.127337 0.625650 0.244750 -v 0.139444 0.618600 0.268020 -v 0.147522 0.610200 0.283548 -v 0.150462 0.600000 0.289198 -v 0.022285 0.664800 0.066341 -v 0.031202 0.656400 0.092886 -v 0.041938 0.649350 0.124846 -v 0.053726 0.643200 0.159940 -v 0.065802 0.637500 0.195888 -v 0.077399 0.631800 0.230412 -v 0.087752 0.625650 0.261231 -v 0.096095 0.618600 0.286068 -v 0.101662 0.610200 0.302641 -v 0.103688 0.600000 0.308672 -v 0.011461 0.664800 0.068950 -v 0.016047 0.656400 0.096540 -v 0.021568 0.649350 0.129757 -v 0.027631 0.643200 0.166231 -v 0.033842 0.637500 0.203593 -v 0.039806 0.631800 0.239475 -v 0.045130 0.625650 0.271507 -v 0.049421 0.618600 0.297321 -v 0.052284 0.610200 0.314546 -v 0.053326 0.600000 0.320814 -v -0.000000 0.664800 0.069850 -v -0.000000 0.656400 0.097800 -v -0.000000 0.649350 0.131450 -v -0.000000 0.643200 0.168400 -v -0.000000 0.637500 0.206250 -v -0.000000 0.631800 0.242600 -v -0.000000 0.625650 0.275050 -v -0.000000 0.618600 0.301200 -v -0.000000 0.610200 0.318650 -v -0.000000 0.600000 0.325000 -v -0.011461 0.664800 0.068950 -v -0.016047 0.656400 0.096540 -v -0.021568 0.649350 0.129757 -v -0.027631 0.643200 0.166231 -v -0.033842 0.637500 0.203593 -v -0.039806 0.631800 0.239475 -v -0.045130 0.625650 0.271507 -v -0.049421 0.618600 0.297321 -v -0.052284 0.610200 0.314546 -v -0.053326 0.600000 0.320814 -v -0.022285 0.664800 0.066341 -v -0.031202 0.656400 0.092886 -v -0.041938 0.649350 0.124846 -v -0.053726 0.643200 0.159940 -v -0.065802 0.637500 0.195888 -v -0.077399 0.631800 0.230412 -v -0.087752 0.625650 0.261231 -v -0.096095 0.618600 0.286068 -v -0.101662 0.610200 0.302641 -v -0.103688 0.600000 0.308672 -v -0.032338 0.664800 0.062155 -v -0.045278 0.656400 0.087026 -v -0.060856 0.649350 0.116969 -v -0.077963 0.643200 0.149849 -v -0.095486 0.637500 0.183529 -v -0.112314 0.631800 0.215875 -v -0.127337 0.625650 0.244750 -v -0.139444 0.618600 0.268020 -v -0.147522 0.610200 0.283547 -v -0.150462 0.600000 0.289198 -v -0.041485 0.664800 0.056528 -v -0.058085 0.656400 0.079148 -v -0.078071 0.649350 0.106380 -v -0.100016 0.643200 0.136283 -v -0.122496 0.637500 0.166914 -v -0.144085 0.631800 0.196331 -v -0.163358 0.625650 0.222592 -v -0.178889 0.618600 0.243755 -v -0.189253 0.610200 0.257877 -v -0.193024 0.600000 0.263016 -v -0.049594 0.664800 0.049593 -v -0.069438 0.656400 0.069438 -v -0.093330 0.649350 0.093329 -v -0.119564 0.643200 0.119564 -v -0.146438 0.637500 0.146437 -v -0.172246 0.631800 0.172246 -v -0.195285 0.625650 0.195285 -v -0.213852 0.618600 0.213852 -v -0.226241 0.610200 0.226241 -v -0.230750 0.600000 0.230750 -v -0.056528 0.664800 0.041485 -v -0.079148 0.656400 0.058085 -v -0.106380 0.649350 0.078071 -v -0.136283 0.643200 0.100016 -v -0.166914 0.637500 0.122496 -v -0.196331 0.631800 0.144085 -v -0.222592 0.625650 0.163358 -v -0.243755 0.618600 0.178889 -v -0.257877 0.610200 0.189253 -v -0.263016 0.600000 0.193024 -v -0.062155 0.664800 0.032338 -v -0.087026 0.656400 0.045277 -v -0.116969 0.649350 0.060856 -v -0.149849 0.643200 0.077962 -v -0.183530 0.637500 0.095485 -v -0.215875 0.631800 0.112314 -v -0.244751 0.625650 0.127337 -v -0.268020 0.618600 0.139444 -v -0.283548 0.610200 0.147522 -v -0.289198 0.600000 0.150462 -v -0.066341 0.664800 0.022285 -v -0.092887 0.656400 0.031202 -v -0.124846 0.649350 0.041938 -v -0.159940 0.643200 0.053726 -v -0.195888 0.637500 0.065802 -v -0.230412 0.631800 0.077399 -v -0.261232 0.625650 0.087752 -v -0.286068 0.618600 0.096095 -v -0.302641 0.610200 0.101662 -v -0.308672 0.600000 0.103688 -v -0.068950 0.664800 0.011461 -v -0.096540 0.656400 0.016047 -v -0.129757 0.649350 0.021568 -v -0.166231 0.643200 0.027631 -v -0.203593 0.637500 0.033841 -v -0.239475 0.631800 0.039806 -v -0.271507 0.625650 0.045130 -v -0.297321 0.618600 0.049421 -v -0.314546 0.610200 0.052284 -v -0.320814 0.600000 0.053326 -v -0.069850 0.664800 -0.000000 -v -0.097800 0.656400 -0.000000 -v -0.131450 0.649350 -0.000000 -v -0.168400 0.643200 -0.000000 -v -0.206250 0.637500 -0.000000 -v -0.242600 0.631800 -0.000000 -v -0.275050 0.625650 -0.000000 -v -0.301200 0.618600 -0.000000 -v -0.318650 0.610200 -0.000000 -v -0.325000 0.600000 -0.000000 -v -0.068950 0.664800 -0.011461 -v -0.096540 0.656400 -0.016047 -v -0.129757 0.649350 -0.021568 -v -0.166231 0.643200 -0.027631 -v -0.203593 0.637500 -0.033842 -v -0.239475 0.631800 -0.039806 -v -0.271507 0.625650 -0.045130 -v -0.297321 0.618600 -0.049421 -v -0.314546 0.610200 -0.052284 -v -0.320814 0.600000 -0.053326 -v -0.066341 0.664800 -0.022285 -v -0.092887 0.656400 -0.031202 -v -0.124846 0.649350 -0.041938 -v -0.159940 0.643200 -0.053726 -v -0.195888 0.637500 -0.065802 -v -0.230412 0.631800 -0.077399 -v -0.261231 0.625650 -0.087752 -v -0.286068 0.618600 -0.096095 -v -0.302641 0.610200 -0.101662 -v -0.308672 0.600000 -0.103688 -v -0.062155 0.664800 -0.032338 -v -0.087026 0.656400 -0.045278 -v -0.116969 0.649350 -0.060856 -v -0.149849 0.643200 -0.077963 -v -0.183529 0.637500 -0.095486 -v -0.215875 0.631800 -0.112314 -v -0.244750 0.625650 -0.127337 -v -0.268020 0.618600 -0.139444 -v -0.283548 0.610200 -0.147522 -v -0.289198 0.600000 -0.150462 -v -0.056528 0.664800 -0.041485 -v -0.079148 0.656400 -0.058085 -v -0.106380 0.649350 -0.078071 -v -0.136283 0.643200 -0.100016 -v -0.166914 0.637500 -0.122496 -v -0.196331 0.631800 -0.144085 -v -0.222592 0.625650 -0.163358 -v -0.243755 0.618600 -0.178889 -v -0.257877 0.610200 -0.189253 -v -0.263016 0.600000 -0.193024 -v -0.049594 0.664800 -0.049594 -v -0.069438 0.656400 -0.069438 -v -0.093330 0.649350 -0.093330 -v -0.119564 0.643200 -0.119564 -v -0.146438 0.637500 -0.146438 -v -0.172246 0.631800 -0.172246 -v -0.195285 0.625650 -0.195286 -v -0.213852 0.618600 -0.213852 -v -0.226241 0.610200 -0.226242 -v -0.230750 0.600000 -0.230750 -v -0.041485 0.664800 -0.056528 -v -0.058085 0.656400 -0.079148 -v -0.078071 0.649350 -0.106380 -v -0.100016 0.643200 -0.136283 -v -0.122496 0.637500 -0.166914 -v -0.144085 0.631800 -0.196331 -v -0.163358 0.625650 -0.222592 -v -0.178889 0.618600 -0.243755 -v -0.189253 0.610200 -0.257877 -v -0.193024 0.600000 -0.263016 -v -0.032338 0.664800 -0.062155 -v -0.045278 0.656400 -0.087026 -v -0.060856 0.649350 -0.116970 -v -0.077963 0.643200 -0.149849 -v -0.095486 0.637500 -0.183530 -v -0.112314 0.631800 -0.215875 -v -0.127337 0.625650 -0.244751 -v -0.139444 0.618600 -0.268020 -v -0.147522 0.610200 -0.283548 -v -0.150462 0.600000 -0.289198 -v -0.022285 0.664800 -0.066341 -v -0.031202 0.656400 -0.092887 -v -0.041938 0.649350 -0.124846 -v -0.053726 0.643200 -0.159940 -v -0.065802 0.637500 -0.195888 -v -0.077399 0.631800 -0.230412 -v -0.087752 0.625650 -0.261232 -v -0.096095 0.618600 -0.286068 -v -0.101662 0.610200 -0.302641 -v -0.103688 0.600000 -0.308672 -v -0.011461 0.664800 -0.068950 -v -0.016047 0.656400 -0.096540 -v -0.021568 0.649350 -0.129757 -v -0.027631 0.643200 -0.166231 -v -0.033842 0.637500 -0.203594 -v -0.039806 0.631800 -0.239475 -v -0.045130 0.625650 -0.271507 -v -0.049421 0.618600 -0.297321 -v -0.052284 0.610200 -0.314546 -v -0.053326 0.600000 -0.320814 -v 0.000000 0.664800 -0.069850 -v 0.000000 0.656400 -0.097800 -v 0.000000 0.649350 -0.131450 -v 0.000000 0.643200 -0.168400 -v 0.000000 0.637500 -0.206250 -v 0.000000 0.631800 -0.242600 -v 0.000000 0.625650 -0.275050 -v 0.000000 0.618600 -0.301200 -v 0.000000 0.610200 -0.318650 -v 0.000000 0.600000 -0.325000 -v 0.011461 0.664800 -0.068950 -v 0.016047 0.656400 -0.096540 -v 0.021568 0.649350 -0.129757 -v 0.027631 0.643200 -0.166231 -v 0.033842 0.637500 -0.203594 -v 0.039806 0.631800 -0.239475 -v 0.045130 0.625650 -0.271507 -v 0.049421 0.618600 -0.297321 -v 0.052284 0.610200 -0.314546 -v 0.053326 0.600000 -0.320814 -v 0.022285 0.664800 -0.066341 -v 0.031202 0.656400 -0.092887 -v 0.041938 0.649350 -0.124846 -v 0.053726 0.643200 -0.159940 -v 0.065802 0.637500 -0.195888 -v 0.077399 0.631800 -0.230412 -v 0.087752 0.625650 -0.261231 -v 0.096095 0.618600 -0.286068 -v 0.101662 0.610200 -0.302641 -v 0.103688 0.600000 -0.308672 -v 0.032338 0.664800 -0.062155 -v 0.045278 0.656400 -0.087026 -v 0.060856 0.649350 -0.116969 -v 0.077963 0.643200 -0.149849 -v 0.095486 0.637500 -0.183530 -v 0.112314 0.631800 -0.215875 -v 0.127337 0.625650 -0.244750 -v 0.139444 0.618600 -0.268020 -v 0.147522 0.610200 -0.283548 -v 0.150462 0.600000 -0.289198 -v 0.041485 0.664800 -0.056528 -v 0.058085 0.656400 -0.079148 -v 0.078071 0.649350 -0.106380 -v 0.100016 0.643200 -0.136283 -v 0.122496 0.637500 -0.166914 -v 0.144085 0.631800 -0.196331 -v 0.163358 0.625650 -0.222592 -v 0.178889 0.618600 -0.243755 -v 0.189253 0.610200 -0.257877 -v 0.193024 0.600000 -0.263016 -v 0.049594 0.664800 -0.049594 -v 0.069438 0.656400 -0.069438 -v 0.093330 0.649350 -0.093330 -v 0.119564 0.643200 -0.119564 -v 0.146438 0.637500 -0.146438 -v 0.172246 0.631800 -0.172246 -v 0.195285 0.625650 -0.195286 -v 0.213852 0.618600 -0.213852 -v 0.226241 0.610200 -0.226242 -v 0.230750 0.600000 -0.230750 -v 0.056528 0.664800 -0.041485 -v 0.079148 0.656400 -0.058085 -v 0.106380 0.649350 -0.078071 -v 0.136283 0.643200 -0.100016 -v 0.166914 0.637500 -0.122496 -v 0.196331 0.631800 -0.144085 -v 0.222592 0.625650 -0.163358 -v 0.243755 0.618600 -0.178889 -v 0.257877 0.610200 -0.189253 -v 0.263016 0.600000 -0.193024 -v 0.062155 0.664800 -0.032338 -v 0.087026 0.656400 -0.045278 -v 0.116969 0.649350 -0.060856 -v 0.149849 0.643200 -0.077963 -v 0.183530 0.637500 -0.095486 -v 0.215875 0.631800 -0.112314 -v 0.244751 0.625650 -0.127337 -v 0.268020 0.618600 -0.139444 -v 0.283548 0.610200 -0.147522 -v 0.289198 0.600000 -0.150462 -v 0.066341 0.664800 -0.022285 -v 0.092887 0.656400 -0.031202 -v 0.124846 0.649350 -0.041938 -v 0.159940 0.643200 -0.053726 -v 0.195888 0.637500 -0.065802 -v 0.230412 0.631800 -0.077399 -v 0.261232 0.625650 -0.087752 -v 0.286068 0.618600 -0.096095 -v 0.302641 0.610200 -0.101662 -v 0.308672 0.600000 -0.103688 -v 0.068950 0.664800 -0.011461 -v 0.096540 0.656400 -0.016047 -v 0.129757 0.649350 -0.021568 -v 0.166231 0.643200 -0.027631 -v 0.203593 0.637500 -0.033842 -v 0.239475 0.631800 -0.039806 -v 0.271507 0.625650 -0.045130 -v 0.297321 0.618600 -0.049421 -v 0.314546 0.610200 -0.052284 -v 0.320814 0.600000 -0.053326 -vt 0.684148 0.500000 -vt 0.681346 0.442629 -vt 0.679187 0.443206 -vt 0.681961 0.500000 -vt 0.678340 0.443432 -vt 0.681102 0.500000 -vt 0.678620 0.443358 -vt 0.681386 0.500000 -vt 0.679843 0.443031 -vt 0.682625 0.500000 -vt 0.681825 0.442501 -vt 0.684633 0.500000 -vt 0.684383 0.441818 -vt 0.687224 0.500000 -vt 0.687331 0.441030 -vt 0.690211 0.500000 -vt 0.690487 0.440187 -vt 0.693408 0.500000 -vt 0.693666 0.439338 -vt 0.696628 0.500000 -vt 0.696683 0.438531 -vt 0.699685 0.500000 -vt 0.673219 0.388447 -vt 0.671142 0.389569 -vt 0.670327 0.390009 -vt 0.670596 0.389864 -vt 0.671773 0.389228 -vt 0.673680 0.388198 -vt 0.676141 0.386870 -vt 0.678978 0.385338 -vt 0.682014 0.383699 -vt 0.685073 0.382047 -vt 0.687976 0.380479 -vt 0.660185 0.338126 -vt 0.658239 0.339753 -vt 0.657475 0.340392 -vt 0.657728 0.340181 -vt 0.658830 0.339259 -vt 0.660617 0.337765 -vt 0.662923 0.335836 -vt 0.665581 0.333614 -vt 0.668425 0.331235 -vt 0.671291 0.328838 -vt 0.674011 0.326563 -vt 0.642661 0.292336 -vt 0.640892 0.294423 -vt 0.640197 0.295243 -vt 0.640426 0.294972 -vt 0.641429 0.293789 -vt 0.643054 0.291872 -vt 0.645151 0.289399 -vt 0.647568 0.286547 -vt 0.650156 0.283495 -vt 0.652762 0.280421 -vt 0.655236 0.277502 -vt 0.621066 0.251748 -vt 0.619513 0.254244 -vt 0.618903 0.255224 -vt 0.619105 0.254900 -vt 0.619984 0.253486 -vt 0.621410 0.251194 -vt 0.623250 0.248237 -vt 0.625371 0.244828 -vt 0.627640 0.241180 -vt 0.629927 0.237505 -vt 0.632097 0.234016 -vt 0.595815 0.217035 -vt 0.594516 0.219880 -vt 0.594007 0.220996 -vt 0.594175 0.220628 -vt 0.594911 0.219016 -vt 0.596104 0.216403 -vt 0.597642 0.213033 -vt 0.599416 0.209147 -vt 0.601315 0.204989 -vt 0.603228 0.200800 -vt 0.605043 0.196823 -vt 0.567328 0.188867 -vt 0.566316 0.191995 -vt 0.565918 0.193223 -vt 0.566050 0.192817 -vt 0.566623 0.191045 -vt 0.567553 0.188173 -vt 0.568753 0.184467 -vt 0.570135 0.180194 -vt 0.571615 0.175622 -vt 0.573106 0.171016 -vt 0.574521 0.166643 -vt 0.536022 0.167916 -vt 0.535324 0.171255 -vt 0.535051 0.172565 -vt 0.535141 0.172132 -vt 0.535536 0.170241 -vt 0.536177 0.167175 -vt 0.537004 0.163219 -vt 0.537957 0.158659 -vt 0.538977 0.153779 -vt 0.540004 0.148863 -vt 0.540979 0.144196 -vt 0.502315 0.154853 -vt 0.501956 0.158323 -vt 0.501815 0.159685 -vt 0.501861 0.159235 -vt 0.502065 0.157269 -vt 0.502394 0.154083 -vt 0.502819 0.149972 -vt 0.503309 0.145232 -vt 0.503834 0.140160 -vt 0.504362 0.135050 -vt 0.504864 0.130200 -vt 0.466623 0.150350 -vt 0.466623 0.153865 -vt 0.466623 0.155245 -vt 0.466623 0.154789 -vt 0.466623 0.152797 -vt 0.466623 0.149569 -vt 0.466623 0.145405 -vt 0.466623 0.140603 -vt 0.466623 0.135465 -vt 0.466623 0.130288 -vt 0.466623 0.125375 -vt 0.427534 0.154853 -vt 0.428813 0.158323 -vt 0.429692 0.159685 -vt 0.430219 0.159235 -vt 0.430448 0.157269 -vt 0.430427 0.154083 -vt 0.430210 0.149972 -vt 0.429845 0.145232 -vt 0.429385 0.140160 -vt 0.428881 0.135050 -vt 0.428382 0.130200 -vt 0.391854 0.167916 -vt 0.394007 0.171255 -vt 0.395446 0.172565 -vt 0.396264 0.172132 -vt 0.396550 0.170241 -vt 0.396398 0.167175 -vt 0.395899 0.163220 -vt 0.395145 0.158659 -vt 0.394227 0.153779 -vt 0.393237 0.148863 -vt 0.392267 0.144196 -vt 0.359751 0.188867 -vt 0.362435 0.191995 -vt 0.364171 0.193223 -vt 0.365081 0.192817 -vt 0.365291 0.191045 -vt 0.364922 0.188173 -vt 0.364099 0.184467 -vt 0.362944 0.180194 -vt 0.361582 0.175622 -vt 0.360134 0.171016 -vt 0.358725 0.166643 -vt 0.331390 0.217035 -vt 0.334326 0.219880 -vt 0.336147 0.220996 -vt 0.336999 0.220628 -vt 0.337031 0.219016 -vt 0.336388 0.216403 -vt 0.335217 0.213033 -vt 0.333667 0.209147 -vt 0.331883 0.204989 -vt 0.330013 0.200800 -vt 0.328203 0.196823 -vt 0.306937 0.251748 -vt 0.309911 0.254244 -vt 0.311658 0.255224 -vt 0.312343 0.254900 -vt 0.312129 0.253486 -vt 0.311181 0.251194 -vt 0.309661 0.248237 -vt 0.307734 0.244828 -vt 0.305564 0.241180 -vt 0.303315 0.237505 -vt 0.301149 0.234016 -vt 0.286558 0.292336 -vt 0.289419 0.294424 -vt 0.290988 0.295243 -vt 0.291439 0.294972 -vt 0.290947 0.293789 -vt 0.289689 0.291872 -vt 0.287838 0.289399 -vt 0.285569 0.286547 -vt 0.283059 0.283495 -vt 0.280481 0.280421 -vt 0.278011 0.277503 -vt 0.270418 0.338126 -vt 0.273081 0.339753 -vt 0.274418 0.340392 -vt 0.274612 0.340181 -vt 0.273845 0.339259 -vt 0.272299 0.337765 -vt 0.270155 0.335837 -vt 0.267594 0.333614 -vt 0.264800 0.331235 -vt 0.261953 0.328838 -vt 0.259235 0.326564 -vt 0.258685 0.388448 -vt 0.261126 0.389569 -vt 0.262232 0.390009 -vt 0.262190 0.389864 -vt 0.261183 0.389229 -vt 0.259398 0.388199 -vt 0.257019 0.386870 -vt 0.254232 0.385338 -vt 0.251221 0.383699 -vt 0.248172 0.382047 -vt 0.245270 0.380480 -vt 0.251523 0.442630 -vt 0.253784 0.443206 -vt 0.254713 0.443433 -vt 0.254497 0.443358 -vt 0.253322 0.443031 -vt 0.251374 0.442501 -vt 0.248840 0.441818 -vt 0.245905 0.441030 -vt 0.242756 0.440187 -vt 0.239580 0.439338 -vt 0.236563 0.438532 -vt 0.249099 0.500000 -vt 0.251286 0.500000 -vt 0.252144 0.500000 -vt 0.251861 0.500000 -vt 0.250621 0.500000 -vt 0.248613 0.500000 -vt 0.246022 0.500000 -vt 0.243035 0.500000 -vt 0.239839 0.500000 -vt 0.236618 0.500000 -vt 0.233561 0.500000 -vt 0.251901 0.557371 -vt 0.254059 0.556794 -vt 0.254907 0.556568 -vt 0.254627 0.556642 -vt 0.253404 0.556969 -vt 0.251421 0.557499 -vt 0.248864 0.558182 -vt 0.245915 0.558970 -vt 0.242760 0.559813 -vt 0.239581 0.560662 -vt 0.236563 0.561469 -vt 0.260027 0.611553 -vt 0.262104 0.610431 -vt 0.262920 0.609991 -vt 0.262650 0.610136 -vt 0.261473 0.610772 -vt 0.259566 0.611802 -vt 0.257105 0.613130 -vt 0.254268 0.614662 -vt 0.251232 0.616301 -vt 0.248174 0.617953 -vt 0.245270 0.619521 -vt 0.273061 0.661874 -vt 0.275007 0.660247 -vt 0.275771 0.659608 -vt 0.275519 0.659819 -vt 0.274416 0.660741 -vt 0.272629 0.662235 -vt 0.270324 0.664164 -vt 0.267666 0.666386 -vt 0.264821 0.668765 -vt 0.261956 0.671162 -vt 0.259236 0.673437 -vt 0.290585 0.707664 -vt 0.292355 0.705577 -vt 0.293050 0.704757 -vt 0.292820 0.705028 -vt 0.291817 0.706211 -vt 0.290192 0.708128 -vt 0.288095 0.710601 -vt 0.285678 0.713453 -vt 0.283091 0.716505 -vt 0.280485 0.719579 -vt 0.278011 0.722498 -vt 0.312181 0.748252 -vt 0.313734 0.745756 -vt 0.314343 0.744776 -vt 0.314142 0.745100 -vt 0.313262 0.746514 -vt 0.311836 0.748806 -vt 0.309997 0.751763 -vt 0.307876 0.755172 -vt 0.305606 0.758820 -vt 0.303320 0.762495 -vt 0.301149 0.765984 -vt 0.337431 0.782965 -vt 0.338730 0.780120 -vt 0.339240 0.779004 -vt 0.339071 0.779372 -vt 0.338336 0.780984 -vt 0.337143 0.783597 -vt 0.335604 0.786967 -vt 0.333830 0.790853 -vt 0.331931 0.795011 -vt 0.330019 0.799200 -vt 0.328203 0.803177 -vt 0.365918 0.811133 -vt 0.366931 0.808005 -vt 0.367328 0.806777 -vt 0.367197 0.807183 -vt 0.366623 0.808955 -vt 0.365693 0.811827 -vt 0.364494 0.815533 -vt 0.363111 0.819806 -vt 0.361631 0.824378 -vt 0.360140 0.828984 -vt 0.358725 0.833357 -vt 0.397224 0.832084 -vt 0.397922 0.828745 -vt 0.398196 0.827435 -vt 0.398105 0.827868 -vt 0.397710 0.829759 -vt 0.397069 0.832825 -vt 0.396243 0.836781 -vt 0.395290 0.841341 -vt 0.394270 0.846221 -vt 0.393243 0.851137 -vt 0.392267 0.855804 -vt 0.430932 0.845147 -vt 0.431291 0.841677 -vt 0.431432 0.840315 -vt 0.431385 0.840765 -vt 0.431182 0.842731 -vt 0.430852 0.845917 -vt 0.430427 0.850028 -vt 0.429937 0.854768 -vt 0.429412 0.859840 -vt 0.428884 0.864950 -vt 0.428383 0.869800 -vt 0.466623 0.849650 -vt 0.466623 0.846135 -vt 0.466623 0.844755 -vt 0.466623 0.845211 -vt 0.466623 0.847203 -vt 0.466623 0.850431 -vt 0.466623 0.854595 -vt 0.466623 0.859397 -vt 0.466623 0.864535 -vt 0.466623 0.869712 -vt 0.466623 0.874625 -vt 0.502315 0.845147 -vt 0.501956 0.841677 -vt 0.501815 0.840315 -vt 0.501862 0.840765 -vt 0.502065 0.842731 -vt 0.502394 0.845917 -vt 0.502819 0.850028 -vt 0.503310 0.854768 -vt 0.503834 0.859840 -vt 0.504363 0.864950 -vt 0.504864 0.869800 -vt 0.536022 0.832084 -vt 0.535325 0.828745 -vt 0.535051 0.827435 -vt 0.535141 0.827868 -vt 0.535536 0.829759 -vt 0.536177 0.832825 -vt 0.537004 0.836780 -vt 0.537957 0.841341 -vt 0.538977 0.846221 -vt 0.540004 0.851137 -vt 0.540979 0.855804 -vt 0.567328 0.811133 -vt 0.566316 0.808005 -vt 0.565919 0.806777 -vt 0.566050 0.807183 -vt 0.566623 0.808955 -vt 0.567553 0.811827 -vt 0.568753 0.815533 -vt 0.570136 0.819806 -vt 0.571616 0.824378 -vt 0.573106 0.828984 -vt 0.574522 0.833357 -vt 0.595815 0.782965 -vt 0.594517 0.780120 -vt 0.594007 0.779004 -vt 0.594175 0.779372 -vt 0.594911 0.780984 -vt 0.596104 0.783597 -vt 0.597643 0.786967 -vt 0.599417 0.790853 -vt 0.601315 0.795011 -vt 0.603228 0.799200 -vt 0.605043 0.803177 -vt 0.621066 0.748252 -vt 0.619513 0.745756 -vt 0.618903 0.744776 -vt 0.619105 0.745100 -vt 0.619985 0.746514 -vt 0.621410 0.748806 -vt 0.623250 0.751763 -vt 0.625371 0.755172 -vt 0.627640 0.758820 -vt 0.629927 0.762495 -vt 0.632097 0.765984 -vt 0.642661 0.707664 -vt 0.640892 0.705576 -vt 0.640197 0.704757 -vt 0.640426 0.705028 -vt 0.641429 0.706211 -vt 0.643054 0.708128 -vt 0.645151 0.710601 -vt 0.647568 0.713453 -vt 0.650156 0.716505 -vt 0.652762 0.719579 -vt 0.655236 0.722497 -vt 0.660185 0.661874 -vt 0.658239 0.660247 -vt 0.657475 0.659608 -vt 0.657728 0.659819 -vt 0.658830 0.660741 -vt 0.660617 0.662235 -vt 0.662923 0.664163 -vt 0.665581 0.666386 -vt 0.668425 0.668765 -vt 0.671291 0.671162 -vt 0.674011 0.673436 -vt 0.673219 0.611552 -vt 0.671142 0.610431 -vt 0.670327 0.609991 -vt 0.670596 0.610136 -vt 0.671773 0.610771 -vt 0.673680 0.611801 -vt 0.676141 0.613130 -vt 0.678978 0.614662 -vt 0.682014 0.616301 -vt 0.685073 0.617953 -vt 0.687976 0.619520 -vt 0.681346 0.557370 -vt 0.679187 0.556794 -vt 0.678340 0.556567 -vt 0.678620 0.556642 -vt 0.679843 0.556969 -vt 0.681825 0.557499 -vt 0.684383 0.558182 -vt 0.687331 0.558970 -vt 0.690487 0.559813 -vt 0.693666 0.560662 -vt 0.696683 0.561468 -vt 0.708148 0.435468 -vt 0.711299 0.500000 -vt 0.719383 0.432467 -vt 0.722681 0.500000 -vt 0.730157 0.429588 -vt 0.733596 0.500000 -vt 0.740241 0.426893 -vt 0.743811 0.500000 -vt 0.749405 0.424445 -vt 0.753095 0.500000 -vt 0.757419 0.422304 -vt 0.761213 0.500000 -vt 0.764053 0.420531 -vt 0.767933 0.500000 -vt 0.769075 0.419189 -vt 0.773022 0.500000 -vt 0.772258 0.418339 -vt 0.776246 0.500000 -vt 0.773370 0.418042 -vt 0.777372 0.500000 -vt 0.699007 0.374523 -vt 0.709816 0.368687 -vt 0.720183 0.363089 -vt 0.729886 0.357850 -vt 0.738703 0.353089 -vt 0.746413 0.348926 -vt 0.752796 0.345480 -vt 0.757628 0.342870 -vt 0.760690 0.341217 -vt 0.761760 0.340639 -vt 0.684346 0.317920 -vt 0.694473 0.309451 -vt 0.704186 0.301328 -vt 0.713276 0.293726 -vt 0.721537 0.286817 -vt 0.728761 0.280776 -vt 0.734741 0.275775 -vt 0.739269 0.271989 -vt 0.742138 0.269589 -vt 0.743140 0.268751 -vt 0.664635 0.266415 -vt 0.673845 0.255549 -vt 0.682679 0.245129 -vt 0.690946 0.235376 -vt 0.698459 0.226513 -vt 0.705029 0.218763 -vt 0.710467 0.212348 -vt 0.714586 0.207490 -vt 0.717195 0.204412 -vt 0.718106 0.203337 -vt 0.640343 0.220761 -vt 0.648424 0.207772 -vt 0.656174 0.195315 -vt 0.663427 0.183656 -vt 0.670018 0.173061 -vt 0.675782 0.163796 -vt 0.680553 0.156127 -vt 0.684166 0.150320 -vt 0.686455 0.146640 -vt 0.687255 0.145355 -vt 0.611941 0.181715 -vt 0.618701 0.166910 -vt 0.625183 0.152711 -vt 0.631251 0.139422 -vt 0.636765 0.127345 -vt 0.641586 0.116784 -vt 0.645577 0.108043 -vt 0.648600 0.101423 -vt 0.650514 0.097230 -vt 0.651183 0.095764 -vt 0.579898 0.150031 -vt 0.585167 0.133752 -vt 0.590221 0.118140 -vt 0.594950 0.103528 -vt 0.599248 0.090249 -vt 0.603007 0.078637 -vt 0.606118 0.069025 -vt 0.608473 0.061747 -vt 0.609966 0.057136 -vt 0.610488 0.055524 -vt 0.544685 0.126465 -vt 0.548316 0.109090 -vt 0.551798 0.092426 -vt 0.555057 0.076830 -vt 0.558019 0.062657 -vt 0.560609 0.050264 -vt 0.562753 0.040004 -vt 0.564377 0.032236 -vt 0.565405 0.027314 -vt 0.565765 0.025594 -vt 0.506770 0.111771 -vt 0.508637 0.093713 -vt 0.510428 0.076394 -vt 0.512104 0.060184 -vt 0.513627 0.045454 -vt 0.514960 0.032573 -vt 0.516062 0.021910 -vt 0.516897 0.013836 -vt 0.517426 0.008720 -vt 0.517611 0.006933 -vt 0.466623 0.106706 -vt 0.466623 0.088412 -vt 0.466623 0.070867 -vt 0.466623 0.054446 -vt 0.466623 0.039523 -vt 0.466623 0.026473 -vt 0.466623 0.015672 -vt 0.466623 0.007493 -vt 0.466623 0.002310 -vt 0.466623 0.000499 -vt 0.426477 0.111771 -vt 0.424609 0.093713 -vt 0.422818 0.076394 -vt 0.421142 0.060184 -vt 0.419619 0.045454 -vt 0.418287 0.032573 -vt 0.417184 0.021910 -vt 0.416349 0.013836 -vt 0.415820 0.008721 -vt 0.415635 0.006933 -vt 0.388562 0.126465 -vt 0.384931 0.109090 -vt 0.381448 0.092426 -vt 0.378189 0.076830 -vt 0.375227 0.062657 -vt 0.372637 0.050264 -vt 0.370493 0.040004 -vt 0.368870 0.032236 -vt 0.367841 0.027314 -vt 0.367482 0.025595 -vt 0.353348 0.150031 -vt 0.348079 0.133752 -vt 0.343026 0.118140 -vt 0.338296 0.103528 -vt 0.333998 0.090249 -vt 0.330240 0.078637 -vt 0.327129 0.069026 -vt 0.324773 0.061747 -vt 0.323280 0.057136 -vt 0.322759 0.055524 -vt 0.321305 0.181715 -vt 0.314546 0.166910 -vt 0.308063 0.152711 -vt 0.301996 0.139422 -vt 0.296482 0.127345 -vt 0.291660 0.116785 -vt 0.287669 0.108043 -vt 0.284647 0.101424 -vt 0.282732 0.097230 -vt 0.282063 0.095764 -vt 0.292903 0.220761 -vt 0.284823 0.207772 -vt 0.277073 0.195315 -vt 0.269820 0.183656 -vt 0.263228 0.173061 -vt 0.257464 0.163796 -vt 0.252693 0.156127 -vt 0.249080 0.150320 -vt 0.246791 0.146640 -vt 0.245991 0.145355 -vt 0.268612 0.266415 -vt 0.259401 0.255550 -vt 0.250568 0.245129 -vt 0.242300 0.235376 -vt 0.234787 0.226514 -vt 0.228217 0.218763 -vt 0.222779 0.212348 -vt 0.218661 0.207490 -vt 0.216052 0.204412 -vt 0.215140 0.203337 -vt 0.248901 0.317921 -vt 0.238773 0.309451 -vt 0.229061 0.301329 -vt 0.219970 0.293726 -vt 0.211709 0.286818 -vt 0.204485 0.280776 -vt 0.198505 0.275776 -vt 0.193977 0.271989 -vt 0.191109 0.269590 -vt 0.190106 0.268751 -vt 0.234240 0.374524 -vt 0.223430 0.368687 -vt 0.213064 0.363089 -vt 0.203361 0.357850 -vt 0.194544 0.353090 -vt 0.186833 0.348926 -vt 0.180451 0.345480 -vt 0.175618 0.342871 -vt 0.172556 0.341217 -vt 0.171486 0.340640 -vt 0.225099 0.435468 -vt 0.213864 0.432467 -vt 0.203089 0.429588 -vt 0.193005 0.426894 -vt 0.183841 0.424445 -vt 0.175827 0.422304 -vt 0.169194 0.420532 -vt 0.164171 0.419190 -vt 0.160988 0.418339 -vt 0.159877 0.418042 -vt 0.221947 0.500000 -vt 0.210566 0.500000 -vt 0.199651 0.500000 -vt 0.189435 0.500000 -vt 0.180151 0.500000 -vt 0.172033 0.500000 -vt 0.165313 0.500000 -vt 0.160225 0.500000 -vt 0.157001 0.500000 -vt 0.155874 0.500000 -vt 0.225099 0.564532 -vt 0.213864 0.567533 -vt 0.203090 0.570412 -vt 0.193005 0.573107 -vt 0.183841 0.575555 -vt 0.175827 0.577696 -vt 0.169194 0.579469 -vt 0.164171 0.580811 -vt 0.160989 0.581661 -vt 0.159877 0.581958 -vt 0.234240 0.625477 -vt 0.223430 0.631313 -vt 0.213064 0.636911 -vt 0.203361 0.642150 -vt 0.194544 0.646911 -vt 0.186833 0.651074 -vt 0.180451 0.654520 -vt 0.175618 0.657130 -vt 0.172556 0.658783 -vt 0.171486 0.659361 -vt 0.248901 0.682080 -vt 0.238773 0.690549 -vt 0.229061 0.698672 -vt 0.219970 0.706274 -vt 0.211709 0.713183 -vt 0.204485 0.719224 -vt 0.198505 0.724225 -vt 0.193977 0.728011 -vt 0.191109 0.730411 -vt 0.190106 0.731249 -vt 0.268612 0.733585 -vt 0.259401 0.744451 -vt 0.250568 0.754871 -vt 0.242300 0.764624 -vt 0.234787 0.773487 -vt 0.228217 0.781237 -vt 0.222779 0.787652 -vt 0.218661 0.792510 -vt 0.216052 0.795588 -vt 0.215140 0.796663 -vt 0.292903 0.779239 -vt 0.284823 0.792228 -vt 0.277073 0.804685 -vt 0.269820 0.816344 -vt 0.263228 0.826939 -vt 0.257464 0.836204 -vt 0.252693 0.843873 -vt 0.249080 0.849680 -vt 0.246791 0.853360 -vt 0.245991 0.854645 -vt 0.321305 0.818285 -vt 0.314546 0.833090 -vt 0.308063 0.847289 -vt 0.301996 0.860578 -vt 0.296482 0.872655 -vt 0.291660 0.883216 -vt 0.287669 0.891957 -vt 0.284647 0.898577 -vt 0.282732 0.902771 -vt 0.282063 0.904236 -vt 0.353348 0.849969 -vt 0.348079 0.866248 -vt 0.343026 0.881860 -vt 0.338296 0.896472 -vt 0.333998 0.909751 -vt 0.330240 0.921363 -vt 0.327129 0.930975 -vt 0.324773 0.938253 -vt 0.323280 0.942864 -vt 0.322759 0.944476 -vt 0.388562 0.873535 -vt 0.384931 0.890910 -vt 0.381448 0.907574 -vt 0.378189 0.923170 -vt 0.375227 0.937343 -vt 0.372637 0.949737 -vt 0.370493 0.959996 -vt 0.368870 0.967764 -vt 0.367841 0.972686 -vt 0.367482 0.974406 -vt 0.426477 0.888229 -vt 0.424609 0.906287 -vt 0.422819 0.923606 -vt 0.421142 0.939816 -vt 0.419619 0.954546 -vt 0.418287 0.967427 -vt 0.417184 0.978090 -vt 0.416349 0.986164 -vt 0.415820 0.991280 -vt 0.415636 0.993067 -vt 0.466623 0.893294 -vt 0.466623 0.911588 -vt 0.466623 0.929133 -vt 0.466623 0.945554 -vt 0.466623 0.960477 -vt 0.466623 0.973526 -vt 0.466623 0.984328 -vt 0.466623 0.992507 -vt 0.466623 0.997690 -vt 0.466623 0.999501 -vt 0.506770 0.888229 -vt 0.508637 0.906287 -vt 0.510428 0.923606 -vt 0.512104 0.939816 -vt 0.513628 0.954546 -vt 0.514960 0.967427 -vt 0.516062 0.978090 -vt 0.516897 0.986164 -vt 0.517426 0.991279 -vt 0.517611 0.993067 -vt 0.544685 0.873535 -vt 0.548316 0.890910 -vt 0.551798 0.907574 -vt 0.555057 0.923170 -vt 0.558019 0.937343 -vt 0.560609 0.949736 -vt 0.562753 0.959996 -vt 0.564377 0.967764 -vt 0.565405 0.972686 -vt 0.565765 0.974406 -vt 0.579899 0.849969 -vt 0.585168 0.866248 -vt 0.590221 0.881860 -vt 0.594950 0.896472 -vt 0.599248 0.909751 -vt 0.603007 0.921363 -vt 0.606118 0.930975 -vt 0.608474 0.938253 -vt 0.609966 0.942864 -vt 0.610488 0.944475 -vt 0.611941 0.818285 -vt 0.618701 0.833090 -vt 0.625184 0.847289 -vt 0.631251 0.860578 -vt 0.636765 0.872655 -vt 0.641586 0.883215 -vt 0.645577 0.891957 -vt 0.648600 0.898576 -vt 0.650514 0.902770 -vt 0.651183 0.904236 -vt 0.640343 0.779239 -vt 0.648424 0.792228 -vt 0.656174 0.804685 -vt 0.663427 0.816344 -vt 0.670018 0.826939 -vt 0.675782 0.836204 -vt 0.680553 0.843873 -vt 0.684166 0.849680 -vt 0.686455 0.853360 -vt 0.687255 0.854645 -vt 0.664635 0.733585 -vt 0.673845 0.744450 -vt 0.682679 0.754871 -vt 0.690946 0.764624 -vt 0.698459 0.773486 -vt 0.705029 0.781237 -vt 0.710468 0.787652 -vt 0.714586 0.792510 -vt 0.717195 0.795588 -vt 0.718106 0.796663 -vt 0.684346 0.682079 -vt 0.694473 0.690549 -vt 0.704186 0.698671 -vt 0.713277 0.706274 -vt 0.721537 0.713182 -vt 0.728761 0.719224 -vt 0.734741 0.724224 -vt 0.739269 0.728011 -vt 0.742138 0.730410 -vt 0.743140 0.731249 -vt 0.699007 0.625476 -vt 0.709816 0.631313 -vt 0.720183 0.636911 -vt 0.729886 0.642150 -vt 0.738703 0.646910 -vt 0.746413 0.651074 -vt 0.752796 0.654520 -vt 0.757629 0.657129 -vt 0.760691 0.658783 -vt 0.761760 0.659360 -vt 0.708148 0.564532 -vt 0.719383 0.567533 -vt 0.730157 0.570412 -vt 0.740241 0.573106 -vt 0.749405 0.575555 -vt 0.757419 0.577696 -vt 0.764053 0.579468 -vt 0.769076 0.580810 -vt 0.772258 0.581661 -vt 0.773370 0.581958 -vt 0.771223 0.418616 -vt 0.775197 0.500000 -vt 0.765395 0.420173 -vt 0.769293 0.500000 -vt 0.756806 0.422468 -vt 0.760592 0.500000 -vt 0.746376 0.425254 -vt 0.750026 0.500000 -vt 0.735027 0.428287 -vt 0.738529 0.500000 -vt 0.723677 0.431319 -vt 0.727031 0.500000 -vt 0.713248 0.434106 -vt 0.716466 0.500000 -vt 0.704659 0.436400 -vt 0.707765 0.500000 -vt 0.698830 0.437958 -vt 0.701860 0.500000 -vt 0.759694 0.341755 -vt 0.754087 0.344783 -vt 0.745823 0.349245 -vt 0.735788 0.354663 -vt 0.724868 0.360559 -vt 0.713948 0.366456 -vt 0.703913 0.371874 -vt 0.695650 0.376336 -vt 0.690042 0.379364 -vt 0.741205 0.270370 -vt 0.735951 0.274764 -vt 0.728208 0.281239 -vt 0.718807 0.289101 -vt 0.708576 0.297657 -vt 0.698344 0.306213 -vt 0.688943 0.314076 -vt 0.681200 0.320551 -vt 0.675947 0.324945 -vt 0.716346 0.205413 -vt 0.711568 0.211050 -vt 0.704526 0.219356 -vt 0.695976 0.229443 -vt 0.686671 0.240420 -vt 0.677366 0.251396 -vt 0.668816 0.261483 -vt 0.661774 0.269789 -vt 0.656996 0.275426 -vt 0.685711 0.147837 -vt 0.681519 0.154575 -vt 0.675341 0.164505 -vt 0.667839 0.176563 -vt 0.659676 0.189685 -vt 0.651513 0.202807 -vt 0.644011 0.214865 -vt 0.637834 0.224795 -vt 0.633642 0.231533 -vt 0.649891 0.098594 -vt 0.646385 0.106274 -vt 0.641217 0.117593 -vt 0.634942 0.131337 -vt 0.628113 0.146294 -vt 0.621285 0.161250 -vt 0.615010 0.174994 -vt 0.609842 0.186313 -vt 0.606335 0.193994 -vt 0.609481 0.058636 -vt 0.606747 0.067081 -vt 0.602719 0.079526 -vt 0.597828 0.094638 -vt 0.592505 0.111084 -vt 0.587182 0.127529 -vt 0.582290 0.142642 -vt 0.578262 0.155087 -vt 0.575529 0.163532 -vt 0.565071 0.028915 -vt 0.563187 0.037929 -vt 0.560411 0.051212 -vt 0.557040 0.067342 -vt 0.553372 0.084895 -vt 0.549704 0.102448 -vt 0.546333 0.118578 -vt 0.543557 0.131861 -vt 0.541673 0.140875 -vt 0.517254 0.010385 -vt 0.516285 0.019753 -vt 0.514858 0.033559 -vt 0.513124 0.050323 -vt 0.511237 0.068566 -vt 0.509351 0.086810 -vt 0.507617 0.103574 -vt 0.506190 0.117380 -vt 0.505221 0.126748 -vt 0.466623 0.003996 -vt 0.466623 0.013486 -vt 0.466623 0.027473 -vt 0.466623 0.044455 -vt 0.466623 0.062937 -vt 0.466623 0.081419 -vt 0.466623 0.098402 -vt 0.466623 0.112388 -vt 0.466623 0.121878 -vt 0.415992 0.010385 -vt 0.416961 0.019753 -vt 0.418389 0.033559 -vt 0.420122 0.050323 -vt 0.422009 0.068567 -vt 0.423895 0.086810 -vt 0.425629 0.103574 -vt 0.427057 0.117380 -vt 0.428025 0.126748 -vt 0.368176 0.028915 -vt 0.370059 0.037929 -vt 0.372835 0.051212 -vt 0.376206 0.067342 -vt 0.379874 0.084895 -vt 0.383543 0.102448 -vt 0.386914 0.118578 -vt 0.389689 0.131861 -vt 0.391573 0.140875 -vt 0.323766 0.058636 -vt 0.326499 0.067081 -vt 0.330527 0.079526 -vt 0.335419 0.094638 -vt 0.340742 0.111084 -vt 0.346065 0.127530 -vt 0.350956 0.142642 -vt 0.354984 0.155087 -vt 0.357718 0.163532 -vt 0.283355 0.098594 -vt 0.286862 0.106274 -vt 0.292029 0.117593 -vt 0.298304 0.131337 -vt 0.305133 0.146294 -vt 0.311962 0.161250 -vt 0.318237 0.174995 -vt 0.323405 0.186313 -vt 0.326911 0.193994 -vt 0.247536 0.147837 -vt 0.251728 0.154576 -vt 0.257905 0.164506 -vt 0.265407 0.176564 -vt 0.273570 0.189685 -vt 0.281734 0.202807 -vt 0.289235 0.214865 -vt 0.295413 0.224795 -vt 0.299605 0.231534 -vt 0.216900 0.205413 -vt 0.221679 0.211050 -vt 0.228720 0.219357 -vt 0.237271 0.229443 -vt 0.246576 0.240420 -vt 0.255880 0.251396 -vt 0.264431 0.261483 -vt 0.271472 0.269789 -vt 0.276251 0.275426 -vt 0.192042 0.270370 -vt 0.197296 0.274764 -vt 0.205038 0.281239 -vt 0.214440 0.289101 -vt 0.224671 0.297657 -vt 0.234902 0.306214 -vt 0.244304 0.314076 -vt 0.252046 0.320551 -vt 0.257300 0.324945 -vt 0.173552 0.341755 -vt 0.179160 0.344783 -vt 0.187423 0.349245 -vt 0.197458 0.354663 -vt 0.208378 0.360560 -vt 0.219298 0.366456 -vt 0.229333 0.371874 -vt 0.237597 0.376336 -vt 0.243204 0.379364 -vt 0.162024 0.418616 -vt 0.167852 0.420173 -vt 0.176441 0.422468 -vt 0.186870 0.425254 -vt 0.198220 0.428287 -vt 0.209570 0.431319 -vt 0.219999 0.434106 -vt 0.228588 0.436401 -vt 0.234416 0.437958 -vt 0.158049 0.500000 -vt 0.163954 0.500000 -vt 0.172655 0.500000 -vt 0.183220 0.500000 -vt 0.194718 0.500000 -vt 0.206215 0.500000 -vt 0.216781 0.500000 -vt 0.225482 0.500000 -vt 0.231386 0.500000 -vt 0.162024 0.581384 -vt 0.167852 0.579827 -vt 0.176441 0.577532 -vt 0.186870 0.574746 -vt 0.198220 0.571713 -vt 0.209570 0.568681 -vt 0.219999 0.565894 -vt 0.228588 0.563600 -vt 0.234416 0.562042 -vt 0.173552 0.658245 -vt 0.179160 0.655217 -vt 0.187424 0.650755 -vt 0.197458 0.645337 -vt 0.208378 0.639441 -vt 0.219298 0.633544 -vt 0.229333 0.628126 -vt 0.237597 0.623664 -vt 0.243204 0.620636 -vt 0.192042 0.729630 -vt 0.197296 0.725236 -vt 0.205038 0.718761 -vt 0.214440 0.710899 -vt 0.224671 0.702343 -vt 0.234902 0.693787 -vt 0.244304 0.685924 -vt 0.252046 0.679449 -vt 0.257300 0.675055 -vt 0.216901 0.794587 -vt 0.221679 0.788950 -vt 0.228720 0.780644 -vt 0.237271 0.770557 -vt 0.246576 0.759580 -vt 0.255880 0.748604 -vt 0.264431 0.738517 -vt 0.271472 0.730211 -vt 0.276251 0.724574 -vt 0.247536 0.852163 -vt 0.251728 0.845425 -vt 0.257906 0.835495 -vt 0.265407 0.823437 -vt 0.273570 0.810315 -vt 0.281734 0.797193 -vt 0.289235 0.785135 -vt 0.295413 0.775205 -vt 0.299605 0.768467 -vt 0.283355 0.901406 -vt 0.286862 0.893726 -vt 0.292029 0.882407 -vt 0.298304 0.868663 -vt 0.305133 0.853706 -vt 0.311962 0.838750 -vt 0.318237 0.825006 -vt 0.323405 0.813687 -vt 0.326911 0.806006 -vt 0.323766 0.941364 -vt 0.326499 0.932919 -vt 0.330528 0.920474 -vt 0.335419 0.905362 -vt 0.340742 0.888916 -vt 0.346065 0.872471 -vt 0.350956 0.857358 -vt 0.354985 0.844913 -vt 0.357718 0.836468 -vt 0.368176 0.971085 -vt 0.370060 0.962071 -vt 0.372836 0.948788 -vt 0.376206 0.932658 -vt 0.379875 0.915105 -vt 0.383543 0.897552 -vt 0.386914 0.881422 -vt 0.389690 0.868139 -vt 0.391573 0.859125 -vt 0.415993 0.989615 -vt 0.416961 0.980247 -vt 0.418389 0.966441 -vt 0.420123 0.949677 -vt 0.422009 0.931434 -vt 0.423896 0.913190 -vt 0.425629 0.896426 -vt 0.427057 0.882620 -vt 0.428026 0.873252 -vt 0.466623 0.996004 -vt 0.466623 0.986513 -vt 0.466623 0.972527 -vt 0.466623 0.955544 -vt 0.466623 0.937063 -vt 0.466623 0.918581 -vt 0.466623 0.901598 -vt 0.466623 0.887612 -vt 0.466623 0.878122 -vt 0.517254 0.989615 -vt 0.516285 0.980247 -vt 0.514858 0.966441 -vt 0.513124 0.949677 -vt 0.511238 0.931433 -vt 0.509351 0.913190 -vt 0.507617 0.896426 -vt 0.506190 0.882620 -vt 0.505221 0.873252 -vt 0.565071 0.971085 -vt 0.563187 0.962071 -vt 0.560411 0.948788 -vt 0.557040 0.932658 -vt 0.553372 0.915105 -vt 0.549704 0.897552 -vt 0.546333 0.881422 -vt 0.543557 0.868139 -vt 0.541673 0.859125 -vt 0.609481 0.941364 -vt 0.606747 0.932919 -vt 0.602719 0.920474 -vt 0.597828 0.905362 -vt 0.592505 0.888916 -vt 0.587182 0.872470 -vt 0.582290 0.857358 -vt 0.578262 0.844913 -vt 0.575529 0.836468 -vt 0.649891 0.901406 -vt 0.646385 0.893726 -vt 0.641217 0.882407 -vt 0.634942 0.868663 -vt 0.628113 0.853706 -vt 0.621285 0.838750 -vt 0.615010 0.825005 -vt 0.609842 0.813687 -vt 0.606335 0.806006 -vt 0.685711 0.852163 -vt 0.681519 0.845424 -vt 0.675341 0.835494 -vt 0.667840 0.823436 -vt 0.659676 0.810315 -vt 0.651513 0.797193 -vt 0.644011 0.785135 -vt 0.637834 0.775205 -vt 0.633642 0.768466 -vt 0.716346 0.794587 -vt 0.711568 0.788950 -vt 0.704526 0.780643 -vt 0.695976 0.770557 -vt 0.686671 0.759580 -vt 0.677366 0.748604 -vt 0.668816 0.738517 -vt 0.661774 0.730211 -vt 0.656996 0.724574 -vt 0.741205 0.729630 -vt 0.735951 0.725236 -vt 0.728208 0.718761 -vt 0.718807 0.710899 -vt 0.708576 0.702343 -vt 0.698345 0.693786 -vt 0.688943 0.685924 -vt 0.681201 0.679449 -vt 0.675947 0.675055 -vt 0.759694 0.658245 -vt 0.754087 0.655217 -vt 0.745823 0.650755 -vt 0.735788 0.645337 -vt 0.724868 0.639440 -vt 0.713948 0.633544 -vt 0.703914 0.628126 -vt 0.695650 0.623664 -vt 0.690042 0.620636 -vt 0.771223 0.581384 -vt 0.765395 0.579827 -vt 0.756806 0.577532 -vt 0.746376 0.574746 -vt 0.735027 0.571713 -vt 0.723677 0.568681 -vt 0.713248 0.565894 -vt 0.704659 0.563599 -vt 0.698830 0.562042 -vt 0.696143 0.438676 -vt 0.699137 0.500000 -vt 0.693738 0.439318 -vt 0.696702 0.500000 -vt 0.688298 0.440772 -vt 0.691190 0.500000 -vt 0.678647 0.443351 -vt 0.681413 0.500000 -vt 0.663612 0.447367 -vt 0.666182 0.500000 -vt 0.642021 0.453136 -vt 0.644310 0.500000 -vt 0.612700 0.460971 -vt 0.614606 0.500000 -vt 0.574475 0.471184 -vt 0.575883 0.500000 -vt 0.526174 0.484089 -vt 0.526951 0.500000 -vt 0.466623 0.500000 -vt 0.687456 0.380760 -vt 0.685143 0.382009 -vt 0.679908 0.384836 -vt 0.670622 0.389850 -vt 0.656157 0.397660 -vt 0.635383 0.408877 -vt 0.607171 0.424110 -vt 0.570393 0.443969 -vt 0.523920 0.469062 -vt 0.673524 0.326971 -vt 0.671356 0.328783 -vt 0.666452 0.332885 -vt 0.657752 0.340161 -vt 0.644199 0.351495 -vt 0.624736 0.367772 -vt 0.598304 0.389876 -vt 0.563847 0.418693 -vt 0.520306 0.455106 -vt 0.654792 0.278025 -vt 0.652821 0.280350 -vt 0.648361 0.285612 -vt 0.640448 0.294946 -vt 0.628123 0.309486 -vt 0.610421 0.330368 -vt 0.586383 0.358725 -vt 0.555045 0.395693 -vt 0.515445 0.442407 -vt 0.631708 0.234641 -vt 0.629979 0.237421 -vt 0.626066 0.243711 -vt 0.619124 0.254869 -vt 0.608310 0.272251 -vt 0.592781 0.297214 -vt 0.571691 0.331113 -vt 0.544197 0.375307 -vt 0.509456 0.431150 -vt 0.604718 0.197536 -vt 0.603271 0.200704 -vt 0.599998 0.207874 -vt 0.594191 0.220592 -vt 0.585145 0.240405 -vt 0.572155 0.268858 -vt 0.554513 0.307498 -vt 0.531515 0.357871 -vt 0.502453 0.421523 -vt 0.574268 0.167427 -vt 0.573140 0.170910 -vt 0.570589 0.178794 -vt 0.566062 0.192778 -vt 0.559011 0.214563 -vt 0.548885 0.245849 -vt 0.535133 0.288335 -vt 0.517206 0.343722 -vt 0.494553 0.413711 -vt 0.540805 0.145032 -vt 0.540027 0.148750 -vt 0.538269 0.157165 -vt 0.535150 0.172091 -vt 0.530291 0.195343 -vt 0.523312 0.228735 -vt 0.513836 0.274082 -vt 0.501481 0.333199 -vt 0.485870 0.407900 -vt 0.504774 0.131069 -vt 0.504374 0.134933 -vt 0.503470 0.143679 -vt 0.501866 0.159192 -vt 0.499367 0.183359 -vt 0.495778 0.218064 -vt 0.490904 0.265195 -vt 0.484550 0.326638 -vt 0.476522 0.404277 -vt 0.466623 0.126255 -vt 0.466623 0.130170 -vt 0.466623 0.139030 -vt 0.466623 0.154745 -vt 0.466623 0.179227 -vt 0.466623 0.214386 -vt 0.466623 0.262132 -vt 0.466623 0.324376 -vt 0.466623 0.403028 -vt 0.428472 0.131069 -vt 0.428872 0.134933 -vt 0.429776 0.143679 -vt 0.431380 0.159192 -vt 0.433880 0.183359 -vt 0.437468 0.218064 -vt 0.442342 0.265195 -vt 0.448696 0.326638 -vt 0.456725 0.404277 -vt 0.392442 0.145032 -vt 0.393219 0.148750 -vt 0.394977 0.157165 -vt 0.398097 0.172091 -vt 0.402956 0.195343 -vt 0.409934 0.228735 -vt 0.419411 0.274082 -vt 0.431765 0.333199 -vt 0.447376 0.407900 -vt 0.358978 0.167427 -vt 0.360106 0.170910 -vt 0.362658 0.178794 -vt 0.367184 0.192779 -vt 0.374235 0.214563 -vt 0.384362 0.245849 -vt 0.398113 0.288335 -vt 0.416041 0.343722 -vt 0.438694 0.413711 -vt 0.328528 0.197536 -vt 0.329975 0.200704 -vt 0.333248 0.207874 -vt 0.339055 0.220592 -vt 0.348101 0.240405 -vt 0.361092 0.268858 -vt 0.378733 0.307498 -vt 0.401732 0.357871 -vt 0.430793 0.421523 -vt 0.301538 0.234641 -vt 0.303267 0.237421 -vt 0.307181 0.243711 -vt 0.314122 0.254869 -vt 0.324936 0.272251 -vt 0.340466 0.297214 -vt 0.361556 0.331114 -vt 0.389049 0.375307 -vt 0.423790 0.431150 -vt 0.278454 0.278025 -vt 0.280425 0.280351 -vt 0.284886 0.285613 -vt 0.292798 0.294946 -vt 0.305124 0.309487 -vt 0.322825 0.330368 -vt 0.346864 0.358725 -vt 0.378202 0.395693 -vt 0.417801 0.442407 -vt 0.259723 0.326971 -vt 0.261890 0.328784 -vt 0.266795 0.332885 -vt 0.275495 0.340161 -vt 0.289047 0.351495 -vt 0.308511 0.367772 -vt 0.334942 0.389877 -vt 0.369400 0.418693 -vt 0.412941 0.455106 -vt 0.245791 0.380761 -vt 0.248104 0.382010 -vt 0.253339 0.384836 -vt 0.262624 0.389850 -vt 0.277090 0.397661 -vt 0.297864 0.408878 -vt 0.326075 0.424111 -vt 0.362853 0.443969 -vt 0.409326 0.469062 -vt 0.237104 0.438676 -vt 0.239508 0.439318 -vt 0.244949 0.440772 -vt 0.254600 0.443351 -vt 0.269634 0.447368 -vt 0.291225 0.453137 -vt 0.320547 0.460971 -vt 0.358771 0.471184 -vt 0.407072 0.484089 -vt 0.234109 0.500000 -vt 0.236545 0.500000 -vt 0.242056 0.500000 -vt 0.251833 0.500000 -vt 0.267064 0.500000 -vt 0.288937 0.500000 -vt 0.318641 0.500000 -vt 0.357364 0.500000 -vt 0.406295 0.500000 -vt 0.237104 0.561324 -vt 0.239508 0.560682 -vt 0.244949 0.559228 -vt 0.254600 0.556649 -vt 0.269634 0.552633 -vt 0.291225 0.546864 -vt 0.320547 0.539029 -vt 0.358771 0.528816 -vt 0.407072 0.515911 -vt 0.245791 0.619240 -vt 0.248104 0.617991 -vt 0.253339 0.615164 -vt 0.262625 0.610150 -vt 0.277090 0.602340 -vt 0.297864 0.591122 -vt 0.326075 0.575890 -vt 0.362853 0.556031 -vt 0.409326 0.530938 -vt 0.259723 0.673029 -vt 0.261890 0.671217 -vt 0.266795 0.667115 -vt 0.275495 0.659839 -vt 0.289048 0.648505 -vt 0.308511 0.632228 -vt 0.334942 0.610124 -vt 0.369400 0.581307 -vt 0.412941 0.544894 -vt 0.278454 0.721975 -vt 0.280425 0.719650 -vt 0.284886 0.714388 -vt 0.292798 0.705054 -vt 0.305124 0.690514 -vt 0.322825 0.669632 -vt 0.346864 0.641275 -vt 0.378202 0.604307 -vt 0.417801 0.557593 -vt 0.301538 0.765359 -vt 0.303267 0.762579 -vt 0.307181 0.756289 -vt 0.314123 0.745131 -vt 0.324936 0.727749 -vt 0.340466 0.702786 -vt 0.361556 0.668887 -vt 0.389049 0.624693 -vt 0.423790 0.568850 -vt 0.328528 0.802464 -vt 0.329975 0.799296 -vt 0.333249 0.792126 -vt 0.339055 0.779408 -vt 0.348101 0.759595 -vt 0.361092 0.731142 -vt 0.378733 0.692502 -vt 0.401732 0.642129 -vt 0.430793 0.578477 -vt 0.358979 0.832573 -vt 0.360106 0.829090 -vt 0.362658 0.821206 -vt 0.367184 0.807222 -vt 0.374235 0.785437 -vt 0.384362 0.754151 -vt 0.398113 0.711665 -vt 0.416041 0.656278 -vt 0.438694 0.586289 -vt 0.392442 0.854968 -vt 0.393219 0.851250 -vt 0.394978 0.842835 -vt 0.398097 0.827909 -vt 0.402956 0.804657 -vt 0.409934 0.771265 -vt 0.419411 0.725918 -vt 0.431765 0.666801 -vt 0.447376 0.592100 -vt 0.428472 0.868931 -vt 0.428872 0.865067 -vt 0.429776 0.856321 -vt 0.431381 0.840808 -vt 0.433880 0.816641 -vt 0.437469 0.781936 -vt 0.442342 0.734805 -vt 0.448696 0.673362 -vt 0.456725 0.595723 -vt 0.466623 0.873745 -vt 0.466623 0.869830 -vt 0.466623 0.860970 -vt 0.466623 0.845255 -vt 0.466623 0.820773 -vt 0.466623 0.785614 -vt 0.466623 0.737868 -vt 0.466623 0.675624 -vt 0.466623 0.596972 -vt 0.504774 0.868931 -vt 0.504375 0.865067 -vt 0.503470 0.856321 -vt 0.501866 0.840808 -vt 0.499367 0.816641 -vt 0.495778 0.781936 -vt 0.490904 0.734805 -vt 0.484551 0.673362 -vt 0.476522 0.595723 -vt 0.540805 0.854968 -vt 0.540028 0.851250 -vt 0.538269 0.842835 -vt 0.535150 0.827909 -vt 0.530291 0.804657 -vt 0.523312 0.771265 -vt 0.513836 0.725918 -vt 0.501481 0.666801 -vt 0.485870 0.592100 -vt 0.574268 0.832573 -vt 0.573141 0.829090 -vt 0.570589 0.821206 -vt 0.566062 0.807221 -vt 0.559011 0.785437 -vt 0.548885 0.754151 -vt 0.535133 0.711665 -vt 0.517206 0.656278 -vt 0.494553 0.586289 -vt 0.604718 0.802464 -vt 0.603272 0.799296 -vt 0.599998 0.792126 -vt 0.594191 0.779408 -vt 0.585145 0.759595 -vt 0.572155 0.731142 -vt 0.554513 0.692502 -vt 0.531515 0.642129 -vt 0.502453 0.578477 -vt 0.631708 0.765359 -vt 0.629979 0.762579 -vt 0.626066 0.756289 -vt 0.619124 0.745131 -vt 0.608310 0.727749 -vt 0.592781 0.702786 -vt 0.571691 0.668886 -vt 0.544197 0.624693 -vt 0.509456 0.568850 -vt 0.654792 0.721975 -vt 0.652821 0.719649 -vt 0.648361 0.714387 -vt 0.640448 0.705054 -vt 0.628123 0.690513 -vt 0.610421 0.669632 -vt 0.586383 0.641275 -vt 0.555045 0.604307 -vt 0.515446 0.557593 -vt 0.673524 0.673029 -vt 0.671356 0.671216 -vt 0.666452 0.667115 -vt 0.657752 0.659839 -vt 0.644199 0.648505 -vt 0.624736 0.632228 -vt 0.598304 0.610123 -vt 0.563847 0.581307 -vt 0.520306 0.544894 -vt 0.687456 0.619239 -vt 0.685143 0.617990 -vt 0.679908 0.615164 -vt 0.670622 0.610150 -vt 0.656157 0.602339 -vt 0.635383 0.591122 -vt 0.607171 0.575889 -vt 0.570393 0.556031 -vt 0.523920 0.530938 -vt 0.696143 0.561324 -vt 0.693739 0.560682 -vt 0.688298 0.559228 -vt 0.678647 0.556649 -vt 0.663612 0.552632 -vt 0.642021 0.546863 -vt 0.612700 0.539029 -vt 0.574475 0.528816 -vt 0.526174 0.515911 -vt 0.218024 0.500000 -vt 0.218459 0.479770 -vt 0.186878 0.479770 -vt 0.186809 0.500000 -vt 0.158237 0.479770 -vt 0.158484 0.500000 -vt 0.132626 0.479770 -vt 0.133143 0.500000 -vt 0.110136 0.479770 -vt 0.110878 0.500000 -vt 0.090858 0.479770 -vt 0.091782 0.500000 -vt 0.074881 0.479770 -vt 0.075949 0.500000 -vt 0.062297 0.479770 -vt 0.063473 0.500000 -vt 0.053196 0.479770 -vt 0.054446 0.500000 -vt 0.047669 0.479770 -vt 0.048961 0.500000 -vt 0.045807 0.479770 -vt 0.047112 0.500000 -vt 0.219640 0.464036 -vt 0.187066 0.464036 -vt 0.157567 0.464036 -vt 0.131225 0.464036 -vt 0.108124 0.464036 -vt 0.088348 0.464036 -vt 0.071981 0.464036 -vt 0.059105 0.464036 -vt 0.049805 0.464036 -vt 0.044163 0.464036 -vt 0.042264 0.464036 -vt 0.221380 0.452797 -vt 0.187343 0.452797 -vt 0.156578 0.452797 -vt 0.129159 0.452797 -vt 0.105159 0.452797 -vt 0.084650 0.452797 -vt 0.067707 0.452797 -vt 0.054401 0.452797 -vt 0.044807 0.452797 -vt 0.038997 0.452797 -vt 0.037044 0.452797 -vt 0.223493 0.446054 -vt 0.187679 0.446054 -vt 0.155378 0.446054 -vt 0.126651 0.446054 -vt 0.101558 0.446054 -vt 0.080160 0.446054 -vt 0.062517 0.446054 -vt 0.048690 0.446054 -vt 0.038738 0.446054 -vt 0.032723 0.446054 -vt 0.030704 0.446054 -vt 0.225793 0.443806 -vt 0.188044 0.443806 -vt 0.154072 0.443806 -vt 0.123921 0.443806 -vt 0.097640 0.443806 -vt 0.075273 0.443806 -vt 0.056869 0.443806 -vt 0.042474 0.443806 -vt 0.032134 0.443806 -vt 0.025896 0.443806 -vt 0.023806 0.443806 -vt 0.228092 0.446054 -vt 0.188410 0.446054 -vt 0.152766 0.446054 -vt 0.121192 0.446054 -vt 0.093721 0.446054 -vt 0.070387 0.446054 -vt 0.051222 0.446054 -vt 0.036258 0.446054 -vt 0.025530 0.446054 -vt 0.019068 0.446054 -vt 0.016907 0.446054 -vt 0.230205 0.452797 -vt 0.188746 0.452797 -vt 0.151565 0.452797 -vt 0.118684 0.452797 -vt 0.090121 0.452797 -vt 0.065897 0.452797 -vt 0.046032 0.452797 -vt 0.030547 0.452797 -vt 0.019461 0.452797 -vt 0.012794 0.452797 -vt 0.010568 0.452797 -vt 0.231945 0.464036 -vt 0.189023 0.464036 -vt 0.150577 0.464036 -vt 0.116618 0.464036 -vt 0.087155 0.464036 -vt 0.062199 0.464036 -vt 0.041758 0.464036 -vt 0.025843 0.464036 -vt 0.014463 0.464036 -vt 0.007628 0.464036 -vt 0.005347 0.464036 -vt 0.233126 0.479770 -vt 0.189210 0.479770 -vt 0.149906 0.479770 -vt 0.115216 0.479770 -vt 0.085143 0.479770 -vt 0.059689 0.479770 -vt 0.038858 0.479770 -vt 0.022651 0.479770 -vt 0.011071 0.479770 -vt 0.004122 0.479770 -vt 0.001805 0.479770 -vt 0.189280 0.500000 -vt 0.149659 0.500000 -vt 0.114700 0.500000 -vt 0.084402 0.500000 -vt 0.058765 0.500000 -vt 0.037789 0.500000 -vt 0.021475 0.500000 -vt 0.009822 0.500000 -vt 0.002830 0.500000 -vt 0.000500 0.500000 -vt 0.233126 0.520230 -vt 0.189210 0.520230 -vt 0.149906 0.520230 -vt 0.115216 0.520230 -vt 0.085143 0.520230 -vt 0.059689 0.520230 -vt 0.038858 0.520230 -vt 0.022651 0.520230 -vt 0.011072 0.520230 -vt 0.004122 0.520230 -vt 0.001805 0.520230 -vt 0.231945 0.535964 -vt 0.189023 0.535964 -vt 0.150577 0.535964 -vt 0.116618 0.535964 -vt 0.087155 0.535964 -vt 0.062199 0.535964 -vt 0.041758 0.535964 -vt 0.025843 0.535964 -vt 0.014463 0.535964 -vt 0.007628 0.535964 -vt 0.005347 0.535964 -vt 0.230205 0.547203 -vt 0.188746 0.547203 -vt 0.151565 0.547203 -vt 0.118684 0.547203 -vt 0.090121 0.547203 -vt 0.065897 0.547203 -vt 0.046032 0.547203 -vt 0.030547 0.547203 -vt 0.019461 0.547203 -vt 0.012794 0.547203 -vt 0.010568 0.547203 -vt 0.228092 0.553946 -vt 0.188410 0.553946 -vt 0.152766 0.553946 -vt 0.121192 0.553946 -vt 0.093721 0.553946 -vt 0.070387 0.553946 -vt 0.051222 0.553946 -vt 0.036258 0.553946 -vt 0.025530 0.553946 -vt 0.019068 0.553946 -vt 0.016907 0.553946 -vt 0.225793 0.556194 -vt 0.188044 0.556194 -vt 0.154072 0.556194 -vt 0.123921 0.556194 -vt 0.097640 0.556194 -vt 0.075273 0.556194 -vt 0.056869 0.556194 -vt 0.042474 0.556194 -vt 0.032134 0.556194 -vt 0.025896 0.556194 -vt 0.023806 0.556194 -vt 0.223493 0.553946 -vt 0.187679 0.553946 -vt 0.155378 0.553946 -vt 0.126651 0.553946 -vt 0.101558 0.553946 -vt 0.080160 0.553946 -vt 0.062517 0.553946 -vt 0.048690 0.553946 -vt 0.038738 0.553946 -vt 0.032723 0.553946 -vt 0.030704 0.553946 -vt 0.221380 0.547203 -vt 0.187343 0.547203 -vt 0.156578 0.547203 -vt 0.129159 0.547203 -vt 0.105159 0.547203 -vt 0.084650 0.547203 -vt 0.067707 0.547203 -vt 0.054401 0.547203 -vt 0.044807 0.547203 -vt 0.038997 0.547203 -vt 0.037044 0.547203 -vt 0.219640 0.535964 -vt 0.187066 0.535964 -vt 0.157567 0.535964 -vt 0.131225 0.535964 -vt 0.108124 0.535964 -vt 0.088348 0.535964 -vt 0.071981 0.535964 -vt 0.059105 0.535964 -vt 0.049805 0.535964 -vt 0.044163 0.535964 -vt 0.042264 0.535964 -vt 0.218459 0.520230 -vt 0.186878 0.520230 -vt 0.158237 0.520230 -vt 0.132626 0.520230 -vt 0.110136 0.520230 -vt 0.090858 0.520230 -vt 0.074881 0.520230 -vt 0.062297 0.520230 -vt 0.053196 0.520230 -vt 0.047669 0.520230 -vt 0.045807 0.520230 -vt 0.046774 0.479770 -vt 0.048060 0.500000 -vt 0.049737 0.479770 -vt 0.050965 0.500000 -vt 0.054787 0.479770 -vt 0.055922 0.500000 -vt 0.062016 0.479770 -vt 0.063022 0.500000 -vt 0.071517 0.479770 -vt 0.072360 0.500000 -vt 0.083382 0.479770 -vt 0.084029 0.500000 -vt 0.097701 0.479770 -vt 0.098121 0.500000 -vt 0.114567 0.479770 -vt 0.114731 0.500000 -vt 0.134073 0.479770 -vt 0.133951 0.500000 -vt 0.156309 0.479770 -vt 0.043284 0.464036 -vt 0.046402 0.464036 -vt 0.051707 0.464036 -vt 0.059286 0.464036 -vt 0.069229 0.464036 -vt 0.081624 0.464036 -vt 0.096560 0.464036 -vt 0.114123 0.464036 -vt 0.134404 0.464036 -vt 0.157490 0.464036 -vt 0.038141 0.452797 -vt 0.041488 0.452797 -vt 0.047167 0.452797 -vt 0.055263 0.452797 -vt 0.065858 0.452797 -vt 0.079035 0.452797 -vt 0.094878 0.452797 -vt 0.113469 0.452797 -vt 0.134892 0.452797 -vt 0.159230 0.452797 -vt 0.031895 0.446054 -vt 0.035520 0.446054 -vt 0.041655 0.446054 -vt 0.050377 0.446054 -vt 0.061764 0.446054 -vt 0.075891 0.446054 -vt 0.092835 0.446054 -vt 0.112675 0.446054 -vt 0.135485 0.446054 -vt 0.161343 0.446054 -vt 0.025099 0.443806 -vt 0.029026 0.443806 -vt 0.035657 0.443806 -vt 0.045061 0.443806 -vt 0.057308 0.443806 -vt 0.072469 0.443806 -vt 0.090613 0.443806 -vt 0.111810 0.443806 -vt 0.136130 0.443806 -vt 0.163643 0.443806 -vt 0.018303 0.446054 -vt 0.022532 0.446054 -vt 0.029659 0.446054 -vt 0.039744 0.446054 -vt 0.052853 0.446054 -vt 0.069047 0.446054 -vt 0.088390 0.446054 -vt 0.110945 0.446054 -vt 0.136775 0.446054 -vt 0.165942 0.446054 -vt 0.012058 0.452797 -vt 0.016565 0.452797 -vt 0.024146 0.452797 -vt 0.034859 0.452797 -vt 0.048759 0.452797 -vt 0.065903 0.452797 -vt 0.086348 0.452797 -vt 0.110151 0.452797 -vt 0.137368 0.452797 -vt 0.168055 0.452797 -vt 0.006915 0.464036 -vt 0.011651 0.464036 -vt 0.019607 0.464036 -vt 0.030836 0.464036 -vt 0.045387 0.464036 -vt 0.063314 0.464036 -vt 0.084666 0.464036 -vt 0.109496 0.464036 -vt 0.137856 0.464036 -vt 0.169796 0.464036 -vt 0.003425 0.479770 -vt 0.008316 0.479770 -vt 0.016527 0.479770 -vt 0.028105 0.479770 -vt 0.043099 0.479770 -vt 0.061556 0.479770 -vt 0.083525 0.479770 -vt 0.109052 0.479770 -vt 0.138187 0.479770 -vt 0.170976 0.479770 -vt 0.002139 0.500000 -vt 0.007087 0.500000 -vt 0.015392 0.500000 -vt 0.027100 0.500000 -vt 0.042256 0.500000 -vt 0.060909 0.500000 -vt 0.083104 0.500000 -vt 0.108889 0.500000 -vt 0.138309 0.500000 -vt 0.171412 0.500000 -vt 0.003425 0.520230 -vt 0.008316 0.520230 -vt 0.016527 0.520230 -vt 0.028105 0.520230 -vt 0.043099 0.520230 -vt 0.061556 0.520230 -vt 0.083525 0.520230 -vt 0.109052 0.520230 -vt 0.138187 0.520230 -vt 0.170977 0.520230 -vt 0.006915 0.535964 -vt 0.011651 0.535964 -vt 0.019607 0.535964 -vt 0.030836 0.535964 -vt 0.045387 0.535964 -vt 0.063314 0.535964 -vt 0.084666 0.535964 -vt 0.109496 0.535964 -vt 0.137856 0.535964 -vt 0.169796 0.535964 -vt 0.012058 0.547203 -vt 0.016565 0.547203 -vt 0.024146 0.547203 -vt 0.034859 0.547203 -vt 0.048759 0.547203 -vt 0.065903 0.547203 -vt 0.086348 0.547203 -vt 0.110151 0.547203 -vt 0.137368 0.547203 -vt 0.168055 0.547203 -vt 0.018303 0.553946 -vt 0.022532 0.553946 -vt 0.029659 0.553946 -vt 0.039744 0.553946 -vt 0.052853 0.553946 -vt 0.069047 0.553946 -vt 0.088390 0.553946 -vt 0.110945 0.553946 -vt 0.136775 0.553946 -vt 0.165942 0.553946 -vt 0.025099 0.556194 -vt 0.029026 0.556194 -vt 0.035657 0.556194 -vt 0.045061 0.556194 -vt 0.057308 0.556194 -vt 0.072469 0.556194 -vt 0.090613 0.556194 -vt 0.111810 0.556194 -vt 0.136130 0.556194 -vt 0.163643 0.556194 -vt 0.031895 0.553946 -vt 0.035520 0.553946 -vt 0.041655 0.553946 -vt 0.050377 0.553946 -vt 0.061764 0.553946 -vt 0.075891 0.553946 -vt 0.092835 0.553946 -vt 0.112675 0.553946 -vt 0.135485 0.553946 -vt 0.161343 0.553946 -vt 0.038141 0.547203 -vt 0.041488 0.547203 -vt 0.047167 0.547203 -vt 0.055263 0.547203 -vt 0.065858 0.547203 -vt 0.079035 0.547203 -vt 0.094878 0.547203 -vt 0.113469 0.547203 -vt 0.134892 0.547203 -vt 0.159230 0.547203 -vt 0.043284 0.535964 -vt 0.046402 0.535964 -vt 0.051707 0.535964 -vt 0.059286 0.535964 -vt 0.069229 0.535964 -vt 0.081624 0.535964 -vt 0.096560 0.535964 -vt 0.114123 0.535964 -vt 0.134404 0.535964 -vt 0.157490 0.535964 -vt 0.046774 0.520230 -vt 0.049737 0.520230 -vt 0.054787 0.520230 -vt 0.062016 0.520230 -vt 0.071517 0.520230 -vt 0.083382 0.520230 -vt 0.097701 0.520230 -vt 0.114567 0.520230 -vt 0.134073 0.520230 -vt 0.156309 0.520230 -vt 0.730760 0.500000 -vt 0.730760 0.455494 -vt 0.767956 0.456269 -vt 0.767413 0.500000 -vt 0.795548 0.458370 -vt 0.794650 0.500000 -vt 0.815355 0.461466 -vt 0.814243 0.500000 -vt 0.829194 0.465226 -vt 0.827962 0.500000 -vt 0.838885 0.469318 -vt 0.837580 0.500000 -vt 0.846245 0.473410 -vt 0.844867 0.500000 -vt 0.853093 0.477170 -vt 0.851595 0.500000 -vt 0.861247 0.480266 -vt 0.859535 0.500000 -vt 0.872525 0.482368 -vt 0.870457 0.500000 -vt 0.888745 0.483142 -vt 0.886135 0.500000 -vt 0.730760 0.420879 -vt 0.769430 0.422255 -vt 0.797985 0.425991 -vt 0.818373 0.431496 -vt 0.832539 0.438180 -vt 0.842428 0.445454 -vt 0.849986 0.452729 -vt 0.857160 0.459413 -vt 0.865895 0.464918 -vt 0.878136 0.468654 -vt 0.895830 0.470030 -vt 0.730760 0.396154 -vt 0.771601 0.397960 -vt 0.801577 0.402863 -vt 0.822821 0.410088 -vt 0.837467 0.418861 -vt 0.847648 0.428409 -vt 0.855499 0.437956 -vt 0.863153 0.446730 -vt 0.872744 0.453955 -vt 0.886405 0.458858 -vt 0.906271 0.460664 -vt 0.730760 0.381319 -vt 0.774238 0.383383 -vt 0.805938 0.388986 -vt 0.828222 0.397243 -vt 0.843451 0.407270 -vt 0.853988 0.418182 -vt 0.862193 0.429093 -vt 0.870431 0.439120 -vt 0.881061 0.447377 -vt 0.896447 0.452980 -vt 0.918950 0.455045 -vt 0.730760 0.376374 -vt 0.777108 0.378524 -vt 0.810685 0.384361 -vt 0.834100 0.392962 -vt 0.849963 0.403406 -vt 0.860886 0.414773 -vt 0.869478 0.426139 -vt 0.878350 0.436583 -vt 0.890112 0.445185 -vt 0.907374 0.451021 -vt 0.932747 0.453172 -vt 0.779978 0.383383 -vt 0.815431 0.388986 -vt 0.839977 0.397243 -vt 0.856476 0.407270 -vt 0.867785 0.418182 -vt 0.876763 0.429093 -vt 0.886270 0.439120 -vt 0.899163 0.447377 -vt 0.918302 0.452980 -vt 0.946544 0.455045 -vt 0.782615 0.397960 -vt 0.819792 0.402863 -vt 0.845378 0.410088 -vt 0.862460 0.418861 -vt 0.874124 0.428409 -vt 0.883458 0.437956 -vt 0.893547 0.446730 -vt 0.907480 0.453955 -vt 0.928343 0.458858 -vt 0.959223 0.460664 -vt 0.784787 0.422255 -vt 0.823384 0.425991 -vt 0.849826 0.431496 -vt 0.867388 0.438180 -vt 0.879345 0.445454 -vt 0.888971 0.452729 -vt 0.899541 0.459413 -vt 0.914330 0.464918 -vt 0.936613 0.468654 -vt 0.969664 0.470030 -vt 0.786261 0.456269 -vt 0.825821 0.458370 -vt 0.852845 0.461466 -vt 0.870732 0.465226 -vt 0.882887 0.469318 -vt 0.892712 0.473410 -vt 0.903608 0.477170 -vt 0.918978 0.480266 -vt 0.942224 0.482368 -vt 0.976749 0.483142 -vt 0.786804 0.500000 -vt 0.826719 0.500000 -vt 0.853957 0.500000 -vt 0.871964 0.500000 -vt 0.884192 0.500000 -vt 0.894090 0.500000 -vt 0.905106 0.500000 -vt 0.920690 0.500000 -vt 0.944291 0.500000 -vt 0.979359 0.500000 -vt 0.730760 0.544505 -vt 0.786261 0.543731 -vt 0.825821 0.541630 -vt 0.852845 0.538534 -vt 0.870732 0.534773 -vt 0.882887 0.530682 -vt 0.892712 0.526590 -vt 0.903608 0.522830 -vt 0.918978 0.519733 -vt 0.942224 0.517632 -vt 0.976749 0.516858 -vt 0.730760 0.579121 -vt 0.784787 0.577745 -vt 0.823384 0.574009 -vt 0.849826 0.568504 -vt 0.867388 0.561820 -vt 0.879345 0.554545 -vt 0.888971 0.547271 -vt 0.899541 0.540586 -vt 0.914330 0.535082 -vt 0.936613 0.531346 -vt 0.969664 0.529970 -vt 0.730760 0.603846 -vt 0.782615 0.602040 -vt 0.819792 0.597137 -vt 0.845378 0.589912 -vt 0.862460 0.581138 -vt 0.874124 0.571591 -vt 0.883458 0.562043 -vt 0.893547 0.553270 -vt 0.907480 0.546045 -vt 0.928343 0.541142 -vt 0.959223 0.539335 -vt 0.730760 0.618681 -vt 0.779978 0.616617 -vt 0.815431 0.611014 -vt 0.839977 0.602756 -vt 0.856476 0.592730 -vt 0.867785 0.581818 -vt 0.876763 0.570907 -vt 0.886270 0.560880 -vt 0.899163 0.552622 -vt 0.918302 0.547019 -vt 0.946544 0.544955 -vt 0.730760 0.623626 -vt 0.777108 0.621476 -vt 0.810685 0.615639 -vt 0.834100 0.607038 -vt 0.849963 0.596593 -vt 0.860886 0.585227 -vt 0.869478 0.573861 -vt 0.878350 0.563416 -vt 0.890112 0.554815 -vt 0.907374 0.548978 -vt 0.932747 0.546828 -vt 0.774238 0.616617 -vt 0.805938 0.611014 -vt 0.828222 0.602756 -vt 0.843451 0.592730 -vt 0.853988 0.581818 -vt 0.862194 0.570907 -vt 0.870431 0.560880 -vt 0.881061 0.552622 -vt 0.896447 0.547019 -vt 0.918950 0.544955 -vt 0.771601 0.602040 -vt 0.801577 0.597137 -vt 0.822821 0.589912 -vt 0.837467 0.581138 -vt 0.847648 0.571591 -vt 0.855499 0.562043 -vt 0.863153 0.553270 -vt 0.872744 0.546045 -vt 0.886405 0.541142 -vt 0.906271 0.539335 -vt 0.769430 0.577745 -vt 0.797985 0.574009 -vt 0.818373 0.568504 -vt 0.832539 0.561820 -vt 0.842428 0.554545 -vt 0.849986 0.547271 -vt 0.857160 0.540586 -vt 0.865895 0.535082 -vt 0.878136 0.531346 -vt 0.895830 0.529970 -vt 0.767956 0.543731 -vt 0.795548 0.541630 -vt 0.815355 0.538534 -vt 0.829194 0.534773 -vt 0.838885 0.530682 -vt 0.846245 0.526590 -vt 0.853093 0.522830 -vt 0.861247 0.519733 -vt 0.872525 0.517632 -vt 0.888745 0.516858 -vt 0.893500 0.483330 -vt 0.890765 0.500000 -vt 0.898000 0.483843 -vt 0.895208 0.500000 -vt 0.902065 0.484598 -vt 0.899279 0.500000 -vt 0.905518 0.485515 -vt 0.902791 0.500000 -vt 0.908180 0.486513 -vt 0.905556 0.500000 -vt 0.909875 0.487511 -vt 0.907390 0.500000 -vt 0.910423 0.488428 -vt 0.908105 0.500000 -vt 0.909648 0.489184 -vt 0.907514 0.500000 -vt 0.907370 0.489696 -vt 0.905432 0.500000 -vt 0.903412 0.489885 -vt 0.901672 0.500000 -vt 0.900926 0.470365 -vt 0.905576 0.471277 -vt 0.909625 0.472619 -vt 0.912919 0.474250 -vt 0.915302 0.476024 -vt 0.916620 0.477798 -vt 0.916717 0.479428 -vt 0.915438 0.480771 -vt 0.912630 0.481682 -vt 0.908136 0.482018 -vt 0.911869 0.461105 -vt 0.916741 0.462301 -vt 0.920767 0.464063 -vt 0.923827 0.466203 -vt 0.925798 0.468531 -vt 0.926560 0.470860 -vt 0.925992 0.473000 -vt 0.923972 0.474762 -vt 0.920381 0.475958 -vt 0.915096 0.476398 -vt 0.925156 0.455548 -vt 0.930299 0.456915 -vt 0.934297 0.458929 -vt 0.937072 0.461374 -vt 0.938542 0.464036 -vt 0.938630 0.466697 -vt 0.937254 0.469143 -vt 0.934335 0.471157 -vt 0.929793 0.472523 -vt 0.923549 0.473027 -vt 0.939616 0.453696 -vt 0.945053 0.455120 -vt 0.949021 0.457218 -vt 0.951485 0.459765 -vt 0.952412 0.462537 -vt 0.951765 0.465310 -vt 0.949510 0.467857 -vt 0.945612 0.469955 -vt 0.940036 0.471378 -vt 0.932747 0.471903 -vt 0.954077 0.455548 -vt 0.959807 0.456915 -vt 0.963744 0.458929 -vt 0.965899 0.461374 -vt 0.966281 0.464036 -vt 0.964900 0.466697 -vt 0.961766 0.469143 -vt 0.956889 0.471157 -vt 0.950279 0.472523 -vt 0.941945 0.473027 -vt 0.967364 0.461105 -vt 0.973364 0.462301 -vt 0.977274 0.464063 -vt 0.979144 0.466203 -vt 0.979025 0.468531 -vt 0.976970 0.470860 -vt 0.973028 0.473000 -vt 0.967252 0.474762 -vt 0.959691 0.475958 -vt 0.950397 0.476398 -vt 0.978307 0.470365 -vt 0.984529 0.471277 -vt 0.988416 0.472619 -vt 0.990051 0.474250 -vt 0.989521 0.476024 -vt 0.986910 0.477798 -vt 0.982303 0.479428 -vt 0.975785 0.480771 -vt 0.967442 0.481682 -vt 0.957358 0.482018 -vt 0.985732 0.483330 -vt 0.992105 0.483843 -vt 0.995976 0.484598 -vt 0.997453 0.485515 -vt 0.996643 0.486513 -vt 0.993655 0.487511 -vt 0.988597 0.488428 -vt 0.981576 0.489184 -vt 0.972702 0.489696 -vt 0.962082 0.489885 -vt 0.988468 0.500000 -vt 0.994897 0.500000 -vt 0.998762 0.500000 -vt 1.000180 0.500000 -vt 0.999267 0.500000 -vt 0.996140 0.500000 -vt 0.990915 0.500000 -vt 0.983710 0.500000 -vt 0.974640 0.500000 -vt 0.963822 0.500000 -vt 0.985732 0.516669 -vt 0.992105 0.516157 -vt 0.995976 0.515401 -vt 0.997453 0.514484 -vt 0.996643 0.513486 -vt 0.993655 0.512488 -vt 0.988597 0.511571 -vt 0.981576 0.510816 -vt 0.972702 0.510303 -vt 0.962082 0.510115 -vt 0.978307 0.529634 -vt 0.984529 0.528723 -vt 0.988416 0.527380 -vt 0.990051 0.525750 -vt 0.989521 0.523976 -vt 0.986910 0.522202 -vt 0.982303 0.520571 -vt 0.975785 0.519229 -vt 0.967442 0.518317 -vt 0.957358 0.517982 -vt 0.967364 0.538895 -vt 0.973364 0.537699 -vt 0.977274 0.535937 -vt 0.979144 0.533797 -vt 0.979025 0.531468 -vt 0.976970 0.529140 -vt 0.973028 0.527000 -vt 0.967252 0.525238 -vt 0.959691 0.524042 -vt 0.950397 0.523601 -vt 0.954077 0.544451 -vt 0.959806 0.543085 -vt 0.963744 0.541071 -vt 0.965899 0.538625 -vt 0.966281 0.535964 -vt 0.964900 0.533302 -vt 0.961766 0.530857 -vt 0.956889 0.528843 -vt 0.950279 0.527476 -vt 0.941945 0.526973 -vt 0.939616 0.546304 -vt 0.945053 0.544880 -vt 0.949021 0.542782 -vt 0.951485 0.540235 -vt 0.952412 0.537462 -vt 0.951765 0.534690 -vt 0.949510 0.532143 -vt 0.945612 0.530045 -vt 0.940036 0.528621 -vt 0.932747 0.528097 -vt 0.925156 0.544451 -vt 0.930299 0.543085 -vt 0.934297 0.541071 -vt 0.937072 0.538625 -vt 0.938542 0.535964 -vt 0.938630 0.533303 -vt 0.937254 0.530857 -vt 0.934335 0.528843 -vt 0.929793 0.527476 -vt 0.923549 0.526973 -vt 0.911869 0.538895 -vt 0.916741 0.537699 -vt 0.920768 0.535937 -vt 0.923827 0.533797 -vt 0.925798 0.531468 -vt 0.926560 0.529140 -vt 0.925992 0.527000 -vt 0.923972 0.525238 -vt 0.920381 0.524042 -vt 0.915096 0.523601 -vt 0.900926 0.529634 -vt 0.905576 0.528723 -vt 0.909625 0.527380 -vt 0.912919 0.525750 -vt 0.915302 0.523976 -vt 0.916620 0.522202 -vt 0.916717 0.520571 -vt 0.915438 0.519229 -vt 0.912630 0.518318 -vt 0.908136 0.517982 -vt 0.893500 0.516669 -vt 0.898000 0.516157 -vt 0.902065 0.515401 -vt 0.905518 0.514484 -vt 0.908180 0.513486 -vt 0.909875 0.512488 -vt 0.910423 0.511571 -vt 0.909648 0.510816 -vt 0.907370 0.510303 -vt 0.903412 0.510115 -vt 0.496472 0.491996 -vt 0.496859 0.500000 -vt 0.513988 0.487299 -vt 0.514603 0.500000 -vt 0.521565 0.485268 -vt 0.522278 0.500000 -vt 0.521596 0.485261 -vt 0.522309 0.500000 -vt 0.516473 0.486636 -vt 0.517120 0.500000 -vt 0.508589 0.488753 -vt 0.509134 0.500000 -vt 0.500336 0.490970 -vt 0.500775 0.500000 -vt 0.494109 0.492645 -vt 0.494466 0.500000 -vt 0.492298 0.493137 -vt 0.492633 0.500000 -vt 0.497298 0.491804 -vt 0.497698 0.500000 -vt 0.495347 0.484448 -vt 0.512204 0.475321 -vt 0.519495 0.471374 -vt 0.519525 0.471360 -vt 0.514594 0.474032 -vt 0.507007 0.478144 -vt 0.499064 0.482450 -vt 0.493070 0.485703 -vt 0.491327 0.486656 -vt 0.496137 0.484064 -vt 0.493543 0.477446 -vt 0.509340 0.464211 -vt 0.516173 0.458486 -vt 0.516200 0.458465 -vt 0.511579 0.462339 -vt 0.504468 0.468302 -vt 0.497024 0.474544 -vt 0.491405 0.479259 -vt 0.489769 0.480639 -vt 0.494275 0.476875 -vt 0.491114 0.471082 -vt 0.505487 0.454112 -vt 0.511703 0.446772 -vt 0.511728 0.446745 -vt 0.507523 0.451711 -vt 0.501052 0.459354 -vt 0.494278 0.467356 -vt 0.489165 0.473398 -vt 0.487675 0.475163 -vt 0.491772 0.470334 -vt 0.488119 0.465447 -vt 0.500734 0.445171 -vt 0.506190 0.436400 -vt 0.506211 0.436367 -vt 0.502520 0.442300 -vt 0.496839 0.451431 -vt 0.490893 0.460989 -vt 0.486403 0.468206 -vt 0.485093 0.470311 -vt 0.488686 0.464535 -vt 0.484614 0.460633 -vt 0.495171 0.437531 -vt 0.499737 0.427538 -vt 0.499754 0.427499 -vt 0.496665 0.434258 -vt 0.491910 0.444659 -vt 0.486932 0.455547 -vt 0.483173 0.463767 -vt 0.482075 0.466162 -vt 0.485079 0.459576 -vt 0.480655 0.456730 -vt 0.488889 0.431337 -vt 0.492450 0.420353 -vt 0.492463 0.420309 -vt 0.490053 0.427737 -vt 0.486343 0.439169 -vt 0.482460 0.451134 -vt 0.479527 0.460166 -vt 0.478668 0.462795 -vt 0.481010 0.455552 -vt 0.476299 0.453829 -vt 0.481976 0.426733 -vt 0.484432 0.415013 -vt 0.484441 0.414966 -vt 0.482778 0.422891 -vt 0.480220 0.435088 -vt 0.477541 0.447854 -vt 0.475518 0.457489 -vt 0.474925 0.460291 -vt 0.476537 0.452559 -vt 0.471603 0.452021 -vt 0.474525 0.423865 -vt 0.475788 0.411686 -vt 0.475793 0.411637 -vt 0.474937 0.419872 -vt 0.473620 0.432545 -vt 0.472241 0.445809 -vt 0.471199 0.455820 -vt 0.470893 0.458730 -vt 0.471722 0.450693 -vt 0.466623 0.451399 -vt 0.466623 0.422877 -vt 0.466623 0.410539 -vt 0.466623 0.410489 -vt 0.466623 0.418831 -vt 0.466623 0.431668 -vt 0.466623 0.445105 -vt 0.466623 0.455245 -vt 0.466623 0.458192 -vt 0.466623 0.450050 -vt 0.461644 0.452021 -vt 0.458722 0.423865 -vt 0.457458 0.411686 -vt 0.457454 0.411637 -vt 0.458309 0.419872 -vt 0.459626 0.432545 -vt 0.461005 0.445809 -vt 0.462047 0.455820 -vt 0.462354 0.458730 -vt 0.461524 0.450693 -vt 0.456948 0.453829 -vt 0.451270 0.426733 -vt 0.448814 0.415013 -vt 0.448806 0.414966 -vt 0.450468 0.422891 -vt 0.453026 0.435088 -vt 0.455705 0.447854 -vt 0.457729 0.457489 -vt 0.458322 0.460291 -vt 0.456709 0.452559 -vt 0.452592 0.456730 -vt 0.444358 0.431337 -vt 0.440797 0.420353 -vt 0.440784 0.420309 -vt 0.443194 0.427737 -vt 0.446903 0.439169 -vt 0.450787 0.451134 -vt 0.453720 0.460166 -vt 0.454578 0.462795 -vt 0.452237 0.455552 -vt 0.448633 0.460633 -vt 0.438076 0.437531 -vt 0.433509 0.427538 -vt 0.433492 0.427499 -vt 0.436582 0.434258 -vt 0.441337 0.444659 -vt 0.446315 0.455547 -vt 0.450074 0.463767 -vt 0.451172 0.466162 -vt 0.448167 0.459576 -vt 0.445127 0.465447 -vt 0.432513 0.445171 -vt 0.427057 0.436400 -vt 0.427036 0.436367 -vt 0.430727 0.442300 -vt 0.436407 0.451431 -vt 0.442354 0.460989 -vt 0.446843 0.468206 -vt 0.448153 0.470311 -vt 0.444560 0.464535 -vt 0.442132 0.471082 -vt 0.427760 0.454112 -vt 0.421543 0.446772 -vt 0.421519 0.446745 -vt 0.425724 0.451711 -vt 0.432195 0.459354 -vt 0.438968 0.467356 -vt 0.444082 0.473398 -vt 0.445572 0.475163 -vt 0.441475 0.470334 -vt 0.439704 0.477446 -vt 0.423906 0.464211 -vt 0.417073 0.458486 -vt 0.417046 0.458465 -vt 0.421667 0.462340 -vt 0.428779 0.468302 -vt 0.436223 0.474544 -vt 0.441842 0.479259 -vt 0.443477 0.480639 -vt 0.438972 0.476875 -vt 0.437899 0.484448 -vt 0.421043 0.475321 -vt 0.413751 0.471374 -vt 0.413722 0.471360 -vt 0.418652 0.474032 -vt 0.426240 0.478144 -vt 0.434182 0.482450 -vt 0.440176 0.485703 -vt 0.441919 0.486656 -vt 0.437110 0.484064 -vt 0.436775 0.491996 -vt 0.419258 0.487299 -vt 0.411681 0.485268 -vt 0.411651 0.485261 -vt 0.416774 0.486636 -vt 0.424658 0.488753 -vt 0.432910 0.490970 -vt 0.439138 0.492645 -vt 0.440948 0.493137 -vt 0.435949 0.491804 -vt 0.436387 0.500000 -vt 0.418644 0.500000 -vt 0.410968 0.500000 -vt 0.410937 0.500000 -vt 0.416126 0.500000 -vt 0.424113 0.500000 -vt 0.432472 0.500000 -vt 0.438780 0.500000 -vt 0.440614 0.500000 -vt 0.435548 0.500000 -vt 0.436775 0.508004 -vt 0.419258 0.512701 -vt 0.411681 0.514732 -vt 0.411651 0.514739 -vt 0.416774 0.513364 -vt 0.424658 0.511247 -vt 0.432910 0.509030 -vt 0.439138 0.507355 -vt 0.440948 0.506863 -vt 0.435949 0.508196 -vt 0.437899 0.515552 -vt 0.421043 0.524679 -vt 0.413751 0.528626 -vt 0.413722 0.528640 -vt 0.418652 0.525968 -vt 0.426240 0.521856 -vt 0.434182 0.517550 -vt 0.440176 0.514297 -vt 0.441919 0.513344 -vt 0.437110 0.515936 -vt 0.439704 0.522554 -vt 0.423906 0.535789 -vt 0.417073 0.541514 -vt 0.417046 0.541535 -vt 0.421667 0.537661 -vt 0.428779 0.531698 -vt 0.436223 0.525456 -vt 0.441842 0.520741 -vt 0.443477 0.519361 -vt 0.438972 0.523125 -vt 0.442132 0.528918 -vt 0.427760 0.545888 -vt 0.421543 0.553228 -vt 0.421519 0.553255 -vt 0.425724 0.548289 -vt 0.432195 0.540646 -vt 0.438968 0.532644 -vt 0.444082 0.526602 -vt 0.445572 0.524837 -vt 0.441475 0.529666 -vt 0.445127 0.534553 -vt 0.432513 0.554829 -vt 0.427057 0.563600 -vt 0.427036 0.563633 -vt 0.430727 0.557700 -vt 0.436407 0.548569 -vt 0.442354 0.539011 -vt 0.446843 0.531794 -vt 0.448153 0.529689 -vt 0.444560 0.535465 -vt 0.448633 0.539367 -vt 0.438076 0.562469 -vt 0.433509 0.572462 -vt 0.433492 0.572501 -vt 0.436582 0.565742 -vt 0.441337 0.555341 -vt 0.446315 0.544453 -vt 0.450074 0.536233 -vt 0.451172 0.533838 -vt 0.448167 0.540424 -vt 0.452592 0.543270 -vt 0.444358 0.568663 -vt 0.440797 0.579647 -vt 0.440784 0.579691 -vt 0.443194 0.572263 -vt 0.446903 0.560831 -vt 0.450787 0.548866 -vt 0.453720 0.539834 -vt 0.454578 0.537205 -vt 0.452237 0.544448 -vt 0.456948 0.546171 -vt 0.451270 0.573267 -vt 0.448814 0.584987 -vt 0.448806 0.585034 -vt 0.450468 0.577109 -vt 0.453026 0.564912 -vt 0.455705 0.552146 -vt 0.457729 0.542511 -vt 0.458322 0.539709 -vt 0.456709 0.547441 -vt 0.461644 0.547979 -vt 0.458722 0.576135 -vt 0.457458 0.588314 -vt 0.457454 0.588363 -vt 0.458309 0.580128 -vt 0.459626 0.567455 -vt 0.461005 0.554191 -vt 0.462048 0.544180 -vt 0.462354 0.541270 -vt 0.461524 0.549307 -vt 0.466623 0.548601 -vt 0.466623 0.577123 -vt 0.466623 0.589461 -vt 0.466623 0.589511 -vt 0.466623 0.581169 -vt 0.466623 0.568332 -vt 0.466623 0.554895 -vt 0.466623 0.544755 -vt 0.466623 0.541808 -vt 0.466623 0.549950 -vt 0.471603 0.547979 -vt 0.474525 0.576135 -vt 0.475788 0.588314 -vt 0.475793 0.588363 -vt 0.474937 0.580128 -vt 0.473620 0.567455 -vt 0.472241 0.554191 -vt 0.471199 0.544180 -vt 0.470893 0.541270 -vt 0.471722 0.549307 -vt 0.476299 0.546171 -vt 0.481977 0.573267 -vt 0.484432 0.584987 -vt 0.484441 0.585034 -vt 0.482778 0.577109 -vt 0.480220 0.564912 -vt 0.477541 0.552146 -vt 0.475518 0.542511 -vt 0.474925 0.539709 -vt 0.476537 0.547441 -vt 0.480655 0.543270 -vt 0.488889 0.568663 -vt 0.492450 0.579647 -vt 0.492463 0.579691 -vt 0.490053 0.572263 -vt 0.486343 0.560831 -vt 0.482460 0.548866 -vt 0.479527 0.539834 -vt 0.478668 0.537205 -vt 0.481010 0.544448 -vt 0.484614 0.539367 -vt 0.495171 0.562469 -vt 0.499737 0.572462 -vt 0.499754 0.572501 -vt 0.496665 0.565742 -vt 0.491910 0.555341 -vt 0.486932 0.544453 -vt 0.483173 0.536233 -vt 0.482075 0.533838 -vt 0.485079 0.540424 -vt 0.488119 0.534553 -vt 0.500734 0.554829 -vt 0.506190 0.563600 -vt 0.506211 0.563633 -vt 0.502520 0.557700 -vt 0.496839 0.548569 -vt 0.490893 0.539011 -vt 0.486403 0.531794 -vt 0.485093 0.529689 -vt 0.488686 0.535465 -vt 0.491114 0.528918 -vt 0.505487 0.545888 -vt 0.511703 0.553228 -vt 0.511728 0.553255 -vt 0.507523 0.548289 -vt 0.501052 0.540646 -vt 0.494278 0.532644 -vt 0.489165 0.526602 -vt 0.487675 0.524837 -vt 0.491772 0.529666 -vt 0.493543 0.522554 -vt 0.509340 0.535789 -vt 0.516173 0.541514 -vt 0.516200 0.541535 -vt 0.511579 0.537660 -vt 0.504468 0.531698 -vt 0.497024 0.525456 -vt 0.491405 0.520741 -vt 0.489769 0.519361 -vt 0.494275 0.523125 -vt 0.495347 0.515552 -vt 0.512204 0.524679 -vt 0.519495 0.528626 -vt 0.519525 0.528640 -vt 0.514594 0.525968 -vt 0.507007 0.521856 -vt 0.499064 0.517550 -vt 0.493070 0.514297 -vt 0.491327 0.513344 -vt 0.496137 0.515936 -vt 0.496472 0.508004 -vt 0.513988 0.512701 -vt 0.521565 0.514732 -vt 0.521596 0.514739 -vt 0.516473 0.513364 -vt 0.508589 0.511247 -vt 0.500336 0.509030 -vt 0.494109 0.507355 -vt 0.492298 0.506863 -vt 0.497298 0.508196 -vt 0.509476 0.488550 -vt 0.510035 0.500000 -vt 0.526623 0.483969 -vt 0.527406 0.500000 -vt 0.547267 0.478453 -vt 0.548319 0.500000 -vt 0.569936 0.472396 -vt 0.571284 0.500000 -vt 0.593156 0.466192 -vt 0.594807 0.500000 -vt 0.615457 0.460234 -vt 0.617399 0.500000 -vt 0.635365 0.454915 -vt 0.637566 0.500000 -vt 0.651407 0.450628 -vt 0.653819 0.500000 -vt 0.662113 0.447768 -vt 0.664664 0.500000 -vt 0.666009 0.446727 -vt 0.668610 0.500000 -vt 0.507854 0.477737 -vt 0.524352 0.468829 -vt 0.544215 0.458104 -vt 0.566025 0.446327 -vt 0.588367 0.434264 -vt 0.609824 0.422678 -vt 0.628978 0.412336 -vt 0.644414 0.404001 -vt 0.654714 0.398439 -vt 0.658462 0.396415 -vt 0.505253 0.467695 -vt 0.520710 0.454768 -vt 0.539320 0.439205 -vt 0.559754 0.422115 -vt 0.580687 0.404610 -vt 0.600789 0.387798 -vt 0.618735 0.372790 -vt 0.633197 0.360696 -vt 0.642848 0.352625 -vt 0.646359 0.349688 -vt 0.501755 0.458556 -vt 0.515813 0.441973 -vt 0.532738 0.422007 -vt 0.551323 0.400084 -vt 0.570360 0.377626 -vt 0.588643 0.356059 -vt 0.604964 0.336805 -vt 0.618117 0.321290 -vt 0.626893 0.310936 -vt 0.630087 0.307169 -vt 0.497446 0.450456 -vt 0.509779 0.430631 -vt 0.524627 0.406764 -vt 0.540932 0.380555 -vt 0.557634 0.353709 -vt 0.573674 0.327926 -vt 0.587993 0.304910 -vt 0.599532 0.286362 -vt 0.607232 0.273984 -vt 0.610034 0.269480 -vt 0.492406 0.443528 -vt 0.502723 0.420931 -vt 0.515144 0.393726 -vt 0.528783 0.363853 -vt 0.542754 0.333253 -vt 0.556172 0.303865 -vt 0.568150 0.277630 -vt 0.577802 0.256488 -vt 0.584243 0.242380 -vt 0.586587 0.237247 -vt 0.486721 0.437907 -vt 0.494763 0.413061 -vt 0.504445 0.383147 -vt 0.515077 0.350301 -vt 0.525967 0.316654 -vt 0.536426 0.284340 -vt 0.545763 0.255494 -vt 0.553287 0.232248 -vt 0.558308 0.216736 -vt 0.560135 0.211091 -vt 0.480473 0.433726 -vt 0.486015 0.407206 -vt 0.492687 0.375279 -vt 0.500014 0.340220 -vt 0.507519 0.304308 -vt 0.514727 0.269818 -vt 0.521161 0.239029 -vt 0.526346 0.214218 -vt 0.529806 0.197661 -vt 0.531065 0.191636 -vt 0.473746 0.431119 -vt 0.476596 0.403556 -vt 0.480028 0.370373 -vt 0.483796 0.333935 -vt 0.487656 0.296610 -vt 0.491362 0.260764 -vt 0.494672 0.228764 -vt 0.497338 0.202976 -vt 0.499118 0.185768 -vt 0.499765 0.179507 -vt 0.466623 0.430220 -vt 0.466623 0.402298 -vt 0.466623 0.368681 -vt 0.466623 0.331768 -vt 0.466623 0.293956 -vt 0.466623 0.257642 -vt 0.466623 0.225225 -vt 0.466623 0.199101 -vt 0.466623 0.181668 -vt 0.466623 0.175325 -vt 0.459500 0.431119 -vt 0.456650 0.403556 -vt 0.453219 0.370373 -vt 0.449451 0.333935 -vt 0.445591 0.296610 -vt 0.441884 0.260764 -vt 0.438575 0.228764 -vt 0.435908 0.202976 -vt 0.434129 0.185768 -vt 0.433481 0.179507 -vt 0.452773 0.433726 -vt 0.447231 0.407206 -vt 0.440559 0.375279 -vt 0.433232 0.340220 -vt 0.425727 0.304308 -vt 0.418520 0.269818 -vt 0.412086 0.239030 -vt 0.406900 0.214218 -vt 0.403440 0.197661 -vt 0.402181 0.191636 -vt 0.446525 0.437907 -vt 0.438483 0.413061 -vt 0.428801 0.383147 -vt 0.418170 0.350301 -vt 0.407279 0.316654 -vt 0.396820 0.284341 -vt 0.387483 0.255494 -vt 0.379959 0.232248 -vt 0.374938 0.216736 -vt 0.373111 0.211091 -vt 0.440840 0.443528 -vt 0.430523 0.420932 -vt 0.418102 0.393726 -vt 0.404463 0.363853 -vt 0.390492 0.333253 -vt 0.377075 0.303865 -vt 0.365097 0.277630 -vt 0.355444 0.256488 -vt 0.349003 0.242381 -vt 0.346659 0.237247 -vt 0.435801 0.450456 -vt 0.423468 0.430631 -vt 0.408619 0.406764 -vt 0.392314 0.380555 -vt 0.375613 0.353709 -vt 0.359573 0.327926 -vt 0.345254 0.304910 -vt 0.333715 0.286362 -vt 0.326015 0.273985 -vt 0.323213 0.269481 -vt 0.431491 0.458556 -vt 0.417433 0.441973 -vt 0.400508 0.422007 -vt 0.381924 0.400084 -vt 0.362886 0.377626 -vt 0.344604 0.356059 -vt 0.328282 0.336806 -vt 0.315130 0.321290 -vt 0.306353 0.310937 -vt 0.303159 0.307169 -vt 0.427994 0.467695 -vt 0.412537 0.454768 -vt 0.393927 0.439205 -vt 0.373492 0.422115 -vt 0.352560 0.404610 -vt 0.332457 0.387798 -vt 0.314511 0.372790 -vt 0.300049 0.360696 -vt 0.290399 0.352625 -vt 0.286887 0.349688 -vt 0.425393 0.477737 -vt 0.408894 0.468829 -vt 0.389032 0.458104 -vt 0.367221 0.446327 -vt 0.344879 0.434264 -vt 0.323423 0.422678 -vt 0.304268 0.412336 -vt 0.288833 0.404001 -vt 0.278532 0.398440 -vt 0.274784 0.396416 -vt 0.423771 0.488550 -vt 0.406624 0.483969 -vt 0.385980 0.478453 -vt 0.363311 0.472397 -vt 0.340090 0.466192 -vt 0.317790 0.460234 -vt 0.297882 0.454915 -vt 0.281839 0.450629 -vt 0.271134 0.447768 -vt 0.267238 0.446727 -vt 0.423212 0.500000 -vt 0.405841 0.500000 -vt 0.384927 0.500000 -vt 0.361963 0.500000 -vt 0.338439 0.500000 -vt 0.315848 0.500000 -vt 0.295680 0.500000 -vt 0.279428 0.500000 -vt 0.268583 0.500000 -vt 0.264636 0.500000 -vt 0.423771 0.511450 -vt 0.406624 0.516031 -vt 0.385980 0.521547 -vt 0.363311 0.527604 -vt 0.340090 0.533808 -vt 0.317790 0.539766 -vt 0.297882 0.545085 -vt 0.281839 0.549372 -vt 0.271134 0.552232 -vt 0.267238 0.553273 -vt 0.425393 0.522263 -vt 0.408894 0.531171 -vt 0.389032 0.541896 -vt 0.367221 0.553673 -vt 0.344879 0.565736 -vt 0.323423 0.577322 -vt 0.304268 0.587664 -vt 0.288833 0.595999 -vt 0.278532 0.601561 -vt 0.274784 0.603584 -vt 0.427994 0.532305 -vt 0.412537 0.545232 -vt 0.393927 0.560795 -vt 0.373492 0.577885 -vt 0.352560 0.595390 -vt 0.332457 0.612202 -vt 0.314511 0.627210 -vt 0.300049 0.639304 -vt 0.290399 0.647375 -vt 0.286887 0.650312 -vt 0.431491 0.541444 -vt 0.417433 0.558027 -vt 0.400508 0.577993 -vt 0.381924 0.599916 -vt 0.362886 0.622374 -vt 0.344604 0.643941 -vt 0.328282 0.663195 -vt 0.315130 0.678710 -vt 0.306353 0.689064 -vt 0.303159 0.692831 -vt 0.435801 0.549544 -vt 0.423468 0.569369 -vt 0.408619 0.593236 -vt 0.392314 0.619445 -vt 0.375613 0.646291 -vt 0.359573 0.672074 -vt 0.345254 0.695090 -vt 0.333715 0.713638 -vt 0.326015 0.726016 -vt 0.323213 0.730520 -vt 0.440840 0.556472 -vt 0.430523 0.579069 -vt 0.418102 0.606274 -vt 0.404463 0.636147 -vt 0.390492 0.666747 -vt 0.377075 0.696135 -vt 0.365097 0.722370 -vt 0.355444 0.743512 -vt 0.349003 0.757620 -vt 0.346659 0.762753 -vt 0.446525 0.562093 -vt 0.438483 0.586939 -vt 0.428801 0.616853 -vt 0.418170 0.649699 -vt 0.407279 0.683346 -vt 0.396820 0.715660 -vt 0.387483 0.744506 -vt 0.379959 0.767752 -vt 0.374938 0.783264 -vt 0.373111 0.788909 -vt 0.452773 0.566274 -vt 0.447231 0.592794 -vt 0.440559 0.624721 -vt 0.433232 0.659780 -vt 0.425727 0.695692 -vt 0.418520 0.730182 -vt 0.412086 0.760971 -vt 0.406901 0.785782 -vt 0.403440 0.802339 -vt 0.402181 0.808364 -vt 0.459500 0.568881 -vt 0.456650 0.596444 -vt 0.453219 0.629627 -vt 0.449451 0.666065 -vt 0.445591 0.703390 -vt 0.441884 0.739236 -vt 0.438575 0.771236 -vt 0.435908 0.797024 -vt 0.434129 0.814232 -vt 0.433481 0.820493 -vt 0.466623 0.569780 -vt 0.466623 0.597702 -vt 0.466623 0.631319 -vt 0.466623 0.668232 -vt 0.466623 0.706044 -vt 0.466623 0.742358 -vt 0.466623 0.774775 -vt 0.466623 0.800899 -vt 0.466623 0.818332 -vt 0.466623 0.824675 -vt 0.473746 0.568881 -vt 0.476596 0.596444 -vt 0.480028 0.629627 -vt 0.483796 0.666065 -vt 0.487656 0.703390 -vt 0.491363 0.739236 -vt 0.494672 0.771236 -vt 0.497338 0.797024 -vt 0.499118 0.814232 -vt 0.499765 0.820493 -vt 0.480473 0.566274 -vt 0.486015 0.592794 -vt 0.492688 0.624721 -vt 0.500014 0.659780 -vt 0.507519 0.695692 -vt 0.514727 0.730182 -vt 0.521161 0.760970 -vt 0.526346 0.785782 -vt 0.529806 0.802339 -vt 0.531065 0.808364 -vt 0.486721 0.562093 -vt 0.494763 0.586939 -vt 0.504445 0.616853 -vt 0.515077 0.649699 -vt 0.525967 0.683346 -vt 0.536426 0.715659 -vt 0.545763 0.744506 -vt 0.553287 0.767752 -vt 0.558308 0.783264 -vt 0.560135 0.788909 -vt 0.492406 0.556472 -vt 0.502723 0.579068 -vt 0.515144 0.606274 -vt 0.528783 0.636147 -vt 0.542754 0.666747 -vt 0.556172 0.696135 -vt 0.568150 0.722370 -vt 0.577802 0.743512 -vt 0.584243 0.757619 -vt 0.586587 0.762753 -vt 0.497446 0.549544 -vt 0.509779 0.569369 -vt 0.524627 0.593236 -vt 0.540932 0.619445 -vt 0.557634 0.646291 -vt 0.573674 0.672074 -vt 0.587993 0.695090 -vt 0.599532 0.713638 -vt 0.607232 0.726015 -vt 0.610034 0.730519 -vt 0.501755 0.541444 -vt 0.515813 0.558027 -vt 0.532738 0.577993 -vt 0.551323 0.599916 -vt 0.570360 0.622374 -vt 0.588643 0.643941 -vt 0.604964 0.663194 -vt 0.618117 0.678710 -vt 0.626893 0.689063 -vt 0.630087 0.692831 -vt 0.505253 0.532305 -vt 0.520710 0.545232 -vt 0.539320 0.560795 -vt 0.559754 0.577885 -vt 0.580687 0.595390 -vt 0.600789 0.612202 -vt 0.618735 0.627210 -vt 0.633197 0.639304 -vt 0.642848 0.647375 -vt 0.646359 0.650312 -vt 0.507854 0.522263 -vt 0.524352 0.531171 -vt 0.544215 0.541896 -vt 0.566025 0.553673 -vt 0.588367 0.565736 -vt 0.609824 0.577322 -vt 0.628978 0.587664 -vt 0.644414 0.595999 -vt 0.654714 0.601560 -vt 0.658462 0.603584 -vt 0.509476 0.511450 -vt 0.526623 0.516031 -vt 0.547267 0.521547 -vt 0.569936 0.527603 -vt 0.593156 0.533808 -vt 0.615457 0.539766 -vt 0.635365 0.545085 -vt 0.651407 0.549371 -vt 0.662113 0.552232 -vt 0.666009 0.553273 -vn -0.929350 -0.369152 -0.003693 -vn -0.917203 -0.369304 -0.149358 -vn -0.947172 -0.283151 -0.150456 -vn -0.959105 -0.282968 -0.000031 -vn -0.986297 -0.053682 -0.155889 -vn -0.998688 -0.050935 -0.000702 -vn -0.932279 0.330302 -0.147465 -vn -0.943907 0.330149 0.000519 -vn -0.600146 0.794153 -0.095370 -vn -0.609210 0.792993 0.000244 -vn -0.033784 0.999390 -0.005036 -vn -0.034150 0.999390 0.000305 -vn 0.385205 0.920774 0.061403 -vn 0.390210 0.920713 0.000244 -vn 0.606494 0.789178 0.096438 -vn 0.614307 0.789026 0.000183 -vn 0.739860 0.662374 0.117588 -vn 0.749352 0.662130 0.000122 -vn 0.828974 0.543504 0.131687 -vn 0.840114 0.542344 0.001038 -vn 0.878262 0.457320 0.139470 -vn 0.889401 0.457106 0.000031 -vn -0.882077 -0.369762 -0.291849 -vn -0.911588 -0.284494 -0.296640 -vn -0.949309 -0.052339 -0.309915 -vn -0.895993 0.333659 -0.292947 -vn -0.578936 0.793146 -0.188940 -vn -0.032502 0.999390 -0.010254 -vn 0.370373 0.920927 0.121158 -vn 0.583270 0.789575 0.190558 -vn 0.711753 0.662801 0.232459 -vn 0.797632 0.543992 0.260475 -vn 0.845119 0.457778 0.275948 -vn -0.825282 -0.370098 -0.426496 -vn -0.853572 -0.283731 -0.436903 -vn -0.888699 -0.051057 -0.455611 -vn -0.839564 0.332499 -0.429548 -vn -0.541734 0.793603 -0.276925 -vn -0.028657 0.999481 -0.014496 -vn 0.346446 0.921079 0.177557 -vn 0.545152 0.790735 0.278359 -vn 0.666128 0.663259 0.341014 -vn 0.746666 0.544389 0.382183 -vn 0.791223 0.458205 0.404950 -vn -0.748619 -0.370373 -0.549852 -vn -0.775323 -0.284982 -0.563585 -vn -0.807184 -0.052431 -0.587939 -vn -0.762291 0.332682 -0.555132 -vn -0.491684 0.793847 -0.357799 -vn -0.027680 0.999420 -0.019745 -vn 0.314249 0.921232 0.229194 -vn 0.494888 0.790948 0.359752 -vn 0.604816 0.662618 0.441664 -vn 0.677786 0.544694 0.493820 -vn 0.718314 0.458480 0.523240 -vn -0.654164 -0.370403 -0.659413 -vn -0.678396 -0.285073 -0.677114 -vn -0.706107 -0.052492 -0.706137 -vn -0.666860 0.332743 -0.666707 -vn -0.430067 0.793939 -0.429731 -vn -0.024232 0.999420 -0.023774 -vn 0.274789 0.921262 0.275155 -vn 0.432905 0.791070 0.432142 -vn 0.528855 0.662709 0.530168 -vn 0.592853 0.544816 0.592975 -vn 0.628346 0.458541 0.628376 -vn -0.543870 -0.370373 -0.752983 -vn -0.564470 -0.283914 -0.775048 -vn -0.587390 -0.051057 -0.807672 -vn -0.554552 0.334178 -0.762078 -vn -0.359264 0.792596 -0.492599 -vn -0.020264 0.999420 -0.027284 -vn 0.228797 0.921201 0.314585 -vn 0.360637 0.790979 0.494217 -vn 0.440168 0.662618 0.605914 -vn 0.493637 0.544725 0.677908 -vn 0.523179 0.458480 0.718375 -vn -0.419874 -0.370067 -0.828669 -vn -0.436781 -0.283761 -0.853603 -vn -0.454909 -0.052370 -0.888974 -vn -0.429731 0.332469 -0.839503 -vn -0.278207 0.792383 -0.542863 -vn -0.014740 0.999481 -0.028504 -vn 0.177068 0.921110 0.346660 -vn 0.279305 0.790735 0.544664 -vn 0.340465 0.662313 0.667379 -vn 0.382031 0.544420 0.746727 -vn 0.406018 0.458754 0.790338 -vn -0.288186 -0.369732 -0.883297 -vn -0.297555 -0.283456 -0.911618 -vn -0.310617 -0.053713 -0.949004 -vn -0.293374 0.330607 -0.896969 -vn -0.189154 0.793268 -0.578692 -vn -0.010102 0.999481 -0.030488 -vn 0.120640 0.920927 0.370525 -vn 0.190588 0.790399 0.582171 -vn 0.231697 0.661885 0.712851 -vn 0.260292 0.543962 0.797693 -vn 0.275826 0.457778 0.845149 -vn -0.142033 -0.369274 -0.918363 -vn -0.150395 -0.283120 -0.947203 -vn -0.156590 -0.052370 -0.986267 -vn -0.147404 0.333445 -0.931150 -vn -0.095157 0.794122 -0.600208 -vn -0.005646 0.999390 -0.033662 -vn 0.060854 0.920743 0.385296 -vn 0.096072 0.789209 0.606525 -vn 0.116642 0.661428 0.740837 -vn 0.132481 0.544359 0.828303 -vn 0.139409 0.457320 0.878292 -vn 0.001648 -0.369884 -0.929044 -vn -0.003174 -0.283914 -0.958831 -vn -0.001709 -0.052156 -0.998627 -vn -0.001617 0.330302 -0.943846 -vn -0.000824 0.791864 -0.610675 -vn -0.000244 0.999359 -0.035493 -vn 0.000122 0.921140 0.389141 -vn 0.000458 0.789727 0.613422 -vn 0.000763 0.662984 0.748589 -vn -0.000092 0.543260 0.839534 -vn -0.001434 0.456526 0.889706 -vn 0.143040 -0.391430 -0.908994 -vn 0.142033 -0.304819 -0.941740 -vn 0.150945 -0.078555 -0.985382 -vn 0.146458 0.306711 -0.940458 -vn 0.097171 0.782525 -0.614978 -vn 0.005463 0.999359 -0.034791 -vn -0.061708 0.919401 0.388409 -vn -0.096408 0.787774 0.608325 -vn -0.117344 0.661641 0.740562 -vn -0.132694 0.542375 0.829585 -vn -0.139439 0.457289 0.878292 -vn 0.275155 -0.432508 -0.858608 -vn 0.282205 -0.351665 -0.892544 -vn 0.301279 -0.135319 -0.943876 -vn 0.297372 0.250191 -0.921384 -vn 0.202185 0.758232 -0.619800 -vn 0.012696 0.999146 -0.038789 -vn -0.123417 0.917417 0.378246 -vn -0.191504 0.785638 0.588275 -vn -0.232582 0.660543 0.713797 -vn -0.261574 0.542344 0.798364 -vn -0.275948 0.457686 0.845180 -vn 0.398968 -0.472152 -0.786035 -vn 0.415082 -0.397595 -0.818293 -vn 0.444929 -0.192145 -0.874691 -vn 0.446608 0.191046 -0.874081 -vn 0.311594 0.731590 -0.606342 -vn 0.021851 0.998840 -0.042268 -vn -0.183599 0.915128 0.358867 -vn -0.284188 0.782098 0.554552 -vn -0.343425 0.658376 0.669729 -vn -0.383587 0.542192 0.747551 -vn -0.404950 0.458022 0.791314 -vn 0.520859 -0.498398 -0.693014 -vn 0.540452 -0.424207 -0.726585 -vn 0.580004 -0.224219 -0.783105 -vn 0.586077 0.158116 -0.794641 -vn 0.414441 0.714133 -0.564074 -vn 0.030915 0.998627 -0.042055 -vn -0.240211 0.913175 0.329203 -vn -0.367901 0.780755 0.505020 -vn -0.441969 0.659169 0.608356 -vn -0.494400 0.542985 0.678732 -vn -0.523301 0.458266 0.718406 -vn 0.631397 -0.502335 -0.590716 -vn 0.651448 -0.429792 -0.625202 -vn 0.698508 -0.231056 -0.677236 -vn 0.706076 0.149663 -0.692099 -vn 0.503464 0.704856 -0.499680 -vn 0.039918 0.998383 -0.039979 -vn -0.289132 0.912839 0.288217 -vn -0.442305 0.780389 0.441908 -vn -0.532395 0.658101 0.532365 -vn -0.594928 0.542100 0.593432 -vn -0.628468 0.458327 0.628407 -vn 0.730033 -0.484939 -0.481491 -vn 0.750755 -0.412915 -0.515580 -vn 0.801843 -0.209693 -0.559496 -vn 0.803339 0.171331 -0.570299 -vn 0.569384 0.711264 -0.412122 -vn 0.045839 0.998352 -0.033784 -vn -0.328623 0.913877 0.238289 -vn -0.504562 0.781518 0.366894 -vn -0.608264 0.658681 0.442854 -vn -0.679800 0.542222 0.493789 -vn -0.718467 0.458235 0.523240 -vn 0.813685 -0.451979 -0.365520 -vn 0.835658 -0.379192 -0.397290 -vn 0.886685 -0.167943 -0.430738 -vn 0.874722 0.213935 -0.434797 -vn 0.608936 0.730003 -0.310251 -vn 0.047426 0.998535 -0.024812 -vn -0.357799 0.915860 0.182043 -vn -0.553178 0.783685 0.282418 -vn -0.669088 0.659719 0.342174 -vn -0.747429 0.543168 0.382427 -vn -0.790429 0.458602 0.406018 -vn 0.877102 -0.413526 -0.244240 -vn 0.901089 -0.338664 -0.270791 -vn 0.948729 -0.119022 -0.292764 -vn 0.919675 0.262734 -0.291726 -vn 0.624622 0.753838 -0.203772 -vn 0.045198 0.998840 -0.015290 -vn -0.376965 0.918119 0.122196 -vn -0.587634 0.786157 0.191260 -vn -0.713462 0.660909 0.232673 -vn -0.798975 0.542405 0.259651 -vn -0.845943 0.457076 0.274606 -vn 0.915830 -0.382366 -0.122440 -vn 0.942137 -0.304971 -0.139134 -vn 0.985504 -0.079470 -0.149754 -vn 0.941923 0.301920 -0.146977 -vn 0.624073 0.774895 -0.099979 -vn 0.040956 0.999115 -0.006897 -vn -0.387341 0.919889 0.060976 -vn -0.607898 0.788141 0.096164 -vn -0.740440 0.661733 0.117405 -vn -0.829920 0.542344 0.130589 -vn -0.878323 0.457289 0.139348 -vn 0.929319 -0.369121 0.008545 -vn 0.957915 -0.286966 0.000793 -vn 0.998383 -0.056673 0.000702 -vn 0.945860 0.324503 -0.000488 -vn 0.615223 0.788324 -0.000732 -vn 0.034303 0.999390 -0.000305 -vn -0.391980 0.919950 -0.000580 -vn -0.614490 0.788903 -0.000122 -vn -0.750206 0.661184 -0.000977 -vn -0.840175 0.542283 -0.001099 -vn -0.889401 0.457106 -0.000031 -vn 0.917203 -0.369304 0.149358 -vn 0.947172 -0.283151 0.150456 -vn 0.986206 -0.050966 0.157384 -vn 0.932279 0.330271 0.147465 -vn 0.600146 0.794153 0.095370 -vn 0.031831 0.999481 0.004883 -vn -0.385205 0.920774 -0.061403 -vn -0.606494 0.789178 -0.096438 -vn -0.739921 0.662313 -0.117466 -vn -0.828608 0.544359 -0.130558 -vn -0.878262 0.457320 -0.139470 -vn 0.882077 -0.369762 0.291849 -vn 0.911588 -0.283425 0.297678 -vn 0.949309 -0.052339 0.309915 -vn 0.896664 0.332133 0.292611 -vn 0.578906 0.793176 0.188940 -vn 0.032502 0.999390 0.010254 -vn -0.370373 0.920927 -0.121158 -vn -0.583270 0.789575 -0.190558 -vn -0.711753 0.662801 -0.232459 -vn -0.797876 0.543077 -0.261574 -vn -0.844966 0.457198 -0.277352 -vn 0.825282 -0.370098 0.426496 -vn 0.853572 -0.283700 0.436903 -vn 0.889218 -0.053774 0.454237 -vn 0.839564 0.332469 0.429548 -vn 0.541734 0.793603 0.276925 -vn 0.028657 0.999481 0.014496 -vn -0.346446 0.921079 -0.177557 -vn -0.545152 0.790735 -0.278359 -vn -0.666128 0.663259 -0.341014 -vn -0.746666 0.544389 -0.382183 -vn -0.791223 0.458205 -0.404950 -vn 0.748619 -0.370373 0.549852 -vn 0.775323 -0.284982 0.563585 -vn 0.807184 -0.052431 0.587939 -vn 0.761559 0.334208 0.555254 -vn 0.491684 0.793847 0.357799 -vn 0.029206 0.999329 0.021027 -vn -0.314280 0.921232 -0.229225 -vn -0.494888 0.790948 -0.359752 -vn -0.604816 0.662618 -0.441664 -vn -0.677786 0.544694 -0.493820 -vn -0.718314 0.458480 -0.523240 -vn 0.654164 -0.370403 0.659413 -vn 0.678396 -0.285073 0.677114 -vn 0.706107 -0.052492 0.706137 -vn 0.667562 0.331217 0.666799 -vn 0.430067 0.793970 0.429701 -vn 0.024262 0.999420 0.023804 -vn -0.275857 0.920530 -0.276528 -vn -0.432936 0.791040 -0.432173 -vn -0.528855 0.662709 -0.530168 -vn -0.592853 0.544816 -0.592975 -vn -0.628346 0.458541 -0.628376 -vn 0.543870 -0.370373 0.752983 -vn 0.564470 -0.283914 0.775048 -vn 0.587390 -0.051057 0.807672 -vn 0.554552 0.334178 0.762078 -vn 0.358074 0.793725 0.491653 -vn 0.020264 0.999420 0.027314 -vn -0.228797 0.921232 -0.314585 -vn -0.360637 0.790979 -0.494217 -vn -0.440168 0.662618 -0.605914 -vn -0.493637 0.544725 -0.677908 -vn -0.523179 0.458480 -0.718375 -vn 0.419874 -0.370067 0.828669 -vn 0.436781 -0.283761 0.853603 -vn 0.454909 -0.052370 0.888974 -vn 0.429731 0.332469 0.839503 -vn 0.278207 0.792383 0.542863 -vn 0.014740 0.999481 0.028504 -vn -0.177068 0.921110 -0.346660 -vn -0.279305 0.790735 -0.544664 -vn -0.340465 0.662313 -0.667379 -vn -0.382031 0.544420 -0.746727 -vn -0.406018 0.458754 -0.790338 -vn 0.288186 -0.369732 0.883297 -vn 0.297555 -0.283456 0.911618 -vn 0.309915 -0.052309 0.949309 -vn 0.292795 0.332163 0.896603 -vn 0.189154 0.793268 0.578692 -vn 0.010102 0.999481 0.030488 -vn -0.120640 0.920927 -0.370525 -vn -0.190588 0.790399 -0.582171 -vn -0.231697 0.661885 -0.712851 -vn -0.260292 0.543962 -0.797693 -vn -0.275826 0.457778 -0.845149 -vn 0.142033 -0.369274 0.918363 -vn 0.150395 -0.283120 0.947203 -vn 0.156590 -0.052309 0.986267 -vn 0.148015 0.331919 0.931608 -vn 0.095767 0.792962 0.601642 -vn 0.005646 0.999390 0.033662 -vn -0.060854 0.920743 -0.385296 -vn -0.096072 0.789209 -0.606525 -vn -0.116642 0.661428 -0.740837 -vn -0.132481 0.544359 -0.828303 -vn -0.139409 0.457320 -0.878292 -vn -0.003693 -0.369152 0.929350 -vn -0.000031 -0.282968 0.959105 -vn -0.000732 -0.050905 0.998688 -vn 0.000061 0.331736 0.943358 -vn 0.000244 0.792962 0.609241 -vn 0.000305 0.999390 0.034150 -vn 0.000244 0.920713 -0.390210 -vn 0.000183 0.789026 -0.614307 -vn 0.000122 0.662130 -0.749352 -vn -0.000946 0.544145 -0.838984 -vn 0.001434 0.456526 -0.889676 -vn -0.149358 -0.369304 0.917203 -vn -0.150456 -0.283151 0.947172 -vn -0.156621 -0.052278 0.986267 -vn -0.147801 0.331858 0.931669 -vn -0.095248 0.792993 0.601703 -vn -0.005036 0.999390 0.033784 -vn 0.061403 0.920774 -0.385205 -vn 0.096438 0.789178 -0.606494 -vn 0.117588 0.662374 -0.739860 -vn 0.131687 0.543504 -0.828974 -vn 0.140904 0.456740 -0.878353 -vn -0.291849 -0.369762 0.882077 -vn -0.297678 -0.283425 0.911588 -vn -0.309915 -0.052339 0.949309 -vn -0.292398 0.330577 0.897305 -vn -0.188665 0.793268 0.578845 -vn -0.010254 0.999390 0.032502 -vn 0.121158 0.920927 -0.370373 -vn 0.190558 0.789544 -0.583300 -vn 0.232459 0.662801 -0.711753 -vn 0.260475 0.543992 -0.797632 -vn 0.275948 0.457778 -0.845119 -vn -0.426496 -0.370098 0.825282 -vn -0.436903 -0.283700 0.853572 -vn -0.454237 -0.053774 0.889218 -vn -0.429548 0.332469 0.839564 -vn -0.276589 0.794702 0.540269 -vn -0.015229 0.999390 0.030457 -vn 0.177557 0.921110 -0.346416 -vn 0.279489 0.789911 -0.545793 -vn 0.341014 0.663228 -0.666158 -vn 0.382183 0.544389 -0.746666 -vn 0.404950 0.458205 -0.791223 -vn -0.549852 -0.370373 0.748619 -vn -0.563585 -0.284982 0.775323 -vn -0.587939 -0.052431 0.807184 -vn -0.555223 0.332621 0.762261 -vn -0.357799 0.793847 0.491684 -vn -0.019745 0.999420 0.027680 -vn 0.229225 0.921232 -0.314280 -vn 0.360973 0.790124 -0.495315 -vn 0.440535 0.663533 -0.604633 -vn 0.493820 0.544694 -0.677786 -vn 0.523240 0.458480 -0.718314 -vn -0.659413 -0.370403 0.654164 -vn -0.677114 -0.285073 0.678396 -vn -0.706137 -0.052492 0.706107 -vn -0.666707 0.332804 0.666860 -vn -0.428938 0.795068 0.428785 -vn -0.025300 0.999329 0.025575 -vn 0.275155 0.921262 -0.274789 -vn 0.432173 0.791040 -0.432936 -vn 0.529008 0.663656 -0.528825 -vn 0.592975 0.544816 -0.592853 -vn 0.628376 0.458541 -0.628346 -vn -0.752983 -0.370373 0.543870 -vn -0.775048 -0.283914 0.564470 -vn -0.807642 -0.051088 0.587390 -vn -0.762078 0.334178 0.554552 -vn -0.492599 0.792627 0.359233 -vn -0.027314 0.999420 0.020264 -vn 0.316080 0.920499 -0.229652 -vn 0.494217 0.790979 -0.360637 -vn 0.605914 0.662618 -0.440168 -vn 0.677908 0.544725 -0.493637 -vn 0.718375 0.458480 -0.523179 -vn -0.828669 -0.370067 0.419874 -vn -0.853603 -0.283731 0.436781 -vn -0.888974 -0.052400 0.454909 -vn -0.839503 0.332438 0.429731 -vn -0.541490 0.793603 0.277352 -vn -0.028504 0.999481 0.014740 -vn 0.346660 0.921110 -0.177068 -vn 0.544664 0.790735 -0.279305 -vn 0.667379 0.662313 -0.340465 -vn 0.746727 0.544420 -0.382031 -vn 0.790338 0.458754 -0.406018 -vn -0.884396 -0.369732 0.284799 -vn -0.911618 -0.283456 0.297555 -vn -0.949004 -0.053713 0.310617 -vn -0.897000 0.330607 0.293374 -vn -0.578692 0.793268 0.189154 -vn -0.034211 0.999329 0.011353 -vn 0.370525 0.920927 -0.120640 -vn 0.582171 0.790399 -0.190588 -vn 0.712851 0.661885 -0.231697 -vn 0.796838 0.544847 -0.261116 -vn 0.845149 0.457778 -0.275826 -vn -0.918363 -0.369274 0.142033 -vn -0.946745 -0.284219 0.151250 -vn -0.986267 -0.052370 0.156590 -vn -0.931150 0.333445 0.147404 -vn -0.600208 0.794122 0.095157 -vn -0.033662 0.999390 0.005646 -vn 0.387036 0.920042 -0.060945 -vn 0.606525 0.789209 -0.096072 -vn 0.739952 0.662313 -0.117435 -vn 0.829005 0.543504 -0.131504 -vn 0.878811 0.456740 -0.138066 -vn 0.893460 0.426099 0.141850 -vn 0.904752 0.425886 0.000000 -vn 0.897702 0.416852 0.142521 -vn 0.909055 0.416639 0.000000 -vn 0.904904 0.401196 0.141881 -vn 0.916166 0.400739 0.000000 -vn 0.914609 0.378002 0.143498 -vn 0.925993 0.377483 0.000000 -vn 0.926633 0.345927 0.147130 -vn 0.938322 0.345744 0.000000 -vn 0.940794 0.304209 0.149388 -vn 0.952635 0.304025 0.000000 -vn 0.956084 0.250649 0.151830 -vn 0.968108 0.250496 0.000000 -vn 0.970916 0.183020 0.154180 -vn 0.983123 0.182928 0.000000 -vn 0.982879 0.099857 0.154759 -vn 0.995056 0.099033 0.000000 -vn 0.987243 -0.027833 0.156743 -vn 0.999603 -0.027833 0.000000 -vn 0.859798 0.426527 0.280679 -vn 0.863887 0.417280 0.282022 -vn 0.870663 0.401379 0.284249 -vn 0.879635 0.377758 0.288949 -vn 0.891415 0.345897 0.292734 -vn 0.905423 0.304544 0.295602 -vn 0.920499 0.251503 0.298990 -vn 0.934812 0.183905 0.303751 -vn 0.945921 0.099216 0.308817 -vn 0.949889 -0.028932 0.311197 -vn 0.804956 0.426954 0.411939 -vn 0.808802 0.417676 0.413923 -vn 0.815180 0.401776 0.417158 -vn 0.823969 0.378460 0.421674 -vn 0.834986 0.346660 0.427320 -vn 0.847804 0.304880 0.433882 -vn 0.861629 0.251198 0.440962 -vn 0.874569 0.182775 0.449110 -vn 0.885250 0.098575 0.454512 -vn 0.889828 -0.027924 0.455397 -vn 0.730827 0.427198 0.532304 -vn 0.734306 0.417951 0.534867 -vn 0.740074 0.402020 0.539079 -vn 0.748070 0.378704 0.544908 -vn 0.758080 0.346904 0.552202 -vn 0.769738 0.305094 0.560686 -vn 0.782311 0.251381 0.569842 -vn 0.794549 0.183599 0.578753 -vn 0.804285 0.099399 0.585833 -vn 0.807978 -0.027924 0.588519 -vn 0.639271 0.427290 0.639271 -vn 0.642323 0.418043 0.642354 -vn 0.647389 0.402112 0.647420 -vn 0.654378 0.378796 0.654408 -vn 0.663137 0.346965 0.663167 -vn 0.673330 0.305155 0.673391 -vn 0.684347 0.251442 0.684378 -vn 0.695059 0.183630 0.695090 -vn 0.703574 0.099429 0.703604 -vn 0.706809 -0.027924 0.706809 -vn 0.532304 0.427198 0.730827 -vn 0.534837 0.417951 0.734306 -vn 0.539048 0.402020 0.740104 -vn 0.544877 0.378704 0.748100 -vn 0.552141 0.346904 0.758110 -vn 0.560656 0.305094 0.769768 -vn 0.569811 0.251381 0.782342 -vn 0.578722 0.183599 0.794580 -vn 0.585833 0.099399 0.804285 -vn 0.588519 -0.027924 0.807978 -vn 0.411908 0.426954 0.804987 -vn 0.415509 0.417829 0.807917 -vn 0.417127 0.401776 0.815180 -vn 0.421644 0.378460 0.823969 -vn 0.427290 0.346660 0.834986 -vn 0.433851 0.304880 0.847804 -vn 0.440931 0.251198 0.861660 -vn 0.447798 0.183447 0.875088 -vn 0.453291 0.099338 0.885800 -vn 0.455397 -0.027894 0.889828 -vn 0.278817 0.426435 0.860439 -vn 0.281991 0.417280 0.863887 -vn 0.282540 0.401135 0.871334 -vn 0.287271 0.378094 0.880062 -vn 0.291086 0.346294 0.891781 -vn 0.295541 0.304544 0.905454 -vn 0.300363 0.250954 0.920194 -vn 0.305063 0.183233 0.934507 -vn 0.308786 0.099216 0.945921 -vn 0.311228 -0.026826 0.949950 -vn 0.141850 0.426099 0.893460 -vn 0.142491 0.416852 0.897702 -vn 0.143620 0.400952 0.904752 -vn 0.145146 0.377697 0.914457 -vn 0.147099 0.345927 0.926633 -vn 0.149327 0.304209 0.940794 -vn 0.153203 0.251228 0.955718 -vn 0.154118 0.183020 0.970916 -vn 0.156011 0.099094 0.982757 -vn 0.156743 -0.027863 0.987213 -vn 0.000000 0.425886 0.904752 -vn 0.001831 0.416791 0.908963 -vn 0.000000 0.400739 0.916166 -vn 0.000000 0.377483 0.925993 -vn 0.000000 0.345744 0.938322 -vn 0.000000 0.304025 0.952635 -vn 0.001434 0.251076 0.967956 -vn -0.001373 0.182257 0.983245 -vn 0.000000 0.099033 0.995056 -vn 0.000000 -0.027833 0.999603 -vn -0.141850 0.426099 0.893460 -vn -0.142521 0.416852 0.897702 -vn -0.143651 0.400952 0.904752 -vn -0.145207 0.377667 0.914457 -vn -0.147130 0.345927 0.926633 -vn -0.149388 0.304209 0.940794 -vn -0.151830 0.250649 0.956084 -vn -0.155553 0.182348 0.970824 -vn -0.154759 0.099857 0.982879 -vn -0.156743 -0.027833 0.987243 -vn -0.280679 0.426527 0.859798 -vn -0.282022 0.417280 0.863887 -vn -0.284249 0.401379 0.870663 -vn -0.287271 0.378094 0.880032 -vn -0.291147 0.346294 0.891781 -vn -0.295602 0.304544 0.905423 -vn -0.298990 0.251503 0.920499 -vn -0.305094 0.183233 0.934507 -vn -0.308817 0.099216 0.945921 -vn -0.311197 -0.028932 0.949889 -vn -0.411939 0.426954 0.804956 -vn -0.413923 0.417676 0.808802 -vn -0.417158 0.401776 0.815180 -vn -0.421674 0.378460 0.823969 -vn -0.428816 0.346263 0.834376 -vn -0.433882 0.304880 0.847804 -vn -0.440962 0.251198 0.861629 -vn -0.449110 0.182775 0.874569 -vn -0.453322 0.099338 0.885769 -vn -0.455397 -0.027924 0.889828 -vn -0.532304 0.427198 0.730827 -vn -0.534867 0.417951 0.734306 -vn -0.539079 0.402020 0.740074 -vn -0.544877 0.378704 0.748070 -vn -0.552202 0.346904 0.758080 -vn -0.560686 0.305094 0.769738 -vn -0.569842 0.251381 0.782311 -vn -0.577563 0.184271 0.795251 -vn -0.585833 0.099399 0.804285 -vn -0.588519 -0.027924 0.807978 -vn -0.639271 0.427290 0.639271 -vn -0.642354 0.418043 0.642323 -vn -0.647420 0.402112 0.647389 -vn -0.654408 0.378796 0.654378 -vn -0.663167 0.346965 0.663137 -vn -0.673360 0.305155 0.673360 -vn -0.684378 0.251442 0.684347 -vn -0.695090 0.183630 0.695059 -vn -0.704550 0.098666 0.702719 -vn -0.706809 -0.027924 0.706809 -vn -0.730827 0.427198 0.532304 -vn -0.734306 0.417951 0.534837 -vn -0.740104 0.402020 0.539048 -vn -0.748100 0.378704 0.544877 -vn -0.758110 0.346904 0.552141 -vn -0.769768 0.305094 0.560656 -vn -0.782342 0.251381 0.569811 -vn -0.794580 0.183599 0.578722 -vn -0.803461 0.100162 0.586810 -vn -0.807978 -0.027924 0.588519 -vn -0.804987 0.426923 0.411908 -vn -0.808832 0.417676 0.413892 -vn -0.815180 0.401776 0.417127 -vn -0.823969 0.378460 0.421644 -vn -0.834986 0.346660 0.427290 -vn -0.847804 0.304880 0.433851 -vn -0.861660 0.251198 0.440931 -vn -0.875088 0.183447 0.447798 -vn -0.885800 0.099338 0.453291 -vn -0.890286 -0.028962 0.454451 -vn -0.860439 0.426435 0.278817 -vn -0.863887 0.417280 0.281991 -vn -0.870663 0.401379 0.284219 -vn -0.880062 0.378094 0.287271 -vn -0.891781 0.346294 0.291086 -vn -0.905454 0.304544 0.295541 -vn -0.920194 0.250954 0.300363 -vn -0.934507 0.183233 0.305063 -vn -0.945921 0.099216 0.308786 -vn -0.949950 -0.026826 0.311228 -vn -0.893460 0.426099 0.141850 -vn -0.897702 0.416852 0.142491 -vn -0.904752 0.400952 0.143620 -vn -0.914457 0.377697 0.145146 -vn -0.926633 0.345927 0.147099 -vn -0.940794 0.304209 0.149327 -vn -0.956084 0.250649 0.151769 -vn -0.970916 0.183020 0.154118 -vn -0.982757 0.099094 0.156011 -vn -0.987213 -0.027863 0.156743 -vn -0.904752 0.425886 0.000000 -vn -0.909055 0.416639 0.000000 -vn -0.916166 0.400739 0.000000 -vn -0.925993 0.377483 0.000000 -vn -0.938322 0.345714 0.000000 -vn -0.952635 0.304025 0.000000 -vn -0.968108 0.250496 0.000000 -vn -0.983123 0.182928 0.000000 -vn -0.995056 0.099033 0.000000 -vn -0.972533 0.232734 -0.000641 -vn -0.893460 0.426099 -0.141850 -vn -0.897916 0.417005 -0.140660 -vn -0.904904 0.401196 -0.141881 -vn -0.914457 0.377667 -0.145207 -vn -0.926756 0.346324 -0.145482 -vn -0.940794 0.304209 -0.149388 -vn -0.956175 0.251198 -0.150334 -vn -0.971007 0.183691 -0.152776 -vn -0.982757 0.099094 -0.156041 -vn -0.987243 -0.027833 -0.156743 -vn -0.859798 0.426527 -0.280679 -vn -0.863887 0.417280 -0.282022 -vn -0.870205 0.401135 -0.285958 -vn -0.879635 0.377758 -0.288949 -vn -0.891781 0.346294 -0.291147 -vn -0.905118 0.304056 -0.297128 -vn -0.920499 0.251503 -0.298990 -vn -0.934507 0.183233 -0.305094 -vn -0.945585 0.098453 -0.310068 -vn -0.950224 -0.027894 -0.310221 -vn -0.804956 0.426954 -0.411939 -vn -0.808802 0.417676 -0.413923 -vn -0.815180 0.401776 -0.417158 -vn -0.823969 0.378460 -0.421674 -vn -0.834986 0.346660 -0.427320 -vn -0.847804 0.304880 -0.433882 -vn -0.861629 0.251198 -0.440962 -vn -0.874569 0.182775 -0.449110 -vn -0.885250 0.098575 -0.454512 -vn -0.889828 -0.027924 -0.455397 -vn -0.730827 0.427198 -0.532304 -vn -0.734306 0.417951 -0.534867 -vn -0.740074 0.402020 -0.539079 -vn -0.748070 0.378704 -0.544908 -vn -0.758080 0.346904 -0.552202 -vn -0.770531 0.305551 -0.559343 -vn -0.782311 0.251381 -0.569842 -vn -0.795251 0.184271 -0.577563 -vn -0.804285 0.099399 -0.585833 -vn -0.807978 -0.027924 -0.588519 -vn -0.639271 0.427290 -0.639271 -vn -0.642323 0.418043 -0.642354 -vn -0.647389 0.402112 -0.647420 -vn -0.654378 0.378796 -0.654408 -vn -0.663137 0.346965 -0.663167 -vn -0.673330 0.305155 -0.673391 -vn -0.683432 0.250862 -0.685507 -vn -0.695059 0.183630 -0.695090 -vn -0.702719 0.098666 -0.704550 -vn -0.706809 -0.027924 -0.706809 -vn -0.532304 0.427198 -0.730827 -vn -0.534837 0.417951 -0.734306 -vn -0.539048 0.402020 -0.740104 -vn -0.546159 0.379040 -0.746971 -vn -0.552141 0.346904 -0.758110 -vn -0.560656 0.305094 -0.769768 -vn -0.569811 0.251381 -0.782342 -vn -0.578722 0.183599 -0.794580 -vn -0.585833 0.099399 -0.804285 -vn -0.588519 -0.027924 -0.807978 -vn -0.411908 0.426954 -0.804987 -vn -0.413892 0.417676 -0.808832 -vn -0.417127 0.401776 -0.815180 -vn -0.421644 0.378460 -0.823969 -vn -0.425916 0.346233 -0.835871 -vn -0.433851 0.304880 -0.847804 -vn -0.440931 0.251198 -0.861660 -vn -0.447798 0.183447 -0.875088 -vn -0.453291 0.099338 -0.885800 -vn -0.455397 -0.027894 -0.889828 -vn -0.278817 0.426435 -0.860439 -vn -0.281991 0.417280 -0.863887 -vn -0.284219 0.401379 -0.870663 -vn -0.287271 0.378094 -0.880062 -vn -0.291086 0.346294 -0.891781 -vn -0.295541 0.304544 -0.905454 -vn -0.300363 0.250954 -0.920194 -vn -0.305063 0.183233 -0.934507 -vn -0.308786 0.099216 -0.945921 -vn -0.311228 -0.026826 -0.949950 -vn -0.141850 0.426099 -0.893460 -vn -0.142491 0.416852 -0.897702 -vn -0.143620 0.400952 -0.904752 -vn -0.145146 0.377697 -0.914457 -vn -0.147099 0.345927 -0.926633 -vn -0.149327 0.304209 -0.940794 -vn -0.153203 0.251228 -0.955718 -vn -0.154118 0.183020 -0.970916 -vn -0.156011 0.099094 -0.982757 -vn -0.156743 -0.027863 -0.987213 -vn 0.000000 0.425886 -0.904752 -vn 0.000000 0.416639 -0.909055 -vn 0.000000 0.400739 -0.916166 -vn 0.000000 0.377483 -0.925993 -vn 0.000000 0.345744 -0.938322 -vn 0.000000 0.304025 -0.952635 -vn -0.001434 0.251076 -0.967956 -vn 0.001373 0.182257 -0.983245 -vn 0.000000 0.099033 -0.995056 -vn 0.000000 -0.027833 -0.999603 -vn 0.141850 0.426099 -0.893460 -vn 0.142521 0.416852 -0.897702 -vn 0.141881 0.401196 -0.904904 -vn 0.145207 0.377667 -0.914457 -vn 0.147130 0.345927 -0.926633 -vn 0.149388 0.304209 -0.940794 -vn 0.151830 0.250649 -0.956084 -vn 0.155553 0.182348 -0.970824 -vn 0.154759 0.099857 -0.982879 -vn 0.156743 -0.027833 -0.987243 -vn 0.280679 0.426527 -0.859798 -vn 0.282022 0.417280 -0.863887 -vn 0.284219 0.401379 -0.870663 -vn 0.287271 0.378094 -0.880032 -vn 0.291147 0.346294 -0.891781 -vn 0.295602 0.304544 -0.905423 -vn 0.298990 0.251503 -0.920499 -vn 0.305094 0.183233 -0.934507 -vn 0.308817 0.099216 -0.945921 -vn 0.311197 -0.028932 -0.949889 -vn 0.411939 0.426954 -0.804956 -vn 0.413923 0.417676 -0.808802 -vn 0.417158 0.401776 -0.815180 -vn 0.421674 0.378460 -0.823969 -vn 0.428816 0.346263 -0.834376 -vn 0.433882 0.304880 -0.847804 -vn 0.440962 0.251198 -0.861629 -vn 0.449110 0.182775 -0.874569 -vn 0.453322 0.099338 -0.885769 -vn 0.455397 -0.027924 -0.889828 -vn 0.532304 0.427198 -0.730827 -vn 0.534867 0.417951 -0.734306 -vn 0.539079 0.402020 -0.740074 -vn 0.544908 0.378704 -0.748070 -vn 0.552202 0.346904 -0.758080 -vn 0.560686 0.305063 -0.769738 -vn 0.569842 0.251381 -0.782311 -vn 0.577563 0.184271 -0.795251 -vn 0.585833 0.099399 -0.804285 -vn 0.588519 -0.027924 -0.807978 -vn 0.639271 0.427290 -0.639271 -vn 0.642354 0.418043 -0.642323 -vn 0.647420 0.402112 -0.647389 -vn 0.654408 0.378796 -0.654378 -vn 0.663167 0.346965 -0.663137 -vn 0.673391 0.305155 -0.673330 -vn 0.684378 0.251442 -0.684347 -vn 0.695090 0.183630 -0.695059 -vn 0.704550 0.098666 -0.702719 -vn 0.706809 -0.027924 -0.706809 -vn 0.730827 0.427198 -0.532304 -vn 0.734306 0.417951 -0.534837 -vn 0.740104 0.402020 -0.539048 -vn 0.748100 0.378704 -0.544877 -vn 0.758110 0.346904 -0.552141 -vn 0.769768 0.305094 -0.560656 -vn 0.782342 0.251381 -0.569811 -vn 0.794580 0.183599 -0.578722 -vn 0.804285 0.099399 -0.585833 -vn 0.807978 -0.027924 -0.588519 -vn 0.804987 0.426954 -0.411908 -vn 0.808832 0.417676 -0.413892 -vn 0.815180 0.401776 -0.417127 -vn 0.823969 0.378460 -0.421644 -vn 0.834986 0.346660 -0.427290 -vn 0.847804 0.304880 -0.433821 -vn 0.861660 0.251198 -0.440931 -vn 0.875088 0.183447 -0.447798 -vn 0.885800 0.099338 -0.453291 -vn 0.889828 -0.027894 -0.455397 -vn 0.860439 0.426435 -0.278817 -vn 0.863887 0.417280 -0.281991 -vn 0.870663 0.401379 -0.284219 -vn 0.880062 0.378094 -0.287271 -vn 0.891781 0.346294 -0.291086 -vn 0.905454 0.304544 -0.295541 -vn 0.920194 0.250954 -0.300363 -vn 0.934507 0.183233 -0.305063 -vn 0.945921 0.099216 -0.308786 -vn 0.950224 -0.027894 -0.310221 -vn 0.893460 0.426099 -0.141850 -vn 0.897702 0.416852 -0.142491 -vn 0.904752 0.400952 -0.143620 -vn 0.914457 0.377697 -0.145146 -vn 0.926633 0.345927 -0.147099 -vn 0.940794 0.304209 -0.149327 -vn 0.956084 0.250649 -0.151769 -vn 0.970916 0.183020 -0.154118 -vn 0.982757 0.099094 -0.156011 -vn 0.987213 -0.027863 -0.156743 -vn 0.965361 -0.211097 0.153233 -vn 0.977722 -0.209784 -0.000885 -vn 0.906125 -0.397412 0.144749 -vn 0.918149 -0.396161 -0.000061 -vn 0.831202 -0.540056 0.131870 -vn 0.841762 -0.539811 -0.000092 -vn 0.756584 -0.642750 0.119999 -vn 0.766900 -0.641743 -0.001099 -vn 0.693899 -0.711570 0.110141 -vn 0.702780 -0.711356 -0.000092 -vn 0.649678 -0.753166 0.103030 -vn 0.658040 -0.752953 -0.000061 -vn 0.631428 -0.768914 0.100223 -vn 0.639546 -0.768731 0.000000 -vn 0.658162 -0.745537 0.104556 -vn 0.666646 -0.745323 0.000092 -vn 0.793695 -0.595172 0.125492 -vn 0.804590 -0.593799 0.000122 -vn 0.939268 -0.308969 0.149205 -vn 0.951109 -0.308817 0.000061 -vn 0.929136 -0.211341 0.303293 -vn 0.872585 -0.396771 0.284768 -vn 0.799799 -0.540513 0.260994 -vn 0.727897 -0.643208 0.237495 -vn 0.667501 -0.712027 0.217780 -vn 0.624043 -0.753960 0.205145 -vn 0.607318 -0.769311 0.198218 -vn 0.633045 -0.745964 0.206732 -vn 0.764367 -0.594440 0.249672 -vn 0.904202 -0.307901 0.295938 -vn 0.870052 -0.211554 0.445204 -vn 0.816980 -0.397168 0.418012 -vn 0.748741 -0.540971 0.383038 -vn 0.681326 -0.643635 0.348521 -vn 0.624714 -0.712424 0.319559 -vn 0.584826 -0.753929 0.299173 -vn 0.568316 -0.769677 0.290780 -vn 0.592425 -0.746361 0.303262 -vn 0.715476 -0.594867 0.366283 -vn 0.846400 -0.309580 0.433241 -vn 0.790002 -0.211707 0.575365 -vn 0.741752 -0.397412 0.540178 -vn 0.679708 -0.541246 0.494949 -vn 0.618458 -0.643941 0.450331 -vn 0.567034 -0.712699 0.412885 -vn 0.530808 -0.754204 0.386517 -vn 0.515793 -0.769921 0.375683 -vn 0.537675 -0.746605 0.391736 -vn 0.649434 -0.595203 0.473190 -vn 0.768548 -0.311136 0.559008 -vn 0.691092 -0.211768 0.691031 -vn 0.648885 -0.397504 0.648762 -vn 0.594592 -0.541368 0.594440 -vn 0.540971 -0.644032 0.540849 -vn 0.495987 -0.712790 0.495865 -vn 0.464278 -0.754295 0.464156 -vn 0.451155 -0.770012 0.451125 -vn 0.470260 -0.746696 0.470382 -vn 0.568041 -0.595294 0.568255 -vn 0.672384 -0.311258 0.671529 -vn 0.575427 -0.211707 0.789941 -vn 0.540300 -0.397443 0.741661 -vn 0.495102 -0.541246 0.679617 -vn 0.450484 -0.643941 0.618336 -vn 0.413038 -0.712699 0.566912 -vn 0.386639 -0.754204 0.530717 -vn 0.375683 -0.769921 0.515793 -vn 0.391552 -0.746605 0.537767 -vn 0.472976 -0.595172 0.649617 -vn 0.559709 -0.309793 0.768548 -vn 0.445296 -0.211554 0.870022 -vn 0.418134 -0.397168 0.816919 -vn 0.384320 -0.540025 0.748741 -vn 0.348704 -0.643635 0.681234 -vn 0.319742 -0.712424 0.624622 -vn 0.299295 -0.753929 0.584765 -vn 0.290811 -0.769677 0.568316 -vn 0.303079 -0.746361 0.592517 -vn 0.366039 -0.594867 0.715598 -vn 0.433119 -0.309580 0.846492 -vn 0.303385 -0.211341 0.929106 -vn 0.284921 -0.396771 0.872555 -vn 0.261177 -0.540513 0.799738 -vn 0.236427 -0.643941 0.727592 -vn 0.217963 -0.712027 0.667440 -vn 0.204047 -0.753563 0.624866 -vn 0.198248 -0.769311 0.607318 -vn 0.207556 -0.746513 0.632130 -vn 0.249397 -0.594470 0.764458 -vn 0.295053 -0.309275 0.904019 -vn 0.152379 -0.212256 0.965239 -vn 0.144017 -0.396374 0.906705 -vn 0.132054 -0.540056 0.831172 -vn 0.120212 -0.642750 0.756554 -vn 0.111484 -0.710990 0.694266 -vn 0.103183 -0.753166 0.649648 -vn 0.100223 -0.768914 0.631428 -vn 0.104373 -0.745537 0.658193 -vn 0.125614 -0.592730 0.795495 -vn 0.149052 -0.308969 0.939299 -vn 0.000885 -0.209784 0.977722 -vn 0.000061 -0.396161 0.918149 -vn 0.000092 -0.539811 0.841762 -vn 0.000092 -0.642506 0.766259 -vn 0.000092 -0.711356 0.702780 -vn -0.001373 -0.753349 0.657582 -vn 0.000000 -0.768731 0.639546 -vn -0.000092 -0.745323 0.666646 -vn -0.000122 -0.593799 0.804590 -vn -0.000061 -0.308817 0.951109 -vn -0.153233 -0.211097 0.965361 -vn -0.144749 -0.397412 0.906125 -vn -0.131870 -0.540056 0.831202 -vn -0.119999 -0.642750 0.756584 -vn -0.110050 -0.711600 0.693899 -vn -0.103030 -0.753166 0.649678 -vn -0.098300 -0.768853 0.631764 -vn -0.104556 -0.745537 0.658162 -vn -0.126286 -0.594012 0.794458 -vn -0.149205 -0.308969 0.939268 -vn -0.303293 -0.211341 0.929136 -vn -0.284768 -0.396771 0.872585 -vn -0.260994 -0.540513 0.799799 -vn -0.237495 -0.643208 0.727897 -vn -0.217780 -0.712027 0.667501 -vn -0.203894 -0.753563 0.624928 -vn -0.198218 -0.769311 0.607318 -vn -0.208045 -0.745384 0.633290 -vn -0.249672 -0.594440 0.764367 -vn -0.295206 -0.309305 0.903958 -vn -0.444563 -0.210364 0.870663 -vn -0.418012 -0.397168 0.816980 -vn -0.383038 -0.540971 0.748741 -vn -0.348521 -0.643635 0.681326 -vn -0.319559 -0.712424 0.624714 -vn -0.299173 -0.753929 0.584826 -vn -0.290780 -0.769677 0.568316 -vn -0.303262 -0.746361 0.592425 -vn -0.366283 -0.594867 0.715476 -vn -0.433241 -0.309580 0.846400 -vn -0.575365 -0.211707 0.790002 -vn -0.540696 -0.398480 0.740837 -vn -0.494949 -0.541246 0.679708 -vn -0.450331 -0.643941 0.618458 -vn -0.412885 -0.712699 0.567034 -vn -0.386517 -0.754204 0.530808 -vn -0.375683 -0.769921 0.515793 -vn -0.391736 -0.746605 0.537675 -vn -0.473190 -0.595203 0.649434 -vn -0.559008 -0.311136 0.768548 -vn -0.691031 -0.211768 0.691092 -vn -0.648762 -0.397504 0.648885 -vn -0.594440 -0.541368 0.594592 -vn -0.540849 -0.644032 0.540971 -vn -0.495865 -0.712790 0.495987 -vn -0.464156 -0.754295 0.464278 -vn -0.451125 -0.770012 0.451155 -vn -0.470382 -0.746696 0.470260 -vn -0.568255 -0.595294 0.568041 -vn -0.671529 -0.311258 0.672384 -vn -0.789941 -0.211707 0.575427 -vn -0.741661 -0.397443 0.540300 -vn -0.679617 -0.541246 0.495102 -vn -0.618336 -0.643941 0.450484 -vn -0.566912 -0.712699 0.413038 -vn -0.530717 -0.754204 0.386639 -vn -0.515793 -0.769921 0.375683 -vn -0.537767 -0.746605 0.391552 -vn -0.649617 -0.595172 0.472976 -vn -0.768548 -0.309793 0.559709 -vn -0.870022 -0.211554 0.445296 -vn -0.816919 -0.397168 0.418134 -vn -0.748650 -0.540971 0.383221 -vn -0.681234 -0.643635 0.348704 -vn -0.624622 -0.712424 0.319742 -vn -0.584765 -0.753929 0.299295 -vn -0.567461 -0.769646 0.292581 -vn -0.592517 -0.746361 0.303079 -vn -0.715598 -0.594867 0.366039 -vn -0.846492 -0.309580 0.433119 -vn -0.929106 -0.211341 0.303385 -vn -0.872555 -0.396771 0.284921 -vn -0.800012 -0.539598 0.262246 -vn -0.727836 -0.643208 0.237678 -vn -0.667440 -0.712027 0.217963 -vn -0.624866 -0.753563 0.204047 -vn -0.607318 -0.769311 0.198248 -vn -0.634083 -0.745384 0.205664 -vn -0.764458 -0.594470 0.249397 -vn -0.904019 -0.309305 0.295053 -vn -0.965239 -0.212256 0.152379 -vn -0.906705 -0.396374 0.144017 -vn -0.831172 -0.540056 0.132054 -vn -0.756127 -0.643452 0.118992 -vn -0.693869 -0.711600 0.110233 -vn -0.649648 -0.753166 0.103183 -vn -0.631428 -0.768914 0.100223 -vn -0.658193 -0.745537 0.104373 -vn -0.794519 -0.594012 0.125980 -vn -0.939299 -0.308969 0.149052 -vn -0.977477 -0.210974 0.000031 -vn -0.918149 -0.396161 0.000061 -vn -0.841762 -0.539811 0.000092 -vn -0.766259 -0.642506 0.000092 -vn -0.702780 -0.711356 0.000092 -vn -0.658040 -0.752953 0.000061 -vn -0.639546 -0.768731 0.000000 -vn -0.666646 -0.745323 -0.000092 -vn -0.804590 -0.593799 -0.000122 -vn -0.951109 -0.308817 -0.000061 -vn -0.965361 -0.211097 -0.153233 -vn -0.906735 -0.396374 -0.143895 -vn -0.831202 -0.540056 -0.131870 -vn -0.756584 -0.642750 -0.119999 -vn -0.693899 -0.711600 -0.110050 -vn -0.649678 -0.753166 -0.103030 -vn -0.631397 -0.768914 -0.100223 -vn -0.658162 -0.745537 -0.104556 -vn -0.794458 -0.594012 -0.126286 -vn -0.939268 -0.308969 -0.149205 -vn -0.929136 -0.211341 -0.303293 -vn -0.873318 -0.395703 -0.284097 -vn -0.800653 -0.539567 -0.260262 -vn -0.727897 -0.643208 -0.237495 -vn -0.667501 -0.712027 -0.217780 -vn -0.624928 -0.753563 -0.203894 -vn -0.607318 -0.769311 -0.198218 -vn -0.633045 -0.745964 -0.206732 -vn -0.764367 -0.594440 -0.249672 -vn -0.903958 -0.309305 -0.295206 -vn -0.870052 -0.211554 -0.445204 -vn -0.816980 -0.397168 -0.418012 -vn -0.747734 -0.541856 -0.383679 -vn -0.680258 -0.644368 -0.349254 -vn -0.624714 -0.712424 -0.319559 -vn -0.584826 -0.753929 -0.299173 -vn -0.568316 -0.769677 -0.290811 -vn -0.592425 -0.746361 -0.303262 -vn -0.715476 -0.594867 -0.366283 -vn -0.846400 -0.309580 -0.433241 -vn -0.790002 -0.211707 -0.575365 -vn -0.741752 -0.397412 -0.540178 -vn -0.679708 -0.541246 -0.494949 -vn -0.618458 -0.643941 -0.450331 -vn -0.568224 -0.712088 -0.412305 -vn -0.530808 -0.754204 -0.386517 -vn -0.515793 -0.769921 -0.375683 -vn -0.537675 -0.746605 -0.391736 -vn -0.649434 -0.595203 -0.473190 -vn -0.768487 -0.309793 -0.559832 -vn -0.691092 -0.211768 -0.691031 -vn -0.648885 -0.397504 -0.648762 -vn -0.594592 -0.541368 -0.594440 -vn -0.540971 -0.644032 -0.540849 -vn -0.495987 -0.712790 -0.495865 -vn -0.462935 -0.754692 -0.464888 -vn -0.451155 -0.770012 -0.451125 -vn -0.470260 -0.746696 -0.470382 -vn -0.568041 -0.595294 -0.568255 -vn -0.672201 -0.309915 -0.672323 -vn -0.575427 -0.211707 -0.789941 -vn -0.540300 -0.397443 -0.741661 -vn -0.495102 -0.541246 -0.679617 -vn -0.450484 -0.643941 -0.618336 -vn -0.413038 -0.712699 -0.566912 -vn -0.386639 -0.754204 -0.530717 -vn -0.375683 -0.769921 -0.515793 -vn -0.391552 -0.746605 -0.537767 -vn -0.472976 -0.595172 -0.649617 -vn -0.559709 -0.309793 -0.768548 -vn -0.445296 -0.211554 -0.870022 -vn -0.418134 -0.397168 -0.816919 -vn -0.383221 -0.540971 -0.748650 -vn -0.348704 -0.643635 -0.681234 -vn -0.319742 -0.712424 -0.624622 -vn -0.299295 -0.753929 -0.584765 -vn -0.292550 -0.769646 -0.567461 -vn -0.303903 -0.746910 -0.591388 -vn -0.366039 -0.594867 -0.715598 -vn -0.433119 -0.309580 -0.846461 -vn -0.303385 -0.211341 -0.929106 -vn -0.284921 -0.396771 -0.872555 -vn -0.261177 -0.540513 -0.799738 -vn -0.238868 -0.642445 -0.728141 -vn -0.217963 -0.712027 -0.667440 -vn -0.204047 -0.753563 -0.624866 -vn -0.198248 -0.769311 -0.607318 -vn -0.205664 -0.745384 -0.634083 -vn -0.249184 -0.593188 -0.765496 -vn -0.295053 -0.309275 -0.904019 -vn -0.152379 -0.212256 -0.965239 -vn -0.144017 -0.396374 -0.906705 -vn -0.133061 -0.539109 -0.831629 -vn -0.120212 -0.642750 -0.756554 -vn -0.108890 -0.712149 -0.693503 -vn -0.103183 -0.753166 -0.649648 -vn -0.100223 -0.768914 -0.631428 -vn -0.105502 -0.746086 -0.657399 -vn -0.125980 -0.594012 -0.794519 -vn -0.149052 -0.308969 -0.939299 -vn -0.000885 -0.209784 -0.977722 -vn -0.000061 -0.396161 -0.918149 -vn -0.000092 -0.539811 -0.841762 -vn 0.000000 -0.642476 -0.766289 -vn -0.000092 -0.711356 -0.702780 -vn -0.001434 -0.752556 -0.658498 -vn 0.000000 -0.768731 -0.639546 -vn 0.000092 -0.745323 -0.666646 -vn 0.000641 -0.592547 -0.805506 -vn 0.000061 -0.308817 -0.951109 -vn 0.153233 -0.211097 -0.965361 -vn 0.144749 -0.397412 -0.906125 -vn 0.131870 -0.540056 -0.831202 -vn 0.119999 -0.642750 -0.756584 -vn 0.111179 -0.712180 -0.693106 -vn 0.103030 -0.753166 -0.649678 -vn 0.102145 -0.768975 -0.631062 -vn 0.104556 -0.745537 -0.658162 -vn 0.126286 -0.594012 -0.794458 -vn 0.148442 -0.310312 -0.938932 -vn 0.303293 -0.211341 -0.929136 -vn 0.284768 -0.396771 -0.872585 -vn 0.260994 -0.540513 -0.799799 -vn 0.237495 -0.643208 -0.727897 -vn 0.216865 -0.711417 -0.668447 -vn 0.203894 -0.753563 -0.624928 -vn 0.198218 -0.769311 -0.607318 -vn 0.206732 -0.745964 -0.633045 -vn 0.249672 -0.594440 -0.764367 -vn 0.295206 -0.309305 -0.903958 -vn 0.444563 -0.210364 -0.870663 -vn 0.418012 -0.397168 -0.816980 -vn 0.383038 -0.540971 -0.748741 -vn 0.348521 -0.643635 -0.681326 -vn 0.319559 -0.712424 -0.624714 -vn 0.300272 -0.754326 -0.583758 -vn 0.290780 -0.769677 -0.568316 -vn 0.303262 -0.746361 -0.592425 -vn 0.366283 -0.594867 -0.715476 -vn 0.433241 -0.309580 -0.846400 -vn 0.575365 -0.211707 -0.790002 -vn 0.540696 -0.398480 -0.740837 -vn 0.494949 -0.541246 -0.679708 -vn 0.450331 -0.643941 -0.618458 -vn 0.412885 -0.712699 -0.567034 -vn 0.386517 -0.754204 -0.530808 -vn 0.375683 -0.769921 -0.515793 -vn 0.390362 -0.747154 -0.537889 -vn 0.473190 -0.595203 -0.649434 -vn 0.559832 -0.309793 -0.768487 -vn 0.691031 -0.211768 -0.691092 -vn 0.648762 -0.397504 -0.648885 -vn 0.594440 -0.541368 -0.594592 -vn 0.540849 -0.644032 -0.540971 -vn 0.495865 -0.712790 -0.495987 -vn 0.464156 -0.754295 -0.464278 -vn 0.451125 -0.770012 -0.451155 -vn 0.470382 -0.746696 -0.470260 -vn 0.569262 -0.594043 -0.568346 -vn 0.672323 -0.309915 -0.672201 -vn 0.789941 -0.211707 -0.575427 -vn 0.741661 -0.397443 -0.540300 -vn 0.679617 -0.541246 -0.495102 -vn 0.618336 -0.643941 -0.450484 -vn 0.566912 -0.712699 -0.413038 -vn 0.530717 -0.754204 -0.386639 -vn 0.515793 -0.769921 -0.375683 -vn 0.537797 -0.746605 -0.391552 -vn 0.648518 -0.596362 -0.472976 -vn 0.768548 -0.309793 -0.559709 -vn 0.870022 -0.211554 -0.445296 -vn 0.816919 -0.397168 -0.418134 -vn 0.748650 -0.540971 -0.383221 -vn 0.681234 -0.643635 -0.348704 -vn 0.624622 -0.712424 -0.319742 -vn 0.584765 -0.753929 -0.299295 -vn 0.568316 -0.769677 -0.290811 -vn 0.592517 -0.746361 -0.303079 -vn 0.715598 -0.594867 -0.366039 -vn 0.847163 -0.308176 -0.432752 -vn 0.929106 -0.211341 -0.303385 -vn 0.872555 -0.396771 -0.284921 -vn 0.799738 -0.540513 -0.261177 -vn 0.727836 -0.643208 -0.237678 -vn 0.667440 -0.712027 -0.217963 -vn 0.624866 -0.753563 -0.204047 -vn 0.607318 -0.769311 -0.198248 -vn 0.633106 -0.745964 -0.206549 -vn 0.764458 -0.594470 -0.249397 -vn 0.904019 -0.309305 -0.295053 -vn 0.965361 -0.211097 -0.153325 -vn 0.906705 -0.396374 -0.144017 -vn 0.831172 -0.540056 -0.132054 -vn 0.756554 -0.642750 -0.120212 -vn 0.693869 -0.711600 -0.110233 -vn 0.649648 -0.753166 -0.103183 -vn 0.631397 -0.768914 -0.100223 -vn 0.658193 -0.745537 -0.104373 -vn 0.794519 -0.594012 -0.125980 -vn 0.939299 -0.308969 -0.149052 -vn 0.916135 -0.373486 0.145360 -vn 0.927671 -0.373333 -0.000092 -vn 0.676534 -0.728599 0.106845 -vn 0.683798 -0.729667 -0.000183 -vn 0.408185 -0.910581 0.064516 -vn 0.412030 -0.911161 0.000305 -vn 0.240150 -0.969970 0.037843 -vn 0.243233 -0.969939 -0.000214 -vn 0.145329 -0.989105 0.022828 -vn 0.147191 -0.989105 -0.000214 -vn 0.089175 -0.995911 0.013916 -vn 0.090304 -0.995911 -0.000214 -vn 0.053560 -0.998505 0.008271 -vn 0.054231 -0.998505 -0.000183 -vn 0.029664 -0.999542 0.004486 -vn 0.030030 -0.999542 -0.000183 -vn 0.014405 -0.999878 0.001953 -vn 0.014557 -0.999878 -0.000305 -vn 0.000000 -1.000000 0.000000 -vn 0.881710 -0.373852 0.287729 -vn 0.650868 -0.728965 0.211890 -vn 0.391034 -0.911405 0.127964 -vn 0.232551 -0.969665 0.075228 -vn 0.139744 -0.989135 0.045351 -vn 0.085757 -0.995911 0.027741 -vn 0.051546 -0.998505 0.016572 -vn 0.028565 -0.999542 0.009095 -vn 0.013916 -0.999878 0.004181 -vn 0.825526 -0.374218 0.422376 -vn 0.607929 -0.730583 0.310862 -vn 0.365764 -0.911618 0.187506 -vn 0.216041 -0.970122 0.110263 -vn 0.129215 -0.989349 0.066530 -vn 0.080233 -0.995911 0.040803 -vn 0.048219 -0.998535 0.024445 -vn 0.026734 -0.999542 0.013459 -vn 0.013062 -0.999878 0.006317 -vn 0.749535 -0.374432 0.545824 -vn 0.551805 -0.730857 0.401654 -vn 0.333293 -0.911100 0.242439 -vn 0.196051 -0.970183 0.142491 -vn 0.118656 -0.989166 0.086123 -vn 0.072848 -0.995941 0.052767 -vn 0.043794 -0.998535 0.031617 -vn 0.024293 -0.999542 0.017426 -vn 0.011902 -0.999878 0.008271 -vn 0.654866 -0.376019 0.655507 -vn 0.482681 -0.730949 0.482406 -vn 0.292856 -0.910428 0.292062 -vn 0.171484 -0.970183 0.171148 -vn 0.103824 -0.989166 0.103488 -vn 0.063723 -0.995941 0.063417 -vn 0.038331 -0.998535 0.038026 -vn 0.021271 -0.999542 0.020997 -vn 0.010468 -0.999878 0.010010 -vn 0.545183 -0.375927 0.749260 -vn 0.401990 -0.730857 0.551561 -vn 0.242836 -0.911100 0.333018 -vn 0.141545 -0.970519 0.194952 -vn 0.086520 -0.989166 0.118381 -vn 0.053133 -0.995941 0.072573 -vn 0.031983 -0.998535 0.043550 -vn 0.017762 -0.999542 0.024049 -vn 0.008789 -0.999878 0.011536 -vn 0.422559 -0.374187 0.825465 -vn 0.311197 -0.730583 0.607746 -vn 0.189062 -0.910276 0.368267 -vn 0.110691 -0.970122 0.215796 -vn 0.067049 -0.989166 0.130528 -vn 0.041200 -0.995911 0.080050 -vn 0.024812 -0.998535 0.048036 -vn 0.013794 -0.999542 0.026551 -vn 0.006897 -0.999878 0.012787 -vn 0.287942 -0.373852 0.881649 -vn 0.212195 -0.730186 0.649434 -vn 0.129093 -0.910062 0.393750 -vn 0.074557 -0.970397 0.229591 -vn 0.045808 -0.989135 0.139622 -vn 0.028169 -0.995911 0.085604 -vn 0.016999 -0.998505 0.051393 -vn 0.009491 -0.999542 0.028413 -vn 0.004822 -0.999878 0.013703 -vn 0.145543 -0.373516 0.916105 -vn 0.107364 -0.729789 0.675161 -vn 0.065584 -0.909879 0.409589 -vn 0.037507 -0.970336 0.238746 -vn 0.023286 -0.989105 0.145268 -vn 0.014344 -0.995911 0.089084 -vn 0.008698 -0.998505 0.053499 -vn 0.004883 -0.999542 0.029603 -vn 0.002594 -0.999878 0.014313 -vn 0.000092 -0.373333 0.927671 -vn 0.000519 -0.728446 0.685080 -vn 0.000214 -0.910520 0.413404 -vn -0.000336 -0.970306 0.241798 -vn 0.000214 -0.989105 0.147191 -vn 0.000214 -0.995911 0.090304 -vn 0.000183 -0.998505 0.054231 -vn 0.000183 -0.999542 0.030030 -vn 0.000305 -0.999878 0.014557 -vn -0.145360 -0.373486 0.916135 -vn -0.106967 -0.729789 0.675222 -vn -0.064852 -0.911222 0.406720 -vn -0.037843 -0.969970 0.240150 -vn -0.022828 -0.989105 0.145329 -vn -0.013916 -0.995911 0.089175 -vn -0.008271 -0.998505 0.053560 -vn -0.004486 -0.999542 0.029664 -vn -0.001953 -0.999878 0.014405 -vn -0.287729 -0.373852 0.881710 -vn -0.211798 -0.730186 0.649556 -vn -0.128025 -0.910062 0.394116 -vn -0.075106 -0.970061 0.230903 -vn -0.045351 -0.989135 0.139744 -vn -0.027741 -0.995911 0.085757 -vn -0.016572 -0.998505 0.051546 -vn -0.009095 -0.999542 0.028565 -vn -0.004181 -0.999878 0.013916 -vn -0.422376 -0.374218 0.825526 -vn -0.310862 -0.730583 0.607929 -vn -0.187628 -0.910977 0.367260 -vn -0.110141 -0.970489 0.214484 -vn -0.066622 -0.989166 0.130741 -vn -0.040803 -0.995911 0.080233 -vn -0.024445 -0.998535 0.048219 -vn -0.013459 -0.999542 0.026734 -vn -0.006317 -0.999878 0.013062 -vn -0.545824 -0.374432 0.749535 -vn -0.401654 -0.730857 0.551805 -vn -0.242439 -0.911100 0.333293 -vn -0.142491 -0.970183 0.196051 -vn -0.086123 -0.989166 0.118656 -vn -0.052767 -0.995941 0.072848 -vn -0.031617 -0.998535 0.043794 -vn -0.017426 -0.999542 0.024293 -vn -0.008271 -0.999878 0.011933 -vn -0.655507 -0.376019 0.654866 -vn -0.482406 -0.730949 0.482681 -vn -0.291177 -0.911130 0.291513 -vn -0.171148 -0.970183 0.171484 -vn -0.103488 -0.989166 0.103824 -vn -0.063417 -0.995941 0.063723 -vn -0.038026 -0.998535 0.038331 -vn -0.020997 -0.999542 0.021271 -vn -0.010010 -0.999878 0.010468 -vn -0.749260 -0.375927 0.545183 -vn -0.551561 -0.730857 0.401990 -vn -0.333018 -0.911100 0.242836 -vn -0.195746 -0.970183 0.142857 -vn -0.118381 -0.989166 0.086520 -vn -0.072573 -0.995941 0.053133 -vn -0.043550 -0.998535 0.031983 -vn -0.024049 -0.999542 0.017762 -vn -0.011536 -0.999878 0.008789 -vn -0.825465 -0.374187 0.422559 -vn -0.607746 -0.730583 0.311197 -vn -0.367046 -0.910977 0.188055 -vn -0.215796 -0.970122 0.110691 -vn -0.130528 -0.989166 0.067049 -vn -0.080050 -0.995911 0.041200 -vn -0.048036 -0.998535 0.024812 -vn -0.026551 -0.999542 0.013794 -vn -0.012787 -0.999878 0.006897 -vn -0.881649 -0.373852 0.287942 -vn -0.649434 -0.730186 0.212195 -vn -0.392376 -0.910794 0.128300 -vn -0.230750 -0.970061 0.075564 -vn -0.139622 -0.989135 0.045808 -vn -0.085604 -0.995911 0.028169 -vn -0.051393 -0.998505 0.016999 -vn -0.028413 -0.999542 0.009491 -vn -0.013703 -0.999878 0.004822 -vn -0.916105 -0.373516 0.145543 -vn -0.675161 -0.729789 0.107364 -vn -0.408094 -0.910581 0.065004 -vn -0.240059 -0.969970 0.038331 -vn -0.145268 -0.989105 0.023286 -vn -0.089084 -0.995911 0.014344 -vn -0.053499 -0.998505 0.008698 -vn -0.029603 -0.999542 0.004883 -vn -0.014313 -0.999878 0.002594 -vn -0.928281 -0.371807 0.000549 -vn -0.683798 -0.729667 0.000183 -vn -0.413404 -0.910520 0.000214 -vn -0.243233 -0.969939 0.000214 -vn -0.147191 -0.989105 0.000214 -vn -0.090304 -0.995911 0.000214 -vn -0.054231 -0.998505 0.000183 -vn -0.030030 -0.999542 0.000183 -vn -0.014557 -0.999878 0.000305 -vn -0.916135 -0.373486 -0.145360 -vn -0.673971 -0.730888 -0.107303 -vn -0.408185 -0.910581 -0.064516 -vn -0.240150 -0.969970 -0.037843 -vn -0.145329 -0.989105 -0.022828 -vn -0.089175 -0.995911 -0.013916 -vn -0.053560 -0.998505 -0.008271 -vn -0.029664 -0.999542 -0.004486 -vn -0.014405 -0.999878 -0.001953 -vn -0.881710 -0.373852 -0.287729 -vn -0.649556 -0.730186 -0.211798 -vn -0.394116 -0.910062 -0.128025 -vn -0.230903 -0.970061 -0.075106 -vn -0.139744 -0.989135 -0.045351 -vn -0.085757 -0.995911 -0.027741 -vn -0.051546 -0.998505 -0.016572 -vn -0.028565 -0.999542 -0.009095 -vn -0.013916 -0.999878 -0.004181 -vn -0.825526 -0.374218 -0.422376 -vn -0.607929 -0.730583 -0.310862 -vn -0.367260 -0.910977 -0.187628 -vn -0.214484 -0.970489 -0.110141 -vn -0.130772 -0.989166 -0.066622 -vn -0.080233 -0.995911 -0.040803 -vn -0.048219 -0.998535 -0.024445 -vn -0.026734 -0.999542 -0.013459 -vn -0.013062 -0.999878 -0.006317 -vn -0.749535 -0.374432 -0.545824 -vn -0.553026 -0.729667 -0.402142 -vn -0.333293 -0.911100 -0.242439 -vn -0.196051 -0.970183 -0.142491 -vn -0.118656 -0.989166 -0.086123 -vn -0.072848 -0.995941 -0.052767 -vn -0.043794 -0.998535 -0.031617 -vn -0.024293 -0.999542 -0.017426 -vn -0.011902 -0.999878 -0.008271 -vn -0.655690 -0.374554 -0.655538 -vn -0.482681 -0.730949 -0.482406 -vn -0.290139 -0.911771 -0.290597 -vn -0.171484 -0.970183 -0.171148 -vn -0.103824 -0.989166 -0.103488 -vn -0.063723 -0.995941 -0.063417 -vn -0.038331 -0.998535 -0.038026 -vn -0.021271 -0.999542 -0.020997 -vn -0.010468 -0.999878 -0.010010 -vn -0.545976 -0.374462 -0.749413 -vn -0.402997 -0.729667 -0.552385 -vn -0.242836 -0.911100 -0.333018 -vn -0.142857 -0.970183 -0.195746 -vn -0.086520 -0.989166 -0.118381 -vn -0.053133 -0.995941 -0.072573 -vn -0.031983 -0.998535 -0.043550 -vn -0.017762 -0.999542 -0.024049 -vn -0.008789 -0.999878 -0.011536 -vn -0.422559 -0.374187 -0.825465 -vn -0.311197 -0.730583 -0.607746 -vn -0.187933 -0.910886 -0.367290 -vn -0.110691 -0.970122 -0.215796 -vn -0.067049 -0.989166 -0.130528 -vn -0.041200 -0.995911 -0.080020 -vn -0.024812 -0.998535 -0.048036 -vn -0.013794 -0.999542 -0.026551 -vn -0.006897 -0.999878 -0.012787 -vn -0.287942 -0.373852 -0.881649 -vn -0.212195 -0.730186 -0.649434 -vn -0.128300 -0.910794 -0.392376 -vn -0.075381 -0.970000 -0.230995 -vn -0.045808 -0.989135 -0.139622 -vn -0.028169 -0.995911 -0.085604 -vn -0.016999 -0.998505 -0.051393 -vn -0.009491 -0.999542 -0.028413 -vn -0.004822 -0.999878 -0.013703 -vn -0.145543 -0.373516 -0.916105 -vn -0.107364 -0.729789 -0.675161 -vn -0.065004 -0.910581 -0.408094 -vn -0.038331 -0.969970 -0.240059 -vn -0.022462 -0.989319 -0.143956 -vn -0.014344 -0.995911 -0.089084 -vn -0.008698 -0.998505 -0.053499 -vn -0.004883 -0.999542 -0.029603 -vn -0.002594 -0.999878 -0.014313 -vn -0.000549 -0.371807 -0.928281 -vn -0.000519 -0.728446 -0.685080 -vn -0.000214 -0.910520 -0.413434 -vn -0.000214 -0.969939 -0.243233 -vn -0.000214 -0.989105 -0.147191 -vn -0.000214 -0.995911 -0.090304 -vn -0.000183 -0.998505 -0.054231 -vn -0.000183 -0.999542 -0.030030 -vn -0.000305 -0.999878 -0.014557 -vn 0.145360 -0.373486 -0.916135 -vn 0.107303 -0.730888 -0.673971 -vn 0.064852 -0.911222 -0.406720 -vn 0.037751 -0.969573 -0.241768 -vn 0.022828 -0.989105 -0.145329 -vn 0.013916 -0.995911 -0.089175 -vn 0.008271 -0.998505 -0.053560 -vn 0.004486 -0.999542 -0.029664 -vn 0.001953 -0.999878 -0.014405 -vn 0.287851 -0.373791 -0.881680 -vn 0.211798 -0.730186 -0.649556 -vn 0.128025 -0.910062 -0.394116 -vn 0.075106 -0.970061 -0.230903 -vn 0.045473 -0.989349 -0.138218 -vn 0.027741 -0.995911 -0.085757 -vn 0.016572 -0.998505 -0.051546 -vn 0.009095 -0.999542 -0.028565 -vn 0.004181 -0.999878 -0.013916 -vn 0.422376 -0.374218 -0.825526 -vn 0.310800 -0.731681 -0.606647 -vn 0.187628 -0.910977 -0.367260 -vn 0.110538 -0.970092 -0.216071 -vn 0.066622 -0.989166 -0.130772 -vn 0.040803 -0.995911 -0.080233 -vn 0.024445 -0.998535 -0.048219 -vn 0.013459 -0.999542 -0.026734 -vn 0.006317 -0.999878 -0.013062 -vn 0.545824 -0.374432 -0.749535 -vn 0.401654 -0.730857 -0.551775 -vn 0.242439 -0.911100 -0.333293 -vn 0.142491 -0.970183 -0.196051 -vn 0.085788 -0.989380 -0.117191 -vn 0.052767 -0.995941 -0.072848 -vn 0.031617 -0.998535 -0.043794 -vn 0.017426 -0.999542 -0.024293 -vn 0.008271 -0.999878 -0.011902 -vn 0.655538 -0.374554 -0.655690 -vn 0.482406 -0.730949 -0.482681 -vn 0.291177 -0.911130 -0.291513 -vn 0.171148 -0.970183 -0.171484 -vn 0.103488 -0.989166 -0.103824 -vn 0.063417 -0.995941 -0.063723 -vn 0.038026 -0.998535 -0.038331 -vn 0.020997 -0.999542 -0.021271 -vn 0.010010 -0.999878 -0.010468 -vn 0.749413 -0.374462 -0.545976 -vn 0.551561 -0.730857 -0.401990 -vn 0.333018 -0.911100 -0.242836 -vn 0.195746 -0.970183 -0.142857 -vn 0.118381 -0.989166 -0.086520 -vn 0.072573 -0.995941 -0.053133 -vn 0.043550 -0.998535 -0.031983 -vn 0.024049 -0.999542 -0.017762 -vn 0.011536 -0.999878 -0.008789 -vn 0.825800 -0.372662 -0.423231 -vn 0.607746 -0.730583 -0.311197 -vn 0.368267 -0.910276 -0.189062 -vn 0.215796 -0.970122 -0.110691 -vn 0.130528 -0.989166 -0.067049 -vn 0.080020 -0.995911 -0.041200 -vn 0.048036 -0.998535 -0.024812 -vn 0.026551 -0.999542 -0.013794 -vn 0.012787 -0.999878 -0.006897 -vn 0.881649 -0.373852 -0.287942 -vn 0.648457 -0.731284 -0.211341 -vn 0.392376 -0.910794 -0.128300 -vn 0.230995 -0.970000 -0.075381 -vn 0.139622 -0.989135 -0.045808 -vn 0.085604 -0.995911 -0.028169 -vn 0.051393 -0.998505 -0.016999 -vn 0.028413 -0.999542 -0.009491 -vn 0.013703 -0.999878 -0.004822 -vn 0.916105 -0.373516 -0.145543 -vn 0.676351 -0.728599 -0.107883 -vn 0.408094 -0.910581 -0.065004 -vn 0.240059 -0.969970 -0.038331 -vn 0.143956 -0.989319 -0.022462 -vn 0.089084 -0.995911 -0.014344 -vn 0.053499 -0.998505 -0.008698 -vn 0.029603 -0.999542 -0.004883 -vn 0.014313 -0.999878 -0.002594 -vn 0.001099 -0.999969 0.003693 -vn 0.001099 -0.984710 0.174108 -vn 0.004791 -0.985717 0.168279 -vn 0.004761 -0.999969 -0.001984 -vn 0.017487 -0.985260 0.170049 -vn 0.017426 -0.999847 0.000000 -vn 0.042421 -0.984497 0.170080 -vn 0.042177 -0.999084 0.000000 -vn 0.085482 -0.981506 0.171117 -vn 0.084841 -0.996368 0.000000 -vn 0.156377 -0.972167 0.174352 -vn 0.155126 -0.987884 0.000061 -vn 0.270974 -0.945280 0.181555 -vn 0.269143 -0.963073 0.000305 -vn 0.449141 -0.872005 0.194494 -vn 0.448805 -0.893613 0.000549 -vn 0.686972 -0.695547 0.210334 -vn 0.694754 -0.719199 0.000366 -vn 0.898312 -0.380535 0.219550 -vn 0.918332 -0.395795 -0.000336 -vn 0.973876 -0.052339 0.220862 -vn 0.998474 -0.055177 -0.000397 -vn 0.001068 -0.924345 0.381512 -vn 0.004730 -0.926695 0.375713 -vn 0.017151 -0.926054 0.376965 -vn 0.041627 -0.925321 0.376843 -vn 0.083834 -0.921628 0.378826 -vn 0.152867 -0.910062 0.385174 -vn 0.262612 -0.878475 0.399060 -vn 0.427625 -0.799097 0.422498 -vn 0.637867 -0.625294 0.449538 -vn 0.818690 -0.336894 0.464949 -vn 0.882473 -0.044618 0.468215 -vn 0.000946 -0.778222 0.627949 -vn 0.004212 -0.779992 0.625721 -vn 0.015259 -0.779321 0.626392 -vn 0.036988 -0.778771 0.626179 -vn 0.074282 -0.774255 0.628437 -vn 0.134373 -0.760094 0.635731 -vn 0.227027 -0.724387 0.650899 -vn 0.359722 -0.644612 0.674551 -vn 0.519517 -0.490097 0.699911 -vn 0.651570 -0.256661 0.713828 -vn 0.695181 -0.031800 0.718101 -vn 0.000610 -0.470199 0.882534 -vn 0.002716 -0.474929 0.880001 -vn 0.009857 -0.476394 0.879147 -vn 0.023957 -0.477065 0.878506 -vn 0.048006 -0.474685 0.878842 -vn 0.086245 -0.464766 0.881191 -vn 0.143681 -0.439070 0.886868 -vn 0.222633 -0.383679 0.896207 -vn 0.312906 -0.283242 0.906552 -vn 0.382641 -0.142857 0.912748 -vn 0.399304 -0.016083 0.916654 -vn 0.000000 0.004303 0.999969 -vn 0.000000 -0.001679 0.999969 -vn -0.000031 0.001343 0.999969 -vn -0.000183 0.002625 0.999969 -vn -0.000641 0.004120 0.999969 -vn -0.001526 0.005219 0.999969 -vn -0.002777 0.004975 0.999969 -vn -0.003571 0.002808 0.999969 -vn -0.002655 0.000122 0.999969 -vn -0.000122 -0.000763 0.999969 -vn -0.001221 -0.000244 0.999969 -vn -0.000671 0.474105 0.880428 -vn -0.003021 0.473861 0.880551 -vn -0.011048 0.478256 0.878140 -vn -0.027070 0.479690 0.877010 -vn -0.054689 0.476730 0.877316 -vn -0.098453 0.463179 0.880764 -vn -0.162206 0.428663 0.888760 -vn -0.243599 0.359935 0.900601 -vn -0.325816 0.251350 0.911374 -vn -0.380779 0.121372 0.916623 -vn -0.394910 0.011841 0.918607 -vn -0.001160 0.778466 0.627674 -vn -0.005158 0.779199 0.626728 -vn -0.018708 0.780053 0.625416 -vn -0.045686 0.778466 0.625965 -vn -0.091952 0.770318 0.630970 -vn -0.165563 0.747459 0.643300 -vn -0.274270 0.694510 0.665120 -vn -0.415693 0.588427 0.693442 -vn -0.560228 0.415265 0.716697 -vn -0.658681 0.202765 0.724570 -vn -0.690573 0.019166 0.722983 -vn -0.001434 0.927335 0.374187 -vn -0.006287 0.926115 0.377148 -vn -0.022828 0.926115 0.376507 -vn -0.055757 0.924131 0.377941 -vn -0.112705 0.916593 0.383587 -vn -0.204505 0.894955 0.396435 -vn -0.343211 0.840754 0.418683 -vn -0.527879 0.721885 0.447401 -vn -0.717154 0.514115 0.470473 -vn -0.842311 0.251137 0.476852 -vn -0.880612 0.022553 0.473251 -vn -0.001526 0.986023 0.166570 -vn -0.006684 0.985046 0.172033 -vn -0.024659 0.985107 0.170019 -vn -0.060305 0.983367 0.171148 -vn -0.122196 0.976989 0.174688 -vn -0.222846 0.957671 0.182134 -vn -0.377056 0.905454 0.194708 -vn -0.585070 0.783013 0.211035 -vn -0.798151 0.559282 0.223853 -vn -0.935270 0.271859 0.226600 -vn -0.974395 0.023041 0.223609 -vn -0.001556 0.999969 -0.003723 -vn -0.006806 0.999969 0.001984 -vn -0.025147 0.999664 0.000153 -vn -0.061617 0.998077 0.000366 -vn -0.124943 0.992157 0.000671 -vn -0.228370 0.973540 0.001007 -vn -0.387371 0.921903 0.001312 -vn -0.602557 0.798029 0.001526 -vn -0.822352 0.568926 0.001556 -vn -0.961486 0.274728 0.001282 -vn -0.999725 0.022217 0.000458 -vn -0.001526 0.984710 -0.174108 -vn -0.006684 0.985717 -0.168157 -vn -0.024628 0.985137 -0.169866 -vn -0.060335 0.983490 -0.170537 -vn -0.122379 0.977172 -0.173467 -vn -0.223457 0.957884 -0.180212 -vn -0.378491 0.905393 -0.192206 -vn -0.587695 0.781854 -0.207984 -vn -0.801355 0.556108 -0.220283 -vn -0.937223 0.267922 -0.223121 -vn -0.974761 0.021485 -0.222083 -vn -0.001404 0.925810 -0.377941 -vn -0.006195 0.926786 -0.375469 -vn -0.022736 0.925993 -0.376812 -vn -0.055605 0.924131 -0.377972 -vn -0.112400 0.916776 -0.383160 -vn -0.204169 0.895535 -0.395367 -vn -0.343364 0.841609 -0.416852 -vn -0.529527 0.722251 -0.444838 -vn -0.720847 0.512223 -0.466842 -vn -0.846004 0.247108 -0.472396 -vn -0.881924 0.020539 -0.470901 -vn -0.001160 0.778222 -0.627949 -vn -0.005158 0.778893 -0.627094 -vn -0.018586 0.779351 -0.626270 -vn -0.045320 0.777642 -0.627033 -vn -0.091159 0.769646 -0.631886 -vn -0.164098 0.747337 -0.643818 -vn -0.272378 0.695425 -0.664937 -vn -0.414869 0.590228 -0.692434 -vn -0.562334 0.416028 -0.714591 -vn -0.662954 0.200842 -0.721183 -vn -0.692740 0.017701 -0.720939 -vn -0.000671 0.473800 -0.880612 -vn -0.003021 0.475082 -0.879910 -vn -0.010926 0.476455 -0.879116 -vn -0.026612 0.476455 -0.878780 -vn -0.053377 0.472030 -0.879940 -vn -0.095523 0.457747 -0.883908 -vn -0.157262 0.424146 -0.891812 -vn -0.237709 0.358104 -0.902890 -vn -0.321940 0.251778 -0.912656 -vn -0.381146 0.121525 -0.916471 -vn -0.394452 0.011170 -0.918821 -vn 0.000000 -0.004303 -0.999969 -vn 0.000000 -0.000336 -0.999969 -vn 0.000031 -0.001160 -0.999969 -vn 0.000153 -0.002228 -0.999969 -vn 0.000458 -0.003540 -0.999969 -vn 0.001099 -0.004730 -0.999969 -vn 0.002136 -0.005341 -0.999969 -vn 0.003357 -0.004791 -0.999969 -vn 0.003845 -0.002899 -0.999969 -vn 0.002258 -0.000732 -0.999969 -vn 0.000397 -0.000031 -0.999969 -vn 0.000610 -0.477676 -0.878506 -vn 0.002716 -0.473708 -0.880673 -vn 0.009949 -0.477981 -0.878292 -vn 0.024293 -0.479659 -0.877102 -vn 0.048891 -0.477950 -0.877010 -vn 0.088198 -0.467818 -0.879391 -vn 0.146977 -0.440138 -0.885800 -vn 0.226661 -0.380688 -0.896451 -vn 0.314951 -0.276284 -0.907987 -vn 0.379772 -0.137333 -0.914792 -vn 0.396619 -0.015412 -0.917814 -vn 0.000946 -0.780877 -0.624653 -vn 0.004212 -0.777825 -0.628437 -vn 0.015320 -0.780175 -0.625355 -vn 0.037172 -0.779962 -0.624714 -vn 0.074618 -0.775719 -0.626606 -vn 0.135014 -0.761711 -0.633656 -vn 0.228278 -0.725639 -0.649068 -vn 0.361797 -0.643727 -0.674306 -vn 0.520676 -0.484817 -0.702719 -vn 0.647816 -0.251015 -0.719230 -vn 0.691733 -0.031220 -0.721458 -vn 0.001068 -0.927305 -0.374218 -vn 0.004730 -0.925321 -0.379101 -vn 0.017182 -0.926328 -0.376263 -vn 0.041566 -0.925657 -0.375988 -vn 0.083529 -0.922147 -0.377667 -vn 0.152074 -0.910916 -0.383496 -vn 0.260994 -0.879971 -0.396832 -vn 0.425611 -0.801141 -0.420698 -vn 0.636464 -0.625813 -0.450789 -vn 0.816340 -0.335276 -0.470260 -vn 0.880459 -0.044710 -0.471938 -vn 0.001099 -0.986023 -0.166570 -vn 0.004791 -0.985046 -0.172124 -vn 0.017457 -0.985290 -0.169836 -vn 0.042238 -0.984527 -0.169866 -vn 0.084841 -0.981628 -0.170812 -vn 0.154790 -0.972533 -0.173711 -vn 0.267769 -0.946440 -0.180303 -vn 0.444197 -0.874905 -0.192785 -vn 0.682485 -0.700034 -0.209967 -vn 0.896512 -0.383312 -0.222022 -vn 0.973357 -0.053102 -0.222907 -vn 0.963652 0.146306 0.223426 -vn 0.988708 0.149663 0.000122 -vn 0.937437 0.266396 0.224006 -vn 0.962462 0.271401 0.000305 -vn 0.902829 0.368908 0.220862 -vn 0.927152 0.374615 0.000122 -vn 0.860805 0.461959 0.213446 -vn 0.883724 0.467971 -0.000214 -vn 0.810602 0.549516 0.202338 -vn 0.831446 0.555559 -0.000641 -vn 0.750755 0.632893 0.189093 -vn 0.769158 0.639027 -0.001007 -vn 0.680074 0.711661 0.176092 -vn 0.695761 0.718253 -0.001221 -vn 0.597919 0.783990 0.166814 -vn 0.610706 0.791833 -0.001282 -vn 0.504776 0.847285 0.165136 -vn 0.514389 0.857540 -0.001099 -vn 0.455977 0.874264 0.166509 -vn 0.870846 0.132908 0.473220 -vn 0.846065 0.244179 0.473800 -vn 0.815424 0.340678 0.467971 -vn 0.779992 0.429701 0.454909 -vn 0.738609 0.514786 0.435224 -vn 0.688955 0.596728 0.411298 -vn 0.628712 0.674123 0.387555 -vn 0.556444 0.743736 0.370373 -vn 0.472274 0.801202 0.367382 -vn 0.426862 0.824610 0.371136 -vn 0.682211 0.104740 0.723594 -vn 0.661489 0.194739 0.724204 -vn 0.638539 0.274789 0.718833 -vn 0.614612 0.350688 0.706534 -vn 0.588336 0.425703 0.687460 -vn 0.556627 0.500198 0.663259 -vn 0.515732 0.571673 0.638081 -vn 0.462569 0.634693 0.618976 -vn 0.395978 0.681600 0.615253 -vn 0.357219 0.697226 0.621448 -vn 0.386944 0.059786 0.920133 -vn 0.374096 0.112491 0.920530 -vn 0.361461 0.160619 0.918424 -vn 0.350047 0.207617 0.913419 -vn 0.338939 0.255715 0.905362 -vn 0.326029 0.305307 0.894681 -vn 0.307962 0.354320 0.882931 -vn 0.281228 0.397351 0.873501 -vn 0.243477 0.425977 0.871334 -vn 0.216254 0.426984 0.877987 -vn -0.000641 -0.000153 0.999969 -vn -0.002258 -0.000916 0.999969 -vn -0.003754 -0.002136 0.999969 -vn -0.005066 -0.003815 0.999969 -vn -0.006012 -0.005676 0.999939 -vn -0.006226 -0.007263 0.999939 -vn -0.005310 -0.007660 0.999939 -vn -0.003204 -0.005799 0.999969 -vn -0.000488 -0.001434 0.999969 -vn 0.000336 0.000610 0.999969 -vn -0.386761 -0.060945 0.920133 -vn -0.376812 -0.119449 0.918516 -vn -0.362255 -0.173925 0.915677 -vn -0.347056 -0.226020 0.910184 -vn -0.331248 -0.276620 0.902066 -vn -0.313486 -0.325022 0.892209 -vn -0.291757 -0.368480 0.882656 -vn -0.264290 -0.402417 0.876461 -vn -0.230384 -0.421247 0.877163 -vn -0.208289 -0.420301 0.883114 -vn -0.683096 -0.108554 0.722190 -vn -0.659383 -0.212012 0.721274 -vn -0.626606 -0.306986 0.716300 -vn -0.589435 -0.393384 0.705527 -vn -0.550005 -0.471511 0.689291 -vn -0.508560 -0.541124 0.669698 -vn -0.464705 -0.600940 0.650288 -vn -0.417920 -0.648640 0.636067 -vn -0.368023 -0.681173 0.632862 -vn -0.340068 -0.691855 0.636891 -vn -0.870632 -0.138890 0.471877 -vn -0.838710 -0.272195 0.471633 -vn -0.791681 -0.393475 0.467299 -vn -0.735679 -0.499893 0.456984 -vn -0.675314 -0.590869 0.441359 -vn -0.613697 -0.666921 0.422529 -vn -0.552507 -0.728965 0.404126 -vn -0.492721 -0.777734 0.390271 -vn -0.434797 -0.813776 0.385571 -vn -0.404614 -0.828394 0.387341 -vn -0.962645 -0.153783 0.222755 -vn -0.926756 -0.302194 0.223121 -vn -0.871792 -0.436964 0.221320 -vn -0.804590 -0.553026 0.216163 -vn -0.731803 -0.649007 0.207862 -vn -0.658498 -0.726127 0.197729 -vn -0.587939 -0.786798 0.187628 -vn -0.521805 -0.833888 0.179693 -vn -0.460799 -0.869808 0.176122 -vn -0.430555 -0.885159 0.176183 -vn -0.987457 -0.157689 0.000061 -vn -0.950560 -0.310465 0.000336 -vn -0.893277 -0.449446 0.001068 -vn -0.822565 -0.568621 0.001892 -vn -0.745811 -0.666128 0.002564 -vn -0.668844 -0.743370 0.002991 -vn -0.595508 -0.803308 0.003052 -vn -0.527726 -0.849391 0.002686 -vn -0.466201 -0.884640 0.001892 -vn -0.436872 -0.899503 0.001465 -vn -0.962676 -0.153478 -0.222816 -vn -0.926878 -0.301950 -0.222846 -vn -0.872036 -0.437330 -0.219703 -vn -0.804682 -0.554277 -0.212714 -vn -0.731498 -0.650990 -0.202673 -vn -0.657735 -0.728507 -0.191290 -vn -0.586810 -0.789300 -0.180639 -vn -0.520524 -0.836085 -0.173132 -vn -0.459578 -0.871487 -0.170934 -vn -0.430860 -0.886013 -0.171209 -vn -0.870479 -0.138249 -0.472365 -vn -0.838557 -0.271004 -0.472610 -vn -0.792047 -0.392529 -0.467452 -vn -0.736534 -0.499893 -0.455611 -vn -0.676382 -0.592120 -0.438002 -vn -0.614612 -0.669424 -0.417219 -vn -0.552995 -0.732353 -0.397229 -vn -0.492630 -0.781549 -0.382672 -vn -0.434248 -0.817408 -0.378460 -vn -0.405927 -0.831507 -0.379162 -vn -0.682485 -0.107791 -0.722861 -vn -0.657826 -0.209967 -0.723258 -vn -0.625233 -0.304209 -0.718680 -vn -0.588702 -0.390515 -0.707724 -vn -0.550127 -0.469497 -0.690573 -vn -0.509507 -0.540788 -0.669240 -vn -0.466201 -0.602741 -0.647542 -vn -0.419477 -0.652516 -0.631031 -vn -0.369213 -0.686514 -0.626362 -vn -0.342906 -0.697989 -0.628620 -vn -0.387463 -0.060762 -0.919858 -vn -0.373302 -0.117191 -0.920255 -vn -0.356822 -0.169439 -0.918638 -vn -0.340403 -0.219123 -0.914365 -vn -0.324290 -0.267739 -0.907254 -vn -0.307321 -0.315378 -0.897794 -vn -0.287423 -0.360118 -0.887478 -vn -0.262429 -0.397717 -0.879147 -vn -0.230873 -0.422071 -0.876644 -vn -0.210395 -0.424726 -0.880490 -vn -0.001587 -0.000031 -0.999969 -vn 0.001831 0.000671 -0.999969 -vn 0.003510 0.001831 -0.999969 -vn 0.005188 0.003510 -0.999969 -vn 0.006500 0.005524 -0.999939 -vn 0.007080 0.007447 -0.999939 -vn 0.006500 0.008301 -0.999939 -vn 0.004578 0.007080 -0.999939 -vn 0.001801 0.003327 -0.999969 -vn 0.000183 0.000336 -0.999969 -vn 0.387890 0.060213 -0.919706 -vn 0.376965 0.114200 -0.919126 -vn 0.365307 0.163945 -0.916318 -vn 0.354381 0.212683 -0.910550 -vn 0.343120 0.262215 -0.901914 -vn 0.328990 0.312235 -0.891201 -vn 0.308695 0.359691 -0.880490 -vn 0.279397 0.398785 -0.873409 -vn 0.240150 0.422285 -0.874050 -vn 0.213172 0.421216 -0.881527 -vn 0.683096 0.105197 -0.722678 -vn 0.663686 0.196204 -0.721763 -vn 0.640584 0.276955 -0.716178 -vn 0.615864 0.353191 -0.704215 -vn 0.588275 0.427808 -0.686178 -vn 0.555010 0.501053 -0.663991 -vn 0.512772 0.570482 -0.641560 -vn 0.459029 0.631092 -0.625263 -vn 0.392926 0.675954 -0.623432 -vn 0.353099 0.689840 -0.631977 -vn 0.871303 0.133091 -0.472304 -vn 0.847163 0.244606 -0.471664 -vn 0.816248 0.340953 -0.466323 -vn 0.780297 0.429426 -0.454573 -vn 0.738395 0.513688 -0.436842 -vn 0.688406 0.594745 -0.415143 -vn 0.628132 0.671285 -0.393384 -vn 0.556139 0.740379 -0.377453 -vn 0.472304 0.797754 -0.374767 -vn 0.424543 0.820887 -0.381939 -vn 0.963805 0.146184 -0.222907 -vn 0.937834 0.265938 -0.222877 -vn 0.903378 0.367809 -0.220374 -vn 0.861568 0.460158 -0.214209 -vn 0.811701 0.547044 -0.204535 -vn 0.752312 0.629994 -0.192572 -vn 0.682028 0.708670 -0.180425 -vn 0.600024 0.781396 -0.171270 -vn 0.506516 0.845454 -0.169195 -vn 0.455184 0.873287 -0.173528 -vn -0.081393 0.996673 0.000855 -vn -0.082766 0.958190 0.273873 -vn -0.182226 0.949553 0.255135 -vn -0.186468 0.982452 -0.000977 -vn -0.402203 0.882717 0.242836 -vn -0.419111 0.907926 -0.000519 -vn -0.629597 0.742119 0.229865 -vn -0.655354 0.755303 0.000061 -vn -0.798364 0.561693 0.216987 -vn -0.826533 0.562883 0.000427 -vn -0.884854 0.413526 0.214454 -vn -0.913694 0.406323 0.000946 -vn -0.909207 0.344096 0.234291 -vn -0.943571 0.331065 0.002930 -vn -0.890835 0.363903 0.271859 -vn -0.936766 0.349620 0.014252 -vn -0.833552 0.458388 0.308298 -vn -0.890744 0.454207 0.014954 -vn -0.723075 0.607318 0.329051 -vn -0.782708 0.622211 0.013184 -vn -0.592547 0.740379 0.317301 -vn -0.637226 0.770623 0.007019 -vn -0.079073 0.828822 0.553880 -vn -0.158818 0.837275 0.523148 -vn -0.341258 0.792840 0.504868 -vn -0.538743 0.688406 0.485580 -vn -0.694266 0.547166 0.467513 -vn -0.776421 0.427320 0.463149 -vn -0.790887 0.369213 0.487960 -vn -0.760033 0.379162 0.527757 -vn -0.690176 0.443831 0.571490 -vn -0.585833 0.548173 0.596851 -vn -0.483108 0.654042 0.582049 -vn -0.060945 0.606189 0.792962 -vn -0.110752 0.633778 0.765526 -vn -0.227912 0.620045 0.750694 -vn -0.365642 0.567400 0.737754 -vn -0.485092 0.487472 0.725944 -vn -0.553758 0.413190 0.722892 -vn -0.564989 0.371014 0.736930 -vn -0.543352 0.368664 0.754204 -vn -0.484054 0.398267 0.779107 -vn -0.406262 0.451003 0.794671 -vn -0.338633 0.521653 0.783044 -vn -0.024323 0.317881 0.947783 -vn -0.033418 0.343425 0.938566 -vn -0.060976 0.360179 0.930876 -vn -0.109073 0.365307 0.924436 -vn -0.163427 0.353038 0.921201 -vn -0.201972 0.330699 0.921842 -vn -0.225593 0.313120 0.922513 -vn -0.242714 0.306986 0.920225 -vn -0.239753 0.310831 0.919706 -vn -0.211859 0.313761 0.925535 -vn -0.183477 0.345561 0.920255 -vn 0.029420 -0.002747 0.999542 -vn 0.069247 -0.005249 0.997559 -vn 0.146214 0.025880 0.988891 -vn 0.211463 0.077822 0.974273 -vn 0.233345 0.136113 0.962798 -vn 0.199469 0.180486 0.963103 -vn 0.154973 0.190344 0.969390 -vn 0.100253 0.178869 0.978729 -vn 0.053865 0.147160 0.987640 -vn 0.026612 0.081210 0.996338 -vn -0.005036 0.087649 0.996124 -vn 0.095676 -0.329173 0.939390 -vn 0.167943 -0.320200 0.932310 -vn 0.318949 -0.267403 0.909238 -vn 0.454543 -0.172185 0.873897 -vn 0.532823 -0.068636 0.843410 -vn 0.538591 0.008087 0.842524 -vn 0.483657 0.040345 0.874294 -vn 0.398358 0.023621 0.916898 -vn 0.303903 -0.037751 0.951933 -vn 0.224891 -0.160924 0.960997 -vn 0.178228 -0.247139 0.952422 -vn 0.161290 -0.612445 0.773858 -vn 0.254555 -0.591357 0.765160 -vn 0.456099 -0.512528 0.727500 -vn 0.629749 -0.375011 0.680258 -vn 0.731956 -0.231910 0.640645 -vn 0.758080 -0.133488 0.638325 -vn 0.723106 -0.100070 0.683432 -vn 0.645161 -0.135929 0.751854 -vn 0.533952 -0.235725 0.811945 -vn 0.408856 -0.402478 0.819025 -vn 0.316172 -0.530168 0.786706 -vn 0.213813 -0.819300 0.531938 -vn 0.319926 -0.789575 0.523606 -vn 0.546251 -0.682028 0.486190 -vn 0.735374 -0.511155 0.444838 -vn 0.844966 -0.341044 0.411878 -vn 0.882199 -0.232063 0.409680 -vn 0.869137 -0.206336 0.449385 -vn 0.815271 -0.267678 0.513443 -vn 0.710349 -0.406873 0.574297 -vn 0.552049 -0.599200 0.579791 -vn 0.410108 -0.739341 0.533952 -vn 0.244972 -0.933653 0.261177 -vn 0.357341 -0.898373 0.255318 -vn 0.591540 -0.771783 0.233192 -vn 0.785119 -0.582446 0.210456 -vn 0.896207 -0.399304 0.193152 -vn 0.938536 -0.286966 0.191748 -vn 0.938871 -0.268899 0.214911 -vn 0.903012 -0.349040 0.250343 -vn 0.808039 -0.515244 0.285531 -vn 0.631947 -0.719596 0.287698 -vn 0.454939 -0.852901 0.256050 -vn 0.254463 -0.967071 -0.000244 -vn 0.370037 -0.929014 0.001434 -vn 0.604816 -0.796350 -0.000397 -vn 0.798944 -0.601367 -0.001343 -vn 0.909970 -0.414655 -0.002564 -vn 0.953154 -0.302347 -0.005493 -vn 0.956847 -0.290536 -0.004517 -vn 0.925108 -0.379589 -0.004700 -vn 0.831263 -0.555834 -0.003937 -vn 0.648000 -0.761620 -0.001984 -vn 0.464156 -0.885739 0.000580 -vn 0.244331 -0.932463 -0.266060 -vn 0.360942 -0.898099 -0.251137 -vn 0.594043 -0.769463 -0.234504 -vn 0.787194 -0.578387 -0.213813 -vn 0.897153 -0.394116 -0.199286 -vn 0.937284 -0.282022 -0.204749 -vn 0.935270 -0.269234 -0.229713 -vn 0.896969 -0.353832 -0.264931 -vn 0.800134 -0.522477 -0.294504 -vn 0.624104 -0.726707 -0.286935 -vn 0.455397 -0.855098 -0.247688 -vn 0.211615 -0.812311 -0.543443 -vn 0.324656 -0.790979 -0.518571 -vn 0.549211 -0.677664 -0.488937 -vn 0.737083 -0.504929 -0.449110 -vn 0.844172 -0.333964 -0.419294 -vn 0.877041 -0.224891 -0.424482 -vn 0.860317 -0.202582 -0.467757 -vn 0.806330 -0.266060 -0.528184 -vn 0.705924 -0.407086 -0.579577 -vn 0.552355 -0.603992 -0.574480 -vn 0.417249 -0.747215 -0.517197 -vn 0.157781 -0.598926 -0.785058 -vn 0.259011 -0.592853 -0.762505 -vn 0.458022 -0.505448 -0.731223 -vn 0.629292 -0.367534 -0.684744 -vn 0.727928 -0.224372 -0.647877 -vn 0.749138 -0.126164 -0.650258 -vn 0.712668 -0.094394 -0.695090 -vn 0.641011 -0.130741 -0.756279 -vn 0.539262 -0.230750 -0.809870 -vn 0.418195 -0.400372 -0.815332 -vn 0.328806 -0.541215 -0.773888 -vn 0.092746 -0.316172 -0.944151 -vn 0.169073 -0.316141 -0.933500 -vn 0.317911 -0.258950 -0.912046 -vn 0.450514 -0.165685 -0.877224 -vn 0.526292 -0.063936 -0.847865 -vn 0.532456 0.010620 -0.846370 -vn 0.483749 0.041780 -0.874172 -vn 0.408948 0.025513 -0.912168 -vn 0.320231 -0.034242 -0.946715 -vn 0.237678 -0.154820 -0.958892 -vn 0.188635 -0.253395 -0.948759 -vn 0.026704 0.012177 -0.999542 -vn 0.067202 0.004852 -0.997711 -vn 0.141758 0.032716 -0.989349 -vn 0.206244 0.080081 -0.975188 -vn 0.235420 0.131718 -0.962889 -vn 0.221870 0.169103 -0.960295 -vn 0.174017 0.185308 -0.967132 -vn 0.124271 0.174932 -0.976684 -vn 0.074313 0.144383 -0.986694 -vn 0.035279 0.082919 -0.995911 -vn 0.004608 0.075625 -0.997101 -vn -0.027406 0.340892 -0.939695 -vn -0.034486 0.339091 -0.940092 -vn -0.058412 0.351634 -0.934294 -vn -0.099124 0.354686 -0.929685 -vn -0.146214 0.344340 -0.927366 -vn -0.189581 0.327158 -0.925748 -vn -0.212073 0.310007 -0.926756 -vn -0.216315 0.300211 -0.928983 -vn -0.212867 0.300485 -0.929716 -vn -0.192907 0.302133 -0.933531 -vn -0.167852 0.335490 -0.926939 -vn -0.062746 0.628956 -0.774865 -vn -0.112003 0.629627 -0.768761 -vn -0.226661 0.616260 -0.754173 -vn -0.361217 0.565050 -0.741752 -vn -0.484146 0.486709 -0.727073 -vn -0.558550 0.412030 -0.719871 -vn -0.570421 0.370251 -0.733116 -vn -0.536149 0.368786 -0.759270 -vn -0.475448 0.399548 -0.783746 -vn -0.400128 0.454512 -0.795770 -vn -0.323527 0.520768 -0.790002 -vn -0.078921 0.841670 -0.534165 -vn -0.157476 0.833888 -0.528977 -vn -0.338908 0.791009 -0.509323 -vn -0.537431 0.687948 -0.487686 -vn -0.697012 0.547197 -0.463332 -vn -0.780450 0.427534 -0.456160 -vn -0.798395 0.369091 -0.475661 -vn -0.768273 0.378979 -0.515824 -vn -0.696493 0.445875 -0.562151 -vn -0.588946 0.553148 -0.589160 -vn -0.472274 0.657918 -0.586566 -vn -0.081881 0.960875 -0.264534 -vn -0.178899 0.949004 -0.259468 -vn -0.400098 0.882931 -0.245552 -vn -0.628864 0.742668 -0.230049 -vn -0.797937 0.563097 -0.214850 -vn -0.884610 0.416242 -0.210181 -vn -0.911374 0.345622 -0.223426 -vn -0.899960 0.359844 -0.246040 -vn -0.845241 0.453566 -0.282479 -vn -0.734275 0.604846 -0.308115 -vn -0.591937 0.743431 -0.311289 -vn -0.487045 0.825770 0.284341 -vn -0.523179 0.852168 0.005341 -vn -0.410230 0.878323 0.245369 -vn -0.440596 0.897671 0.003540 -vn -0.322306 0.926633 0.193396 -vn -0.345347 0.938444 0.001648 -vn -0.207404 0.970916 0.119388 -vn -0.220405 0.975402 0.000183 -vn 0.028840 0.998627 -0.043153 -vn 0.045991 0.998932 -0.000427 -vn 0.486465 0.810877 -0.325205 -vn 0.597827 0.801599 0.000061 -vn 0.828059 0.178014 -0.531571 -vn 0.991760 0.128025 -0.000610 -vn 0.766106 -0.397382 -0.505081 -vn 0.874203 -0.485488 -0.002441 -vn 0.641835 -0.645894 -0.413312 -vn 0.706992 -0.707205 -0.000732 -vn 0.593890 -0.723289 -0.352275 -vn 0.641102 -0.767296 0.014069 -vn -0.399213 0.746117 0.532792 -vn -0.337260 0.820429 0.461592 -vn -0.266823 0.891598 0.365795 -vn -0.172918 0.958739 0.225532 -vn -0.004975 0.998871 -0.046999 -vn 0.277993 0.838435 -0.468703 -vn 0.512131 0.313913 -0.799463 -vn 0.534227 -0.192511 -0.823084 -vn 0.487686 -0.483077 -0.727134 -vn 0.468368 -0.592792 -0.655110 -vn -0.283395 0.618854 0.732597 -vn -0.242225 0.729118 0.640065 -vn -0.193670 0.838191 0.509781 -vn -0.128849 0.941130 0.312418 -vn -0.027528 0.999359 -0.021882 -vn 0.126560 0.868374 -0.479446 -vn 0.261971 0.461287 -0.847652 -vn 0.310099 0.030824 -0.950194 -vn 0.311869 -0.274331 -0.909635 -vn 0.311289 -0.402783 -0.860714 -vn -0.152409 0.440138 0.884884 -vn -0.132115 0.599872 0.789087 -vn -0.108982 0.764977 0.634724 -vn -0.080660 0.916837 0.391003 -vn -0.036714 0.999176 0.015595 -vn 0.031892 0.895566 -0.443739 -vn 0.096225 0.585192 -0.805139 -vn 0.133122 0.235694 -0.962645 -vn 0.148503 -0.049745 -0.987640 -vn 0.153020 -0.175329 -0.972533 -vn 0.000092 0.189184 0.981933 -vn 0.000275 0.407819 0.913053 -vn -0.007294 0.651875 0.758263 -vn -0.021729 0.878719 0.476791 -vn -0.034333 0.997681 0.058504 -vn -0.031343 0.918668 -0.393750 -vn -0.019379 0.687521 -0.725883 -vn -0.006928 0.422193 -0.906461 -vn 0.000214 0.186102 -0.982513 -vn -0.000092 0.084201 -0.996429 -vn 0.162847 -0.139439 0.976714 -vn 0.158879 0.116214 0.980407 -vn 0.133976 0.454817 0.880428 -vn 0.068331 0.811090 0.580889 -vn -0.018921 0.994201 0.105716 -vn -0.078494 0.938505 -0.336161 -vn -0.107364 0.775506 -0.622089 -vn -0.122349 0.593524 -0.795434 -vn -0.134342 0.427442 -0.893979 -vn -0.142827 0.359355 -0.922178 -vn 0.306131 -0.487320 0.817774 -vn 0.329417 -0.266579 0.905759 -vn 0.334147 0.123600 0.934355 -vn 0.231941 0.673696 0.701651 -vn 0.018128 0.987457 0.156713 -vn -0.116703 0.955962 -0.269265 -vn -0.177831 0.851344 -0.493484 -vn -0.216254 0.743858 -0.632344 -vn -0.246712 0.648366 -0.720206 -vn -0.261177 0.609119 -0.748802 -vn 0.392712 -0.745628 0.538285 -vn 0.450179 -0.620045 0.642506 -vn 0.540788 -0.300150 0.785760 -vn 0.515885 0.418775 0.747276 -vn 0.098636 0.975066 0.198645 -vn -0.148289 0.970489 -0.190039 -vn -0.232917 0.911618 -0.338633 -vn -0.284646 0.857753 -0.427992 -vn -0.324900 0.812250 -0.484420 -vn -0.342357 0.792352 -0.504898 -vn 0.423933 -0.871273 0.247169 -vn 0.492996 -0.816095 0.301492 -vn 0.646443 -0.640858 0.413923 -vn 0.839137 0.172155 0.515915 -vn 0.243599 0.954619 0.171209 -vn -0.170629 0.980468 -0.097476 -vn -0.267312 0.948943 -0.167302 -vn -0.323038 0.922971 -0.209143 -vn -0.365398 0.901181 -0.233070 -vn -0.383343 0.890774 -0.243965 -vn 0.429762 -0.902921 -0.003784 -vn 0.499130 -0.866482 -0.005585 -vn 0.664022 -0.747581 -0.011902 -vn 0.993500 0.113559 -0.002747 -vn 0.339152 0.940703 -0.000427 -vn -0.178411 0.983947 0.000061 -vn -0.278146 0.960509 -0.000061 -vn -0.334910 0.942228 -0.001190 -vn -0.376690 0.926328 0.000336 -vn -0.394330 0.918943 -0.003815 -vn 0.424818 -0.868404 -0.255684 -vn 0.495376 -0.809107 -0.316080 -vn 0.653890 -0.610645 -0.446638 -vn 0.833308 0.198798 -0.515763 -vn 0.265908 0.948210 -0.173711 -vn -0.170568 0.980468 0.097781 -vn -0.266854 0.948882 0.168371 -vn -0.323588 0.922636 0.209784 -vn -0.365520 0.900266 0.236427 -vn -0.384136 0.893246 0.233467 -vn 0.392529 -0.738731 -0.547838 -vn 0.449660 -0.603107 -0.658803 -vn 0.536363 -0.262734 -0.802026 -vn 0.525101 0.400555 -0.750847 -vn 0.128513 0.966033 -0.224067 -vn -0.147282 0.970916 0.188696 -vn -0.232521 0.911405 0.339427 -vn -0.284371 0.856563 0.430555 -vn -0.323832 0.808954 0.490616 -vn -0.345256 0.799890 0.490829 -vn 0.305002 -0.480758 -0.822077 -vn 0.327219 -0.255165 -0.909818 -vn 0.333079 0.128056 -0.934141 -vn 0.248299 0.646321 -0.721519 -vn 0.033448 0.982238 -0.184484 -vn -0.115574 0.957091 0.265694 -vn -0.178045 0.850765 0.494430 -vn -0.216224 0.743126 0.633229 -vn -0.244911 0.644246 0.724509 -vn -0.265938 0.620472 0.737724 -vn 0.163945 -0.142705 -0.976074 -vn 0.160283 0.111942 -0.980682 -vn 0.137577 0.445204 -0.884762 -vn 0.076357 0.798334 -0.597308 -vn -0.012696 0.991913 -0.126072 -vn -0.077792 0.940977 0.329325 -vn -0.106937 0.774407 0.623554 -vn -0.122776 0.592425 0.796167 -vn -0.133915 0.426679 0.894406 -vn -0.146123 0.366894 0.918699 -vn 0.004883 0.179937 -0.983642 -vn 0.002777 0.400800 -0.916135 -vn -0.004975 0.645985 -0.763298 -vn -0.018860 0.874630 -0.484359 -vn -0.032075 0.997009 -0.070132 -vn -0.031800 0.922025 0.385754 -vn -0.018067 0.686117 0.727226 -vn -0.006653 0.417493 0.908628 -vn 0.000122 0.182440 0.983184 -vn 0.000061 0.083468 0.996490 -vn -0.144963 0.435713 -0.888302 -vn -0.127293 0.598590 -0.790857 -vn -0.106662 0.764153 -0.636128 -vn -0.079501 0.916654 -0.391675 -vn -0.035310 0.999146 -0.020386 -vn 0.030519 0.898953 0.436933 -vn 0.098422 0.584094 0.805658 -vn 0.134678 0.227638 0.964354 -vn 0.148381 -0.056398 0.987304 -vn 0.146428 -0.166662 0.975066 -vn -0.278390 0.616779 -0.736229 -vn -0.236976 0.728477 -0.642750 -vn -0.189245 0.839320 -0.509598 -vn -0.126743 0.942778 -0.308298 -vn -0.025422 0.999451 0.020692 -vn 0.125065 0.871242 0.474624 -vn 0.264595 0.462783 0.846034 -vn 0.312235 0.022217 0.949736 -vn 0.310862 -0.279855 0.908292 -vn 0.295785 -0.384472 0.874447 -vn -0.398419 0.746239 -0.533219 -vn -0.335337 0.820368 -0.463149 -vn -0.263253 0.892178 -0.366955 -vn -0.169317 0.960204 -0.222022 -vn -0.002014 0.998932 0.045930 -vn 0.276925 0.840632 0.465407 -vn 0.514298 0.319681 0.795801 -vn 0.535569 -0.196783 0.821223 -vn 0.485763 -0.483444 0.728202 -vn 0.449782 -0.573473 0.684683 -vn -0.489883 0.826411 -0.277444 -vn -0.411908 0.878597 -0.241615 -vn -0.322336 0.926786 -0.192602 -vn -0.205267 0.971465 -0.118564 -vn 0.028748 0.998749 0.040193 -vn 0.483016 0.814325 0.321787 -vn 0.827906 0.189062 0.527970 -vn 0.768212 -0.394696 0.503983 -vn 0.642506 -0.642689 0.417249 -vn 0.583300 -0.713767 0.387585 -vn 0.130131 0.991272 0.020875 -vn 0.131840 0.991241 0.000366 -vn 0.000000 1.000000 0.000000 -vn 0.415082 0.907376 0.065645 -vn 0.420362 0.907346 0.000244 -vn 0.887143 0.439711 0.139988 -vn 0.899014 0.437880 0.000336 -vn 0.951415 -0.268838 0.149937 -vn 0.963195 -0.268715 -0.000061 -vn 0.792627 -0.596728 0.124882 -vn 0.802637 -0.596423 -0.000092 -vn 0.736778 -0.666036 0.116276 -vn 0.746178 -0.665700 0.000031 -vn 0.775842 -0.619037 0.121586 -vn 0.786218 -0.617939 0.000092 -vn 0.908231 -0.393109 0.143254 -vn 0.919584 -0.392834 -0.000488 -vn 0.970702 0.184118 0.154302 -vn 0.983551 0.180548 -0.000336 -vn 0.667135 0.737358 0.105869 -vn 0.675436 0.737388 -0.000183 -vn 0.125065 0.991272 0.040986 -vn 0.399182 0.907590 0.129826 -vn 0.853359 0.441725 0.276833 -vn 0.915983 -0.269204 0.297372 -vn 0.762749 -0.597369 0.247597 -vn 0.709525 -0.666555 0.228523 -vn 0.746605 -0.619739 0.241798 -vn 0.874569 -0.392346 0.284860 -vn 0.934355 0.183996 0.305124 -vn 0.641743 0.737785 0.209235 -vn 0.116916 0.991302 0.059999 -vn 0.373394 0.907834 0.190649 -vn 0.799799 0.440291 0.407971 -vn 0.857265 -0.271218 0.437605 -vn 0.714011 -0.598010 0.363994 -vn 0.663411 -0.667318 0.338420 -vn 0.699088 -0.619587 0.356822 -vn 0.818781 -0.393078 0.418348 -vn 0.874935 0.183905 0.447890 -vn 0.600665 0.738121 0.307108 -vn 0.105960 0.991333 0.077486 -vn 0.337626 0.908719 0.245277 -vn 0.726005 0.440535 0.528001 -vn 0.778832 -0.269875 0.566179 -vn 0.648000 -0.598468 0.471023 -vn 0.602008 -0.667745 0.437757 -vn 0.634327 -0.620136 0.461562 -vn 0.743370 -0.392163 0.541795 -vn 0.794397 0.183844 0.578875 -vn 0.546495 0.737114 0.397443 -vn 0.092502 0.991333 0.093051 -vn 0.295907 0.908078 0.296304 -vn 0.635121 0.438795 0.635639 -vn 0.680898 -0.269967 0.680776 -vn 0.566485 -0.598621 0.566301 -vn 0.526261 -0.667898 0.526200 -vn 0.554552 -0.620319 0.554674 -vn 0.649892 -0.393811 0.650014 -vn 0.695303 0.182043 0.695242 -vn 0.476943 0.738456 0.476638 -vn 0.076876 0.991333 0.106388 -vn 0.245491 0.908719 0.337474 -vn 0.527787 0.440565 0.726157 -vn 0.566912 -0.268197 0.778863 -vn 0.472335 -0.597491 0.647969 -vn 0.437819 -0.667745 0.601978 -vn 0.461867 -0.620960 0.633290 -vn 0.541002 -0.395032 0.742454 -vn 0.578845 0.182104 0.794794 -vn 0.397198 0.738365 0.544969 -vn 0.059328 0.991302 0.117252 -vn 0.190161 0.907834 0.373669 -vn 0.407910 0.438490 0.800806 -vn 0.437513 -0.269570 0.857814 -vn 0.363048 -0.598926 0.713736 -vn 0.336741 -0.667379 0.664205 -vn 0.356731 -0.619648 0.699088 -vn 0.418348 -0.393048 0.818812 -vn 0.447340 0.183996 0.875210 -vn 0.307474 0.738151 0.600452 -vn 0.040254 0.991272 0.125309 -vn 0.129215 0.908322 0.397748 -vn 0.277230 0.441755 0.853206 -vn 0.297525 -0.269204 0.915952 -vn 0.248817 -0.596393 0.763115 -vn 0.230323 -0.666677 0.708853 -vn 0.243568 -0.619770 0.745994 -vn 0.285104 -0.393811 0.873836 -vn 0.304544 0.184057 0.934507 -vn 0.209632 0.737815 0.641591 -vn 0.020112 0.991272 0.130253 -vn 0.065279 0.908109 0.413556 -vn 0.139622 0.437910 0.888089 -vn 0.149541 -0.270455 0.951018 -vn 0.126011 -0.595752 0.793176 -vn 0.114322 -0.666097 0.737022 -vn 0.123447 -0.619068 0.775536 -vn 0.143315 -0.390332 0.909421 -vn 0.153691 0.184149 0.970794 -vn 0.106082 0.737480 0.666951 -vn -0.000366 0.991241 0.131840 -vn 0.000122 0.908078 0.418775 -vn -0.000336 0.437880 0.899014 -vn 0.000458 -0.267037 0.963683 -vn 0.000092 -0.596423 0.802637 -vn -0.001923 -0.665792 0.746117 -vn -0.000122 -0.617908 0.786218 -vn -0.000610 -0.389996 0.920804 -vn 0.000031 0.182409 0.983215 -vn 0.000183 0.737388 0.675436 -vn -0.020875 0.991272 0.130131 -vn -0.065645 0.907376 0.415082 -vn -0.139866 0.439619 0.887204 -vn -0.149937 -0.268838 0.951415 -vn -0.125706 -0.597674 0.791803 -vn -0.114414 -0.665914 0.737175 -vn -0.121586 -0.619068 0.775842 -vn -0.143284 -0.393078 0.908261 -vn -0.153996 0.182318 0.971099 -vn -0.105655 0.737480 0.667043 -vn -0.040986 0.991272 0.125065 -vn -0.128971 0.908322 0.397839 -vn -0.277444 0.439985 0.854030 -vn -0.297678 -0.270821 0.915403 -vn -0.247017 -0.596423 0.763695 -vn -0.230293 -0.666677 0.708853 -vn -0.242897 -0.618915 0.746940 -vn -0.284860 -0.392315 0.874569 -vn -0.305155 0.183966 0.934355 -vn -0.209235 0.737785 0.641743 -vn -0.059999 0.991302 0.116916 -vn -0.190649 0.907834 0.373424 -vn -0.408551 0.438459 0.800501 -vn -0.437391 -0.269601 0.857875 -vn -0.363994 -0.598010 0.714011 -vn -0.340068 -0.667409 0.662465 -vn -0.356914 -0.619648 0.698996 -vn -0.418378 -0.393048 0.818812 -vn -0.447890 0.183874 0.874966 -vn -0.307108 0.738121 0.600665 -vn -0.077486 0.991333 0.105960 -vn -0.246529 0.908017 0.338664 -vn -0.528001 0.440535 0.726005 -vn -0.566179 -0.269875 0.778832 -vn -0.471023 -0.598468 0.648000 -vn -0.437757 -0.667745 0.602008 -vn -0.461531 -0.620136 0.634327 -vn -0.540147 -0.395032 0.743065 -vn -0.578845 0.183844 0.794397 -vn -0.397443 0.737114 0.546495 -vn -0.093051 0.991333 0.092502 -vn -0.296304 0.908078 0.295907 -vn -0.634846 0.440626 0.634632 -vn -0.680776 -0.269967 0.680898 -vn -0.566301 -0.598621 0.566485 -vn -0.526200 -0.667898 0.526261 -vn -0.554674 -0.620319 0.554552 -vn -0.649159 -0.395215 0.649892 -vn -0.695242 0.183874 0.694815 -vn -0.476638 0.738456 0.476943 -vn -0.106388 0.991333 0.076876 -vn -0.338969 0.908017 0.246101 -vn -0.726157 0.440535 0.527787 -vn -0.778741 -0.269875 0.566301 -vn -0.647877 -0.598468 0.471236 -vn -0.601978 -0.667745 0.437819 -vn -0.634419 -0.620136 0.461379 -vn -0.742454 -0.395032 0.540971 -vn -0.794733 0.183905 0.578356 -vn -0.544969 0.738365 0.397198 -vn -0.117252 0.991302 0.059328 -vn -0.373669 0.907834 0.190161 -vn -0.799921 0.440321 0.407697 -vn -0.857814 -0.269601 0.437513 -vn -0.713920 -0.598010 0.364208 -vn -0.663411 -0.667318 0.338450 -vn -0.698019 -0.620472 0.357372 -vn -0.818018 -0.394513 0.418531 -vn -0.875210 0.183966 0.447340 -vn -0.600452 0.738151 0.307474 -vn -0.125309 0.991272 0.040254 -vn -0.397748 0.908322 0.129215 -vn -0.853206 0.441755 0.277230 -vn -0.916257 -0.267525 0.298044 -vn -0.762688 -0.597369 0.247810 -vn -0.708335 -0.666585 0.232154 -vn -0.745994 -0.619770 0.243599 -vn -0.874569 -0.392346 0.284829 -vn -0.934751 0.182165 0.304971 -vn -0.641591 0.737815 0.209632 -vn -0.128544 0.991485 0.020234 -vn -0.415174 0.907376 0.065127 -vn -0.888089 0.437910 0.139622 -vn -0.951018 -0.270455 0.149541 -vn -0.792077 -0.597644 0.124058 -vn -0.736778 -0.666036 0.116245 -vn -0.776360 -0.618213 0.122623 -vn -0.909452 -0.390301 0.143315 -vn -0.970794 0.184149 0.153691 -vn -0.665792 0.738609 0.105411 -vn -0.131840 0.991241 -0.000366 -vn -0.422132 0.906522 -0.000397 -vn -0.898099 0.439741 -0.000122 -vn -0.963195 -0.268715 0.000061 -vn -0.802637 -0.596423 0.000092 -vn -0.746178 -0.665700 -0.000031 -vn -0.785577 -0.618732 0.000916 -vn -0.920194 -0.391369 0.000000 -vn -0.983215 0.182409 0.000031 -vn -0.675436 0.737388 0.000183 -vn -0.130131 0.991272 -0.020875 -vn -0.415082 0.907376 -0.065645 -vn -0.886349 0.441450 -0.139500 -vn -0.951415 -0.268838 -0.149937 -vn -0.792627 -0.596728 -0.124882 -vn -0.737175 -0.665914 -0.114414 -vn -0.775842 -0.619037 -0.121586 -vn -0.908780 -0.391644 -0.143864 -vn -0.971099 0.182257 -0.154057 -vn -0.667043 0.737480 -0.105655 -vn -0.125065 0.991272 -0.040986 -vn -0.397839 0.908322 -0.128971 -vn -0.853328 0.441725 -0.276833 -vn -0.915983 -0.269173 -0.297433 -vn -0.762749 -0.597369 -0.247597 -vn -0.709525 -0.666555 -0.228523 -vn -0.746940 -0.618885 -0.242927 -vn -0.874569 -0.392315 -0.284860 -vn -0.934355 0.183996 -0.305124 -vn -0.640400 0.738945 -0.209296 -vn -0.116916 0.991302 -0.059999 -vn -0.373424 0.907834 -0.190649 -vn -0.799890 0.440199 -0.407849 -vn -0.857265 -0.271218 -0.437605 -vn -0.712973 -0.598956 -0.364513 -vn -0.663411 -0.667318 -0.338420 -vn -0.699088 -0.619587 -0.356822 -vn -0.818781 -0.393078 -0.418348 -vn -0.874966 0.183874 -0.447890 -vn -0.600665 0.738121 -0.307108 -vn -0.105960 0.991333 -0.077486 -vn -0.338664 0.908017 -0.246529 -vn -0.726005 0.440535 -0.528001 -vn -0.778161 -0.271493 -0.566301 -vn -0.648000 -0.598468 -0.471023 -vn -0.602008 -0.667745 -0.437757 -vn -0.634327 -0.620136 -0.461562 -vn -0.743370 -0.392163 -0.541795 -vn -0.794397 0.183844 -0.578875 -vn -0.546495 0.737114 -0.397443 -vn -0.092502 0.991333 -0.093051 -vn -0.295083 0.908780 -0.294900 -vn -0.634632 0.440626 -0.634846 -vn -0.680898 -0.269967 -0.680776 -vn -0.566485 -0.598621 -0.566301 -vn -0.526261 -0.667898 -0.526200 -vn -0.554552 -0.620319 -0.554674 -vn -0.649892 -0.395215 -0.649159 -vn -0.695303 0.182043 -0.695242 -vn -0.476943 0.738456 -0.476638 -vn -0.076876 0.991333 -0.106388 -vn -0.246101 0.908017 -0.339000 -vn -0.528153 0.438704 -0.727012 -vn -0.566301 -0.269875 -0.778741 -vn -0.471236 -0.598468 -0.647877 -vn -0.437819 -0.667745 -0.601978 -vn -0.461867 -0.620960 -0.633290 -vn -0.541002 -0.395032 -0.742454 -vn -0.578356 0.183905 -0.794763 -vn -0.397198 0.738365 -0.544969 -vn -0.059328 0.991302 -0.117252 -vn -0.190161 0.907834 -0.373669 -vn -0.407697 0.440321 -0.799921 -vn -0.437513 -0.269601 -0.857814 -vn -0.364208 -0.598010 -0.713920 -vn -0.338450 -0.667318 -0.663411 -vn -0.357341 -0.620472 -0.698050 -vn -0.418348 -0.393048 -0.818812 -vn -0.447340 0.183996 -0.875210 -vn -0.307474 0.738151 -0.600452 -vn -0.040254 0.991272 -0.125309 -vn -0.129215 0.908322 -0.397748 -vn -0.277230 0.441755 -0.853206 -vn -0.297525 -0.269204 -0.915952 -vn -0.248817 -0.596393 -0.763115 -vn -0.230323 -0.666677 -0.708853 -vn -0.243599 -0.619770 -0.745994 -vn -0.284829 -0.392376 -0.874569 -vn -0.304544 0.184027 -0.934507 -vn -0.209632 0.737815 -0.641591 -vn -0.020112 0.991272 -0.130253 -vn -0.065127 0.907376 -0.415174 -vn -0.139622 0.437910 -0.888089 -vn -0.149541 -0.270455 -0.951018 -vn -0.125095 -0.596728 -0.792596 -vn -0.114353 -0.666097 -0.737022 -vn -0.123447 -0.619068 -0.775536 -vn -0.143315 -0.390301 -0.909452 -vn -0.153691 0.184118 -0.970794 -vn -0.106082 0.737480 -0.666951 -vn 0.000366 0.991241 -0.131840 -vn 0.000244 0.907346 -0.420362 -vn 0.000122 0.439741 -0.898099 -vn -0.000061 -0.268715 -0.963195 -vn -0.000092 -0.596423 -0.802637 -vn 0.000031 -0.665700 -0.746178 -vn 0.000092 -0.617939 -0.786218 -vn 0.000610 -0.389996 -0.920804 -vn -0.000336 0.180548 -0.983551 -vn -0.000183 0.737388 -0.675436 -vn 0.020875 0.991272 -0.130131 -vn 0.065645 0.907376 -0.415082 -vn 0.139988 0.439711 -0.887143 -vn 0.149937 -0.268838 -0.951415 -vn 0.124882 -0.596728 -0.792627 -vn 0.116276 -0.666036 -0.736778 -vn 0.121586 -0.619068 -0.775842 -vn 0.143254 -0.393109 -0.908231 -vn 0.153996 0.182318 -0.971099 -vn 0.105930 0.738609 -0.665731 -vn 0.040986 0.991272 -0.125065 -vn 0.129826 0.907590 -0.399182 -vn 0.276833 0.441725 -0.853359 -vn 0.297372 -0.269204 -0.915983 -vn 0.247597 -0.597369 -0.762749 -vn 0.228523 -0.666555 -0.709525 -vn 0.241768 -0.619739 -0.746605 -vn 0.284860 -0.392346 -0.874569 -vn 0.305155 0.183996 -0.934355 -vn 0.209418 0.736534 -0.643117 -vn 0.059999 0.991302 -0.116916 -vn 0.190649 0.907834 -0.373424 -vn 0.407270 0.442030 -0.799188 -vn 0.437605 -0.271218 -0.857265 -vn 0.363567 -0.597034 -0.715049 -vn 0.338420 -0.667318 -0.663411 -vn 0.356822 -0.619587 -0.699088 -vn 0.418348 -0.393078 -0.818781 -vn 0.447890 0.183905 -0.874935 -vn 0.307108 0.738121 -0.600665 -vn 0.077486 0.991333 -0.105960 -vn 0.246529 0.908017 -0.338664 -vn 0.528031 0.440535 -0.726005 -vn 0.566301 -0.271493 -0.778161 -vn 0.471023 -0.598468 -0.648000 -vn 0.439253 -0.667837 -0.600818 -vn 0.461562 -0.620136 -0.634327 -vn 0.541795 -0.392163 -0.743370 -vn 0.578875 0.183874 -0.794397 -vn 0.397443 0.737114 -0.546495 -vn 0.093051 0.991333 -0.092502 -vn 0.296304 0.908078 -0.295907 -vn 0.634846 0.440626 -0.634632 -vn 0.680776 -0.269967 -0.680898 -vn 0.566301 -0.598621 -0.566485 -vn 0.526200 -0.667898 -0.526261 -vn 0.554674 -0.620319 -0.554552 -vn 0.650014 -0.393811 -0.649892 -vn 0.695242 0.180181 -0.695791 -vn 0.476638 0.738456 -0.476943 -vn 0.106388 0.991333 -0.076876 -vn 0.339000 0.908017 -0.246101 -vn 0.726157 0.440535 -0.527787 -vn 0.778741 -0.269875 -0.566301 -vn 0.647877 -0.598468 -0.471236 -vn 0.601978 -0.667745 -0.437819 -vn 0.633290 -0.620960 -0.461867 -vn 0.742454 -0.395032 -0.541002 -vn 0.794794 0.182073 -0.578875 -vn 0.544237 0.739525 -0.396069 -vn 0.117252 0.991302 -0.059328 -vn 0.373669 0.907834 -0.190161 -vn 0.799921 0.440321 -0.407697 -vn 0.857814 -0.269570 -0.437513 -vn 0.714194 -0.597034 -0.365276 -vn 0.663411 -0.667318 -0.338450 -vn 0.698050 -0.620472 -0.357372 -vn 0.818812 -0.393048 -0.418348 -vn 0.875362 0.182134 -0.447768 -vn 0.600452 0.738151 -0.307474 -vn 0.125309 0.991272 -0.040254 -vn 0.399365 0.907620 -0.129307 -vn 0.854122 0.440016 -0.277139 -vn 0.915952 -0.269204 -0.297525 -vn 0.762688 -0.597369 -0.247810 -vn 0.709372 -0.666738 -0.228492 -vn 0.745994 -0.619770 -0.243568 -vn 0.874569 -0.392376 -0.284829 -vn 0.934538 0.184057 -0.304544 -vn 0.640553 0.738945 -0.208808 -vn 0.130253 0.991272 -0.020112 -vn 0.413556 0.908109 -0.065279 -vn 0.887173 0.439741 -0.139683 -vn 0.951415 -0.268838 -0.150090 -vn 0.792596 -0.596728 -0.125095 -vn 0.736778 -0.666036 -0.116245 -vn 0.776330 -0.618275 -0.122501 -vn 0.909421 -0.390332 -0.143315 -vn 0.970794 0.184149 -0.153691 -vn 0.666951 0.737480 -0.106082 -vn 0.373669 0.925657 0.059053 -vn 0.378460 0.925596 -0.000214 -vn 0.245491 0.968596 0.038728 -vn 0.248665 0.968566 -0.000183 -vn 0.183111 0.982665 0.028871 -vn 0.185461 0.982635 -0.000153 -vn 0.154698 0.987640 0.024445 -vn 0.156713 0.987610 -0.000092 -vn 0.149968 0.988372 0.023835 -vn 0.151952 0.988372 0.000031 -vn 0.168889 0.985260 0.026948 -vn 0.171148 0.985229 0.000153 -vn 0.222266 0.974334 0.035463 -vn 0.225196 0.974303 0.000183 -vn 0.348674 0.935575 0.055574 -vn 0.353252 0.935514 0.000214 -vn 0.669454 0.735130 0.106479 -vn 0.677999 0.735038 0.000214 -vn 0.838862 0.528703 0.129460 -vn 0.848903 0.528489 -0.003632 -vn 0.357830 0.926389 0.117161 -vn 0.236061 0.968688 0.076815 -vn 0.176061 0.982696 0.057253 -vn 0.148747 0.987671 0.048433 -vn 0.144169 0.988403 0.047090 -vn 0.162358 0.985290 0.053133 -vn 0.213630 0.974395 0.069948 -vn 0.335215 0.935728 0.109653 -vn 0.643971 0.735496 0.210425 -vn 0.807733 0.529191 0.259804 -vn 0.336161 0.925993 0.171728 -vn 0.220832 0.968749 0.112735 -vn 0.164708 0.982727 0.084078 -vn 0.139164 0.987701 0.071078 -vn 0.134831 0.988433 0.069033 -vn 0.151830 0.985321 0.077853 -vn 0.199805 0.974456 0.102451 -vn 0.313547 0.935850 0.160680 -vn 0.602649 0.735862 0.308634 -vn 0.756737 0.529618 0.383129 -vn 0.305063 0.926084 0.221900 -vn 0.200415 0.968810 0.145695 -vn 0.149480 0.982757 0.108646 -vn 0.126286 0.987732 0.091830 -vn 0.122318 0.988464 0.089145 -vn 0.137730 0.985351 0.100497 -vn 0.181249 0.974487 0.132267 -vn 0.284433 0.935942 0.207465 -vn 0.546922 0.736137 0.398633 -vn 0.687613 0.529923 0.496323 -vn 0.265450 0.926695 0.265969 -vn 0.175298 0.968810 0.174993 -vn 0.130741 0.982757 0.130497 -vn 0.110446 0.987732 0.110294 -vn 0.106967 0.988464 0.107028 -vn 0.120426 0.985351 0.120640 -vn 0.158452 0.974487 0.158757 -vn 0.248115 0.936521 0.247658 -vn 0.478317 0.736229 0.478652 -vn 0.602130 0.530076 0.597003 -vn 0.222266 0.926084 0.304788 -vn 0.146031 0.968810 0.200140 -vn 0.110202 0.982543 0.149785 -vn 0.092013 0.987732 0.126164 -vn 0.090030 0.988525 0.121220 -vn 0.100253 0.985351 0.137913 -vn 0.131932 0.974487 0.181494 -vn 0.206702 0.936491 0.283242 -vn 0.398938 0.734855 0.548448 -vn 0.502213 0.529954 0.683309 -vn 0.172155 0.925993 0.335948 -vn 0.113132 0.968749 0.220649 -vn 0.084384 0.982727 0.164556 -vn 0.069887 0.987793 0.138981 -vn 0.068941 0.988433 0.134892 -vn 0.077334 0.985137 0.153325 -vn 0.102084 0.974456 0.199988 -vn 0.160253 0.935850 0.313761 -vn 0.308664 0.734581 0.604205 -vn 0.389630 0.529649 0.753410 -vn 0.117466 0.925840 0.359172 -vn 0.077212 0.968688 0.235908 -vn 0.057588 0.982696 0.175939 -vn 0.048616 0.987671 0.148686 -vn 0.046999 0.988403 0.144200 -vn 0.052828 0.985290 0.162450 -vn 0.069521 0.974395 0.213782 -vn 0.109195 0.935728 0.335368 -vn 0.209998 0.735496 0.644124 -vn 0.266762 0.529221 0.805444 -vn 0.059511 0.925657 0.373577 -vn 0.039155 0.968596 0.245430 -vn 0.029206 0.982665 0.183050 -vn 0.024659 0.987640 0.154668 -vn 0.023743 0.988372 0.149968 -vn 0.026643 0.985260 0.168950 -vn 0.035066 0.974334 0.222327 -vn 0.055086 0.935575 0.348766 -vn 0.106052 0.735130 0.669546 -vn 0.136692 0.528733 0.837703 -vn 0.000610 0.924986 0.379986 -vn 0.000183 0.968566 0.248665 -vn 0.000153 0.982635 0.185461 -vn 0.000092 0.987610 0.156713 -vn -0.000031 0.988372 0.151952 -vn -0.000153 0.985229 0.171148 -vn -0.000183 0.974303 0.225196 -vn -0.000214 0.935514 0.353252 -vn -0.000214 0.735038 0.677999 -vn 0.003632 0.528489 0.848903 -vn -0.059053 0.925657 0.373669 -vn -0.039247 0.968932 0.244118 -vn -0.028871 0.982665 0.183111 -vn -0.024445 0.987640 0.154698 -vn -0.023835 0.988372 0.149968 -vn -0.026948 0.985260 0.168889 -vn -0.035463 0.974334 0.222266 -vn -0.055574 0.935575 0.348674 -vn -0.106479 0.735130 0.669454 -vn -0.129460 0.528703 0.838862 -vn -0.117008 0.925840 0.359325 -vn -0.076815 0.968688 0.236061 -vn -0.057253 0.982696 0.176061 -vn -0.048433 0.987671 0.148747 -vn -0.047090 0.988403 0.144169 -vn -0.053133 0.985290 0.162358 -vn -0.069948 0.974395 0.213630 -vn -0.109653 0.935728 0.335215 -vn -0.209632 0.736686 0.642903 -vn -0.259804 0.529191 0.807733 -vn -0.171728 0.925993 0.336161 -vn -0.112735 0.968749 0.220832 -vn -0.084078 0.982727 0.164708 -vn -0.071078 0.987701 0.139164 -vn -0.069033 0.988433 0.134831 -vn -0.077853 0.985321 0.151830 -vn -0.102451 0.974456 0.199805 -vn -0.160680 0.935850 0.313547 -vn -0.308634 0.735893 0.602649 -vn -0.386242 0.529679 0.755120 -vn -0.221900 0.926084 0.305063 -vn -0.145695 0.968810 0.200415 -vn -0.108646 0.982757 0.149480 -vn -0.091830 0.987732 0.126286 -vn -0.089145 0.988464 0.122318 -vn -0.100497 0.985351 0.137730 -vn -0.132267 0.974487 0.181249 -vn -0.207465 0.935942 0.284433 -vn -0.398633 0.736137 0.546922 -vn -0.496292 0.529923 0.687613 -vn -0.265969 0.926695 0.265450 -vn -0.174993 0.968810 0.175298 -vn -0.130497 0.982757 0.130741 -vn -0.110294 0.987732 0.110446 -vn -0.107028 0.988464 0.106967 -vn -0.120640 0.985351 0.120426 -vn -0.158757 0.974487 0.158452 -vn -0.249062 0.935972 0.248726 -vn -0.478652 0.736229 0.478317 -vn -0.597003 0.530076 0.602130 -vn -0.304788 0.926084 0.222266 -vn -0.200140 0.968810 0.146031 -vn -0.149266 0.982757 0.108921 -vn -0.126164 0.987732 0.092013 -vn -0.122379 0.988464 0.089084 -vn -0.137913 0.985351 0.100253 -vn -0.181494 0.974487 0.131932 -vn -0.283242 0.936491 0.206702 -vn -0.547197 0.736137 0.398297 -vn -0.683309 0.529954 0.502213 -vn -0.335948 0.925993 0.172155 -vn -0.220649 0.968749 0.113132 -vn -0.164556 0.982727 0.084384 -vn -0.139042 0.987701 0.071261 -vn -0.134892 0.988433 0.068941 -vn -0.151982 0.985321 0.077578 -vn -0.199988 0.974456 0.102084 -vn -0.313761 0.935850 0.160253 -vn -0.604205 0.734581 0.308664 -vn -0.753410 0.529649 0.389630 -vn -0.359172 0.925840 0.117466 -vn -0.235908 0.968688 0.077212 -vn -0.175939 0.982696 0.057588 -vn -0.148686 0.987671 0.048616 -vn -0.144200 0.988403 0.046999 -vn -0.161199 0.985443 0.053438 -vn -0.212348 0.974670 0.069826 -vn -0.335368 0.935728 0.109195 -vn -0.644124 0.735496 0.209998 -vn -0.805444 0.529221 0.266762 -vn -0.373577 0.925657 0.059511 -vn -0.245430 0.968596 0.039155 -vn -0.183050 0.982665 0.029206 -vn -0.154668 0.987640 0.024659 -vn -0.149968 0.988372 0.023743 -vn -0.168950 0.985260 0.026643 -vn -0.223792 0.973998 0.034730 -vn -0.350352 0.934965 0.054994 -vn -0.669546 0.735130 0.106052 -vn -0.837703 0.528733 0.136692 -vn -0.378460 0.925596 0.000214 -vn -0.248665 0.968566 0.000183 -vn -0.185461 0.982635 0.000153 -vn -0.156713 0.987610 0.000092 -vn -0.151952 0.988372 -0.000031 -vn -0.171148 0.985229 -0.000153 -vn -0.225196 0.974303 -0.000183 -vn -0.351817 0.936033 0.000336 -vn -0.677999 0.735038 -0.000214 -vn -0.848903 0.528489 0.003632 -vn -0.373669 0.925657 -0.059053 -vn -0.245491 0.968596 -0.038728 -vn -0.183111 0.982665 -0.028871 -vn -0.154698 0.987640 -0.024445 -vn -0.149968 0.988372 -0.023835 -vn -0.168889 0.985260 -0.026948 -vn -0.222266 0.974334 -0.035463 -vn -0.348674 0.935575 -0.055574 -vn -0.670797 0.733848 -0.106937 -vn -0.838862 0.528703 -0.129460 -vn -0.359325 0.925840 -0.117008 -vn -0.236061 0.968688 -0.076815 -vn -0.176061 0.982696 -0.057253 -vn -0.148747 0.987671 -0.048433 -vn -0.144169 0.988403 -0.047090 -vn -0.162358 0.985290 -0.053133 -vn -0.213630 0.974395 -0.069948 -vn -0.335215 0.935728 -0.109653 -vn -0.643971 0.735496 -0.210425 -vn -0.807733 0.529191 -0.259804 -vn -0.336161 0.925993 -0.171728 -vn -0.220832 0.968749 -0.112735 -vn -0.164708 0.982727 -0.084078 -vn -0.139164 0.987701 -0.071078 -vn -0.134831 0.988433 -0.069033 -vn -0.151830 0.985321 -0.077853 -vn -0.199805 0.974456 -0.102451 -vn -0.313547 0.935850 -0.160680 -vn -0.602649 0.735862 -0.308634 -vn -0.756737 0.529618 -0.383129 -vn -0.305063 0.926084 -0.221900 -vn -0.200415 0.968810 -0.145695 -vn -0.149480 0.982757 -0.108646 -vn -0.126286 0.987732 -0.091830 -vn -0.122318 0.988464 -0.089145 -vn -0.137730 0.985351 -0.100497 -vn -0.181249 0.974487 -0.132267 -vn -0.284433 0.935942 -0.207465 -vn -0.546922 0.736137 -0.398633 -vn -0.687613 0.529923 -0.496323 -vn -0.265450 0.926695 -0.265969 -vn -0.175298 0.968810 -0.174993 -vn -0.130741 0.982757 -0.130497 -vn -0.110446 0.987732 -0.110294 -vn -0.106967 0.988464 -0.107028 -vn -0.120426 0.985351 -0.120640 -vn -0.158452 0.974487 -0.158757 -vn -0.248115 0.936521 -0.247658 -vn -0.477737 0.737388 -0.477432 -vn -0.602161 0.530045 -0.597003 -vn -0.222266 0.926084 -0.304788 -vn -0.147282 0.968444 -0.200995 -vn -0.108921 0.982757 -0.149266 -vn -0.092013 0.987732 -0.126164 -vn -0.089084 0.988464 -0.122379 -vn -0.100253 0.985351 -0.137913 -vn -0.131932 0.974487 -0.181494 -vn -0.206702 0.936491 -0.283242 -vn -0.398938 0.734855 -0.548448 -vn -0.499374 0.529923 -0.685385 -vn -0.172155 0.925993 -0.335948 -vn -0.113132 0.968749 -0.220649 -vn -0.083102 0.982940 -0.163976 -vn -0.071261 0.987701 -0.139073 -vn -0.068941 0.988433 -0.134892 -vn -0.077578 0.985321 -0.151982 -vn -0.102084 0.974456 -0.199988 -vn -0.160253 0.935850 -0.313761 -vn -0.308664 0.734581 -0.604205 -vn -0.389630 0.529649 -0.753410 -vn -0.117466 0.925840 -0.359172 -vn -0.077212 0.968688 -0.235908 -vn -0.057588 0.982696 -0.175939 -vn -0.048616 0.987671 -0.148686 -vn -0.046999 0.988403 -0.144200 -vn -0.053438 0.985443 -0.161199 -vn -0.069521 0.974395 -0.213782 -vn -0.109195 0.935728 -0.335368 -vn -0.209998 0.735496 -0.644124 -vn -0.266762 0.529221 -0.805444 -vn -0.060152 0.925047 -0.375011 -vn -0.039155 0.968596 -0.245430 -vn -0.029206 0.982665 -0.183050 -vn -0.024659 0.987640 -0.154668 -vn -0.023743 0.988372 -0.149968 -vn -0.026643 0.985260 -0.168950 -vn -0.034730 0.973998 -0.223792 -vn -0.055086 0.935575 -0.348766 -vn -0.106052 0.735130 -0.669546 -vn -0.136692 0.528733 -0.837703 -vn -0.000214 0.925596 -0.378460 -vn 0.000488 0.968902 -0.247383 -vn -0.000153 0.982635 -0.185461 -vn -0.000092 0.987610 -0.156713 -vn 0.000031 0.988372 -0.151952 -vn 0.000153 0.985229 -0.171148 -vn 0.000183 0.974303 -0.225196 -vn 0.000214 0.935514 -0.353252 -vn 0.000214 0.735038 -0.677999 -vn -0.003632 0.528489 -0.848903 -vn 0.059053 0.925657 -0.373638 -vn 0.038728 0.968596 -0.245491 -vn 0.028871 0.982665 -0.183111 -vn 0.024445 0.987640 -0.154698 -vn 0.023835 0.988372 -0.149968 -vn 0.026948 0.985260 -0.168889 -vn 0.035463 0.974334 -0.222266 -vn 0.055574 0.935575 -0.348674 -vn 0.106479 0.735130 -0.669454 -vn 0.129460 0.528703 -0.838862 -vn 0.117008 0.925840 -0.359325 -vn 0.076815 0.968688 -0.236061 -vn 0.057253 0.982696 -0.176061 -vn 0.048433 0.987671 -0.148747 -vn 0.047090 0.988403 -0.144169 -vn 0.053133 0.985290 -0.162358 -vn 0.069948 0.974395 -0.213630 -vn 0.109653 0.935728 -0.335215 -vn 0.210425 0.735496 -0.643971 -vn 0.259804 0.529191 -0.807733 -vn 0.171667 0.926542 -0.334666 -vn 0.112735 0.968749 -0.220832 -vn 0.084078 0.982727 -0.164708 -vn 0.071078 0.987701 -0.139164 -vn 0.069033 0.988433 -0.134831 -vn 0.077853 0.985321 -0.151830 -vn 0.102451 0.974456 -0.199805 -vn 0.160680 0.935850 -0.313547 -vn 0.308634 0.735862 -0.602649 -vn 0.383129 0.529618 -0.756737 -vn 0.221900 0.926084 -0.305063 -vn 0.145695 0.968810 -0.200415 -vn 0.108646 0.982757 -0.149480 -vn 0.091830 0.987732 -0.126286 -vn 0.089145 0.988464 -0.122318 -vn 0.100497 0.985351 -0.137730 -vn 0.132267 0.974487 -0.181249 -vn 0.206153 0.936491 -0.283639 -vn 0.397534 0.737297 -0.546159 -vn 0.496323 0.529923 -0.687613 -vn 0.265969 0.926695 -0.265450 -vn 0.174993 0.968810 -0.175298 -vn 0.130497 0.982757 -0.130741 -vn 0.110294 0.987732 -0.110446 -vn 0.107028 0.988464 -0.106967 -vn 0.120640 0.985351 -0.120426 -vn 0.157353 0.974792 -0.158086 -vn 0.249062 0.936003 -0.248726 -vn 0.479781 0.734947 -0.479171 -vn 0.599475 0.530045 -0.599689 -vn 0.304788 0.926084 -0.222266 -vn 0.200140 0.968810 -0.146031 -vn 0.149785 0.982543 -0.110202 -vn 0.126164 0.987732 -0.092013 -vn 0.122379 0.988464 -0.089084 -vn 0.137913 0.985351 -0.100253 -vn 0.181494 0.974487 -0.131932 -vn 0.284738 0.935881 -0.207343 -vn 0.547197 0.736137 -0.398297 -vn 0.683309 0.529923 -0.502213 -vn 0.335948 0.925993 -0.172155 -vn 0.220649 0.968749 -0.113132 -vn 0.164556 0.982727 -0.084384 -vn 0.138981 0.987793 -0.069887 -vn 0.134892 0.988433 -0.068941 -vn 0.151982 0.985321 -0.077578 -vn 0.199988 0.974456 -0.102084 -vn 0.313761 0.935850 -0.160253 -vn 0.604205 0.734581 -0.308664 -vn 0.753410 0.529649 -0.389630 -vn 0.359172 0.925840 -0.117466 -vn 0.235908 0.968688 -0.077212 -vn 0.175939 0.982696 -0.057588 -vn 0.148686 0.987671 -0.048616 -vn 0.144200 0.988403 -0.046999 -vn 0.162450 0.985290 -0.052828 -vn 0.212348 0.974670 -0.069826 -vn 0.335368 0.935728 -0.109195 -vn 0.644124 0.735496 -0.209998 -vn 0.805444 0.529221 -0.266762 -vn 0.373577 0.925657 -0.059511 -vn 0.245430 0.968596 -0.039155 -vn 0.183050 0.982665 -0.029206 -vn 0.154668 0.987640 -0.024659 -vn 0.149968 0.988372 -0.023743 -vn 0.168950 0.985260 -0.026643 -vn 0.222327 0.974334 -0.035066 -vn 0.350352 0.934965 -0.054994 -vn 0.669546 0.735130 -0.106052 -vn 0.837703 0.528733 -0.136692 -usemtl m1 -s 1 -f 1/1/1 2/2/2 3/3/3 -f 4/4/4 1/1/1 3/3/3 -f 4/4/4 3/3/3 5/5/5 -f 5/5/5 6/6/6 4/4/4 -f 6/6/6 5/5/5 7/7/7 -f 7/7/7 8/8/8 6/6/6 -f 8/8/8 7/7/7 9/9/9 -f 9/9/9 10/10/10 8/8/8 -f 10/10/10 9/9/9 11/11/11 -f 11/11/11 12/12/12 10/10/10 -f 12/12/12 11/11/11 13/13/13 -f 13/13/13 14/14/14 12/12/12 -f 14/14/14 13/13/13 15/15/15 -f 15/15/15 16/16/16 14/14/14 -f 16/16/16 15/15/15 17/17/17 -f 17/17/17 18/18/18 16/16/16 -f 18/18/18 17/17/17 19/19/19 -f 19/19/19 20/20/20 18/18/18 -f 20/20/20 19/19/19 21/21/21 -f 21/21/21 22/22/22 20/20/20 -f 2/2/2 23/23/23 24/24/24 -f 24/24/24 3/3/3 2/2/2 -f 3/3/3 24/24/24 25/25/25 -f 25/25/25 5/5/5 3/3/3 -f 5/5/5 25/25/25 26/26/26 -f 26/26/26 7/7/7 5/5/5 -f 7/7/7 26/26/26 27/27/27 -f 27/27/27 9/9/9 7/7/7 -f 9/9/9 27/27/27 28/28/28 -f 28/28/28 11/11/11 9/9/9 -f 11/11/11 28/28/28 29/29/29 -f 29/29/29 13/13/13 11/11/11 -f 13/13/13 29/29/29 30/30/30 -f 30/30/30 15/15/15 13/13/13 -f 15/15/15 30/30/30 31/31/31 -f 31/31/31 17/17/17 15/15/15 -f 17/17/17 31/31/31 32/32/32 -f 32/32/32 19/19/19 17/17/17 -f 19/19/19 32/32/32 33/33/33 -f 33/33/33 21/21/21 19/19/19 -f 23/23/23 34/34/34 35/35/35 -f 35/35/35 24/24/24 23/23/23 -f 24/24/24 35/35/35 36/36/36 -f 36/36/36 25/25/25 24/24/24 -f 25/25/25 36/36/36 37/37/37 -f 37/37/37 26/26/26 25/25/25 -f 26/26/26 37/37/37 38/38/38 -f 38/38/38 27/27/27 26/26/26 -f 27/27/27 38/38/38 39/39/39 -f 39/39/39 28/28/28 27/27/27 -f 28/28/28 39/39/39 40/40/40 -f 40/40/40 29/29/29 28/28/28 -f 29/29/29 40/40/40 41/41/41 -f 41/41/41 30/30/30 29/29/29 -f 30/30/30 41/41/41 42/42/42 -f 42/42/42 31/31/31 30/30/30 -f 31/31/31 42/42/42 43/43/43 -f 43/43/43 32/32/32 31/31/31 -f 32/32/32 43/43/43 44/44/44 -f 44/44/44 33/33/33 32/32/32 -f 34/34/34 45/45/45 46/46/46 -f 46/46/46 35/35/35 34/34/34 -f 35/35/35 46/46/46 47/47/47 -f 47/47/47 36/36/36 35/35/35 -f 36/36/36 47/47/47 48/48/48 -f 48/48/48 37/37/37 36/36/36 -f 37/37/37 48/48/48 49/49/49 -f 49/49/49 38/38/38 37/37/37 -f 38/38/38 49/49/49 50/50/50 -f 50/50/50 39/39/39 38/38/38 -f 39/39/39 50/50/50 51/51/51 -f 51/51/51 40/40/40 39/39/39 -f 40/40/40 51/51/51 52/52/52 -f 52/52/52 41/41/41 40/40/40 -f 41/41/41 52/52/52 53/53/53 -f 53/53/53 42/42/42 41/41/41 -f 42/42/42 53/53/53 54/54/54 -f 54/54/54 43/43/43 42/42/42 -f 43/43/43 54/54/54 55/55/55 -f 55/55/55 44/44/44 43/43/43 -f 45/45/45 56/56/56 57/57/57 -f 57/57/57 46/46/46 45/45/45 -f 46/46/46 57/57/57 58/58/58 -f 58/58/58 47/47/47 46/46/46 -f 47/47/47 58/58/58 59/59/59 -f 59/59/59 48/48/48 47/47/47 -f 48/48/48 59/59/59 60/60/60 -f 60/60/60 49/49/49 48/48/48 -f 49/49/49 60/60/60 61/61/61 -f 61/61/61 50/50/50 49/49/49 -f 50/50/50 61/61/61 62/62/62 -f 62/62/62 51/51/51 50/50/50 -f 51/51/51 62/62/62 63/63/63 -f 63/63/63 52/52/52 51/51/51 -f 52/52/52 63/63/63 64/64/64 -f 64/64/64 53/53/53 52/52/52 -f 53/53/53 64/64/64 65/65/65 -f 65/65/65 54/54/54 53/53/53 -f 54/54/54 65/65/65 66/66/66 -f 66/66/66 55/55/55 54/54/54 -f 56/56/56 67/67/67 68/68/68 -f 68/68/68 57/57/57 56/56/56 -f 57/57/57 68/68/68 69/69/69 -f 69/69/69 58/58/58 57/57/57 -f 58/58/58 69/69/69 70/70/70 -f 70/70/70 59/59/59 58/58/58 -f 59/59/59 70/70/70 71/71/71 -f 71/71/71 60/60/60 59/59/59 -f 60/60/60 71/71/71 72/72/72 -f 72/72/72 61/61/61 60/60/60 -f 61/61/61 72/72/72 73/73/73 -f 73/73/73 62/62/62 61/61/61 -f 62/62/62 73/73/73 74/74/74 -f 74/74/74 63/63/63 62/62/62 -f 63/63/63 74/74/74 75/75/75 -f 75/75/75 64/64/64 63/63/63 -f 64/64/64 75/75/75 76/76/76 -f 76/76/76 65/65/65 64/64/64 -f 65/65/65 76/76/76 77/77/77 -f 77/77/77 66/66/66 65/65/65 -f 67/67/67 78/78/78 79/79/79 -f 79/79/79 68/68/68 67/67/67 -f 68/68/68 79/79/79 80/80/80 -f 80/80/80 69/69/69 68/68/68 -f 69/69/69 80/80/80 81/81/81 -f 81/81/81 70/70/70 69/69/69 -f 70/70/70 81/81/81 82/82/82 -f 82/82/82 71/71/71 70/70/70 -f 71/71/71 82/82/82 83/83/83 -f 83/83/83 72/72/72 71/71/71 -f 72/72/72 83/83/83 84/84/84 -f 84/84/84 73/73/73 72/72/72 -f 73/73/73 84/84/84 85/85/85 -f 85/85/85 74/74/74 73/73/73 -f 74/74/74 85/85/85 86/86/86 -f 86/86/86 75/75/75 74/74/74 -f 75/75/75 86/86/86 87/87/87 -f 87/87/87 76/76/76 75/75/75 -f 76/76/76 87/87/87 88/88/88 -f 88/88/88 77/77/77 76/76/76 -f 78/78/78 89/89/89 90/90/90 -f 90/90/90 79/79/79 78/78/78 -f 79/79/79 90/90/90 91/91/91 -f 91/91/91 80/80/80 79/79/79 -f 80/80/80 91/91/91 92/92/92 -f 92/92/92 81/81/81 80/80/80 -f 81/81/81 92/92/92 93/93/93 -f 93/93/93 82/82/82 81/81/81 -f 82/82/82 93/93/93 94/94/94 -f 94/94/94 83/83/83 82/82/82 -f 83/83/83 94/94/94 95/95/95 -f 95/95/95 84/84/84 83/83/83 -f 84/84/84 95/95/95 96/96/96 -f 96/96/96 85/85/85 84/84/84 -f 85/85/85 96/96/96 97/97/97 -f 97/97/97 86/86/86 85/85/85 -f 86/86/86 97/97/97 98/98/98 -f 98/98/98 87/87/87 86/86/86 -f 87/87/87 98/98/98 99/99/99 -f 99/99/99 88/88/88 87/87/87 -f 89/89/89 100/100/100 101/101/101 -f 101/101/101 90/90/90 89/89/89 -f 90/90/90 101/101/101 102/102/102 -f 102/102/102 91/91/91 90/90/90 -f 91/91/91 102/102/102 103/103/103 -f 103/103/103 92/92/92 91/91/91 -f 92/92/92 103/103/103 104/104/104 -f 104/104/104 93/93/93 92/92/92 -f 93/93/93 104/104/104 105/105/105 -f 105/105/105 94/94/94 93/93/93 -f 94/94/94 105/105/105 106/106/106 -f 106/106/106 95/95/95 94/94/94 -f 95/95/95 106/106/106 107/107/107 -f 107/107/107 96/96/96 95/95/95 -f 96/96/96 107/107/107 108/108/108 -f 108/108/108 97/97/97 96/96/96 -f 97/97/97 108/108/108 109/109/109 -f 109/109/109 98/98/98 97/97/97 -f 98/98/98 109/109/109 110/110/110 -f 110/110/110 99/99/99 98/98/98 -f 100/100/100 111/111/111 112/112/112 -f 112/112/112 101/101/101 100/100/100 -f 101/101/101 112/112/112 113/113/113 -f 113/113/113 102/102/102 101/101/101 -f 102/102/102 113/113/113 114/114/114 -f 114/114/114 103/103/103 102/102/102 -f 103/103/103 114/114/114 115/115/115 -f 115/115/115 104/104/104 103/103/103 -f 104/104/104 115/115/115 116/116/116 -f 116/116/116 105/105/105 104/104/104 -f 105/105/105 116/116/116 117/117/117 -f 117/117/117 106/106/106 105/105/105 -f 106/106/106 117/117/117 118/118/118 -f 118/118/118 107/107/107 106/106/106 -f 107/107/107 118/118/118 119/119/119 -f 119/119/119 108/108/108 107/107/107 -f 108/108/108 119/119/119 120/120/120 -f 120/120/120 109/109/109 108/108/108 -f 109/109/109 120/120/120 121/121/121 -f 121/121/121 110/110/110 109/109/109 -f 111/111/111 122/122/122 123/123/123 -f 123/123/123 112/112/112 111/111/111 -f 112/112/112 123/123/123 124/124/124 -f 124/124/124 113/113/113 112/112/112 -f 113/113/113 124/124/124 125/125/125 -f 125/125/125 114/114/114 113/113/113 -f 114/114/114 125/125/125 126/126/126 -f 126/126/126 115/115/115 114/114/114 -f 115/115/115 126/126/126 127/127/127 -f 127/127/127 116/116/116 115/115/115 -f 116/116/116 127/127/127 128/128/128 -f 128/128/128 117/117/117 116/116/116 -f 117/117/117 128/128/128 129/129/129 -f 129/129/129 118/118/118 117/117/117 -f 118/118/118 129/129/129 130/130/130 -f 130/130/130 119/119/119 118/118/118 -f 119/119/119 130/130/130 131/131/131 -f 131/131/131 120/120/120 119/119/119 -f 120/120/120 131/131/131 132/132/132 -f 132/132/132 121/121/121 120/120/120 -f 122/122/122 133/133/133 134/134/134 -f 134/134/134 123/123/123 122/122/122 -f 123/123/123 134/134/134 135/135/135 -f 135/135/135 124/124/124 123/123/123 -f 124/124/124 135/135/135 136/136/136 -f 136/136/136 125/125/125 124/124/124 -f 125/125/125 136/136/136 137/137/137 -f 137/137/137 126/126/126 125/125/125 -f 126/126/126 137/137/137 138/138/138 -f 138/138/138 127/127/127 126/126/126 -f 127/127/127 138/138/138 139/139/139 -f 139/139/139 128/128/128 127/127/127 -f 128/128/128 139/139/139 140/140/140 -f 140/140/140 129/129/129 128/128/128 -f 129/129/129 140/140/140 141/141/141 -f 141/141/141 130/130/130 129/129/129 -f 130/130/130 141/141/141 142/142/142 -f 142/142/142 131/131/131 130/130/130 -f 131/131/131 142/142/142 143/143/143 -f 143/143/143 132/132/132 131/131/131 -f 133/133/133 144/144/144 145/145/145 -f 145/145/145 134/134/134 133/133/133 -f 134/134/134 145/145/145 146/146/146 -f 146/146/146 135/135/135 134/134/134 -f 135/135/135 146/146/146 147/147/147 -f 147/147/147 136/136/136 135/135/135 -f 136/136/136 147/147/147 148/148/148 -f 148/148/148 137/137/137 136/136/136 -f 137/137/137 148/148/148 149/149/149 -f 149/149/149 138/138/138 137/137/137 -f 138/138/138 149/149/149 150/150/150 -f 150/150/150 139/139/139 138/138/138 -f 139/139/139 150/150/150 151/151/151 -f 151/151/151 140/140/140 139/139/139 -f 140/140/140 151/151/151 152/152/152 -f 152/152/152 141/141/141 140/140/140 -f 141/141/141 152/152/152 153/153/153 -f 153/153/153 142/142/142 141/141/141 -f 142/142/142 153/153/153 154/154/154 -f 154/154/154 143/143/143 142/142/142 -f 144/144/144 155/155/155 156/156/156 -f 156/156/156 145/145/145 144/144/144 -f 145/145/145 156/156/156 157/157/157 -f 157/157/157 146/146/146 145/145/145 -f 146/146/146 157/157/157 158/158/158 -f 158/158/158 147/147/147 146/146/146 -f 147/147/147 158/158/158 159/159/159 -f 159/159/159 148/148/148 147/147/147 -f 148/148/148 159/159/159 160/160/160 -f 160/160/160 149/149/149 148/148/148 -f 149/149/149 160/160/160 161/161/161 -f 161/161/161 150/150/150 149/149/149 -f 150/150/150 161/161/161 162/162/162 -f 162/162/162 151/151/151 150/150/150 -f 151/151/151 162/162/162 163/163/163 -f 163/163/163 152/152/152 151/151/151 -f 152/152/152 163/163/163 164/164/164 -f 164/164/164 153/153/153 152/152/152 -f 153/153/153 164/164/164 165/165/165 -f 165/165/165 154/154/154 153/153/153 -f 155/155/155 166/166/166 167/167/167 -f 167/167/167 156/156/156 155/155/155 -f 156/156/156 167/167/167 168/168/168 -f 168/168/168 157/157/157 156/156/156 -f 157/157/157 168/168/168 169/169/169 -f 169/169/169 158/158/158 157/157/157 -f 158/158/158 169/169/169 170/170/170 -f 170/170/170 159/159/159 158/158/158 -f 159/159/159 170/170/170 171/171/171 -f 171/171/171 160/160/160 159/159/159 -f 160/160/160 171/171/171 172/172/172 -f 172/172/172 161/161/161 160/160/160 -f 161/161/161 172/172/172 173/173/173 -f 173/173/173 162/162/162 161/161/161 -f 162/162/162 173/173/173 174/174/174 -f 174/174/174 163/163/163 162/162/162 -f 163/163/163 174/174/174 175/175/175 -f 175/175/175 164/164/164 163/163/163 -f 164/164/164 175/175/175 176/176/176 -f 176/176/176 165/165/165 164/164/164 -f 166/166/166 177/177/177 178/178/178 -f 178/178/178 167/167/167 166/166/166 -f 167/167/167 178/178/178 179/179/179 -f 179/179/179 168/168/168 167/167/167 -f 168/168/168 179/179/179 180/180/180 -f 180/180/180 169/169/169 168/168/168 -f 169/169/169 180/180/180 181/181/181 -f 181/181/181 170/170/170 169/169/169 -f 170/170/170 181/181/181 182/182/182 -f 182/182/182 171/171/171 170/170/170 -f 171/171/171 182/182/182 183/183/183 -f 183/183/183 172/172/172 171/171/171 -f 172/172/172 183/183/183 184/184/184 -f 184/184/184 173/173/173 172/172/172 -f 173/173/173 184/184/184 185/185/185 -f 185/185/185 174/174/174 173/173/173 -f 174/174/174 185/185/185 186/186/186 -f 186/186/186 175/175/175 174/174/174 -f 175/175/175 186/186/186 187/187/187 -f 187/187/187 176/176/176 175/175/175 -f 177/177/177 188/188/188 189/189/189 -f 189/189/189 178/178/178 177/177/177 -f 178/178/178 189/189/189 190/190/190 -f 190/190/190 179/179/179 178/178/178 -f 179/179/179 190/190/190 191/191/191 -f 191/191/191 180/180/180 179/179/179 -f 180/180/180 191/191/191 192/192/192 -f 192/192/192 181/181/181 180/180/180 -f 181/181/181 192/192/192 193/193/193 -f 193/193/193 182/182/182 181/181/181 -f 182/182/182 193/193/193 194/194/194 -f 194/194/194 183/183/183 182/182/182 -f 183/183/183 194/194/194 195/195/195 -f 195/195/195 184/184/184 183/183/183 -f 184/184/184 195/195/195 196/196/196 -f 196/196/196 185/185/185 184/184/184 -f 185/185/185 196/196/196 197/197/197 -f 197/197/197 186/186/186 185/185/185 -f 186/186/186 197/197/197 198/198/198 -f 198/198/198 187/187/187 186/186/186 -f 188/188/188 199/199/199 200/200/200 -f 200/200/200 189/189/189 188/188/188 -f 189/189/189 200/200/200 201/201/201 -f 201/201/201 190/190/190 189/189/189 -f 190/190/190 201/201/201 202/202/202 -f 202/202/202 191/191/191 190/190/190 -f 191/191/191 202/202/202 203/203/203 -f 203/203/203 192/192/192 191/191/191 -f 192/192/192 203/203/203 204/204/204 -f 204/204/204 193/193/193 192/192/192 -f 193/193/193 204/204/204 205/205/205 -f 205/205/205 194/194/194 193/193/193 -f 194/194/194 205/205/205 206/206/206 -f 206/206/206 195/195/195 194/194/194 -f 195/195/195 206/206/206 207/207/207 -f 207/207/207 196/196/196 195/195/195 -f 196/196/196 207/207/207 208/208/208 -f 208/208/208 197/197/197 196/196/196 -f 197/197/197 208/208/208 209/209/209 -f 209/209/209 198/198/198 197/197/197 -f 199/199/199 210/210/210 211/211/211 -f 211/211/211 200/200/200 199/199/199 -f 200/200/200 211/211/211 212/212/212 -f 212/212/212 201/201/201 200/200/200 -f 201/201/201 212/212/212 213/213/213 -f 213/213/213 202/202/202 201/201/201 -f 202/202/202 213/213/213 214/214/214 -f 214/214/214 203/203/203 202/202/202 -f 203/203/203 214/214/214 215/215/215 -f 215/215/215 204/204/204 203/203/203 -f 204/204/204 215/215/215 216/216/216 -f 216/216/216 205/205/205 204/204/204 -f 205/205/205 216/216/216 217/217/217 -f 217/217/217 206/206/206 205/205/205 -f 206/206/206 217/217/217 218/218/218 -f 218/218/218 207/207/207 206/206/206 -f 207/207/207 218/218/218 219/219/219 -f 219/219/219 208/208/208 207/207/207 -f 208/208/208 219/219/219 220/220/220 -f 220/220/220 209/209/209 208/208/208 -f 210/210/210 221/221/221 222/222/222 -f 222/222/222 211/211/211 210/210/210 -f 211/211/211 222/222/222 223/223/223 -f 223/223/223 212/212/212 211/211/211 -f 212/212/212 223/223/223 224/224/224 -f 224/224/224 213/213/213 212/212/212 -f 213/213/213 224/224/224 225/225/225 -f 225/225/225 214/214/214 213/213/213 -f 214/214/214 225/225/225 226/226/226 -f 226/226/226 215/215/215 214/214/214 -f 215/215/215 226/226/226 227/227/227 -f 227/227/227 216/216/216 215/215/215 -f 216/216/216 227/227/227 228/228/228 -f 228/228/228 217/217/217 216/216/216 -f 217/217/217 228/228/228 229/229/229 -f 229/229/229 218/218/218 217/217/217 -f 218/218/218 229/229/229 230/230/230 -f 230/230/230 219/219/219 218/218/218 -f 219/219/219 230/230/230 231/231/231 -f 231/231/231 220/220/220 219/219/219 -f 221/221/221 232/232/232 233/233/233 -f 233/233/233 222/222/222 221/221/221 -f 222/222/222 233/233/233 234/234/234 -f 234/234/234 223/223/223 222/222/222 -f 223/223/223 234/234/234 235/235/235 -f 235/235/235 224/224/224 223/223/223 -f 224/224/224 235/235/235 236/236/236 -f 236/236/236 225/225/225 224/224/224 -f 225/225/225 236/236/236 237/237/237 -f 237/237/237 226/226/226 225/225/225 -f 226/226/226 237/237/237 238/238/238 -f 238/238/238 227/227/227 226/226/226 -f 227/227/227 238/238/238 239/239/239 -f 239/239/239 228/228/228 227/227/227 -f 228/228/228 239/239/239 240/240/240 -f 240/240/240 229/229/229 228/228/228 -f 229/229/229 240/240/240 241/241/241 -f 241/241/241 230/230/230 229/229/229 -f 230/230/230 241/241/241 242/242/242 -f 242/242/242 231/231/231 230/230/230 -f 232/232/232 243/243/243 244/244/244 -f 244/244/244 233/233/233 232/232/232 -f 233/233/233 244/244/244 245/245/245 -f 245/245/245 234/234/234 233/233/233 -f 234/234/234 245/245/245 246/246/246 -f 246/246/246 235/235/235 234/234/234 -f 235/235/235 246/246/246 247/247/247 -f 247/247/247 236/236/236 235/235/235 -f 236/236/236 247/247/247 248/248/248 -f 248/248/248 237/237/237 236/236/236 -f 237/237/237 248/248/248 249/249/249 -f 249/249/249 238/238/238 237/237/237 -f 238/238/238 249/249/249 250/250/250 -f 250/250/250 239/239/239 238/238/238 -f 239/239/239 250/250/250 251/251/251 -f 251/251/251 240/240/240 239/239/239 -f 240/240/240 251/251/251 252/252/252 -f 252/252/252 241/241/241 240/240/240 -f 241/241/241 252/252/252 253/253/253 -f 253/253/253 242/242/242 241/241/241 -f 243/243/243 254/254/254 255/255/255 -f 255/255/255 244/244/244 243/243/243 -f 244/244/244 255/255/255 256/256/256 -f 256/256/256 245/245/245 244/244/244 -f 245/245/245 256/256/256 257/257/257 -f 257/257/257 246/246/246 245/245/245 -f 246/246/246 257/257/257 258/258/258 -f 258/258/258 247/247/247 246/246/246 -f 247/247/247 258/258/258 259/259/259 -f 259/259/259 248/248/248 247/247/247 -f 248/248/248 259/259/259 260/260/260 -f 260/260/260 249/249/249 248/248/248 -f 249/249/249 260/260/260 261/261/261 -f 261/261/261 250/250/250 249/249/249 -f 250/250/250 261/261/261 262/262/262 -f 262/262/262 251/251/251 250/250/250 -f 251/251/251 262/262/262 263/263/263 -f 263/263/263 252/252/252 251/251/251 -f 252/252/252 263/263/263 264/264/264 -f 264/264/264 253/253/253 252/252/252 -f 254/254/254 265/265/265 266/266/266 -f 266/266/266 255/255/255 254/254/254 -f 255/255/255 266/266/266 267/267/267 -f 267/267/267 256/256/256 255/255/255 -f 256/256/256 267/267/267 268/268/268 -f 268/268/268 257/257/257 256/256/256 -f 257/257/257 268/268/268 269/269/269 -f 269/269/269 258/258/258 257/257/257 -f 258/258/258 269/269/269 270/270/270 -f 270/270/270 259/259/259 258/258/258 -f 259/259/259 270/270/270 271/271/271 -f 271/271/271 260/260/260 259/259/259 -f 260/260/260 271/271/271 272/272/272 -f 272/272/272 261/261/261 260/260/260 -f 261/261/261 272/272/272 273/273/273 -f 273/273/273 262/262/262 261/261/261 -f 262/262/262 273/273/273 274/274/274 -f 274/274/274 263/263/263 262/262/262 -f 263/263/263 274/274/274 275/275/275 -f 275/275/275 264/264/264 263/263/263 -f 265/265/265 276/276/276 277/277/277 -f 277/277/277 266/266/266 265/265/265 -f 266/266/266 277/277/277 278/278/278 -f 278/278/278 267/267/267 266/266/266 -f 267/267/267 278/278/278 279/279/279 -f 279/279/279 268/268/268 267/267/267 -f 268/268/268 279/279/279 280/280/280 -f 280/280/280 269/269/269 268/268/268 -f 269/269/269 280/280/280 281/281/281 -f 281/281/281 270/270/270 269/269/269 -f 270/270/270 281/281/281 282/282/282 -f 282/282/282 271/271/271 270/270/270 -f 271/271/271 282/282/282 283/283/283 -f 283/283/283 272/272/272 271/271/271 -f 272/272/272 283/283/283 284/284/284 -f 284/284/284 273/273/273 272/272/272 -f 273/273/273 284/284/284 285/285/285 -f 285/285/285 274/274/274 273/273/273 -f 274/274/274 285/285/285 286/286/286 -f 286/286/286 275/275/275 274/274/274 -f 276/276/276 287/287/287 288/288/288 -f 288/288/288 277/277/277 276/276/276 -f 277/277/277 288/288/288 289/289/289 -f 289/289/289 278/278/278 277/277/277 -f 278/278/278 289/289/289 290/290/290 -f 290/290/290 279/279/279 278/278/278 -f 279/279/279 290/290/290 291/291/291 -f 291/291/291 280/280/280 279/279/279 -f 280/280/280 291/291/291 292/292/292 -f 292/292/292 281/281/281 280/280/280 -f 281/281/281 292/292/292 293/293/293 -f 293/293/293 282/282/282 281/281/281 -f 282/282/282 293/293/293 294/294/294 -f 294/294/294 283/283/283 282/282/282 -f 283/283/283 294/294/294 295/295/295 -f 295/295/295 284/284/284 283/283/283 -f 284/284/284 295/295/295 296/296/296 -f 296/296/296 285/285/285 284/284/284 -f 285/285/285 296/296/296 297/297/297 -f 297/297/297 286/286/286 285/285/285 -f 287/287/287 298/298/298 299/299/299 -f 299/299/299 288/288/288 287/287/287 -f 288/288/288 299/299/299 300/300/300 -f 300/300/300 289/289/289 288/288/288 -f 289/289/289 300/300/300 301/301/301 -f 301/301/301 290/290/290 289/289/289 -f 290/290/290 301/301/301 302/302/302 -f 302/302/302 291/291/291 290/290/290 -f 291/291/291 302/302/302 303/303/303 -f 303/303/303 292/292/292 291/291/291 -f 292/292/292 303/303/303 304/304/304 -f 304/304/304 293/293/293 292/292/292 -f 293/293/293 304/304/304 305/305/305 -f 305/305/305 294/294/294 293/293/293 -f 294/294/294 305/305/305 306/306/306 -f 306/306/306 295/295/295 294/294/294 -f 295/295/295 306/306/306 307/307/307 -f 307/307/307 296/296/296 295/295/295 -f 296/296/296 307/307/307 308/308/308 -f 308/308/308 297/297/297 296/296/296 -f 298/298/298 309/309/309 310/310/310 -f 310/310/310 299/299/299 298/298/298 -f 299/299/299 310/310/310 311/311/311 -f 311/311/311 300/300/300 299/299/299 -f 300/300/300 311/311/311 312/312/312 -f 312/312/312 301/301/301 300/300/300 -f 301/301/301 312/312/312 313/313/313 -f 313/313/313 302/302/302 301/301/301 -f 302/302/302 313/313/313 314/314/314 -f 314/314/314 303/303/303 302/302/302 -f 303/303/303 314/314/314 315/315/315 -f 315/315/315 304/304/304 303/303/303 -f 304/304/304 315/315/315 316/316/316 -f 316/316/316 305/305/305 304/304/304 -f 305/305/305 316/316/316 317/317/317 -f 317/317/317 306/306/306 305/305/305 -f 306/306/306 317/317/317 318/318/318 -f 318/318/318 307/307/307 306/306/306 -f 307/307/307 318/318/318 319/319/319 -f 319/319/319 308/308/308 307/307/307 -f 309/309/309 320/320/320 321/321/321 -f 321/321/321 310/310/310 309/309/309 -f 310/310/310 321/321/321 322/322/322 -f 322/322/322 311/311/311 310/310/310 -f 311/311/311 322/322/322 323/323/323 -f 323/323/323 312/312/312 311/311/311 -f 312/312/312 323/323/323 324/324/324 -f 324/324/324 313/313/313 312/312/312 -f 313/313/313 324/324/324 325/325/325 -f 325/325/325 314/314/314 313/313/313 -f 314/314/314 325/325/325 326/326/326 -f 326/326/326 315/315/315 314/314/314 -f 315/315/315 326/326/326 327/327/327 -f 327/327/327 316/316/316 315/315/315 -f 316/316/316 327/327/327 328/328/328 -f 328/328/328 317/317/317 316/316/316 -f 317/317/317 328/328/328 329/329/329 -f 329/329/329 318/318/318 317/317/317 -f 318/318/318 329/329/329 330/330/330 -f 330/330/330 319/319/319 318/318/318 -f 320/320/320 331/331/331 332/332/332 -f 332/332/332 321/321/321 320/320/320 -f 321/321/321 332/332/332 333/333/333 -f 333/333/333 322/322/322 321/321/321 -f 322/322/322 333/333/333 334/334/334 -f 334/334/334 323/323/323 322/322/322 -f 323/323/323 334/334/334 335/335/335 -f 335/335/335 324/324/324 323/323/323 -f 324/324/324 335/335/335 336/336/336 -f 336/336/336 325/325/325 324/324/324 -f 325/325/325 336/336/336 337/337/337 -f 337/337/337 326/326/326 325/325/325 -f 326/326/326 337/337/337 338/338/338 -f 338/338/338 327/327/327 326/326/326 -f 327/327/327 338/338/338 339/339/339 -f 339/339/339 328/328/328 327/327/327 -f 328/328/328 339/339/339 340/340/340 -f 340/340/340 329/329/329 328/328/328 -f 329/329/329 340/340/340 341/341/341 -f 341/341/341 330/330/330 329/329/329 -f 331/331/331 342/342/342 343/343/343 -f 343/343/343 332/332/332 331/331/331 -f 332/332/332 343/343/343 344/344/344 -f 344/344/344 333/333/333 332/332/332 -f 333/333/333 344/344/344 345/345/345 -f 345/345/345 334/334/334 333/333/333 -f 334/334/334 345/345/345 346/346/346 -f 346/346/346 335/335/335 334/334/334 -f 335/335/335 346/346/346 347/347/347 -f 347/347/347 336/336/336 335/335/335 -f 336/336/336 347/347/347 348/348/348 -f 348/348/348 337/337/337 336/336/336 -f 337/337/337 348/348/348 349/349/349 -f 349/349/349 338/338/338 337/337/337 -f 338/338/338 349/349/349 350/350/350 -f 350/350/350 339/339/339 338/338/338 -f 339/339/339 350/350/350 351/351/351 -f 351/351/351 340/340/340 339/339/339 -f 340/340/340 351/351/351 352/352/352 -f 352/352/352 341/341/341 340/340/340 -f 342/342/342 353/353/353 354/354/354 -f 354/354/354 343/343/343 342/342/342 -f 343/343/343 354/354/354 355/355/355 -f 355/355/355 344/344/344 343/343/343 -f 344/344/344 355/355/355 356/356/356 -f 356/356/356 345/345/345 344/344/344 -f 345/345/345 356/356/356 357/357/357 -f 357/357/357 346/346/346 345/345/345 -f 346/346/346 357/357/357 358/358/358 -f 358/358/358 347/347/347 346/346/346 -f 347/347/347 358/358/358 359/359/359 -f 359/359/359 348/348/348 347/347/347 -f 348/348/348 359/359/359 360/360/360 -f 360/360/360 349/349/349 348/348/348 -f 349/349/349 360/360/360 361/361/361 -f 361/361/361 350/350/350 349/349/349 -f 350/350/350 361/361/361 362/362/362 -f 362/362/362 351/351/351 350/350/350 -f 351/351/351 362/362/362 363/363/363 -f 363/363/363 352/352/352 351/351/351 -f 353/353/353 364/364/364 365/365/365 -f 365/365/365 354/354/354 353/353/353 -f 354/354/354 365/365/365 366/366/366 -f 366/366/366 355/355/355 354/354/354 -f 355/355/355 366/366/366 367/367/367 -f 367/367/367 356/356/356 355/355/355 -f 356/356/356 367/367/367 368/368/368 -f 368/368/368 357/357/357 356/356/356 -f 357/357/357 368/368/368 369/369/369 -f 369/369/369 358/358/358 357/357/357 -f 358/358/358 369/369/369 370/370/370 -f 370/370/370 359/359/359 358/358/358 -f 359/359/359 370/370/370 371/371/371 -f 371/371/371 360/360/360 359/359/359 -f 360/360/360 371/371/371 372/372/372 -f 372/372/372 361/361/361 360/360/360 -f 361/361/361 372/372/372 373/373/373 -f 373/373/373 362/362/362 361/361/361 -f 362/362/362 373/373/373 374/374/374 -f 374/374/374 363/363/363 362/362/362 -f 364/364/364 375/375/375 376/376/376 -f 376/376/376 365/365/365 364/364/364 -f 365/365/365 376/376/376 377/377/377 -f 377/377/377 366/366/366 365/365/365 -f 366/366/366 377/377/377 378/378/378 -f 378/378/378 367/367/367 366/366/366 -f 367/367/367 378/378/378 379/379/379 -f 379/379/379 368/368/368 367/367/367 -f 368/368/368 379/379/379 380/380/380 -f 380/380/380 369/369/369 368/368/368 -f 369/369/369 380/380/380 381/381/381 -f 381/381/381 370/370/370 369/369/369 -f 370/370/370 381/381/381 382/382/382 -f 382/382/382 371/371/371 370/370/370 -f 371/371/371 382/382/382 383/383/383 -f 383/383/383 372/372/372 371/371/371 -f 372/372/372 383/383/383 384/384/384 -f 384/384/384 373/373/373 372/372/372 -f 373/373/373 384/384/384 385/385/385 -f 385/385/385 374/374/374 373/373/373 -f 375/375/375 386/386/386 387/387/387 -f 387/387/387 376/376/376 375/375/375 -f 376/376/376 387/387/387 388/388/388 -f 388/388/388 377/377/377 376/376/376 -f 377/377/377 388/388/388 389/389/389 -f 389/389/389 378/378/378 377/377/377 -f 378/378/378 389/389/389 390/390/390 -f 390/390/390 379/379/379 378/378/378 -f 379/379/379 390/390/390 391/391/391 -f 391/391/391 380/380/380 379/379/379 -f 380/380/380 391/391/391 392/392/392 -f 392/392/392 381/381/381 380/380/380 -f 381/381/381 392/392/392 393/393/393 -f 393/393/393 382/382/382 381/381/381 -f 382/382/382 393/393/393 394/394/394 -f 394/394/394 383/383/383 382/382/382 -f 383/383/383 394/394/394 395/395/395 -f 395/395/395 384/384/384 383/383/383 -f 384/384/384 395/395/395 396/396/396 -f 396/396/396 385/385/385 384/384/384 -f 386/386/386 397/397/397 398/398/398 -f 398/398/398 387/387/387 386/386/386 -f 387/387/387 398/398/398 399/399/399 -f 399/399/399 388/388/388 387/387/387 -f 388/388/388 399/399/399 400/400/400 -f 400/400/400 389/389/389 388/388/388 -f 389/389/389 400/400/400 401/401/401 -f 401/401/401 390/390/390 389/389/389 -f 390/390/390 401/401/401 402/402/402 -f 402/402/402 391/391/391 390/390/390 -f 391/391/391 402/402/402 403/403/403 -f 403/403/403 392/392/392 391/391/391 -f 392/392/392 403/403/403 404/404/404 -f 404/404/404 393/393/393 392/392/392 -f 393/393/393 404/404/404 405/405/405 -f 405/405/405 394/394/394 393/393/393 -f 394/394/394 405/405/405 406/406/406 -f 406/406/406 395/395/395 394/394/394 -f 395/395/395 406/406/406 407/407/407 -f 407/407/407 396/396/396 395/395/395 -f 397/397/397 408/408/408 409/409/409 -f 409/409/409 398/398/398 397/397/397 -f 398/398/398 409/409/409 410/410/410 -f 410/410/410 399/399/399 398/398/398 -f 399/399/399 410/410/410 411/411/411 -f 411/411/411 400/400/400 399/399/399 -f 400/400/400 411/411/411 412/412/412 -f 412/412/412 401/401/401 400/400/400 -f 401/401/401 412/412/412 413/413/413 -f 413/413/413 402/402/402 401/401/401 -f 402/402/402 413/413/413 414/414/414 -f 414/414/414 403/403/403 402/402/402 -f 403/403/403 414/414/414 415/415/415 -f 415/415/415 404/404/404 403/403/403 -f 404/404/404 415/415/415 416/416/416 -f 416/416/416 405/405/405 404/404/404 -f 405/405/405 416/416/416 417/417/417 -f 417/417/417 406/406/406 405/405/405 -f 406/406/406 417/417/417 418/418/418 -f 418/418/418 407/407/407 406/406/406 -f 408/408/408 419/419/419 420/420/420 -f 420/420/420 409/409/409 408/408/408 -f 409/409/409 420/420/420 421/421/421 -f 421/421/421 410/410/410 409/409/409 -f 410/410/410 421/421/421 422/422/422 -f 422/422/422 411/411/411 410/410/410 -f 411/411/411 422/422/422 423/423/423 -f 423/423/423 412/412/412 411/411/411 -f 412/412/412 423/423/423 424/424/424 -f 424/424/424 413/413/413 412/412/412 -f 413/413/413 424/424/424 425/425/425 -f 425/425/425 414/414/414 413/413/413 -f 414/414/414 425/425/425 426/426/426 -f 426/426/426 415/415/415 414/414/414 -f 415/415/415 426/426/426 427/427/427 -f 427/427/427 416/416/416 415/415/415 -f 416/416/416 427/427/427 428/428/428 -f 428/428/428 417/417/417 416/416/416 -f 417/417/417 428/428/428 429/429/429 -f 429/429/429 418/418/418 417/417/417 -f 419/419/419 430/430/430 431/431/431 -f 431/431/431 420/420/420 419/419/419 -f 420/420/420 431/431/431 432/432/432 -f 432/432/432 421/421/421 420/420/420 -f 421/421/421 432/432/432 433/433/433 -f 433/433/433 422/422/422 421/421/421 -f 422/422/422 433/433/433 434/434/434 -f 434/434/434 423/423/423 422/422/422 -f 423/423/423 434/434/434 435/435/435 -f 435/435/435 424/424/424 423/423/423 -f 424/424/424 435/435/435 436/436/436 -f 436/436/436 425/425/425 424/424/424 -f 425/425/425 436/436/436 437/437/437 -f 437/437/437 426/426/426 425/425/425 -f 426/426/426 437/437/437 438/438/438 -f 438/438/438 427/427/427 426/426/426 -f 427/427/427 438/438/438 439/439/439 -f 439/439/439 428/428/428 427/427/427 -f 428/428/428 439/439/439 440/440/440 -f 440/440/440 429/429/429 428/428/428 -f 430/430/430 1/1/1 4/4/4 -f 4/4/4 431/431/431 430/430/430 -f 431/431/431 4/4/4 6/6/6 -f 6/6/6 432/432/432 431/431/431 -f 432/432/432 6/6/6 8/8/8 -f 8/8/8 433/433/433 432/432/432 -f 433/433/433 8/8/8 10/10/10 -f 10/10/10 434/434/434 433/433/433 -f 434/434/434 10/10/10 12/12/12 -f 12/12/12 435/435/435 434/434/434 -f 435/435/435 12/12/12 14/14/14 -f 14/14/14 436/436/436 435/435/435 -f 436/436/436 14/14/14 16/16/16 -f 16/16/16 437/437/437 436/436/436 -f 437/437/437 16/16/16 18/18/18 -f 18/18/18 438/438/438 437/437/437 -f 438/438/438 18/18/18 20/20/20 -f 20/20/20 439/439/439 438/438/438 -f 439/439/439 20/20/20 22/22/22 -f 22/22/22 440/440/440 439/439/439 -f 22/22/22 21/21/21 441/441/441 -f 441/441/441 442/442/442 22/22/22 -f 442/442/442 441/441/441 443/443/443 -f 443/443/443 444/444/444 442/442/442 -f 444/444/444 443/443/443 445/445/445 -f 445/445/445 446/446/446 444/444/444 -f 446/446/446 445/445/445 447/447/447 -f 447/447/447 448/448/448 446/446/446 -f 448/448/448 447/447/447 449/449/449 -f 449/449/449 450/450/450 448/448/448 -f 450/450/450 449/449/449 451/451/451 -f 451/451/451 452/452/452 450/450/450 -f 452/452/452 451/451/451 453/453/453 -f 453/453/453 454/454/454 452/452/452 -f 454/454/454 453/453/453 455/455/455 -f 455/455/455 456/456/456 454/454/454 -f 456/456/456 455/455/455 457/457/457 -f 457/457/457 458/458/458 456/456/456 -f 458/458/458 457/457/457 459/459/459 -f 459/459/459 460/460/460 458/458/458 -f 21/21/21 33/33/33 461/461/461 -f 461/461/461 441/441/441 21/21/21 -f 441/441/441 461/461/461 462/462/462 -f 462/462/462 443/443/443 441/441/441 -f 443/443/443 462/462/462 463/463/463 -f 463/463/463 445/445/445 443/443/443 -f 445/445/445 463/463/463 464/464/464 -f 464/464/464 447/447/447 445/445/445 -f 447/447/447 464/464/464 465/465/465 -f 465/465/465 449/449/449 447/447/447 -f 449/449/449 465/465/465 466/466/466 -f 466/466/466 451/451/451 449/449/449 -f 451/451/451 466/466/466 467/467/467 -f 467/467/467 453/453/453 451/451/451 -f 453/453/453 467/467/467 468/468/468 -f 468/468/468 455/455/455 453/453/453 -f 455/455/455 468/468/468 469/469/469 -f 469/469/469 457/457/457 455/455/455 -f 457/457/457 469/469/469 470/470/470 -f 470/470/470 459/459/459 457/457/457 -f 33/33/33 44/44/44 471/471/471 -f 471/471/471 461/461/461 33/33/33 -f 461/461/461 471/471/471 472/472/472 -f 472/472/472 462/462/462 461/461/461 -f 462/462/462 472/472/472 473/473/473 -f 473/473/473 463/463/463 462/462/462 -f 463/463/463 473/473/473 474/474/474 -f 474/474/474 464/464/464 463/463/463 -f 464/464/464 474/474/474 475/475/475 -f 475/475/475 465/465/465 464/464/464 -f 465/465/465 475/475/475 476/476/476 -f 476/476/476 466/466/466 465/465/465 -f 466/466/466 476/476/476 477/477/477 -f 477/477/477 467/467/467 466/466/466 -f 467/467/467 477/477/477 478/478/478 -f 478/478/478 468/468/468 467/467/467 -f 468/468/468 478/478/478 479/479/479 -f 479/479/479 469/469/469 468/468/468 -f 469/469/469 479/479/479 480/480/480 -f 480/480/480 470/470/470 469/469/469 -f 44/44/44 55/55/55 481/481/481 -f 481/481/481 471/471/471 44/44/44 -f 471/471/471 481/481/481 482/482/482 -f 482/482/482 472/472/472 471/471/471 -f 472/472/472 482/482/482 483/483/483 -f 483/483/483 473/473/473 472/472/472 -f 473/473/473 483/483/483 484/484/484 -f 484/484/484 474/474/474 473/473/473 -f 474/474/474 484/484/484 485/485/485 -f 485/485/485 475/475/475 474/474/474 -f 475/475/475 485/485/485 486/486/486 -f 486/486/486 476/476/476 475/475/475 -f 476/476/476 486/486/486 487/487/487 -f 487/487/487 477/477/477 476/476/476 -f 477/477/477 487/487/487 488/488/488 -f 488/488/488 478/478/478 477/477/477 -f 478/478/478 488/488/488 489/489/489 -f 489/489/489 479/479/479 478/478/478 -f 479/479/479 489/489/489 490/490/490 -f 490/490/490 480/480/480 479/479/479 -f 55/55/55 66/66/66 491/491/491 -f 491/491/491 481/481/481 55/55/55 -f 481/481/481 491/491/491 492/492/492 -f 492/492/492 482/482/482 481/481/481 -f 482/482/482 492/492/492 493/493/493 -f 493/493/493 483/483/483 482/482/482 -f 483/483/483 493/493/493 494/494/494 -f 494/494/494 484/484/484 483/483/483 -f 484/484/484 494/494/494 495/495/495 -f 495/495/495 485/485/485 484/484/484 -f 485/485/485 495/495/495 496/496/496 -f 496/496/496 486/486/486 485/485/485 -f 486/486/486 496/496/496 497/497/497 -f 497/497/497 487/487/487 486/486/486 -f 487/487/487 497/497/497 498/498/498 -f 498/498/498 488/488/488 487/487/487 -f 488/488/488 498/498/498 499/499/499 -f 499/499/499 489/489/489 488/488/488 -f 489/489/489 499/499/499 500/500/500 -f 500/500/500 490/490/490 489/489/489 -f 66/66/66 77/77/77 501/501/501 -f 501/501/501 491/491/491 66/66/66 -f 491/491/491 501/501/501 502/502/502 -f 502/502/502 492/492/492 491/491/491 -f 492/492/492 502/502/502 503/503/503 -f 503/503/503 493/493/493 492/492/492 -f 493/493/493 503/503/503 504/504/504 -f 504/504/504 494/494/494 493/493/493 -f 494/494/494 504/504/504 505/505/505 -f 505/505/505 495/495/495 494/494/494 -f 495/495/495 505/505/505 506/506/506 -f 506/506/506 496/496/496 495/495/495 -f 496/496/496 506/506/506 507/507/507 -f 507/507/507 497/497/497 496/496/496 -f 497/497/497 507/507/507 508/508/508 -f 508/508/508 498/498/498 497/497/497 -f 498/498/498 508/508/508 509/509/509 -f 509/509/509 499/499/499 498/498/498 -f 499/499/499 509/509/509 510/510/510 -f 510/510/510 500/500/500 499/499/499 -f 77/77/77 88/88/88 511/511/511 -f 511/511/511 501/501/501 77/77/77 -f 501/501/501 511/511/511 512/512/512 -f 512/512/512 502/502/502 501/501/501 -f 502/502/502 512/512/512 513/513/513 -f 513/513/513 503/503/503 502/502/502 -f 503/503/503 513/513/513 514/514/514 -f 514/514/514 504/504/504 503/503/503 -f 504/504/504 514/514/514 515/515/515 -f 515/515/515 505/505/505 504/504/504 -f 505/505/505 515/515/515 516/516/516 -f 516/516/516 506/506/506 505/505/505 -f 506/506/506 516/516/516 517/517/517 -f 517/517/517 507/507/507 506/506/506 -f 507/507/507 517/517/517 518/518/518 -f 518/518/518 508/508/508 507/507/507 -f 508/508/508 518/518/518 519/519/519 -f 519/519/519 509/509/509 508/508/508 -f 509/509/509 519/519/519 520/520/520 -f 520/520/520 510/510/510 509/509/509 -f 88/88/88 99/99/99 521/521/521 -f 521/521/521 511/511/511 88/88/88 -f 511/511/511 521/521/521 522/522/522 -f 522/522/522 512/512/512 511/511/511 -f 512/512/512 522/522/522 523/523/523 -f 523/523/523 513/513/513 512/512/512 -f 513/513/513 523/523/523 524/524/524 -f 524/524/524 514/514/514 513/513/513 -f 514/514/514 524/524/524 525/525/525 -f 525/525/525 515/515/515 514/514/514 -f 515/515/515 525/525/525 526/526/526 -f 526/526/526 516/516/516 515/515/515 -f 516/516/516 526/526/526 527/527/527 -f 527/527/527 517/517/517 516/516/516 -f 517/517/517 527/527/527 528/528/528 -f 528/528/528 518/518/518 517/517/517 -f 518/518/518 528/528/528 529/529/529 -f 529/529/529 519/519/519 518/518/518 -f 519/519/519 529/529/529 530/530/530 -f 530/530/530 520/520/520 519/519/519 -f 99/99/99 110/110/110 531/531/531 -f 531/531/531 521/521/521 99/99/99 -f 521/521/521 531/531/531 532/532/532 -f 532/532/532 522/522/522 521/521/521 -f 522/522/522 532/532/532 533/533/533 -f 533/533/533 523/523/523 522/522/522 -f 523/523/523 533/533/533 534/534/534 -f 534/534/534 524/524/524 523/523/523 -f 524/524/524 534/534/534 535/535/535 -f 535/535/535 525/525/525 524/524/524 -f 525/525/525 535/535/535 536/536/536 -f 536/536/536 526/526/526 525/525/525 -f 526/526/526 536/536/536 537/537/537 -f 537/537/537 527/527/527 526/526/526 -f 527/527/527 537/537/537 538/538/538 -f 538/538/538 528/528/528 527/527/527 -f 528/528/528 538/538/538 539/539/539 -f 539/539/539 529/529/529 528/528/528 -f 529/529/529 539/539/539 540/540/540 -f 540/540/540 530/530/530 529/529/529 -f 110/110/110 121/121/121 541/541/541 -f 541/541/541 531/531/531 110/110/110 -f 531/531/531 541/541/541 542/542/542 -f 542/542/542 532/532/532 531/531/531 -f 532/532/532 542/542/542 543/543/543 -f 543/543/543 533/533/533 532/532/532 -f 533/533/533 543/543/543 544/544/544 -f 544/544/544 534/534/534 533/533/533 -f 534/534/534 544/544/544 545/545/545 -f 545/545/545 535/535/535 534/534/534 -f 535/535/535 545/545/545 546/546/546 -f 546/546/546 536/536/536 535/535/535 -f 536/536/536 546/546/546 547/547/547 -f 547/547/547 537/537/537 536/536/536 -f 537/537/537 547/547/547 548/548/548 -f 548/548/548 538/538/538 537/537/537 -f 538/538/538 548/548/548 549/549/549 -f 549/549/549 539/539/539 538/538/538 -f 539/539/539 549/549/549 550/550/550 -f 550/550/550 540/540/540 539/539/539 -f 121/121/121 132/132/132 551/551/551 -f 551/551/551 541/541/541 121/121/121 -f 541/541/541 551/551/551 552/552/552 -f 552/552/552 542/542/542 541/541/541 -f 542/542/542 552/552/552 553/553/553 -f 553/553/553 543/543/543 542/542/542 -f 543/543/543 553/553/553 554/554/554 -f 554/554/554 544/544/544 543/543/543 -f 544/544/544 554/554/554 555/555/555 -f 555/555/555 545/545/545 544/544/544 -f 545/545/545 555/555/555 556/556/556 -f 556/556/556 546/546/546 545/545/545 -f 546/546/546 556/556/556 557/557/557 -f 557/557/557 547/547/547 546/546/546 -f 547/547/547 557/557/557 558/558/558 -f 558/558/558 548/548/548 547/547/547 -f 548/548/548 558/558/558 559/559/559 -f 559/559/559 549/549/549 548/548/548 -f 549/549/549 559/559/559 560/560/560 -f 560/560/560 550/550/550 549/549/549 -f 132/132/132 143/143/143 561/561/561 -f 561/561/561 551/551/551 132/132/132 -f 551/551/551 561/561/561 562/562/562 -f 562/562/562 552/552/552 551/551/551 -f 552/552/552 562/562/562 563/563/563 -f 563/563/563 553/553/553 552/552/552 -f 553/553/553 563/563/563 564/564/564 -f 564/564/564 554/554/554 553/553/553 -f 554/554/554 564/564/564 565/565/565 -f 565/565/565 555/555/555 554/554/554 -f 555/555/555 565/565/565 566/566/566 -f 566/566/566 556/556/556 555/555/555 -f 556/556/556 566/566/566 567/567/567 -f 567/567/567 557/557/557 556/556/556 -f 557/557/557 567/567/567 568/568/568 -f 568/568/568 558/558/558 557/557/557 -f 558/558/558 568/568/568 569/569/569 -f 569/569/569 559/559/559 558/558/558 -f 559/559/559 569/569/569 570/570/570 -f 570/570/570 560/560/560 559/559/559 -f 143/143/143 154/154/154 571/571/571 -f 571/571/571 561/561/561 143/143/143 -f 561/561/561 571/571/571 572/572/572 -f 572/572/572 562/562/562 561/561/561 -f 562/562/562 572/572/572 573/573/573 -f 573/573/573 563/563/563 562/562/562 -f 563/563/563 573/573/573 574/574/574 -f 574/574/574 564/564/564 563/563/563 -f 564/564/564 574/574/574 575/575/575 -f 575/575/575 565/565/565 564/564/564 -f 565/565/565 575/575/575 576/576/576 -f 576/576/576 566/566/566 565/565/565 -f 566/566/566 576/576/576 577/577/577 -f 577/577/577 567/567/567 566/566/566 -f 567/567/567 577/577/577 578/578/578 -f 578/578/578 568/568/568 567/567/567 -f 568/568/568 578/578/578 579/579/579 -f 579/579/579 569/569/569 568/568/568 -f 569/569/569 579/579/579 580/580/580 -f 580/580/580 570/570/570 569/569/569 -f 154/154/154 165/165/165 581/581/581 -f 581/581/581 571/571/571 154/154/154 -f 571/571/571 581/581/581 582/582/582 -f 582/582/582 572/572/572 571/571/571 -f 572/572/572 582/582/582 583/583/583 -f 583/583/583 573/573/573 572/572/572 -f 573/573/573 583/583/583 584/584/584 -f 584/584/584 574/574/574 573/573/573 -f 574/574/574 584/584/584 585/585/585 -f 585/585/585 575/575/575 574/574/574 -f 575/575/575 585/585/585 586/586/586 -f 586/586/586 576/576/576 575/575/575 -f 576/576/576 586/586/586 587/587/587 -f 587/587/587 577/577/577 576/576/576 -f 577/577/577 587/587/587 588/588/588 -f 588/588/588 578/578/578 577/577/577 -f 578/578/578 588/588/588 589/589/589 -f 589/589/589 579/579/579 578/578/578 -f 579/579/579 589/589/589 590/590/590 -f 590/590/590 580/580/580 579/579/579 -f 165/165/165 176/176/176 591/591/591 -f 591/591/591 581/581/581 165/165/165 -f 581/581/581 591/591/591 592/592/592 -f 592/592/592 582/582/582 581/581/581 -f 582/582/582 592/592/592 593/593/593 -f 593/593/593 583/583/583 582/582/582 -f 583/583/583 593/593/593 594/594/594 -f 594/594/594 584/584/584 583/583/583 -f 584/584/584 594/594/594 595/595/595 -f 595/595/595 585/585/585 584/584/584 -f 585/585/585 595/595/595 596/596/596 -f 596/596/596 586/586/586 585/585/585 -f 586/586/586 596/596/596 597/597/597 -f 597/597/597 587/587/587 586/586/586 -f 587/587/587 597/597/597 598/598/598 -f 598/598/598 588/588/588 587/587/587 -f 588/588/588 598/598/598 599/599/599 -f 599/599/599 589/589/589 588/588/588 -f 589/589/589 599/599/599 600/600/600 -f 600/600/600 590/590/590 589/589/589 -f 176/176/176 187/187/187 601/601/601 -f 601/601/601 591/591/591 176/176/176 -f 591/591/591 601/601/601 602/602/602 -f 602/602/602 592/592/592 591/591/591 -f 592/592/592 602/602/602 603/603/603 -f 603/603/603 593/593/593 592/592/592 -f 593/593/593 603/603/603 604/604/604 -f 604/604/604 594/594/594 593/593/593 -f 594/594/594 604/604/604 605/605/605 -f 605/605/605 595/595/595 594/594/594 -f 595/595/595 605/605/605 606/606/606 -f 606/606/606 596/596/596 595/595/595 -f 596/596/596 606/606/606 607/607/607 -f 607/607/607 597/597/597 596/596/596 -f 597/597/597 607/607/607 608/608/608 -f 608/608/608 598/598/598 597/597/597 -f 598/598/598 608/608/608 609/609/609 -f 609/609/609 599/599/599 598/598/598 -f 599/599/599 609/609/609 610/610/610 -f 610/610/610 600/600/600 599/599/599 -f 187/187/187 198/198/198 611/611/611 -f 611/611/611 601/601/601 187/187/187 -f 601/601/601 611/611/611 612/612/612 -f 612/612/612 602/602/602 601/601/601 -f 602/602/602 612/612/612 613/613/613 -f 613/613/613 603/603/603 602/602/602 -f 603/603/603 613/613/613 614/614/614 -f 614/614/614 604/604/604 603/603/603 -f 604/604/604 614/614/614 615/615/615 -f 615/615/615 605/605/605 604/604/604 -f 605/605/605 615/615/615 616/616/616 -f 616/616/616 606/606/606 605/605/605 -f 606/606/606 616/616/616 617/617/617 -f 617/617/617 607/607/607 606/606/606 -f 607/607/607 617/617/617 618/618/618 -f 618/618/618 608/608/608 607/607/607 -f 608/608/608 618/618/618 619/619/619 -f 619/619/619 609/609/609 608/608/608 -f 609/609/609 619/619/619 620/620/620 -f 620/620/620 610/610/610 609/609/609 -f 198/198/198 209/209/209 621/621/621 -f 621/621/621 611/611/611 198/198/198 -f 611/611/611 621/621/621 622/622/622 -f 622/622/622 612/612/612 611/611/611 -f 612/612/612 622/622/622 623/623/623 -f 623/623/623 613/613/613 612/612/612 -f 613/613/613 623/623/623 624/624/624 -f 624/624/624 614/614/614 613/613/613 -f 614/614/614 624/624/624 625/625/625 -f 625/625/625 615/615/615 614/614/614 -f 615/615/615 625/625/625 626/626/626 -f 626/626/626 616/616/616 615/615/615 -f 616/616/616 626/626/626 627/627/627 -f 627/627/627 617/617/617 616/616/616 -f 617/617/617 627/627/627 628/628/628 -f 628/628/628 618/618/618 617/617/617 -f 618/618/618 628/628/628 629/629/629 -f 629/629/629 619/619/619 618/618/618 -f 619/619/619 629/629/629 630/630/630 -f 630/630/630 620/620/620 619/619/619 -f 209/209/209 220/220/220 631/631/631 -f 631/631/631 621/621/621 209/209/209 -f 621/621/621 631/631/631 632/632/632 -f 632/632/632 622/622/622 621/621/621 -f 622/622/622 632/632/632 633/633/633 -f 633/633/633 623/623/623 622/622/622 -f 623/623/623 633/633/633 634/634/634 -f 634/634/634 624/624/624 623/623/623 -f 624/624/624 634/634/634 635/635/635 -f 635/635/635 625/625/625 624/624/624 -f 625/625/625 635/635/635 636/636/636 -f 636/636/636 626/626/626 625/625/625 -f 626/626/626 636/636/636 637/637/637 -f 637/637/637 627/627/627 626/626/626 -f 627/627/627 637/637/637 638/638/638 -f 638/638/638 628/628/628 627/627/627 -f 628/628/628 638/638/638 639/639/639 -f 639/639/639 629/629/629 628/628/628 -f 629/629/629 639/639/639 640/640/640 -f 640/640/640 630/630/630 629/629/629 -f 220/220/220 231/231/231 641/641/641 -f 641/641/641 631/631/631 220/220/220 -f 631/631/631 641/641/641 642/642/642 -f 642/642/642 632/632/632 631/631/631 -f 632/632/632 642/642/642 643/643/643 -f 643/643/643 633/633/633 632/632/632 -f 633/633/633 643/643/643 644/644/644 -f 644/644/644 634/634/634 633/633/633 -f 634/634/634 644/644/644 645/645/645 -f 645/645/645 635/635/635 634/634/634 -f 635/635/635 645/645/645 646/646/646 -f 646/646/646 636/636/636 635/635/635 -f 636/636/636 646/646/646 647/647/647 -f 647/647/647 637/637/637 636/636/636 -f 637/637/637 647/647/647 648/648/648 -f 648/648/648 638/638/638 637/637/637 -f 638/638/638 648/648/648 649/649/649 -f 649/649/649 639/639/639 638/638/638 -f 639/639/639 649/649/649 1840/650/650 -f 1840/650/650 640/640/640 639/639/639 -f 231/231/231 242/242/242 650/651/651 -f 650/651/651 641/641/641 231/231/231 -f 641/641/641 650/651/651 651/652/652 -f 651/652/652 642/642/642 641/641/641 -f 642/642/642 651/652/652 652/653/653 -f 652/653/653 643/643/643 642/642/642 -f 643/643/643 652/653/653 653/654/654 -f 653/654/654 644/644/644 643/643/643 -f 644/644/644 653/654/654 654/655/655 -f 654/655/655 645/645/645 644/644/644 -f 645/645/645 654/655/655 655/656/656 -f 655/656/656 646/646/646 645/645/645 -f 646/646/646 655/656/656 656/657/657 -f 656/657/657 647/647/647 646/646/646 -f 647/647/647 656/657/657 657/658/658 -f 657/658/658 648/648/648 647/647/647 -f 648/648/648 657/658/658 658/659/659 -f 658/659/659 649/649/649 648/648/648 -f 649/649/649 658/659/659 659/660/660 -f 659/660/660 1840/650/650 649/649/649 -f 242/242/242 253/253/253 660/661/661 -f 660/661/661 650/651/651 242/242/242 -f 650/651/651 660/661/661 661/662/662 -f 661/662/662 651/652/652 650/651/651 -f 651/652/652 661/662/662 662/663/663 -f 662/663/663 652/653/653 651/652/652 -f 652/653/653 662/663/663 663/664/664 -f 663/664/664 653/654/654 652/653/653 -f 653/654/654 663/664/664 664/665/665 -f 664/665/665 654/655/655 653/654/654 -f 654/655/655 664/665/665 665/666/666 -f 665/666/666 655/656/656 654/655/655 -f 655/656/656 665/666/666 666/667/667 -f 666/667/667 656/657/657 655/656/656 -f 656/657/657 666/667/667 667/668/668 -f 667/668/668 657/658/658 656/657/657 -f 657/658/658 667/668/668 668/669/669 -f 668/669/669 658/659/659 657/658/658 -f 658/659/659 668/669/669 669/670/670 -f 669/670/670 659/660/660 658/659/659 -f 253/253/253 264/264/264 670/671/671 -f 670/671/671 660/661/661 253/253/253 -f 660/661/661 670/671/671 671/672/672 -f 671/672/672 661/662/662 660/661/661 -f 661/662/662 671/672/672 672/673/673 -f 672/673/673 662/663/663 661/662/662 -f 662/663/663 672/673/673 673/674/674 -f 673/674/674 663/664/664 662/663/663 -f 663/664/664 673/674/674 674/675/675 -f 674/675/675 664/665/665 663/664/664 -f 664/665/665 674/675/675 675/676/676 -f 675/676/676 665/666/666 664/665/665 -f 665/666/666 675/676/676 676/677/677 -f 676/677/677 666/667/667 665/666/666 -f 666/667/667 676/677/677 677/678/678 -f 677/678/678 667/668/668 666/667/667 -f 667/668/668 677/678/678 678/679/679 -f 678/679/679 668/669/669 667/668/668 -f 668/669/669 678/679/679 679/680/680 -f 679/680/680 669/670/670 668/669/669 -f 264/264/264 275/275/275 680/681/681 -f 680/681/681 670/671/671 264/264/264 -f 670/671/671 680/681/681 681/682/682 -f 681/682/682 671/672/672 670/671/671 -f 671/672/672 681/682/682 682/683/683 -f 682/683/683 672/673/673 671/672/672 -f 672/673/673 682/683/683 683/684/684 -f 683/684/684 673/674/674 672/673/673 -f 673/674/674 683/684/684 684/685/685 -f 684/685/685 674/675/675 673/674/674 -f 674/675/675 684/685/685 685/686/686 -f 685/686/686 675/676/676 674/675/675 -f 675/676/676 685/686/686 686/687/687 -f 686/687/687 676/677/677 675/676/676 -f 676/677/677 686/687/687 687/688/688 -f 687/688/688 677/678/678 676/677/677 -f 677/678/678 687/688/688 688/689/689 -f 688/689/689 678/679/679 677/678/678 -f 678/679/679 688/689/689 689/690/690 -f 689/690/690 679/680/680 678/679/679 -f 275/275/275 286/286/286 690/691/691 -f 690/691/691 680/681/681 275/275/275 -f 680/681/681 690/691/691 691/692/692 -f 691/692/692 681/682/682 680/681/681 -f 681/682/682 691/692/692 692/693/693 -f 692/693/693 682/683/683 681/682/682 -f 682/683/683 692/693/693 693/694/694 -f 693/694/694 683/684/684 682/683/683 -f 683/684/684 693/694/694 694/695/695 -f 694/695/695 684/685/685 683/684/684 -f 684/685/685 694/695/695 695/696/696 -f 695/696/696 685/686/686 684/685/685 -f 685/686/686 695/696/696 696/697/697 -f 696/697/697 686/687/687 685/686/686 -f 686/687/687 696/697/697 697/698/698 -f 697/698/698 687/688/688 686/687/687 -f 687/688/688 697/698/698 698/699/699 -f 698/699/699 688/689/689 687/688/688 -f 688/689/689 698/699/699 699/700/700 -f 699/700/700 689/690/690 688/689/689 -f 286/286/286 297/297/297 700/701/701 -f 700/701/701 690/691/691 286/286/286 -f 690/691/691 700/701/701 701/702/702 -f 701/702/702 691/692/692 690/691/691 -f 691/692/692 701/702/702 702/703/703 -f 702/703/703 692/693/693 691/692/692 -f 692/693/693 702/703/703 703/704/704 -f 703/704/704 693/694/694 692/693/693 -f 693/694/694 703/704/704 704/705/705 -f 704/705/705 694/695/695 693/694/694 -f 694/695/695 704/705/705 705/706/706 -f 705/706/706 695/696/696 694/695/695 -f 695/696/696 705/706/706 706/707/707 -f 706/707/707 696/697/697 695/696/696 -f 696/697/697 706/707/707 707/708/708 -f 707/708/708 697/698/698 696/697/697 -f 697/698/698 707/708/708 708/709/709 -f 708/709/709 698/699/699 697/698/698 -f 698/699/699 708/709/709 709/710/710 -f 709/710/710 699/700/700 698/699/699 -f 297/297/297 308/308/308 710/711/711 -f 710/711/711 700/701/701 297/297/297 -f 700/701/701 710/711/711 711/712/712 -f 711/712/712 701/702/702 700/701/701 -f 701/702/702 711/712/712 712/713/713 -f 712/713/713 702/703/703 701/702/702 -f 702/703/703 712/713/713 713/714/714 -f 713/714/714 703/704/704 702/703/703 -f 703/704/704 713/714/714 714/715/715 -f 714/715/715 704/705/705 703/704/704 -f 704/705/705 714/715/715 715/716/716 -f 715/716/716 705/706/706 704/705/705 -f 705/706/706 715/716/716 716/717/717 -f 716/717/717 706/707/707 705/706/706 -f 706/707/707 716/717/717 717/718/718 -f 717/718/718 707/708/708 706/707/707 -f 707/708/708 717/718/718 718/719/719 -f 718/719/719 708/709/709 707/708/708 -f 708/709/709 718/719/719 719/720/720 -f 719/720/720 709/710/710 708/709/709 -f 308/308/308 319/319/319 720/721/721 -f 720/721/721 710/711/711 308/308/308 -f 710/711/711 720/721/721 721/722/722 -f 721/722/722 711/712/712 710/711/711 -f 711/712/712 721/722/722 722/723/723 -f 722/723/723 712/713/713 711/712/712 -f 712/713/713 722/723/723 723/724/724 -f 723/724/724 713/714/714 712/713/713 -f 713/714/714 723/724/724 724/725/725 -f 724/725/725 714/715/715 713/714/714 -f 714/715/715 724/725/725 725/726/726 -f 725/726/726 715/716/716 714/715/715 -f 715/716/716 725/726/726 726/727/727 -f 726/727/727 716/717/717 715/716/716 -f 716/717/717 726/727/727 727/728/728 -f 727/728/728 717/718/718 716/717/717 -f 717/718/718 727/728/728 728/729/729 -f 728/729/729 718/719/719 717/718/718 -f 718/719/719 728/729/729 729/730/730 -f 729/730/730 719/720/720 718/719/719 -f 319/319/319 330/330/330 730/731/731 -f 730/731/731 720/721/721 319/319/319 -f 720/721/721 730/731/731 731/732/732 -f 731/732/732 721/722/722 720/721/721 -f 721/722/722 731/732/732 732/733/733 -f 732/733/733 722/723/723 721/722/722 -f 722/723/723 732/733/733 733/734/734 -f 733/734/734 723/724/724 722/723/723 -f 723/724/724 733/734/734 734/735/735 -f 734/735/735 724/725/725 723/724/724 -f 724/725/725 734/735/735 735/736/736 -f 735/736/736 725/726/726 724/725/725 -f 725/726/726 735/736/736 736/737/737 -f 736/737/737 726/727/727 725/726/726 -f 726/727/727 736/737/737 737/738/738 -f 737/738/738 727/728/728 726/727/727 -f 727/728/728 737/738/738 738/739/739 -f 738/739/739 728/729/729 727/728/728 -f 728/729/729 738/739/739 739/740/740 -f 739/740/740 729/730/730 728/729/729 -f 330/330/330 341/341/341 740/741/741 -f 740/741/741 730/731/731 330/330/330 -f 730/731/731 740/741/741 741/742/742 -f 741/742/742 731/732/732 730/731/731 -f 731/732/732 741/742/742 742/743/743 -f 742/743/743 732/733/733 731/732/732 -f 732/733/733 742/743/743 743/744/744 -f 743/744/744 733/734/734 732/733/733 -f 733/734/734 743/744/744 744/745/745 -f 744/745/745 734/735/735 733/734/734 -f 734/735/735 744/745/745 745/746/746 -f 745/746/746 735/736/736 734/735/735 -f 735/736/736 745/746/746 746/747/747 -f 746/747/747 736/737/737 735/736/736 -f 736/737/737 746/747/747 747/748/748 -f 747/748/748 737/738/738 736/737/737 -f 737/738/738 747/748/748 748/749/749 -f 748/749/749 738/739/739 737/738/738 -f 738/739/739 748/749/749 749/750/750 -f 749/750/750 739/740/740 738/739/739 -f 341/341/341 352/352/352 750/751/751 -f 750/751/751 740/741/741 341/341/341 -f 740/741/741 750/751/751 751/752/752 -f 751/752/752 741/742/742 740/741/741 -f 741/742/742 751/752/752 752/753/753 -f 752/753/753 742/743/743 741/742/742 -f 742/743/743 752/753/753 753/754/754 -f 753/754/754 743/744/744 742/743/743 -f 743/744/744 753/754/754 754/755/755 -f 754/755/755 744/745/745 743/744/744 -f 744/745/745 754/755/755 755/756/756 -f 755/756/756 745/746/746 744/745/745 -f 745/746/746 755/756/756 756/757/757 -f 756/757/757 746/747/747 745/746/746 -f 746/747/747 756/757/757 757/758/758 -f 757/758/758 747/748/748 746/747/747 -f 747/748/748 757/758/758 758/759/759 -f 758/759/759 748/749/749 747/748/748 -f 748/749/749 758/759/759 759/760/760 -f 759/760/760 749/750/750 748/749/749 -f 352/352/352 363/363/363 760/761/761 -f 760/761/761 750/751/751 352/352/352 -f 750/751/751 760/761/761 761/762/762 -f 761/762/762 751/752/752 750/751/751 -f 751/752/752 761/762/762 762/763/763 -f 762/763/763 752/753/753 751/752/752 -f 752/753/753 762/763/763 763/764/764 -f 763/764/764 753/754/754 752/753/753 -f 753/754/754 763/764/764 764/765/765 -f 764/765/765 754/755/755 753/754/754 -f 754/755/755 764/765/765 765/766/766 -f 765/766/766 755/756/756 754/755/755 -f 755/756/756 765/766/766 766/767/767 -f 766/767/767 756/757/757 755/756/756 -f 756/757/757 766/767/767 767/768/768 -f 767/768/768 757/758/758 756/757/757 -f 757/758/758 767/768/768 768/769/769 -f 768/769/769 758/759/759 757/758/758 -f 758/759/759 768/769/769 769/770/770 -f 769/770/770 759/760/760 758/759/759 -f 363/363/363 374/374/374 770/771/771 -f 770/771/771 760/761/761 363/363/363 -f 760/761/761 770/771/771 771/772/772 -f 771/772/772 761/762/762 760/761/761 -f 761/762/762 771/772/772 772/773/773 -f 772/773/773 762/763/763 761/762/762 -f 762/763/763 772/773/773 773/774/774 -f 773/774/774 763/764/764 762/763/763 -f 763/764/764 773/774/774 774/775/775 -f 774/775/775 764/765/765 763/764/764 -f 764/765/765 774/775/775 775/776/776 -f 775/776/776 765/766/766 764/765/765 -f 765/766/766 775/776/776 776/777/777 -f 776/777/777 766/767/767 765/766/766 -f 766/767/767 776/777/777 777/778/778 -f 777/778/778 767/768/768 766/767/767 -f 767/768/768 777/778/778 778/779/779 -f 778/779/779 768/769/769 767/768/768 -f 768/769/769 778/779/779 779/780/780 -f 779/780/780 769/770/770 768/769/769 -f 374/374/374 385/385/385 780/781/781 -f 780/781/781 770/771/771 374/374/374 -f 770/771/771 780/781/781 781/782/782 -f 781/782/782 771/772/772 770/771/771 -f 771/772/772 781/782/782 782/783/783 -f 782/783/783 772/773/773 771/772/772 -f 772/773/773 782/783/783 783/784/784 -f 783/784/784 773/774/774 772/773/773 -f 773/774/774 783/784/784 784/785/785 -f 784/785/785 774/775/775 773/774/774 -f 774/775/775 784/785/785 785/786/786 -f 785/786/786 775/776/776 774/775/775 -f 775/776/776 785/786/786 786/787/787 -f 786/787/787 776/777/777 775/776/776 -f 776/777/777 786/787/787 787/788/788 -f 787/788/788 777/778/778 776/777/777 -f 777/778/778 787/788/788 788/789/789 -f 788/789/789 778/779/779 777/778/778 -f 778/779/779 788/789/789 789/790/790 -f 789/790/790 779/780/780 778/779/779 -f 385/385/385 396/396/396 790/791/791 -f 790/791/791 780/781/781 385/385/385 -f 780/781/781 790/791/791 791/792/792 -f 791/792/792 781/782/782 780/781/781 -f 781/782/782 791/792/792 792/793/793 -f 792/793/793 782/783/783 781/782/782 -f 782/783/783 792/793/793 793/794/794 -f 793/794/794 783/784/784 782/783/783 -f 783/784/784 793/794/794 794/795/795 -f 794/795/795 784/785/785 783/784/784 -f 784/785/785 794/795/795 795/796/796 -f 795/796/796 785/786/786 784/785/785 -f 785/786/786 795/796/796 796/797/797 -f 796/797/797 786/787/787 785/786/786 -f 786/787/787 796/797/797 797/798/798 -f 797/798/798 787/788/788 786/787/787 -f 787/788/788 797/798/798 798/799/799 -f 798/799/799 788/789/789 787/788/788 -f 788/789/789 798/799/799 799/800/800 -f 799/800/800 789/790/790 788/789/789 -f 396/396/396 407/407/407 800/801/801 -f 800/801/801 790/791/791 396/396/396 -f 790/791/791 800/801/801 801/802/802 -f 801/802/802 791/792/792 790/791/791 -f 791/792/792 801/802/802 802/803/803 -f 802/803/803 792/793/793 791/792/792 -f 792/793/793 802/803/803 803/804/804 -f 803/804/804 793/794/794 792/793/793 -f 793/794/794 803/804/804 804/805/805 -f 804/805/805 794/795/795 793/794/794 -f 794/795/795 804/805/805 805/806/806 -f 805/806/806 795/796/796 794/795/795 -f 795/796/796 805/806/806 806/807/807 -f 806/807/807 796/797/797 795/796/796 -f 796/797/797 806/807/807 807/808/808 -f 807/808/808 797/798/798 796/797/797 -f 797/798/798 807/808/808 808/809/809 -f 808/809/809 798/799/799 797/798/798 -f 798/799/799 808/809/809 809/810/810 -f 809/810/810 799/800/800 798/799/799 -f 407/407/407 418/418/418 810/811/811 -f 810/811/811 800/801/801 407/407/407 -f 800/801/801 810/811/811 811/812/812 -f 811/812/812 801/802/802 800/801/801 -f 801/802/802 811/812/812 812/813/813 -f 812/813/813 802/803/803 801/802/802 -f 802/803/803 812/813/813 813/814/814 -f 813/814/814 803/804/804 802/803/803 -f 803/804/804 813/814/814 814/815/815 -f 814/815/815 804/805/805 803/804/804 -f 804/805/805 814/815/815 815/816/816 -f 815/816/816 805/806/806 804/805/805 -f 805/806/806 815/816/816 816/817/817 -f 816/817/817 806/807/807 805/806/806 -f 806/807/807 816/817/817 817/818/818 -f 817/818/818 807/808/808 806/807/807 -f 807/808/808 817/818/818 818/819/819 -f 818/819/819 808/809/809 807/808/808 -f 808/809/809 818/819/819 819/820/820 -f 819/820/820 809/810/810 808/809/809 -f 418/418/418 429/429/429 820/821/821 -f 820/821/821 810/811/811 418/418/418 -f 810/811/811 820/821/821 821/822/822 -f 821/822/822 811/812/812 810/811/811 -f 811/812/812 821/822/822 822/823/823 -f 822/823/823 812/813/813 811/812/812 -f 812/813/813 822/823/823 823/824/824 -f 823/824/824 813/814/814 812/813/813 -f 813/814/814 823/824/824 824/825/825 -f 824/825/825 814/815/815 813/814/814 -f 814/815/815 824/825/825 825/826/826 -f 825/826/826 815/816/816 814/815/815 -f 815/816/816 825/826/826 826/827/827 -f 826/827/827 816/817/817 815/816/816 -f 816/817/817 826/827/827 827/828/828 -f 827/828/828 817/818/818 816/817/817 -f 817/818/818 827/828/828 828/829/829 -f 828/829/829 818/819/819 817/818/818 -f 818/819/819 828/829/829 829/830/830 -f 829/830/830 819/820/820 818/819/819 -f 429/429/429 440/440/440 830/831/831 -f 830/831/831 820/821/821 429/429/429 -f 820/821/821 830/831/831 831/832/832 -f 831/832/832 821/822/822 820/821/821 -f 821/822/822 831/832/832 832/833/833 -f 832/833/833 822/823/823 821/822/822 -f 822/823/823 832/833/833 833/834/834 -f 833/834/834 823/824/824 822/823/823 -f 823/824/824 833/834/834 834/835/835 -f 834/835/835 824/825/825 823/824/824 -f 824/825/825 834/835/835 835/836/836 -f 835/836/836 825/826/826 824/825/825 -f 825/826/826 835/836/836 836/837/837 -f 836/837/837 826/827/827 825/826/826 -f 826/827/827 836/837/837 837/838/838 -f 837/838/838 827/828/828 826/827/827 -f 827/828/828 837/838/838 838/839/839 -f 838/839/839 828/829/829 827/828/828 -f 828/829/829 838/839/839 839/840/840 -f 839/840/840 829/830/830 828/829/829 -f 440/440/440 22/22/22 442/442/442 -f 442/442/442 830/831/831 440/440/440 -f 830/831/831 442/442/442 444/444/444 -f 444/444/444 831/832/832 830/831/831 -f 831/832/832 444/444/444 446/446/446 -f 446/446/446 832/833/833 831/832/832 -f 832/833/833 446/446/446 448/448/448 -f 448/448/448 833/834/834 832/833/833 -f 833/834/834 448/448/448 450/450/450 -f 450/450/450 834/835/835 833/834/834 -f 834/835/835 450/450/450 452/452/452 -f 452/452/452 835/836/836 834/835/835 -f 835/836/836 452/452/452 454/454/454 -f 454/454/454 836/837/837 835/836/836 -f 836/837/837 454/454/454 456/456/456 -f 456/456/456 837/838/838 836/837/837 -f 837/838/838 456/456/456 458/458/458 -f 458/458/458 838/839/839 837/838/838 -f 838/839/839 458/458/458 460/460/460 -f 460/460/460 839/840/840 838/839/839 -f 460/460/460 459/459/459 840/841/841 -f 840/841/841 841/842/842 460/460/460 -f 841/842/842 840/841/841 842/843/843 -f 842/843/843 843/844/844 841/842/842 -f 843/844/844 842/843/843 844/845/845 -f 844/845/845 845/846/846 843/844/844 -f 845/846/846 844/845/845 846/847/847 -f 846/847/847 847/848/848 845/846/846 -f 847/848/848 846/847/847 848/849/849 -f 848/849/849 849/850/850 847/848/848 -f 849/850/850 848/849/849 850/851/851 -f 850/851/851 851/852/852 849/850/850 -f 851/852/852 850/851/851 852/853/853 -f 852/853/853 853/854/854 851/852/852 -f 853/854/854 852/853/853 854/855/855 -f 854/855/855 855/856/856 853/854/854 -f 855/856/856 854/855/855 856/857/857 -f 856/857/857 857/858/858 855/856/856 -f 857/858/858 856/857/857 858/21/859 -f 858/21/859 859/22/860 857/858/858 -f 459/459/459 470/470/470 860/859/861 -f 860/859/861 840/841/841 459/459/459 -f 840/841/841 860/859/861 861/860/862 -f 861/860/862 842/843/843 840/841/841 -f 842/843/843 861/860/862 862/861/863 -f 862/861/863 844/845/845 842/843/843 -f 844/845/845 862/861/863 863/862/864 -f 863/862/864 846/847/847 844/845/845 -f 846/847/847 863/862/864 864/863/865 -f 864/863/865 848/849/849 846/847/847 -f 848/849/849 864/863/865 865/864/866 -f 865/864/866 850/851/851 848/849/849 -f 850/851/851 865/864/866 866/865/867 -f 866/865/867 852/853/853 850/851/851 -f 852/853/853 866/865/867 867/866/868 -f 867/866/868 854/855/855 852/853/853 -f 854/855/855 867/866/868 868/867/869 -f 868/867/869 856/857/857 854/855/855 -f 856/857/857 868/867/869 869/33/870 -f 869/33/870 858/21/859 856/857/857 -f 470/470/470 480/480/480 870/868/871 -f 870/868/871 860/859/861 470/470/470 -f 860/859/861 870/868/871 871/869/872 -f 871/869/872 861/860/862 860/859/861 -f 861/860/862 871/869/872 872/870/873 -f 872/870/873 862/861/863 861/860/862 -f 862/861/863 872/870/873 873/871/874 -f 873/871/874 863/862/864 862/861/863 -f 863/862/864 873/871/874 874/872/875 -f 874/872/875 864/863/865 863/862/864 -f 864/863/865 874/872/875 875/873/876 -f 875/873/876 865/864/866 864/863/865 -f 865/864/866 875/873/876 876/874/877 -f 876/874/877 866/865/867 865/864/866 -f 866/865/867 876/874/877 877/875/878 -f 877/875/878 867/866/868 866/865/867 -f 867/866/868 877/875/878 878/876/879 -f 878/876/879 868/867/869 867/866/868 -f 868/867/869 878/876/879 879/44/880 -f 879/44/880 869/33/870 868/867/869 -f 480/480/480 490/490/490 880/877/881 -f 880/877/881 870/868/871 480/480/480 -f 870/868/871 880/877/881 881/878/882 -f 881/878/882 871/869/872 870/868/871 -f 871/869/872 881/878/882 882/879/883 -f 882/879/883 872/870/873 871/869/872 -f 872/870/873 882/879/883 883/880/884 -f 883/880/884 873/871/874 872/870/873 -f 873/871/874 883/880/884 884/881/885 -f 884/881/885 874/872/875 873/871/874 -f 874/872/875 884/881/885 885/882/886 -f 885/882/886 875/873/876 874/872/875 -f 875/873/876 885/882/886 886/883/887 -f 886/883/887 876/874/877 875/873/876 -f 876/874/877 886/883/887 887/884/888 -f 887/884/888 877/875/878 876/874/877 -f 877/875/878 887/884/888 888/885/889 -f 888/885/889 878/876/879 877/875/878 -f 878/876/879 888/885/889 889/55/890 -f 889/55/890 879/44/880 878/876/879 -f 490/490/490 500/500/500 890/886/891 -f 890/886/891 880/877/881 490/490/490 -f 880/877/881 890/886/891 891/887/892 -f 891/887/892 881/878/882 880/877/881 -f 881/878/882 891/887/892 892/888/893 -f 892/888/893 882/879/883 881/878/882 -f 882/879/883 892/888/893 893/889/894 -f 893/889/894 883/880/884 882/879/883 -f 883/880/884 893/889/894 894/890/895 -f 894/890/895 884/881/885 883/880/884 -f 884/881/885 894/890/895 895/891/896 -f 895/891/896 885/882/886 884/881/885 -f 885/882/886 895/891/896 896/892/897 -f 896/892/897 886/883/887 885/882/886 -f 886/883/887 896/892/897 897/893/898 -f 897/893/898 887/884/888 886/883/887 -f 887/884/888 897/893/898 898/894/899 -f 898/894/899 888/885/889 887/884/888 -f 888/885/889 898/894/899 899/66/900 -f 899/66/900 889/55/890 888/885/889 -f 500/500/500 510/510/510 900/895/901 -f 900/895/901 890/886/891 500/500/500 -f 890/886/891 900/895/901 901/896/902 -f 901/896/902 891/887/892 890/886/891 -f 891/887/892 901/896/902 902/897/903 -f 902/897/903 892/888/893 891/887/892 -f 892/888/893 902/897/903 903/898/904 -f 903/898/904 893/889/894 892/888/893 -f 893/889/894 903/898/904 904/899/905 -f 904/899/905 894/890/895 893/889/894 -f 894/890/895 904/899/905 905/900/906 -f 905/900/906 895/891/896 894/890/895 -f 895/891/896 905/900/906 906/901/907 -f 906/901/907 896/892/897 895/891/896 -f 896/892/897 906/901/907 907/902/908 -f 907/902/908 897/893/898 896/892/897 -f 897/893/898 907/902/908 908/903/909 -f 908/903/909 898/894/899 897/893/898 -f 898/894/899 908/903/909 909/77/910 -f 909/77/910 899/66/900 898/894/899 -f 510/510/510 520/520/520 910/904/911 -f 910/904/911 900/895/901 510/510/510 -f 900/895/901 910/904/911 911/905/912 -f 911/905/912 901/896/902 900/895/901 -f 901/896/902 911/905/912 912/906/913 -f 912/906/913 902/897/903 901/896/902 -f 902/897/903 912/906/913 913/907/914 -f 913/907/914 903/898/904 902/897/903 -f 903/898/904 913/907/914 914/908/915 -f 914/908/915 904/899/905 903/898/904 -f 904/899/905 914/908/915 915/909/916 -f 915/909/916 905/900/906 904/899/905 -f 905/900/906 915/909/916 916/910/917 -f 916/910/917 906/901/907 905/900/906 -f 906/901/907 916/910/917 917/911/918 -f 917/911/918 907/902/908 906/901/907 -f 907/902/908 917/911/918 918/912/919 -f 918/912/919 908/903/909 907/902/908 -f 908/903/909 918/912/919 919/88/920 -f 919/88/920 909/77/910 908/903/909 -f 520/520/520 530/530/530 920/913/921 -f 920/913/921 910/904/911 520/520/520 -f 910/904/911 920/913/921 921/914/922 -f 921/914/922 911/905/912 910/904/911 -f 911/905/912 921/914/922 922/915/923 -f 922/915/923 912/906/913 911/905/912 -f 912/906/913 922/915/923 923/916/924 -f 923/916/924 913/907/914 912/906/913 -f 913/907/914 923/916/924 924/917/925 -f 924/917/925 914/908/915 913/907/914 -f 914/908/915 924/917/925 925/918/926 -f 925/918/926 915/909/916 914/908/915 -f 915/909/916 925/918/926 926/919/927 -f 926/919/927 916/910/917 915/909/916 -f 916/910/917 926/919/927 927/920/928 -f 927/920/928 917/911/918 916/910/917 -f 917/911/918 927/920/928 928/921/929 -f 928/921/929 918/912/919 917/911/918 -f 918/912/919 928/921/929 929/99/930 -f 929/99/930 919/88/920 918/912/919 -f 530/530/530 540/540/540 930/922/931 -f 930/922/931 920/913/921 530/530/530 -f 920/913/921 930/922/931 931/923/932 -f 931/923/932 921/914/922 920/913/921 -f 921/914/922 931/923/932 932/924/933 -f 932/924/933 922/915/923 921/914/922 -f 922/915/923 932/924/933 933/925/934 -f 933/925/934 923/916/924 922/915/923 -f 923/916/924 933/925/934 934/926/935 -f 934/926/935 924/917/925 923/916/924 -f 924/917/925 934/926/935 935/927/936 -f 935/927/936 925/918/926 924/917/925 -f 925/918/926 935/927/936 936/928/937 -f 936/928/937 926/919/927 925/918/926 -f 926/919/927 936/928/937 937/929/938 -f 937/929/938 927/920/928 926/919/927 -f 927/920/928 937/929/938 938/930/939 -f 938/930/939 928/921/929 927/920/928 -f 928/921/929 938/930/939 939/110/940 -f 939/110/940 929/99/930 928/921/929 -f 540/540/540 550/550/550 940/931/941 -f 940/931/941 930/922/931 540/540/540 -f 930/922/931 940/931/941 941/932/942 -f 941/932/942 931/923/932 930/922/931 -f 931/923/932 941/932/942 942/933/943 -f 942/933/943 932/924/933 931/923/932 -f 932/924/933 942/933/943 943/934/944 -f 943/934/944 933/925/934 932/924/933 -f 933/925/934 943/934/944 944/935/945 -f 944/935/945 934/926/935 933/925/934 -f 934/926/935 944/935/945 945/936/946 -f 945/936/946 935/927/936 934/926/935 -f 935/927/936 945/936/946 946/937/947 -f 946/937/947 936/928/937 935/927/936 -f 936/928/937 946/937/947 947/938/948 -f 947/938/948 937/929/938 936/928/937 -f 937/929/938 947/938/948 948/939/949 -f 948/939/949 938/930/939 937/929/938 -f 938/930/939 948/939/949 949/121/950 -f 949/121/950 939/110/940 938/930/939 -f 550/550/550 560/560/560 950/940/951 -f 950/940/951 940/931/941 550/550/550 -f 940/931/941 950/940/951 951/941/952 -f 951/941/952 941/932/942 940/931/941 -f 941/932/942 951/941/952 952/942/953 -f 952/942/953 942/933/943 941/932/942 -f 942/933/943 952/942/953 953/943/954 -f 953/943/954 943/934/944 942/933/943 -f 943/934/944 953/943/954 954/944/955 -f 954/944/955 944/935/945 943/934/944 -f 944/935/945 954/944/955 955/945/956 -f 955/945/956 945/936/946 944/935/945 -f 945/936/946 955/945/956 956/946/957 -f 956/946/957 946/937/947 945/936/946 -f 946/937/947 956/946/957 957/947/958 -f 957/947/958 947/938/948 946/937/947 -f 947/938/948 957/947/958 958/948/959 -f 958/948/959 948/939/949 947/938/948 -f 948/939/949 958/948/959 959/132/960 -f 959/132/960 949/121/950 948/939/949 -f 560/560/560 570/570/570 960/949/961 -f 960/949/961 950/940/951 560/560/560 -f 950/940/951 960/949/961 961/950/962 -f 961/950/962 951/941/952 950/940/951 -f 951/941/952 961/950/962 962/951/963 -f 962/951/963 952/942/953 951/941/952 -f 952/942/953 962/951/963 963/952/964 -f 963/952/964 953/943/954 952/942/953 -f 953/943/954 963/952/964 964/953/965 -f 964/953/965 954/944/955 953/943/954 -f 954/944/955 964/953/965 965/954/966 -f 965/954/966 955/945/956 954/944/955 -f 955/945/956 965/954/966 966/955/967 -f 966/955/967 956/946/957 955/945/956 -f 956/946/957 966/955/967 967/956/968 -f 967/956/968 957/947/958 956/946/957 -f 957/947/958 967/956/968 968/957/969 -f 968/957/969 958/948/959 957/947/958 -f 958/948/959 968/957/969 969/143/970 -f 969/143/970 959/132/960 958/948/959 -f 570/570/570 580/580/580 970/958/971 -f 970/958/971 960/949/961 570/570/570 -f 960/949/961 970/958/971 971/959/972 -f 971/959/972 961/950/962 960/949/961 -f 961/950/962 971/959/972 972/960/973 -f 972/960/973 962/951/963 961/950/962 -f 962/951/963 972/960/973 973/961/974 -f 973/961/974 963/952/964 962/951/963 -f 963/952/964 973/961/974 974/962/975 -f 974/962/975 964/953/965 963/952/964 -f 964/953/965 974/962/975 975/963/976 -f 975/963/976 965/954/966 964/953/965 -f 965/954/966 975/963/976 976/964/977 -f 976/964/977 966/955/967 965/954/966 -f 966/955/967 976/964/977 977/965/978 -f 977/965/978 967/956/968 966/955/967 -f 967/956/968 977/965/978 978/966/979 -f 978/966/979 968/957/969 967/956/968 -f 968/957/969 978/966/979 979/154/980 -f 979/154/980 969/143/970 968/957/969 -f 580/580/580 590/590/590 980/967/981 -f 980/967/981 970/958/971 580/580/580 -f 970/958/971 980/967/981 981/968/982 -f 981/968/982 971/959/972 970/958/971 -f 971/959/972 981/968/982 982/969/983 -f 982/969/983 972/960/973 971/959/972 -f 972/960/973 982/969/983 983/970/984 -f 983/970/984 973/961/974 972/960/973 -f 973/961/974 983/970/984 984/971/985 -f 984/971/985 974/962/975 973/961/974 -f 974/962/975 984/971/985 985/972/986 -f 985/972/986 975/963/976 974/962/975 -f 975/963/976 985/972/986 986/973/987 -f 986/973/987 976/964/977 975/963/976 -f 976/964/977 986/973/987 987/974/988 -f 987/974/988 977/965/978 976/964/977 -f 977/965/978 987/974/988 988/975/989 -f 988/975/989 978/966/979 977/965/978 -f 978/966/979 988/975/989 989/165/990 -f 989/165/990 979/154/980 978/966/979 -f 590/590/590 600/600/600 990/976/991 -f 990/976/991 980/967/981 590/590/590 -f 980/967/981 990/976/991 991/977/992 -f 991/977/992 981/968/982 980/967/981 -f 981/968/982 991/977/992 992/978/993 -f 992/978/993 982/969/983 981/968/982 -f 982/969/983 992/978/993 993/979/994 -f 993/979/994 983/970/984 982/969/983 -f 983/970/984 993/979/994 994/980/995 -f 994/980/995 984/971/985 983/970/984 -f 984/971/985 994/980/995 995/981/996 -f 995/981/996 985/972/986 984/971/985 -f 985/972/986 995/981/996 996/982/997 -f 996/982/997 986/973/987 985/972/986 -f 986/973/987 996/982/997 997/983/998 -f 997/983/998 987/974/988 986/973/987 -f 987/974/988 997/983/998 998/984/999 -f 998/984/999 988/975/989 987/974/988 -f 988/975/989 998/984/999 999/176/1000 -f 999/176/1000 989/165/990 988/975/989 -f 600/600/600 610/610/610 1000/985/1001 -f 1000/985/1001 990/976/991 600/600/600 -f 990/976/991 1000/985/1001 1001/986/1002 -f 1001/986/1002 991/977/992 990/976/991 -f 991/977/992 1001/986/1002 1002/987/1003 -f 1002/987/1003 992/978/993 991/977/992 -f 992/978/993 1002/987/1003 1003/988/1004 -f 1003/988/1004 993/979/994 992/978/993 -f 993/979/994 1003/988/1004 1004/989/1005 -f 1004/989/1005 994/980/995 993/979/994 -f 994/980/995 1004/989/1005 1005/990/1006 -f 1005/990/1006 995/981/996 994/980/995 -f 995/981/996 1005/990/1006 1006/991/1007 -f 1006/991/1007 996/982/997 995/981/996 -f 996/982/997 1006/991/1007 1007/992/1008 -f 1007/992/1008 997/983/998 996/982/997 -f 997/983/998 1007/992/1008 1008/993/1009 -f 1008/993/1009 998/984/999 997/983/998 -f 998/984/999 1008/993/1009 1009/187/1010 -f 1009/187/1010 999/176/1000 998/984/999 -f 610/610/610 620/620/620 1010/994/1011 -f 1010/994/1011 1000/985/1001 610/610/610 -f 1000/985/1001 1010/994/1011 1011/995/1012 -f 1011/995/1012 1001/986/1002 1000/985/1001 -f 1001/986/1002 1011/995/1012 1012/996/1013 -f 1012/996/1013 1002/987/1003 1001/986/1002 -f 1002/987/1003 1012/996/1013 1013/997/1014 -f 1013/997/1014 1003/988/1004 1002/987/1003 -f 1003/988/1004 1013/997/1014 1014/998/1015 -f 1014/998/1015 1004/989/1005 1003/988/1004 -f 1004/989/1005 1014/998/1015 1015/999/1016 -f 1015/999/1016 1005/990/1006 1004/989/1005 -f 1005/990/1006 1015/999/1016 1016/1000/1017 -f 1016/1000/1017 1006/991/1007 1005/990/1006 -f 1006/991/1007 1016/1000/1017 1017/1001/1018 -f 1017/1001/1018 1007/992/1008 1006/991/1007 -f 1007/992/1008 1017/1001/1018 1018/1002/1019 -f 1018/1002/1019 1008/993/1009 1007/992/1008 -f 1008/993/1009 1018/1002/1019 1019/198/1020 -f 1019/198/1020 1009/187/1010 1008/993/1009 -f 620/620/620 630/630/630 1020/1003/1021 -f 1020/1003/1021 1010/994/1011 620/620/620 -f 1010/994/1011 1020/1003/1021 1021/1004/1022 -f 1021/1004/1022 1011/995/1012 1010/994/1011 -f 1011/995/1012 1021/1004/1022 1022/1005/1023 -f 1022/1005/1023 1012/996/1013 1011/995/1012 -f 1012/996/1013 1022/1005/1023 1023/1006/1024 -f 1023/1006/1024 1013/997/1014 1012/996/1013 -f 1013/997/1014 1023/1006/1024 1024/1007/1025 -f 1024/1007/1025 1014/998/1015 1013/997/1014 -f 1014/998/1015 1024/1007/1025 1025/1008/1026 -f 1025/1008/1026 1015/999/1016 1014/998/1015 -f 1015/999/1016 1025/1008/1026 1026/1009/1027 -f 1026/1009/1027 1016/1000/1017 1015/999/1016 -f 1016/1000/1017 1026/1009/1027 1027/1010/1028 -f 1027/1010/1028 1017/1001/1018 1016/1000/1017 -f 1017/1001/1018 1027/1010/1028 1028/1011/1029 -f 1028/1011/1029 1018/1002/1019 1017/1001/1018 -f 1018/1002/1019 1028/1011/1029 1029/209/1030 -f 1029/209/1030 1019/198/1020 1018/1002/1019 -f 630/630/630 640/640/640 1030/1012/1031 -f 1030/1012/1031 1020/1003/1021 630/630/630 -f 1020/1003/1021 1030/1012/1031 1031/1013/1032 -f 1031/1013/1032 1021/1004/1022 1020/1003/1021 -f 1021/1004/1022 1031/1013/1032 1032/1014/1033 -f 1032/1014/1033 1022/1005/1023 1021/1004/1022 -f 1022/1005/1023 1032/1014/1033 1033/1015/1034 -f 1033/1015/1034 1023/1006/1024 1022/1005/1023 -f 1023/1006/1024 1033/1015/1034 1034/1016/1035 -f 1034/1016/1035 1024/1007/1025 1023/1006/1024 -f 1024/1007/1025 1034/1016/1035 1035/1017/1036 -f 1035/1017/1036 1025/1008/1026 1024/1007/1025 -f 1025/1008/1026 1035/1017/1036 1036/1018/1037 -f 1036/1018/1037 1026/1009/1027 1025/1008/1026 -f 1026/1009/1027 1036/1018/1037 1037/1019/1038 -f 1037/1019/1038 1027/1010/1028 1026/1009/1027 -f 1027/1010/1028 1037/1019/1038 1038/1020/1039 -f 1038/1020/1039 1028/1011/1029 1027/1010/1028 -f 1028/1011/1029 1038/1020/1039 1039/220/1040 -f 1039/220/1040 1029/209/1030 1028/1011/1029 -f 640/640/640 1840/650/650 1040/1021/1041 -f 1040/1021/1041 1030/1012/1031 640/640/640 -f 1030/1012/1031 1040/1021/1041 1041/1022/1042 -f 1041/1022/1042 1031/1013/1032 1030/1012/1031 -f 1031/1013/1032 1041/1022/1042 1042/1023/1043 -f 1042/1023/1043 1032/1014/1033 1031/1013/1032 -f 1032/1014/1033 1042/1023/1043 1043/1024/1044 -f 1043/1024/1044 1033/1015/1034 1032/1014/1033 -f 1033/1015/1034 1043/1024/1044 1044/1025/1045 -f 1044/1025/1045 1034/1016/1035 1033/1015/1034 -f 1034/1016/1035 1044/1025/1045 1045/1026/1046 -f 1045/1026/1046 1035/1017/1036 1034/1016/1035 -f 1035/1017/1036 1045/1026/1046 1046/1027/1047 -f 1046/1027/1047 1036/1018/1037 1035/1017/1036 -f 1036/1018/1037 1046/1027/1047 1047/1028/1048 -f 1047/1028/1048 1037/1019/1038 1036/1018/1037 -f 1037/1019/1038 1047/1028/1048 1048/1029/1049 -f 1048/1029/1049 1038/1020/1039 1037/1019/1038 -f 1038/1020/1039 1048/1029/1049 1049/231/1050 -f 1049/231/1050 1039/220/1040 1038/1020/1039 -f 1840/650/650 659/660/660 1050/1030/1051 -f 1050/1030/1051 1040/1021/1041 1840/650/650 -f 1040/1021/1041 1050/1030/1051 1051/1031/1052 -f 1051/1031/1052 1041/1022/1042 1040/1021/1041 -f 1041/1022/1042 1051/1031/1052 1052/1032/1053 -f 1052/1032/1053 1042/1023/1043 1041/1022/1042 -f 1042/1023/1043 1052/1032/1053 1053/1033/1054 -f 1053/1033/1054 1043/1024/1044 1042/1023/1043 -f 1043/1024/1044 1053/1033/1054 1054/1034/1055 -f 1054/1034/1055 1044/1025/1045 1043/1024/1044 -f 1044/1025/1045 1054/1034/1055 1055/1035/1056 -f 1055/1035/1056 1045/1026/1046 1044/1025/1045 -f 1045/1026/1046 1055/1035/1056 1056/1036/1057 -f 1056/1036/1057 1046/1027/1047 1045/1026/1046 -f 1046/1027/1047 1056/1036/1057 1057/1037/1058 -f 1057/1037/1058 1047/1028/1048 1046/1027/1047 -f 1047/1028/1048 1057/1037/1058 1058/1038/1059 -f 1058/1038/1059 1048/1029/1049 1047/1028/1048 -f 1048/1029/1049 1058/1038/1059 1059/242/1060 -f 1059/242/1060 1049/231/1050 1048/1029/1049 -f 659/660/660 669/670/670 1060/1039/1061 -f 1060/1039/1061 1050/1030/1051 659/660/660 -f 1050/1030/1051 1060/1039/1061 1061/1040/1062 -f 1061/1040/1062 1051/1031/1052 1050/1030/1051 -f 1051/1031/1052 1061/1040/1062 1062/1041/1063 -f 1062/1041/1063 1052/1032/1053 1051/1031/1052 -f 1052/1032/1053 1062/1041/1063 1063/1042/1064 -f 1063/1042/1064 1053/1033/1054 1052/1032/1053 -f 1053/1033/1054 1063/1042/1064 1064/1043/1065 -f 1064/1043/1065 1054/1034/1055 1053/1033/1054 -f 1054/1034/1055 1064/1043/1065 1065/1044/1066 -f 1065/1044/1066 1055/1035/1056 1054/1034/1055 -f 1055/1035/1056 1065/1044/1066 1066/1045/1067 -f 1066/1045/1067 1056/1036/1057 1055/1035/1056 -f 1056/1036/1057 1066/1045/1067 1067/1046/1068 -f 1067/1046/1068 1057/1037/1058 1056/1036/1057 -f 1057/1037/1058 1067/1046/1068 1068/1047/1069 -f 1068/1047/1069 1058/1038/1059 1057/1037/1058 -f 1058/1038/1059 1068/1047/1069 1069/253/1070 -f 1069/253/1070 1059/242/1060 1058/1038/1059 -f 669/670/670 679/680/680 1070/1048/1071 -f 1070/1048/1071 1060/1039/1061 669/670/670 -f 1060/1039/1061 1070/1048/1071 1071/1049/1072 -f 1071/1049/1072 1061/1040/1062 1060/1039/1061 -f 1061/1040/1062 1071/1049/1072 1072/1050/1073 -f 1072/1050/1073 1062/1041/1063 1061/1040/1062 -f 1062/1041/1063 1072/1050/1073 1073/1051/1074 -f 1073/1051/1074 1063/1042/1064 1062/1041/1063 -f 1063/1042/1064 1073/1051/1074 1074/1052/1075 -f 1074/1052/1075 1064/1043/1065 1063/1042/1064 -f 1064/1043/1065 1074/1052/1075 1075/1053/1076 -f 1075/1053/1076 1065/1044/1066 1064/1043/1065 -f 1065/1044/1066 1075/1053/1076 1076/1054/1077 -f 1076/1054/1077 1066/1045/1067 1065/1044/1066 -f 1066/1045/1067 1076/1054/1077 1077/1055/1078 -f 1077/1055/1078 1067/1046/1068 1066/1045/1067 -f 1067/1046/1068 1077/1055/1078 1078/1056/1079 -f 1078/1056/1079 1068/1047/1069 1067/1046/1068 -f 1068/1047/1069 1078/1056/1079 1079/264/1080 -f 1079/264/1080 1069/253/1070 1068/1047/1069 -f 679/680/680 689/690/690 1080/1057/1081 -f 1080/1057/1081 1070/1048/1071 679/680/680 -f 1070/1048/1071 1080/1057/1081 1081/1058/1082 -f 1081/1058/1082 1071/1049/1072 1070/1048/1071 -f 1071/1049/1072 1081/1058/1082 1082/1059/1083 -f 1082/1059/1083 1072/1050/1073 1071/1049/1072 -f 1072/1050/1073 1082/1059/1083 1083/1060/1084 -f 1083/1060/1084 1073/1051/1074 1072/1050/1073 -f 1073/1051/1074 1083/1060/1084 1084/1061/1085 -f 1084/1061/1085 1074/1052/1075 1073/1051/1074 -f 1074/1052/1075 1084/1061/1085 1085/1062/1086 -f 1085/1062/1086 1075/1053/1076 1074/1052/1075 -f 1075/1053/1076 1085/1062/1086 1086/1063/1087 -f 1086/1063/1087 1076/1054/1077 1075/1053/1076 -f 1076/1054/1077 1086/1063/1087 1087/1064/1088 -f 1087/1064/1088 1077/1055/1078 1076/1054/1077 -f 1077/1055/1078 1087/1064/1088 1088/1065/1089 -f 1088/1065/1089 1078/1056/1079 1077/1055/1078 -f 1078/1056/1079 1088/1065/1089 1089/275/1090 -f 1089/275/1090 1079/264/1080 1078/1056/1079 -f 689/690/690 699/700/700 1090/1066/1091 -f 1090/1066/1091 1080/1057/1081 689/690/690 -f 1080/1057/1081 1090/1066/1091 1091/1067/1092 -f 1091/1067/1092 1081/1058/1082 1080/1057/1081 -f 1081/1058/1082 1091/1067/1092 1092/1068/1093 -f 1092/1068/1093 1082/1059/1083 1081/1058/1082 -f 1082/1059/1083 1092/1068/1093 1093/1069/1094 -f 1093/1069/1094 1083/1060/1084 1082/1059/1083 -f 1083/1060/1084 1093/1069/1094 1094/1070/1095 -f 1094/1070/1095 1084/1061/1085 1083/1060/1084 -f 1084/1061/1085 1094/1070/1095 1095/1071/1096 -f 1095/1071/1096 1085/1062/1086 1084/1061/1085 -f 1085/1062/1086 1095/1071/1096 1096/1072/1097 -f 1096/1072/1097 1086/1063/1087 1085/1062/1086 -f 1086/1063/1087 1096/1072/1097 1097/1073/1098 -f 1097/1073/1098 1087/1064/1088 1086/1063/1087 -f 1087/1064/1088 1097/1073/1098 1098/1074/1099 -f 1098/1074/1099 1088/1065/1089 1087/1064/1088 -f 1088/1065/1089 1098/1074/1099 1099/286/1100 -f 1099/286/1100 1089/275/1090 1088/1065/1089 -f 699/700/700 709/710/710 1100/1075/1101 -f 1100/1075/1101 1090/1066/1091 699/700/700 -f 1090/1066/1091 1100/1075/1101 1101/1076/1102 -f 1101/1076/1102 1091/1067/1092 1090/1066/1091 -f 1091/1067/1092 1101/1076/1102 1102/1077/1103 -f 1102/1077/1103 1092/1068/1093 1091/1067/1092 -f 1092/1068/1093 1102/1077/1103 1103/1078/1104 -f 1103/1078/1104 1093/1069/1094 1092/1068/1093 -f 1093/1069/1094 1103/1078/1104 1104/1079/1105 -f 1104/1079/1105 1094/1070/1095 1093/1069/1094 -f 1094/1070/1095 1104/1079/1105 1105/1080/1106 -f 1105/1080/1106 1095/1071/1096 1094/1070/1095 -f 1095/1071/1096 1105/1080/1106 1106/1081/1107 -f 1106/1081/1107 1096/1072/1097 1095/1071/1096 -f 1096/1072/1097 1106/1081/1107 1107/1082/1108 -f 1107/1082/1108 1097/1073/1098 1096/1072/1097 -f 1097/1073/1098 1107/1082/1108 1108/1083/1109 -f 1108/1083/1109 1098/1074/1099 1097/1073/1098 -f 1098/1074/1099 1108/1083/1109 1109/297/1110 -f 1109/297/1110 1099/286/1100 1098/1074/1099 -f 709/710/710 719/720/720 1110/1084/1111 -f 1110/1084/1111 1100/1075/1101 709/710/710 -f 1100/1075/1101 1110/1084/1111 1111/1085/1112 -f 1111/1085/1112 1101/1076/1102 1100/1075/1101 -f 1101/1076/1102 1111/1085/1112 1112/1086/1113 -f 1112/1086/1113 1102/1077/1103 1101/1076/1102 -f 1102/1077/1103 1112/1086/1113 1113/1087/1114 -f 1113/1087/1114 1103/1078/1104 1102/1077/1103 -f 1103/1078/1104 1113/1087/1114 1114/1088/1115 -f 1114/1088/1115 1104/1079/1105 1103/1078/1104 -f 1104/1079/1105 1114/1088/1115 1115/1089/1116 -f 1115/1089/1116 1105/1080/1106 1104/1079/1105 -f 1105/1080/1106 1115/1089/1116 1116/1090/1117 -f 1116/1090/1117 1106/1081/1107 1105/1080/1106 -f 1106/1081/1107 1116/1090/1117 1117/1091/1118 -f 1117/1091/1118 1107/1082/1108 1106/1081/1107 -f 1107/1082/1108 1117/1091/1118 1118/1092/1119 -f 1118/1092/1119 1108/1083/1109 1107/1082/1108 -f 1108/1083/1109 1118/1092/1119 1119/308/1120 -f 1119/308/1120 1109/297/1110 1108/1083/1109 -f 719/720/720 729/730/730 1120/1093/1121 -f 1120/1093/1121 1110/1084/1111 719/720/720 -f 1110/1084/1111 1120/1093/1121 1121/1094/1122 -f 1121/1094/1122 1111/1085/1112 1110/1084/1111 -f 1111/1085/1112 1121/1094/1122 1122/1095/1123 -f 1122/1095/1123 1112/1086/1113 1111/1085/1112 -f 1112/1086/1113 1122/1095/1123 1123/1096/1124 -f 1123/1096/1124 1113/1087/1114 1112/1086/1113 -f 1113/1087/1114 1123/1096/1124 1124/1097/1125 -f 1124/1097/1125 1114/1088/1115 1113/1087/1114 -f 1114/1088/1115 1124/1097/1125 1125/1098/1126 -f 1125/1098/1126 1115/1089/1116 1114/1088/1115 -f 1115/1089/1116 1125/1098/1126 1126/1099/1127 -f 1126/1099/1127 1116/1090/1117 1115/1089/1116 -f 1116/1090/1117 1126/1099/1127 1127/1100/1128 -f 1127/1100/1128 1117/1091/1118 1116/1090/1117 -f 1117/1091/1118 1127/1100/1128 1128/1101/1129 -f 1128/1101/1129 1118/1092/1119 1117/1091/1118 -f 1118/1092/1119 1128/1101/1129 1129/319/1130 -f 1129/319/1130 1119/308/1120 1118/1092/1119 -f 729/730/730 739/740/740 1130/1102/1131 -f 1130/1102/1131 1120/1093/1121 729/730/730 -f 1120/1093/1121 1130/1102/1131 1131/1103/1132 -f 1131/1103/1132 1121/1094/1122 1120/1093/1121 -f 1121/1094/1122 1131/1103/1132 1132/1104/1133 -f 1132/1104/1133 1122/1095/1123 1121/1094/1122 -f 1122/1095/1123 1132/1104/1133 1133/1105/1134 -f 1133/1105/1134 1123/1096/1124 1122/1095/1123 -f 1123/1096/1124 1133/1105/1134 1134/1106/1135 -f 1134/1106/1135 1124/1097/1125 1123/1096/1124 -f 1124/1097/1125 1134/1106/1135 1135/1107/1136 -f 1135/1107/1136 1125/1098/1126 1124/1097/1125 -f 1125/1098/1126 1135/1107/1136 1136/1108/1137 -f 1136/1108/1137 1126/1099/1127 1125/1098/1126 -f 1126/1099/1127 1136/1108/1137 1137/1109/1138 -f 1137/1109/1138 1127/1100/1128 1126/1099/1127 -f 1127/1100/1128 1137/1109/1138 1138/1110/1139 -f 1138/1110/1139 1128/1101/1129 1127/1100/1128 -f 1128/1101/1129 1138/1110/1139 1139/330/1140 -f 1139/330/1140 1129/319/1130 1128/1101/1129 -f 739/740/740 749/750/750 1140/1111/1141 -f 1140/1111/1141 1130/1102/1131 739/740/740 -f 1130/1102/1131 1140/1111/1141 1141/1112/1142 -f 1141/1112/1142 1131/1103/1132 1130/1102/1131 -f 1131/1103/1132 1141/1112/1142 1142/1113/1143 -f 1142/1113/1143 1132/1104/1133 1131/1103/1132 -f 1132/1104/1133 1142/1113/1143 1143/1114/1144 -f 1143/1114/1144 1133/1105/1134 1132/1104/1133 -f 1133/1105/1134 1143/1114/1144 1144/1115/1145 -f 1144/1115/1145 1134/1106/1135 1133/1105/1134 -f 1134/1106/1135 1144/1115/1145 1145/1116/1146 -f 1145/1116/1146 1135/1107/1136 1134/1106/1135 -f 1135/1107/1136 1145/1116/1146 1146/1117/1147 -f 1146/1117/1147 1136/1108/1137 1135/1107/1136 -f 1136/1108/1137 1146/1117/1147 1147/1118/1148 -f 1147/1118/1148 1137/1109/1138 1136/1108/1137 -f 1137/1109/1138 1147/1118/1148 1148/1119/1149 -f 1148/1119/1149 1138/1110/1139 1137/1109/1138 -f 1138/1110/1139 1148/1119/1149 1149/341/1150 -f 1149/341/1150 1139/330/1140 1138/1110/1139 -f 749/750/750 759/760/760 1150/1120/1151 -f 1150/1120/1151 1140/1111/1141 749/750/750 -f 1140/1111/1141 1150/1120/1151 1151/1121/1152 -f 1151/1121/1152 1141/1112/1142 1140/1111/1141 -f 1141/1112/1142 1151/1121/1152 1152/1122/1153 -f 1152/1122/1153 1142/1113/1143 1141/1112/1142 -f 1142/1113/1143 1152/1122/1153 1153/1123/1154 -f 1153/1123/1154 1143/1114/1144 1142/1113/1143 -f 1143/1114/1144 1153/1123/1154 1154/1124/1155 -f 1154/1124/1155 1144/1115/1145 1143/1114/1144 -f 1144/1115/1145 1154/1124/1155 1155/1125/1156 -f 1155/1125/1156 1145/1116/1146 1144/1115/1145 -f 1145/1116/1146 1155/1125/1156 1156/1126/1157 -f 1156/1126/1157 1146/1117/1147 1145/1116/1146 -f 1146/1117/1147 1156/1126/1157 1157/1127/1158 -f 1157/1127/1158 1147/1118/1148 1146/1117/1147 -f 1147/1118/1148 1157/1127/1158 1158/1128/1159 -f 1158/1128/1159 1148/1119/1149 1147/1118/1148 -f 1148/1119/1149 1158/1128/1159 1159/352/1160 -f 1159/352/1160 1149/341/1150 1148/1119/1149 -f 759/760/760 769/770/770 1160/1129/1161 -f 1160/1129/1161 1150/1120/1151 759/760/760 -f 1150/1120/1151 1160/1129/1161 1161/1130/1162 -f 1161/1130/1162 1151/1121/1152 1150/1120/1151 -f 1151/1121/1152 1161/1130/1162 1162/1131/1163 -f 1162/1131/1163 1152/1122/1153 1151/1121/1152 -f 1152/1122/1153 1162/1131/1163 1163/1132/1164 -f 1163/1132/1164 1153/1123/1154 1152/1122/1153 -f 1153/1123/1154 1163/1132/1164 1164/1133/1165 -f 1164/1133/1165 1154/1124/1155 1153/1123/1154 -f 1154/1124/1155 1164/1133/1165 1165/1134/1166 -f 1165/1134/1166 1155/1125/1156 1154/1124/1155 -f 1155/1125/1156 1165/1134/1166 1166/1135/1167 -f 1166/1135/1167 1156/1126/1157 1155/1125/1156 -f 1156/1126/1157 1166/1135/1167 1167/1136/1168 -f 1167/1136/1168 1157/1127/1158 1156/1126/1157 -f 1157/1127/1158 1167/1136/1168 1168/1137/1169 -f 1168/1137/1169 1158/1128/1159 1157/1127/1158 -f 1158/1128/1159 1168/1137/1169 1169/363/1170 -f 1169/363/1170 1159/352/1160 1158/1128/1159 -f 769/770/770 779/780/780 1170/1138/1171 -f 1170/1138/1171 1160/1129/1161 769/770/770 -f 1160/1129/1161 1170/1138/1171 1171/1139/1172 -f 1171/1139/1172 1161/1130/1162 1160/1129/1161 -f 1161/1130/1162 1171/1139/1172 1172/1140/1173 -f 1172/1140/1173 1162/1131/1163 1161/1130/1162 -f 1162/1131/1163 1172/1140/1173 1173/1141/1174 -f 1173/1141/1174 1163/1132/1164 1162/1131/1163 -f 1163/1132/1164 1173/1141/1174 1174/1142/1175 -f 1174/1142/1175 1164/1133/1165 1163/1132/1164 -f 1164/1133/1165 1174/1142/1175 1175/1143/1176 -f 1175/1143/1176 1165/1134/1166 1164/1133/1165 -f 1165/1134/1166 1175/1143/1176 1176/1144/1177 -f 1176/1144/1177 1166/1135/1167 1165/1134/1166 -f 1166/1135/1167 1176/1144/1177 1177/1145/1178 -f 1177/1145/1178 1167/1136/1168 1166/1135/1167 -f 1167/1136/1168 1177/1145/1178 1178/1146/1179 -f 1178/1146/1179 1168/1137/1169 1167/1136/1168 -f 1168/1137/1169 1178/1146/1179 1179/374/1180 -f 1179/374/1180 1169/363/1170 1168/1137/1169 -f 779/780/780 789/790/790 1180/1147/1181 -f 1180/1147/1181 1170/1138/1171 779/780/780 -f 1170/1138/1171 1180/1147/1181 1181/1148/1182 -f 1181/1148/1182 1171/1139/1172 1170/1138/1171 -f 1171/1139/1172 1181/1148/1182 1182/1149/1183 -f 1182/1149/1183 1172/1140/1173 1171/1139/1172 -f 1172/1140/1173 1182/1149/1183 1183/1150/1184 -f 1183/1150/1184 1173/1141/1174 1172/1140/1173 -f 1173/1141/1174 1183/1150/1184 1184/1151/1185 -f 1184/1151/1185 1174/1142/1175 1173/1141/1174 -f 1174/1142/1175 1184/1151/1185 1185/1152/1186 -f 1185/1152/1186 1175/1143/1176 1174/1142/1175 -f 1175/1143/1176 1185/1152/1186 1186/1153/1187 -f 1186/1153/1187 1176/1144/1177 1175/1143/1176 -f 1176/1144/1177 1186/1153/1187 1187/1154/1188 -f 1187/1154/1188 1177/1145/1178 1176/1144/1177 -f 1177/1145/1178 1187/1154/1188 1188/1155/1189 -f 1188/1155/1189 1178/1146/1179 1177/1145/1178 -f 1178/1146/1179 1188/1155/1189 1189/385/1190 -f 1189/385/1190 1179/374/1180 1178/1146/1179 -f 789/790/790 799/800/800 1190/1156/1191 -f 1190/1156/1191 1180/1147/1181 789/790/790 -f 1180/1147/1181 1190/1156/1191 1191/1157/1192 -f 1191/1157/1192 1181/1148/1182 1180/1147/1181 -f 1181/1148/1182 1191/1157/1192 1192/1158/1193 -f 1192/1158/1193 1182/1149/1183 1181/1148/1182 -f 1182/1149/1183 1192/1158/1193 1193/1159/1194 -f 1193/1159/1194 1183/1150/1184 1182/1149/1183 -f 1183/1150/1184 1193/1159/1194 1194/1160/1195 -f 1194/1160/1195 1184/1151/1185 1183/1150/1184 -f 1184/1151/1185 1194/1160/1195 1195/1161/1196 -f 1195/1161/1196 1185/1152/1186 1184/1151/1185 -f 1185/1152/1186 1195/1161/1196 1196/1162/1197 -f 1196/1162/1197 1186/1153/1187 1185/1152/1186 -f 1186/1153/1187 1196/1162/1197 1197/1163/1198 -f 1197/1163/1198 1187/1154/1188 1186/1153/1187 -f 1187/1154/1188 1197/1163/1198 1198/1164/1199 -f 1198/1164/1199 1188/1155/1189 1187/1154/1188 -f 1188/1155/1189 1198/1164/1199 1199/396/1200 -f 1199/396/1200 1189/385/1190 1188/1155/1189 -f 799/800/800 809/810/810 1200/1165/1201 -f 1200/1165/1201 1190/1156/1191 799/800/800 -f 1190/1156/1191 1200/1165/1201 1201/1166/1202 -f 1201/1166/1202 1191/1157/1192 1190/1156/1191 -f 1191/1157/1192 1201/1166/1202 1202/1167/1203 -f 1202/1167/1203 1192/1158/1193 1191/1157/1192 -f 1192/1158/1193 1202/1167/1203 1203/1168/1204 -f 1203/1168/1204 1193/1159/1194 1192/1158/1193 -f 1193/1159/1194 1203/1168/1204 1204/1169/1205 -f 1204/1169/1205 1194/1160/1195 1193/1159/1194 -f 1194/1160/1195 1204/1169/1205 1205/1170/1206 -f 1205/1170/1206 1195/1161/1196 1194/1160/1195 -f 1195/1161/1196 1205/1170/1206 1206/1171/1207 -f 1206/1171/1207 1196/1162/1197 1195/1161/1196 -f 1196/1162/1197 1206/1171/1207 1207/1172/1208 -f 1207/1172/1208 1197/1163/1198 1196/1162/1197 -f 1197/1163/1198 1207/1172/1208 1208/1173/1209 -f 1208/1173/1209 1198/1164/1199 1197/1163/1198 -f 1198/1164/1199 1208/1173/1209 1209/407/1210 -f 1209/407/1210 1199/396/1200 1198/1164/1199 -f 809/810/810 819/820/820 1210/1174/1211 -f 1210/1174/1211 1200/1165/1201 809/810/810 -f 1200/1165/1201 1210/1174/1211 1211/1175/1212 -f 1211/1175/1212 1201/1166/1202 1200/1165/1201 -f 1201/1166/1202 1211/1175/1212 1212/1176/1213 -f 1212/1176/1213 1202/1167/1203 1201/1166/1202 -f 1202/1167/1203 1212/1176/1213 1213/1177/1214 -f 1213/1177/1214 1203/1168/1204 1202/1167/1203 -f 1203/1168/1204 1213/1177/1214 1214/1178/1215 -f 1214/1178/1215 1204/1169/1205 1203/1168/1204 -f 1204/1169/1205 1214/1178/1215 1215/1179/1216 -f 1215/1179/1216 1205/1170/1206 1204/1169/1205 -f 1205/1170/1206 1215/1179/1216 1216/1180/1217 -f 1216/1180/1217 1206/1171/1207 1205/1170/1206 -f 1206/1171/1207 1216/1180/1217 1217/1181/1218 -f 1217/1181/1218 1207/1172/1208 1206/1171/1207 -f 1207/1172/1208 1217/1181/1218 1218/1182/1219 -f 1218/1182/1219 1208/1173/1209 1207/1172/1208 -f 1208/1173/1209 1218/1182/1219 1219/418/1220 -f 1219/418/1220 1209/407/1210 1208/1173/1209 -f 819/820/820 829/830/830 1220/1183/1221 -f 1220/1183/1221 1210/1174/1211 819/820/820 -f 1210/1174/1211 1220/1183/1221 1221/1184/1222 -f 1221/1184/1222 1211/1175/1212 1210/1174/1211 -f 1211/1175/1212 1221/1184/1222 1222/1185/1223 -f 1222/1185/1223 1212/1176/1213 1211/1175/1212 -f 1212/1176/1213 1222/1185/1223 1223/1186/1224 -f 1223/1186/1224 1213/1177/1214 1212/1176/1213 -f 1213/1177/1214 1223/1186/1224 1224/1187/1225 -f 1224/1187/1225 1214/1178/1215 1213/1177/1214 -f 1214/1178/1215 1224/1187/1225 1225/1188/1226 -f 1225/1188/1226 1215/1179/1216 1214/1178/1215 -f 1215/1179/1216 1225/1188/1226 1226/1189/1227 -f 1226/1189/1227 1216/1180/1217 1215/1179/1216 -f 1216/1180/1217 1226/1189/1227 1227/1190/1228 -f 1227/1190/1228 1217/1181/1218 1216/1180/1217 -f 1217/1181/1218 1227/1190/1228 1228/1191/1229 -f 1228/1191/1229 1218/1182/1219 1217/1181/1218 -f 1218/1182/1219 1228/1191/1229 1229/429/1230 -f 1229/429/1230 1219/418/1220 1218/1182/1219 -f 829/830/830 839/840/840 1230/1192/1231 -f 1230/1192/1231 1220/1183/1221 829/830/830 -f 1220/1183/1221 1230/1192/1231 1231/1193/1232 -f 1231/1193/1232 1221/1184/1222 1220/1183/1221 -f 1221/1184/1222 1231/1193/1232 1232/1194/1233 -f 1232/1194/1233 1222/1185/1223 1221/1184/1222 -f 1222/1185/1223 1232/1194/1233 1233/1195/1234 -f 1233/1195/1234 1223/1186/1224 1222/1185/1223 -f 1223/1186/1224 1233/1195/1234 1234/1196/1235 -f 1234/1196/1235 1224/1187/1225 1223/1186/1224 -f 1224/1187/1225 1234/1196/1235 1235/1197/1236 -f 1235/1197/1236 1225/1188/1226 1224/1187/1225 -f 1225/1188/1226 1235/1197/1236 1236/1198/1237 -f 1236/1198/1237 1226/1189/1227 1225/1188/1226 -f 1226/1189/1227 1236/1198/1237 1237/1199/1238 -f 1237/1199/1238 1227/1190/1228 1226/1189/1227 -f 1227/1190/1228 1237/1199/1238 1238/1200/1239 -f 1238/1200/1239 1228/1191/1229 1227/1190/1228 -f 1228/1191/1229 1238/1200/1239 1239/440/1240 -f 1239/440/1240 1229/429/1230 1228/1191/1229 -f 839/840/840 460/460/460 841/842/842 -f 841/842/842 1230/1192/1231 839/840/840 -f 1230/1192/1231 841/842/842 843/844/844 -f 843/844/844 1231/1193/1232 1230/1192/1231 -f 1231/1193/1232 843/844/844 845/846/846 -f 845/846/846 1232/1194/1233 1231/1193/1232 -f 1232/1194/1233 845/846/846 847/848/848 -f 847/848/848 1233/1195/1234 1232/1194/1233 -f 1233/1195/1234 847/848/848 849/850/850 -f 849/850/850 1234/1196/1235 1233/1195/1234 -f 1234/1196/1235 849/850/850 851/852/852 -f 851/852/852 1235/1197/1236 1234/1196/1235 -f 1235/1197/1236 851/852/852 853/854/854 -f 853/854/854 1236/1198/1237 1235/1197/1236 -f 1236/1198/1237 853/854/854 855/856/856 -f 855/856/856 1237/1199/1238 1236/1198/1237 -f 1237/1199/1238 855/856/856 857/858/858 -f 857/858/858 1238/1200/1239 1237/1199/1238 -f 1238/1200/1239 857/858/858 859/22/860 -f 859/22/860 1239/440/1240 1238/1200/1239 -f 859/22/860 858/21/859 1240/1201/1241 -f 1240/1201/1241 1241/1202/1242 859/22/860 -f 1241/1202/1242 1240/1201/1241 1242/1203/1243 -f 1242/1203/1243 1243/1204/1244 1241/1202/1242 -f 1243/1204/1244 1242/1203/1243 1244/1205/1245 -f 1244/1205/1245 1245/1206/1246 1243/1204/1244 -f 1245/1206/1246 1244/1205/1245 1246/1207/1247 -f 1246/1207/1247 1247/1208/1248 1245/1206/1246 -f 1247/1208/1248 1246/1207/1247 1248/1209/1249 -f 1248/1209/1249 1249/1210/1250 1247/1208/1248 -f 1249/1210/1250 1248/1209/1249 1250/1211/1251 -f 1250/1211/1251 1251/1212/1252 1249/1210/1250 -f 1251/1212/1252 1250/1211/1251 1252/1213/1253 -f 1252/1213/1253 1253/1214/1254 1251/1212/1252 -f 1253/1214/1254 1252/1213/1253 1254/1215/1255 -f 1254/1215/1255 1255/1216/1256 1253/1214/1254 -f 1255/1216/1256 1254/1215/1255 1256/1217/1257 -f 1256/1217/1257 1257/1218/1258 1255/1216/1256 -f 1257/1218/1258 1256/1217/1257 1258/1219/1259 -f 858/21/859 869/33/870 1259/1220/1260 -f 1259/1220/1260 1240/1201/1241 858/21/859 -f 1240/1201/1241 1259/1220/1260 1260/1221/1261 -f 1260/1221/1261 1242/1203/1243 1240/1201/1241 -f 1242/1203/1243 1260/1221/1261 1261/1222/1262 -f 1261/1222/1262 1244/1205/1245 1242/1203/1243 -f 1244/1205/1245 1261/1222/1262 1262/1223/1263 -f 1262/1223/1263 1246/1207/1247 1244/1205/1245 -f 1246/1207/1247 1262/1223/1263 1263/1224/1264 -f 1263/1224/1264 1248/1209/1249 1246/1207/1247 -f 1248/1209/1249 1263/1224/1264 1264/1225/1265 -f 1264/1225/1265 1250/1211/1251 1248/1209/1249 -f 1250/1211/1251 1264/1225/1265 1265/1226/1266 -f 1265/1226/1266 1252/1213/1253 1250/1211/1251 -f 1252/1213/1253 1265/1226/1266 1266/1227/1267 -f 1266/1227/1267 1254/1215/1255 1252/1213/1253 -f 1254/1215/1255 1266/1227/1267 1267/1228/1268 -f 1267/1228/1268 1256/1217/1257 1254/1215/1255 -f 1256/1217/1257 1267/1228/1268 1258/1219/1259 -f 869/33/870 879/44/880 1268/1229/1269 -f 1268/1229/1269 1259/1220/1260 869/33/870 -f 1259/1220/1260 1268/1229/1269 1269/1230/1270 -f 1269/1230/1270 1260/1221/1261 1259/1220/1260 -f 1260/1221/1261 1269/1230/1270 1270/1231/1271 -f 1270/1231/1271 1261/1222/1262 1260/1221/1261 -f 1261/1222/1262 1270/1231/1271 1271/1232/1272 -f 1271/1232/1272 1262/1223/1263 1261/1222/1262 -f 1262/1223/1263 1271/1232/1272 1272/1233/1273 -f 1272/1233/1273 1263/1224/1264 1262/1223/1263 -f 1263/1224/1264 1272/1233/1273 1273/1234/1274 -f 1273/1234/1274 1264/1225/1265 1263/1224/1264 -f 1264/1225/1265 1273/1234/1274 1274/1235/1275 -f 1274/1235/1275 1265/1226/1266 1264/1225/1265 -f 1265/1226/1266 1274/1235/1275 1275/1236/1276 -f 1275/1236/1276 1266/1227/1267 1265/1226/1266 -f 1266/1227/1267 1275/1236/1276 1276/1237/1277 -f 1276/1237/1277 1267/1228/1268 1266/1227/1267 -f 1267/1228/1268 1276/1237/1277 1258/1219/1259 -f 879/44/880 889/55/890 1277/1238/1278 -f 1277/1238/1278 1268/1229/1269 879/44/880 -f 1268/1229/1269 1277/1238/1278 1278/1239/1279 -f 1278/1239/1279 1269/1230/1270 1268/1229/1269 -f 1269/1230/1270 1278/1239/1279 1279/1240/1280 -f 1279/1240/1280 1270/1231/1271 1269/1230/1270 -f 1270/1231/1271 1279/1240/1280 1280/1241/1281 -f 1280/1241/1281 1271/1232/1272 1270/1231/1271 -f 1271/1232/1272 1280/1241/1281 1281/1242/1282 -f 1281/1242/1282 1272/1233/1273 1271/1232/1272 -f 1272/1233/1273 1281/1242/1282 1282/1243/1283 -f 1282/1243/1283 1273/1234/1274 1272/1233/1273 -f 1273/1234/1274 1282/1243/1283 1283/1244/1284 -f 1283/1244/1284 1274/1235/1275 1273/1234/1274 -f 1274/1235/1275 1283/1244/1284 1284/1245/1285 -f 1284/1245/1285 1275/1236/1276 1274/1235/1275 -f 1275/1236/1276 1284/1245/1285 1285/1246/1286 -f 1285/1246/1286 1276/1237/1277 1275/1236/1276 -f 1276/1237/1277 1285/1246/1286 1258/1219/1259 -f 889/55/890 899/66/900 1286/1247/1287 -f 1286/1247/1287 1277/1238/1278 889/55/890 -f 1277/1238/1278 1286/1247/1287 1287/1248/1288 -f 1287/1248/1288 1278/1239/1279 1277/1238/1278 -f 1278/1239/1279 1287/1248/1288 1288/1249/1289 -f 1288/1249/1289 1279/1240/1280 1278/1239/1279 -f 1279/1240/1280 1288/1249/1289 1289/1250/1290 -f 1289/1250/1290 1280/1241/1281 1279/1240/1280 -f 1280/1241/1281 1289/1250/1290 1290/1251/1291 -f 1290/1251/1291 1281/1242/1282 1280/1241/1281 -f 1281/1242/1282 1290/1251/1291 1291/1252/1292 -f 1291/1252/1292 1282/1243/1283 1281/1242/1282 -f 1282/1243/1283 1291/1252/1292 1292/1253/1293 -f 1292/1253/1293 1283/1244/1284 1282/1243/1283 -f 1283/1244/1284 1292/1253/1293 1293/1254/1294 -f 1293/1254/1294 1284/1245/1285 1283/1244/1284 -f 1284/1245/1285 1293/1254/1294 1294/1255/1295 -f 1294/1255/1295 1285/1246/1286 1284/1245/1285 -f 1285/1246/1286 1294/1255/1295 1258/1219/1259 -f 899/66/900 909/77/910 1295/1256/1296 -f 1295/1256/1296 1286/1247/1287 899/66/900 -f 1286/1247/1287 1295/1256/1296 1296/1257/1297 -f 1296/1257/1297 1287/1248/1288 1286/1247/1287 -f 1287/1248/1288 1296/1257/1297 1297/1258/1298 -f 1297/1258/1298 1288/1249/1289 1287/1248/1288 -f 1288/1249/1289 1297/1258/1298 1298/1259/1299 -f 1298/1259/1299 1289/1250/1290 1288/1249/1289 -f 1289/1250/1290 1298/1259/1299 1299/1260/1300 -f 1299/1260/1300 1290/1251/1291 1289/1250/1290 -f 1290/1251/1291 1299/1260/1300 1300/1261/1301 -f 1300/1261/1301 1291/1252/1292 1290/1251/1291 -f 1291/1252/1292 1300/1261/1301 1301/1262/1302 -f 1301/1262/1302 1292/1253/1293 1291/1252/1292 -f 1292/1253/1293 1301/1262/1302 1302/1263/1303 -f 1302/1263/1303 1293/1254/1294 1292/1253/1293 -f 1293/1254/1294 1302/1263/1303 1303/1264/1304 -f 1303/1264/1304 1294/1255/1295 1293/1254/1294 -f 1294/1255/1295 1303/1264/1304 1258/1219/1259 -f 909/77/910 919/88/920 1304/1265/1305 -f 1304/1265/1305 1295/1256/1296 909/77/910 -f 1295/1256/1296 1304/1265/1305 1305/1266/1306 -f 1305/1266/1306 1296/1257/1297 1295/1256/1296 -f 1296/1257/1297 1305/1266/1306 1306/1267/1307 -f 1306/1267/1307 1297/1258/1298 1296/1257/1297 -f 1297/1258/1298 1306/1267/1307 1307/1268/1308 -f 1307/1268/1308 1298/1259/1299 1297/1258/1298 -f 1298/1259/1299 1307/1268/1308 1308/1269/1309 -f 1308/1269/1309 1299/1260/1300 1298/1259/1299 -f 1299/1260/1300 1308/1269/1309 1309/1270/1310 -f 1309/1270/1310 1300/1261/1301 1299/1260/1300 -f 1300/1261/1301 1309/1270/1310 1310/1271/1311 -f 1310/1271/1311 1301/1262/1302 1300/1261/1301 -f 1301/1262/1302 1310/1271/1311 1311/1272/1312 -f 1311/1272/1312 1302/1263/1303 1301/1262/1302 -f 1302/1263/1303 1311/1272/1312 1312/1273/1313 -f 1312/1273/1313 1303/1264/1304 1302/1263/1303 -f 1303/1264/1304 1312/1273/1313 1258/1219/1259 -f 919/88/920 929/99/930 1313/1274/1314 -f 1313/1274/1314 1304/1265/1305 919/88/920 -f 1304/1265/1305 1313/1274/1314 1314/1275/1315 -f 1314/1275/1315 1305/1266/1306 1304/1265/1305 -f 1305/1266/1306 1314/1275/1315 1315/1276/1316 -f 1315/1276/1316 1306/1267/1307 1305/1266/1306 -f 1306/1267/1307 1315/1276/1316 1316/1277/1317 -f 1316/1277/1317 1307/1268/1308 1306/1267/1307 -f 1307/1268/1308 1316/1277/1317 1317/1278/1318 -f 1317/1278/1318 1308/1269/1309 1307/1268/1308 -f 1308/1269/1309 1317/1278/1318 1318/1279/1319 -f 1318/1279/1319 1309/1270/1310 1308/1269/1309 -f 1309/1270/1310 1318/1279/1319 1319/1280/1320 -f 1319/1280/1320 1310/1271/1311 1309/1270/1310 -f 1310/1271/1311 1319/1280/1320 1320/1281/1321 -f 1320/1281/1321 1311/1272/1312 1310/1271/1311 -f 1311/1272/1312 1320/1281/1321 1321/1282/1322 -f 1321/1282/1322 1312/1273/1313 1311/1272/1312 -f 1312/1273/1313 1321/1282/1322 1258/1219/1259 -f 929/99/930 939/110/940 1322/1283/1323 -f 1322/1283/1323 1313/1274/1314 929/99/930 -f 1313/1274/1314 1322/1283/1323 1323/1284/1324 -f 1323/1284/1324 1314/1275/1315 1313/1274/1314 -f 1314/1275/1315 1323/1284/1324 1324/1285/1325 -f 1324/1285/1325 1315/1276/1316 1314/1275/1315 -f 1315/1276/1316 1324/1285/1325 1325/1286/1326 -f 1325/1286/1326 1316/1277/1317 1315/1276/1316 -f 1316/1277/1317 1325/1286/1326 1326/1287/1327 -f 1326/1287/1327 1317/1278/1318 1316/1277/1317 -f 1317/1278/1318 1326/1287/1327 1327/1288/1328 -f 1327/1288/1328 1318/1279/1319 1317/1278/1318 -f 1318/1279/1319 1327/1288/1328 1328/1289/1329 -f 1328/1289/1329 1319/1280/1320 1318/1279/1319 -f 1319/1280/1320 1328/1289/1329 1329/1290/1330 -f 1329/1290/1330 1320/1281/1321 1319/1280/1320 -f 1320/1281/1321 1329/1290/1330 1330/1291/1331 -f 1330/1291/1331 1321/1282/1322 1320/1281/1321 -f 1321/1282/1322 1330/1291/1331 1258/1219/1259 -f 939/110/940 949/121/950 1331/1292/1332 -f 1331/1292/1332 1322/1283/1323 939/110/940 -f 1322/1283/1323 1331/1292/1332 1332/1293/1333 -f 1332/1293/1333 1323/1284/1324 1322/1283/1323 -f 1323/1284/1324 1332/1293/1333 1333/1294/1334 -f 1333/1294/1334 1324/1285/1325 1323/1284/1324 -f 1324/1285/1325 1333/1294/1334 1334/1295/1335 -f 1334/1295/1335 1325/1286/1326 1324/1285/1325 -f 1325/1286/1326 1334/1295/1335 1335/1296/1336 -f 1335/1296/1336 1326/1287/1327 1325/1286/1326 -f 1326/1287/1327 1335/1296/1336 1336/1297/1337 -f 1336/1297/1337 1327/1288/1328 1326/1287/1327 -f 1327/1288/1328 1336/1297/1337 1337/1298/1338 -f 1337/1298/1338 1328/1289/1329 1327/1288/1328 -f 1328/1289/1329 1337/1298/1338 1338/1299/1339 -f 1338/1299/1339 1329/1290/1330 1328/1289/1329 -f 1329/1290/1330 1338/1299/1339 1339/1300/1340 -f 1339/1300/1340 1330/1291/1331 1329/1290/1330 -f 1330/1291/1331 1339/1300/1340 1258/1219/1259 -f 949/121/950 959/132/960 1340/1301/1341 -f 1340/1301/1341 1331/1292/1332 949/121/950 -f 1331/1292/1332 1340/1301/1341 1341/1302/1342 -f 1341/1302/1342 1332/1293/1333 1331/1292/1332 -f 1332/1293/1333 1341/1302/1342 1342/1303/1343 -f 1342/1303/1343 1333/1294/1334 1332/1293/1333 -f 1333/1294/1334 1342/1303/1343 1343/1304/1344 -f 1343/1304/1344 1334/1295/1335 1333/1294/1334 -f 1334/1295/1335 1343/1304/1344 1344/1305/1345 -f 1344/1305/1345 1335/1296/1336 1334/1295/1335 -f 1335/1296/1336 1344/1305/1345 1345/1306/1346 -f 1345/1306/1346 1336/1297/1337 1335/1296/1336 -f 1336/1297/1337 1345/1306/1346 1346/1307/1347 -f 1346/1307/1347 1337/1298/1338 1336/1297/1337 -f 1337/1298/1338 1346/1307/1347 1347/1308/1348 -f 1347/1308/1348 1338/1299/1339 1337/1298/1338 -f 1338/1299/1339 1347/1308/1348 1348/1309/1349 -f 1348/1309/1349 1339/1300/1340 1338/1299/1339 -f 1339/1300/1340 1348/1309/1349 1258/1219/1259 -f 959/132/960 969/143/970 1349/1310/1350 -f 1349/1310/1350 1340/1301/1341 959/132/960 -f 1340/1301/1341 1349/1310/1350 1350/1311/1351 -f 1350/1311/1351 1341/1302/1342 1340/1301/1341 -f 1341/1302/1342 1350/1311/1351 1351/1312/1352 -f 1351/1312/1352 1342/1303/1343 1341/1302/1342 -f 1342/1303/1343 1351/1312/1352 1352/1313/1353 -f 1352/1313/1353 1343/1304/1344 1342/1303/1343 -f 1343/1304/1344 1352/1313/1353 1353/1314/1354 -f 1353/1314/1354 1344/1305/1345 1343/1304/1344 -f 1344/1305/1345 1353/1314/1354 1354/1315/1355 -f 1354/1315/1355 1345/1306/1346 1344/1305/1345 -f 1345/1306/1346 1354/1315/1355 1355/1316/1356 -f 1355/1316/1356 1346/1307/1347 1345/1306/1346 -f 1346/1307/1347 1355/1316/1356 1356/1317/1357 -f 1356/1317/1357 1347/1308/1348 1346/1307/1347 -f 1347/1308/1348 1356/1317/1357 1357/1318/1358 -f 1357/1318/1358 1348/1309/1349 1347/1308/1348 -f 1348/1309/1349 1357/1318/1358 1258/1219/1259 -f 969/143/970 979/154/980 1358/1319/1359 -f 1358/1319/1359 1349/1310/1350 969/143/970 -f 1349/1310/1350 1358/1319/1359 1359/1320/1360 -f 1359/1320/1360 1350/1311/1351 1349/1310/1350 -f 1350/1311/1351 1359/1320/1360 1360/1321/1361 -f 1360/1321/1361 1351/1312/1352 1350/1311/1351 -f 1351/1312/1352 1360/1321/1361 1361/1322/1362 -f 1361/1322/1362 1352/1313/1353 1351/1312/1352 -f 1352/1313/1353 1361/1322/1362 1362/1323/1363 -f 1362/1323/1363 1353/1314/1354 1352/1313/1353 -f 1353/1314/1354 1362/1323/1363 1363/1324/1364 -f 1363/1324/1364 1354/1315/1355 1353/1314/1354 -f 1354/1315/1355 1363/1324/1364 1364/1325/1365 -f 1364/1325/1365 1355/1316/1356 1354/1315/1355 -f 1355/1316/1356 1364/1325/1365 1365/1326/1366 -f 1365/1326/1366 1356/1317/1357 1355/1316/1356 -f 1356/1317/1357 1365/1326/1366 1366/1327/1367 -f 1366/1327/1367 1357/1318/1358 1356/1317/1357 -f 1357/1318/1358 1366/1327/1367 1258/1219/1259 -f 979/154/980 989/165/990 1367/1328/1368 -f 1367/1328/1368 1358/1319/1359 979/154/980 -f 1358/1319/1359 1367/1328/1368 1368/1329/1369 -f 1368/1329/1369 1359/1320/1360 1358/1319/1359 -f 1359/1320/1360 1368/1329/1369 1369/1330/1370 -f 1369/1330/1370 1360/1321/1361 1359/1320/1360 -f 1360/1321/1361 1369/1330/1370 1370/1331/1371 -f 1370/1331/1371 1361/1322/1362 1360/1321/1361 -f 1361/1322/1362 1370/1331/1371 1371/1332/1372 -f 1371/1332/1372 1362/1323/1363 1361/1322/1362 -f 1362/1323/1363 1371/1332/1372 1372/1333/1373 -f 1372/1333/1373 1363/1324/1364 1362/1323/1363 -f 1363/1324/1364 1372/1333/1373 1373/1334/1374 -f 1373/1334/1374 1364/1325/1365 1363/1324/1364 -f 1364/1325/1365 1373/1334/1374 1374/1335/1375 -f 1374/1335/1375 1365/1326/1366 1364/1325/1365 -f 1365/1326/1366 1374/1335/1375 1375/1336/1376 -f 1375/1336/1376 1366/1327/1367 1365/1326/1366 -f 1366/1327/1367 1375/1336/1376 1258/1219/1259 -f 989/165/990 999/176/1000 1376/1337/1377 -f 1376/1337/1377 1367/1328/1368 989/165/990 -f 1367/1328/1368 1376/1337/1377 1377/1338/1378 -f 1377/1338/1378 1368/1329/1369 1367/1328/1368 -f 1368/1329/1369 1377/1338/1378 1378/1339/1379 -f 1378/1339/1379 1369/1330/1370 1368/1329/1369 -f 1369/1330/1370 1378/1339/1379 1379/1340/1380 -f 1379/1340/1380 1370/1331/1371 1369/1330/1370 -f 1370/1331/1371 1379/1340/1380 1380/1341/1381 -f 1380/1341/1381 1371/1332/1372 1370/1331/1371 -f 1371/1332/1372 1380/1341/1381 1381/1342/1382 -f 1381/1342/1382 1372/1333/1373 1371/1332/1372 -f 1372/1333/1373 1381/1342/1382 1382/1343/1383 -f 1382/1343/1383 1373/1334/1374 1372/1333/1373 -f 1373/1334/1374 1382/1343/1383 1383/1344/1384 -f 1383/1344/1384 1374/1335/1375 1373/1334/1374 -f 1374/1335/1375 1383/1344/1384 1384/1345/1385 -f 1384/1345/1385 1375/1336/1376 1374/1335/1375 -f 1375/1336/1376 1384/1345/1385 1258/1219/1259 -f 999/176/1000 1009/187/1010 1385/1346/1386 -f 1385/1346/1386 1376/1337/1377 999/176/1000 -f 1376/1337/1377 1385/1346/1386 1386/1347/1387 -f 1386/1347/1387 1377/1338/1378 1376/1337/1377 -f 1377/1338/1378 1386/1347/1387 1387/1348/1388 -f 1387/1348/1388 1378/1339/1379 1377/1338/1378 -f 1378/1339/1379 1387/1348/1388 1388/1349/1389 -f 1388/1349/1389 1379/1340/1380 1378/1339/1379 -f 1379/1340/1380 1388/1349/1389 1389/1350/1390 -f 1389/1350/1390 1380/1341/1381 1379/1340/1380 -f 1380/1341/1381 1389/1350/1390 1390/1351/1391 -f 1390/1351/1391 1381/1342/1382 1380/1341/1381 -f 1381/1342/1382 1390/1351/1391 1391/1352/1392 -f 1391/1352/1392 1382/1343/1383 1381/1342/1382 -f 1382/1343/1383 1391/1352/1392 1392/1353/1393 -f 1392/1353/1393 1383/1344/1384 1382/1343/1383 -f 1383/1344/1384 1392/1353/1393 1393/1354/1394 -f 1393/1354/1394 1384/1345/1385 1383/1344/1384 -f 1384/1345/1385 1393/1354/1394 1258/1219/1259 -f 1009/187/1010 1019/198/1020 1394/1355/1395 -f 1394/1355/1395 1385/1346/1386 1009/187/1010 -f 1385/1346/1386 1394/1355/1395 1395/1356/1396 -f 1395/1356/1396 1386/1347/1387 1385/1346/1386 -f 1386/1347/1387 1395/1356/1396 1396/1357/1397 -f 1396/1357/1397 1387/1348/1388 1386/1347/1387 -f 1387/1348/1388 1396/1357/1397 1397/1358/1398 -f 1397/1358/1398 1388/1349/1389 1387/1348/1388 -f 1388/1349/1389 1397/1358/1398 1398/1359/1399 -f 1398/1359/1399 1389/1350/1390 1388/1349/1389 -f 1389/1350/1390 1398/1359/1399 1399/1360/1400 -f 1399/1360/1400 1390/1351/1391 1389/1350/1390 -f 1390/1351/1391 1399/1360/1400 1400/1361/1401 -f 1400/1361/1401 1391/1352/1392 1390/1351/1391 -f 1391/1352/1392 1400/1361/1401 1401/1362/1402 -f 1401/1362/1402 1392/1353/1393 1391/1352/1392 -f 1392/1353/1393 1401/1362/1402 1402/1363/1403 -f 1402/1363/1403 1393/1354/1394 1392/1353/1393 -f 1393/1354/1394 1402/1363/1403 1258/1219/1259 -f 1019/198/1020 1029/209/1030 1403/1364/1404 -f 1403/1364/1404 1394/1355/1395 1019/198/1020 -f 1394/1355/1395 1403/1364/1404 1404/1365/1405 -f 1404/1365/1405 1395/1356/1396 1394/1355/1395 -f 1395/1356/1396 1404/1365/1405 1405/1366/1406 -f 1405/1366/1406 1396/1357/1397 1395/1356/1396 -f 1396/1357/1397 1405/1366/1406 1406/1367/1407 -f 1406/1367/1407 1397/1358/1398 1396/1357/1397 -f 1397/1358/1398 1406/1367/1407 1407/1368/1408 -f 1407/1368/1408 1398/1359/1399 1397/1358/1398 -f 1398/1359/1399 1407/1368/1408 1408/1369/1409 -f 1408/1369/1409 1399/1360/1400 1398/1359/1399 -f 1399/1360/1400 1408/1369/1409 1409/1370/1410 -f 1409/1370/1410 1400/1361/1401 1399/1360/1400 -f 1400/1361/1401 1409/1370/1410 1410/1371/1411 -f 1410/1371/1411 1401/1362/1402 1400/1361/1401 -f 1401/1362/1402 1410/1371/1411 1411/1372/1412 -f 1411/1372/1412 1402/1363/1403 1401/1362/1402 -f 1402/1363/1403 1411/1372/1412 1258/1219/1259 -f 1029/209/1030 1039/220/1040 1412/1373/1413 -f 1412/1373/1413 1403/1364/1404 1029/209/1030 -f 1403/1364/1404 1412/1373/1413 1413/1374/1414 -f 1413/1374/1414 1404/1365/1405 1403/1364/1404 -f 1404/1365/1405 1413/1374/1414 1414/1375/1415 -f 1414/1375/1415 1405/1366/1406 1404/1365/1405 -f 1405/1366/1406 1414/1375/1415 1415/1376/1416 -f 1415/1376/1416 1406/1367/1407 1405/1366/1406 -f 1406/1367/1407 1415/1376/1416 1416/1377/1417 -f 1416/1377/1417 1407/1368/1408 1406/1367/1407 -f 1407/1368/1408 1416/1377/1417 1417/1378/1418 -f 1417/1378/1418 1408/1369/1409 1407/1368/1408 -f 1408/1369/1409 1417/1378/1418 1418/1379/1419 -f 1418/1379/1419 1409/1370/1410 1408/1369/1409 -f 1409/1370/1410 1418/1379/1419 1419/1380/1420 -f 1419/1380/1420 1410/1371/1411 1409/1370/1410 -f 1410/1371/1411 1419/1380/1420 1420/1381/1421 -f 1420/1381/1421 1411/1372/1412 1410/1371/1411 -f 1411/1372/1412 1420/1381/1421 1258/1219/1259 -f 1039/220/1040 1049/231/1050 1421/1382/1422 -f 1421/1382/1422 1412/1373/1413 1039/220/1040 -f 1412/1373/1413 1421/1382/1422 1422/1383/1423 -f 1422/1383/1423 1413/1374/1414 1412/1373/1413 -f 1413/1374/1414 1422/1383/1423 1423/1384/1424 -f 1423/1384/1424 1414/1375/1415 1413/1374/1414 -f 1414/1375/1415 1423/1384/1424 1424/1385/1425 -f 1424/1385/1425 1415/1376/1416 1414/1375/1415 -f 1415/1376/1416 1424/1385/1425 1425/1386/1426 -f 1425/1386/1426 1416/1377/1417 1415/1376/1416 -f 1416/1377/1417 1425/1386/1426 1426/1387/1427 -f 1426/1387/1427 1417/1378/1418 1416/1377/1417 -f 1417/1378/1418 1426/1387/1427 1427/1388/1428 -f 1427/1388/1428 1418/1379/1419 1417/1378/1418 -f 1418/1379/1419 1427/1388/1428 1428/1389/1429 -f 1428/1389/1429 1419/1380/1420 1418/1379/1419 -f 1419/1380/1420 1428/1389/1429 1429/1390/1430 -f 1429/1390/1430 1420/1381/1421 1419/1380/1420 -f 1420/1381/1421 1429/1390/1430 1258/1219/1259 -f 1049/231/1050 1059/242/1060 1430/1391/1431 -f 1430/1391/1431 1421/1382/1422 1049/231/1050 -f 1421/1382/1422 1430/1391/1431 1431/1392/1432 -f 1431/1392/1432 1422/1383/1423 1421/1382/1422 -f 1422/1383/1423 1431/1392/1432 1432/1393/1433 -f 1432/1393/1433 1423/1384/1424 1422/1383/1423 -f 1423/1384/1424 1432/1393/1433 1433/1394/1434 -f 1433/1394/1434 1424/1385/1425 1423/1384/1424 -f 1424/1385/1425 1433/1394/1434 1434/1395/1435 -f 1434/1395/1435 1425/1386/1426 1424/1385/1425 -f 1425/1386/1426 1434/1395/1435 1435/1396/1436 -f 1435/1396/1436 1426/1387/1427 1425/1386/1426 -f 1426/1387/1427 1435/1396/1436 1436/1397/1437 -f 1436/1397/1437 1427/1388/1428 1426/1387/1427 -f 1427/1388/1428 1436/1397/1437 1437/1398/1438 -f 1437/1398/1438 1428/1389/1429 1427/1388/1428 -f 1428/1389/1429 1437/1398/1438 1438/1399/1439 -f 1438/1399/1439 1429/1390/1430 1428/1389/1429 -f 1429/1390/1430 1438/1399/1439 1258/1219/1259 -f 1059/242/1060 1069/253/1070 1439/1400/1440 -f 1439/1400/1440 1430/1391/1431 1059/242/1060 -f 1430/1391/1431 1439/1400/1440 1440/1401/1441 -f 1440/1401/1441 1431/1392/1432 1430/1391/1431 -f 1431/1392/1432 1440/1401/1441 1441/1402/1442 -f 1441/1402/1442 1432/1393/1433 1431/1392/1432 -f 1432/1393/1433 1441/1402/1442 1442/1403/1443 -f 1442/1403/1443 1433/1394/1434 1432/1393/1433 -f 1433/1394/1434 1442/1403/1443 1443/1404/1444 -f 1443/1404/1444 1434/1395/1435 1433/1394/1434 -f 1434/1395/1435 1443/1404/1444 1444/1405/1445 -f 1444/1405/1445 1435/1396/1436 1434/1395/1435 -f 1435/1396/1436 1444/1405/1445 1445/1406/1446 -f 1445/1406/1446 1436/1397/1437 1435/1396/1436 -f 1436/1397/1437 1445/1406/1446 1446/1407/1447 -f 1446/1407/1447 1437/1398/1438 1436/1397/1437 -f 1437/1398/1438 1446/1407/1447 1447/1408/1448 -f 1447/1408/1448 1438/1399/1439 1437/1398/1438 -f 1438/1399/1439 1447/1408/1448 1258/1219/1259 -f 1069/253/1070 1079/264/1080 1448/1409/1449 -f 1448/1409/1449 1439/1400/1440 1069/253/1070 -f 1439/1400/1440 1448/1409/1449 1449/1410/1450 -f 1449/1410/1450 1440/1401/1441 1439/1400/1440 -f 1440/1401/1441 1449/1410/1450 1450/1411/1451 -f 1450/1411/1451 1441/1402/1442 1440/1401/1441 -f 1441/1402/1442 1450/1411/1451 1451/1412/1452 -f 1451/1412/1452 1442/1403/1443 1441/1402/1442 -f 1442/1403/1443 1451/1412/1452 1452/1413/1453 -f 1452/1413/1453 1443/1404/1444 1442/1403/1443 -f 1443/1404/1444 1452/1413/1453 1453/1414/1454 -f 1453/1414/1454 1444/1405/1445 1443/1404/1444 -f 1444/1405/1445 1453/1414/1454 1454/1415/1455 -f 1454/1415/1455 1445/1406/1446 1444/1405/1445 -f 1445/1406/1446 1454/1415/1455 1455/1416/1456 -f 1455/1416/1456 1446/1407/1447 1445/1406/1446 -f 1446/1407/1447 1455/1416/1456 1456/1417/1457 -f 1456/1417/1457 1447/1408/1448 1446/1407/1447 -f 1447/1408/1448 1456/1417/1457 1258/1219/1259 -f 1079/264/1080 1089/275/1090 1457/1418/1458 -f 1457/1418/1458 1448/1409/1449 1079/264/1080 -f 1448/1409/1449 1457/1418/1458 1458/1419/1459 -f 1458/1419/1459 1449/1410/1450 1448/1409/1449 -f 1449/1410/1450 1458/1419/1459 1459/1420/1460 -f 1459/1420/1460 1450/1411/1451 1449/1410/1450 -f 1450/1411/1451 1459/1420/1460 1460/1421/1461 -f 1460/1421/1461 1451/1412/1452 1450/1411/1451 -f 1451/1412/1452 1460/1421/1461 1461/1422/1462 -f 1461/1422/1462 1452/1413/1453 1451/1412/1452 -f 1452/1413/1453 1461/1422/1462 1462/1423/1463 -f 1462/1423/1463 1453/1414/1454 1452/1413/1453 -f 1453/1414/1454 1462/1423/1463 1463/1424/1464 -f 1463/1424/1464 1454/1415/1455 1453/1414/1454 -f 1454/1415/1455 1463/1424/1464 1464/1425/1465 -f 1464/1425/1465 1455/1416/1456 1454/1415/1455 -f 1455/1416/1456 1464/1425/1465 1465/1426/1466 -f 1465/1426/1466 1456/1417/1457 1455/1416/1456 -f 1456/1417/1457 1465/1426/1466 1258/1219/1259 -f 1089/275/1090 1099/286/1100 1466/1427/1467 -f 1466/1427/1467 1457/1418/1458 1089/275/1090 -f 1457/1418/1458 1466/1427/1467 1467/1428/1468 -f 1467/1428/1468 1458/1419/1459 1457/1418/1458 -f 1458/1419/1459 1467/1428/1468 1468/1429/1469 -f 1468/1429/1469 1459/1420/1460 1458/1419/1459 -f 1459/1420/1460 1468/1429/1469 1469/1430/1470 -f 1469/1430/1470 1460/1421/1461 1459/1420/1460 -f 1460/1421/1461 1469/1430/1470 1470/1431/1471 -f 1470/1431/1471 1461/1422/1462 1460/1421/1461 -f 1461/1422/1462 1470/1431/1471 1471/1432/1472 -f 1471/1432/1472 1462/1423/1463 1461/1422/1462 -f 1462/1423/1463 1471/1432/1472 1472/1433/1473 -f 1472/1433/1473 1463/1424/1464 1462/1423/1463 -f 1463/1424/1464 1472/1433/1473 1473/1434/1474 -f 1473/1434/1474 1464/1425/1465 1463/1424/1464 -f 1464/1425/1465 1473/1434/1474 1474/1435/1475 -f 1474/1435/1475 1465/1426/1466 1464/1425/1465 -f 1465/1426/1466 1474/1435/1475 1258/1219/1259 -f 1099/286/1100 1109/297/1110 1475/1436/1476 -f 1475/1436/1476 1466/1427/1467 1099/286/1100 -f 1466/1427/1467 1475/1436/1476 1476/1437/1477 -f 1476/1437/1477 1467/1428/1468 1466/1427/1467 -f 1467/1428/1468 1476/1437/1477 1477/1438/1478 -f 1477/1438/1478 1468/1429/1469 1467/1428/1468 -f 1468/1429/1469 1477/1438/1478 1478/1439/1479 -f 1478/1439/1479 1469/1430/1470 1468/1429/1469 -f 1469/1430/1470 1478/1439/1479 1479/1440/1480 -f 1479/1440/1480 1470/1431/1471 1469/1430/1470 -f 1470/1431/1471 1479/1440/1480 1480/1441/1481 -f 1480/1441/1481 1471/1432/1472 1470/1431/1471 -f 1471/1432/1472 1480/1441/1481 1481/1442/1482 -f 1481/1442/1482 1472/1433/1473 1471/1432/1472 -f 1472/1433/1473 1481/1442/1482 1482/1443/1483 -f 1482/1443/1483 1473/1434/1474 1472/1433/1473 -f 1473/1434/1474 1482/1443/1483 1483/1444/1484 -f 1483/1444/1484 1474/1435/1475 1473/1434/1474 -f 1474/1435/1475 1483/1444/1484 1258/1219/1259 -f 1109/297/1110 1119/308/1120 1484/1445/1485 -f 1484/1445/1485 1475/1436/1476 1109/297/1110 -f 1475/1436/1476 1484/1445/1485 1485/1446/1486 -f 1485/1446/1486 1476/1437/1477 1475/1436/1476 -f 1476/1437/1477 1485/1446/1486 1486/1447/1487 -f 1486/1447/1487 1477/1438/1478 1476/1437/1477 -f 1477/1438/1478 1486/1447/1487 1487/1448/1488 -f 1487/1448/1488 1478/1439/1479 1477/1438/1478 -f 1478/1439/1479 1487/1448/1488 1488/1449/1489 -f 1488/1449/1489 1479/1440/1480 1478/1439/1479 -f 1479/1440/1480 1488/1449/1489 1489/1450/1490 -f 1489/1450/1490 1480/1441/1481 1479/1440/1480 -f 1480/1441/1481 1489/1450/1490 1490/1451/1491 -f 1490/1451/1491 1481/1442/1482 1480/1441/1481 -f 1481/1442/1482 1490/1451/1491 1491/1452/1492 -f 1491/1452/1492 1482/1443/1483 1481/1442/1482 -f 1482/1443/1483 1491/1452/1492 1492/1453/1493 -f 1492/1453/1493 1483/1444/1484 1482/1443/1483 -f 1483/1444/1484 1492/1453/1493 1258/1219/1259 -f 1119/308/1120 1129/319/1130 1493/1454/1494 -f 1493/1454/1494 1484/1445/1485 1119/308/1120 -f 1484/1445/1485 1493/1454/1494 1494/1455/1495 -f 1494/1455/1495 1485/1446/1486 1484/1445/1485 -f 1485/1446/1486 1494/1455/1495 1495/1456/1496 -f 1495/1456/1496 1486/1447/1487 1485/1446/1486 -f 1486/1447/1487 1495/1456/1496 1496/1457/1497 -f 1496/1457/1497 1487/1448/1488 1486/1447/1487 -f 1487/1448/1488 1496/1457/1497 1497/1458/1498 -f 1497/1458/1498 1488/1449/1489 1487/1448/1488 -f 1488/1449/1489 1497/1458/1498 1498/1459/1499 -f 1498/1459/1499 1489/1450/1490 1488/1449/1489 -f 1489/1450/1490 1498/1459/1499 1499/1460/1500 -f 1499/1460/1500 1490/1451/1491 1489/1450/1490 -f 1490/1451/1491 1499/1460/1500 1500/1461/1501 -f 1500/1461/1501 1491/1452/1492 1490/1451/1491 -f 1491/1452/1492 1500/1461/1501 1501/1462/1502 -f 1501/1462/1502 1492/1453/1493 1491/1452/1492 -f 1492/1453/1493 1501/1462/1502 1258/1219/1259 -f 1129/319/1130 1139/330/1140 1502/1463/1503 -f 1502/1463/1503 1493/1454/1494 1129/319/1130 -f 1493/1454/1494 1502/1463/1503 1503/1464/1504 -f 1503/1464/1504 1494/1455/1495 1493/1454/1494 -f 1494/1455/1495 1503/1464/1504 1504/1465/1505 -f 1504/1465/1505 1495/1456/1496 1494/1455/1495 -f 1495/1456/1496 1504/1465/1505 1505/1466/1506 -f 1505/1466/1506 1496/1457/1497 1495/1456/1496 -f 1496/1457/1497 1505/1466/1506 1506/1467/1507 -f 1506/1467/1507 1497/1458/1498 1496/1457/1497 -f 1497/1458/1498 1506/1467/1507 1507/1468/1508 -f 1507/1468/1508 1498/1459/1499 1497/1458/1498 -f 1498/1459/1499 1507/1468/1508 1508/1469/1509 -f 1508/1469/1509 1499/1460/1500 1498/1459/1499 -f 1499/1460/1500 1508/1469/1509 1509/1470/1510 -f 1509/1470/1510 1500/1461/1501 1499/1460/1500 -f 1500/1461/1501 1509/1470/1510 1510/1471/1511 -f 1510/1471/1511 1501/1462/1502 1500/1461/1501 -f 1501/1462/1502 1510/1471/1511 1258/1219/1259 -f 1139/330/1140 1149/341/1150 1511/1472/1512 -f 1511/1472/1512 1502/1463/1503 1139/330/1140 -f 1502/1463/1503 1511/1472/1512 1512/1473/1513 -f 1512/1473/1513 1503/1464/1504 1502/1463/1503 -f 1503/1464/1504 1512/1473/1513 1513/1474/1514 -f 1513/1474/1514 1504/1465/1505 1503/1464/1504 -f 1504/1465/1505 1513/1474/1514 1514/1475/1515 -f 1514/1475/1515 1505/1466/1506 1504/1465/1505 -f 1505/1466/1506 1514/1475/1515 1515/1476/1516 -f 1515/1476/1516 1506/1467/1507 1505/1466/1506 -f 1506/1467/1507 1515/1476/1516 1516/1477/1517 -f 1516/1477/1517 1507/1468/1508 1506/1467/1507 -f 1507/1468/1508 1516/1477/1517 1517/1478/1518 -f 1517/1478/1518 1508/1469/1509 1507/1468/1508 -f 1508/1469/1509 1517/1478/1518 1518/1479/1519 -f 1518/1479/1519 1509/1470/1510 1508/1469/1509 -f 1509/1470/1510 1518/1479/1519 1519/1480/1520 -f 1519/1480/1520 1510/1471/1511 1509/1470/1510 -f 1510/1471/1511 1519/1480/1520 1258/1219/1259 -f 1149/341/1150 1159/352/1160 1520/1481/1521 -f 1520/1481/1521 1511/1472/1512 1149/341/1150 -f 1511/1472/1512 1520/1481/1521 1521/1482/1522 -f 1521/1482/1522 1512/1473/1513 1511/1472/1512 -f 1512/1473/1513 1521/1482/1522 1522/1483/1523 -f 1522/1483/1523 1513/1474/1514 1512/1473/1513 -f 1513/1474/1514 1522/1483/1523 1523/1484/1524 -f 1523/1484/1524 1514/1475/1515 1513/1474/1514 -f 1514/1475/1515 1523/1484/1524 1524/1485/1525 -f 1524/1485/1525 1515/1476/1516 1514/1475/1515 -f 1515/1476/1516 1524/1485/1525 1525/1486/1526 -f 1525/1486/1526 1516/1477/1517 1515/1476/1516 -f 1516/1477/1517 1525/1486/1526 1526/1487/1527 -f 1526/1487/1527 1517/1478/1518 1516/1477/1517 -f 1517/1478/1518 1526/1487/1527 1527/1488/1528 -f 1527/1488/1528 1518/1479/1519 1517/1478/1518 -f 1518/1479/1519 1527/1488/1528 1528/1489/1529 -f 1528/1489/1529 1519/1480/1520 1518/1479/1519 -f 1519/1480/1520 1528/1489/1529 1258/1219/1259 -f 1159/352/1160 1169/363/1170 1529/1490/1530 -f 1529/1490/1530 1520/1481/1521 1159/352/1160 -f 1520/1481/1521 1529/1490/1530 1530/1491/1531 -f 1530/1491/1531 1521/1482/1522 1520/1481/1521 -f 1521/1482/1522 1530/1491/1531 1531/1492/1532 -f 1531/1492/1532 1522/1483/1523 1521/1482/1522 -f 1522/1483/1523 1531/1492/1532 1532/1493/1533 -f 1532/1493/1533 1523/1484/1524 1522/1483/1523 -f 1523/1484/1524 1532/1493/1533 1533/1494/1534 -f 1533/1494/1534 1524/1485/1525 1523/1484/1524 -f 1524/1485/1525 1533/1494/1534 1534/1495/1535 -f 1534/1495/1535 1525/1486/1526 1524/1485/1525 -f 1525/1486/1526 1534/1495/1535 1535/1496/1536 -f 1535/1496/1536 1526/1487/1527 1525/1486/1526 -f 1526/1487/1527 1535/1496/1536 1536/1497/1537 -f 1536/1497/1537 1527/1488/1528 1526/1487/1527 -f 1527/1488/1528 1536/1497/1537 1537/1498/1538 -f 1537/1498/1538 1528/1489/1529 1527/1488/1528 -f 1528/1489/1529 1537/1498/1538 1258/1219/1259 -f 1169/363/1170 1179/374/1180 1538/1499/1539 -f 1538/1499/1539 1529/1490/1530 1169/363/1170 -f 1529/1490/1530 1538/1499/1539 1539/1500/1540 -f 1539/1500/1540 1530/1491/1531 1529/1490/1530 -f 1530/1491/1531 1539/1500/1540 1540/1501/1541 -f 1540/1501/1541 1531/1492/1532 1530/1491/1531 -f 1531/1492/1532 1540/1501/1541 1541/1502/1542 -f 1541/1502/1542 1532/1493/1533 1531/1492/1532 -f 1532/1493/1533 1541/1502/1542 1542/1503/1543 -f 1542/1503/1543 1533/1494/1534 1532/1493/1533 -f 1533/1494/1534 1542/1503/1543 1543/1504/1544 -f 1543/1504/1544 1534/1495/1535 1533/1494/1534 -f 1534/1495/1535 1543/1504/1544 1544/1505/1545 -f 1544/1505/1545 1535/1496/1536 1534/1495/1535 -f 1535/1496/1536 1544/1505/1545 1545/1506/1546 -f 1545/1506/1546 1536/1497/1537 1535/1496/1536 -f 1536/1497/1537 1545/1506/1546 1546/1507/1547 -f 1546/1507/1547 1537/1498/1538 1536/1497/1537 -f 1537/1498/1538 1546/1507/1547 1258/1219/1259 -f 1179/374/1180 1189/385/1190 1547/1508/1548 -f 1547/1508/1548 1538/1499/1539 1179/374/1180 -f 1538/1499/1539 1547/1508/1548 1548/1509/1549 -f 1548/1509/1549 1539/1500/1540 1538/1499/1539 -f 1539/1500/1540 1548/1509/1549 1549/1510/1550 -f 1549/1510/1550 1540/1501/1541 1539/1500/1540 -f 1540/1501/1541 1549/1510/1550 1550/1511/1551 -f 1550/1511/1551 1541/1502/1542 1540/1501/1541 -f 1541/1502/1542 1550/1511/1551 1551/1512/1552 -f 1551/1512/1552 1542/1503/1543 1541/1502/1542 -f 1542/1503/1543 1551/1512/1552 1552/1513/1553 -f 1552/1513/1553 1543/1504/1544 1542/1503/1543 -f 1543/1504/1544 1552/1513/1553 1553/1514/1554 -f 1553/1514/1554 1544/1505/1545 1543/1504/1544 -f 1544/1505/1545 1553/1514/1554 1554/1515/1555 -f 1554/1515/1555 1545/1506/1546 1544/1505/1545 -f 1545/1506/1546 1554/1515/1555 1555/1516/1556 -f 1555/1516/1556 1546/1507/1547 1545/1506/1546 -f 1546/1507/1547 1555/1516/1556 1258/1219/1259 -f 1189/385/1190 1199/396/1200 1556/1517/1557 -f 1556/1517/1557 1547/1508/1548 1189/385/1190 -f 1547/1508/1548 1556/1517/1557 1557/1518/1558 -f 1557/1518/1558 1548/1509/1549 1547/1508/1548 -f 1548/1509/1549 1557/1518/1558 1558/1519/1559 -f 1558/1519/1559 1549/1510/1550 1548/1509/1549 -f 1549/1510/1550 1558/1519/1559 1559/1520/1560 -f 1559/1520/1560 1550/1511/1551 1549/1510/1550 -f 1550/1511/1551 1559/1520/1560 1560/1521/1561 -f 1560/1521/1561 1551/1512/1552 1550/1511/1551 -f 1551/1512/1552 1560/1521/1561 1561/1522/1562 -f 1561/1522/1562 1552/1513/1553 1551/1512/1552 -f 1552/1513/1553 1561/1522/1562 1562/1523/1563 -f 1562/1523/1563 1553/1514/1554 1552/1513/1553 -f 1553/1514/1554 1562/1523/1563 1563/1524/1564 -f 1563/1524/1564 1554/1515/1555 1553/1514/1554 -f 1554/1515/1555 1563/1524/1564 1564/1525/1565 -f 1564/1525/1565 1555/1516/1556 1554/1515/1555 -f 1555/1516/1556 1564/1525/1565 1258/1219/1259 -f 1199/396/1200 1209/407/1210 1565/1526/1566 -f 1565/1526/1566 1556/1517/1557 1199/396/1200 -f 1556/1517/1557 1565/1526/1566 1566/1527/1567 -f 1566/1527/1567 1557/1518/1558 1556/1517/1557 -f 1557/1518/1558 1566/1527/1567 1567/1528/1568 -f 1567/1528/1568 1558/1519/1559 1557/1518/1558 -f 1558/1519/1559 1567/1528/1568 1568/1529/1569 -f 1568/1529/1569 1559/1520/1560 1558/1519/1559 -f 1559/1520/1560 1568/1529/1569 1569/1530/1570 -f 1569/1530/1570 1560/1521/1561 1559/1520/1560 -f 1560/1521/1561 1569/1530/1570 1570/1531/1571 -f 1570/1531/1571 1561/1522/1562 1560/1521/1561 -f 1561/1522/1562 1570/1531/1571 1571/1532/1572 -f 1571/1532/1572 1562/1523/1563 1561/1522/1562 -f 1562/1523/1563 1571/1532/1572 1572/1533/1573 -f 1572/1533/1573 1563/1524/1564 1562/1523/1563 -f 1563/1524/1564 1572/1533/1573 1573/1534/1574 -f 1573/1534/1574 1564/1525/1565 1563/1524/1564 -f 1564/1525/1565 1573/1534/1574 1258/1219/1259 -f 1209/407/1210 1219/418/1220 1574/1535/1575 -f 1574/1535/1575 1565/1526/1566 1209/407/1210 -f 1565/1526/1566 1574/1535/1575 1575/1536/1576 -f 1575/1536/1576 1566/1527/1567 1565/1526/1566 -f 1566/1527/1567 1575/1536/1576 1576/1537/1577 -f 1576/1537/1577 1567/1528/1568 1566/1527/1567 -f 1567/1528/1568 1576/1537/1577 1577/1538/1578 -f 1577/1538/1578 1568/1529/1569 1567/1528/1568 -f 1568/1529/1569 1577/1538/1578 1578/1539/1579 -f 1578/1539/1579 1569/1530/1570 1568/1529/1569 -f 1569/1530/1570 1578/1539/1579 1579/1540/1580 -f 1579/1540/1580 1570/1531/1571 1569/1530/1570 -f 1570/1531/1571 1579/1540/1580 1580/1541/1581 -f 1580/1541/1581 1571/1532/1572 1570/1531/1571 -f 1571/1532/1572 1580/1541/1581 1581/1542/1582 -f 1581/1542/1582 1572/1533/1573 1571/1532/1572 -f 1572/1533/1573 1581/1542/1582 1582/1543/1583 -f 1582/1543/1583 1573/1534/1574 1572/1533/1573 -f 1573/1534/1574 1582/1543/1583 1258/1219/1259 -f 1219/418/1220 1229/429/1230 1583/1544/1584 -f 1583/1544/1584 1574/1535/1575 1219/418/1220 -f 1574/1535/1575 1583/1544/1584 1584/1545/1585 -f 1584/1545/1585 1575/1536/1576 1574/1535/1575 -f 1575/1536/1576 1584/1545/1585 1585/1546/1586 -f 1585/1546/1586 1576/1537/1577 1575/1536/1576 -f 1576/1537/1577 1585/1546/1586 1586/1547/1587 -f 1586/1547/1587 1577/1538/1578 1576/1537/1577 -f 1577/1538/1578 1586/1547/1587 1587/1548/1588 -f 1587/1548/1588 1578/1539/1579 1577/1538/1578 -f 1578/1539/1579 1587/1548/1588 1588/1549/1589 -f 1588/1549/1589 1579/1540/1580 1578/1539/1579 -f 1579/1540/1580 1588/1549/1589 1589/1550/1590 -f 1589/1550/1590 1580/1541/1581 1579/1540/1580 -f 1580/1541/1581 1589/1550/1590 1590/1551/1591 -f 1590/1551/1591 1581/1542/1582 1580/1541/1581 -f 1581/1542/1582 1590/1551/1591 1591/1552/1592 -f 1591/1552/1592 1582/1543/1583 1581/1542/1582 -f 1582/1543/1583 1591/1552/1592 1258/1219/1259 -f 1229/429/1230 1239/440/1240 1592/1553/1593 -f 1592/1553/1593 1583/1544/1584 1229/429/1230 -f 1583/1544/1584 1592/1553/1593 1593/1554/1594 -f 1593/1554/1594 1584/1545/1585 1583/1544/1584 -f 1584/1545/1585 1593/1554/1594 1594/1555/1595 -f 1594/1555/1595 1585/1546/1586 1584/1545/1585 -f 1585/1546/1586 1594/1555/1595 1595/1556/1596 -f 1595/1556/1596 1586/1547/1587 1585/1546/1586 -f 1586/1547/1587 1595/1556/1596 1596/1557/1597 -f 1596/1557/1597 1587/1548/1588 1586/1547/1587 -f 1587/1548/1588 1596/1557/1597 1597/1558/1598 -f 1597/1558/1598 1588/1549/1589 1587/1548/1588 -f 1588/1549/1589 1597/1558/1598 1598/1559/1599 -f 1598/1559/1599 1589/1550/1590 1588/1549/1589 -f 1589/1550/1590 1598/1559/1599 1599/1560/1600 -f 1599/1560/1600 1590/1551/1591 1589/1550/1590 -f 1590/1551/1591 1599/1560/1600 1600/1561/1601 -f 1600/1561/1601 1591/1552/1592 1590/1551/1591 -f 1591/1552/1592 1600/1561/1601 1258/1219/1259 -f 1239/440/1240 859/22/860 1241/1202/1242 -f 1241/1202/1242 1592/1553/1593 1239/440/1240 -f 1592/1553/1593 1241/1202/1242 1243/1204/1244 -f 1243/1204/1244 1593/1554/1594 1592/1553/1593 -f 1593/1554/1594 1243/1204/1244 1245/1206/1246 -f 1245/1206/1246 1594/1555/1595 1593/1554/1594 -f 1594/1555/1595 1245/1206/1246 1247/1208/1248 -f 1247/1208/1248 1595/1556/1596 1594/1555/1595 -f 1595/1556/1596 1247/1208/1248 1249/1210/1250 -f 1249/1210/1250 1596/1557/1597 1595/1556/1596 -f 1596/1557/1597 1249/1210/1250 1251/1212/1252 -f 1251/1212/1252 1597/1558/1598 1596/1557/1597 -f 1597/1558/1598 1251/1212/1252 1253/1214/1254 -f 1253/1214/1254 1598/1559/1599 1597/1558/1598 -f 1598/1559/1599 1253/1214/1254 1255/1216/1256 -f 1255/1216/1256 1599/1560/1600 1598/1559/1599 -f 1599/1560/1600 1255/1216/1256 1257/1218/1258 -f 1257/1218/1258 1600/1561/1601 1599/1560/1600 -f 1600/1561/1601 1257/1218/1258 1258/1219/1259 -f 1601/1562/1602 1602/1563/1603 1603/1564/1604 -f 1603/1564/1604 1604/1565/1605 1601/1562/1602 -f 1604/1565/1605 1603/1564/1604 1605/1566/1606 -f 1605/1566/1606 1606/1567/1607 1604/1565/1605 -f 1606/1567/1607 1605/1566/1606 1607/1568/1608 -f 1607/1568/1608 1608/1569/1609 1606/1567/1607 -f 1608/1569/1609 1607/1568/1608 1609/1570/1610 -f 1609/1570/1610 1610/1571/1611 1608/1569/1609 -f 1610/1571/1611 1609/1570/1610 1611/1572/1612 -f 1611/1572/1612 1612/1573/1613 1610/1571/1611 -f 1612/1573/1613 1611/1572/1612 1613/1574/1614 -f 1613/1574/1614 1614/1575/1615 1612/1573/1613 -f 1614/1575/1615 1613/1574/1614 1615/1576/1616 -f 1615/1576/1616 1616/1577/1617 1614/1575/1615 -f 1616/1577/1617 1615/1576/1616 1617/1578/1618 -f 1617/1578/1618 1618/1579/1619 1616/1577/1617 -f 1618/1579/1619 1617/1578/1618 1619/1580/1620 -f 1619/1580/1620 1620/1581/1621 1618/1579/1619 -f 1620/1581/1621 1619/1580/1620 1621/1582/1622 -f 1621/1582/1622 1622/1583/1623 1620/1581/1621 -f 1602/1563/1603 1623/1584/1624 1624/1585/1625 -f 1624/1585/1625 1603/1564/1604 1602/1563/1603 -f 1603/1564/1604 1624/1585/1625 1625/1586/1626 -f 1625/1586/1626 1605/1566/1606 1603/1564/1604 -f 1605/1566/1606 1625/1586/1626 1626/1587/1627 -f 1626/1587/1627 1607/1568/1608 1605/1566/1606 -f 1607/1568/1608 1626/1587/1627 1627/1588/1628 -f 1627/1588/1628 1609/1570/1610 1607/1568/1608 -f 1609/1570/1610 1627/1588/1628 1628/1589/1629 -f 1628/1589/1629 1611/1572/1612 1609/1570/1610 -f 1611/1572/1612 1628/1589/1629 1629/1590/1630 -f 1629/1590/1630 1613/1574/1614 1611/1572/1612 -f 1613/1574/1614 1629/1590/1630 1630/1591/1631 -f 1630/1591/1631 1615/1576/1616 1613/1574/1614 -f 1615/1576/1616 1630/1591/1631 1631/1592/1632 -f 1631/1592/1632 1617/1578/1618 1615/1576/1616 -f 1617/1578/1618 1631/1592/1632 1632/1593/1633 -f 1632/1593/1633 1619/1580/1620 1617/1578/1618 -f 1619/1580/1620 1632/1593/1633 1633/1594/1634 -f 1633/1594/1634 1621/1582/1622 1619/1580/1620 -f 1623/1584/1624 1634/1595/1635 1635/1596/1636 -f 1635/1596/1636 1624/1585/1625 1623/1584/1624 -f 1624/1585/1625 1635/1596/1636 1636/1597/1637 -f 1636/1597/1637 1625/1586/1626 1624/1585/1625 -f 1625/1586/1626 1636/1597/1637 1637/1598/1638 -f 1637/1598/1638 1626/1587/1627 1625/1586/1626 -f 1626/1587/1627 1637/1598/1638 1638/1599/1639 -f 1638/1599/1639 1627/1588/1628 1626/1587/1627 -f 1627/1588/1628 1638/1599/1639 1639/1600/1640 -f 1639/1600/1640 1628/1589/1629 1627/1588/1628 -f 1628/1589/1629 1639/1600/1640 1640/1601/1641 -f 1640/1601/1641 1629/1590/1630 1628/1589/1629 -f 1629/1590/1630 1640/1601/1641 1641/1602/1642 -f 1641/1602/1642 1630/1591/1631 1629/1590/1630 -f 1630/1591/1631 1641/1602/1642 1642/1603/1643 -f 1642/1603/1643 1631/1592/1632 1630/1591/1631 -f 1631/1592/1632 1642/1603/1643 1643/1604/1644 -f 1643/1604/1644 1632/1593/1633 1631/1592/1632 -f 1632/1593/1633 1643/1604/1644 1644/1605/1645 -f 1644/1605/1645 1633/1594/1634 1632/1593/1633 -f 1634/1595/1635 1645/1606/1646 1646/1607/1647 -f 1646/1607/1647 1635/1596/1636 1634/1595/1635 -f 1635/1596/1636 1646/1607/1647 1647/1608/1648 -f 1647/1608/1648 1636/1597/1637 1635/1596/1636 -f 1636/1597/1637 1647/1608/1648 1648/1609/1649 -f 1648/1609/1649 1637/1598/1638 1636/1597/1637 -f 1637/1598/1638 1648/1609/1649 1649/1610/1650 -f 1649/1610/1650 1638/1599/1639 1637/1598/1638 -f 1638/1599/1639 1649/1610/1650 1650/1611/1651 -f 1650/1611/1651 1639/1600/1640 1638/1599/1639 -f 1639/1600/1640 1650/1611/1651 1651/1612/1652 -f 1651/1612/1652 1640/1601/1641 1639/1600/1640 -f 1640/1601/1641 1651/1612/1652 1652/1613/1653 -f 1652/1613/1653 1641/1602/1642 1640/1601/1641 -f 1641/1602/1642 1652/1613/1653 1653/1614/1654 -f 1653/1614/1654 1642/1603/1643 1641/1602/1642 -f 1642/1603/1643 1653/1614/1654 1654/1615/1655 -f 1654/1615/1655 1643/1604/1644 1642/1603/1643 -f 1643/1604/1644 1654/1615/1655 1655/1616/1656 -f 1655/1616/1656 1644/1605/1645 1643/1604/1644 -f 1645/1606/1646 1656/1617/1657 1657/1618/1658 -f 1657/1618/1658 1646/1607/1647 1645/1606/1646 -f 1646/1607/1647 1657/1618/1658 1658/1619/1659 -f 1658/1619/1659 1647/1608/1648 1646/1607/1647 -f 1647/1608/1648 1658/1619/1659 1659/1620/1660 -f 1659/1620/1660 1648/1609/1649 1647/1608/1648 -f 1648/1609/1649 1659/1620/1660 1660/1621/1661 -f 1660/1621/1661 1649/1610/1650 1648/1609/1649 -f 1649/1610/1650 1660/1621/1661 1661/1622/1662 -f 1661/1622/1662 1650/1611/1651 1649/1610/1650 -f 1650/1611/1651 1661/1622/1662 1662/1623/1663 -f 1662/1623/1663 1651/1612/1652 1650/1611/1651 -f 1651/1612/1652 1662/1623/1663 1663/1624/1664 -f 1663/1624/1664 1652/1613/1653 1651/1612/1652 -f 1652/1613/1653 1663/1624/1664 1664/1625/1665 -f 1664/1625/1665 1653/1614/1654 1652/1613/1653 -f 1653/1614/1654 1664/1625/1665 1665/1626/1666 -f 1665/1626/1666 1654/1615/1655 1653/1614/1654 -f 1654/1615/1655 1665/1626/1666 1666/1627/1667 -f 1666/1627/1667 1655/1616/1656 1654/1615/1655 -f 1656/1617/1657 1667/1628/1668 1668/1629/1669 -f 1668/1629/1669 1657/1618/1658 1656/1617/1657 -f 1657/1618/1658 1668/1629/1669 1669/1630/1670 -f 1669/1630/1670 1658/1619/1659 1657/1618/1658 -f 1658/1619/1659 1669/1630/1670 1670/1631/1671 -f 1670/1631/1671 1659/1620/1660 1658/1619/1659 -f 1659/1620/1660 1670/1631/1671 1671/1632/1672 -f 1671/1632/1672 1660/1621/1661 1659/1620/1660 -f 1660/1621/1661 1671/1632/1672 1672/1633/1673 -f 1672/1633/1673 1661/1622/1662 1660/1621/1661 -f 1661/1622/1662 1672/1633/1673 1673/1634/1674 -f 1673/1634/1674 1662/1623/1663 1661/1622/1662 -f 1662/1623/1663 1673/1634/1674 1674/1635/1675 -f 1674/1635/1675 1663/1624/1664 1662/1623/1663 -f 1663/1624/1664 1674/1635/1675 1675/1636/1676 -f 1675/1636/1676 1664/1625/1665 1663/1624/1664 -f 1664/1625/1665 1675/1636/1676 1676/1637/1677 -f 1676/1637/1677 1665/1626/1666 1664/1625/1665 -f 1665/1626/1666 1676/1637/1677 1677/1638/1678 -f 1677/1638/1678 1666/1627/1667 1665/1626/1666 -f 1667/1628/1668 1678/1639/1679 1679/1640/1680 -f 1679/1640/1680 1668/1629/1669 1667/1628/1668 -f 1668/1629/1669 1679/1640/1680 1680/1641/1681 -f 1680/1641/1681 1669/1630/1670 1668/1629/1669 -f 1669/1630/1670 1680/1641/1681 1681/1642/1682 -f 1681/1642/1682 1670/1631/1671 1669/1630/1670 -f 1670/1631/1671 1681/1642/1682 1682/1643/1683 -f 1682/1643/1683 1671/1632/1672 1670/1631/1671 -f 1671/1632/1672 1682/1643/1683 1683/1644/1684 -f 1683/1644/1684 1672/1633/1673 1671/1632/1672 -f 1672/1633/1673 1683/1644/1684 1684/1645/1685 -f 1684/1645/1685 1673/1634/1674 1672/1633/1673 -f 1673/1634/1674 1684/1645/1685 1685/1646/1686 -f 1685/1646/1686 1674/1635/1675 1673/1634/1674 -f 1674/1635/1675 1685/1646/1686 1686/1647/1687 -f 1686/1647/1687 1675/1636/1676 1674/1635/1675 -f 1675/1636/1676 1686/1647/1687 1687/1648/1688 -f 1687/1648/1688 1676/1637/1677 1675/1636/1676 -f 1676/1637/1677 1687/1648/1688 1688/1649/1689 -f 1688/1649/1689 1677/1638/1678 1676/1637/1677 -f 1678/1639/1679 1689/1650/1690 1690/1651/1691 -f 1690/1651/1691 1679/1640/1680 1678/1639/1679 -f 1679/1640/1680 1690/1651/1691 1691/1652/1692 -f 1691/1652/1692 1680/1641/1681 1679/1640/1680 -f 1680/1641/1681 1691/1652/1692 1692/1653/1693 -f 1692/1653/1693 1681/1642/1682 1680/1641/1681 -f 1681/1642/1682 1692/1653/1693 1693/1654/1694 -f 1693/1654/1694 1682/1643/1683 1681/1642/1682 -f 1682/1643/1683 1693/1654/1694 1694/1655/1695 -f 1694/1655/1695 1683/1644/1684 1682/1643/1683 -f 1683/1644/1684 1694/1655/1695 1695/1656/1696 -f 1695/1656/1696 1684/1645/1685 1683/1644/1684 -f 1684/1645/1685 1695/1656/1696 1696/1657/1697 -f 1696/1657/1697 1685/1646/1686 1684/1645/1685 -f 1685/1646/1686 1696/1657/1697 1697/1658/1698 -f 1697/1658/1698 1686/1647/1687 1685/1646/1686 -f 1686/1647/1687 1697/1658/1698 1698/1659/1699 -f 1698/1659/1699 1687/1648/1688 1686/1647/1687 -f 1687/1648/1688 1698/1659/1699 1699/1660/1700 -f 1699/1660/1700 1688/1649/1689 1687/1648/1688 -f 1689/1650/1690 1700/1661/1701 1701/1662/1702 -f 1701/1662/1702 1690/1651/1691 1689/1650/1690 -f 1690/1651/1691 1701/1662/1702 1702/1663/1703 -f 1702/1663/1703 1691/1652/1692 1690/1651/1691 -f 1691/1652/1692 1702/1663/1703 1703/1664/1704 -f 1703/1664/1704 1692/1653/1693 1691/1652/1692 -f 1692/1653/1693 1703/1664/1704 1704/1665/1705 -f 1704/1665/1705 1693/1654/1694 1692/1653/1693 -f 1693/1654/1694 1704/1665/1705 1705/1666/1706 -f 1705/1666/1706 1694/1655/1695 1693/1654/1694 -f 1694/1655/1695 1705/1666/1706 1706/1667/1707 -f 1706/1667/1707 1695/1656/1696 1694/1655/1695 -f 1695/1656/1696 1706/1667/1707 1707/1668/1708 -f 1707/1668/1708 1696/1657/1697 1695/1656/1696 -f 1696/1657/1697 1707/1668/1708 1708/1669/1709 -f 1708/1669/1709 1697/1658/1698 1696/1657/1697 -f 1697/1658/1698 1708/1669/1709 1709/1670/1710 -f 1709/1670/1710 1698/1659/1699 1697/1658/1698 -f 1698/1659/1699 1709/1670/1710 1710/1671/1711 -f 1710/1671/1711 1699/1660/1700 1698/1659/1699 -f 1700/1661/1701 1711/231/1712 1712/1672/1713 -f 1712/1672/1713 1701/1662/1702 1700/1661/1701 -f 1701/1662/1702 1712/1672/1713 1713/1673/1714 -f 1713/1673/1714 1702/1663/1703 1701/1662/1702 -f 1702/1663/1703 1713/1673/1714 1714/1674/1715 -f 1714/1674/1715 1703/1664/1704 1702/1663/1703 -f 1703/1664/1704 1714/1674/1715 1715/1675/1716 -f 1715/1675/1716 1704/1665/1705 1703/1664/1704 -f 1704/1665/1705 1715/1675/1716 1716/1676/1717 -f 1716/1676/1717 1705/1666/1706 1704/1665/1705 -f 1705/1666/1706 1716/1676/1717 1717/1677/1718 -f 1717/1677/1718 1706/1667/1707 1705/1666/1706 -f 1706/1667/1707 1717/1677/1718 1718/1678/1719 -f 1718/1678/1719 1707/1668/1708 1706/1667/1707 -f 1707/1668/1708 1718/1678/1719 1719/1679/1720 -f 1719/1679/1720 1708/1669/1709 1707/1668/1708 -f 1708/1669/1709 1719/1679/1720 1720/1680/1721 -f 1720/1680/1721 1709/1670/1710 1708/1669/1709 -f 1709/1670/1710 1720/1680/1721 1721/1681/1722 -f 1721/1681/1722 1710/1671/1711 1709/1670/1710 -f 1711/231/1712 1722/1682/1723 1723/1683/1724 -f 1723/1683/1724 1712/1672/1713 1711/231/1712 -f 1712/1672/1713 1723/1683/1724 1724/1684/1725 -f 1724/1684/1725 1713/1673/1714 1712/1672/1713 -f 1713/1673/1714 1724/1684/1725 1725/1685/1726 -f 1725/1685/1726 1714/1674/1715 1713/1673/1714 -f 1714/1674/1715 1725/1685/1726 1726/1686/1727 -f 1726/1686/1727 1715/1675/1716 1714/1674/1715 -f 1715/1675/1716 1726/1686/1727 1727/1687/1728 -f 1727/1687/1728 1716/1676/1717 1715/1675/1716 -f 1716/1676/1717 1727/1687/1728 1728/1688/1729 -f 1728/1688/1729 1717/1677/1718 1716/1676/1717 -f 1717/1677/1718 1728/1688/1729 1729/1689/1730 -f 1729/1689/1730 1718/1678/1719 1717/1677/1718 -f 1718/1678/1719 1729/1689/1730 1730/1690/1731 -f 1730/1690/1731 1719/1679/1720 1718/1678/1719 -f 1719/1679/1720 1730/1690/1731 1731/1691/1732 -f 1731/1691/1732 1720/1680/1721 1719/1679/1720 -f 1720/1680/1721 1731/1691/1732 1732/1692/1733 -f 1732/1692/1733 1721/1681/1722 1720/1680/1721 -f 1722/1682/1723 1733/1693/1734 1734/1694/1735 -f 1734/1694/1735 1723/1683/1724 1722/1682/1723 -f 1723/1683/1724 1734/1694/1735 1735/1695/1736 -f 1735/1695/1736 1724/1684/1725 1723/1683/1724 -f 1724/1684/1725 1735/1695/1736 1736/1696/1737 -f 1736/1696/1737 1725/1685/1726 1724/1684/1725 -f 1725/1685/1726 1736/1696/1737 1737/1697/1738 -f 1737/1697/1738 1726/1686/1727 1725/1685/1726 -f 1726/1686/1727 1737/1697/1738 1738/1698/1739 -f 1738/1698/1739 1727/1687/1728 1726/1686/1727 -f 1727/1687/1728 1738/1698/1739 1739/1699/1740 -f 1739/1699/1740 1728/1688/1729 1727/1687/1728 -f 1728/1688/1729 1739/1699/1740 1740/1700/1741 -f 1740/1700/1741 1729/1689/1730 1728/1688/1729 -f 1729/1689/1730 1740/1700/1741 1741/1701/1742 -f 1741/1701/1742 1730/1690/1731 1729/1689/1730 -f 1730/1690/1731 1741/1701/1742 1742/1702/1743 -f 1742/1702/1743 1731/1691/1732 1730/1690/1731 -f 1731/1691/1732 1742/1702/1743 1743/1703/1744 -f 1743/1703/1744 1732/1692/1733 1731/1691/1732 -f 1733/1693/1734 1744/1704/1745 1745/1705/1746 -f 1745/1705/1746 1734/1694/1735 1733/1693/1734 -f 1734/1694/1735 1745/1705/1746 1746/1706/1747 -f 1746/1706/1747 1735/1695/1736 1734/1694/1735 -f 1735/1695/1736 1746/1706/1747 1747/1707/1748 -f 1747/1707/1748 1736/1696/1737 1735/1695/1736 -f 1736/1696/1737 1747/1707/1748 1748/1708/1749 -f 1748/1708/1749 1737/1697/1738 1736/1696/1737 -f 1737/1697/1738 1748/1708/1749 1749/1709/1750 -f 1749/1709/1750 1738/1698/1739 1737/1697/1738 -f 1738/1698/1739 1749/1709/1750 1750/1710/1751 -f 1750/1710/1751 1739/1699/1740 1738/1698/1739 -f 1739/1699/1740 1750/1710/1751 1751/1711/1752 -f 1751/1711/1752 1740/1700/1741 1739/1699/1740 -f 1740/1700/1741 1751/1711/1752 1752/1712/1753 -f 1752/1712/1753 1741/1701/1742 1740/1700/1741 -f 1741/1701/1742 1752/1712/1753 1753/1713/1754 -f 1753/1713/1754 1742/1702/1743 1741/1701/1742 -f 1742/1702/1743 1753/1713/1754 1754/1714/1755 -f 1754/1714/1755 1743/1703/1744 1742/1702/1743 -f 1744/1704/1745 1755/1715/1756 1756/1716/1757 -f 1756/1716/1757 1745/1705/1746 1744/1704/1745 -f 1745/1705/1746 1756/1716/1757 1757/1717/1758 -f 1757/1717/1758 1746/1706/1747 1745/1705/1746 -f 1746/1706/1747 1757/1717/1758 1758/1718/1759 -f 1758/1718/1759 1747/1707/1748 1746/1706/1747 -f 1747/1707/1748 1758/1718/1759 1759/1719/1760 -f 1759/1719/1760 1748/1708/1749 1747/1707/1748 -f 1748/1708/1749 1759/1719/1760 1760/1720/1761 -f 1760/1720/1761 1749/1709/1750 1748/1708/1749 -f 1749/1709/1750 1760/1720/1761 1761/1721/1762 -f 1761/1721/1762 1750/1710/1751 1749/1709/1750 -f 1750/1710/1751 1761/1721/1762 1762/1722/1763 -f 1762/1722/1763 1751/1711/1752 1750/1710/1751 -f 1751/1711/1752 1762/1722/1763 1763/1723/1764 -f 1763/1723/1764 1752/1712/1753 1751/1711/1752 -f 1752/1712/1753 1763/1723/1764 1764/1724/1765 -f 1764/1724/1765 1753/1713/1754 1752/1712/1753 -f 1753/1713/1754 1764/1724/1765 1765/1725/1766 -f 1765/1725/1766 1754/1714/1755 1753/1713/1754 -f 1755/1715/1756 1766/1726/1767 1767/1727/1768 -f 1767/1727/1768 1756/1716/1757 1755/1715/1756 -f 1756/1716/1757 1767/1727/1768 1768/1728/1769 -f 1768/1728/1769 1757/1717/1758 1756/1716/1757 -f 1757/1717/1758 1768/1728/1769 1769/1729/1770 -f 1769/1729/1770 1758/1718/1759 1757/1717/1758 -f 1758/1718/1759 1769/1729/1770 1770/1730/1771 -f 1770/1730/1771 1759/1719/1760 1758/1718/1759 -f 1759/1719/1760 1770/1730/1771 1771/1731/1772 -f 1771/1731/1772 1760/1720/1761 1759/1719/1760 -f 1760/1720/1761 1771/1731/1772 1772/1732/1773 -f 1772/1732/1773 1761/1721/1762 1760/1720/1761 -f 1761/1721/1762 1772/1732/1773 1773/1733/1774 -f 1773/1733/1774 1762/1722/1763 1761/1721/1762 -f 1762/1722/1763 1773/1733/1774 1774/1734/1775 -f 1774/1734/1775 1763/1723/1764 1762/1722/1763 -f 1763/1723/1764 1774/1734/1775 1775/1735/1776 -f 1775/1735/1776 1764/1724/1765 1763/1723/1764 -f 1764/1724/1765 1775/1735/1776 1776/1736/1777 -f 1776/1736/1777 1765/1725/1766 1764/1724/1765 -f 1766/1726/1767 1777/1737/1778 1778/1738/1779 -f 1778/1738/1779 1767/1727/1768 1766/1726/1767 -f 1767/1727/1768 1778/1738/1779 1779/1739/1780 -f 1779/1739/1780 1768/1728/1769 1767/1727/1768 -f 1768/1728/1769 1779/1739/1780 1780/1740/1781 -f 1780/1740/1781 1769/1729/1770 1768/1728/1769 -f 1769/1729/1770 1780/1740/1781 1781/1741/1782 -f 1781/1741/1782 1770/1730/1771 1769/1729/1770 -f 1770/1730/1771 1781/1741/1782 1782/1742/1783 -f 1782/1742/1783 1771/1731/1772 1770/1730/1771 -f 1771/1731/1772 1782/1742/1783 1783/1743/1784 -f 1783/1743/1784 1772/1732/1773 1771/1731/1772 -f 1772/1732/1773 1783/1743/1784 1784/1744/1785 -f 1784/1744/1785 1773/1733/1774 1772/1732/1773 -f 1773/1733/1774 1784/1744/1785 1785/1745/1786 -f 1785/1745/1786 1774/1734/1775 1773/1733/1774 -f 1774/1734/1775 1785/1745/1786 1786/1746/1787 -f 1786/1746/1787 1775/1735/1776 1774/1734/1775 -f 1775/1735/1776 1786/1746/1787 1787/1747/1788 -f 1787/1747/1788 1776/1736/1777 1775/1735/1776 -f 1777/1737/1778 1788/1748/1789 1789/1749/1790 -f 1789/1749/1790 1778/1738/1779 1777/1737/1778 -f 1778/1738/1779 1789/1749/1790 1790/1750/1791 -f 1790/1750/1791 1779/1739/1780 1778/1738/1779 -f 1779/1739/1780 1790/1750/1791 1791/1751/1792 -f 1791/1751/1792 1780/1740/1781 1779/1739/1780 -f 1780/1740/1781 1791/1751/1792 1792/1752/1793 -f 1792/1752/1793 1781/1741/1782 1780/1740/1781 -f 1781/1741/1782 1792/1752/1793 1793/1753/1794 -f 1793/1753/1794 1782/1742/1783 1781/1741/1782 -f 1782/1742/1783 1793/1753/1794 1794/1754/1795 -f 1794/1754/1795 1783/1743/1784 1782/1742/1783 -f 1783/1743/1784 1794/1754/1795 1795/1755/1796 -f 1795/1755/1796 1784/1744/1785 1783/1743/1784 -f 1784/1744/1785 1795/1755/1796 1796/1756/1797 -f 1796/1756/1797 1785/1745/1786 1784/1744/1785 -f 1785/1745/1786 1796/1756/1797 1797/1757/1798 -f 1797/1757/1798 1786/1746/1787 1785/1745/1786 -f 1786/1746/1787 1797/1757/1798 1798/1758/1799 -f 1798/1758/1799 1787/1747/1788 1786/1746/1787 -f 1788/1748/1789 1799/1759/1800 1800/1760/1801 -f 1800/1760/1801 1789/1749/1790 1788/1748/1789 -f 1789/1749/1790 1800/1760/1801 1801/1761/1802 -f 1801/1761/1802 1790/1750/1791 1789/1749/1790 -f 1790/1750/1791 1801/1761/1802 1802/1762/1803 -f 1802/1762/1803 1791/1751/1792 1790/1750/1791 -f 1791/1751/1792 1802/1762/1803 1803/1763/1804 -f 1803/1763/1804 1792/1752/1793 1791/1751/1792 -f 1792/1752/1793 1803/1763/1804 1804/1764/1805 -f 1804/1764/1805 1793/1753/1794 1792/1752/1793 -f 1793/1753/1794 1804/1764/1805 1805/1765/1806 -f 1805/1765/1806 1794/1754/1795 1793/1753/1794 -f 1794/1754/1795 1805/1765/1806 1806/1766/1807 -f 1806/1766/1807 1795/1755/1796 1794/1754/1795 -f 1795/1755/1796 1806/1766/1807 1807/1767/1808 -f 1807/1767/1808 1796/1756/1797 1795/1755/1796 -f 1796/1756/1797 1807/1767/1808 1808/1768/1809 -f 1808/1768/1809 1797/1757/1798 1796/1756/1797 -f 1797/1757/1798 1808/1768/1809 1809/1769/1810 -f 1809/1769/1810 1798/1758/1799 1797/1757/1798 -f 1799/1759/1800 1810/1770/1811 1811/1771/1812 -f 1811/1771/1812 1800/1760/1801 1799/1759/1800 -f 1800/1760/1801 1811/1771/1812 1812/1772/1813 -f 1812/1772/1813 1801/1761/1802 1800/1760/1801 -f 1801/1761/1802 1812/1772/1813 1813/1773/1814 -f 1813/1773/1814 1802/1762/1803 1801/1761/1802 -f 1802/1762/1803 1813/1773/1814 1814/1774/1815 -f 1814/1774/1815 1803/1763/1804 1802/1762/1803 -f 1803/1763/1804 1814/1774/1815 1815/1775/1816 -f 1815/1775/1816 1804/1764/1805 1803/1763/1804 -f 1804/1764/1805 1815/1775/1816 1816/1776/1817 -f 1816/1776/1817 1805/1765/1806 1804/1764/1805 -f 1805/1765/1806 1816/1776/1817 1817/1777/1818 -f 1817/1777/1818 1806/1766/1807 1805/1765/1806 -f 1806/1766/1807 1817/1777/1818 1818/1778/1819 -f 1818/1778/1819 1807/1767/1808 1806/1766/1807 -f 1807/1767/1808 1818/1778/1819 1819/1779/1820 -f 1819/1779/1820 1808/1768/1809 1807/1767/1808 -f 1808/1768/1809 1819/1779/1820 1820/1780/1821 -f 1820/1780/1821 1809/1769/1810 1808/1768/1809 -f 1810/1770/1811 1601/1562/1602 1604/1565/1605 -f 1604/1565/1605 1811/1771/1812 1810/1770/1811 -f 1811/1771/1812 1604/1565/1605 1606/1567/1607 -f 1606/1567/1607 1812/1772/1813 1811/1771/1812 -f 1812/1772/1813 1606/1567/1607 1608/1569/1609 -f 1608/1569/1609 1813/1773/1814 1812/1772/1813 -f 1813/1773/1814 1608/1569/1609 1610/1571/1611 -f 1610/1571/1611 1814/1774/1815 1813/1773/1814 -f 1814/1774/1815 1610/1571/1611 1612/1573/1613 -f 1612/1573/1613 1815/1775/1816 1814/1774/1815 -f 1815/1775/1816 1612/1573/1613 1614/1575/1615 -f 1614/1575/1615 1816/1776/1817 1815/1775/1816 -f 1816/1776/1817 1614/1575/1615 1616/1577/1617 -f 1616/1577/1617 1817/1777/1818 1816/1776/1817 -f 1817/1777/1818 1616/1577/1617 1618/1579/1619 -f 1618/1579/1619 1818/1778/1819 1817/1777/1818 -f 1818/1778/1819 1618/1579/1619 1620/1581/1621 -f 1620/1581/1621 1819/1779/1820 1818/1778/1819 -f 1819/1779/1820 1620/1581/1621 1622/1583/1623 -f 1622/1583/1623 1820/1780/1821 1819/1779/1820 -f 1622/1583/1623 1621/1582/1622 1821/1781/1822 -f 1821/1781/1822 1822/1782/1823 1622/1583/1623 -f 1822/1782/1823 1821/1781/1822 1823/1783/1824 -f 1823/1783/1824 1824/1784/1825 1822/1782/1823 -f 1824/1784/1825 1823/1783/1824 1825/1785/1826 -f 1825/1785/1826 1826/1786/1827 1824/1784/1825 -f 1826/1786/1827 1825/1785/1826 1827/1787/1828 -f 1827/1787/1828 1828/1788/1829 1826/1786/1827 -f 1828/1788/1829 1827/1787/1828 1829/1789/1830 -f 1829/1789/1830 1830/1790/1831 1828/1788/1829 -f 1830/1790/1831 1829/1789/1830 1831/1791/1832 -f 1831/1791/1832 1832/1792/1833 1830/1790/1831 -f 1832/1792/1833 1831/1791/1832 1833/1793/1834 -f 1833/1793/1834 1834/1794/1835 1832/1792/1833 -f 1834/1794/1835 1833/1793/1834 1835/1795/1836 -f 1835/1795/1836 1836/1796/1837 1834/1794/1835 -f 1836/1796/1837 1835/1795/1836 1837/1797/1838 -f 1837/1797/1838 1838/1798/1839 1836/1796/1837 -f 1838/1798/1839 1837/1797/1838 1839/1799/1840 -f 1839/1799/1840 1840/650/650 1838/1798/1839 -f 1621/1582/1622 1633/1594/1634 1841/1800/1841 -f 1841/1800/1841 1821/1781/1822 1621/1582/1622 -f 1821/1781/1822 1841/1800/1841 1842/1801/1842 -f 1842/1801/1842 1823/1783/1824 1821/1781/1822 -f 1823/1783/1824 1842/1801/1842 1843/1802/1843 -f 1843/1802/1843 1825/1785/1826 1823/1783/1824 -f 1825/1785/1826 1843/1802/1843 1844/1803/1844 -f 1844/1803/1844 1827/1787/1828 1825/1785/1826 -f 1827/1787/1828 1844/1803/1844 1845/1804/1845 -f 1845/1804/1845 1829/1789/1830 1827/1787/1828 -f 1829/1789/1830 1845/1804/1845 1846/1805/1846 -f 1846/1805/1846 1831/1791/1832 1829/1789/1830 -f 1831/1791/1832 1846/1805/1846 1847/1806/1847 -f 1847/1806/1847 1833/1793/1834 1831/1791/1832 -f 1833/1793/1834 1847/1806/1847 1848/1807/1848 -f 1848/1807/1848 1835/1795/1836 1833/1793/1834 -f 1835/1795/1836 1848/1807/1848 1849/1808/1849 -f 1849/1808/1849 1837/1797/1838 1835/1795/1836 -f 1837/1797/1838 1849/1808/1849 1850/1809/1850 -f 1850/1809/1850 1839/1799/1840 1837/1797/1838 -f 1633/1594/1634 1644/1605/1645 1851/1810/1851 -f 1851/1810/1851 1841/1800/1841 1633/1594/1634 -f 1841/1800/1841 1851/1810/1851 1852/1811/1852 -f 1852/1811/1852 1842/1801/1842 1841/1800/1841 -f 1842/1801/1842 1852/1811/1852 1853/1812/1853 -f 1853/1812/1853 1843/1802/1843 1842/1801/1842 -f 1843/1802/1843 1853/1812/1853 1854/1813/1854 -f 1854/1813/1854 1844/1803/1844 1843/1802/1843 -f 1844/1803/1844 1854/1813/1854 1855/1814/1855 -f 1855/1814/1855 1845/1804/1845 1844/1803/1844 -f 1845/1804/1845 1855/1814/1855 1856/1815/1856 -f 1856/1815/1856 1846/1805/1846 1845/1804/1845 -f 1846/1805/1846 1856/1815/1856 1857/1816/1857 -f 1857/1816/1857 1847/1806/1847 1846/1805/1846 -f 1847/1806/1847 1857/1816/1857 1858/1817/1858 -f 1858/1817/1858 1848/1807/1848 1847/1806/1847 -f 1848/1807/1848 1858/1817/1858 1859/1818/1859 -f 1859/1818/1859 1849/1808/1849 1848/1807/1848 -f 1849/1808/1849 1859/1818/1859 1860/1819/1860 -f 1860/1819/1860 1850/1809/1850 1849/1808/1849 -f 1644/1605/1645 1655/1616/1656 1861/1820/1861 -f 1861/1820/1861 1851/1810/1851 1644/1605/1645 -f 1851/1810/1851 1861/1820/1861 1862/1821/1862 -f 1862/1821/1862 1852/1811/1852 1851/1810/1851 -f 1852/1811/1852 1862/1821/1862 1863/1822/1863 -f 1863/1822/1863 1853/1812/1853 1852/1811/1852 -f 1853/1812/1853 1863/1822/1863 1864/1823/1864 -f 1864/1823/1864 1854/1813/1854 1853/1812/1853 -f 1854/1813/1854 1864/1823/1864 1865/1824/1865 -f 1865/1824/1865 1855/1814/1855 1854/1813/1854 -f 1855/1814/1855 1865/1824/1865 1866/1825/1866 -f 1866/1825/1866 1856/1815/1856 1855/1814/1855 -f 1856/1815/1856 1866/1825/1866 1867/1826/1867 -f 1867/1826/1867 1857/1816/1857 1856/1815/1856 -f 1857/1816/1857 1867/1826/1867 1868/1827/1868 -f 1868/1827/1868 1858/1817/1858 1857/1816/1857 -f 1858/1817/1858 1868/1827/1868 1869/1828/1869 -f 1869/1828/1869 1859/1818/1859 1858/1817/1858 -f 1859/1818/1859 1869/1828/1869 1870/1829/1870 -f 1870/1829/1870 1860/1819/1860 1859/1818/1859 -f 1655/1616/1656 1666/1627/1667 1871/1830/1871 -f 1871/1830/1871 1861/1820/1861 1655/1616/1656 -f 1861/1820/1861 1871/1830/1871 1872/1831/1872 -f 1872/1831/1872 1862/1821/1862 1861/1820/1861 -f 1862/1821/1862 1872/1831/1872 1873/1832/1873 -f 1873/1832/1873 1863/1822/1863 1862/1821/1862 -f 1863/1822/1863 1873/1832/1873 1874/1833/1874 -f 1874/1833/1874 1864/1823/1864 1863/1822/1863 -f 1864/1823/1864 1874/1833/1874 1875/1834/1875 -f 1875/1834/1875 1865/1824/1865 1864/1823/1864 -f 1865/1824/1865 1875/1834/1875 1876/1835/1876 -f 1876/1835/1876 1866/1825/1866 1865/1824/1865 -f 1866/1825/1866 1876/1835/1876 1877/1836/1877 -f 1877/1836/1877 1867/1826/1867 1866/1825/1866 -f 1867/1826/1867 1877/1836/1877 1878/1837/1878 -f 1878/1837/1878 1868/1827/1868 1867/1826/1867 -f 1868/1827/1868 1878/1837/1878 1879/1838/1879 -f 1879/1838/1879 1869/1828/1869 1868/1827/1868 -f 1869/1828/1869 1879/1838/1879 1880/1839/1880 -f 1880/1839/1880 1870/1829/1870 1869/1828/1869 -f 1666/1627/1667 1677/1638/1678 1881/1840/1881 -f 1881/1840/1881 1871/1830/1871 1666/1627/1667 -f 1871/1830/1871 1881/1840/1881 1882/1841/1882 -f 1882/1841/1882 1872/1831/1872 1871/1830/1871 -f 1872/1831/1872 1882/1841/1882 1883/1842/1883 -f 1883/1842/1883 1873/1832/1873 1872/1831/1872 -f 1873/1832/1873 1883/1842/1883 1884/1843/1884 -f 1884/1843/1884 1874/1833/1874 1873/1832/1873 -f 1874/1833/1874 1884/1843/1884 1885/1844/1885 -f 1885/1844/1885 1875/1834/1875 1874/1833/1874 -f 1875/1834/1875 1885/1844/1885 1886/1845/1886 -f 1886/1845/1886 1876/1835/1876 1875/1834/1875 -f 1876/1835/1876 1886/1845/1886 1887/1846/1887 -f 1887/1846/1887 1877/1836/1877 1876/1835/1876 -f 1877/1836/1877 1887/1846/1887 1888/1847/1888 -f 1888/1847/1888 1878/1837/1878 1877/1836/1877 -f 1878/1837/1878 1888/1847/1888 1889/1848/1889 -f 1889/1848/1889 1879/1838/1879 1878/1837/1878 -f 1879/1838/1879 1889/1848/1889 1890/1849/1890 -f 1890/1849/1890 1880/1839/1880 1879/1838/1879 -f 1677/1638/1678 1688/1649/1689 1891/1850/1891 -f 1891/1850/1891 1881/1840/1881 1677/1638/1678 -f 1881/1840/1881 1891/1850/1891 1892/1851/1892 -f 1892/1851/1892 1882/1841/1882 1881/1840/1881 -f 1882/1841/1882 1892/1851/1892 1893/1852/1893 -f 1893/1852/1893 1883/1842/1883 1882/1841/1882 -f 1883/1842/1883 1893/1852/1893 1894/1853/1894 -f 1894/1853/1894 1884/1843/1884 1883/1842/1883 -f 1884/1843/1884 1894/1853/1894 1895/1854/1895 -f 1895/1854/1895 1885/1844/1885 1884/1843/1884 -f 1885/1844/1885 1895/1854/1895 1896/1855/1896 -f 1896/1855/1896 1886/1845/1886 1885/1844/1885 -f 1886/1845/1886 1896/1855/1896 1897/1856/1897 -f 1897/1856/1897 1887/1846/1887 1886/1845/1886 -f 1887/1846/1887 1897/1856/1897 1898/1857/1898 -f 1898/1857/1898 1888/1847/1888 1887/1846/1887 -f 1888/1847/1888 1898/1857/1898 1899/1858/1899 -f 1899/1858/1899 1889/1848/1889 1888/1847/1888 -f 1889/1848/1889 1899/1858/1899 1900/1859/1900 -f 1900/1859/1900 1890/1849/1890 1889/1848/1889 -f 1688/1649/1689 1699/1660/1700 1901/1860/1901 -f 1901/1860/1901 1891/1850/1891 1688/1649/1689 -f 1891/1850/1891 1901/1860/1901 1902/1861/1902 -f 1902/1861/1902 1892/1851/1892 1891/1850/1891 -f 1892/1851/1892 1902/1861/1902 1903/1862/1903 -f 1903/1862/1903 1893/1852/1893 1892/1851/1892 -f 1893/1852/1893 1903/1862/1903 1904/1863/1904 -f 1904/1863/1904 1894/1853/1894 1893/1852/1893 -f 1894/1853/1894 1904/1863/1904 1905/1864/1905 -f 1905/1864/1905 1895/1854/1895 1894/1853/1894 -f 1895/1854/1895 1905/1864/1905 1906/1865/1906 -f 1906/1865/1906 1896/1855/1896 1895/1854/1895 -f 1896/1855/1896 1906/1865/1906 1907/1866/1907 -f 1907/1866/1907 1897/1856/1897 1896/1855/1896 -f 1897/1856/1897 1907/1866/1907 1908/1867/1908 -f 1908/1867/1908 1898/1857/1898 1897/1856/1897 -f 1898/1857/1898 1908/1867/1908 1909/1868/1909 -f 1909/1868/1909 1899/1858/1899 1898/1857/1898 -f 1899/1858/1899 1909/1868/1909 1910/1869/1910 -f 1910/1869/1910 1900/1859/1900 1899/1858/1899 -f 1699/1660/1700 1710/1671/1711 1911/1870/1911 -f 1911/1870/1911 1901/1860/1901 1699/1660/1700 -f 1901/1860/1901 1911/1870/1911 1912/1871/1912 -f 1912/1871/1912 1902/1861/1902 1901/1860/1901 -f 1902/1861/1902 1912/1871/1912 1913/1872/1913 -f 1913/1872/1913 1903/1862/1903 1902/1861/1902 -f 1903/1862/1903 1913/1872/1913 1914/1873/1914 -f 1914/1873/1914 1904/1863/1904 1903/1862/1903 -f 1904/1863/1904 1914/1873/1914 1915/1874/1915 -f 1915/1874/1915 1905/1864/1905 1904/1863/1904 -f 1905/1864/1905 1915/1874/1915 1916/1875/1916 -f 1916/1875/1916 1906/1865/1906 1905/1864/1905 -f 1906/1865/1906 1916/1875/1916 1917/1876/1917 -f 1917/1876/1917 1907/1866/1907 1906/1865/1906 -f 1907/1866/1907 1917/1876/1917 1918/1877/1918 -f 1918/1877/1918 1908/1867/1908 1907/1866/1907 -f 1908/1867/1908 1918/1877/1918 1919/1878/1919 -f 1919/1878/1919 1909/1868/1909 1908/1867/1908 -f 1909/1868/1909 1919/1878/1919 1920/1879/1920 -f 1920/1879/1920 1910/1869/1910 1909/1868/1909 -f 1710/1671/1711 1721/1681/1722 1921/1880/1921 -f 1921/1880/1921 1911/1870/1911 1710/1671/1711 -f 1911/1870/1911 1921/1880/1921 1922/1881/1922 -f 1922/1881/1922 1912/1871/1912 1911/1870/1911 -f 1912/1871/1912 1922/1881/1922 1923/1882/1923 -f 1923/1882/1923 1913/1872/1913 1912/1871/1912 -f 1913/1872/1913 1923/1882/1923 1924/1883/1924 -f 1924/1883/1924 1914/1873/1914 1913/1872/1913 -f 1914/1873/1914 1924/1883/1924 1925/1884/1925 -f 1925/1884/1925 1915/1874/1915 1914/1873/1914 -f 1915/1874/1915 1925/1884/1925 1926/1885/1926 -f 1926/1885/1926 1916/1875/1916 1915/1874/1915 -f 1916/1875/1916 1926/1885/1926 1927/1886/1927 -f 1927/1886/1927 1917/1876/1917 1916/1875/1916 -f 1917/1876/1917 1927/1886/1927 1928/1887/1928 -f 1928/1887/1928 1918/1877/1918 1917/1876/1917 -f 1918/1877/1918 1928/1887/1928 1929/1888/1929 -f 1929/1888/1929 1919/1878/1919 1918/1877/1918 -f 1919/1878/1919 1929/1888/1929 1930/1889/1930 -f 1930/1889/1930 1920/1879/1920 1919/1878/1919 -f 1721/1681/1722 1732/1692/1733 1931/1890/1931 -f 1931/1890/1931 1921/1880/1921 1721/1681/1722 -f 1921/1880/1921 1931/1890/1931 1932/1891/1932 -f 1932/1891/1932 1922/1881/1922 1921/1880/1921 -f 1922/1881/1922 1932/1891/1932 1933/1892/1933 -f 1933/1892/1933 1923/1882/1923 1922/1881/1922 -f 1923/1882/1923 1933/1892/1933 1934/1893/1934 -f 1934/1893/1934 1924/1883/1924 1923/1882/1923 -f 1924/1883/1924 1934/1893/1934 1935/1894/1935 -f 1935/1894/1935 1925/1884/1925 1924/1883/1924 -f 1925/1884/1925 1935/1894/1935 1936/1895/1936 -f 1936/1895/1936 1926/1885/1926 1925/1884/1925 -f 1926/1885/1926 1936/1895/1936 1937/1896/1937 -f 1937/1896/1937 1927/1886/1927 1926/1885/1926 -f 1927/1886/1927 1937/1896/1937 1938/1897/1938 -f 1938/1897/1938 1928/1887/1928 1927/1886/1927 -f 1928/1887/1928 1938/1897/1938 1939/1898/1939 -f 1939/1898/1939 1929/1888/1929 1928/1887/1928 -f 1929/1888/1929 1939/1898/1939 1940/1899/1940 -f 1940/1899/1940 1930/1889/1930 1929/1888/1929 -f 1732/1692/1733 1743/1703/1744 1941/1900/1941 -f 1941/1900/1941 1931/1890/1931 1732/1692/1733 -f 1931/1890/1931 1941/1900/1941 1942/1901/1942 -f 1942/1901/1942 1932/1891/1932 1931/1890/1931 -f 1932/1891/1932 1942/1901/1942 1943/1902/1943 -f 1943/1902/1943 1933/1892/1933 1932/1891/1932 -f 1933/1892/1933 1943/1902/1943 1944/1903/1944 -f 1944/1903/1944 1934/1893/1934 1933/1892/1933 -f 1934/1893/1934 1944/1903/1944 1945/1904/1945 -f 1945/1904/1945 1935/1894/1935 1934/1893/1934 -f 1935/1894/1935 1945/1904/1945 1946/1905/1946 -f 1946/1905/1946 1936/1895/1936 1935/1894/1935 -f 1936/1895/1936 1946/1905/1946 1947/1906/1947 -f 1947/1906/1947 1937/1896/1937 1936/1895/1936 -f 1937/1896/1937 1947/1906/1947 1948/1907/1948 -f 1948/1907/1948 1938/1897/1938 1937/1896/1937 -f 1938/1897/1938 1948/1907/1948 1949/1908/1949 -f 1949/1908/1949 1939/1898/1939 1938/1897/1938 -f 1939/1898/1939 1949/1908/1949 1950/1909/1950 -f 1950/1909/1950 1940/1899/1940 1939/1898/1939 -f 1743/1703/1744 1754/1714/1755 1951/1910/1951 -f 1951/1910/1951 1941/1900/1941 1743/1703/1744 -f 1941/1900/1941 1951/1910/1951 1952/1911/1952 -f 1952/1911/1952 1942/1901/1942 1941/1900/1941 -f 1942/1901/1942 1952/1911/1952 1953/1912/1953 -f 1953/1912/1953 1943/1902/1943 1942/1901/1942 -f 1943/1902/1943 1953/1912/1953 1954/1913/1954 -f 1954/1913/1954 1944/1903/1944 1943/1902/1943 -f 1944/1903/1944 1954/1913/1954 1955/1914/1955 -f 1955/1914/1955 1945/1904/1945 1944/1903/1944 -f 1945/1904/1945 1955/1914/1955 1956/1915/1956 -f 1956/1915/1956 1946/1905/1946 1945/1904/1945 -f 1946/1905/1946 1956/1915/1956 1957/1916/1957 -f 1957/1916/1957 1947/1906/1947 1946/1905/1946 -f 1947/1906/1947 1957/1916/1957 1958/1917/1958 -f 1958/1917/1958 1948/1907/1948 1947/1906/1947 -f 1948/1907/1948 1958/1917/1958 1959/1918/1959 -f 1959/1918/1959 1949/1908/1949 1948/1907/1948 -f 1949/1908/1949 1959/1918/1959 1960/1919/1960 -f 1960/1919/1960 1950/1909/1950 1949/1908/1949 -f 1754/1714/1755 1765/1725/1766 1961/1920/1961 -f 1961/1920/1961 1951/1910/1951 1754/1714/1755 -f 1951/1910/1951 1961/1920/1961 1962/1921/1962 -f 1962/1921/1962 1952/1911/1952 1951/1910/1951 -f 1952/1911/1952 1962/1921/1962 1963/1922/1963 -f 1963/1922/1963 1953/1912/1953 1952/1911/1952 -f 1953/1912/1953 1963/1922/1963 1964/1923/1964 -f 1964/1923/1964 1954/1913/1954 1953/1912/1953 -f 1954/1913/1954 1964/1923/1964 1965/1924/1965 -f 1965/1924/1965 1955/1914/1955 1954/1913/1954 -f 1955/1914/1955 1965/1924/1965 1966/1925/1966 -f 1966/1925/1966 1956/1915/1956 1955/1914/1955 -f 1956/1915/1956 1966/1925/1966 1967/1926/1967 -f 1967/1926/1967 1957/1916/1957 1956/1915/1956 -f 1957/1916/1957 1967/1926/1967 1968/1927/1968 -f 1968/1927/1968 1958/1917/1958 1957/1916/1957 -f 1958/1917/1958 1968/1927/1968 1969/1928/1969 -f 1969/1928/1969 1959/1918/1959 1958/1917/1958 -f 1959/1918/1959 1969/1928/1969 1970/1929/1970 -f 1970/1929/1970 1960/1919/1960 1959/1918/1959 -f 1765/1725/1766 1776/1736/1777 1971/1930/1971 -f 1971/1930/1971 1961/1920/1961 1765/1725/1766 -f 1961/1920/1961 1971/1930/1971 1972/1931/1972 -f 1972/1931/1972 1962/1921/1962 1961/1920/1961 -f 1962/1921/1962 1972/1931/1972 1973/1932/1973 -f 1973/1932/1973 1963/1922/1963 1962/1921/1962 -f 1963/1922/1963 1973/1932/1973 1974/1933/1974 -f 1974/1933/1974 1964/1923/1964 1963/1922/1963 -f 1964/1923/1964 1974/1933/1974 1975/1934/1975 -f 1975/1934/1975 1965/1924/1965 1964/1923/1964 -f 1965/1924/1965 1975/1934/1975 1976/1935/1976 -f 1976/1935/1976 1966/1925/1966 1965/1924/1965 -f 1966/1925/1966 1976/1935/1976 1977/1936/1977 -f 1977/1936/1977 1967/1926/1967 1966/1925/1966 -f 1967/1926/1967 1977/1936/1977 1978/1937/1978 -f 1978/1937/1978 1968/1927/1968 1967/1926/1967 -f 1968/1927/1968 1978/1937/1978 1979/1938/1979 -f 1979/1938/1979 1969/1928/1969 1968/1927/1968 -f 1969/1928/1969 1979/1938/1979 1980/1939/1980 -f 1980/1939/1980 1970/1929/1970 1969/1928/1969 -f 1776/1736/1777 1787/1747/1788 1981/1940/1981 -f 1981/1940/1981 1971/1930/1971 1776/1736/1777 -f 1971/1930/1971 1981/1940/1981 1982/1941/1982 -f 1982/1941/1982 1972/1931/1972 1971/1930/1971 -f 1972/1931/1972 1982/1941/1982 1983/1942/1983 -f 1983/1942/1983 1973/1932/1973 1972/1931/1972 -f 1973/1932/1973 1983/1942/1983 1984/1943/1984 -f 1984/1943/1984 1974/1933/1974 1973/1932/1973 -f 1974/1933/1974 1984/1943/1984 1985/1944/1985 -f 1985/1944/1985 1975/1934/1975 1974/1933/1974 -f 1975/1934/1975 1985/1944/1985 1986/1945/1986 -f 1986/1945/1986 1976/1935/1976 1975/1934/1975 -f 1976/1935/1976 1986/1945/1986 1987/1946/1987 -f 1987/1946/1987 1977/1936/1977 1976/1935/1976 -f 1977/1936/1977 1987/1946/1987 1988/1947/1988 -f 1988/1947/1988 1978/1937/1978 1977/1936/1977 -f 1978/1937/1978 1988/1947/1988 1989/1948/1989 -f 1989/1948/1989 1979/1938/1979 1978/1937/1978 -f 1979/1938/1979 1989/1948/1989 1990/1949/1990 -f 1990/1949/1990 1980/1939/1980 1979/1938/1979 -f 1787/1747/1788 1798/1758/1799 1991/1950/1991 -f 1991/1950/1991 1981/1940/1981 1787/1747/1788 -f 1981/1940/1981 1991/1950/1991 1992/1951/1992 -f 1992/1951/1992 1982/1941/1982 1981/1940/1981 -f 1982/1941/1982 1992/1951/1992 1993/1952/1993 -f 1993/1952/1993 1983/1942/1983 1982/1941/1982 -f 1983/1942/1983 1993/1952/1993 1994/1953/1994 -f 1994/1953/1994 1984/1943/1984 1983/1942/1983 -f 1984/1943/1984 1994/1953/1994 1995/1954/1995 -f 1995/1954/1995 1985/1944/1985 1984/1943/1984 -f 1985/1944/1985 1995/1954/1995 1996/1955/1996 -f 1996/1955/1996 1986/1945/1986 1985/1944/1985 -f 1986/1945/1986 1996/1955/1996 1997/1956/1997 -f 1997/1956/1997 1987/1946/1987 1986/1945/1986 -f 1987/1946/1987 1997/1956/1997 1998/1957/1998 -f 1998/1957/1998 1988/1947/1988 1987/1946/1987 -f 1988/1947/1988 1998/1957/1998 1999/1958/1999 -f 1999/1958/1999 1989/1948/1989 1988/1947/1988 -f 1989/1948/1989 1999/1958/1999 2000/1959/2000 -f 2000/1959/2000 1990/1949/1990 1989/1948/1989 -f 1798/1758/1799 1809/1769/1810 2001/1960/2001 -f 2001/1960/2001 1991/1950/1991 1798/1758/1799 -f 1991/1950/1991 2001/1960/2001 2002/1961/2002 -f 2002/1961/2002 1992/1951/1992 1991/1950/1991 -f 1992/1951/1992 2002/1961/2002 2003/1962/2003 -f 2003/1962/2003 1993/1952/1993 1992/1951/1992 -f 1993/1952/1993 2003/1962/2003 2004/1963/2004 -f 2004/1963/2004 1994/1953/1994 1993/1952/1993 -f 1994/1953/1994 2004/1963/2004 2005/1964/2005 -f 2005/1964/2005 1995/1954/1995 1994/1953/1994 -f 1995/1954/1995 2005/1964/2005 2006/1965/2006 -f 2006/1965/2006 1996/1955/1996 1995/1954/1995 -f 1996/1955/1996 2006/1965/2006 2007/1966/2007 -f 2007/1966/2007 1997/1956/1997 1996/1955/1996 -f 1997/1956/1997 2007/1966/2007 2008/1967/2008 -f 2008/1967/2008 1998/1957/1998 1997/1956/1997 -f 1998/1957/1998 2008/1967/2008 2009/1968/2009 -f 2009/1968/2009 1999/1958/1999 1998/1957/1998 -f 1999/1958/1999 2009/1968/2009 2010/1969/2010 -f 2010/1969/2010 2000/1959/2000 1999/1958/1999 -f 1809/1769/1810 1820/1780/1821 2011/1970/2011 -f 2011/1970/2011 2001/1960/2001 1809/1769/1810 -f 2001/1960/2001 2011/1970/2011 2012/1971/2012 -f 2012/1971/2012 2002/1961/2002 2001/1960/2001 -f 2002/1961/2002 2012/1971/2012 2013/1972/2013 -f 2013/1972/2013 2003/1962/2003 2002/1961/2002 -f 2003/1962/2003 2013/1972/2013 2014/1973/2014 -f 2014/1973/2014 2004/1963/2004 2003/1962/2003 -f 2004/1963/2004 2014/1973/2014 2015/1974/2015 -f 2015/1974/2015 2005/1964/2005 2004/1963/2004 -f 2005/1964/2005 2015/1974/2015 2016/1975/2016 -f 2016/1975/2016 2006/1965/2006 2005/1964/2005 -f 2006/1965/2006 2016/1975/2016 2017/1976/2017 -f 2017/1976/2017 2007/1966/2007 2006/1965/2006 -f 2007/1966/2007 2017/1976/2017 2018/1977/2018 -f 2018/1977/2018 2008/1967/2008 2007/1966/2007 -f 2008/1967/2008 2018/1977/2018 2019/1978/2019 -f 2019/1978/2019 2009/1968/2009 2008/1967/2008 -f 2009/1968/2009 2019/1978/2019 2020/1979/2020 -f 2020/1979/2020 2010/1969/2010 2009/1968/2009 -f 1820/1780/1821 1622/1583/1623 1822/1782/1823 -f 1822/1782/1823 2011/1970/2011 1820/1780/1821 -f 2011/1970/2011 1822/1782/1823 1824/1784/1825 -f 1824/1784/1825 2012/1971/2012 2011/1970/2011 -f 2012/1971/2012 1824/1784/1825 1826/1786/1827 -f 1826/1786/1827 2013/1972/2013 2012/1971/2012 -f 2013/1972/2013 1826/1786/1827 1828/1788/1829 -f 1828/1788/1829 2014/1973/2014 2013/1972/2013 -f 2014/1973/2014 1828/1788/1829 1830/1790/1831 -f 1830/1790/1831 2015/1974/2015 2014/1973/2014 -f 2015/1974/2015 1830/1790/1831 1832/1792/1833 -f 1832/1792/1833 2016/1975/2016 2015/1974/2015 -f 2016/1975/2016 1832/1792/1833 1834/1794/1835 -f 1834/1794/1835 2017/1976/2017 2016/1975/2016 -f 2017/1976/2017 1834/1794/1835 1836/1796/1837 -f 1836/1796/1837 2018/1977/2018 2017/1976/2017 -f 2018/1977/2018 1836/1796/1837 1838/1798/1839 -f 1838/1798/1839 2019/1978/2019 2018/1977/2018 -f 2019/1978/2019 1838/1798/1839 1840/650/650 -f 1840/650/650 2020/1979/2020 2019/1978/2019 -f 2021/1980/2021 2022/1981/2022 2023/1982/2023 -f 2023/1982/2023 2024/1983/2024 2021/1980/2021 -f 2024/1983/2024 2023/1982/2023 2025/1984/2025 -f 2025/1984/2025 2026/1985/2026 2024/1983/2024 -f 2026/1985/2026 2025/1984/2025 2027/1986/2027 -f 2027/1986/2027 2028/1987/2028 2026/1985/2026 -f 2028/1987/2028 2027/1986/2027 2029/1988/2029 -f 2029/1988/2029 2030/1989/2030 2028/1987/2028 -f 2030/1989/2030 2029/1988/2029 2031/1990/2031 -f 2031/1990/2031 2032/1991/2032 2030/1989/2030 -f 2032/1991/2032 2031/1990/2031 2033/1992/2033 -f 2033/1992/2033 2034/1993/2034 2032/1991/2032 -f 2034/1993/2034 2033/1992/2033 2035/1994/2035 -f 2035/1994/2035 2036/1995/2036 2034/1993/2034 -f 2036/1995/2036 2035/1994/2035 2037/1996/2037 -f 2037/1996/2037 2038/1997/2038 2036/1995/2036 -f 2038/1997/2038 2037/1996/2037 2039/1998/2039 -f 2039/1998/2039 2040/1999/2040 2038/1997/2038 -f 2040/1999/2040 2039/1998/2039 2041/2000/2041 -f 2041/2000/2041 2042/2001/2042 2040/1999/2040 -f 2022/1981/2022 2043/2002/2043 2044/2003/2044 -f 2044/2003/2044 2023/1982/2023 2022/1981/2022 -f 2023/1982/2023 2044/2003/2044 2045/2004/2045 -f 2045/2004/2045 2025/1984/2025 2023/1982/2023 -f 2025/1984/2025 2045/2004/2045 2046/2005/2046 -f 2046/2005/2046 2027/1986/2027 2025/1984/2025 -f 2027/1986/2027 2046/2005/2046 2047/2006/2047 -f 2047/2006/2047 2029/1988/2029 2027/1986/2027 -f 2029/1988/2029 2047/2006/2047 2048/2007/2048 -f 2048/2007/2048 2031/1990/2031 2029/1988/2029 -f 2031/1990/2031 2048/2007/2048 2049/2008/2049 -f 2049/2008/2049 2033/1992/2033 2031/1990/2031 -f 2033/1992/2033 2049/2008/2049 2050/2009/2050 -f 2050/2009/2050 2035/1994/2035 2033/1992/2033 -f 2035/1994/2035 2050/2009/2050 2051/2010/2051 -f 2051/2010/2051 2037/1996/2037 2035/1994/2035 -f 2037/1996/2037 2051/2010/2051 2052/2011/2052 -f 2052/2011/2052 2039/1998/2039 2037/1996/2037 -f 2039/1998/2039 2052/2011/2052 2053/2012/2053 -f 2053/2012/2053 2041/2000/2041 2039/1998/2039 -f 2043/2002/2043 2054/2013/2054 2055/2014/2055 -f 2055/2014/2055 2044/2003/2044 2043/2002/2043 -f 2044/2003/2044 2055/2014/2055 2056/2015/2056 -f 2056/2015/2056 2045/2004/2045 2044/2003/2044 -f 2045/2004/2045 2056/2015/2056 2057/2016/2057 -f 2057/2016/2057 2046/2005/2046 2045/2004/2045 -f 2046/2005/2046 2057/2016/2057 2058/2017/2058 -f 2058/2017/2058 2047/2006/2047 2046/2005/2046 -f 2047/2006/2047 2058/2017/2058 2059/2018/2059 -f 2059/2018/2059 2048/2007/2048 2047/2006/2047 -f 2048/2007/2048 2059/2018/2059 2060/2019/2060 -f 2060/2019/2060 2049/2008/2049 2048/2007/2048 -f 2049/2008/2049 2060/2019/2060 2061/2020/2061 -f 2061/2020/2061 2050/2009/2050 2049/2008/2049 -f 2050/2009/2050 2061/2020/2061 2062/2021/2062 -f 2062/2021/2062 2051/2010/2051 2050/2009/2050 -f 2051/2010/2051 2062/2021/2062 2063/2022/2063 -f 2063/2022/2063 2052/2011/2052 2051/2010/2051 -f 2052/2011/2052 2063/2022/2063 2064/2023/2064 -f 2064/2023/2064 2053/2012/2053 2052/2011/2052 -f 2054/2013/2054 2065/2024/2065 2066/2025/2066 -f 2066/2025/2066 2055/2014/2055 2054/2013/2054 -f 2055/2014/2055 2066/2025/2066 2067/2026/2067 -f 2067/2026/2067 2056/2015/2056 2055/2014/2055 -f 2056/2015/2056 2067/2026/2067 2068/2027/2068 -f 2068/2027/2068 2057/2016/2057 2056/2015/2056 -f 2057/2016/2057 2068/2027/2068 2069/2028/2069 -f 2069/2028/2069 2058/2017/2058 2057/2016/2057 -f 2058/2017/2058 2069/2028/2069 2070/2029/2070 -f 2070/2029/2070 2059/2018/2059 2058/2017/2058 -f 2059/2018/2059 2070/2029/2070 2071/2030/2071 -f 2071/2030/2071 2060/2019/2060 2059/2018/2059 -f 2060/2019/2060 2071/2030/2071 2072/2031/2072 -f 2072/2031/2072 2061/2020/2061 2060/2019/2060 -f 2061/2020/2061 2072/2031/2072 2073/2032/2073 -f 2073/2032/2073 2062/2021/2062 2061/2020/2061 -f 2062/2021/2062 2073/2032/2073 2074/2033/2074 -f 2074/2033/2074 2063/2022/2063 2062/2021/2062 -f 2063/2022/2063 2074/2033/2074 2075/2034/2075 -f 2075/2034/2075 2064/2023/2064 2063/2022/2063 -f 2065/2024/2065 2076/2035/2076 2077/2036/2077 -f 2077/2036/2077 2066/2025/2066 2065/2024/2065 -f 2066/2025/2066 2077/2036/2077 2078/2037/2078 -f 2078/2037/2078 2067/2026/2067 2066/2025/2066 -f 2067/2026/2067 2078/2037/2078 2079/2038/2079 -f 2079/2038/2079 2068/2027/2068 2067/2026/2067 -f 2068/2027/2068 2079/2038/2079 2080/2039/2080 -f 2080/2039/2080 2069/2028/2069 2068/2027/2068 -f 2069/2028/2069 2080/2039/2080 2081/2040/2081 -f 2081/2040/2081 2070/2029/2070 2069/2028/2069 -f 2070/2029/2070 2081/2040/2081 2082/2041/2082 -f 2082/2041/2082 2071/2030/2071 2070/2029/2070 -f 2071/2030/2071 2082/2041/2082 2083/2042/2083 -f 2083/2042/2083 2072/2031/2072 2071/2030/2071 -f 2072/2031/2072 2083/2042/2083 2084/2043/2084 -f 2084/2043/2084 2073/2032/2073 2072/2031/2072 -f 2073/2032/2073 2084/2043/2084 2085/2044/2085 -f 2085/2044/2085 2074/2033/2074 2073/2032/2073 -f 2074/2033/2074 2085/2044/2085 2086/2045/2086 -f 2086/2045/2086 2075/2034/2075 2074/2033/2074 -f 2076/2035/2076 2087/2024/2087 2088/2046/2088 -f 2088/2046/2088 2077/2036/2077 2076/2035/2076 -f 2077/2036/2077 2088/2046/2088 2089/2047/2089 -f 2089/2047/2089 2078/2037/2078 2077/2036/2077 -f 2078/2037/2078 2089/2047/2089 2090/2048/2090 -f 2090/2048/2090 2079/2038/2079 2078/2037/2078 -f 2079/2038/2079 2090/2048/2090 2091/2049/2091 -f 2091/2049/2091 2080/2039/2080 2079/2038/2079 -f 2080/2039/2080 2091/2049/2091 2092/2050/2092 -f 2092/2050/2092 2081/2040/2081 2080/2039/2080 -f 2081/2040/2081 2092/2050/2092 2093/2051/2093 -f 2093/2051/2093 2082/2041/2082 2081/2040/2081 -f 2082/2041/2082 2093/2051/2093 2094/2052/2094 -f 2094/2052/2094 2083/2042/2083 2082/2041/2082 -f 2083/2042/2083 2094/2052/2094 2095/2053/2095 -f 2095/2053/2095 2084/2043/2084 2083/2042/2083 -f 2084/2043/2084 2095/2053/2095 2096/2054/2096 -f 2096/2054/2096 2085/2044/2085 2084/2043/2084 -f 2085/2044/2085 2096/2054/2096 2097/2055/2097 -f 2097/2055/2097 2086/2045/2086 2085/2044/2085 -f 2087/2024/2087 2098/2013/2098 2099/2056/2099 -f 2099/2056/2099 2088/2046/2088 2087/2024/2087 -f 2088/2046/2088 2099/2056/2099 2100/2057/2100 -f 2100/2057/2100 2089/2047/2089 2088/2046/2088 -f 2089/2047/2089 2100/2057/2100 2101/2058/2101 -f 2101/2058/2101 2090/2048/2090 2089/2047/2089 -f 2090/2048/2090 2101/2058/2101 2102/2059/2102 -f 2102/2059/2102 2091/2049/2091 2090/2048/2090 -f 2091/2049/2091 2102/2059/2102 2103/2060/2103 -f 2103/2060/2103 2092/2050/2092 2091/2049/2091 -f 2092/2050/2092 2103/2060/2103 2104/2061/2104 -f 2104/2061/2104 2093/2051/2093 2092/2050/2092 -f 2093/2051/2093 2104/2061/2104 2105/2062/2105 -f 2105/2062/2105 2094/2052/2094 2093/2051/2093 -f 2094/2052/2094 2105/2062/2105 2106/2063/2106 -f 2106/2063/2106 2095/2053/2095 2094/2052/2094 -f 2095/2053/2095 2106/2063/2106 2107/2064/2107 -f 2107/2064/2107 2096/2054/2096 2095/2053/2095 -f 2096/2054/2096 2107/2064/2107 2108/2065/2108 -f 2108/2065/2108 2097/2055/2097 2096/2054/2096 -f 2098/2013/2098 2109/2002/2109 2110/2066/2110 -f 2110/2066/2110 2099/2056/2099 2098/2013/2098 -f 2099/2056/2099 2110/2066/2110 2111/2067/2111 -f 2111/2067/2111 2100/2057/2100 2099/2056/2099 -f 2100/2057/2100 2111/2067/2111 2112/2068/2112 -f 2112/2068/2112 2101/2058/2101 2100/2057/2100 -f 2101/2058/2101 2112/2068/2112 2113/2069/2113 -f 2113/2069/2113 2102/2059/2102 2101/2058/2101 -f 2102/2059/2102 2113/2069/2113 2114/2070/2114 -f 2114/2070/2114 2103/2060/2103 2102/2059/2102 -f 2103/2060/2103 2114/2070/2114 2115/2071/2115 -f 2115/2071/2115 2104/2061/2104 2103/2060/2103 -f 2104/2061/2104 2115/2071/2115 2116/2072/2116 -f 2116/2072/2116 2105/2062/2105 2104/2061/2104 -f 2105/2062/2105 2116/2072/2116 2117/2073/2117 -f 2117/2073/2117 2106/2063/2106 2105/2062/2105 -f 2106/2063/2106 2117/2073/2117 2118/2074/2118 -f 2118/2074/2118 2107/2064/2107 2106/2063/2106 -f 2107/2064/2107 2118/2074/2118 2119/2075/2119 -f 2119/2075/2119 2108/2065/2108 2107/2064/2107 -f 2109/2002/2109 2120/1981/2120 2121/2076/2121 -f 2121/2076/2121 2110/2066/2110 2109/2002/2109 -f 2110/2066/2110 2121/2076/2121 2122/2077/2122 -f 2122/2077/2122 2111/2067/2111 2110/2066/2110 -f 2111/2067/2111 2122/2077/2122 2123/2078/2123 -f 2123/2078/2123 2112/2068/2112 2111/2067/2111 -f 2112/2068/2112 2123/2078/2123 2124/2079/2124 -f 2124/2079/2124 2113/2069/2113 2112/2068/2112 -f 2113/2069/2113 2124/2079/2124 2125/2080/2125 -f 2125/2080/2125 2114/2070/2114 2113/2069/2113 -f 2114/2070/2114 2125/2080/2125 2126/2081/2126 -f 2126/2081/2126 2115/2071/2115 2114/2070/2114 -f 2115/2071/2115 2126/2081/2126 2127/2082/2127 -f 2127/2082/2127 2116/2072/2116 2115/2071/2115 -f 2116/2072/2116 2127/2082/2127 2128/2083/2128 -f 2128/2083/2128 2117/2073/2117 2116/2072/2116 -f 2117/2073/2117 2128/2083/2128 2129/2084/2129 -f 2129/2084/2129 2118/2074/2118 2117/2073/2117 -f 2118/2074/2118 2129/2084/2129 2130/2085/2130 -f 2130/2085/2130 2119/2075/2119 2118/2074/2118 -f 2120/1981/2120 2131/1980/2131 2132/2086/2132 -f 2132/2086/2132 2121/2076/2121 2120/1981/2120 -f 2121/2076/2121 2132/2086/2132 2133/2087/2133 -f 2133/2087/2133 2122/2077/2122 2121/2076/2121 -f 2122/2077/2122 2133/2087/2133 2134/2088/2134 -f 2134/2088/2134 2123/2078/2123 2122/2077/2122 -f 2123/2078/2123 2134/2088/2134 2135/2089/2135 -f 2135/2089/2135 2124/2079/2124 2123/2078/2123 -f 2124/2079/2124 2135/2089/2135 2136/2090/2136 -f 2136/2090/2136 2125/2080/2125 2124/2079/2124 -f 2125/2080/2125 2136/2090/2136 2137/2091/2137 -f 2137/2091/2137 2126/2081/2126 2125/2080/2125 -f 2126/2081/2126 2137/2091/2137 2138/2092/2138 -f 2138/2092/2138 2127/2082/2127 2126/2081/2126 -f 2127/2082/2127 2138/2092/2138 2139/2093/2139 -f 2139/2093/2139 2128/2083/2128 2127/2082/2127 -f 2128/2083/2128 2139/2093/2139 2140/2094/2140 -f 2140/2094/2140 2129/2084/2129 2128/2083/2128 -f 2129/2084/2129 2140/2094/2140 2141/2095/2141 -f 2141/2095/2141 2130/2085/2130 2129/2084/2129 -f 2131/1980/2131 2142/2096/2142 2143/2097/2143 -f 2143/2097/2143 2132/2086/2132 2131/1980/2131 -f 2132/2086/2132 2143/2097/2143 2144/2098/2144 -f 2144/2098/2144 2133/2087/2133 2132/2086/2132 -f 2133/2087/2133 2144/2098/2144 2145/2099/2145 -f 2145/2099/2145 2134/2088/2134 2133/2087/2133 -f 2134/2088/2134 2145/2099/2145 2146/2100/2146 -f 2146/2100/2146 2135/2089/2135 2134/2088/2134 -f 2135/2089/2135 2146/2100/2146 2147/2101/2147 -f 2147/2101/2147 2136/2090/2136 2135/2089/2135 -f 2136/2090/2136 2147/2101/2147 2148/2102/2148 -f 2148/2102/2148 2137/2091/2137 2136/2090/2136 -f 2137/2091/2137 2148/2102/2148 2149/2103/2149 -f 2149/2103/2149 2138/2092/2138 2137/2091/2137 -f 2138/2092/2138 2149/2103/2149 2150/2104/2150 -f 2150/2104/2150 2139/2093/2139 2138/2092/2138 -f 2139/2093/2139 2150/2104/2150 2151/2105/2151 -f 2151/2105/2151 2140/2094/2140 2139/2093/2139 -f 2140/2094/2140 2151/2105/2151 2152/2106/2152 -f 2152/2106/2152 2141/2095/2141 2140/2094/2140 -f 2142/2096/2142 2153/2107/2153 2154/2108/2154 -f 2154/2108/2154 2143/2097/2143 2142/2096/2142 -f 2143/2097/2143 2154/2108/2154 2155/2109/2155 -f 2155/2109/2155 2144/2098/2144 2143/2097/2143 -f 2144/2098/2144 2155/2109/2155 2156/2110/2156 -f 2156/2110/2156 2145/2099/2145 2144/2098/2144 -f 2145/2099/2145 2156/2110/2156 2157/2111/2157 -f 2157/2111/2157 2146/2100/2146 2145/2099/2145 -f 2146/2100/2146 2157/2111/2157 2158/2112/2158 -f 2158/2112/2158 2147/2101/2147 2146/2100/2146 -f 2147/2101/2147 2158/2112/2158 2159/2113/2159 -f 2159/2113/2159 2148/2102/2148 2147/2101/2147 -f 2148/2102/2148 2159/2113/2159 2160/2114/2160 -f 2160/2114/2160 2149/2103/2149 2148/2102/2148 -f 2149/2103/2149 2160/2114/2160 2161/2115/2161 -f 2161/2115/2161 2150/2104/2150 2149/2103/2149 -f 2150/2104/2150 2161/2115/2161 2162/2116/2162 -f 2162/2116/2162 2151/2105/2151 2150/2104/2150 -f 2151/2105/2151 2162/2116/2162 2163/2117/2163 -f 2163/2117/2163 2152/2106/2152 2151/2105/2151 -f 2153/2107/2153 2164/2118/2164 2165/2119/2165 -f 2165/2119/2165 2154/2108/2154 2153/2107/2153 -f 2154/2108/2154 2165/2119/2165 2166/2120/2166 -f 2166/2120/2166 2155/2109/2155 2154/2108/2154 -f 2155/2109/2155 2166/2120/2166 2167/2121/2167 -f 2167/2121/2167 2156/2110/2156 2155/2109/2155 -f 2156/2110/2156 2167/2121/2167 2168/2122/2168 -f 2168/2122/2168 2157/2111/2157 2156/2110/2156 -f 2157/2111/2157 2168/2122/2168 2169/2123/2169 -f 2169/2123/2169 2158/2112/2158 2157/2111/2157 -f 2158/2112/2158 2169/2123/2169 2170/2124/2170 -f 2170/2124/2170 2159/2113/2159 2158/2112/2158 -f 2159/2113/2159 2170/2124/2170 2171/2125/2171 -f 2171/2125/2171 2160/2114/2160 2159/2113/2159 -f 2160/2114/2160 2171/2125/2171 2172/2126/2172 -f 2172/2126/2172 2161/2115/2161 2160/2114/2160 -f 2161/2115/2161 2172/2126/2172 2173/2127/2173 -f 2173/2127/2173 2162/2116/2162 2161/2115/2161 -f 2162/2116/2162 2173/2127/2173 2174/2128/2174 -f 2174/2128/2174 2163/2117/2163 2162/2116/2162 -f 2164/2118/2164 2175/2129/2175 2176/2130/2176 -f 2176/2130/2176 2165/2119/2165 2164/2118/2164 -f 2165/2119/2165 2176/2130/2176 2177/2131/2177 -f 2177/2131/2177 2166/2120/2166 2165/2119/2165 -f 2166/2120/2166 2177/2131/2177 2178/2132/2178 -f 2178/2132/2178 2167/2121/2167 2166/2120/2166 -f 2167/2121/2167 2178/2132/2178 2179/2133/2179 -f 2179/2133/2179 2168/2122/2168 2167/2121/2167 -f 2168/2122/2168 2179/2133/2179 2180/2134/2180 -f 2180/2134/2180 2169/2123/2169 2168/2122/2168 -f 2169/2123/2169 2180/2134/2180 2181/2135/2181 -f 2181/2135/2181 2170/2124/2170 2169/2123/2169 -f 2170/2124/2170 2181/2135/2181 2182/2136/2182 -f 2182/2136/2182 2171/2125/2171 2170/2124/2170 -f 2171/2125/2171 2182/2136/2182 2183/2137/2183 -f 2183/2137/2183 2172/2126/2172 2171/2125/2171 -f 2172/2126/2172 2183/2137/2183 2184/2138/2184 -f 2184/2138/2184 2173/2127/2173 2172/2126/2172 -f 2173/2127/2173 2184/2138/2184 2185/2139/2185 -f 2185/2139/2185 2174/2128/2174 2173/2127/2173 -f 2175/2129/2175 2186/2140/2186 2187/2141/2187 -f 2187/2141/2187 2176/2130/2176 2175/2129/2175 -f 2176/2130/2176 2187/2141/2187 2188/2142/2188 -f 2188/2142/2188 2177/2131/2177 2176/2130/2176 -f 2177/2131/2177 2188/2142/2188 2189/2143/2189 -f 2189/2143/2189 2178/2132/2178 2177/2131/2177 -f 2178/2132/2178 2189/2143/2189 2190/2144/2190 -f 2190/2144/2190 2179/2133/2179 2178/2132/2178 -f 2179/2133/2179 2190/2144/2190 2191/2145/2191 -f 2191/2145/2191 2180/2134/2180 2179/2133/2179 -f 2180/2134/2180 2191/2145/2191 2192/2146/2192 -f 2192/2146/2192 2181/2135/2181 2180/2134/2180 -f 2181/2135/2181 2192/2146/2192 2193/2147/2193 -f 2193/2147/2193 2182/2136/2182 2181/2135/2181 -f 2182/2136/2182 2193/2147/2193 2194/2148/2194 -f 2194/2148/2194 2183/2137/2183 2182/2136/2182 -f 2183/2137/2183 2194/2148/2194 2195/2149/2195 -f 2195/2149/2195 2184/2138/2184 2183/2137/2183 -f 2184/2138/2184 2195/2149/2195 2196/2150/2196 -f 2196/2150/2196 2185/2139/2185 2184/2138/2184 -f 2186/2140/2186 2197/2129/2197 2198/2151/2198 -f 2198/2151/2198 2187/2141/2187 2186/2140/2186 -f 2187/2141/2187 2198/2151/2198 2199/2152/2199 -f 2199/2152/2199 2188/2142/2188 2187/2141/2187 -f 2188/2142/2188 2199/2152/2199 2200/2153/2200 -f 2200/2153/2200 2189/2143/2189 2188/2142/2188 -f 2189/2143/2189 2200/2153/2200 2201/2154/2201 -f 2201/2154/2201 2190/2144/2190 2189/2143/2189 -f 2190/2144/2190 2201/2154/2201 2202/2155/2202 -f 2202/2155/2202 2191/2145/2191 2190/2144/2190 -f 2191/2145/2191 2202/2155/2202 2203/2156/2203 -f 2203/2156/2203 2192/2146/2192 2191/2145/2191 -f 2192/2146/2192 2203/2156/2203 2204/2157/2204 -f 2204/2157/2204 2193/2147/2193 2192/2146/2192 -f 2193/2147/2193 2204/2157/2204 2205/2158/2205 -f 2205/2158/2205 2194/2148/2194 2193/2147/2193 -f 2194/2148/2194 2205/2158/2205 2206/2159/2206 -f 2206/2159/2206 2195/2149/2195 2194/2148/2194 -f 2195/2149/2195 2206/2159/2206 2207/2160/2207 -f 2207/2160/2207 2196/2150/2196 2195/2149/2195 -f 2197/2129/2197 2208/2118/2208 2209/2161/2209 -f 2209/2161/2209 2198/2151/2198 2197/2129/2197 -f 2198/2151/2198 2209/2161/2209 2210/2162/2210 -f 2210/2162/2210 2199/2152/2199 2198/2151/2198 -f 2199/2152/2199 2210/2162/2210 2211/2163/2211 -f 2211/2163/2211 2200/2153/2200 2199/2152/2199 -f 2200/2153/2200 2211/2163/2211 2212/2164/2212 -f 2212/2164/2212 2201/2154/2201 2200/2153/2200 -f 2201/2154/2201 2212/2164/2212 2213/2165/2213 -f 2213/2165/2213 2202/2155/2202 2201/2154/2201 -f 2202/2155/2202 2213/2165/2213 2214/2166/2214 -f 2214/2166/2214 2203/2156/2203 2202/2155/2202 -f 2203/2156/2203 2214/2166/2214 2215/2167/2215 -f 2215/2167/2215 2204/2157/2204 2203/2156/2203 -f 2204/2157/2204 2215/2167/2215 2216/2168/2216 -f 2216/2168/2216 2205/2158/2205 2204/2157/2204 -f 2205/2158/2205 2216/2168/2216 2217/2169/2217 -f 2217/2169/2217 2206/2159/2206 2205/2158/2205 -f 2206/2159/2206 2217/2169/2217 2218/2170/2218 -f 2218/2170/2218 2207/2160/2207 2206/2159/2206 -f 2208/2118/2208 2219/2107/2219 2220/2171/2220 -f 2220/2171/2220 2209/2161/2209 2208/2118/2208 -f 2209/2161/2209 2220/2171/2220 2221/2172/2221 -f 2221/2172/2221 2210/2162/2210 2209/2161/2209 -f 2210/2162/2210 2221/2172/2221 2222/2173/2222 -f 2222/2173/2222 2211/2163/2211 2210/2162/2210 -f 2211/2163/2211 2222/2173/2222 2223/2174/2223 -f 2223/2174/2223 2212/2164/2212 2211/2163/2211 -f 2212/2164/2212 2223/2174/2223 2224/2175/2224 -f 2224/2175/2224 2213/2165/2213 2212/2164/2212 -f 2213/2165/2213 2224/2175/2224 2225/2176/2225 -f 2225/2176/2225 2214/2166/2214 2213/2165/2213 -f 2214/2166/2214 2225/2176/2225 2226/2177/2226 -f 2226/2177/2226 2215/2167/2215 2214/2166/2214 -f 2215/2167/2215 2226/2177/2226 2227/2178/2227 -f 2227/2178/2227 2216/2168/2216 2215/2167/2215 -f 2216/2168/2216 2227/2178/2227 2228/2179/2228 -f 2228/2179/2228 2217/2169/2217 2216/2168/2216 -f 2217/2169/2217 2228/2179/2228 2229/2180/2229 -f 2229/2180/2229 2218/2170/2218 2217/2169/2217 -f 2219/2107/2219 2230/2096/2230 2231/2181/2231 -f 2231/2181/2231 2220/2171/2220 2219/2107/2219 -f 2220/2171/2220 2231/2181/2231 2232/2182/2232 -f 2232/2182/2232 2221/2172/2221 2220/2171/2220 -f 2221/2172/2221 2232/2182/2232 2233/2183/2233 -f 2233/2183/2233 2222/2173/2222 2221/2172/2221 -f 2222/2173/2222 2233/2183/2233 2234/2184/2234 -f 2234/2184/2234 2223/2174/2223 2222/2173/2222 -f 2223/2174/2223 2234/2184/2234 2235/2185/2235 -f 2235/2185/2235 2224/2175/2224 2223/2174/2223 -f 2224/2175/2224 2235/2185/2235 2236/2186/2236 -f 2236/2186/2236 2225/2176/2225 2224/2175/2224 -f 2225/2176/2225 2236/2186/2236 2237/2187/2237 -f 2237/2187/2237 2226/2177/2226 2225/2176/2225 -f 2226/2177/2226 2237/2187/2237 2238/2188/2238 -f 2238/2188/2238 2227/2178/2227 2226/2177/2226 -f 2227/2178/2227 2238/2188/2238 2239/2189/2239 -f 2239/2189/2239 2228/2179/2228 2227/2178/2227 -f 2228/2179/2228 2239/2189/2239 2240/2190/2240 -f 2240/2190/2240 2229/2180/2229 2228/2179/2228 -f 2230/2096/2230 2021/1980/2021 2024/1983/2024 -f 2024/1983/2024 2231/2181/2231 2230/2096/2230 -f 2231/2181/2231 2024/1983/2024 2026/1985/2026 -f 2026/1985/2026 2232/2182/2232 2231/2181/2231 -f 2232/2182/2232 2026/1985/2026 2028/1987/2028 -f 2028/1987/2028 2233/2183/2233 2232/2182/2232 -f 2233/2183/2233 2028/1987/2028 2030/1989/2030 -f 2030/1989/2030 2234/2184/2234 2233/2183/2233 -f 2234/2184/2234 2030/1989/2030 2032/1991/2032 -f 2032/1991/2032 2235/2185/2235 2234/2184/2234 -f 2235/2185/2235 2032/1991/2032 2034/1993/2034 -f 2034/1993/2034 2236/2186/2236 2235/2185/2235 -f 2236/2186/2236 2034/1993/2034 2036/1995/2036 -f 2036/1995/2036 2237/2187/2237 2236/2186/2236 -f 2237/2187/2237 2036/1995/2036 2038/1997/2038 -f 2038/1997/2038 2238/2188/2238 2237/2187/2237 -f 2238/2188/2238 2038/1997/2038 2040/1999/2040 -f 2040/1999/2040 2239/2189/2239 2238/2188/2238 -f 2239/2189/2239 2040/1999/2040 2042/2001/2042 -f 2042/2001/2042 2240/2190/2240 2239/2189/2239 -f 2042/2001/2042 2041/2000/2041 2241/2191/2241 -f 2241/2191/2241 2242/2192/2242 2042/2001/2042 -f 2242/2192/2242 2241/2191/2241 2243/2193/2243 -f 2243/2193/2243 2244/2194/2244 2242/2192/2242 -f 2244/2194/2244 2243/2193/2243 2245/2195/2245 -f 2245/2195/2245 2246/2196/2246 2244/2194/2244 -f 2246/2196/2246 2245/2195/2245 2247/2197/2247 -f 2247/2197/2247 2248/2198/2248 2246/2196/2246 -f 2248/2198/2248 2247/2197/2247 2249/2199/2249 -f 2249/2199/2249 2250/2200/2250 2248/2198/2248 -f 2250/2200/2250 2249/2199/2249 2251/2201/2251 -f 2251/2201/2251 2252/2202/2252 2250/2200/2250 -f 2252/2202/2252 2251/2201/2251 2253/2203/2253 -f 2253/2203/2253 2254/2204/2254 2252/2202/2252 -f 2254/2204/2254 2253/2203/2253 2255/2205/2255 -f 2255/2205/2255 2256/2206/2256 2254/2204/2254 -f 2256/2206/2256 2255/2205/2255 2257/2207/2257 -f 2257/2207/2257 2258/2208/2258 2256/2206/2256 -f 2258/2208/2258 2257/2207/2257 2259/2209/2259 -f 2259/2209/2259 2260/2210/2260 2258/2208/2258 -f 2041/2000/2041 2053/2012/2053 2261/2211/2261 -f 2261/2211/2261 2241/2191/2241 2041/2000/2041 -f 2241/2191/2241 2261/2211/2261 2262/2212/2262 -f 2262/2212/2262 2243/2193/2243 2241/2191/2241 -f 2243/2193/2243 2262/2212/2262 2263/2213/2263 -f 2263/2213/2263 2245/2195/2245 2243/2193/2243 -f 2245/2195/2245 2263/2213/2263 2264/2214/2264 -f 2264/2214/2264 2247/2197/2247 2245/2195/2245 -f 2247/2197/2247 2264/2214/2264 2265/2215/2265 -f 2265/2215/2265 2249/2199/2249 2247/2197/2247 -f 2249/2199/2249 2265/2215/2265 2266/2216/2266 -f 2266/2216/2266 2251/2201/2251 2249/2199/2249 -f 2251/2201/2251 2266/2216/2266 2267/2217/2267 -f 2267/2217/2267 2253/2203/2253 2251/2201/2251 -f 2253/2203/2253 2267/2217/2267 2268/2218/2268 -f 2268/2218/2268 2255/2205/2255 2253/2203/2253 -f 2255/2205/2255 2268/2218/2268 2269/2219/2269 -f 2269/2219/2269 2257/2207/2257 2255/2205/2255 -f 2257/2207/2257 2269/2219/2269 2270/2220/2270 -f 2270/2220/2270 2259/2209/2259 2257/2207/2257 -f 2053/2012/2053 2064/2023/2064 2271/2221/2271 -f 2271/2221/2271 2261/2211/2261 2053/2012/2053 -f 2261/2211/2261 2271/2221/2271 2272/2222/2272 -f 2272/2222/2272 2262/2212/2262 2261/2211/2261 -f 2262/2212/2262 2272/2222/2272 2273/2223/2273 -f 2273/2223/2273 2263/2213/2263 2262/2212/2262 -f 2263/2213/2263 2273/2223/2273 2274/2224/2274 -f 2274/2224/2274 2264/2214/2264 2263/2213/2263 -f 2264/2214/2264 2274/2224/2274 2275/2225/2275 -f 2275/2225/2275 2265/2215/2265 2264/2214/2264 -f 2265/2215/2265 2275/2225/2275 2276/2226/2276 -f 2276/2226/2276 2266/2216/2266 2265/2215/2265 -f 2266/2216/2266 2276/2226/2276 2277/2227/2277 -f 2277/2227/2277 2267/2217/2267 2266/2216/2266 -f 2267/2217/2267 2277/2227/2277 2278/2228/2278 -f 2278/2228/2278 2268/2218/2268 2267/2217/2267 -f 2268/2218/2268 2278/2228/2278 2279/2229/2279 -f 2279/2229/2279 2269/2219/2269 2268/2218/2268 -f 2269/2219/2269 2279/2229/2279 2280/2230/2280 -f 2280/2230/2280 2270/2220/2270 2269/2219/2269 -f 2064/2023/2064 2075/2034/2075 2281/2231/2281 -f 2281/2231/2281 2271/2221/2271 2064/2023/2064 -f 2271/2221/2271 2281/2231/2281 2282/2232/2282 -f 2282/2232/2282 2272/2222/2272 2271/2221/2271 -f 2272/2222/2272 2282/2232/2282 2283/2233/2283 -f 2283/2233/2283 2273/2223/2273 2272/2222/2272 -f 2273/2223/2273 2283/2233/2283 2284/2234/2284 -f 2284/2234/2284 2274/2224/2274 2273/2223/2273 -f 2274/2224/2274 2284/2234/2284 2285/2235/2285 -f 2285/2235/2285 2275/2225/2275 2274/2224/2274 -f 2275/2225/2275 2285/2235/2285 2286/2236/2286 -f 2286/2236/2286 2276/2226/2276 2275/2225/2275 -f 2276/2226/2276 2286/2236/2286 2287/2237/2287 -f 2287/2237/2287 2277/2227/2277 2276/2226/2276 -f 2277/2227/2277 2287/2237/2287 2288/2238/2288 -f 2288/2238/2288 2278/2228/2278 2277/2227/2277 -f 2278/2228/2278 2288/2238/2288 2289/2239/2289 -f 2289/2239/2289 2279/2229/2279 2278/2228/2278 -f 2279/2229/2279 2289/2239/2289 2290/2240/2290 -f 2290/2240/2290 2280/2230/2280 2279/2229/2279 -f 2075/2034/2075 2086/2045/2086 2291/2241/2291 -f 2291/2241/2291 2281/2231/2281 2075/2034/2075 -f 2281/2231/2281 2291/2241/2291 2292/2242/2292 -f 2292/2242/2292 2282/2232/2282 2281/2231/2281 -f 2282/2232/2282 2292/2242/2292 2293/2243/2293 -f 2293/2243/2293 2283/2233/2283 2282/2232/2282 -f 2283/2233/2283 2293/2243/2293 2294/2244/2294 -f 2294/2244/2294 2284/2234/2284 2283/2233/2283 -f 2284/2234/2284 2294/2244/2294 2295/2245/2295 -f 2295/2245/2295 2285/2235/2285 2284/2234/2284 -f 2285/2235/2285 2295/2245/2295 2296/2246/2296 -f 2296/2246/2296 2286/2236/2286 2285/2235/2285 -f 2286/2236/2286 2296/2246/2296 2297/2247/2297 -f 2297/2247/2297 2287/2237/2287 2286/2236/2286 -f 2287/2237/2287 2297/2247/2297 2298/2248/2298 -f 2298/2248/2298 2288/2238/2288 2287/2237/2287 -f 2288/2238/2288 2298/2248/2298 2299/2249/2299 -f 2299/2249/2299 2289/2239/2289 2288/2238/2288 -f 2289/2239/2289 2299/2249/2299 2300/2250/2300 -f 2300/2250/2300 2290/2240/2290 2289/2239/2289 -f 2086/2045/2086 2097/2055/2097 2301/2251/2301 -f 2301/2251/2301 2291/2241/2291 2086/2045/2086 -f 2291/2241/2291 2301/2251/2301 2302/2252/2302 -f 2302/2252/2302 2292/2242/2292 2291/2241/2291 -f 2292/2242/2292 2302/2252/2302 2303/2253/2303 -f 2303/2253/2303 2293/2243/2293 2292/2242/2292 -f 2293/2243/2293 2303/2253/2303 2304/2254/2304 -f 2304/2254/2304 2294/2244/2294 2293/2243/2293 -f 2294/2244/2294 2304/2254/2304 2305/2255/2305 -f 2305/2255/2305 2295/2245/2295 2294/2244/2294 -f 2295/2245/2295 2305/2255/2305 2306/2256/2306 -f 2306/2256/2306 2296/2246/2296 2295/2245/2295 -f 2296/2246/2296 2306/2256/2306 2307/2257/2307 -f 2307/2257/2307 2297/2247/2297 2296/2246/2296 -f 2297/2247/2297 2307/2257/2307 2308/2258/2308 -f 2308/2258/2308 2298/2248/2298 2297/2247/2297 -f 2298/2248/2298 2308/2258/2308 2309/2259/2309 -f 2309/2259/2309 2299/2249/2299 2298/2248/2298 -f 2299/2249/2299 2309/2259/2309 2310/2260/2310 -f 2310/2260/2310 2300/2250/2300 2299/2249/2299 -f 2097/2055/2097 2108/2065/2108 2311/2261/2311 -f 2311/2261/2311 2301/2251/2301 2097/2055/2097 -f 2301/2251/2301 2311/2261/2311 2312/2262/2312 -f 2312/2262/2312 2302/2252/2302 2301/2251/2301 -f 2302/2252/2302 2312/2262/2312 2313/2263/2313 -f 2313/2263/2313 2303/2253/2303 2302/2252/2302 -f 2303/2253/2303 2313/2263/2313 2314/2264/2314 -f 2314/2264/2314 2304/2254/2304 2303/2253/2303 -f 2304/2254/2304 2314/2264/2314 2315/2265/2315 -f 2315/2265/2315 2305/2255/2305 2304/2254/2304 -f 2305/2255/2305 2315/2265/2315 2316/2266/2316 -f 2316/2266/2316 2306/2256/2306 2305/2255/2305 -f 2306/2256/2306 2316/2266/2316 2317/2267/2317 -f 2317/2267/2317 2307/2257/2307 2306/2256/2306 -f 2307/2257/2307 2317/2267/2317 2318/2268/2318 -f 2318/2268/2318 2308/2258/2308 2307/2257/2307 -f 2308/2258/2308 2318/2268/2318 2319/2269/2319 -f 2319/2269/2319 2309/2259/2309 2308/2258/2308 -f 2309/2259/2309 2319/2269/2319 2320/2270/2320 -f 2320/2270/2320 2310/2260/2310 2309/2259/2309 -f 2108/2065/2108 2119/2075/2119 2321/2271/2321 -f 2321/2271/2321 2311/2261/2311 2108/2065/2108 -f 2311/2261/2311 2321/2271/2321 2322/2272/2322 -f 2322/2272/2322 2312/2262/2312 2311/2261/2311 -f 2312/2262/2312 2322/2272/2322 2323/2273/2323 -f 2323/2273/2323 2313/2263/2313 2312/2262/2312 -f 2313/2263/2313 2323/2273/2323 2324/2274/2324 -f 2324/2274/2324 2314/2264/2314 2313/2263/2313 -f 2314/2264/2314 2324/2274/2324 2325/2275/2325 -f 2325/2275/2325 2315/2265/2315 2314/2264/2314 -f 2315/2265/2315 2325/2275/2325 2326/2276/2326 -f 2326/2276/2326 2316/2266/2316 2315/2265/2315 -f 2316/2266/2316 2326/2276/2326 2327/2277/2327 -f 2327/2277/2327 2317/2267/2317 2316/2266/2316 -f 2317/2267/2317 2327/2277/2327 2328/2278/2328 -f 2328/2278/2328 2318/2268/2318 2317/2267/2317 -f 2318/2268/2318 2328/2278/2328 2329/2279/2329 -f 2329/2279/2329 2319/2269/2319 2318/2268/2318 -f 2319/2269/2319 2329/2279/2329 2330/2280/2330 -f 2330/2280/2330 2320/2270/2320 2319/2269/2319 -f 2119/2075/2119 2130/2085/2130 2331/2281/2331 -f 2331/2281/2331 2321/2271/2321 2119/2075/2119 -f 2321/2271/2321 2331/2281/2331 2332/2282/2332 -f 2332/2282/2332 2322/2272/2322 2321/2271/2321 -f 2322/2272/2322 2332/2282/2332 2333/2283/2333 -f 2333/2283/2333 2323/2273/2323 2322/2272/2322 -f 2323/2273/2323 2333/2283/2333 2334/2284/2334 -f 2334/2284/2334 2324/2274/2324 2323/2273/2323 -f 2324/2274/2324 2334/2284/2334 2335/2285/2335 -f 2335/2285/2335 2325/2275/2325 2324/2274/2324 -f 2325/2275/2325 2335/2285/2335 2336/2286/2336 -f 2336/2286/2336 2326/2276/2326 2325/2275/2325 -f 2326/2276/2326 2336/2286/2336 2337/2287/2337 -f 2337/2287/2337 2327/2277/2327 2326/2276/2326 -f 2327/2277/2327 2337/2287/2337 2338/2288/2338 -f 2338/2288/2338 2328/2278/2328 2327/2277/2327 -f 2328/2278/2328 2338/2288/2338 2339/2289/2339 -f 2339/2289/2339 2329/2279/2329 2328/2278/2328 -f 2329/2279/2329 2339/2289/2339 2340/2290/2340 -f 2340/2290/2340 2330/2280/2330 2329/2279/2329 -f 2130/2085/2130 2141/2095/2141 2341/2291/2341 -f 2341/2291/2341 2331/2281/2331 2130/2085/2130 -f 2331/2281/2331 2341/2291/2341 2342/2292/2342 -f 2342/2292/2342 2332/2282/2332 2331/2281/2331 -f 2332/2282/2332 2342/2292/2342 2343/2293/2343 -f 2343/2293/2343 2333/2283/2333 2332/2282/2332 -f 2333/2283/2333 2343/2293/2343 2344/2294/2344 -f 2344/2294/2344 2334/2284/2334 2333/2283/2333 -f 2334/2284/2334 2344/2294/2344 2345/2295/2345 -f 2345/2295/2345 2335/2285/2335 2334/2284/2334 -f 2335/2285/2335 2345/2295/2345 2346/2296/2346 -f 2346/2296/2346 2336/2286/2336 2335/2285/2335 -f 2336/2286/2336 2346/2296/2346 2347/2297/2347 -f 2347/2297/2347 2337/2287/2337 2336/2286/2336 -f 2337/2287/2337 2347/2297/2347 2348/2298/2348 -f 2348/2298/2348 2338/2288/2338 2337/2287/2337 -f 2338/2288/2338 2348/2298/2348 2349/2299/2349 -f 2349/2299/2349 2339/2289/2339 2338/2288/2338 -f 2339/2289/2339 2349/2299/2349 2350/2300/2350 -f 2350/2300/2350 2340/2290/2340 2339/2289/2339 -f 2141/2095/2141 2152/2106/2152 2351/2301/2351 -f 2351/2301/2351 2341/2291/2341 2141/2095/2141 -f 2341/2291/2341 2351/2301/2351 2352/2302/2352 -f 2352/2302/2352 2342/2292/2342 2341/2291/2341 -f 2342/2292/2342 2352/2302/2352 2353/2303/2353 -f 2353/2303/2353 2343/2293/2343 2342/2292/2342 -f 2343/2293/2343 2353/2303/2353 2354/2304/2354 -f 2354/2304/2354 2344/2294/2344 2343/2293/2343 -f 2344/2294/2344 2354/2304/2354 2355/2305/2355 -f 2355/2305/2355 2345/2295/2345 2344/2294/2344 -f 2345/2295/2345 2355/2305/2355 2356/2306/2356 -f 2356/2306/2356 2346/2296/2346 2345/2295/2345 -f 2346/2296/2346 2356/2306/2356 2357/2307/2357 -f 2357/2307/2357 2347/2297/2347 2346/2296/2346 -f 2347/2297/2347 2357/2307/2357 2358/2308/2358 -f 2358/2308/2358 2348/2298/2348 2347/2297/2347 -f 2348/2298/2348 2358/2308/2358 2359/2309/2359 -f 2359/2309/2359 2349/2299/2349 2348/2298/2348 -f 2349/2299/2349 2359/2309/2359 2360/2310/2360 -f 2360/2310/2360 2350/2300/2350 2349/2299/2349 -f 2152/2106/2152 2163/2117/2163 2361/2311/2361 -f 2361/2311/2361 2351/2301/2351 2152/2106/2152 -f 2351/2301/2351 2361/2311/2361 2362/2312/2362 -f 2362/2312/2362 2352/2302/2352 2351/2301/2351 -f 2352/2302/2352 2362/2312/2362 2363/2313/2363 -f 2363/2313/2363 2353/2303/2353 2352/2302/2352 -f 2353/2303/2353 2363/2313/2363 2364/2314/2364 -f 2364/2314/2364 2354/2304/2354 2353/2303/2353 -f 2354/2304/2354 2364/2314/2364 2365/2315/2365 -f 2365/2315/2365 2355/2305/2355 2354/2304/2354 -f 2355/2305/2355 2365/2315/2365 2366/2316/2366 -f 2366/2316/2366 2356/2306/2356 2355/2305/2355 -f 2356/2306/2356 2366/2316/2366 2367/2317/2367 -f 2367/2317/2367 2357/2307/2357 2356/2306/2356 -f 2357/2307/2357 2367/2317/2367 2368/2318/2368 -f 2368/2318/2368 2358/2308/2358 2357/2307/2357 -f 2358/2308/2358 2368/2318/2368 2369/2319/2369 -f 2369/2319/2369 2359/2309/2359 2358/2308/2358 -f 2359/2309/2359 2369/2319/2369 2370/2320/2370 -f 2370/2320/2370 2360/2310/2360 2359/2309/2359 -f 2163/2117/2163 2174/2128/2174 2371/2321/2371 -f 2371/2321/2371 2361/2311/2361 2163/2117/2163 -f 2361/2311/2361 2371/2321/2371 2372/2322/2372 -f 2372/2322/2372 2362/2312/2362 2361/2311/2361 -f 2362/2312/2362 2372/2322/2372 2373/2323/2373 -f 2373/2323/2373 2363/2313/2363 2362/2312/2362 -f 2363/2313/2363 2373/2323/2373 2374/2324/2374 -f 2374/2324/2374 2364/2314/2364 2363/2313/2363 -f 2364/2314/2364 2374/2324/2374 2375/2325/2375 -f 2375/2325/2375 2365/2315/2365 2364/2314/2364 -f 2365/2315/2365 2375/2325/2375 2376/2326/2376 -f 2376/2326/2376 2366/2316/2366 2365/2315/2365 -f 2366/2316/2366 2376/2326/2376 2377/2327/2377 -f 2377/2327/2377 2367/2317/2367 2366/2316/2366 -f 2367/2317/2367 2377/2327/2377 2378/2328/2378 -f 2378/2328/2378 2368/2318/2368 2367/2317/2367 -f 2368/2318/2368 2378/2328/2378 2379/2329/2379 -f 2379/2329/2379 2369/2319/2369 2368/2318/2368 -f 2369/2319/2369 2379/2329/2379 2380/2330/2380 -f 2380/2330/2380 2370/2320/2370 2369/2319/2369 -f 2174/2128/2174 2185/2139/2185 2381/2331/2381 -f 2381/2331/2381 2371/2321/2371 2174/2128/2174 -f 2371/2321/2371 2381/2331/2381 2382/2332/2382 -f 2382/2332/2382 2372/2322/2372 2371/2321/2371 -f 2372/2322/2372 2382/2332/2382 2383/2333/2383 -f 2383/2333/2383 2373/2323/2373 2372/2322/2372 -f 2373/2323/2373 2383/2333/2383 2384/2334/2384 -f 2384/2334/2384 2374/2324/2374 2373/2323/2373 -f 2374/2324/2374 2384/2334/2384 2385/2335/2385 -f 2385/2335/2385 2375/2325/2375 2374/2324/2374 -f 2375/2325/2375 2385/2335/2385 2386/2336/2386 -f 2386/2336/2386 2376/2326/2376 2375/2325/2375 -f 2376/2326/2376 2386/2336/2386 2387/2337/2387 -f 2387/2337/2387 2377/2327/2377 2376/2326/2376 -f 2377/2327/2377 2387/2337/2387 2388/2338/2388 -f 2388/2338/2388 2378/2328/2378 2377/2327/2377 -f 2378/2328/2378 2388/2338/2388 2389/2339/2389 -f 2389/2339/2389 2379/2329/2379 2378/2328/2378 -f 2379/2329/2379 2389/2339/2389 2390/2340/2390 -f 2390/2340/2390 2380/2330/2380 2379/2329/2379 -f 2185/2139/2185 2196/2150/2196 2391/2341/2391 -f 2391/2341/2391 2381/2331/2381 2185/2139/2185 -f 2381/2331/2381 2391/2341/2391 2392/2342/2392 -f 2392/2342/2392 2382/2332/2382 2381/2331/2381 -f 2382/2332/2382 2392/2342/2392 2393/2343/2393 -f 2393/2343/2393 2383/2333/2383 2382/2332/2382 -f 2383/2333/2383 2393/2343/2393 2394/2344/2394 -f 2394/2344/2394 2384/2334/2384 2383/2333/2383 -f 2384/2334/2384 2394/2344/2394 2395/2345/2395 -f 2395/2345/2395 2385/2335/2385 2384/2334/2384 -f 2385/2335/2385 2395/2345/2395 2396/2346/2396 -f 2396/2346/2396 2386/2336/2386 2385/2335/2385 -f 2386/2336/2386 2396/2346/2396 2397/2347/2397 -f 2397/2347/2397 2387/2337/2387 2386/2336/2386 -f 2387/2337/2387 2397/2347/2397 2398/2348/2398 -f 2398/2348/2398 2388/2338/2388 2387/2337/2387 -f 2388/2338/2388 2398/2348/2398 2399/2349/2399 -f 2399/2349/2399 2389/2339/2389 2388/2338/2388 -f 2389/2339/2389 2399/2349/2399 2400/2350/2400 -f 2400/2350/2400 2390/2340/2390 2389/2339/2389 -f 2196/2150/2196 2207/2160/2207 2401/2351/2401 -f 2401/2351/2401 2391/2341/2391 2196/2150/2196 -f 2391/2341/2391 2401/2351/2401 2402/2352/2402 -f 2402/2352/2402 2392/2342/2392 2391/2341/2391 -f 2392/2342/2392 2402/2352/2402 2403/2353/2403 -f 2403/2353/2403 2393/2343/2393 2392/2342/2392 -f 2393/2343/2393 2403/2353/2403 2404/2354/2404 -f 2404/2354/2404 2394/2344/2394 2393/2343/2393 -f 2394/2344/2394 2404/2354/2404 2405/2355/2405 -f 2405/2355/2405 2395/2345/2395 2394/2344/2394 -f 2395/2345/2395 2405/2355/2405 2406/2356/2406 -f 2406/2356/2406 2396/2346/2396 2395/2345/2395 -f 2396/2346/2396 2406/2356/2406 2407/2357/2407 -f 2407/2357/2407 2397/2347/2397 2396/2346/2396 -f 2397/2347/2397 2407/2357/2407 2408/2358/2408 -f 2408/2358/2408 2398/2348/2398 2397/2347/2397 -f 2398/2348/2398 2408/2358/2408 2409/2359/2409 -f 2409/2359/2409 2399/2349/2399 2398/2348/2398 -f 2399/2349/2399 2409/2359/2409 2410/2360/2410 -f 2410/2360/2410 2400/2350/2400 2399/2349/2399 -f 2207/2160/2207 2218/2170/2218 2411/2361/2411 -f 2411/2361/2411 2401/2351/2401 2207/2160/2207 -f 2401/2351/2401 2411/2361/2411 2412/2362/2412 -f 2412/2362/2412 2402/2352/2402 2401/2351/2401 -f 2402/2352/2402 2412/2362/2412 2413/2363/2413 -f 2413/2363/2413 2403/2353/2403 2402/2352/2402 -f 2403/2353/2403 2413/2363/2413 2414/2364/2414 -f 2414/2364/2414 2404/2354/2404 2403/2353/2403 -f 2404/2354/2404 2414/2364/2414 2415/2365/2415 -f 2415/2365/2415 2405/2355/2405 2404/2354/2404 -f 2405/2355/2405 2415/2365/2415 2416/2366/2416 -f 2416/2366/2416 2406/2356/2406 2405/2355/2405 -f 2406/2356/2406 2416/2366/2416 2417/2367/2417 -f 2417/2367/2417 2407/2357/2407 2406/2356/2406 -f 2407/2357/2407 2417/2367/2417 2418/2368/2418 -f 2418/2368/2418 2408/2358/2408 2407/2357/2407 -f 2408/2358/2408 2418/2368/2418 2419/2369/2419 -f 2419/2369/2419 2409/2359/2409 2408/2358/2408 -f 2409/2359/2409 2419/2369/2419 2420/2370/2420 -f 2420/2370/2420 2410/2360/2410 2409/2359/2409 -f 2218/2170/2218 2229/2180/2229 2421/2371/2421 -f 2421/2371/2421 2411/2361/2411 2218/2170/2218 -f 2411/2361/2411 2421/2371/2421 2422/2372/2422 -f 2422/2372/2422 2412/2362/2412 2411/2361/2411 -f 2412/2362/2412 2422/2372/2422 2423/2373/2423 -f 2423/2373/2423 2413/2363/2413 2412/2362/2412 -f 2413/2363/2413 2423/2373/2423 2424/2374/2424 -f 2424/2374/2424 2414/2364/2414 2413/2363/2413 -f 2414/2364/2414 2424/2374/2424 2425/2375/2425 -f 2425/2375/2425 2415/2365/2415 2414/2364/2414 -f 2415/2365/2415 2425/2375/2425 2426/2376/2426 -f 2426/2376/2426 2416/2366/2416 2415/2365/2415 -f 2416/2366/2416 2426/2376/2426 2427/2377/2427 -f 2427/2377/2427 2417/2367/2417 2416/2366/2416 -f 2417/2367/2417 2427/2377/2427 2428/2378/2428 -f 2428/2378/2428 2418/2368/2418 2417/2367/2417 -f 2418/2368/2418 2428/2378/2428 2429/2379/2429 -f 2429/2379/2429 2419/2369/2419 2418/2368/2418 -f 2419/2369/2419 2429/2379/2429 2430/2380/2430 -f 2430/2380/2430 2420/2370/2420 2419/2369/2419 -f 2229/2180/2229 2240/2190/2240 2431/2381/2431 -f 2431/2381/2431 2421/2371/2421 2229/2180/2229 -f 2421/2371/2421 2431/2381/2431 2432/2382/2432 -f 2432/2382/2432 2422/2372/2422 2421/2371/2421 -f 2422/2372/2422 2432/2382/2432 2433/2383/2433 -f 2433/2383/2433 2423/2373/2423 2422/2372/2422 -f 2423/2373/2423 2433/2383/2433 2434/2384/2434 -f 2434/2384/2434 2424/2374/2424 2423/2373/2423 -f 2424/2374/2424 2434/2384/2434 2435/2385/2435 -f 2435/2385/2435 2425/2375/2425 2424/2374/2424 -f 2425/2375/2425 2435/2385/2435 2436/2386/2436 -f 2436/2386/2436 2426/2376/2426 2425/2375/2425 -f 2426/2376/2426 2436/2386/2436 2437/2387/2437 -f 2437/2387/2437 2427/2377/2427 2426/2376/2426 -f 2427/2377/2427 2437/2387/2437 2438/2388/2438 -f 2438/2388/2438 2428/2378/2428 2427/2377/2427 -f 2428/2378/2428 2438/2388/2438 2439/2389/2439 -f 2439/2389/2439 2429/2379/2429 2428/2378/2428 -f 2429/2379/2429 2439/2389/2439 2440/2390/2440 -f 2440/2390/2440 2430/2380/2430 2429/2379/2429 -f 2240/2190/2240 2042/2001/2042 2242/2192/2242 -f 2242/2192/2242 2431/2381/2431 2240/2190/2240 -f 2431/2381/2431 2242/2192/2242 2244/2194/2244 -f 2244/2194/2244 2432/2382/2432 2431/2381/2431 -f 2432/2382/2432 2244/2194/2244 2246/2196/2246 -f 2246/2196/2246 2433/2383/2433 2432/2382/2432 -f 2433/2383/2433 2246/2196/2246 2248/2198/2248 -f 2248/2198/2248 2434/2384/2434 2433/2383/2433 -f 2434/2384/2434 2248/2198/2248 2250/2200/2250 -f 2250/2200/2250 2435/2385/2435 2434/2384/2434 -f 2435/2385/2435 2250/2200/2250 2252/2202/2252 -f 2252/2202/2252 2436/2386/2436 2435/2385/2435 -f 2436/2386/2436 2252/2202/2252 2254/2204/2254 -f 2254/2204/2254 2437/2387/2437 2436/2386/2436 -f 2437/2387/2437 2254/2204/2254 2256/2206/2256 -f 2256/2206/2256 2438/2388/2438 2437/2387/2437 -f 2438/2388/2438 2256/2206/2256 2258/2208/2258 -f 2258/2208/2258 2439/2389/2439 2438/2388/2438 -f 2439/2389/2439 2258/2208/2258 2260/2210/2260 -f 2260/2210/2260 2440/2390/2440 2439/2389/2439 -f 2442/2391/2441 2443/2392/2442 2441/1219/2443 -f 2443/2392/2442 2442/2391/2441 2444/2393/2444 -f 2444/2393/2444 2445/2394/2445 2443/2392/2442 -f 2445/2394/2445 2444/2393/2444 2446/2395/2446 -f 2446/2395/2446 2447/2396/2447 2445/2394/2445 -f 2447/2396/2447 2446/2395/2446 2448/2397/2448 -f 2448/2397/2448 2449/2398/2449 2447/2396/2447 -f 2449/2398/2449 2448/2397/2448 2450/2399/2450 -f 2450/2399/2450 2451/2400/2451 2449/2398/2449 -f 2451/2400/2451 2450/2399/2450 2452/2401/2452 -f 2452/2401/2452 2453/2402/2453 2451/2400/2451 -f 2453/2402/2453 2452/2401/2452 2454/2403/2454 -f 2454/2403/2454 2455/2404/2455 2453/2402/2453 -f 2455/2404/2455 2454/2403/2454 2456/2405/2456 -f 2456/2405/2456 2457/2406/2457 2455/2404/2455 -f 2457/2406/2457 2456/2405/2456 2458/2407/2458 -f 2458/2407/2458 2459/2408/2459 2457/2406/2457 -f 2459/2408/2459 2458/2407/2458 2460/2409/2460 -f 2460/2409/2460 2461/2410/2461 2459/2408/2459 -f 2462/2411/2462 2442/2391/2441 2441/1219/2443 -f 2442/2391/2441 2462/2411/2462 2463/2412/2463 -f 2463/2412/2463 2444/2393/2444 2442/2391/2441 -f 2444/2393/2444 2463/2412/2463 2464/2413/2464 -f 2464/2413/2464 2446/2395/2446 2444/2393/2444 -f 2446/2395/2446 2464/2413/2464 2465/2414/2465 -f 2465/2414/2465 2448/2397/2448 2446/2395/2446 -f 2448/2397/2448 2465/2414/2465 2466/2415/2466 -f 2466/2415/2466 2450/2399/2450 2448/2397/2448 -f 2450/2399/2450 2466/2415/2466 2467/2416/2467 -f 2467/2416/2467 2452/2401/2452 2450/2399/2450 -f 2452/2401/2452 2467/2416/2467 2468/2417/2468 -f 2468/2417/2468 2454/2403/2454 2452/2401/2452 -f 2454/2403/2454 2468/2417/2468 2469/2418/2469 -f 2469/2418/2469 2456/2405/2456 2454/2403/2454 -f 2456/2405/2456 2469/2418/2469 2470/2419/2470 -f 2470/2419/2470 2458/2407/2458 2456/2405/2456 -f 2458/2407/2458 2470/2419/2470 2471/2420/2471 -f 2471/2420/2471 2460/2409/2460 2458/2407/2458 -f 2472/2421/2472 2462/2411/2462 2441/1219/2443 -f 2462/2411/2462 2472/2421/2472 2473/2422/2473 -f 2473/2422/2473 2463/2412/2463 2462/2411/2462 -f 2463/2412/2463 2473/2422/2473 2474/2423/2474 -f 2474/2423/2474 2464/2413/2464 2463/2412/2463 -f 2464/2413/2464 2474/2423/2474 2475/2424/2475 -f 2475/2424/2475 2465/2414/2465 2464/2413/2464 -f 2465/2414/2465 2475/2424/2475 2476/2425/2476 -f 2476/2425/2476 2466/2415/2466 2465/2414/2465 -f 2466/2415/2466 2476/2425/2476 2477/2426/2477 -f 2477/2426/2477 2467/2416/2467 2466/2415/2466 -f 2467/2416/2467 2477/2426/2477 2478/2427/2478 -f 2478/2427/2478 2468/2417/2468 2467/2416/2467 -f 2468/2417/2468 2478/2427/2478 2479/2428/2479 -f 2479/2428/2479 2469/2418/2469 2468/2417/2468 -f 2469/2418/2469 2479/2428/2479 2480/2429/2480 -f 2480/2429/2480 2470/2419/2470 2469/2418/2469 -f 2470/2419/2470 2480/2429/2480 2481/2430/2481 -f 2481/2430/2481 2471/2420/2471 2470/2419/2470 -f 2482/2431/2482 2472/2421/2472 2441/1219/2443 -f 2472/2421/2472 2482/2431/2482 2483/2432/2483 -f 2483/2432/2483 2473/2422/2473 2472/2421/2472 -f 2473/2422/2473 2483/2432/2483 2484/2433/2484 -f 2484/2433/2484 2474/2423/2474 2473/2422/2473 -f 2474/2423/2474 2484/2433/2484 2485/2434/2485 -f 2485/2434/2485 2475/2424/2475 2474/2423/2474 -f 2475/2424/2475 2485/2434/2485 2486/2435/2486 -f 2486/2435/2486 2476/2425/2476 2475/2424/2475 -f 2476/2425/2476 2486/2435/2486 2487/2436/2487 -f 2487/2436/2487 2477/2426/2477 2476/2425/2476 -f 2477/2426/2477 2487/2436/2487 2488/2437/2488 -f 2488/2437/2488 2478/2427/2478 2477/2426/2477 -f 2478/2427/2478 2488/2437/2488 2489/2438/2489 -f 2489/2438/2489 2479/2428/2479 2478/2427/2478 -f 2479/2428/2479 2489/2438/2489 2490/2439/2490 -f 2490/2439/2490 2480/2429/2480 2479/2428/2479 -f 2480/2429/2480 2490/2439/2490 2491/2440/2491 -f 2491/2440/2491 2481/2430/2481 2480/2429/2480 -f 2492/2441/2492 2482/2431/2482 2441/1219/2443 -f 2482/2431/2482 2492/2441/2492 2493/2442/2493 -f 2493/2442/2493 2483/2432/2483 2482/2431/2482 -f 2483/2432/2483 2493/2442/2493 2494/2443/2494 -f 2494/2443/2494 2484/2433/2484 2483/2432/2483 -f 2484/2433/2484 2494/2443/2494 2495/2444/2495 -f 2495/2444/2495 2485/2434/2485 2484/2433/2484 -f 2485/2434/2485 2495/2444/2495 2496/2445/2496 -f 2496/2445/2496 2486/2435/2486 2485/2434/2485 -f 2486/2435/2486 2496/2445/2496 2497/2446/2497 -f 2497/2446/2497 2487/2436/2487 2486/2435/2486 -f 2487/2436/2487 2497/2446/2497 2498/2447/2498 -f 2498/2447/2498 2488/2437/2488 2487/2436/2487 -f 2488/2437/2488 2498/2447/2498 2499/2448/2499 -f 2499/2448/2499 2489/2438/2489 2488/2437/2488 -f 2489/2438/2489 2499/2448/2499 2500/2449/2500 -f 2500/2449/2500 2490/2439/2490 2489/2438/2489 -f 2490/2439/2490 2500/2449/2500 2501/2450/2501 -f 2501/2450/2501 2491/2440/2491 2490/2439/2490 -f 2502/2451/2502 2492/2441/2492 2441/1219/2443 -f 2492/2441/2492 2502/2451/2502 2503/2452/2503 -f 2503/2452/2503 2493/2442/2493 2492/2441/2492 -f 2493/2442/2493 2503/2452/2503 2504/2453/2504 -f 2504/2453/2504 2494/2443/2494 2493/2442/2493 -f 2494/2443/2494 2504/2453/2504 2505/2454/2505 -f 2505/2454/2505 2495/2444/2495 2494/2443/2494 -f 2495/2444/2495 2505/2454/2505 2506/2455/2506 -f 2506/2455/2506 2496/2445/2496 2495/2444/2495 -f 2496/2445/2496 2506/2455/2506 2507/2456/2507 -f 2507/2456/2507 2497/2446/2497 2496/2445/2496 -f 2497/2446/2497 2507/2456/2507 2508/2457/2508 -f 2508/2457/2508 2498/2447/2498 2497/2446/2497 -f 2498/2447/2498 2508/2457/2508 2509/2458/2509 -f 2509/2458/2509 2499/2448/2499 2498/2447/2498 -f 2499/2448/2499 2509/2458/2509 2510/2459/2510 -f 2510/2459/2510 2500/2449/2500 2499/2448/2499 -f 2500/2449/2500 2510/2459/2510 2511/2460/2511 -f 2511/2460/2511 2501/2450/2501 2500/2449/2500 -f 2512/2461/2512 2502/2451/2502 2441/1219/2443 -f 2502/2451/2502 2512/2461/2512 2513/2462/2513 -f 2513/2462/2513 2503/2452/2503 2502/2451/2502 -f 2503/2452/2503 2513/2462/2513 2514/2463/2514 -f 2514/2463/2514 2504/2453/2504 2503/2452/2503 -f 2504/2453/2504 2514/2463/2514 2515/2464/2515 -f 2515/2464/2515 2505/2454/2505 2504/2453/2504 -f 2505/2454/2505 2515/2464/2515 2516/2465/2516 -f 2516/2465/2516 2506/2455/2506 2505/2454/2505 -f 2506/2455/2506 2516/2465/2516 2517/2466/2517 -f 2517/2466/2517 2507/2456/2507 2506/2455/2506 -f 2507/2456/2507 2517/2466/2517 2518/2467/2518 -f 2518/2467/2518 2508/2457/2508 2507/2456/2507 -f 2508/2457/2508 2518/2467/2518 2519/2468/2519 -f 2519/2468/2519 2509/2458/2509 2508/2457/2508 -f 2509/2458/2509 2519/2468/2519 2520/2469/2520 -f 2520/2469/2520 2510/2459/2510 2509/2458/2509 -f 2510/2459/2510 2520/2469/2520 2521/2470/2521 -f 2521/2470/2521 2511/2460/2511 2510/2459/2510 -f 2522/2471/2522 2512/2461/2512 2441/1219/2443 -f 2512/2461/2512 2522/2471/2522 2523/2472/2523 -f 2523/2472/2523 2513/2462/2513 2512/2461/2512 -f 2513/2462/2513 2523/2472/2523 2524/2473/2524 -f 2524/2473/2524 2514/2463/2514 2513/2462/2513 -f 2514/2463/2514 2524/2473/2524 2525/2474/2525 -f 2525/2474/2525 2515/2464/2515 2514/2463/2514 -f 2515/2464/2515 2525/2474/2525 2526/2475/2526 -f 2526/2475/2526 2516/2465/2516 2515/2464/2515 -f 2516/2465/2516 2526/2475/2526 2527/2476/2527 -f 2527/2476/2527 2517/2466/2517 2516/2465/2516 -f 2517/2466/2517 2527/2476/2527 2528/2477/2528 -f 2528/2477/2528 2518/2467/2518 2517/2466/2517 -f 2518/2467/2518 2528/2477/2528 2529/2478/2529 -f 2529/2478/2529 2519/2468/2519 2518/2467/2518 -f 2519/2468/2519 2529/2478/2529 2530/2479/2530 -f 2530/2479/2530 2520/2469/2520 2519/2468/2519 -f 2520/2469/2520 2530/2479/2530 2531/2480/2531 -f 2531/2480/2531 2521/2470/2521 2520/2469/2520 -f 2532/2481/2532 2522/2471/2522 2441/1219/2443 -f 2522/2471/2522 2532/2481/2532 2533/2482/2533 -f 2533/2482/2533 2523/2472/2523 2522/2471/2522 -f 2523/2472/2523 2533/2482/2533 2534/2483/2534 -f 2534/2483/2534 2524/2473/2524 2523/2472/2523 -f 2524/2473/2524 2534/2483/2534 2535/2484/2535 -f 2535/2484/2535 2525/2474/2525 2524/2473/2524 -f 2525/2474/2525 2535/2484/2535 2536/2485/2536 -f 2536/2485/2536 2526/2475/2526 2525/2474/2525 -f 2526/2475/2526 2536/2485/2536 2537/2486/2537 -f 2537/2486/2537 2527/2476/2527 2526/2475/2526 -f 2527/2476/2527 2537/2486/2537 2538/2487/2538 -f 2538/2487/2538 2528/2477/2528 2527/2476/2527 -f 2528/2477/2528 2538/2487/2538 2539/2488/2539 -f 2539/2488/2539 2529/2478/2529 2528/2477/2528 -f 2529/2478/2529 2539/2488/2539 2540/2489/2540 -f 2540/2489/2540 2530/2479/2530 2529/2478/2529 -f 2530/2479/2530 2540/2489/2540 2541/2490/2541 -f 2541/2490/2541 2531/2480/2531 2530/2479/2530 -f 2542/2491/2542 2532/2481/2532 2441/1219/2443 -f 2532/2481/2532 2542/2491/2542 2543/2492/2543 -f 2543/2492/2543 2533/2482/2533 2532/2481/2532 -f 2533/2482/2533 2543/2492/2543 2544/2493/2544 -f 2544/2493/2544 2534/2483/2534 2533/2482/2533 -f 2534/2483/2534 2544/2493/2544 2545/2494/2545 -f 2545/2494/2545 2535/2484/2535 2534/2483/2534 -f 2535/2484/2535 2545/2494/2545 2546/2495/2546 -f 2546/2495/2546 2536/2485/2536 2535/2484/2535 -f 2536/2485/2536 2546/2495/2546 2547/2496/2547 -f 2547/2496/2547 2537/2486/2537 2536/2485/2536 -f 2537/2486/2537 2547/2496/2547 2548/2497/2548 -f 2548/2497/2548 2538/2487/2538 2537/2486/2537 -f 2538/2487/2538 2548/2497/2548 2549/2498/2549 -f 2549/2498/2549 2539/2488/2539 2538/2487/2538 -f 2539/2488/2539 2549/2498/2549 2550/2499/2550 -f 2550/2499/2550 2540/2489/2540 2539/2488/2539 -f 2540/2489/2540 2550/2499/2550 2551/2500/2551 -f 2551/2500/2551 2541/2490/2541 2540/2489/2540 -f 2552/2501/2552 2542/2491/2542 2441/1219/2443 -f 2542/2491/2542 2552/2501/2552 2553/2502/2553 -f 2553/2502/2553 2543/2492/2543 2542/2491/2542 -f 2543/2492/2543 2553/2502/2553 2554/2503/2554 -f 2554/2503/2554 2544/2493/2544 2543/2492/2543 -f 2544/2493/2544 2554/2503/2554 2555/2504/2555 -f 2555/2504/2555 2545/2494/2545 2544/2493/2544 -f 2545/2494/2545 2555/2504/2555 2556/2505/2556 -f 2556/2505/2556 2546/2495/2546 2545/2494/2545 -f 2546/2495/2546 2556/2505/2556 2557/2506/2557 -f 2557/2506/2557 2547/2496/2547 2546/2495/2546 -f 2547/2496/2547 2557/2506/2557 2558/2507/2558 -f 2558/2507/2558 2548/2497/2548 2547/2496/2547 -f 2548/2497/2548 2558/2507/2558 2559/2508/2559 -f 2559/2508/2559 2549/2498/2549 2548/2497/2548 -f 2549/2498/2549 2559/2508/2559 2560/2509/2560 -f 2560/2509/2560 2550/2499/2550 2549/2498/2549 -f 2550/2499/2550 2560/2509/2560 2561/2510/2561 -f 2561/2510/2561 2551/2500/2551 2550/2499/2550 -f 2562/2511/2562 2552/2501/2552 2441/1219/2443 -f 2552/2501/2552 2562/2511/2562 2563/2512/2563 -f 2563/2512/2563 2553/2502/2553 2552/2501/2552 -f 2553/2502/2553 2563/2512/2563 2564/2513/2564 -f 2564/2513/2564 2554/2503/2554 2553/2502/2553 -f 2554/2503/2554 2564/2513/2564 2565/2514/2565 -f 2565/2514/2565 2555/2504/2555 2554/2503/2554 -f 2555/2504/2555 2565/2514/2565 2566/2515/2566 -f 2566/2515/2566 2556/2505/2556 2555/2504/2555 -f 2556/2505/2556 2566/2515/2566 2567/2516/2567 -f 2567/2516/2567 2557/2506/2557 2556/2505/2556 -f 2557/2506/2557 2567/2516/2567 2568/2517/2568 -f 2568/2517/2568 2558/2507/2558 2557/2506/2557 -f 2558/2507/2558 2568/2517/2568 2569/2518/2569 -f 2569/2518/2569 2559/2508/2559 2558/2507/2558 -f 2559/2508/2559 2569/2518/2569 2570/2519/2570 -f 2570/2519/2570 2560/2509/2560 2559/2508/2559 -f 2560/2509/2560 2570/2519/2570 2571/2520/2571 -f 2571/2520/2571 2561/2510/2561 2560/2509/2560 -f 2572/2521/2572 2562/2511/2562 2441/1219/2443 -f 2562/2511/2562 2572/2521/2572 2573/2522/2573 -f 2573/2522/2573 2563/2512/2563 2562/2511/2562 -f 2563/2512/2563 2573/2522/2573 2574/2523/2574 -f 2574/2523/2574 2564/2513/2564 2563/2512/2563 -f 2564/2513/2564 2574/2523/2574 2575/2524/2575 -f 2575/2524/2575 2565/2514/2565 2564/2513/2564 -f 2565/2514/2565 2575/2524/2575 2576/2525/2576 -f 2576/2525/2576 2566/2515/2566 2565/2514/2565 -f 2566/2515/2566 2576/2525/2576 2577/2526/2577 -f 2577/2526/2577 2567/2516/2567 2566/2515/2566 -f 2567/2516/2567 2577/2526/2577 2578/2527/2578 -f 2578/2527/2578 2568/2517/2568 2567/2516/2567 -f 2568/2517/2568 2578/2527/2578 2579/2528/2579 -f 2579/2528/2579 2569/2518/2569 2568/2517/2568 -f 2569/2518/2569 2579/2528/2579 2580/2529/2580 -f 2580/2529/2580 2570/2519/2570 2569/2518/2569 -f 2570/2519/2570 2580/2529/2580 2581/2530/2581 -f 2581/2530/2581 2571/2520/2571 2570/2519/2570 -f 2582/2531/2582 2572/2521/2572 2441/1219/2443 -f 2572/2521/2572 2582/2531/2582 2583/2532/2583 -f 2583/2532/2583 2573/2522/2573 2572/2521/2572 -f 2573/2522/2573 2583/2532/2583 2584/2533/2584 -f 2584/2533/2584 2574/2523/2574 2573/2522/2573 -f 2574/2523/2574 2584/2533/2584 2585/2534/2585 -f 2585/2534/2585 2575/2524/2575 2574/2523/2574 -f 2575/2524/2575 2585/2534/2585 2586/2535/2586 -f 2586/2535/2586 2576/2525/2576 2575/2524/2575 -f 2576/2525/2576 2586/2535/2586 2587/2536/2587 -f 2587/2536/2587 2577/2526/2577 2576/2525/2576 -f 2577/2526/2577 2587/2536/2587 2588/2537/2588 -f 2588/2537/2588 2578/2527/2578 2577/2526/2577 -f 2578/2527/2578 2588/2537/2588 2589/2538/2589 -f 2589/2538/2589 2579/2528/2579 2578/2527/2578 -f 2579/2528/2579 2589/2538/2589 2590/2539/2590 -f 2590/2539/2590 2580/2529/2580 2579/2528/2579 -f 2580/2529/2580 2590/2539/2590 2591/2540/2591 -f 2591/2540/2591 2581/2530/2581 2580/2529/2580 -f 2592/2541/2592 2582/2531/2582 2441/1219/2443 -f 2582/2531/2582 2592/2541/2592 2593/2542/2593 -f 2593/2542/2593 2583/2532/2583 2582/2531/2582 -f 2583/2532/2583 2593/2542/2593 2594/2543/2594 -f 2594/2543/2594 2584/2533/2584 2583/2532/2583 -f 2584/2533/2584 2594/2543/2594 2595/2544/2595 -f 2595/2544/2595 2585/2534/2585 2584/2533/2584 -f 2585/2534/2585 2595/2544/2595 2596/2545/2596 -f 2596/2545/2596 2586/2535/2586 2585/2534/2585 -f 2586/2535/2586 2596/2545/2596 2597/2546/2597 -f 2597/2546/2597 2587/2536/2587 2586/2535/2586 -f 2587/2536/2587 2597/2546/2597 2598/2547/2598 -f 2598/2547/2598 2588/2537/2588 2587/2536/2587 -f 2588/2537/2588 2598/2547/2598 2599/2548/2599 -f 2599/2548/2599 2589/2538/2589 2588/2537/2588 -f 2589/2538/2589 2599/2548/2599 2600/2549/2600 -f 2600/2549/2600 2590/2539/2590 2589/2538/2589 -f 2590/2539/2590 2600/2549/2600 2601/2550/2601 -f 2601/2550/2601 2591/2540/2591 2590/2539/2590 -f 2602/2551/2602 2592/2541/2592 2441/1219/2443 -f 2592/2541/2592 2602/2551/2602 2603/2552/2603 -f 2603/2552/2603 2593/2542/2593 2592/2541/2592 -f 2593/2542/2593 2603/2552/2603 2604/2553/2604 -f 2604/2553/2604 2594/2543/2594 2593/2542/2593 -f 2594/2543/2594 2604/2553/2604 2605/2554/2605 -f 2605/2554/2605 2595/2544/2595 2594/2543/2594 -f 2595/2544/2595 2605/2554/2605 2606/2555/2606 -f 2606/2555/2606 2596/2545/2596 2595/2544/2595 -f 2596/2545/2596 2606/2555/2606 2607/2556/2607 -f 2607/2556/2607 2597/2546/2597 2596/2545/2596 -f 2597/2546/2597 2607/2556/2607 2608/2557/2608 -f 2608/2557/2608 2598/2547/2598 2597/2546/2597 -f 2598/2547/2598 2608/2557/2608 2609/2558/2609 -f 2609/2558/2609 2599/2548/2599 2598/2547/2598 -f 2599/2548/2599 2609/2558/2609 2610/2559/2610 -f 2610/2559/2610 2600/2549/2600 2599/2548/2599 -f 2600/2549/2600 2610/2559/2610 2611/2560/2611 -f 2611/2560/2611 2601/2550/2601 2600/2549/2600 -f 2612/2561/2612 2602/2551/2602 2441/1219/2443 -f 2602/2551/2602 2612/2561/2612 2613/2562/2613 -f 2613/2562/2613 2603/2552/2603 2602/2551/2602 -f 2603/2552/2603 2613/2562/2613 2614/2563/2614 -f 2614/2563/2614 2604/2553/2604 2603/2552/2603 -f 2604/2553/2604 2614/2563/2614 2615/2564/2615 -f 2615/2564/2615 2605/2554/2605 2604/2553/2604 -f 2605/2554/2605 2615/2564/2615 2616/2565/2616 -f 2616/2565/2616 2606/2555/2606 2605/2554/2605 -f 2606/2555/2606 2616/2565/2616 2617/2566/2617 -f 2617/2566/2617 2607/2556/2607 2606/2555/2606 -f 2607/2556/2607 2617/2566/2617 2618/2567/2618 -f 2618/2567/2618 2608/2557/2608 2607/2556/2607 -f 2608/2557/2608 2618/2567/2618 2619/2568/2619 -f 2619/2568/2619 2609/2558/2609 2608/2557/2608 -f 2609/2558/2609 2619/2568/2619 2620/2569/2620 -f 2620/2569/2620 2610/2559/2610 2609/2558/2609 -f 2610/2559/2610 2620/2569/2620 2621/2570/2621 -f 2621/2570/2621 2611/2560/2611 2610/2559/2610 -f 2622/2571/2622 2612/2561/2612 2441/1219/2443 -f 2612/2561/2612 2622/2571/2622 2623/2572/2623 -f 2623/2572/2623 2613/2562/2613 2612/2561/2612 -f 2613/2562/2613 2623/2572/2623 2624/2573/2624 -f 2624/2573/2624 2614/2563/2614 2613/2562/2613 -f 2614/2563/2614 2624/2573/2624 2625/2574/2625 -f 2625/2574/2625 2615/2564/2615 2614/2563/2614 -f 2615/2564/2615 2625/2574/2625 2626/2575/2626 -f 2626/2575/2626 2616/2565/2616 2615/2564/2615 -f 2616/2565/2616 2626/2575/2626 2627/2576/2627 -f 2627/2576/2627 2617/2566/2617 2616/2565/2616 -f 2617/2566/2617 2627/2576/2627 2628/2577/2628 -f 2628/2577/2628 2618/2567/2618 2617/2566/2617 -f 2618/2567/2618 2628/2577/2628 2629/2578/2629 -f 2629/2578/2629 2619/2568/2619 2618/2567/2618 -f 2619/2568/2619 2629/2578/2629 2630/2579/2630 -f 2630/2579/2630 2620/2569/2620 2619/2568/2619 -f 2620/2569/2620 2630/2579/2630 2631/2580/2631 -f 2631/2580/2631 2621/2570/2621 2620/2569/2620 -f 2632/2581/2632 2622/2571/2622 2441/1219/2443 -f 2622/2571/2622 2632/2581/2632 2633/2582/2633 -f 2633/2582/2633 2623/2572/2623 2622/2571/2622 -f 2623/2572/2623 2633/2582/2633 2634/2583/2634 -f 2634/2583/2634 2624/2573/2624 2623/2572/2623 -f 2624/2573/2624 2634/2583/2634 2635/2584/2635 -f 2635/2584/2635 2625/2574/2625 2624/2573/2624 -f 2625/2574/2625 2635/2584/2635 2636/2585/2636 -f 2636/2585/2636 2626/2575/2626 2625/2574/2625 -f 2626/2575/2626 2636/2585/2636 2637/2586/2637 -f 2637/2586/2637 2627/2576/2627 2626/2575/2626 -f 2627/2576/2627 2637/2586/2637 2638/2587/2638 -f 2638/2587/2638 2628/2577/2628 2627/2576/2627 -f 2628/2577/2628 2638/2587/2638 2639/2588/2639 -f 2639/2588/2639 2629/2578/2629 2628/2577/2628 -f 2629/2578/2629 2639/2588/2639 2640/2589/2640 -f 2640/2589/2640 2630/2579/2630 2629/2578/2629 -f 2630/2579/2630 2640/2589/2640 2641/2590/2641 -f 2641/2590/2641 2631/2580/2631 2630/2579/2630 -f 2642/2591/2642 2632/2581/2632 2441/1219/2443 -f 2632/2581/2632 2642/2591/2642 2643/2592/2643 -f 2643/2592/2643 2633/2582/2633 2632/2581/2632 -f 2633/2582/2633 2643/2592/2643 2644/2593/2644 -f 2644/2593/2644 2634/2583/2634 2633/2582/2633 -f 2634/2583/2634 2644/2593/2644 2645/2594/2645 -f 2645/2594/2645 2635/2584/2635 2634/2583/2634 -f 2635/2584/2635 2645/2594/2645 2646/2595/2646 -f 2646/2595/2646 2636/2585/2636 2635/2584/2635 -f 2636/2585/2636 2646/2595/2646 2647/2596/2647 -f 2647/2596/2647 2637/2586/2637 2636/2585/2636 -f 2637/2586/2637 2647/2596/2647 2648/2597/2648 -f 2648/2597/2648 2638/2587/2638 2637/2586/2637 -f 2638/2587/2638 2648/2597/2648 2649/2598/2649 -f 2649/2598/2649 2639/2588/2639 2638/2587/2638 -f 2639/2588/2639 2649/2598/2649 2650/2599/2650 -f 2650/2599/2650 2640/2589/2640 2639/2588/2639 -f 2640/2589/2640 2650/2599/2650 2651/2600/2651 -f 2651/2600/2651 2641/2590/2641 2640/2589/2640 -f 2652/2601/2652 2642/2591/2642 2441/1219/2443 -f 2642/2591/2642 2652/2601/2652 2653/2602/2653 -f 2653/2602/2653 2643/2592/2643 2642/2591/2642 -f 2643/2592/2643 2653/2602/2653 2654/2603/2654 -f 2654/2603/2654 2644/2593/2644 2643/2592/2643 -f 2644/2593/2644 2654/2603/2654 2655/2604/2655 -f 2655/2604/2655 2645/2594/2645 2644/2593/2644 -f 2645/2594/2645 2655/2604/2655 2656/2605/2656 -f 2656/2605/2656 2646/2595/2646 2645/2594/2645 -f 2646/2595/2646 2656/2605/2656 2657/2606/2657 -f 2657/2606/2657 2647/2596/2647 2646/2595/2646 -f 2647/2596/2647 2657/2606/2657 2658/2607/2658 -f 2658/2607/2658 2648/2597/2648 2647/2596/2647 -f 2648/2597/2648 2658/2607/2658 2659/2608/2659 -f 2659/2608/2659 2649/2598/2649 2648/2597/2648 -f 2649/2598/2649 2659/2608/2659 2660/2609/2660 -f 2660/2609/2660 2650/2599/2650 2649/2598/2649 -f 2650/2599/2650 2660/2609/2660 2661/2610/2661 -f 2661/2610/2661 2651/2600/2651 2650/2599/2650 -f 2662/2611/2662 2652/2601/2652 2441/1219/2443 -f 2652/2601/2652 2662/2611/2662 2663/2612/2663 -f 2663/2612/2663 2653/2602/2653 2652/2601/2652 -f 2653/2602/2653 2663/2612/2663 2664/2613/2664 -f 2664/2613/2664 2654/2603/2654 2653/2602/2653 -f 2654/2603/2654 2664/2613/2664 2665/2614/2665 -f 2665/2614/2665 2655/2604/2655 2654/2603/2654 -f 2655/2604/2655 2665/2614/2665 2666/2615/2666 -f 2666/2615/2666 2656/2605/2656 2655/2604/2655 -f 2656/2605/2656 2666/2615/2666 2667/2616/2667 -f 2667/2616/2667 2657/2606/2657 2656/2605/2656 -f 2657/2606/2657 2667/2616/2667 2668/2617/2668 -f 2668/2617/2668 2658/2607/2658 2657/2606/2657 -f 2658/2607/2658 2668/2617/2668 2669/2618/2669 -f 2669/2618/2669 2659/2608/2659 2658/2607/2658 -f 2659/2608/2659 2669/2618/2669 2670/2619/2670 -f 2670/2619/2670 2660/2609/2660 2659/2608/2659 -f 2660/2609/2660 2670/2619/2670 2671/2620/2671 -f 2671/2620/2671 2661/2610/2661 2660/2609/2660 -f 2672/2621/2672 2662/2611/2662 2441/1219/2443 -f 2662/2611/2662 2672/2621/2672 2673/2622/2673 -f 2673/2622/2673 2663/2612/2663 2662/2611/2662 -f 2663/2612/2663 2673/2622/2673 2674/2623/2674 -f 2674/2623/2674 2664/2613/2664 2663/2612/2663 -f 2664/2613/2664 2674/2623/2674 2675/2624/2675 -f 2675/2624/2675 2665/2614/2665 2664/2613/2664 -f 2665/2614/2665 2675/2624/2675 2676/2625/2676 -f 2676/2625/2676 2666/2615/2666 2665/2614/2665 -f 2666/2615/2666 2676/2625/2676 2677/2626/2677 -f 2677/2626/2677 2667/2616/2667 2666/2615/2666 -f 2667/2616/2667 2677/2626/2677 2678/2627/2678 -f 2678/2627/2678 2668/2617/2668 2667/2616/2667 -f 2668/2617/2668 2678/2627/2678 2679/2628/2679 -f 2679/2628/2679 2669/2618/2669 2668/2617/2668 -f 2669/2618/2669 2679/2628/2679 2680/2629/2680 -f 2680/2629/2680 2670/2619/2670 2669/2618/2669 -f 2670/2619/2670 2680/2629/2680 2681/2630/2681 -f 2681/2630/2681 2671/2620/2671 2670/2619/2670 -f 2682/2631/2682 2672/2621/2672 2441/1219/2443 -f 2672/2621/2672 2682/2631/2682 2683/2632/2683 -f 2683/2632/2683 2673/2622/2673 2672/2621/2672 -f 2673/2622/2673 2683/2632/2683 2684/2633/2684 -f 2684/2633/2684 2674/2623/2674 2673/2622/2673 -f 2674/2623/2674 2684/2633/2684 2685/2634/2685 -f 2685/2634/2685 2675/2624/2675 2674/2623/2674 -f 2675/2624/2675 2685/2634/2685 2686/2635/2686 -f 2686/2635/2686 2676/2625/2676 2675/2624/2675 -f 2676/2625/2676 2686/2635/2686 2687/2636/2687 -f 2687/2636/2687 2677/2626/2677 2676/2625/2676 -f 2677/2626/2677 2687/2636/2687 2688/2637/2688 -f 2688/2637/2688 2678/2627/2678 2677/2626/2677 -f 2678/2627/2678 2688/2637/2688 2689/2638/2689 -f 2689/2638/2689 2679/2628/2679 2678/2627/2678 -f 2679/2628/2679 2689/2638/2689 2690/2639/2690 -f 2690/2639/2690 2680/2629/2680 2679/2628/2679 -f 2680/2629/2680 2690/2639/2690 2691/2640/2691 -f 2691/2640/2691 2681/2630/2681 2680/2629/2680 -f 2692/2641/2692 2682/2631/2682 2441/1219/2443 -f 2682/2631/2682 2692/2641/2692 2693/2642/2693 -f 2693/2642/2693 2683/2632/2683 2682/2631/2682 -f 2683/2632/2683 2693/2642/2693 2694/2643/2694 -f 2694/2643/2694 2684/2633/2684 2683/2632/2683 -f 2684/2633/2684 2694/2643/2694 2695/2644/2695 -f 2695/2644/2695 2685/2634/2685 2684/2633/2684 -f 2685/2634/2685 2695/2644/2695 2696/2645/2696 -f 2696/2645/2696 2686/2635/2686 2685/2634/2685 -f 2686/2635/2686 2696/2645/2696 2697/2646/2697 -f 2697/2646/2697 2687/2636/2687 2686/2635/2686 -f 2687/2636/2687 2697/2646/2697 2698/2647/2698 -f 2698/2647/2698 2688/2637/2688 2687/2636/2687 -f 2688/2637/2688 2698/2647/2698 2699/2648/2699 -f 2699/2648/2699 2689/2638/2689 2688/2637/2688 -f 2689/2638/2689 2699/2648/2699 2700/2649/2700 -f 2700/2649/2700 2690/2639/2690 2689/2638/2689 -f 2690/2639/2690 2700/2649/2700 2701/2650/2701 -f 2701/2650/2701 2691/2640/2691 2690/2639/2690 -f 2702/2651/2702 2692/2641/2692 2441/1219/2443 -f 2692/2641/2692 2702/2651/2702 2703/2652/2703 -f 2703/2652/2703 2693/2642/2693 2692/2641/2692 -f 2693/2642/2693 2703/2652/2703 2704/2653/2704 -f 2704/2653/2704 2694/2643/2694 2693/2642/2693 -f 2694/2643/2694 2704/2653/2704 2705/2654/2705 -f 2705/2654/2705 2695/2644/2695 2694/2643/2694 -f 2695/2644/2695 2705/2654/2705 2706/2655/2706 -f 2706/2655/2706 2696/2645/2696 2695/2644/2695 -f 2696/2645/2696 2706/2655/2706 2707/2656/2707 -f 2707/2656/2707 2697/2646/2697 2696/2645/2696 -f 2697/2646/2697 2707/2656/2707 2708/2657/2708 -f 2708/2657/2708 2698/2647/2698 2697/2646/2697 -f 2698/2647/2698 2708/2657/2708 2709/2658/2709 -f 2709/2658/2709 2699/2648/2699 2698/2647/2698 -f 2699/2648/2699 2709/2658/2709 2710/2659/2710 -f 2710/2659/2710 2700/2649/2700 2699/2648/2699 -f 2700/2649/2700 2710/2659/2710 2711/2660/2711 -f 2711/2660/2711 2701/2650/2701 2700/2649/2700 -f 2712/2661/2712 2702/2651/2702 2441/1219/2443 -f 2702/2651/2702 2712/2661/2712 2713/2662/2713 -f 2713/2662/2713 2703/2652/2703 2702/2651/2702 -f 2703/2652/2703 2713/2662/2713 2714/2663/2714 -f 2714/2663/2714 2704/2653/2704 2703/2652/2703 -f 2704/2653/2704 2714/2663/2714 2715/2664/2715 -f 2715/2664/2715 2705/2654/2705 2704/2653/2704 -f 2705/2654/2705 2715/2664/2715 2716/2665/2716 -f 2716/2665/2716 2706/2655/2706 2705/2654/2705 -f 2706/2655/2706 2716/2665/2716 2717/2666/2717 -f 2717/2666/2717 2707/2656/2707 2706/2655/2706 -f 2707/2656/2707 2717/2666/2717 2718/2667/2718 -f 2718/2667/2718 2708/2657/2708 2707/2656/2707 -f 2708/2657/2708 2718/2667/2718 2719/2668/2719 -f 2719/2668/2719 2709/2658/2709 2708/2657/2708 -f 2709/2658/2709 2719/2668/2719 2720/2669/2720 -f 2720/2669/2720 2710/2659/2710 2709/2658/2709 -f 2710/2659/2710 2720/2669/2720 2721/2670/2721 -f 2721/2670/2721 2711/2660/2711 2710/2659/2710 -f 2722/2671/2722 2712/2661/2712 2441/1219/2443 -f 2712/2661/2712 2722/2671/2722 2723/2672/2723 -f 2723/2672/2723 2713/2662/2713 2712/2661/2712 -f 2713/2662/2713 2723/2672/2723 2724/2673/2724 -f 2724/2673/2724 2714/2663/2714 2713/2662/2713 -f 2714/2663/2714 2724/2673/2724 2725/2674/2725 -f 2725/2674/2725 2715/2664/2715 2714/2663/2714 -f 2715/2664/2715 2725/2674/2725 2726/2675/2726 -f 2726/2675/2726 2716/2665/2716 2715/2664/2715 -f 2716/2665/2716 2726/2675/2726 2727/2676/2727 -f 2727/2676/2727 2717/2666/2717 2716/2665/2716 -f 2717/2666/2717 2727/2676/2727 2728/2677/2728 -f 2728/2677/2728 2718/2667/2718 2717/2666/2717 -f 2718/2667/2718 2728/2677/2728 2729/2678/2729 -f 2729/2678/2729 2719/2668/2719 2718/2667/2718 -f 2719/2668/2719 2729/2678/2729 2730/2679/2730 -f 2730/2679/2730 2720/2669/2720 2719/2668/2719 -f 2720/2669/2720 2730/2679/2730 2731/2680/2731 -f 2731/2680/2731 2721/2670/2721 2720/2669/2720 -f 2732/2681/2732 2722/2671/2722 2441/1219/2443 -f 2722/2671/2722 2732/2681/2732 2733/2682/2733 -f 2733/2682/2733 2723/2672/2723 2722/2671/2722 -f 2723/2672/2723 2733/2682/2733 2734/2683/2734 -f 2734/2683/2734 2724/2673/2724 2723/2672/2723 -f 2724/2673/2724 2734/2683/2734 2735/2684/2735 -f 2735/2684/2735 2725/2674/2725 2724/2673/2724 -f 2725/2674/2725 2735/2684/2735 2736/2685/2736 -f 2736/2685/2736 2726/2675/2726 2725/2674/2725 -f 2726/2675/2726 2736/2685/2736 2737/2686/2737 -f 2737/2686/2737 2727/2676/2727 2726/2675/2726 -f 2727/2676/2727 2737/2686/2737 2738/2687/2738 -f 2738/2687/2738 2728/2677/2728 2727/2676/2727 -f 2728/2677/2728 2738/2687/2738 2739/2688/2739 -f 2739/2688/2739 2729/2678/2729 2728/2677/2728 -f 2729/2678/2729 2739/2688/2739 2740/2689/2740 -f 2740/2689/2740 2730/2679/2730 2729/2678/2729 -f 2730/2679/2730 2740/2689/2740 2741/2690/2741 -f 2741/2690/2741 2731/2680/2731 2730/2679/2730 -f 2742/2691/2742 2732/2681/2732 2441/1219/2443 -f 2732/2681/2732 2742/2691/2742 2743/2692/2743 -f 2743/2692/2743 2733/2682/2733 2732/2681/2732 -f 2733/2682/2733 2743/2692/2743 2744/2693/2744 -f 2744/2693/2744 2734/2683/2734 2733/2682/2733 -f 2734/2683/2734 2744/2693/2744 2745/2694/2745 -f 2745/2694/2745 2735/2684/2735 2734/2683/2734 -f 2735/2684/2735 2745/2694/2745 2746/2695/2746 -f 2746/2695/2746 2736/2685/2736 2735/2684/2735 -f 2736/2685/2736 2746/2695/2746 2747/2696/2747 -f 2747/2696/2747 2737/2686/2737 2736/2685/2736 -f 2737/2686/2737 2747/2696/2747 2748/2697/2748 -f 2748/2697/2748 2738/2687/2738 2737/2686/2737 -f 2738/2687/2738 2748/2697/2748 2749/2698/2749 -f 2749/2698/2749 2739/2688/2739 2738/2687/2738 -f 2739/2688/2739 2749/2698/2749 2750/2699/2750 -f 2750/2699/2750 2740/2689/2740 2739/2688/2739 -f 2740/2689/2740 2750/2699/2750 2751/2700/2751 -f 2751/2700/2751 2741/2690/2741 2740/2689/2740 -f 2752/2701/2752 2742/2691/2742 2441/1219/2443 -f 2742/2691/2742 2752/2701/2752 2753/2702/2753 -f 2753/2702/2753 2743/2692/2743 2742/2691/2742 -f 2743/2692/2743 2753/2702/2753 2754/2703/2754 -f 2754/2703/2754 2744/2693/2744 2743/2692/2743 -f 2744/2693/2744 2754/2703/2754 2755/2704/2755 -f 2755/2704/2755 2745/2694/2745 2744/2693/2744 -f 2745/2694/2745 2755/2704/2755 2756/2705/2756 -f 2756/2705/2756 2746/2695/2746 2745/2694/2745 -f 2746/2695/2746 2756/2705/2756 2757/2706/2757 -f 2757/2706/2757 2747/2696/2747 2746/2695/2746 -f 2747/2696/2747 2757/2706/2757 2758/2707/2758 -f 2758/2707/2758 2748/2697/2748 2747/2696/2747 -f 2748/2697/2748 2758/2707/2758 2759/2708/2759 -f 2759/2708/2759 2749/2698/2749 2748/2697/2748 -f 2749/2698/2749 2759/2708/2759 2760/2709/2760 -f 2760/2709/2760 2750/2699/2750 2749/2698/2749 -f 2750/2699/2750 2760/2709/2760 2761/2710/2761 -f 2761/2710/2761 2751/2700/2751 2750/2699/2750 -f 2762/2711/2762 2752/2701/2752 2441/1219/2443 -f 2752/2701/2752 2762/2711/2762 2763/2712/2763 -f 2763/2712/2763 2753/2702/2753 2752/2701/2752 -f 2753/2702/2753 2763/2712/2763 2764/2713/2764 -f 2764/2713/2764 2754/2703/2754 2753/2702/2753 -f 2754/2703/2754 2764/2713/2764 2765/2714/2765 -f 2765/2714/2765 2755/2704/2755 2754/2703/2754 -f 2755/2704/2755 2765/2714/2765 2766/2715/2766 -f 2766/2715/2766 2756/2705/2756 2755/2704/2755 -f 2756/2705/2756 2766/2715/2766 2767/2716/2767 -f 2767/2716/2767 2757/2706/2757 2756/2705/2756 -f 2757/2706/2757 2767/2716/2767 2768/2717/2768 -f 2768/2717/2768 2758/2707/2758 2757/2706/2757 -f 2758/2707/2758 2768/2717/2768 2769/2718/2769 -f 2769/2718/2769 2759/2708/2759 2758/2707/2758 -f 2759/2708/2759 2769/2718/2769 2770/2719/2770 -f 2770/2719/2770 2760/2709/2760 2759/2708/2759 -f 2760/2709/2760 2770/2719/2770 2771/2720/2771 -f 2771/2720/2771 2761/2710/2761 2760/2709/2760 -f 2772/2721/2772 2762/2711/2762 2441/1219/2443 -f 2762/2711/2762 2772/2721/2772 2773/2722/2773 -f 2773/2722/2773 2763/2712/2763 2762/2711/2762 -f 2763/2712/2763 2773/2722/2773 2774/2723/2774 -f 2774/2723/2774 2764/2713/2764 2763/2712/2763 -f 2764/2713/2764 2774/2723/2774 2775/2724/2775 -f 2775/2724/2775 2765/2714/2765 2764/2713/2764 -f 2765/2714/2765 2775/2724/2775 2776/2725/2776 -f 2776/2725/2776 2766/2715/2766 2765/2714/2765 -f 2766/2715/2766 2776/2725/2776 2777/2726/2777 -f 2777/2726/2777 2767/2716/2767 2766/2715/2766 -f 2767/2716/2767 2777/2726/2777 2778/2727/2778 -f 2778/2727/2778 2768/2717/2768 2767/2716/2767 -f 2768/2717/2768 2778/2727/2778 2779/2728/2779 -f 2779/2728/2779 2769/2718/2769 2768/2717/2768 -f 2769/2718/2769 2779/2728/2779 2780/2729/2780 -f 2780/2729/2780 2770/2719/2770 2769/2718/2769 -f 2770/2719/2770 2780/2729/2780 2781/2730/2781 -f 2781/2730/2781 2771/2720/2771 2770/2719/2770 -f 2782/2731/2782 2772/2721/2772 2441/1219/2443 -f 2772/2721/2772 2782/2731/2782 2783/2732/2783 -f 2783/2732/2783 2773/2722/2773 2772/2721/2772 -f 2773/2722/2773 2783/2732/2783 2784/2733/2784 -f 2784/2733/2784 2774/2723/2774 2773/2722/2773 -f 2774/2723/2774 2784/2733/2784 2785/2734/2785 -f 2785/2734/2785 2775/2724/2775 2774/2723/2774 -f 2775/2724/2775 2785/2734/2785 2786/2735/2786 -f 2786/2735/2786 2776/2725/2776 2775/2724/2775 -f 2776/2725/2776 2786/2735/2786 2787/2736/2787 -f 2787/2736/2787 2777/2726/2777 2776/2725/2776 -f 2777/2726/2777 2787/2736/2787 2788/2737/2788 -f 2788/2737/2788 2778/2727/2778 2777/2726/2777 -f 2778/2727/2778 2788/2737/2788 2789/2738/2789 -f 2789/2738/2789 2779/2728/2779 2778/2727/2778 -f 2779/2728/2779 2789/2738/2789 2790/2739/2790 -f 2790/2739/2790 2780/2729/2780 2779/2728/2779 -f 2780/2729/2780 2790/2739/2790 2791/2740/2791 -f 2791/2740/2791 2781/2730/2781 2780/2729/2780 -f 2792/2741/2792 2782/2731/2782 2441/1219/2443 -f 2782/2731/2782 2792/2741/2792 2793/2742/2793 -f 2793/2742/2793 2783/2732/2783 2782/2731/2782 -f 2783/2732/2783 2793/2742/2793 2794/2743/2794 -f 2794/2743/2794 2784/2733/2784 2783/2732/2783 -f 2784/2733/2784 2794/2743/2794 2795/2744/2795 -f 2795/2744/2795 2785/2734/2785 2784/2733/2784 -f 2785/2734/2785 2795/2744/2795 2796/2745/2796 -f 2796/2745/2796 2786/2735/2786 2785/2734/2785 -f 2786/2735/2786 2796/2745/2796 2797/2746/2797 -f 2797/2746/2797 2787/2736/2787 2786/2735/2786 -f 2787/2736/2787 2797/2746/2797 2798/2747/2798 -f 2798/2747/2798 2788/2737/2788 2787/2736/2787 -f 2788/2737/2788 2798/2747/2798 2799/2748/2799 -f 2799/2748/2799 2789/2738/2789 2788/2737/2788 -f 2789/2738/2789 2799/2748/2799 2800/2749/2800 -f 2800/2749/2800 2790/2739/2790 2789/2738/2789 -f 2790/2739/2790 2800/2749/2800 2801/2750/2801 -f 2801/2750/2801 2791/2740/2791 2790/2739/2790 -f 2802/2751/2802 2792/2741/2792 2441/1219/2443 -f 2792/2741/2792 2802/2751/2802 2803/2752/2803 -f 2803/2752/2803 2793/2742/2793 2792/2741/2792 -f 2793/2742/2793 2803/2752/2803 2804/2753/2804 -f 2804/2753/2804 2794/2743/2794 2793/2742/2793 -f 2794/2743/2794 2804/2753/2804 2805/2754/2805 -f 2805/2754/2805 2795/2744/2795 2794/2743/2794 -f 2795/2744/2795 2805/2754/2805 2806/2755/2806 -f 2806/2755/2806 2796/2745/2796 2795/2744/2795 -f 2796/2745/2796 2806/2755/2806 2807/2756/2807 -f 2807/2756/2807 2797/2746/2797 2796/2745/2796 -f 2797/2746/2797 2807/2756/2807 2808/2757/2808 -f 2808/2757/2808 2798/2747/2798 2797/2746/2797 -f 2798/2747/2798 2808/2757/2808 2809/2758/2809 -f 2809/2758/2809 2799/2748/2799 2798/2747/2798 -f 2799/2748/2799 2809/2758/2809 2810/2759/2810 -f 2810/2759/2810 2800/2749/2800 2799/2748/2799 -f 2800/2749/2800 2810/2759/2810 2811/2760/2811 -f 2811/2760/2811 2801/2750/2801 2800/2749/2800 -f 2812/2761/2812 2802/2751/2802 2441/1219/2443 -f 2802/2751/2802 2812/2761/2812 2813/2762/2813 -f 2813/2762/2813 2803/2752/2803 2802/2751/2802 -f 2803/2752/2803 2813/2762/2813 2814/2763/2814 -f 2814/2763/2814 2804/2753/2804 2803/2752/2803 -f 2804/2753/2804 2814/2763/2814 2815/2764/2815 -f 2815/2764/2815 2805/2754/2805 2804/2753/2804 -f 2805/2754/2805 2815/2764/2815 2816/2765/2816 -f 2816/2765/2816 2806/2755/2806 2805/2754/2805 -f 2806/2755/2806 2816/2765/2816 2817/2766/2817 -f 2817/2766/2817 2807/2756/2807 2806/2755/2806 -f 2807/2756/2807 2817/2766/2817 2818/2767/2818 -f 2818/2767/2818 2808/2757/2808 2807/2756/2807 -f 2808/2757/2808 2818/2767/2818 2819/2768/2819 -f 2819/2768/2819 2809/2758/2809 2808/2757/2808 -f 2809/2758/2809 2819/2768/2819 2820/2769/2820 -f 2820/2769/2820 2810/2759/2810 2809/2758/2809 -f 2810/2759/2810 2820/2769/2820 2821/2770/2821 -f 2821/2770/2821 2811/2760/2811 2810/2759/2810 -f 2822/2771/2822 2812/2761/2812 2441/1219/2443 -f 2812/2761/2812 2822/2771/2822 2823/2772/2823 -f 2823/2772/2823 2813/2762/2813 2812/2761/2812 -f 2813/2762/2813 2823/2772/2823 2824/2773/2824 -f 2824/2773/2824 2814/2763/2814 2813/2762/2813 -f 2814/2763/2814 2824/2773/2824 2825/2774/2825 -f 2825/2774/2825 2815/2764/2815 2814/2763/2814 -f 2815/2764/2815 2825/2774/2825 2826/2775/2826 -f 2826/2775/2826 2816/2765/2816 2815/2764/2815 -f 2816/2765/2816 2826/2775/2826 2827/2776/2827 -f 2827/2776/2827 2817/2766/2817 2816/2765/2816 -f 2817/2766/2817 2827/2776/2827 2828/2777/2828 -f 2828/2777/2828 2818/2767/2818 2817/2766/2817 -f 2818/2767/2818 2828/2777/2828 2829/2778/2829 -f 2829/2778/2829 2819/2768/2819 2818/2767/2818 -f 2819/2768/2819 2829/2778/2829 2830/2779/2830 -f 2830/2779/2830 2820/2769/2820 2819/2768/2819 -f 2820/2769/2820 2830/2779/2830 2831/2780/2831 -f 2831/2780/2831 2821/2770/2821 2820/2769/2820 -f 2832/2781/2832 2822/2771/2822 2441/1219/2443 -f 2822/2771/2822 2832/2781/2832 2833/2782/2833 -f 2833/2782/2833 2823/2772/2823 2822/2771/2822 -f 2823/2772/2823 2833/2782/2833 2834/2783/2834 -f 2834/2783/2834 2824/2773/2824 2823/2772/2823 -f 2824/2773/2824 2834/2783/2834 2835/2784/2835 -f 2835/2784/2835 2825/2774/2825 2824/2773/2824 -f 2825/2774/2825 2835/2784/2835 2836/2785/2836 -f 2836/2785/2836 2826/2775/2826 2825/2774/2825 -f 2826/2775/2826 2836/2785/2836 2837/2786/2837 -f 2837/2786/2837 2827/2776/2827 2826/2775/2826 -f 2827/2776/2827 2837/2786/2837 2838/2787/2838 -f 2838/2787/2838 2828/2777/2828 2827/2776/2827 -f 2828/2777/2828 2838/2787/2838 2839/2788/2839 -f 2839/2788/2839 2829/2778/2829 2828/2777/2828 -f 2829/2778/2829 2839/2788/2839 2840/2789/2840 -f 2840/2789/2840 2830/2779/2830 2829/2778/2829 -f 2830/2779/2830 2840/2789/2840 2841/2790/2841 -f 2841/2790/2841 2831/2780/2831 2830/2779/2830 -f 2443/2392/2442 2832/2781/2832 2441/1219/2443 -f 2832/2781/2832 2443/2392/2442 2445/2394/2445 -f 2445/2394/2445 2833/2782/2833 2832/2781/2832 -f 2833/2782/2833 2445/2394/2445 2447/2396/2447 -f 2447/2396/2447 2834/2783/2834 2833/2782/2833 -f 2834/2783/2834 2447/2396/2447 2449/2398/2449 -f 2449/2398/2449 2835/2784/2835 2834/2783/2834 -f 2835/2784/2835 2449/2398/2449 2451/2400/2451 -f 2451/2400/2451 2836/2785/2836 2835/2784/2835 -f 2836/2785/2836 2451/2400/2451 2453/2402/2453 -f 2453/2402/2453 2837/2786/2837 2836/2785/2836 -f 2837/2786/2837 2453/2402/2453 2455/2404/2455 -f 2455/2404/2455 2838/2787/2838 2837/2786/2837 -f 2838/2787/2838 2455/2404/2455 2457/2406/2457 -f 2457/2406/2457 2839/2788/2839 2838/2787/2838 -f 2839/2788/2839 2457/2406/2457 2459/2408/2459 -f 2459/2408/2459 2840/2789/2840 2839/2788/2839 -f 2840/2789/2840 2459/2408/2459 2461/2410/2461 -f 2461/2410/2461 2841/2790/2841 2840/2789/2840 -f 2461/2410/2461 2460/2409/2460 2842/2791/2842 -f 2842/2791/2842 2843/2792/2843 2461/2410/2461 -f 2843/2792/2843 2842/2791/2842 2844/2793/2844 -f 2844/2793/2844 2845/2794/2845 2843/2792/2843 -f 2845/2794/2845 2844/2793/2844 2846/2795/2846 -f 2846/2795/2846 2847/2796/2847 2845/2794/2845 -f 2847/2796/2847 2846/2795/2846 2848/2797/2848 -f 2848/2797/2848 2849/2798/2849 2847/2796/2847 -f 2849/2798/2849 2848/2797/2848 2850/2799/2850 -f 2850/2799/2850 2851/2800/2851 2849/2798/2849 -f 2851/2800/2851 2850/2799/2850 2852/2801/2852 -f 2852/2801/2852 2853/2802/2853 2851/2800/2851 -f 2853/2802/2853 2852/2801/2852 2854/2803/2854 -f 2854/2803/2854 2855/2804/2855 2853/2802/2853 -f 2855/2804/2855 2854/2803/2854 2856/2805/2856 -f 2856/2805/2856 2857/2806/2857 2855/2804/2855 -f 2857/2806/2857 2856/2805/2856 2858/2807/2858 -f 2858/2807/2858 2859/2808/2859 2857/2806/2857 -f 2859/2808/2859 2858/2807/2858 2860/2809/2860 -f 2860/2809/2860 2861/2810/2861 2859/2808/2859 -f 2460/2409/2460 2471/2420/2471 2862/2811/2862 -f 2862/2811/2862 2842/2791/2842 2460/2409/2460 -f 2842/2791/2842 2862/2811/2862 2863/2812/2863 -f 2863/2812/2863 2844/2793/2844 2842/2791/2842 -f 2844/2793/2844 2863/2812/2863 2864/2813/2864 -f 2864/2813/2864 2846/2795/2846 2844/2793/2844 -f 2846/2795/2846 2864/2813/2864 2865/2814/2865 -f 2865/2814/2865 2848/2797/2848 2846/2795/2846 -f 2848/2797/2848 2865/2814/2865 2866/2815/2866 -f 2866/2815/2866 2850/2799/2850 2848/2797/2848 -f 2850/2799/2850 2866/2815/2866 2867/2816/2867 -f 2867/2816/2867 2852/2801/2852 2850/2799/2850 -f 2852/2801/2852 2867/2816/2867 2868/2817/2868 -f 2868/2817/2868 2854/2803/2854 2852/2801/2852 -f 2854/2803/2854 2868/2817/2868 2869/2818/2869 -f 2869/2818/2869 2856/2805/2856 2854/2803/2854 -f 2856/2805/2856 2869/2818/2869 2870/2819/2870 -f 2870/2819/2870 2858/2807/2858 2856/2805/2856 -f 2858/2807/2858 2870/2819/2870 2871/2820/2871 -f 2871/2820/2871 2860/2809/2860 2858/2807/2858 -f 2471/2420/2471 2481/2430/2481 2872/2821/2872 -f 2872/2821/2872 2862/2811/2862 2471/2420/2471 -f 2862/2811/2862 2872/2821/2872 2873/2822/2873 -f 2873/2822/2873 2863/2812/2863 2862/2811/2862 -f 2863/2812/2863 2873/2822/2873 2874/2823/2874 -f 2874/2823/2874 2864/2813/2864 2863/2812/2863 -f 2864/2813/2864 2874/2823/2874 2875/2824/2875 -f 2875/2824/2875 2865/2814/2865 2864/2813/2864 -f 2865/2814/2865 2875/2824/2875 2876/2825/2876 -f 2876/2825/2876 2866/2815/2866 2865/2814/2865 -f 2866/2815/2866 2876/2825/2876 2877/2826/2877 -f 2877/2826/2877 2867/2816/2867 2866/2815/2866 -f 2867/2816/2867 2877/2826/2877 2878/2827/2878 -f 2878/2827/2878 2868/2817/2868 2867/2816/2867 -f 2868/2817/2868 2878/2827/2878 2879/2828/2879 -f 2879/2828/2879 2869/2818/2869 2868/2817/2868 -f 2869/2818/2869 2879/2828/2879 2880/2829/2880 -f 2880/2829/2880 2870/2819/2870 2869/2818/2869 -f 2870/2819/2870 2880/2829/2880 2881/2830/2881 -f 2881/2830/2881 2871/2820/2871 2870/2819/2870 -f 2481/2430/2481 2491/2440/2491 2882/2831/2882 -f 2882/2831/2882 2872/2821/2872 2481/2430/2481 -f 2872/2821/2872 2882/2831/2882 2883/2832/2883 -f 2883/2832/2883 2873/2822/2873 2872/2821/2872 -f 2873/2822/2873 2883/2832/2883 2884/2833/2884 -f 2884/2833/2884 2874/2823/2874 2873/2822/2873 -f 2874/2823/2874 2884/2833/2884 2885/2834/2885 -f 2885/2834/2885 2875/2824/2875 2874/2823/2874 -f 2875/2824/2875 2885/2834/2885 2886/2835/2886 -f 2886/2835/2886 2876/2825/2876 2875/2824/2875 -f 2876/2825/2876 2886/2835/2886 2887/2836/2887 -f 2887/2836/2887 2877/2826/2877 2876/2825/2876 -f 2877/2826/2877 2887/2836/2887 2888/2837/2888 -f 2888/2837/2888 2878/2827/2878 2877/2826/2877 -f 2878/2827/2878 2888/2837/2888 2889/2838/2889 -f 2889/2838/2889 2879/2828/2879 2878/2827/2878 -f 2879/2828/2879 2889/2838/2889 2890/2839/2890 -f 2890/2839/2890 2880/2829/2880 2879/2828/2879 -f 2880/2829/2880 2890/2839/2890 2891/2840/2891 -f 2891/2840/2891 2881/2830/2881 2880/2829/2880 -f 2491/2440/2491 2501/2450/2501 2892/2841/2892 -f 2892/2841/2892 2882/2831/2882 2491/2440/2491 -f 2882/2831/2882 2892/2841/2892 2893/2842/2893 -f 2893/2842/2893 2883/2832/2883 2882/2831/2882 -f 2883/2832/2883 2893/2842/2893 2894/2843/2894 -f 2894/2843/2894 2884/2833/2884 2883/2832/2883 -f 2884/2833/2884 2894/2843/2894 2895/2844/2895 -f 2895/2844/2895 2885/2834/2885 2884/2833/2884 -f 2885/2834/2885 2895/2844/2895 2896/2845/2896 -f 2896/2845/2896 2886/2835/2886 2885/2834/2885 -f 2886/2835/2886 2896/2845/2896 2897/2846/2897 -f 2897/2846/2897 2887/2836/2887 2886/2835/2886 -f 2887/2836/2887 2897/2846/2897 2898/2847/2898 -f 2898/2847/2898 2888/2837/2888 2887/2836/2887 -f 2888/2837/2888 2898/2847/2898 2899/2848/2899 -f 2899/2848/2899 2889/2838/2889 2888/2837/2888 -f 2889/2838/2889 2899/2848/2899 2900/2849/2900 -f 2900/2849/2900 2890/2839/2890 2889/2838/2889 -f 2890/2839/2890 2900/2849/2900 2901/2850/2901 -f 2901/2850/2901 2891/2840/2891 2890/2839/2890 -f 2501/2450/2501 2511/2460/2511 2902/2851/2902 -f 2902/2851/2902 2892/2841/2892 2501/2450/2501 -f 2892/2841/2892 2902/2851/2902 2903/2852/2903 -f 2903/2852/2903 2893/2842/2893 2892/2841/2892 -f 2893/2842/2893 2903/2852/2903 2904/2853/2904 -f 2904/2853/2904 2894/2843/2894 2893/2842/2893 -f 2894/2843/2894 2904/2853/2904 2905/2854/2905 -f 2905/2854/2905 2895/2844/2895 2894/2843/2894 -f 2895/2844/2895 2905/2854/2905 2906/2855/2906 -f 2906/2855/2906 2896/2845/2896 2895/2844/2895 -f 2896/2845/2896 2906/2855/2906 2907/2856/2907 -f 2907/2856/2907 2897/2846/2897 2896/2845/2896 -f 2897/2846/2897 2907/2856/2907 2908/2857/2908 -f 2908/2857/2908 2898/2847/2898 2897/2846/2897 -f 2898/2847/2898 2908/2857/2908 2909/2858/2909 -f 2909/2858/2909 2899/2848/2899 2898/2847/2898 -f 2899/2848/2899 2909/2858/2909 2910/2859/2910 -f 2910/2859/2910 2900/2849/2900 2899/2848/2899 -f 2900/2849/2900 2910/2859/2910 2911/2860/2911 -f 2911/2860/2911 2901/2850/2901 2900/2849/2900 -f 2511/2460/2511 2521/2470/2521 2912/2861/2912 -f 2912/2861/2912 2902/2851/2902 2511/2460/2511 -f 2902/2851/2902 2912/2861/2912 2913/2862/2913 -f 2913/2862/2913 2903/2852/2903 2902/2851/2902 -f 2903/2852/2903 2913/2862/2913 2914/2863/2914 -f 2914/2863/2914 2904/2853/2904 2903/2852/2903 -f 2904/2853/2904 2914/2863/2914 2915/2864/2915 -f 2915/2864/2915 2905/2854/2905 2904/2853/2904 -f 2905/2854/2905 2915/2864/2915 2916/2865/2916 -f 2916/2865/2916 2906/2855/2906 2905/2854/2905 -f 2906/2855/2906 2916/2865/2916 2917/2866/2917 -f 2917/2866/2917 2907/2856/2907 2906/2855/2906 -f 2907/2856/2907 2917/2866/2917 2918/2867/2918 -f 2918/2867/2918 2908/2857/2908 2907/2856/2907 -f 2908/2857/2908 2918/2867/2918 2919/2868/2919 -f 2919/2868/2919 2909/2858/2909 2908/2857/2908 -f 2909/2858/2909 2919/2868/2919 2920/2869/2920 -f 2920/2869/2920 2910/2859/2910 2909/2858/2909 -f 2910/2859/2910 2920/2869/2920 2921/2870/2921 -f 2921/2870/2921 2911/2860/2911 2910/2859/2910 -f 2521/2470/2521 2531/2480/2531 2922/2871/2922 -f 2922/2871/2922 2912/2861/2912 2521/2470/2521 -f 2912/2861/2912 2922/2871/2922 2923/2872/2923 -f 2923/2872/2923 2913/2862/2913 2912/2861/2912 -f 2913/2862/2913 2923/2872/2923 2924/2873/2924 -f 2924/2873/2924 2914/2863/2914 2913/2862/2913 -f 2914/2863/2914 2924/2873/2924 2925/2874/2925 -f 2925/2874/2925 2915/2864/2915 2914/2863/2914 -f 2915/2864/2915 2925/2874/2925 2926/2875/2926 -f 2926/2875/2926 2916/2865/2916 2915/2864/2915 -f 2916/2865/2916 2926/2875/2926 2927/2876/2927 -f 2927/2876/2927 2917/2866/2917 2916/2865/2916 -f 2917/2866/2917 2927/2876/2927 2928/2877/2928 -f 2928/2877/2928 2918/2867/2918 2917/2866/2917 -f 2918/2867/2918 2928/2877/2928 2929/2878/2929 -f 2929/2878/2929 2919/2868/2919 2918/2867/2918 -f 2919/2868/2919 2929/2878/2929 2930/2879/2930 -f 2930/2879/2930 2920/2869/2920 2919/2868/2919 -f 2920/2869/2920 2930/2879/2930 2931/2880/2931 -f 2931/2880/2931 2921/2870/2921 2920/2869/2920 -f 2531/2480/2531 2541/2490/2541 2932/2881/2932 -f 2932/2881/2932 2922/2871/2922 2531/2480/2531 -f 2922/2871/2922 2932/2881/2932 2933/2882/2933 -f 2933/2882/2933 2923/2872/2923 2922/2871/2922 -f 2923/2872/2923 2933/2882/2933 2934/2883/2934 -f 2934/2883/2934 2924/2873/2924 2923/2872/2923 -f 2924/2873/2924 2934/2883/2934 2935/2884/2935 -f 2935/2884/2935 2925/2874/2925 2924/2873/2924 -f 2925/2874/2925 2935/2884/2935 2936/2885/2936 -f 2936/2885/2936 2926/2875/2926 2925/2874/2925 -f 2926/2875/2926 2936/2885/2936 2937/2886/2937 -f 2937/2886/2937 2927/2876/2927 2926/2875/2926 -f 2927/2876/2927 2937/2886/2937 2938/2887/2938 -f 2938/2887/2938 2928/2877/2928 2927/2876/2927 -f 2928/2877/2928 2938/2887/2938 2939/2888/2939 -f 2939/2888/2939 2929/2878/2929 2928/2877/2928 -f 2929/2878/2929 2939/2888/2939 2940/2889/2940 -f 2940/2889/2940 2930/2879/2930 2929/2878/2929 -f 2930/2879/2930 2940/2889/2940 2941/2890/2941 -f 2941/2890/2941 2931/2880/2931 2930/2879/2930 -f 2541/2490/2541 2551/2500/2551 2942/2891/2942 -f 2942/2891/2942 2932/2881/2932 2541/2490/2541 -f 2932/2881/2932 2942/2891/2942 2943/2892/2943 -f 2943/2892/2943 2933/2882/2933 2932/2881/2932 -f 2933/2882/2933 2943/2892/2943 2944/2893/2944 -f 2944/2893/2944 2934/2883/2934 2933/2882/2933 -f 2934/2883/2934 2944/2893/2944 2945/2894/2945 -f 2945/2894/2945 2935/2884/2935 2934/2883/2934 -f 2935/2884/2935 2945/2894/2945 2946/2895/2946 -f 2946/2895/2946 2936/2885/2936 2935/2884/2935 -f 2936/2885/2936 2946/2895/2946 2947/2896/2947 -f 2947/2896/2947 2937/2886/2937 2936/2885/2936 -f 2937/2886/2937 2947/2896/2947 2948/2897/2948 -f 2948/2897/2948 2938/2887/2938 2937/2886/2937 -f 2938/2887/2938 2948/2897/2948 2949/2898/2949 -f 2949/2898/2949 2939/2888/2939 2938/2887/2938 -f 2939/2888/2939 2949/2898/2949 2950/2899/2950 -f 2950/2899/2950 2940/2889/2940 2939/2888/2939 -f 2940/2889/2940 2950/2899/2950 2951/2900/2951 -f 2951/2900/2951 2941/2890/2941 2940/2889/2940 -f 2551/2500/2551 2561/2510/2561 2952/2901/2952 -f 2952/2901/2952 2942/2891/2942 2551/2500/2551 -f 2942/2891/2942 2952/2901/2952 2953/2902/2953 -f 2953/2902/2953 2943/2892/2943 2942/2891/2942 -f 2943/2892/2943 2953/2902/2953 2954/2903/2954 -f 2954/2903/2954 2944/2893/2944 2943/2892/2943 -f 2944/2893/2944 2954/2903/2954 2955/2904/2955 -f 2955/2904/2955 2945/2894/2945 2944/2893/2944 -f 2945/2894/2945 2955/2904/2955 2956/2905/2956 -f 2956/2905/2956 2946/2895/2946 2945/2894/2945 -f 2946/2895/2946 2956/2905/2956 2957/2906/2957 -f 2957/2906/2957 2947/2896/2947 2946/2895/2946 -f 2947/2896/2947 2957/2906/2957 2958/2907/2958 -f 2958/2907/2958 2948/2897/2948 2947/2896/2947 -f 2948/2897/2948 2958/2907/2958 2959/2908/2959 -f 2959/2908/2959 2949/2898/2949 2948/2897/2948 -f 2949/2898/2949 2959/2908/2959 2960/2909/2960 -f 2960/2909/2960 2950/2899/2950 2949/2898/2949 -f 2950/2899/2950 2960/2909/2960 2961/2910/2961 -f 2961/2910/2961 2951/2900/2951 2950/2899/2950 -f 2561/2510/2561 2571/2520/2571 2962/2911/2962 -f 2962/2911/2962 2952/2901/2952 2561/2510/2561 -f 2952/2901/2952 2962/2911/2962 2963/2912/2963 -f 2963/2912/2963 2953/2902/2953 2952/2901/2952 -f 2953/2902/2953 2963/2912/2963 2964/2913/2964 -f 2964/2913/2964 2954/2903/2954 2953/2902/2953 -f 2954/2903/2954 2964/2913/2964 2965/2914/2965 -f 2965/2914/2965 2955/2904/2955 2954/2903/2954 -f 2955/2904/2955 2965/2914/2965 2966/2915/2966 -f 2966/2915/2966 2956/2905/2956 2955/2904/2955 -f 2956/2905/2956 2966/2915/2966 2967/2916/2967 -f 2967/2916/2967 2957/2906/2957 2956/2905/2956 -f 2957/2906/2957 2967/2916/2967 2968/2917/2968 -f 2968/2917/2968 2958/2907/2958 2957/2906/2957 -f 2958/2907/2958 2968/2917/2968 2969/2918/2969 -f 2969/2918/2969 2959/2908/2959 2958/2907/2958 -f 2959/2908/2959 2969/2918/2969 2970/2919/2970 -f 2970/2919/2970 2960/2909/2960 2959/2908/2959 -f 2960/2909/2960 2970/2919/2970 2971/2920/2971 -f 2971/2920/2971 2961/2910/2961 2960/2909/2960 -f 2571/2520/2571 2581/2530/2581 2972/2921/2972 -f 2972/2921/2972 2962/2911/2962 2571/2520/2571 -f 2962/2911/2962 2972/2921/2972 2973/2922/2973 -f 2973/2922/2973 2963/2912/2963 2962/2911/2962 -f 2963/2912/2963 2973/2922/2973 2974/2923/2974 -f 2974/2923/2974 2964/2913/2964 2963/2912/2963 -f 2964/2913/2964 2974/2923/2974 2975/2924/2975 -f 2975/2924/2975 2965/2914/2965 2964/2913/2964 -f 2965/2914/2965 2975/2924/2975 2976/2925/2976 -f 2976/2925/2976 2966/2915/2966 2965/2914/2965 -f 2966/2915/2966 2976/2925/2976 2977/2926/2977 -f 2977/2926/2977 2967/2916/2967 2966/2915/2966 -f 2967/2916/2967 2977/2926/2977 2978/2927/2978 -f 2978/2927/2978 2968/2917/2968 2967/2916/2967 -f 2968/2917/2968 2978/2927/2978 2979/2928/2979 -f 2979/2928/2979 2969/2918/2969 2968/2917/2968 -f 2969/2918/2969 2979/2928/2979 2980/2929/2980 -f 2980/2929/2980 2970/2919/2970 2969/2918/2969 -f 2970/2919/2970 2980/2929/2980 2981/2930/2981 -f 2981/2930/2981 2971/2920/2971 2970/2919/2970 -f 2581/2530/2581 2591/2540/2591 2982/2931/2982 -f 2982/2931/2982 2972/2921/2972 2581/2530/2581 -f 2972/2921/2972 2982/2931/2982 2983/2932/2983 -f 2983/2932/2983 2973/2922/2973 2972/2921/2972 -f 2973/2922/2973 2983/2932/2983 2984/2933/2984 -f 2984/2933/2984 2974/2923/2974 2973/2922/2973 -f 2974/2923/2974 2984/2933/2984 2985/2934/2985 -f 2985/2934/2985 2975/2924/2975 2974/2923/2974 -f 2975/2924/2975 2985/2934/2985 2986/2935/2986 -f 2986/2935/2986 2976/2925/2976 2975/2924/2975 -f 2976/2925/2976 2986/2935/2986 2987/2936/2987 -f 2987/2936/2987 2977/2926/2977 2976/2925/2976 -f 2977/2926/2977 2987/2936/2987 2988/2937/2988 -f 2988/2937/2988 2978/2927/2978 2977/2926/2977 -f 2978/2927/2978 2988/2937/2988 2989/2938/2989 -f 2989/2938/2989 2979/2928/2979 2978/2927/2978 -f 2979/2928/2979 2989/2938/2989 2990/2939/2990 -f 2990/2939/2990 2980/2929/2980 2979/2928/2979 -f 2980/2929/2980 2990/2939/2990 2991/2940/2991 -f 2991/2940/2991 2981/2930/2981 2980/2929/2980 -f 2591/2540/2591 2601/2550/2601 2992/2941/2992 -f 2992/2941/2992 2982/2931/2982 2591/2540/2591 -f 2982/2931/2982 2992/2941/2992 2993/2942/2993 -f 2993/2942/2993 2983/2932/2983 2982/2931/2982 -f 2983/2932/2983 2993/2942/2993 2994/2943/2994 -f 2994/2943/2994 2984/2933/2984 2983/2932/2983 -f 2984/2933/2984 2994/2943/2994 2995/2944/2995 -f 2995/2944/2995 2985/2934/2985 2984/2933/2984 -f 2985/2934/2985 2995/2944/2995 2996/2945/2996 -f 2996/2945/2996 2986/2935/2986 2985/2934/2985 -f 2986/2935/2986 2996/2945/2996 2997/2946/2997 -f 2997/2946/2997 2987/2936/2987 2986/2935/2986 -f 2987/2936/2987 2997/2946/2997 2998/2947/2998 -f 2998/2947/2998 2988/2937/2988 2987/2936/2987 -f 2988/2937/2988 2998/2947/2998 2999/2948/2999 -f 2999/2948/2999 2989/2938/2989 2988/2937/2988 -f 2989/2938/2989 2999/2948/2999 3000/2949/3000 -f 3000/2949/3000 2990/2939/2990 2989/2938/2989 -f 2990/2939/2990 3000/2949/3000 3001/2950/3001 -f 3001/2950/3001 2991/2940/2991 2990/2939/2990 -f 2601/2550/2601 2611/2560/2611 3002/2951/3002 -f 3002/2951/3002 2992/2941/2992 2601/2550/2601 -f 2992/2941/2992 3002/2951/3002 3003/2952/3003 -f 3003/2952/3003 2993/2942/2993 2992/2941/2992 -f 2993/2942/2993 3003/2952/3003 3004/2953/3004 -f 3004/2953/3004 2994/2943/2994 2993/2942/2993 -f 2994/2943/2994 3004/2953/3004 3005/2954/3005 -f 3005/2954/3005 2995/2944/2995 2994/2943/2994 -f 2995/2944/2995 3005/2954/3005 3006/2955/3006 -f 3006/2955/3006 2996/2945/2996 2995/2944/2995 -f 2996/2945/2996 3006/2955/3006 3007/2956/3007 -f 3007/2956/3007 2997/2946/2997 2996/2945/2996 -f 2997/2946/2997 3007/2956/3007 3008/2957/3008 -f 3008/2957/3008 2998/2947/2998 2997/2946/2997 -f 2998/2947/2998 3008/2957/3008 3009/2958/3009 -f 3009/2958/3009 2999/2948/2999 2998/2947/2998 -f 2999/2948/2999 3009/2958/3009 3010/2959/3010 -f 3010/2959/3010 3000/2949/3000 2999/2948/2999 -f 3000/2949/3000 3010/2959/3010 3011/2960/3011 -f 3011/2960/3011 3001/2950/3001 3000/2949/3000 -f 2611/2560/2611 2621/2570/2621 3012/2961/3012 -f 3012/2961/3012 3002/2951/3002 2611/2560/2611 -f 3002/2951/3002 3012/2961/3012 3013/2962/3013 -f 3013/2962/3013 3003/2952/3003 3002/2951/3002 -f 3003/2952/3003 3013/2962/3013 3014/2963/3014 -f 3014/2963/3014 3004/2953/3004 3003/2952/3003 -f 3004/2953/3004 3014/2963/3014 3015/2964/3015 -f 3015/2964/3015 3005/2954/3005 3004/2953/3004 -f 3005/2954/3005 3015/2964/3015 3016/2965/3016 -f 3016/2965/3016 3006/2955/3006 3005/2954/3005 -f 3006/2955/3006 3016/2965/3016 3017/2966/3017 -f 3017/2966/3017 3007/2956/3007 3006/2955/3006 -f 3007/2956/3007 3017/2966/3017 3018/2967/3018 -f 3018/2967/3018 3008/2957/3008 3007/2956/3007 -f 3008/2957/3008 3018/2967/3018 3019/2968/3019 -f 3019/2968/3019 3009/2958/3009 3008/2957/3008 -f 3009/2958/3009 3019/2968/3019 3020/2969/3020 -f 3020/2969/3020 3010/2959/3010 3009/2958/3009 -f 3010/2959/3010 3020/2969/3020 3021/2970/3021 -f 3021/2970/3021 3011/2960/3011 3010/2959/3010 -f 2621/2570/2621 2631/2580/2631 3022/2971/3022 -f 3022/2971/3022 3012/2961/3012 2621/2570/2621 -f 3012/2961/3012 3022/2971/3022 3023/2972/3023 -f 3023/2972/3023 3013/2962/3013 3012/2961/3012 -f 3013/2962/3013 3023/2972/3023 3024/2973/3024 -f 3024/2973/3024 3014/2963/3014 3013/2962/3013 -f 3014/2963/3014 3024/2973/3024 3025/2974/3025 -f 3025/2974/3025 3015/2964/3015 3014/2963/3014 -f 3015/2964/3015 3025/2974/3025 3026/2975/3026 -f 3026/2975/3026 3016/2965/3016 3015/2964/3015 -f 3016/2965/3016 3026/2975/3026 3027/2976/3027 -f 3027/2976/3027 3017/2966/3017 3016/2965/3016 -f 3017/2966/3017 3027/2976/3027 3028/2977/3028 -f 3028/2977/3028 3018/2967/3018 3017/2966/3017 -f 3018/2967/3018 3028/2977/3028 3029/2978/3029 -f 3029/2978/3029 3019/2968/3019 3018/2967/3018 -f 3019/2968/3019 3029/2978/3029 3030/2979/3030 -f 3030/2979/3030 3020/2969/3020 3019/2968/3019 -f 3020/2969/3020 3030/2979/3030 3031/2980/3031 -f 3031/2980/3031 3021/2970/3021 3020/2969/3020 -f 2631/2580/2631 2641/2590/2641 3032/2981/3032 -f 3032/2981/3032 3022/2971/3022 2631/2580/2631 -f 3022/2971/3022 3032/2981/3032 3033/2982/3033 -f 3033/2982/3033 3023/2972/3023 3022/2971/3022 -f 3023/2972/3023 3033/2982/3033 3034/2983/3034 -f 3034/2983/3034 3024/2973/3024 3023/2972/3023 -f 3024/2973/3024 3034/2983/3034 3035/2984/3035 -f 3035/2984/3035 3025/2974/3025 3024/2973/3024 -f 3025/2974/3025 3035/2984/3035 3036/2985/3036 -f 3036/2985/3036 3026/2975/3026 3025/2974/3025 -f 3026/2975/3026 3036/2985/3036 3037/2986/3037 -f 3037/2986/3037 3027/2976/3027 3026/2975/3026 -f 3027/2976/3027 3037/2986/3037 3038/2987/3038 -f 3038/2987/3038 3028/2977/3028 3027/2976/3027 -f 3028/2977/3028 3038/2987/3038 3039/2988/3039 -f 3039/2988/3039 3029/2978/3029 3028/2977/3028 -f 3029/2978/3029 3039/2988/3039 3040/2989/3040 -f 3040/2989/3040 3030/2979/3030 3029/2978/3029 -f 3030/2979/3030 3040/2989/3040 3041/2990/3041 -f 3041/2990/3041 3031/2980/3031 3030/2979/3030 -f 2641/2590/2641 2651/2600/2651 3042/2991/3042 -f 3042/2991/3042 3032/2981/3032 2641/2590/2641 -f 3032/2981/3032 3042/2991/3042 3043/2992/3043 -f 3043/2992/3043 3033/2982/3033 3032/2981/3032 -f 3033/2982/3033 3043/2992/3043 3044/2993/3044 -f 3044/2993/3044 3034/2983/3034 3033/2982/3033 -f 3034/2983/3034 3044/2993/3044 3045/2994/3045 -f 3045/2994/3045 3035/2984/3035 3034/2983/3034 -f 3035/2984/3035 3045/2994/3045 3046/2995/3046 -f 3046/2995/3046 3036/2985/3036 3035/2984/3035 -f 3036/2985/3036 3046/2995/3046 3047/2996/3047 -f 3047/2996/3047 3037/2986/3037 3036/2985/3036 -f 3037/2986/3037 3047/2996/3047 3048/2997/3048 -f 3048/2997/3048 3038/2987/3038 3037/2986/3037 -f 3038/2987/3038 3048/2997/3048 3049/2998/3049 -f 3049/2998/3049 3039/2988/3039 3038/2987/3038 -f 3039/2988/3039 3049/2998/3049 3050/2999/3050 -f 3050/2999/3050 3040/2989/3040 3039/2988/3039 -f 3040/2989/3040 3050/2999/3050 3051/3000/3051 -f 3051/3000/3051 3041/2990/3041 3040/2989/3040 -f 2651/2600/2651 2661/2610/2661 3052/3001/3052 -f 3052/3001/3052 3042/2991/3042 2651/2600/2651 -f 3042/2991/3042 3052/3001/3052 3053/3002/3053 -f 3053/3002/3053 3043/2992/3043 3042/2991/3042 -f 3043/2992/3043 3053/3002/3053 3054/3003/3054 -f 3054/3003/3054 3044/2993/3044 3043/2992/3043 -f 3044/2993/3044 3054/3003/3054 3055/3004/3055 -f 3055/3004/3055 3045/2994/3045 3044/2993/3044 -f 3045/2994/3045 3055/3004/3055 3056/3005/3056 -f 3056/3005/3056 3046/2995/3046 3045/2994/3045 -f 3046/2995/3046 3056/3005/3056 3057/3006/3057 -f 3057/3006/3057 3047/2996/3047 3046/2995/3046 -f 3047/2996/3047 3057/3006/3057 3058/3007/3058 -f 3058/3007/3058 3048/2997/3048 3047/2996/3047 -f 3048/2997/3048 3058/3007/3058 3059/3008/3059 -f 3059/3008/3059 3049/2998/3049 3048/2997/3048 -f 3049/2998/3049 3059/3008/3059 3060/3009/3060 -f 3060/3009/3060 3050/2999/3050 3049/2998/3049 -f 3050/2999/3050 3060/3009/3060 3061/3010/3061 -f 3061/3010/3061 3051/3000/3051 3050/2999/3050 -f 2661/2610/2661 2671/2620/2671 3062/3011/3062 -f 3062/3011/3062 3052/3001/3052 2661/2610/2661 -f 3052/3001/3052 3062/3011/3062 3063/3012/3063 -f 3063/3012/3063 3053/3002/3053 3052/3001/3052 -f 3053/3002/3053 3063/3012/3063 3064/3013/3064 -f 3064/3013/3064 3054/3003/3054 3053/3002/3053 -f 3054/3003/3054 3064/3013/3064 3065/3014/3065 -f 3065/3014/3065 3055/3004/3055 3054/3003/3054 -f 3055/3004/3055 3065/3014/3065 3066/3015/3066 -f 3066/3015/3066 3056/3005/3056 3055/3004/3055 -f 3056/3005/3056 3066/3015/3066 3067/3016/3067 -f 3067/3016/3067 3057/3006/3057 3056/3005/3056 -f 3057/3006/3057 3067/3016/3067 3068/3017/3068 -f 3068/3017/3068 3058/3007/3058 3057/3006/3057 -f 3058/3007/3058 3068/3017/3068 3069/3018/3069 -f 3069/3018/3069 3059/3008/3059 3058/3007/3058 -f 3059/3008/3059 3069/3018/3069 3070/3019/3070 -f 3070/3019/3070 3060/3009/3060 3059/3008/3059 -f 3060/3009/3060 3070/3019/3070 3071/3020/3071 -f 3071/3020/3071 3061/3010/3061 3060/3009/3060 -f 2671/2620/2671 2681/2630/2681 3072/3021/3072 -f 3072/3021/3072 3062/3011/3062 2671/2620/2671 -f 3062/3011/3062 3072/3021/3072 3073/3022/3073 -f 3073/3022/3073 3063/3012/3063 3062/3011/3062 -f 3063/3012/3063 3073/3022/3073 3074/3023/3074 -f 3074/3023/3074 3064/3013/3064 3063/3012/3063 -f 3064/3013/3064 3074/3023/3074 3075/3024/3075 -f 3075/3024/3075 3065/3014/3065 3064/3013/3064 -f 3065/3014/3065 3075/3024/3075 3076/3025/3076 -f 3076/3025/3076 3066/3015/3066 3065/3014/3065 -f 3066/3015/3066 3076/3025/3076 3077/3026/3077 -f 3077/3026/3077 3067/3016/3067 3066/3015/3066 -f 3067/3016/3067 3077/3026/3077 3078/3027/3078 -f 3078/3027/3078 3068/3017/3068 3067/3016/3067 -f 3068/3017/3068 3078/3027/3078 3079/3028/3079 -f 3079/3028/3079 3069/3018/3069 3068/3017/3068 -f 3069/3018/3069 3079/3028/3079 3080/3029/3080 -f 3080/3029/3080 3070/3019/3070 3069/3018/3069 -f 3070/3019/3070 3080/3029/3080 3081/3030/3081 -f 3081/3030/3081 3071/3020/3071 3070/3019/3070 -f 2681/2630/2681 2691/2640/2691 3082/3031/3082 -f 3082/3031/3082 3072/3021/3072 2681/2630/2681 -f 3072/3021/3072 3082/3031/3082 3083/3032/3083 -f 3083/3032/3083 3073/3022/3073 3072/3021/3072 -f 3073/3022/3073 3083/3032/3083 3084/3033/3084 -f 3084/3033/3084 3074/3023/3074 3073/3022/3073 -f 3074/3023/3074 3084/3033/3084 3085/3034/3085 -f 3085/3034/3085 3075/3024/3075 3074/3023/3074 -f 3075/3024/3075 3085/3034/3085 3086/3035/3086 -f 3086/3035/3086 3076/3025/3076 3075/3024/3075 -f 3076/3025/3076 3086/3035/3086 3087/3036/3087 -f 3087/3036/3087 3077/3026/3077 3076/3025/3076 -f 3077/3026/3077 3087/3036/3087 3088/3037/3088 -f 3088/3037/3088 3078/3027/3078 3077/3026/3077 -f 3078/3027/3078 3088/3037/3088 3089/3038/3089 -f 3089/3038/3089 3079/3028/3079 3078/3027/3078 -f 3079/3028/3079 3089/3038/3089 3090/3039/3090 -f 3090/3039/3090 3080/3029/3080 3079/3028/3079 -f 3080/3029/3080 3090/3039/3090 3091/3040/3091 -f 3091/3040/3091 3081/3030/3081 3080/3029/3080 -f 2691/2640/2691 2701/2650/2701 3092/3041/3092 -f 3092/3041/3092 3082/3031/3082 2691/2640/2691 -f 3082/3031/3082 3092/3041/3092 3093/3042/3093 -f 3093/3042/3093 3083/3032/3083 3082/3031/3082 -f 3083/3032/3083 3093/3042/3093 3094/3043/3094 -f 3094/3043/3094 3084/3033/3084 3083/3032/3083 -f 3084/3033/3084 3094/3043/3094 3095/3044/3095 -f 3095/3044/3095 3085/3034/3085 3084/3033/3084 -f 3085/3034/3085 3095/3044/3095 3096/3045/3096 -f 3096/3045/3096 3086/3035/3086 3085/3034/3085 -f 3086/3035/3086 3096/3045/3096 3097/3046/3097 -f 3097/3046/3097 3087/3036/3087 3086/3035/3086 -f 3087/3036/3087 3097/3046/3097 3098/3047/3098 -f 3098/3047/3098 3088/3037/3088 3087/3036/3087 -f 3088/3037/3088 3098/3047/3098 3099/3048/3099 -f 3099/3048/3099 3089/3038/3089 3088/3037/3088 -f 3089/3038/3089 3099/3048/3099 3100/3049/3100 -f 3100/3049/3100 3090/3039/3090 3089/3038/3089 -f 3090/3039/3090 3100/3049/3100 3101/3050/3101 -f 3101/3050/3101 3091/3040/3091 3090/3039/3090 -f 2701/2650/2701 2711/2660/2711 3102/3051/3102 -f 3102/3051/3102 3092/3041/3092 2701/2650/2701 -f 3092/3041/3092 3102/3051/3102 3103/3052/3103 -f 3103/3052/3103 3093/3042/3093 3092/3041/3092 -f 3093/3042/3093 3103/3052/3103 3104/3053/3104 -f 3104/3053/3104 3094/3043/3094 3093/3042/3093 -f 3094/3043/3094 3104/3053/3104 3105/3054/3105 -f 3105/3054/3105 3095/3044/3095 3094/3043/3094 -f 3095/3044/3095 3105/3054/3105 3106/3055/3106 -f 3106/3055/3106 3096/3045/3096 3095/3044/3095 -f 3096/3045/3096 3106/3055/3106 3107/3056/3107 -f 3107/3056/3107 3097/3046/3097 3096/3045/3096 -f 3097/3046/3097 3107/3056/3107 3108/3057/3108 -f 3108/3057/3108 3098/3047/3098 3097/3046/3097 -f 3098/3047/3098 3108/3057/3108 3109/3058/3109 -f 3109/3058/3109 3099/3048/3099 3098/3047/3098 -f 3099/3048/3099 3109/3058/3109 3110/3059/3110 -f 3110/3059/3110 3100/3049/3100 3099/3048/3099 -f 3100/3049/3100 3110/3059/3110 3111/3060/3111 -f 3111/3060/3111 3101/3050/3101 3100/3049/3100 -f 2711/2660/2711 2721/2670/2721 3112/3061/3112 -f 3112/3061/3112 3102/3051/3102 2711/2660/2711 -f 3102/3051/3102 3112/3061/3112 3113/3062/3113 -f 3113/3062/3113 3103/3052/3103 3102/3051/3102 -f 3103/3052/3103 3113/3062/3113 3114/3063/3114 -f 3114/3063/3114 3104/3053/3104 3103/3052/3103 -f 3104/3053/3104 3114/3063/3114 3115/3064/3115 -f 3115/3064/3115 3105/3054/3105 3104/3053/3104 -f 3105/3054/3105 3115/3064/3115 3116/3065/3116 -f 3116/3065/3116 3106/3055/3106 3105/3054/3105 -f 3106/3055/3106 3116/3065/3116 3117/3066/3117 -f 3117/3066/3117 3107/3056/3107 3106/3055/3106 -f 3107/3056/3107 3117/3066/3117 3118/3067/3118 -f 3118/3067/3118 3108/3057/3108 3107/3056/3107 -f 3108/3057/3108 3118/3067/3118 3119/3068/3119 -f 3119/3068/3119 3109/3058/3109 3108/3057/3108 -f 3109/3058/3109 3119/3068/3119 3120/3069/3120 -f 3120/3069/3120 3110/3059/3110 3109/3058/3109 -f 3110/3059/3110 3120/3069/3120 3121/3070/3121 -f 3121/3070/3121 3111/3060/3111 3110/3059/3110 -f 2721/2670/2721 2731/2680/2731 3122/3071/3122 -f 3122/3071/3122 3112/3061/3112 2721/2670/2721 -f 3112/3061/3112 3122/3071/3122 3123/3072/3123 -f 3123/3072/3123 3113/3062/3113 3112/3061/3112 -f 3113/3062/3113 3123/3072/3123 3124/3073/3124 -f 3124/3073/3124 3114/3063/3114 3113/3062/3113 -f 3114/3063/3114 3124/3073/3124 3125/3074/3125 -f 3125/3074/3125 3115/3064/3115 3114/3063/3114 -f 3115/3064/3115 3125/3074/3125 3126/3075/3126 -f 3126/3075/3126 3116/3065/3116 3115/3064/3115 -f 3116/3065/3116 3126/3075/3126 3127/3076/3127 -f 3127/3076/3127 3117/3066/3117 3116/3065/3116 -f 3117/3066/3117 3127/3076/3127 3128/3077/3128 -f 3128/3077/3128 3118/3067/3118 3117/3066/3117 -f 3118/3067/3118 3128/3077/3128 3129/3078/3129 -f 3129/3078/3129 3119/3068/3119 3118/3067/3118 -f 3119/3068/3119 3129/3078/3129 3130/3079/3130 -f 3130/3079/3130 3120/3069/3120 3119/3068/3119 -f 3120/3069/3120 3130/3079/3130 3131/3080/3131 -f 3131/3080/3131 3121/3070/3121 3120/3069/3120 -f 2731/2680/2731 2741/2690/2741 3132/3081/3132 -f 3132/3081/3132 3122/3071/3122 2731/2680/2731 -f 3122/3071/3122 3132/3081/3132 3133/3082/3133 -f 3133/3082/3133 3123/3072/3123 3122/3071/3122 -f 3123/3072/3123 3133/3082/3133 3134/3083/3134 -f 3134/3083/3134 3124/3073/3124 3123/3072/3123 -f 3124/3073/3124 3134/3083/3134 3135/3084/3135 -f 3135/3084/3135 3125/3074/3125 3124/3073/3124 -f 3125/3074/3125 3135/3084/3135 3136/3085/3136 -f 3136/3085/3136 3126/3075/3126 3125/3074/3125 -f 3126/3075/3126 3136/3085/3136 3137/3086/3137 -f 3137/3086/3137 3127/3076/3127 3126/3075/3126 -f 3127/3076/3127 3137/3086/3137 3138/3087/3138 -f 3138/3087/3138 3128/3077/3128 3127/3076/3127 -f 3128/3077/3128 3138/3087/3138 3139/3088/3139 -f 3139/3088/3139 3129/3078/3129 3128/3077/3128 -f 3129/3078/3129 3139/3088/3139 3140/3089/3140 -f 3140/3089/3140 3130/3079/3130 3129/3078/3129 -f 3130/3079/3130 3140/3089/3140 3141/3090/3141 -f 3141/3090/3141 3131/3080/3131 3130/3079/3130 -f 2741/2690/2741 2751/2700/2751 3142/3091/3142 -f 3142/3091/3142 3132/3081/3132 2741/2690/2741 -f 3132/3081/3132 3142/3091/3142 3143/3092/3143 -f 3143/3092/3143 3133/3082/3133 3132/3081/3132 -f 3133/3082/3133 3143/3092/3143 3144/3093/3144 -f 3144/3093/3144 3134/3083/3134 3133/3082/3133 -f 3134/3083/3134 3144/3093/3144 3145/3094/3145 -f 3145/3094/3145 3135/3084/3135 3134/3083/3134 -f 3135/3084/3135 3145/3094/3145 3146/3095/3146 -f 3146/3095/3146 3136/3085/3136 3135/3084/3135 -f 3136/3085/3136 3146/3095/3146 3147/3096/3147 -f 3147/3096/3147 3137/3086/3137 3136/3085/3136 -f 3137/3086/3137 3147/3096/3147 3148/3097/3148 -f 3148/3097/3148 3138/3087/3138 3137/3086/3137 -f 3138/3087/3138 3148/3097/3148 3149/3098/3149 -f 3149/3098/3149 3139/3088/3139 3138/3087/3138 -f 3139/3088/3139 3149/3098/3149 3150/3099/3150 -f 3150/3099/3150 3140/3089/3140 3139/3088/3139 -f 3140/3089/3140 3150/3099/3150 3151/3100/3151 -f 3151/3100/3151 3141/3090/3141 3140/3089/3140 -f 2751/2700/2751 2761/2710/2761 3152/3101/3152 -f 3152/3101/3152 3142/3091/3142 2751/2700/2751 -f 3142/3091/3142 3152/3101/3152 3153/3102/3153 -f 3153/3102/3153 3143/3092/3143 3142/3091/3142 -f 3143/3092/3143 3153/3102/3153 3154/3103/3154 -f 3154/3103/3154 3144/3093/3144 3143/3092/3143 -f 3144/3093/3144 3154/3103/3154 3155/3104/3155 -f 3155/3104/3155 3145/3094/3145 3144/3093/3144 -f 3145/3094/3145 3155/3104/3155 3156/3105/3156 -f 3156/3105/3156 3146/3095/3146 3145/3094/3145 -f 3146/3095/3146 3156/3105/3156 3157/3106/3157 -f 3157/3106/3157 3147/3096/3147 3146/3095/3146 -f 3147/3096/3147 3157/3106/3157 3158/3107/3158 -f 3158/3107/3158 3148/3097/3148 3147/3096/3147 -f 3148/3097/3148 3158/3107/3158 3159/3108/3159 -f 3159/3108/3159 3149/3098/3149 3148/3097/3148 -f 3149/3098/3149 3159/3108/3159 3160/3109/3160 -f 3160/3109/3160 3150/3099/3150 3149/3098/3149 -f 3150/3099/3150 3160/3109/3160 3161/3110/3161 -f 3161/3110/3161 3151/3100/3151 3150/3099/3150 -f 2761/2710/2761 2771/2720/2771 3162/3111/3162 -f 3162/3111/3162 3152/3101/3152 2761/2710/2761 -f 3152/3101/3152 3162/3111/3162 3163/3112/3163 -f 3163/3112/3163 3153/3102/3153 3152/3101/3152 -f 3153/3102/3153 3163/3112/3163 3164/3113/3164 -f 3164/3113/3164 3154/3103/3154 3153/3102/3153 -f 3154/3103/3154 3164/3113/3164 3165/3114/3165 -f 3165/3114/3165 3155/3104/3155 3154/3103/3154 -f 3155/3104/3155 3165/3114/3165 3166/3115/3166 -f 3166/3115/3166 3156/3105/3156 3155/3104/3155 -f 3156/3105/3156 3166/3115/3166 3167/3116/3167 -f 3167/3116/3167 3157/3106/3157 3156/3105/3156 -f 3157/3106/3157 3167/3116/3167 3168/3117/3168 -f 3168/3117/3168 3158/3107/3158 3157/3106/3157 -f 3158/3107/3158 3168/3117/3168 3169/3118/3169 -f 3169/3118/3169 3159/3108/3159 3158/3107/3158 -f 3159/3108/3159 3169/3118/3169 3170/3119/3170 -f 3170/3119/3170 3160/3109/3160 3159/3108/3159 -f 3160/3109/3160 3170/3119/3170 3171/3120/3171 -f 3171/3120/3171 3161/3110/3161 3160/3109/3160 -f 2771/2720/2771 2781/2730/2781 3172/3121/3172 -f 3172/3121/3172 3162/3111/3162 2771/2720/2771 -f 3162/3111/3162 3172/3121/3172 3173/3122/3173 -f 3173/3122/3173 3163/3112/3163 3162/3111/3162 -f 3163/3112/3163 3173/3122/3173 3174/3123/3174 -f 3174/3123/3174 3164/3113/3164 3163/3112/3163 -f 3164/3113/3164 3174/3123/3174 3175/3124/3175 -f 3175/3124/3175 3165/3114/3165 3164/3113/3164 -f 3165/3114/3165 3175/3124/3175 3176/3125/3176 -f 3176/3125/3176 3166/3115/3166 3165/3114/3165 -f 3166/3115/3166 3176/3125/3176 3177/3126/3177 -f 3177/3126/3177 3167/3116/3167 3166/3115/3166 -f 3167/3116/3167 3177/3126/3177 3178/3127/3178 -f 3178/3127/3178 3168/3117/3168 3167/3116/3167 -f 3168/3117/3168 3178/3127/3178 3179/3128/3179 -f 3179/3128/3179 3169/3118/3169 3168/3117/3168 -f 3169/3118/3169 3179/3128/3179 3180/3129/3180 -f 3180/3129/3180 3170/3119/3170 3169/3118/3169 -f 3170/3119/3170 3180/3129/3180 3181/3130/3181 -f 3181/3130/3181 3171/3120/3171 3170/3119/3170 -f 2781/2730/2781 2791/2740/2791 3182/3131/3182 -f 3182/3131/3182 3172/3121/3172 2781/2730/2781 -f 3172/3121/3172 3182/3131/3182 3183/3132/3183 -f 3183/3132/3183 3173/3122/3173 3172/3121/3172 -f 3173/3122/3173 3183/3132/3183 3184/3133/3184 -f 3184/3133/3184 3174/3123/3174 3173/3122/3173 -f 3174/3123/3174 3184/3133/3184 3185/3134/3185 -f 3185/3134/3185 3175/3124/3175 3174/3123/3174 -f 3175/3124/3175 3185/3134/3185 3186/3135/3186 -f 3186/3135/3186 3176/3125/3176 3175/3124/3175 -f 3176/3125/3176 3186/3135/3186 3187/3136/3187 -f 3187/3136/3187 3177/3126/3177 3176/3125/3176 -f 3177/3126/3177 3187/3136/3187 3188/3137/3188 -f 3188/3137/3188 3178/3127/3178 3177/3126/3177 -f 3178/3127/3178 3188/3137/3188 3189/3138/3189 -f 3189/3138/3189 3179/3128/3179 3178/3127/3178 -f 3179/3128/3179 3189/3138/3189 3190/3139/3190 -f 3190/3139/3190 3180/3129/3180 3179/3128/3179 -f 3180/3129/3180 3190/3139/3190 3191/3140/3191 -f 3191/3140/3191 3181/3130/3181 3180/3129/3180 -f 2791/2740/2791 2801/2750/2801 3192/3141/3192 -f 3192/3141/3192 3182/3131/3182 2791/2740/2791 -f 3182/3131/3182 3192/3141/3192 3193/3142/3193 -f 3193/3142/3193 3183/3132/3183 3182/3131/3182 -f 3183/3132/3183 3193/3142/3193 3194/3143/3194 -f 3194/3143/3194 3184/3133/3184 3183/3132/3183 -f 3184/3133/3184 3194/3143/3194 3195/3144/3195 -f 3195/3144/3195 3185/3134/3185 3184/3133/3184 -f 3185/3134/3185 3195/3144/3195 3196/3145/3196 -f 3196/3145/3196 3186/3135/3186 3185/3134/3185 -f 3186/3135/3186 3196/3145/3196 3197/3146/3197 -f 3197/3146/3197 3187/3136/3187 3186/3135/3186 -f 3187/3136/3187 3197/3146/3197 3198/3147/3198 -f 3198/3147/3198 3188/3137/3188 3187/3136/3187 -f 3188/3137/3188 3198/3147/3198 3199/3148/3199 -f 3199/3148/3199 3189/3138/3189 3188/3137/3188 -f 3189/3138/3189 3199/3148/3199 3200/3149/3200 -f 3200/3149/3200 3190/3139/3190 3189/3138/3189 -f 3190/3139/3190 3200/3149/3200 3201/3150/3201 -f 3201/3150/3201 3191/3140/3191 3190/3139/3190 -f 2801/2750/2801 2811/2760/2811 3202/3151/3202 -f 3202/3151/3202 3192/3141/3192 2801/2750/2801 -f 3192/3141/3192 3202/3151/3202 3203/3152/3203 -f 3203/3152/3203 3193/3142/3193 3192/3141/3192 -f 3193/3142/3193 3203/3152/3203 3204/3153/3204 -f 3204/3153/3204 3194/3143/3194 3193/3142/3193 -f 3194/3143/3194 3204/3153/3204 3205/3154/3205 -f 3205/3154/3205 3195/3144/3195 3194/3143/3194 -f 3195/3144/3195 3205/3154/3205 3206/3155/3206 -f 3206/3155/3206 3196/3145/3196 3195/3144/3195 -f 3196/3145/3196 3206/3155/3206 3207/3156/3207 -f 3207/3156/3207 3197/3146/3197 3196/3145/3196 -f 3197/3146/3197 3207/3156/3207 3208/3157/3208 -f 3208/3157/3208 3198/3147/3198 3197/3146/3197 -f 3198/3147/3198 3208/3157/3208 3209/3158/3209 -f 3209/3158/3209 3199/3148/3199 3198/3147/3198 -f 3199/3148/3199 3209/3158/3209 3210/3159/3210 -f 3210/3159/3210 3200/3149/3200 3199/3148/3199 -f 3200/3149/3200 3210/3159/3210 3211/3160/3211 -f 3211/3160/3211 3201/3150/3201 3200/3149/3200 -f 2811/2760/2811 2821/2770/2821 3212/3161/3212 -f 3212/3161/3212 3202/3151/3202 2811/2760/2811 -f 3202/3151/3202 3212/3161/3212 3213/3162/3213 -f 3213/3162/3213 3203/3152/3203 3202/3151/3202 -f 3203/3152/3203 3213/3162/3213 3214/3163/3214 -f 3214/3163/3214 3204/3153/3204 3203/3152/3203 -f 3204/3153/3204 3214/3163/3214 3215/3164/3215 -f 3215/3164/3215 3205/3154/3205 3204/3153/3204 -f 3205/3154/3205 3215/3164/3215 3216/3165/3216 -f 3216/3165/3216 3206/3155/3206 3205/3154/3205 -f 3206/3155/3206 3216/3165/3216 3217/3166/3217 -f 3217/3166/3217 3207/3156/3207 3206/3155/3206 -f 3207/3156/3207 3217/3166/3217 3218/3167/3218 -f 3218/3167/3218 3208/3157/3208 3207/3156/3207 -f 3208/3157/3208 3218/3167/3218 3219/3168/3219 -f 3219/3168/3219 3209/3158/3209 3208/3157/3208 -f 3209/3158/3209 3219/3168/3219 3220/3169/3220 -f 3220/3169/3220 3210/3159/3210 3209/3158/3209 -f 3210/3159/3210 3220/3169/3220 3221/3170/3221 -f 3221/3170/3221 3211/3160/3211 3210/3159/3210 -f 2821/2770/2821 2831/2780/2831 3222/3171/3222 -f 3222/3171/3222 3212/3161/3212 2821/2770/2821 -f 3212/3161/3212 3222/3171/3222 3223/3172/3223 -f 3223/3172/3223 3213/3162/3213 3212/3161/3212 -f 3213/3162/3213 3223/3172/3223 3224/3173/3224 -f 3224/3173/3224 3214/3163/3214 3213/3162/3213 -f 3214/3163/3214 3224/3173/3224 3225/3174/3225 -f 3225/3174/3225 3215/3164/3215 3214/3163/3214 -f 3215/3164/3215 3225/3174/3225 3226/3175/3226 -f 3226/3175/3226 3216/3165/3216 3215/3164/3215 -f 3216/3165/3216 3226/3175/3226 3227/3176/3227 -f 3227/3176/3227 3217/3166/3217 3216/3165/3216 -f 3217/3166/3217 3227/3176/3227 3228/3177/3228 -f 3228/3177/3228 3218/3167/3218 3217/3166/3217 -f 3218/3167/3218 3228/3177/3228 3229/3178/3229 -f 3229/3178/3229 3219/3168/3219 3218/3167/3218 -f 3219/3168/3219 3229/3178/3229 3230/3179/3230 -f 3230/3179/3230 3220/3169/3220 3219/3168/3219 -f 3220/3169/3220 3230/3179/3230 3231/3180/3231 -f 3231/3180/3231 3221/3170/3221 3220/3169/3220 -f 2831/2780/2831 2841/2790/2841 3232/3181/3232 -f 3232/3181/3232 3222/3171/3222 2831/2780/2831 -f 3222/3171/3222 3232/3181/3232 3233/3182/3233 -f 3233/3182/3233 3223/3172/3223 3222/3171/3222 -f 3223/3172/3223 3233/3182/3233 3234/3183/3234 -f 3234/3183/3234 3224/3173/3224 3223/3172/3223 -f 3224/3173/3224 3234/3183/3234 3235/3184/3235 -f 3235/3184/3235 3225/3174/3225 3224/3173/3224 -f 3225/3174/3225 3235/3184/3235 3236/3185/3236 -f 3236/3185/3236 3226/3175/3226 3225/3174/3225 -f 3226/3175/3226 3236/3185/3236 3237/3186/3237 -f 3237/3186/3237 3227/3176/3227 3226/3175/3226 -f 3227/3176/3227 3237/3186/3237 3238/3187/3238 -f 3238/3187/3238 3228/3177/3228 3227/3176/3227 -f 3228/3177/3228 3238/3187/3238 3239/3188/3239 -f 3239/3188/3239 3229/3178/3229 3228/3177/3228 -f 3229/3178/3229 3239/3188/3239 3240/3189/3240 -f 3240/3189/3240 3230/3179/3230 3229/3178/3229 -f 3230/3179/3230 3240/3189/3240 3241/3190/3241 -f 3241/3190/3241 3231/3180/3231 3230/3179/3230 -f 2841/2790/2841 2461/2410/2461 2843/2792/2843 -f 2843/2792/2843 3232/3181/3232 2841/2790/2841 -f 3232/3181/3232 2843/2792/2843 2845/2794/2845 -f 2845/2794/2845 3233/3182/3233 3232/3181/3232 -f 3233/3182/3233 2845/2794/2845 2847/2796/2847 -f 2847/2796/2847 3234/3183/3234 3233/3182/3233 -f 3234/3183/3234 2847/2796/2847 2849/2798/2849 -f 2849/2798/2849 3235/3184/3235 3234/3183/3234 -f 3235/3184/3235 2849/2798/2849 2851/2800/2851 -f 2851/2800/2851 3236/3185/3236 3235/3184/3235 -f 3236/3185/3236 2851/2800/2851 2853/2802/2853 -f 2853/2802/2853 3237/3186/3237 3236/3185/3236 -f 3237/3186/3237 2853/2802/2853 2855/2804/2855 -f 2855/2804/2855 3238/3187/3238 3237/3186/3237 -f 3238/3187/3238 2855/2804/2855 2857/2806/2857 -f 2857/2806/2857 3239/3188/3239 3238/3187/3238 -f 3239/3188/3239 2857/2806/2857 2859/2808/2859 -f 2859/2808/2859 3240/3189/3240 3239/3188/3239 -f 3240/3189/3240 2859/2808/2859 2861/2810/2861 -f 2861/2810/2861 3241/3190/3241 3240/3189/3240 diff --git a/engine/src/test-data/Models/Terrain/Terrain.mesh.xml b/engine/src/test-data/Models/Terrain/Terrain.mesh.xml deleted file mode 100644 index 611fd9ef4..000000000 --- a/engine/src/test-data/Models/Terrain/Terrain.mesh.xml +++ /dev/null @@ -1,115985 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Tree/BarkColor.jpg b/engine/src/test-data/Models/Tree/BarkColor.jpg deleted file mode 100644 index cd40c7d2c..000000000 Binary files a/engine/src/test-data/Models/Tree/BarkColor.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Tree/BarkNormal.jpg b/engine/src/test-data/Models/Tree/BarkNormal.jpg deleted file mode 100644 index cc0ecc02b..000000000 Binary files a/engine/src/test-data/Models/Tree/BarkNormal.jpg and /dev/null differ diff --git a/engine/src/test-data/Models/Tree/Leaves.j3m b/engine/src/test-data/Models/Tree/Leaves.j3m deleted file mode 100644 index fddc2f75c..000000000 --- a/engine/src/test-data/Models/Tree/Leaves.j3m +++ /dev/null @@ -1,20 +0,0 @@ -Material Leaves : Common/MatDefs/Light/Lighting.j3md { - - Transparent On - - MaterialParameters { - DiffuseMap : Models/Tree/Leaves.png - UseAlpha : true - AlphaDiscardThreshold : 0.5 - UseMaterialColors : true - Ambient : .5 .5 .5 .5 - Diffuse : 0.7 0.7 0.7 1 - Specular : 0 0 0 1 - Shininess : 16 - } - AdditionalRenderState { - Blend Alpha - AlphaTestFalloff 0.50 - FaceCull Off - } -} \ No newline at end of file diff --git a/engine/src/test-data/Models/Tree/Leaves.png b/engine/src/test-data/Models/Tree/Leaves.png deleted file mode 100644 index a3a9f8e33..000000000 Binary files a/engine/src/test-data/Models/Tree/Leaves.png and /dev/null differ diff --git a/engine/src/test-data/Models/Tree/Tree.mesh.j3o b/engine/src/test-data/Models/Tree/Tree.mesh.j3o deleted file mode 100644 index f77a37bbe..000000000 Binary files a/engine/src/test-data/Models/Tree/Tree.mesh.j3o and /dev/null differ diff --git a/engine/src/test-data/Models/Tree/Tree.mesh.j3odata b/engine/src/test-data/Models/Tree/Tree.mesh.j3odata deleted file mode 100644 index 96938a36b..000000000 --- a/engine/src/test-data/Models/Tree/Tree.mesh.j3odata +++ /dev/null @@ -1,3 +0,0 @@ -# -#Thu Aug 25 22:31:31 CEST 2011 -ORIGINAL_PATH=Models/Tree/Tree.mesh.j3o diff --git a/engine/src/test-data/Models/Tree/Tree.mesh.xml b/engine/src/test-data/Models/Tree/Tree.mesh.xml deleted file mode 100644 index 3c197b86c..000000000 --- a/engine/src/test-data/Models/Tree/Tree.mesh.xml +++ /dev/null @@ -1,20727 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Models/Tree/Trunk.j3m b/engine/src/test-data/Models/Tree/Trunk.j3m deleted file mode 100644 index 061dc2331..000000000 --- a/engine/src/test-data/Models/Tree/Trunk.j3m +++ /dev/null @@ -1,11 +0,0 @@ -Material Trunk : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - DiffuseMap : Repeat Models/Tree/BarkColor.jpg - NormalMap : Repeat Models/Tree/BarkNormal.jpg - UseMaterialColors : true - Ambient : 0 0 0 1 - Diffuse : 1 1 1 1 - Specular : 0 0 0 1 - Shininess : 16 - } -} \ No newline at end of file diff --git a/engine/src/test-data/Models/WaterTest/WaterTest.mesh.xml b/engine/src/test-data/Models/WaterTest/WaterTest.mesh.xml deleted file mode 100644 index 6908e62aa..000000000 --- a/engine/src/test-data/Models/WaterTest/WaterTest.mesh.xml +++ /dev/null @@ -1,7505 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Scenes/Beach/FullskiesSunset0068.dds b/engine/src/test-data/Scenes/Beach/FullskiesSunset0068.dds deleted file mode 100644 index 6d5e0d8e8..000000000 Binary files a/engine/src/test-data/Scenes/Beach/FullskiesSunset0068.dds and /dev/null differ diff --git a/engine/src/test-data/Scenes/DotScene/DotScene.scene b/engine/src/test-data/Scenes/DotScene/DotScene.scene deleted file mode 100644 index dea6c15b3..000000000 --- a/engine/src/test-data/Scenes/DotScene/DotScene.scene +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/engine/src/test-data/Scenes/ManyLights/AO.jpg b/engine/src/test-data/Scenes/ManyLights/AO.jpg deleted file mode 100644 index 00990785d..000000000 Binary files a/engine/src/test-data/Scenes/ManyLights/AO.jpg and /dev/null differ diff --git a/engine/src/test-data/Scenes/ManyLights/Grid.mesh.xml b/engine/src/test-data/Scenes/ManyLights/Grid.mesh.xml deleted file mode 100644 index f5d75e44e..000000000 --- a/engine/src/test-data/Scenes/ManyLights/Grid.mesh.xml +++ /dev/null @@ -1,7162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Scenes/ManyLights/Main.material b/engine/src/test-data/Scenes/ManyLights/Main.material deleted file mode 100644 index 6b90874f3..000000000 --- a/engine/src/test-data/Scenes/ManyLights/Main.material +++ /dev/null @@ -1,20 +0,0 @@ -material Material -{ - receive_shadows off - technique - { - pass - { - ambient 0.000000 0.000000 0.000000 1.000000 - diffuse 1.000000 1.000000 1.000000 1.000000 - specular 0.000000 0.000000 0.000000 1.000000 0.250000 - emissive 0.000000 0.000000 0.000000 1.000000 - texture_unit - { - texture AO.jpg - tex_address_mode wrap - filtering trilinear - } - } - } -} diff --git a/engine/src/test-data/Scenes/ManyLights/Main.scene b/engine/src/test-data/Scenes/ManyLights/Main.scene deleted file mode 100644 index eb260fbc3..000000000 --- a/engine/src/test-data/Scenes/ManyLights/Main.scene +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/src/test-data/Sound/Effects/Bang.wav b/engine/src/test-data/Sound/Effects/Bang.wav deleted file mode 100644 index 4bfb435e7..000000000 Binary files a/engine/src/test-data/Sound/Effects/Bang.wav and /dev/null differ diff --git a/engine/src/test-data/Sound/Effects/Beep.ogg b/engine/src/test-data/Sound/Effects/Beep.ogg deleted file mode 100644 index 91eb7191f..000000000 Binary files a/engine/src/test-data/Sound/Effects/Beep.ogg and /dev/null differ diff --git a/engine/src/test-data/Sound/Effects/Foot steps.ogg b/engine/src/test-data/Sound/Effects/Foot steps.ogg deleted file mode 100644 index d10d3c793..000000000 Binary files a/engine/src/test-data/Sound/Effects/Foot steps.ogg and /dev/null differ diff --git a/engine/src/test-data/Sound/Effects/Gun.wav b/engine/src/test-data/Sound/Effects/Gun.wav deleted file mode 100644 index eecc4d107..000000000 Binary files a/engine/src/test-data/Sound/Effects/Gun.wav and /dev/null differ diff --git a/engine/src/test-data/Sound/Effects/kick.wav b/engine/src/test-data/Sound/Effects/kick.wav deleted file mode 100644 index 6a3f26f1f..000000000 Binary files a/engine/src/test-data/Sound/Effects/kick.wav and /dev/null differ diff --git a/engine/src/test-data/Sound/Environment/Nature.ogg b/engine/src/test-data/Sound/Environment/Nature.ogg deleted file mode 100644 index e98d73e45..000000000 Binary files a/engine/src/test-data/Sound/Environment/Nature.ogg and /dev/null differ diff --git a/engine/src/test-data/Sound/Environment/Ocean Waves.ogg b/engine/src/test-data/Sound/Environment/Ocean Waves.ogg deleted file mode 100644 index a52c96c3f..000000000 Binary files a/engine/src/test-data/Sound/Environment/Ocean Waves.ogg and /dev/null differ diff --git a/engine/src/test-data/Sound/Environment/River.ogg b/engine/src/test-data/Sound/Environment/River.ogg deleted file mode 100644 index e213fe394..000000000 Binary files a/engine/src/test-data/Sound/Environment/River.ogg and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/TerrainGrid.j3o b/engine/src/test-data/TerrainGrid/TerrainGrid.j3o deleted file mode 100644 index a9134f0d6..000000000 Binary files a/engine/src/test-data/TerrainGrid/TerrainGrid.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_0_0_-1.j3o b/engine/src/test-data/TerrainGrid/testgrid_0_0_-1.j3o deleted file mode 100644 index 1e9467d91..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_0_0_-1.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_0_0_-2.j3o b/engine/src/test-data/TerrainGrid/testgrid_0_0_-2.j3o deleted file mode 100644 index c7ee9345e..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_0_0_-2.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_0_0_-3.j3o b/engine/src/test-data/TerrainGrid/testgrid_0_0_-3.j3o deleted file mode 100644 index c13985efc..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_0_0_-3.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_0_0_0.j3o b/engine/src/test-data/TerrainGrid/testgrid_0_0_0.j3o deleted file mode 100644 index 73c5a009c..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_0_0_0.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_0_0_1.j3o b/engine/src/test-data/TerrainGrid/testgrid_0_0_1.j3o deleted file mode 100644 index bd2157fa2..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_0_0_1.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_1_0_-1.j3o b/engine/src/test-data/TerrainGrid/testgrid_1_0_-1.j3o deleted file mode 100644 index 2a8b59d82..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_1_0_-1.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_1_0_-2.j3o b/engine/src/test-data/TerrainGrid/testgrid_1_0_-2.j3o deleted file mode 100644 index 0a69a0d87..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_1_0_-2.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_1_0_-3.j3o b/engine/src/test-data/TerrainGrid/testgrid_1_0_-3.j3o deleted file mode 100644 index 2a044106e..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_1_0_-3.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_1_0_0.j3o b/engine/src/test-data/TerrainGrid/testgrid_1_0_0.j3o deleted file mode 100644 index 140dcf850..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_1_0_0.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_1_0_1.j3o b/engine/src/test-data/TerrainGrid/testgrid_1_0_1.j3o deleted file mode 100644 index 7d20ace1f..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_1_0_1.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_2_0_-1.j3o b/engine/src/test-data/TerrainGrid/testgrid_2_0_-1.j3o deleted file mode 100644 index 1c4d1fbc0..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_2_0_-1.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_2_0_-2.j3o b/engine/src/test-data/TerrainGrid/testgrid_2_0_-2.j3o deleted file mode 100644 index cd87ea5ef..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_2_0_-2.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_2_0_-3.j3o b/engine/src/test-data/TerrainGrid/testgrid_2_0_-3.j3o deleted file mode 100644 index 08251160d..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_2_0_-3.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_2_0_-4.j3o b/engine/src/test-data/TerrainGrid/testgrid_2_0_-4.j3o deleted file mode 100644 index b45d2c39b..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_2_0_-4.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_2_0_0.j3o b/engine/src/test-data/TerrainGrid/testgrid_2_0_0.j3o deleted file mode 100644 index 7764d0ccc..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_2_0_0.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_3_0_-1.j3o b/engine/src/test-data/TerrainGrid/testgrid_3_0_-1.j3o deleted file mode 100644 index c8cbb413a..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_3_0_-1.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_3_0_-2.j3o b/engine/src/test-data/TerrainGrid/testgrid_3_0_-2.j3o deleted file mode 100644 index edada9624..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_3_0_-2.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_3_0_-3.j3o b/engine/src/test-data/TerrainGrid/testgrid_3_0_-3.j3o deleted file mode 100644 index 6d61636b5..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_3_0_-3.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_3_0_-4.j3o b/engine/src/test-data/TerrainGrid/testgrid_3_0_-4.j3o deleted file mode 100644 index a14d6cf64..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_3_0_-4.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_3_0_0.j3o b/engine/src/test-data/TerrainGrid/testgrid_3_0_0.j3o deleted file mode 100644 index 7137ee9a9..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_3_0_0.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_4_0_-1.j3o b/engine/src/test-data/TerrainGrid/testgrid_4_0_-1.j3o deleted file mode 100644 index f0f6471c0..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_4_0_-1.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_4_0_-2.j3o b/engine/src/test-data/TerrainGrid/testgrid_4_0_-2.j3o deleted file mode 100644 index 95699bfa2..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_4_0_-2.j3o and /dev/null differ diff --git a/engine/src/test-data/TerrainGrid/testgrid_4_0_-3.j3o b/engine/src/test-data/TerrainGrid/testgrid_4_0_-3.j3o deleted file mode 100644 index b44143149..000000000 Binary files a/engine/src/test-data/TerrainGrid/testgrid_4_0_-3.j3o and /dev/null differ diff --git a/engine/src/test-data/Textures/3D/flame.dds b/engine/src/test-data/Textures/3D/flame.dds deleted file mode 100644 index 2eb00f746..000000000 Binary files a/engine/src/test-data/Textures/3D/flame.dds and /dev/null differ diff --git a/engine/src/test-data/Textures/BumpMapTest/SimpleBump.j3m b/engine/src/test-data/Textures/BumpMapTest/SimpleBump.j3m deleted file mode 100644 index 9ed9187da..000000000 --- a/engine/src/test-data/Textures/BumpMapTest/SimpleBump.j3m +++ /dev/null @@ -1,11 +0,0 @@ -Material Pong Rock : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 8.0 - NormalMap: Textures/BumpMapTest/Simple_normal.png - ParallaxMap : Textures/BumpMapTest/Simple_height.png - UseMaterialColors : true - Ambient : 0 0 0 1 - Diffuse : 1 1 1 1 - Specular : 0 0 0 1 - } -} \ No newline at end of file diff --git a/engine/src/test-data/Textures/BumpMapTest/Simple_height.png b/engine/src/test-data/Textures/BumpMapTest/Simple_height.png deleted file mode 100644 index f396670d8..000000000 Binary files a/engine/src/test-data/Textures/BumpMapTest/Simple_height.png and /dev/null differ diff --git a/engine/src/test-data/Textures/BumpMapTest/Simple_normal.png b/engine/src/test-data/Textures/BumpMapTest/Simple_normal.png deleted file mode 100644 index e03ef00d8..000000000 Binary files a/engine/src/test-data/Textures/BumpMapTest/Simple_normal.png and /dev/null differ diff --git a/engine/src/test-data/Textures/BumpMapTest/Tangent.j3m b/engine/src/test-data/Textures/BumpMapTest/Tangent.j3m deleted file mode 100644 index 851a0e9e9..000000000 --- a/engine/src/test-data/Textures/BumpMapTest/Tangent.j3m +++ /dev/null @@ -1,6 +0,0 @@ -Material TangentBinormal : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 8.0 - DiffuseMap: Textures/BumpMapTest/Tangent.png - } -} \ No newline at end of file diff --git a/engine/src/test-data/Textures/BumpMapTest/Tangent.png b/engine/src/test-data/Textures/BumpMapTest/Tangent.png deleted file mode 100644 index 0c9a3ce2f..000000000 Binary files a/engine/src/test-data/Textures/BumpMapTest/Tangent.png and /dev/null differ diff --git a/engine/src/test-data/Textures/ColorRamp/cloudy.png b/engine/src/test-data/Textures/ColorRamp/cloudy.png deleted file mode 100644 index 169e98118..000000000 Binary files a/engine/src/test-data/Textures/ColorRamp/cloudy.png and /dev/null differ diff --git a/engine/src/test-data/Textures/ColorRamp/toon.png b/engine/src/test-data/Textures/ColorRamp/toon.png deleted file mode 100644 index 70591884f..000000000 Binary files a/engine/src/test-data/Textures/ColorRamp/toon.png and /dev/null differ diff --git a/engine/src/test-data/Textures/ColoredTex/Monkey.png b/engine/src/test-data/Textures/ColoredTex/Monkey.png deleted file mode 100644 index eafa03fde..000000000 Binary files a/engine/src/test-data/Textures/ColoredTex/Monkey.png and /dev/null differ diff --git a/engine/src/test-data/Textures/HdrTest/Memorial.hdr b/engine/src/test-data/Textures/HdrTest/Memorial.hdr deleted file mode 100644 index 97919bf81..000000000 Binary files a/engine/src/test-data/Textures/HdrTest/Memorial.hdr and /dev/null differ diff --git a/engine/src/test-data/Textures/HdrTest/Memorial.j3m b/engine/src/test-data/Textures/HdrTest/Memorial.j3m deleted file mode 100644 index 81c5c8a54..000000000 --- a/engine/src/test-data/Textures/HdrTest/Memorial.j3m +++ /dev/null @@ -1,5 +0,0 @@ -Material HDR Picture : Common/MatDefs/Misc/Unshaded.j3md { - MaterialParameters { - ColorMap : Flip Textures/HdrTest/Memorial.hdr - } -} \ No newline at end of file diff --git a/engine/src/test-data/Textures/Sky/Bright/BrightSky.dds b/engine/src/test-data/Textures/Sky/Bright/BrightSky.dds deleted file mode 100644 index 3379320ab..000000000 Binary files a/engine/src/test-data/Textures/Sky/Bright/BrightSky.dds and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/Bright/FullskiesBlueClear03.dds b/engine/src/test-data/Textures/Sky/Bright/FullskiesBlueClear03.dds deleted file mode 100644 index 1a86a1fda..000000000 Binary files a/engine/src/test-data/Textures/Sky/Bright/FullskiesBlueClear03.dds and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/Lagoon/LICENSE.txt b/engine/src/test-data/Textures/Sky/Lagoon/LICENSE.txt deleted file mode 100644 index 9685769b1..000000000 --- a/engine/src/test-data/Textures/Sky/Lagoon/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Licensed under CC-BY-NC -http://creativecommons.org/licenses/by-nc/3.0/ - -"The textures on this page are for non-commercial purposes only. -You're free to use and modify them otherwise." - -http://www.hazelwhorley.com/skyboxtex2_bitmaps.html \ No newline at end of file diff --git a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_down.jpg b/engine/src/test-data/Textures/Sky/Lagoon/lagoon_down.jpg deleted file mode 100644 index c9f5e16e3..000000000 Binary files a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_down.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_east.jpg b/engine/src/test-data/Textures/Sky/Lagoon/lagoon_east.jpg deleted file mode 100644 index 1eb30a715..000000000 Binary files a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_east.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_north.jpg b/engine/src/test-data/Textures/Sky/Lagoon/lagoon_north.jpg deleted file mode 100644 index be769e595..000000000 Binary files a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_north.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_south.jpg b/engine/src/test-data/Textures/Sky/Lagoon/lagoon_south.jpg deleted file mode 100644 index ec28db88f..000000000 Binary files a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_south.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_up.jpg b/engine/src/test-data/Textures/Sky/Lagoon/lagoon_up.jpg deleted file mode 100644 index 3128f76d1..000000000 Binary files a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_up.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_west.jpg b/engine/src/test-data/Textures/Sky/Lagoon/lagoon_west.jpg deleted file mode 100644 index 5528fd8c0..000000000 Binary files a/engine/src/test-data/Textures/Sky/Lagoon/lagoon_west.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/St Peters/StPeters.hdr b/engine/src/test-data/Textures/Sky/St Peters/StPeters.hdr deleted file mode 100644 index 5283a6dad..000000000 Binary files a/engine/src/test-data/Textures/Sky/St Peters/StPeters.hdr and /dev/null differ diff --git a/engine/src/test-data/Textures/Sky/St Peters/StPeters.jpg b/engine/src/test-data/Textures/Sky/St Peters/StPeters.jpg deleted file mode 100644 index 4d46cef7a..000000000 Binary files a/engine/src/test-data/Textures/Sky/St Peters/StPeters.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall.j3m b/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall.j3m deleted file mode 100644 index 8b54f9e39..000000000 --- a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall.j3m +++ /dev/null @@ -1,8 +0,0 @@ -Material Pong Rock : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 2.0 - DiffuseMap : Textures/Terrain/BrickWall/BrickWall.jpg - NormalMap : Textures/Terrain/BrickWall/BrickWall_normal.jpg - ParallaxMap : Textures/Terrain/BrickWall/BrickWall_height.jpg - } -} \ No newline at end of file diff --git a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall.jpg b/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall.jpg deleted file mode 100644 index c386a0d6c..000000000 Binary files a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall2.j3m b/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall2.j3m deleted file mode 100644 index 7db3ab893..000000000 --- a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall2.j3m +++ /dev/null @@ -1,8 +0,0 @@ -Material Pong Rock : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 2.0 - DiffuseMap : Textures/Terrain/BrickWall/BrickWall.jpg - NormalMap : Textures/Terrain/BrickWall/BrickWall_normal_parallax.dds - PackedNormalParallax: true - } -} \ No newline at end of file diff --git a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_height.jpg b/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_height.jpg deleted file mode 100644 index 3486674aa..000000000 Binary files a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_height.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_normal.jpg b/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_normal.jpg deleted file mode 100644 index 249d553c5..000000000 Binary files a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_normal.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_normal_parallax.dds b/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_normal_parallax.dds deleted file mode 100644 index fd93003dd..000000000 Binary files a/engine/src/test-data/Textures/Terrain/BrickWall/BrickWall_normal_parallax.dds and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/Pond/Pond.j3m b/engine/src/test-data/Textures/Terrain/Pond/Pond.j3m deleted file mode 100644 index a7aa9181e..000000000 --- a/engine/src/test-data/Textures/Terrain/Pond/Pond.j3m +++ /dev/null @@ -1,7 +0,0 @@ -Material Pong Rock : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 8.0 - DiffuseMap: Repeat Textures/Terrain/Pond/Pond.jpg - NormalMap: Repeat Textures/Terrain/Pond/Pond_normal.png - } -} \ No newline at end of file diff --git a/engine/src/test-data/Textures/Terrain/Pond/Pond.jpg b/engine/src/test-data/Textures/Terrain/Pond/Pond.jpg deleted file mode 100644 index 177881cfc..000000000 Binary files a/engine/src/test-data/Textures/Terrain/Pond/Pond.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/Pond/Pond_normal.png b/engine/src/test-data/Textures/Terrain/Pond/Pond_normal.png deleted file mode 100644 index 8e566ed4d..000000000 Binary files a/engine/src/test-data/Textures/Terrain/Pond/Pond_normal.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/Rock/Rock.PNG b/engine/src/test-data/Textures/Terrain/Rock/Rock.PNG deleted file mode 100644 index 4b5b1908b..000000000 Binary files a/engine/src/test-data/Textures/Terrain/Rock/Rock.PNG and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/Rock/Rock.j3m b/engine/src/test-data/Textures/Terrain/Rock/Rock.j3m deleted file mode 100644 index 643653b48..000000000 --- a/engine/src/test-data/Textures/Terrain/Rock/Rock.j3m +++ /dev/null @@ -1,7 +0,0 @@ -Material Rock : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 16.0 - DiffuseMap : Textures/Terrain/Rock/Rock.PNG - NormalMap : Textures/Terrain/Rock/Rock_normal.png - } -} \ No newline at end of file diff --git a/engine/src/test-data/Textures/Terrain/Rock/Rock_normal.png b/engine/src/test-data/Textures/Terrain/Rock/Rock_normal.png deleted file mode 100644 index 48221c0c5..000000000 Binary files a/engine/src/test-data/Textures/Terrain/Rock/Rock_normal.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/Rock2/rock.jpg b/engine/src/test-data/Textures/Terrain/Rock2/rock.jpg deleted file mode 100644 index 343dc1cb9..000000000 Binary files a/engine/src/test-data/Textures/Terrain/Rock2/rock.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/Rocky/Rocky.j3m b/engine/src/test-data/Textures/Terrain/Rocky/Rocky.j3m deleted file mode 100644 index 0d228f9c7..000000000 --- a/engine/src/test-data/Textures/Terrain/Rocky/Rocky.j3m +++ /dev/null @@ -1,7 +0,0 @@ -Material Rock : Common/MatDefs/Light/Lighting.j3md { - MaterialParameters { - Shininess: 32.0 - DiffuseMap : Textures/Terrain/Rocky/RockyTexture.jpg - NormalMap : Textures/Terrain/Rocky/RockyNormals.jpg - } -} \ No newline at end of file diff --git a/engine/src/test-data/Textures/Terrain/Rocky/RockyNormals.jpg b/engine/src/test-data/Textures/Terrain/Rocky/RockyNormals.jpg deleted file mode 100644 index cae306024..000000000 Binary files a/engine/src/test-data/Textures/Terrain/Rocky/RockyNormals.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/Rocky/RockyTexture.jpg b/engine/src/test-data/Textures/Terrain/Rocky/RockyTexture.jpg deleted file mode 100644 index ed60a4cc8..000000000 Binary files a/engine/src/test-data/Textures/Terrain/Rocky/RockyTexture.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/alpha1.png b/engine/src/test-data/Textures/Terrain/splat/alpha1.png deleted file mode 100644 index 4179ba517..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/alpha1.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/alpha2.png b/engine/src/test-data/Textures/Terrain/splat/alpha2.png deleted file mode 100644 index 49eacecf0..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/alpha2.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/alphamap.png b/engine/src/test-data/Textures/Terrain/splat/alphamap.png deleted file mode 100644 index 14f0a9b55..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/alphamap.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/alphamap2.png b/engine/src/test-data/Textures/Terrain/splat/alphamap2.png deleted file mode 100644 index 9367ef6b8..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/alphamap2.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/dirt.jpg b/engine/src/test-data/Textures/Terrain/splat/dirt.jpg deleted file mode 100644 index 474206828..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/dirt.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/dirt_normal.png b/engine/src/test-data/Textures/Terrain/splat/dirt_normal.png deleted file mode 100644 index 2eb57f4af..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/dirt_normal.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/fortress512.png b/engine/src/test-data/Textures/Terrain/splat/fortress512.png deleted file mode 100644 index b6b4ed165..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/fortress512.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/grass.jpg b/engine/src/test-data/Textures/Terrain/splat/grass.jpg deleted file mode 100644 index 8d5b97d3c..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/grass.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/grass_normal.jpg b/engine/src/test-data/Textures/Terrain/splat/grass_normal.jpg deleted file mode 100644 index 12de38085..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/grass_normal.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/mountains1024.jpg b/engine/src/test-data/Textures/Terrain/splat/mountains1024.jpg deleted file mode 100644 index 37d647591..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/mountains1024.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/mountains512.png b/engine/src/test-data/Textures/Terrain/splat/mountains512.png deleted file mode 100644 index 13cb4d11c..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/mountains512.png and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/road.jpg b/engine/src/test-data/Textures/Terrain/splat/road.jpg deleted file mode 100644 index 21195e6eb..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/road.jpg and /dev/null differ diff --git a/engine/src/test-data/Textures/Terrain/splat/road_normal.png b/engine/src/test-data/Textures/Terrain/splat/road_normal.png deleted file mode 100644 index ae56480a3..000000000 Binary files a/engine/src/test-data/Textures/Terrain/splat/road_normal.png and /dev/null differ diff --git a/engine/src/test-data/profiling points b/engine/src/test-data/profiling points deleted file mode 100644 index 168346ce1..000000000 --- a/engine/src/test-data/profiling points +++ /dev/null @@ -1,32 +0,0 @@ -CPU usage: ----------- - -ObjLoader.load() - - ObjLoader.readLine() - -HDRLoader.writeRGBE() // need faster RGBE8 -> RGB16F conversion - -// OpenGL resource-intesive points -Renderer.renderQueue() -Renderer.setVertexAttrib() -Material.apply() - -Memory usage: -------------- - - OBJLoader -Java's Scanner class allocates approx. 8 MB of memory -to load the teapot model. Either implement ObjLoader without Scanner -or create an import/export system! - - - AWTLoader -Using AWT for loading images is slow and uses more memory -than a home-grown loader. Use DDS and TGA formats more. - - - Shader.getUniforms -This method generates a collection to represent the Uniforms -in the shader and is used by Renderer.updateShaderUniforms() -Need a faster method to iterate & update uniforms in a shader. - - - Material.apply -Same thing as above. Generates a Collection and then an Iterator for a HashMap. -First, consider if using a HashMap is neccessary.. \ No newline at end of file diff --git a/engine/src/tools/jme3tools/navigation/Coordinate.java b/engine/src/tools/jme3tools/navigation/Coordinate.java deleted file mode 100644 index 53195e8a2..000000000 --- a/engine/src/tools/jme3tools/navigation/Coordinate.java +++ /dev/null @@ -1,250 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.navigation; - -import jme3tools.navigation.InvalidPositionException; -import java.text.DecimalFormat; -import jme3tools.navigation.StringUtil; -import jme3tools.navigation.NumUtil; - -/** - * Coordinate class. Used to store a coordinate in [DD]D MM.M format. - * - * @author Benjamin Jakobus (based on JMarine by Benjamin Jakobus and Cormac Gebruers) - * @version 1.0 - * @since 1.0 - */ -public class Coordinate { - - /* the degree part of the position (+ N/E, -W/S) */ - private int deg; - - /* the decimals of a minute */ - private double minsDecMins; - - /* the coordinate as a decimal*/ - private double decCoordinate; - - /* whether this coordinate is a latitude or a longitude: : LAT==0, LONG==1 */ - private int coOrdinate; - - /* The minutes trailing decimal precision to use for positions */ - public static final int MINPRECISION = 4; - /* The degrees trailing decimal precision to use for positions */ - public static final int DEGPRECISION = 7; - - /* typeDefs for coOrdinates */ - public static final int LAT = 0; - public static final int LNG = 1; - - /* typeDefs for quadrant */ - public static final int E = 0; - public static final int S = 1; - public static final int W = 2; - public static final int N = 3; - - /** - * Constructor - * - * @param deg - * @param minsDecMins - * @param coOrdinate - * @param quad - * @throws InvalidPositionException - * @since 1.0 - */ - public Coordinate(int deg, float minsDecMins, int coOrdinate, - int quad) throws InvalidPositionException { - buildCoOrdinate(deg, minsDecMins, coOrdinate, quad); - if (verify()) { - } else { - throw new InvalidPositionException(); - } - } - - /** - * Constructor - * @param decCoordinate - * @param coOrdinate - * @throws InvalidPositionException - * @since 1.0 - */ - public Coordinate(double decCoordinate, int coOrdinate) throws InvalidPositionException { - DecimalFormat form = new DecimalFormat("#.#######"); - - this.decCoordinate = decCoordinate; - this.coOrdinate = coOrdinate; - if (verify()) { - deg = new Float(decCoordinate).intValue(); - if (deg < 0) { - minsDecMins = Double.parseDouble(form.format((Math.abs(decCoordinate) - Math.abs(deg)) * 60)); - } else { - minsDecMins = Double.parseDouble(form.format((decCoordinate - deg) * 60)); - } - } else { - throw new InvalidPositionException(); - } - } - - /** - * This constructor takes a coordinate in the ALRS formats i.e - * 38∞31.64'N for lat, and 28∞19.12'W for long - * Note: ALRS positions are occasionally written with the decimal minutes - * apostrophe in the 'wrong' place and with an non CP1252 compliant decimal character. - * This issue has to be corrected in the source database - * @param coOrdinate - * @throws InvalidPositionException - * @since 1.0 - */ - public Coordinate(String coOrdinate) throws InvalidPositionException { - //firstly split it into its component parts and dispose of the unneeded characters - String[] items = coOrdinate.split("°"); - int deg = Integer.valueOf(items[0]); - - items = items[1].split("'"); - float minsDecMins = Float.valueOf(items[0]); - char quad = items[1].charAt(0); - - switch (quad) { - case 'N': - buildCoOrdinate(deg, minsDecMins, Coordinate.LAT, Coordinate.N); - break; - case 'S': - buildCoOrdinate(deg, minsDecMins, Coordinate.LAT, Coordinate.S); - break; - case 'E': - buildCoOrdinate(deg, minsDecMins, Coordinate.LNG, Coordinate.E); - break; - case 'W': - buildCoOrdinate(deg, minsDecMins, Coordinate.LNG, Coordinate.W); - } - if (verify()) { - } else { - throw new InvalidPositionException(); - } - } - - /** - * Prints out a coordinate as a string - * @return the coordinate in decimal format - * @since 1.0 - */ - public String toStringDegMin() { - String str = ""; - String quad = ""; - StringUtil su = new StringUtil(); - switch (coOrdinate) { - case LAT: - if (decCoordinate >= 0) { - quad = "N"; - } else { - quad = "S"; - } - str = su.padNumZero(Math.abs(deg), 2); - str += "\u00b0" + su.padNumZero(Math.abs(minsDecMins), 2, MINPRECISION) + "'" + quad; - break; - case LNG: - if (decCoordinate >= 0) { - quad = "E"; - } else { - quad = "W"; - } - str = su.padNumZero(Math.abs(deg), 3); - str += "\u00b0" + su.padNumZero(Math.abs(minsDecMins), 2, MINPRECISION) + "'" + quad; - break; - } - return str; - } - - /** - * Prints out a coordinate as a string - * @return the coordinate in decimal format - * @since 1.0 - */ - public String toStringDec() { - StringUtil u = new StringUtil(); - switch (coOrdinate) { - case LAT: - return u.padNumZero(decCoordinate, 2, DEGPRECISION); - case LNG: - return u.padNumZero(decCoordinate, 3, DEGPRECISION); - } - return "error"; - } - - /** - * Returns the coordinate's decimal value - * @return float the decimal value of the coordinate - * @since 1.0 - */ - public double decVal() { - return decCoordinate; - } - - /** - * Determines whether a decimal position is valid - * @return result of validity test - * @since 1.0 - */ - private boolean verify() { - switch (coOrdinate) { - case LAT: - if (Math.abs(decCoordinate) > 90.0) { - return false; - } - break; - - case LNG: - if (Math.abs(decCoordinate) > 180) { - return false; - } - } - return true; - } - - /** - * Populate this object by parsing the arguments to the function - * Placed here to allow multiple constructors to use it - * @since 1.0 - */ - private void buildCoOrdinate(int deg, float minsDecMins, int coOrdinate, - int quad) { - NumUtil nu = new NumUtil(); - - switch (coOrdinate) { - case LAT: - switch (quad) { - case N: - this.deg = deg; - this.minsDecMins = minsDecMins; - this.coOrdinate = coOrdinate; - decCoordinate = nu.Round(this.deg + (float) this.minsDecMins / 60, Coordinate.MINPRECISION); - break; - - case S: - this.deg = -deg; - this.minsDecMins = minsDecMins; - this.coOrdinate = coOrdinate; - decCoordinate = nu.Round(this.deg - ((float) this.minsDecMins / 60), Coordinate.MINPRECISION); - } - - case LNG: - switch (quad) { - case E: - this.deg = deg; - this.minsDecMins = minsDecMins; - this.coOrdinate = coOrdinate; - decCoordinate = nu.Round(this.deg + ((float) this.minsDecMins / 60), Coordinate.MINPRECISION); - break; - - case W: - this.deg = -deg; - this.minsDecMins = minsDecMins; - this.coOrdinate = coOrdinate; - decCoordinate = nu.Round(this.deg - ((float) this.minsDecMins / 60), Coordinate.MINPRECISION); - } - } - } -} diff --git a/engine/src/tools/jme3tools/navigation/GCSailing.java b/engine/src/tools/jme3tools/navigation/GCSailing.java deleted file mode 100644 index f5699b591..000000000 --- a/engine/src/tools/jme3tools/navigation/GCSailing.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.navigation; - -/** - * A utility class to package up a great circle sailing. - * - * @author Benjamin Jakobus, based on JMarine (by Cormac Gebruers and Benjamin - * Jakobus) - * - * @version 1.0 - * @since 1.0 - */ -public class GCSailing { - - private int[] courses; - private float[] distancesNM; - - public GCSailing(int[] pCourses, float[] pDistancesNM) { - courses = pCourses; - distancesNM = pDistancesNM; - } - - public int[] getCourses() { - return courses; - } - - public float[] getDistancesNM() { - return distancesNM; - } -} diff --git a/engine/src/tools/jme3tools/navigation/InvalidPositionException.java b/engine/src/tools/jme3tools/navigation/InvalidPositionException.java deleted file mode 100644 index 32b3c9bd5..000000000 --- a/engine/src/tools/jme3tools/navigation/InvalidPositionException.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package jme3tools.navigation; - -/** - * - * @author normenhansen - */ -public class InvalidPositionException extends Exception{ - -} diff --git a/engine/src/tools/jme3tools/navigation/MapModel2D.java b/engine/src/tools/jme3tools/navigation/MapModel2D.java deleted file mode 100644 index 1e6ec362b..000000000 --- a/engine/src/tools/jme3tools/navigation/MapModel2D.java +++ /dev/null @@ -1,371 +0,0 @@ -package jme3tools.navigation; -import jme3tools.navigation.InvalidPositionException; -import java.awt.Point; -import java.text.DecimalFormat; -import jme3tools.navigation.Position; -import jme3tools.navigation.NavCalculator; - -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - - -/** - * A representation of the actual map in terms of lat/long and x,y co-ordinates. - * The Map class contains various helper methods such as methods for determining - * the pixel positions for lat/long co-ordinates and vice versa. - * - * @author Cormac Gebruers - * @author Benjamin Jakobus - * @version 1.0 - * @since 1.0 - */ -public class MapModel2D { - - /* The number of radians per degree */ - private final static double RADIANS_PER_DEGREE = 57.2957; - - /* The number of degrees per radian */ - private final static double DEGREES_PER_RADIAN = 0.0174532925; - - /* The map's width in longitude */ - public final static int DEFAULT_MAP_WIDTH_LONGITUDE = 360; - - /* The top right hand corner of the map */ - private Position centre; - - /* The x and y co-ordinates for the viewport's centre */ - private int xCentre; - private int yCentre; - - /* The width (in pixels) of the viewport holding the map */ - private int viewportWidth; - - /* The viewport height in pixels */ - private int viewportHeight; - - /* The number of minutes that one pixel represents */ - private double minutesPerPixel; - - /** - * Constructor - * @param viewportWidth the pixel width of the viewport (component) in which - * the map is displayed - * @since 1.0 - */ - public MapModel2D(int viewportWidth) { - try { - this.centre = new Position(0, 0); - } catch (InvalidPositionException e) { - e.printStackTrace(); - } - - this.viewportWidth = viewportWidth; - - // Calculate the number of minutes that one pixel represents along the longitude - calculateMinutesPerPixel(DEFAULT_MAP_WIDTH_LONGITUDE); - - // Calculate the viewport height based on its width and the number of degrees (85) - // in our map - viewportHeight = ((int) NavCalculator.computeDMPClarkeSpheroid(0, 85) / (int) minutesPerPixel) * 2; -// viewportHeight = viewportWidth; // REMOVE!!! - // Determine the map's x,y centre - xCentre = viewportWidth / 2; - yCentre = viewportHeight / 2; - } - - /** - * Returns the height of the viewport in pixels - * @return the height of the viewport in pixels - * @since 0.1 - */ - public int getViewportPixelHeight() { - return viewportHeight; - } - - /** - * Calculates the number of minutes per pixels using a given - * map width in longitude - * @param mapWidthInLongitude - * @since 1.0 - */ - public void calculateMinutesPerPixel(double mapWidthInLongitude) { - minutesPerPixel = (mapWidthInLongitude * 60) / (double) viewportWidth; - } - - /** - * Returns the width of the viewport in pixels - * @return the width of the viewport in pixels - * @since 0.1 - */ - public int getViewportPixelWidth() { - return viewportWidth; - } - - public void setViewportWidth(int viewportWidth) { - this.viewportWidth = viewportWidth; - } - - public void setViewportHeight(int viewportHeight) { - this.viewportHeight = viewportHeight; - } - - public void setCentre(Position centre) { - this.centre = centre; - } - - /** - * Returns the number of minutes there are per pixel - * @return the number of minutes per pixel - * @since 1.0 - */ - public double getMinutesPerPixel() { - return minutesPerPixel; - } - - public double getMetersPerPixel() { - return 1853 * minutesPerPixel; - } - - public void setMinutesPerPixel(double minutesPerPixel) { - this.minutesPerPixel = minutesPerPixel; - } - - /** - * Converts a latitude/longitude position into a pixel co-ordinate - * @param position the position to convert - * @return {@code Point} a pixel co-ordinate - * @since 1.0 - */ - public Point toPixel(Position position) { - // Get the distance between position and the centre for calculating - // the position's longitude translation - double distance = NavCalculator.computeLongDiff(centre.getLongitude(), - position.getLongitude()); - - // Use the distance from the centre to calculate the pixel x co-ordinate - double distanceInPixels = (distance / minutesPerPixel); - - // Use the difference in meridional parts to calculate the pixel y co-ordinate - double dmp = NavCalculator.computeDMPClarkeSpheroid(centre.getLatitude(), - position.getLatitude()); - - int x = 0; - int y = 0; - - if (centre.getLatitude() == position.getLatitude()) { - y = yCentre; - } - if (centre.getLongitude() == position.getLongitude()) { - x = xCentre; - } - - // Distinguish between northern and southern hemisphere for latitude calculations - if (centre.getLatitude() > 0 && position.getLatitude() > centre.getLatitude()) { - // Centre is north. Position is north of centre - y = yCentre + (int) ((dmp) / minutesPerPixel); - } else if (centre.getLatitude() > 0 && position.getLatitude() < centre.getLatitude()) { - // Centre is north. Position is south of centre - y = yCentre - (int) ((dmp) / minutesPerPixel); - } else if (centre.getLatitude() < 0 && position.getLatitude() > centre.getLatitude()) { - // Centre is south. Position is north of centre - y = yCentre + (int) ((dmp) / minutesPerPixel); - } else if (centre.getLatitude() < 0 && position.getLatitude() < centre.getLatitude()) { - // Centre is south. Position is south of centre - y = yCentre - (int) ((dmp) / minutesPerPixel); - } else if (centre.getLatitude() == 0 && position.getLatitude() > centre.getLatitude()) { - // Centre is at the equator. Position is north of the equator - y = yCentre + (int) ((dmp) / minutesPerPixel); - } else if (centre.getLatitude() == 0 && position.getLatitude() < centre.getLatitude()) { - // Centre is at the equator. Position is south of the equator - y = yCentre - (int) ((dmp) / minutesPerPixel); - } - - // Distinguish between western and eastern hemisphere for longitude calculations - if (centre.getLongitude() < 0 && position.getLongitude() < centre.getLongitude()) { - // Centre is west. Position is west of centre - x = xCentre - (int) distanceInPixels; - } else if (centre.getLongitude() < 0 && position.getLongitude() > centre.getLongitude()) { - // Centre is west. Position is south of centre - x = xCentre + (int) distanceInPixels; - } else if (centre.getLongitude() > 0 && position.getLongitude() < centre.getLongitude()) { - // Centre is east. Position is west of centre - x = xCentre - (int) distanceInPixels; - } else if (centre.getLongitude() > 0 && position.getLongitude() > centre.getLongitude()) { - // Centre is east. Position is east of centre - x = xCentre + (int) distanceInPixels; - } else if (centre.getLongitude() == 0 && position.getLongitude() > centre.getLongitude()) { - // Centre is at the equator. Position is east of centre - x = xCentre + (int) distanceInPixels; - } else if (centre.getLongitude() == 0 && position.getLongitude() < centre.getLongitude()) { - // Centre is at the equator. Position is west of centre - x = xCentre - (int) distanceInPixels; - } - - // Distinguish between northern and souterhn hemisphere for longitude calculations - return new Point(x, y); - } - - /** - * Converts a pixel position into a mercator position - * @param p {@Point} object that you wish to convert into - * longitude / latiude - * @return the converted {@code Position} object - * @since 1.0 - */ - public Position toPosition(Point p) { - double lat, lon; - Position pos = null; - try { - Point pixelCentre = toPixel(new Position(0, 0)); - - // Get the distance between position and the centre - double xDistance = distance(xCentre, p.getX()); - double yDistance = distance(pixelCentre.getY(), p.getY()); - double lonDistanceInDegrees = (xDistance * minutesPerPixel) / 60; - double mp = (yDistance * minutesPerPixel); - // If we are zoomed in past a certain point, then use linear search. - // Otherwise use binary search - if (getMinutesPerPixel() < 0.05) { - lat = findLat(mp, getCentre().getLatitude()); - if (lat == -1000) { - System.out.println("lat: " + lat); - } - } else { - lat = findLat(mp, 0.0, 85.0); - } - lon = (p.getX() < xCentre ? centre.getLongitude() - lonDistanceInDegrees - : centre.getLongitude() + lonDistanceInDegrees); - - if (p.getY() > pixelCentre.getY()) { - lat = -1 * lat; - } - if (lat == -1000 || lon == -1000) { - return pos; - } - pos = new Position(lat, lon); - } catch (InvalidPositionException ipe) { - ipe.printStackTrace(); - } - return pos; - } - - /** - * Calculates distance between two points on the map in pixels - * @param a - * @param b - * @return distance the distance between a and b in pixels - * @since 1.0 - */ - private double distance(double a, double b) { - return Math.abs(a - b); - } - - /** - * Defines the centre of the map in pixels - * @param p Point object denoting the map's new centre - * @since 1.0 - */ - public void setCentre(Point p) { - try { - Position newCentre = toPosition(p); - if (newCentre != null) { - centre = newCentre; - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * Sets the map's xCentre - * @param xCentre - * @since 1.0 - */ - public void setXCentre(int xCentre) { - this.xCentre = xCentre; - } - - /** - * Sets the map's yCentre - * @param yCentre - * @since 1.0 - */ - public void setYCentre(int yCentre) { - this.yCentre = yCentre; - } - - /** - * Returns the pixel (x,y) centre of the map - * @return {@code Point) object marking the map's (x,y) centre - * @since 1.0 - */ - public Point getPixelCentre() { - return new Point(xCentre, yCentre); - } - - /** - * Returns the {@code Position} centre of the map - * @return {@code Position} object marking the map's (lat, long) centre - * @since 1.0 - */ - public Position getCentre() { - return centre; - } - - /** - * Uses binary search to find the latitude of a given MP. - * - * @param mp maridian part - * @param low - * @param high - * @return the latitude of the MP value - * @since 1.0 - */ - private double findLat(double mp, double low, double high) { - DecimalFormat form = new DecimalFormat("#.####"); - mp = Math.round(mp); - double midLat = (low + high) / 2.0; - // ctr is used to make sure that with some - // numbers which can't be represented exactly don't inifitely repeat - double guessMP = NavCalculator.computeDMPClarkeSpheroid(0, (float) midLat); - - while (low <= high) { - if (guessMP == mp) { - return midLat; - } else { - if (guessMP > mp) { - high = midLat - 0.0001; - } else { - low = midLat + 0.0001; - } - } - - midLat = Double.valueOf(form.format(((low + high) / 2.0))); - guessMP = NavCalculator.computeDMPClarkeSpheroid(0, (float) midLat); - guessMP = Math.round(guessMP); - } - return -1000; - } - - /** - * Uses linear search to find the latitude of a given MP - * @param mp the meridian part for which to find the latitude - * @param previousLat the previous latitude. Used as a upper / lower bound - * @return the latitude of the MP value - */ - private double findLat(double mp, double previousLat) { - DecimalFormat form = new DecimalFormat("#.#####"); - mp = Double.parseDouble(form.format(mp)); - double guessMP; - for (double lat = previousLat - 0.25; lat < previousLat + 1; lat += 0.00001) { - guessMP = NavCalculator.computeDMPClarkeSpheroid(0, lat); - guessMP = Double.parseDouble(form.format(guessMP)); - if (guessMP == mp || Math.abs(guessMP - mp) < 0.001) { - return lat; - } - } - return -1000; - } -} diff --git a/engine/src/tools/jme3tools/navigation/MapModel3D.java b/engine/src/tools/jme3tools/navigation/MapModel3D.java deleted file mode 100644 index de20cb6b9..000000000 --- a/engine/src/tools/jme3tools/navigation/MapModel3D.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.navigation; - -import com.jme3.math.Vector3f; -import jme3tools.navigation.Position; -import jme3tools.navigation.InvalidPositionException; -import java.awt.Point; -import java.text.DecimalFormat; -import jme3tools.navigation.NavCalculator; - - -/** - * A representation of the actual map in terms of lat/long and x,y,z co-ordinates. - * The Map class contains various helper methods such as methods for determining - * the world unit positions for lat/long coordinates and vice versa. This map projection - * does not handle screen/pixel coordinates. - * - * @author Benjamin Jakobus (thanks to Cormac Gebruers) - * @version 1.0 - * @since 1.0 - */ -public class MapModel3D { - - /* The number of radians per degree */ - private final static double RADIANS_PER_DEGREE = 57.2957; - - /* The number of degrees per radian */ - private final static double DEGREES_PER_RADIAN = 0.0174532925; - - /* The map's width in longitude */ - public final static int DEFAULT_MAP_WIDTH_LONGITUDE = 360; - - /* The top right hand corner of the map */ - private Position centre; - - /* The x and y co-ordinates for the viewport's centre */ - private int xCentre; - private int zCentre; - - /* The width (in world units (wu)) of the viewport holding the map */ - private int worldWidth; - - /* The viewport height in pixels */ - private int worldHeight; - - /* The number of minutes that one pixel represents */ - private double minutesPerWorldUnit; - - /** - * Constructor. - * - * @param viewportWidth The world unit width the map's area - * @since 1.0 - */ - public MapModel3D(int worldWidth) { - try { - this.centre = new Position(0, 0); - } catch (InvalidPositionException e) { - e.printStackTrace(); - } - - this.worldWidth = worldWidth; - - // Calculate the number of minutes that one pixel represents along the longitude - calculateMinutesPerWorldUnit(DEFAULT_MAP_WIDTH_LONGITUDE); - - // Calculate the viewport height based on its width and the number of degrees (85) - // in our map - worldHeight = ((int) NavCalculator.computeDMPClarkeSpheroid(0, 85) / (int) minutesPerWorldUnit) * 2; - - // Determine the map's x,y centre - xCentre = 0; - zCentre = 0; -// xCentre = worldWidth / 2; -// zCentre = worldHeight / 2; - } - - /** - * Returns the height of the viewport in pixels. - * - * @return The height of the viewport in pixels. - * @since 1.0 - */ - public int getWorldHeight() { - return worldHeight; - } - - /** - * Calculates the number of minutes per pixels using a given - * map width in longitude. - * - * @param mapWidthInLongitude The map's with in degrees of longitude. - * @since 1.0 - */ - public void calculateMinutesPerWorldUnit(double mapWidthInLongitude) { - // Multiply mapWidthInLongitude by 60 to convert it to minutes. - minutesPerWorldUnit = (mapWidthInLongitude * 60) / (double) worldWidth; - } - - /** - * Returns the width of the viewport in pixels. - * - * @return The width of the viewport in pixels. - * @since 1.0 - */ - public int getWorldWidth() { - return worldWidth; - } - - /** - * Sets the world's desired width. - * - * @param viewportWidth The world's desired width in WU. - * @since 1.0 - */ - public void setWorldWidth(int viewportWidth) { - this.worldWidth = viewportWidth; - } - - /** - * Sets the world's desired height. - * - * @param viewportHeight The world's desired height in WU. - * @since 1.0 - */ - public void setWorldHeight(int viewportHeight) { - this.worldHeight = viewportHeight; - } - - /** - * Sets the map's centre. - * - * @param centre The Position denoting the map's - * desired centre. - * @since 1.0 - */ - public void setCentre(Position centre) { - this.centre = centre; - } - - /** - * Returns the number of minutes there are per WU. - * - * @return The number of minutes per WU. - * @since 1.0 - */ - public double getMinutesPerWu() { - return minutesPerWorldUnit; - } - - /** - * Returns the meters per WU. - * - * @return The meters per WU. - * @since 1.0 - */ - public double getMetersPerWu() { - return 1853 * minutesPerWorldUnit; - } - - /** - * Converts a latitude/longitude position into a WU coordinate. - * - * @param position The Position to convert. - * @return The Point a pixel coordinate. - * @since 1.0 - */ - public Vector3f toWorldUnit(Position position) { - // Get the difference between position and the centre for calculating - // the position's longitude translation - double distance = NavCalculator.computeLongDiff(centre.getLongitude(), - position.getLongitude()); - - // Use the difference from the centre to calculate the pixel x co-ordinate - double distanceInPixels = (distance / minutesPerWorldUnit); - - // Use the difference in meridional parts to calculate the pixel y co-ordinate - double dmp = NavCalculator.computeDMPClarkeSpheroid(centre.getLatitude(), - position.getLatitude()); - - int x = 0; - int z = 0; - - if (centre.getLatitude() == position.getLatitude()) { - z = zCentre; - } - if (centre.getLongitude() == position.getLongitude()) { - x = xCentre; - } - - // Distinguish between northern and southern hemisphere for latitude calculations - if (centre.getLatitude() > 0 && position.getLatitude() > centre.getLatitude()) { - // Centre is north. Position is north of centre - z = zCentre - (int) ((dmp) / minutesPerWorldUnit); - } else if (centre.getLatitude() > 0 && position.getLatitude() < centre.getLatitude()) { - // Centre is north. Position is south of centre - z = zCentre + (int) ((dmp) / minutesPerWorldUnit); - } else if (centre.getLatitude() < 0 && position.getLatitude() > centre.getLatitude()) { - // Centre is south. Position is north of centre - z = zCentre - (int) ((dmp) / minutesPerWorldUnit); - } else if (centre.getLatitude() < 0 && position.getLatitude() < centre.getLatitude()) { - // Centre is south. Position is south of centre - z = zCentre + (int) ((dmp) / minutesPerWorldUnit); - } else if (centre.getLatitude() == 0 && position.getLatitude() > centre.getLatitude()) { - // Centre is at the equator. Position is north of the equator - z = zCentre - (int) ((dmp) / minutesPerWorldUnit); - } else if (centre.getLatitude() == 0 && position.getLatitude() < centre.getLatitude()) { - // Centre is at the equator. Position is south of the equator - z = zCentre + (int) ((dmp) / minutesPerWorldUnit); - } - - // Distinguish between western and eastern hemisphere for longitude calculations - if (centre.getLongitude() < 0 && position.getLongitude() < centre.getLongitude()) { - // Centre is west. Position is west of centre - x = xCentre - (int) distanceInPixels; - } else if (centre.getLongitude() < 0 && position.getLongitude() > centre.getLongitude()) { - // Centre is west. Position is south of centre - x = xCentre + (int) distanceInPixels; - } else if (centre.getLongitude() > 0 && position.getLongitude() < centre.getLongitude()) { - // Centre is east. Position is west of centre - x = xCentre - (int) distanceInPixels; - } else if (centre.getLongitude() > 0 && position.getLongitude() > centre.getLongitude()) { - // Centre is east. Position is east of centre - x = xCentre + (int) distanceInPixels; - } else if (centre.getLongitude() == 0 && position.getLongitude() > centre.getLongitude()) { - // Centre is at the equator. Position is east of centre - x = xCentre + (int) distanceInPixels; - } else if (centre.getLongitude() == 0 && position.getLongitude() < centre.getLongitude()) { - // Centre is at the equator. Position is west of centre - x = xCentre - (int) distanceInPixels; - } - - // Distinguish between northern and southern hemisphere for longitude calculations - return new Vector3f(x, 0, z); - } - - /** - * Converts a world position into a Mercator position. - * - * @param p Vector containing the world unit - * coordinates that are to be converted into - * longitude / latitude coordinates. - * @return The resulting Position in degrees of - * latitude and longitude. - * @since 1.0 - */ - public Position toPosition(Vector3f posVec) { - double lat, lon; - Position pos = null; - try { - Vector3f worldCentre = toWorldUnit(new Position(0, 0)); - - // Get the difference between position and the centre - double xDistance = difference(xCentre, posVec.getX()); - double yDistance = difference(worldCentre.getZ(), posVec.getZ()); - double lonDistanceInDegrees = (xDistance * minutesPerWorldUnit) / 60; - double mp = (yDistance * minutesPerWorldUnit); - // If we are zoomed in past a certain point, then use linear search. - // Otherwise use binary search - if (getMinutesPerWu() < 0.05) { - lat = findLat(mp, getCentre().getLatitude()); - if (lat == -1000) { - System.out.println("lat: " + lat); - } - } else { - lat = findLat(mp, 0.0, 85.0); - } - lon = (posVec.getX() < xCentre ? centre.getLongitude() - lonDistanceInDegrees - : centre.getLongitude() + lonDistanceInDegrees); - - if (posVec.getZ() > worldCentre.getZ()) { - lat = -1 * lat; - } - if (lat == -1000 || lon == -1000) { - return pos; - } - pos = new Position(lat, lon); - } catch (InvalidPositionException ipe) { - ipe.printStackTrace(); - } - return pos; - } - - /** - * Calculates difference between two points on the map in WU. - * - * @param a - * @param b - * @return difference The difference between a and b in WU. - * @since 1.0 - */ - private double difference(double a, double b) { - return Math.abs(a - b); - } - - /** - * Defines the centre of the map in pixels. - * - * @param p Vector3f object denoting the map's new centre. - * @since 1.0 - */ - public void setCentre(Vector3f posVec) { - try { - Position newCentre = toPosition(posVec); - if (newCentre != null) { - centre = newCentre; - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * Returns the WU (x,y,z) centre of the map. - * - * @return Vector3f object marking the map's (x,y) centre. - * @since 1.0 - */ - public Vector3f getCentreWu() { - return new Vector3f(xCentre, 0, zCentre); - } - - /** - * Returns the Position centre of the map. - * - * @return Position object marking the map's (lat, long) - * centre. - * @since 1.0 - */ - public Position getCentre() { - return centre; - } - - /** - * Uses binary search to find the latitude of a given MP. - * - * @param mp Maridian part whose latitude to determine. - * @param low Minimum latitude bounds. - * @param high Maximum latitude bounds. - * @return The latitude of the MP value - * @since 1.0 - */ - private double findLat(double mp, double low, double high) { - DecimalFormat form = new DecimalFormat("#.####"); - mp = Math.round(mp); - double midLat = (low + high) / 2.0; - // ctr is used to make sure that with some - // numbers which can't be represented exactly don't inifitely repeat - double guessMP = NavCalculator.computeDMPClarkeSpheroid(0, (float) midLat); - - while (low <= high) { - if (guessMP == mp) { - return midLat; - } else { - if (guessMP > mp) { - high = midLat - 0.0001; - } else { - low = midLat + 0.0001; - } - } - - midLat = Double.valueOf(form.format(((low + high) / 2.0))); - guessMP = NavCalculator.computeDMPClarkeSpheroid(0, (float) midLat); - guessMP = Math.round(guessMP); - } - return -1000; - } - - /** - * Uses linear search to find the latitude of a given MP. - * - * @param mp The meridian part for which to find the latitude. - * @param previousLat The previous latitude. Used as a upper / lower bound. - * @return The latitude of the MP value. - * @since 1.0 - */ - private double findLat(double mp, double previousLat) { - DecimalFormat form = new DecimalFormat("#.#####"); - mp = Double.parseDouble(form.format(mp)); - double guessMP; - for (double lat = previousLat - 0.25; lat < previousLat + 1; lat += 0.00001) { - guessMP = NavCalculator.computeDMPClarkeSpheroid(0, lat); - guessMP = Double.parseDouble(form.format(guessMP)); - if (guessMP == mp || Math.abs(guessMP - mp) < 0.05) { - return lat; - } - } - return -1000; - } -} diff --git a/engine/src/tools/jme3tools/navigation/NavCalculator.java b/engine/src/tools/jme3tools/navigation/NavCalculator.java deleted file mode 100644 index 8e345036f..000000000 --- a/engine/src/tools/jme3tools/navigation/NavCalculator.java +++ /dev/null @@ -1,594 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.navigation; - -import jme3tools.navigation.InvalidPositionException; -import jme3tools.navigation.Position; - - - -/** - * A utlity class for performing position calculations - * - * @author Benjamin Jakobus, based on JMarine (by Cormac Gebruers and Benjamin - * Jakobus) - * @version 1.0 - * @since 1.0 - */ -public class NavCalculator { - - private double distance; - private double trueCourse; - - /* The earth's radius in meters */ - public static final int WGS84_EARTH_RADIUS = 6378137; - private String strCourse; - - /* The sailing calculation type */ - public static final int MERCATOR = 0; - public static final int GC = 1; - - /* The degree precision to use for courses */ - public static final int RL_CRS_PRECISION = 1; - - /* The distance precision to use for distances */ - public static final int RL_DIST_PRECISION = 1; - public static final int METERS_PER_MINUTE = 1852; - - /** - * Constructor - * @param P1 - * @param P2 - * @param calcType - * @since 1.0 - */ - public NavCalculator(Position P1, Position P2, int calcType) { - switch (calcType) { - case MERCATOR: - mercatorSailing(P1, P2); - break; - case GC: - greatCircleSailing(P1, P2); - break; - } - } - - /** - * Constructor - * @since 1.0 - */ - public NavCalculator() { - } - - /** - * Determines a great circle track between two positions - * @param p1 origin position - * @param p2 destination position - */ - public GCSailing greatCircleSailing(Position p1, Position p2) { - return new GCSailing(new int[0], new float[0]); - } - - /** - * Determines a Rhumb Line course and distance between two points - * @param p1 origin position - * @param p2 destination position - */ - public RLSailing rhumbLineSailing(Position p1, Position p2) { - RLSailing rl = mercatorSailing(p1, p2); - return rl; - } - - /** - * Determines the rhumb line course and distance between two positions - * @param p1 origin position - * @param p2 destination position - */ - public RLSailing mercatorSailing(Position p1, Position p2) { - - double dLat = computeDLat(p1.getLatitude(), p2.getLatitude()); - //plane sailing... - if (dLat == 0) { - RLSailing rl = planeSailing(p1, p2); - return rl; - } - - double dLong = computeDLong(p1.getLongitude(), p2.getLongitude()); - double dmp = (float) computeDMPClarkeSpheroid(p1.getLatitude(), p2.getLatitude()); - - trueCourse = (float) Math.toDegrees(Math.atan(dLong / dmp)); - double degCrs = convertCourse((float) trueCourse, p1, p2); - distance = (float) Math.abs(dLat / Math.cos(Math.toRadians(trueCourse))); - - RLSailing rl = new RLSailing(degCrs, (float) distance); - trueCourse = rl.getCourse(); - strCourse = (dLat < 0 ? "S" : "N"); - strCourse += " " + trueCourse; - strCourse += " " + (dLong < 0 ? "W" : "E"); - return rl; - - } - - /** - * Calculate a plane sailing situation - i.e. where Lats are the same - * @param p1 - * @param p2 - * @return - * @since 1.0 - */ - public RLSailing planeSailing(Position p1, Position p2) { - double dLong = computeDLong(p1.getLongitude(), p2.getLongitude()); - - double sgnDLong = 0 - (dLong / Math.abs(dLong)); - if (Math.abs(dLong) > 180 * 60) { - dLong = (360 * 60 - Math.abs(dLong)) * sgnDLong; - } - - double redist = 0; - double recourse = 0; - if (p1.getLatitude() == 0) { - redist = Math.abs(dLong); - } else { - redist = Math.abs(dLong * (float) Math.cos(p1.getLatitude() * 2 * Math.PI / 360)); - } - recourse = (float) Math.asin(0 - sgnDLong); - recourse = recourse * 360 / 2 / (float) Math.PI; - - if (recourse < 0) { - recourse = recourse + 360; - } - return new RLSailing(recourse, redist); - } - - /** - * Converts a course from cardinal XddY to ddd notation - * @param tc - * @param dLong - * @param dLat - * @return - * @since 1.0 - */ - public static double convertCourse(float tc, Position p1, Position p2) { - - double dLat = p1.getLatitude() - p2.getLatitude(); - double dLong = p1.getLongitude() - p2.getLongitude(); - //NE - if (dLong >= 0 & dLat >= 0) { - return Math.abs(tc); - } - - //SE - if (dLong >= 0 & dLat < 0) { - return 180 - Math.abs(tc); - } - - //SW - if (dLong < 0 & dLat < 0) { - return 180 + Math.abs(tc); - } - - //NW - if (dLong < 0 & dLat >= 0) { - return 360 - Math.abs(tc); - } - return -1; - } - - /** - * Getter method for the distance between two points - * @return distance - * @since 1.0 - */ - public double getDistance() { - return distance; - } - - /** - * Getter method for the true course - * @return true course - * @since 1.0 - */ - public double getTrueCourse() { - return trueCourse; - } - - /** - * Getter method for the true course - * @return true course - * @since 1.0 - */ - public String getStrCourse() { - return strCourse; - } - - /** - * Computes the difference in meridional parts for two latitudes in minutes - * (based on Clark 1880 spheroid) - * @param lat1 - * @param lat2 - * @return difference in minutes - * @since 1.0 - */ - public static double computeDMPClarkeSpheroid(double lat1, double lat2) { - double absLat1 = Math.abs(lat1); - double absLat2 = Math.abs(lat2); - - double m1 = (7915.704468 * (Math.log(Math.tan(Math.toRadians(45 - + (absLat1 / 2)))) / Math.log(10)) - - 23.268932 * Math.sin(Math.toRadians(absLat1)) - - 0.052500 * Math.pow(Math.sin(Math.toRadians(absLat1)), 3) - - 0.000213 * Math.pow(Math.sin(Math.toRadians(absLat1)), 5)); - - double m2 = (7915.704468 * (Math.log(Math.tan(Math.toRadians(45 - + (absLat2 / 2)))) / Math.log(10)) - - 23.268932 * Math.sin(Math.toRadians(absLat2)) - - 0.052500 * Math.pow(Math.sin(Math.toRadians(absLat2)), 3) - - 0.000213 * Math.pow(Math.sin(Math.toRadians(absLat2)), 5)); - if ((lat1 <= 0 && lat2 <= 0) || (lat1 > 0 && lat2 > 0)) { - return Math.abs(m1 - m2); - } else { - return m1 + m2; - } - } - - /** - * Computes the difference in meridional parts for a perfect sphere between - * two degrees of latitude - * @param lat1 - * @param lat2 - * @return difference in meridional parts between lat1 and lat2 in minutes - * @since 1.0 - */ - public static float computeDMPWGS84Spheroid(float lat1, float lat2) { - float absLat1 = Math.abs(lat1); - float absLat2 = Math.abs(lat2); - - float m1 = (float) (7915.7045 * Math.log10(Math.tan(Math.toRadians(45 + (absLat1 / 2)))) - - 23.01358 * Math.sin(absLat1 - 0.05135) * Math.pow(Math.sin(absLat1), 3)); - - float m2 = (float) (7915.7045 * Math.log10(Math.tan(Math.toRadians(45 + (absLat2 / 2)))) - - 23.01358 * Math.sin(absLat2 - 0.05135) * Math.pow(Math.sin(absLat2), 3)); - - if (lat1 <= 0 & lat2 <= 0 || lat1 > 0 & lat2 > 0) { - return Math.abs(m1 - m2); - } else { - return m1 + m2; - } - } - - /** - * Predicts the position of a target for a given time in the future - * @param time the number of seconds from now for which to predict the future - * position - * @param speed the miles per minute that the target is traveling - * @param currentLat the target's current latitude - * @param currentLong the target's current longitude - * @param course the target's current course in degrees - * @return the predicted future position - * @since 1.0 - */ - public static Position predictPosition(int time, double speed, - double currentLat, double currentLong, double course) { - Position futurePosition = null; - course = Math.toRadians(course); - double futureLong = currentLong + speed * time * Math.sin(course); - double futureLat = currentLat + speed * time * Math.cos(course); - try { - futurePosition = new Position(futureLat, futureLong); - } catch (InvalidPositionException ipe) { - ipe.printStackTrace(); - } - return futurePosition; - - } - - /** - * Computes the coordinate of position B relative to an offset given - * a distance and an angle. - * - * @param offset The offset position. - * @param bearing The bearing between the offset and the coordinate - * that you want to calculate. - * @param distance The distance, in meters, between the offset - * and point B. - * @return The position of point B that is located from - * given offset at given distance and angle. - * @since 1.0 - */ - public static Position computePosition(Position initialPos, double heading, - double distance) { - if (initialPos == null) { - return null; - } - double angle; - if (heading < 90) { - angle = heading; - } else if (heading > 90 && heading < 180) { - angle = 180 - heading; - } else if (heading > 180 && heading < 270) { - angle = heading - 180; - } else { - angle = 360 - heading; - } - - Position newPosition = null; - - // Convert meters into nautical miles - distance = distance * 0.000539956803; - angle = Math.toRadians(angle); - double initialLat = initialPos.getLatitude(); - double initialLong = initialPos.getLongitude(); - double dlat = distance * Math.cos(angle); - dlat = dlat / 60; - dlat = Math.abs(dlat); - double newLat = 0; - if ((heading > 270 && heading < 360) || (heading > 0 && heading < 90)) { - newLat = initialLat + dlat; - } else if (heading < 270 && heading > 90) { - newLat = initialLat - dlat; - } - double meanLat = (Math.abs(dlat) / 2.0) + newLat; - double dep = (Math.abs(dlat * 60)) * Math.tan(angle); - double dlong = dep * (1.0 / Math.cos(Math.toRadians(meanLat))); - dlong = dlong / 60; - dlong = Math.abs(dlong); - double newLong; - if (heading > 180 && heading < 360) { - newLong = initialLong - dlong; - } else { - newLong = initialLong + dlong; - } - - if (newLong < -180) { - double diff = Math.abs(newLong + 180); - newLong = 180 - diff; - } - - if (newLong > 180) { - double diff = Math.abs(newLong + 180); - newLong = (180 - diff) * -1; - } - - if (heading == 0 || heading == 360 || heading == 180) { - newLong = initialLong; - newLat = initialLat + dlat; - } else if (heading == 90 || heading == 270) { - newLat = initialLat; -// newLong = initialLong + dlong; THIS WAS THE ORIGINAL (IT WORKED) - newLong = initialLong - dlong; - } - try { - newPosition = new Position(newLat, - newLong); - } catch (InvalidPositionException ipe) { - ipe.printStackTrace(); - System.out.println(newLat + "," + newLong); - } - return newPosition; - } - - /** - * Computes the difference in Longitude between two positions and assigns the - * correct sign -westwards travel, + eastwards travel - * @param lng1 - * @param lng2 - * @return difference in longitude - * @since 1.0 - */ - public static double computeDLong(double lng1, double lng2) { - if (lng1 - lng2 == 0) { - return 0; - } - - // both easterly - if (lng1 >= 0 & lng2 >= 0) { - return -(lng1 - lng2) * 60; - } - //both westerly - if (lng1 < 0 & lng2 < 0) { - return -(lng1 - lng2) * 60; - } - - //opposite sides of Date line meridian - - //sum less than 180 - if (Math.abs(lng1) + Math.abs(lng2) < 180) { - if (lng1 < 0 & lng2 > 0) { - return -(Math.abs(lng1) + Math.abs(lng2)) * 60; - } else { - return Math.abs(lng1) + Math.abs(lng2) * 60; - } - } else { - //sum greater than 180 - if (lng1 < 0 & lng2 > 0) { - return -(360 - (Math.abs(lng1) + Math.abs(lng2))) * 60; - } else { - return (360 - (Math.abs(lng1) + Math.abs(lng2))) * 60; - } - } - } - - /** - * Computes the difference in Longitude between two positions and assigns the - * correct sign -westwards travel, + eastwards travel - * @param lng1 - * @param lng2 - * @return difference in longitude - * @since 1.0 - */ - public static double computeLongDiff(double lng1, double lng2) { - if (lng1 - lng2 == 0) { - return 0; - } - - // both easterly - if (lng1 >= 0 & lng2 >= 0) { - return Math.abs(-(lng1 - lng2) * 60); - } - //both westerly - if (lng1 < 0 & lng2 < 0) { - return Math.abs(-(lng1 - lng2) * 60); - } - - if (lng1 == 0) { - return Math.abs(lng2 * 60); - } - - if (lng2 == 0) { - return Math.abs(lng1 * 60); - } - - return (Math.abs(lng1) + Math.abs(lng2)) * 60; - } - - /** - * Compute the difference in latitude between two positions - * @param lat1 - * @param lat2 - * @return difference in latitude - * @since 1.0 - */ - public static double computeDLat(double lat1, double lat2) { - //same side of equator - - //plane sailing - if (lat1 - lat2 == 0) { - return 0; - } - - //both northerly - if (lat1 >= 0 & lat2 >= 0) { - return -(lat1 - lat2) * 60; - } - //both southerly - if (lat1 < 0 & lat2 < 0) { - return -(lat1 - lat2) * 60; - } - - //opposite sides of equator - if (lat1 >= 0) { - //heading south - return -(Math.abs(lat1) + Math.abs(lat2)); - } else { - //heading north - return (Math.abs(lat1) + Math.abs(lat2)); - } - } - - public static class Quadrant { - - private static final Quadrant FIRST = new Quadrant(1, 1); - private static final Quadrant SECOND = new Quadrant(-1, 1); - private static final Quadrant THIRD = new Quadrant(-1, -1); - private static final Quadrant FOURTH = new Quadrant(1, -1); - private final int lonMultiplier; - private final int latMultiplier; - - public Quadrant(final int xMultiplier, final int yMultiplier) { - this.lonMultiplier = xMultiplier; - this.latMultiplier = yMultiplier; - } - - static Quadrant getQuadrant(double degrees, boolean invert) { - if (invert) { - if (degrees >= 0 && degrees <= 90) { - return FOURTH; - } else if (degrees > 90 && degrees <= 180) { - return THIRD; - } else if (degrees > 180 && degrees <= 270) { - return SECOND; - } - return FIRST; - } else { - if (degrees >= 0 && degrees <= 90) { - return FIRST; - } else if (degrees > 90 && degrees <= 180) { - return SECOND; - } else if (degrees > 180 && degrees <= 270) { - return THIRD; - } - return FOURTH; - } - } - } - - /** - * Converts meters to degrees. - * - * @param meters The meters that you want to convert into degrees. - * @return The degree equivalent of the given meters. - * @since 1.0 - */ - public static double toDegrees(double meters) { - return (meters / METERS_PER_MINUTE) / 60; - } - - /** - * Computes the bearing between two points. - * - * @param p1 - * @param p2 - * @return - * @since 1.0 - */ - public static int computeBearing(Position p1, Position p2) { - int bearing; - double dLon = computeDLong(p1.getLongitude(), p2.getLongitude()); - double y = Math.sin(dLon) * Math.cos(p2.getLatitude()); - double x = Math.cos(p1.getLatitude()) * Math.sin(p2.getLatitude()) - - Math.sin(p1.getLatitude()) * Math.cos(p2.getLatitude()) * Math.cos(dLon); - bearing = (int) Math.toDegrees(Math.atan2(y, x)); - return bearing; - } - - /** - * Computes the angle between two points. - * - * @param p1 - * @param p2 - * @return - */ - public static int computeAngle(Position p1, Position p2) { - // cos (adj / hyp) - double adj = Math.abs(p1.getLongitude() - p2.getLongitude()); - double opp = Math.abs(p1.getLatitude() - p2.getLatitude()); - return (int) Math.toDegrees(Math.atan(opp / adj)); - -// int angle = (int)Math.atan2(p2.getLatitude() - p1.getLatitude(), -// p2.getLongitude() - p1.getLongitude()); - //Actually it's ATan2(dy , dx) where dy = y2 - y1 and dx = x2 - x1, or ATan(dy / dx) - } - - public static int computeHeading(Position p1, Position p2) { - int angle = computeAngle(p1, p2); - // NE - if (p2.getLongitude() >= p1.getLongitude() && p2.getLatitude() >= p1.getLatitude()) { - return angle; - } else if (p2.getLongitude() >= p1.getLongitude() && p2.getLatitude() <= p1.getLatitude()) { - // SE - return 90 + angle; - } else if (p2.getLongitude() <= p1.getLongitude() && p2.getLatitude() <= p1.getLatitude()) { - // SW - return 270 - angle; - } else { - // NW - return 270 + angle; - } - } - - public static void main(String[] args) { - try { - int pos = NavCalculator.computeHeading(new Position(0, 0), new Position(10, -10)); -// System.out.println(pos.getLatitude() + "," + pos.getLongitude()); - System.out.println(pos); - } catch (Exception e) { - } - - - - - - } -} diff --git a/engine/src/tools/jme3tools/navigation/NumUtil.java b/engine/src/tools/jme3tools/navigation/NumUtil.java deleted file mode 100644 index 086fff249..000000000 --- a/engine/src/tools/jme3tools/navigation/NumUtil.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.navigation; - -/** - * Provides various helper methods for number conversions (such as degree to radian - * conversion, decimal degree to radians etc) - * @author Benjamin Jakobus, based on JMarine (by Cormac Gebruers and Benjamin - * Jakobus) - * @version 1.0 - * @since 1.0 - */ -public class NumUtil { - - /** - * Rounds a number - * @param Rval number to be rounded - * @param Rpl number of decimal places - * @return rounded number - * @since 0.1 - */ - public float Round(float Rval, int Rpl) { - float p = (float) Math.pow(10, Rpl); - Rval = Rval * p; - float tmp = Math.round(Rval); - return (float) tmp / p; - } -} diff --git a/engine/src/tools/jme3tools/navigation/Position.java b/engine/src/tools/jme3tools/navigation/Position.java deleted file mode 100644 index b26e4bca1..000000000 --- a/engine/src/tools/jme3tools/navigation/Position.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.navigation; - -import jme3tools.navigation.InvalidPositionException; - -/** - * This class represents the position of an entity in the world. - * - * @author Benjamin Jakobus (based on JMarine by Cormac Gebruers and Benjamin Jakobus) - * @version 1.0 - * @since 1.0 - */ -public class Position { - - /* the latitude (+ N/E) */ - private Coordinate lat; - - /* the longitude (-W/S) */ - private Coordinate lng; - - /* An optional time to associate with this position - for historical tracking */ - private String utcTimeStamp; - - /* Degree position */ - private double degree; - - /** - * A new position expressed in decimal format - * @param dblLat - * @param dblLng - * @since 1.0 - */ - public Position(double dblLat, double dblLng) throws InvalidPositionException { - lat = new Coordinate(dblLat, Coordinate.LAT); - lng = new Coordinate(dblLng, Coordinate.LNG); - } - - /** - * A new position expressed in decimal format and degrees - * @param dblLat - * @param dblLng - * @param degree - * @since 1.0 - */ -// public Position(double dblLat, double dblLng, double degree) throws InvalidPositionException { -// lat = new Coordinate(dblLat, Coordinate.LAT); -// lng = new Coordinate(dblLng, Coordinate.LNG); -// this.degree = degree; -// } - /** - * A new position expressed in DegMin format - * @param latDeg - * @param latMin - * @param lngDeg - * @param lngMin - * @since 1.0 - */ - public Position(int latDeg, float latMin, int latQuad, int lngDeg, - float lngMin, int lngQuad) throws InvalidPositionException { - lat = new Coordinate(latDeg, latMin, Coordinate.LAT, latQuad); - lng = new Coordinate(lngDeg, lngMin, Coordinate.LNG, lngQuad); - } - - /** - * A new position expressed in ALRS format - * @param lat - * @param lng - * @since 1.0 - */ - public Position(String lat, String lng) throws InvalidPositionException { - this.lat = new Coordinate(lat); - this.lng = new Coordinate(lng); - } - - /** - * A new position expressed in NMEA GPS message format: - * 4807.038,N,01131.000,E - * @param - * @param - * @param - * @param - * @since 12.0 - */ - public Position(String latNMEAGPS, String latQuad, String lngNMEAGPS, String lngQuad, String utcTimeStamp) { - int quad; - - //LAT - if (latQuad.compareTo("N") == 0) { - quad = Coordinate.N; - } else { - quad = Coordinate.S; - } - try { - this.lat = new Coordinate(Integer.valueOf(latNMEAGPS.substring(0, 2)), Float.valueOf(latNMEAGPS.substring(2)), Coordinate.LAT, quad); - } catch (InvalidPositionException e) { - e.printStackTrace(); - } - - //LNG - if (lngQuad.compareTo("E") == 0) { - quad = Coordinate.E; - } else { - quad = Coordinate.W; - } - try { - this.lng = new Coordinate(Integer.valueOf(lngNMEAGPS.substring(0, 3)), Float.valueOf(lngNMEAGPS.substring(3)), Coordinate.LNG, quad); - } catch (InvalidPositionException e) { - e.printStackTrace(); - } - - //TIMESTAMP - this.associateUTCTime(utcTimeStamp); - } - - /** - * Add a reference time for this position - useful for historical tracking - * @param data - * @since 1.0 - */ - public void associateUTCTime(String data) { - utcTimeStamp = data; - } - - /** - * Returns the UTC time stamp - * @return str the UTC timestamp - * @since 1.0 - */ - public String utcTimeStamp() { - return utcTimeStamp; - } - - /** - * Prints out position using decimal format - * @return the position in decimal format - */ - public String toStringDec() { - return lat.toStringDec() + " " + lng.toStringDec(); - } - - /** - * Return the position latitude in decimal format - * @return the latitude in decimal format - * @since 1.0 - */ - public double getLatitude() { - return lat.decVal(); - } - - /** - * Returns the degree of the entity - * @return degree - * @since 1.0 - */ -// public double getDegree() { -// return degree; -// } - /** - * Return the position longitude in decimal format - * @return the longitude in decimal format - * @since 1.0 - */ - public double getLongitude() { - return lng.decVal(); - } - - /** - * Prints out position using DegMin format - * @return the position in DegMin Format - * @since 1.0 - */ - public String toStringDegMin() { - String output = ""; - output += lat.toStringDegMin(); - output += " " + lng.toStringDegMin(); - return output; - } - - /** - * Prints out the position latitude - * @return the latitude as a string for display purposes - * @since 1.0 - */ - public String toStringDegMinLat() { - return lat.toStringDegMin(); - } - - /** - * Prints out the position longitude - * @return the longitude as a string for display purposes - * @since 1.0 - */ - public String toStringDegMinLng() { - return lng.toStringDegMin(); - } - - /** - * Prints out the position latitude - * @return the latitude as a string for display purposes - * @since 1.0 - */ - public String toStringDecLat() { - return lat.toStringDec(); - } - - /** - * Prints out the position longitude - * @return the longitude as a string for display purposes - * @since 1.0 - */ - public String toStringDecLng() { - return lng.toStringDec(); - } - - //TEST HARNESS - DO NOT DELETE! - public static void main(String[] argsc) { - - //NMEA GPS Position format: - Position p = new Position("4807.038", "N", "01131.000", "W", "123519"); - System.out.println(p.toStringDegMinLat()); - System.out.println(p.getLatitude()); - System.out.println(p.getLongitude()); - System.out.println(p.toStringDegMinLng()); - System.out.println(p.utcTimeStamp()); - - }//main -} diff --git a/engine/src/tools/jme3tools/navigation/RLSailing.java b/engine/src/tools/jme3tools/navigation/RLSailing.java deleted file mode 100644 index 1a9a91ccb..000000000 --- a/engine/src/tools/jme3tools/navigation/RLSailing.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.navigation; - -/** - * A utility class to package up a rhumb line sailing - * - * @author Benjamin Jakobus, based on JMarine (by Cormac Gebruers and Benjamin - * Jakobus) - * @version 1.0 - * @since 1.0 - */ -public class RLSailing { - - private double course; - private double distNM; - - public RLSailing(double pCourse, double pDistNM) { - course = pCourse; - distNM = pDistNM; - } - - public double getCourse() { - return course; - } - - public double getDistNM() { - return distNM; - } -} diff --git a/engine/src/tools/jme3tools/navigation/StringUtil.java b/engine/src/tools/jme3tools/navigation/StringUtil.java deleted file mode 100644 index 35765eac7..000000000 --- a/engine/src/tools/jme3tools/navigation/StringUtil.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.navigation; - -import java.util.regex.*; - -/** - * A collection of String utilities. - * - * @author Benjamin Jakobus - * @version 1.0 - */ -public class StringUtil { - - /** - * Splits a newline (\n) delimited string into an array of strings - * - * @param str the string to split up - * @param delimiter the delimiter to use in splitting - * @returns an array of String objects equivalent to str - */ - public String[] splitDelimitedStr(String str, String delimiter) { - Pattern pttn = Pattern.compile(delimiter); - return pttn.split(str); - } - - /** - * Right aligns a long number with spaces for printing - * - * @param num the number to be aligned - * @param totalLen the total length of the padded string - * @return the padded number - */ - public String padNum(long num, int totalLen) { - String numStr = Long.toString(num); - int len = totalLen - numStr.length(); - String pads = ""; - for (int i = 0; i < len; i++) { - pads += " "; - } - return pads + numStr; - } - - /** - * Right aligns a long number with zeros for printing - * - * @param num the number to be aligned - * @param totalLen the total length of the padded string - * @return the padded number - */ - public String padNumZero(long num, int totalLen) { - String numStr = Long.toString(num); - int len = totalLen - numStr.length(); - String pads = ""; - for (int i = 0; i < len; i++) { - pads += "0"; - } - return pads + numStr; - } - - /** - * Right aligns an integer number with spaces for printing - * - * @param num the number to be aligned - * @param totalLen the total length of the padded string - * @return the padded number - */ - public String padNum(int num, int totalLen) { - String numStr = Integer.toString(num); - int len = totalLen - numStr.length(); - String pads = ""; - for (int i = 0; i < len; i++) { - pads += " "; - } - return pads + numStr; - } - - /** - * Right aligns an integer number with zeros for printing - * - * @param num the number to be aligned - * @param totalLen the total length of the padded string - * @return the padded number - */ - public String padNumZero(int num, int totalLen) { - String numStr = Integer.toString(num); - int len = totalLen - numStr.length(); - String pads = ""; - for (int i = 0; i < len; i++) { - pads += "0"; - } - return pads + numStr; - } - - /** - * Right aligns a double number with spaces for printing - * - * @param num the number to be aligned - * @param wholeLen the total length of the padded string - * @return the padded number - */ - public String padNum(double num, int wholeLen, int decimalPlaces) { - String numStr = Double.toString(num); - int dpLoc = numStr.indexOf("."); - - int len = wholeLen - dpLoc; - String pads = ""; - for (int i = 0; i < len; i++) { - pads += " "; - } - - numStr = pads + numStr; - - dpLoc = numStr.indexOf("."); - - if (dpLoc + 1 + decimalPlaces > numStr.substring(dpLoc).length()) { - return numStr; - } - return numStr.substring(0, dpLoc + 1 + decimalPlaces); - } - - /** - * Right aligns a double number with zeros for printing - * - * @param num the number to be aligned - * @param wholeLen the total length of the padded string - * @return the padded number - */ - public String padNumZero(double num, int wholeLen, int decimalPlaces) { - String numStr = Double.toString(num); - int dpLoc = numStr.indexOf("."); - - int len = wholeLen - dpLoc; - String pads = ""; - for (int i = 0; i < len; i++) { - pads += "0"; - } - - numStr = pads + numStr; - - dpLoc = numStr.indexOf("."); - - if (dpLoc + 1 + decimalPlaces > numStr.substring(dpLoc).length()) { - return numStr; - } - return numStr.substring(0, dpLoc + 1 + decimalPlaces); - } - - /** - * Right aligns a float number with spaces for printing - * - * @param num the number to be aligned - * @param wholeLen the total length of the padded string - * @return the padded number - */ - public String padNum(float num, int wholeLen, int decimalPlaces) { - String numStr = Float.toString(num); - int dpLoc = numStr.indexOf("."); - - int len = wholeLen - dpLoc; - String pads = ""; - for (int i = 0; i < len; i++) { - pads += " "; - } - - numStr = pads + numStr; - - dpLoc = numStr.indexOf("."); - - if (dpLoc + 1 + decimalPlaces > numStr.substring(dpLoc).length()) { - return numStr; - } - return numStr.substring(0, dpLoc + 1 + decimalPlaces); - } - - /** - * Right aligns a float number with zeros for printing - * - * @param num the number to be aligned - * @param wholeLen the total length of the padded string - * @return the padded number - */ - public String padNumZero(float num, int wholeLen, int decimalPlaces) { - String numStr = Float.toString(num); - int dpLoc = numStr.indexOf("."); - - int len = wholeLen - dpLoc; - String pads = ""; - - if (numStr.charAt(0) == '-') { - len += 1; - for (int i = 0; i < len; i++) { - pads += "0"; - } - pads = "-" + pads; - numStr = pads + numStr.substring(1); - } else { - for (int i = 0; i < len; i++) { - pads += "0"; - } - numStr = pads + numStr; - } - - dpLoc = numStr.indexOf("."); - int length = numStr.substring(dpLoc).length(); - while (length < decimalPlaces) { - numStr += "0"; - } - return numStr; - - } - - /** - * Right aligns a float number with zeros for printing - * - * @param num the number to be aligned - * @param wholeLen the total length of the padded string - * @return the padded number - */ - public String padStringRight(String input, int wholeLen) { - for (int i = input.length(); i < wholeLen; i++) { - input += " "; - } - return input; - } - - /** - * @param arr a boolean array to be represented as a string - * @return the array as a string - */ - public String boolArrToStr(boolean[] arr) { - String output = ""; - for (int i = 0; i < arr.length; i++) { - if (arr[i]) { - output += "1"; - } else { - output += "0"; - } - } - return output; - } - - /** - * Formats a double nicely for printing: THIS DOES NOT ROUND!!!! - * @param num the double to be turned into a pretty string - * @return the pretty string - */ - public String prettyNum(double num) { - String numStr = (new Double(num)).toString(); - - while (numStr.length() < 4) { - numStr += "0"; - } - - numStr = numStr.substring(0, numStr.indexOf(".") + 3); - return numStr; - } -} diff --git a/engine/src/tools/jme3tools/nvtex/NVCompress.form b/engine/src/tools/jme3tools/nvtex/NVCompress.form deleted file mode 100644 index 2d5754f00..000000000 --- a/engine/src/tools/jme3tools/nvtex/NVCompress.form +++ /dev/null @@ -1,415 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/engine/src/tools/jme3tools/nvtex/NVCompress.java b/engine/src/tools/jme3tools/nvtex/NVCompress.java deleted file mode 100644 index 1968f4379..000000000 --- a/engine/src/tools/jme3tools/nvtex/NVCompress.java +++ /dev/null @@ -1,920 +0,0 @@ -/* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package jme3tools.nvtex; - -import com.jme3.asset.AssetManager; -import com.jme3.asset.plugins.FileLocator; -import com.jme3.export.binary.BinaryExporter; -import com.jme3.system.JmeSystem; -import com.jme3.texture.Image; -import com.jme3.texture.Texture; -import com.jme3.texture.plugins.HDRLoader; -import jme3tools.converters.ImageToAwt; -import jme3tools.converters.MipMapGenerator; -import java.awt.Component; -import java.awt.Container; -import java.awt.Cursor; -import java.awt.event.KeyEvent; -import java.awt.image.BufferedImage; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; -import java.util.prefs.BackingStoreException; -import java.util.prefs.Preferences; -import javax.imageio.ImageIO; -import javax.swing.DefaultListModel; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.UIManager; - -public class NVCompress extends javax.swing.JFrame { - - private static Preferences pref = Preferences.userNodeForPackage(NVCompress.class); - private static File texToolsPath; - private static final String appName = "NVCompress GUI 1.00"; - private Thread workThread = null; - private AssetManager manager; - - public NVCompress() { - initComponents(); - barProgress.setVisible(false); - // puts the form in the center - setLocationRelativeTo(null); - System.out.println(appName); - setTitle(appName); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - pnlMapType = new javax.swing.JPanel(); - cmbMapType = new javax.swing.JComboBox(); - chkMips = new javax.swing.JCheckBox(); - lblMapType = new javax.swing.JLabel(); - chkRepeat = new javax.swing.JCheckBox(); - pnlCompressOpt = new javax.swing.JPanel(); - cmbCompressType = new javax.swing.JComboBox(); - chkLowQuality = new javax.swing.JCheckBox(); - lblCompressType = new javax.swing.JLabel(); - chkCuda = new javax.swing.JCheckBox(); - sclFileList = new javax.swing.JScrollPane(); - lstFileList = new javax.swing.JList(); - btnAddFiles = new javax.swing.JButton(); - btnRemoveFiles = new javax.swing.JButton(); - pnlExportOpt = new javax.swing.JPanel(); - lblTargetDir = new javax.swing.JLabel(); - txtTargetDir = new javax.swing.JTextField(); - btnBrowse = new javax.swing.JButton(); - chkAsSource = new javax.swing.JCheckBox(); - btnCompress = new javax.swing.JButton(); - btnDecompress = new javax.swing.JButton(); - barProgress = new javax.swing.JProgressBar(); - jMenuBar1 = new javax.swing.JMenuBar(); - menuFile = new javax.swing.JMenu(); - itemExit = new javax.swing.JMenuItem(); - menuHelp = new javax.swing.JMenu(); - menuAbout = new javax.swing.JMenuItem(); - - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setTitle("NVCompress GUI"); - addWindowListener(new java.awt.event.WindowAdapter() { - public void windowClosing(java.awt.event.WindowEvent evt) { - formWindowClosing(evt); - } - }); - - pnlMapType.setBorder(javax.swing.BorderFactory.createTitledBorder("Input Options")); - - cmbMapType.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Color Map", "Normal Map", "Height/Convert to Normal Map" })); - - chkMips.setSelected(true); - chkMips.setText("Generate Mipmaps"); - - lblMapType.setText("Map Type: "); - - chkRepeat.setText("Repeating"); - - javax.swing.GroupLayout pnlMapTypeLayout = new javax.swing.GroupLayout(pnlMapType); - pnlMapType.setLayout(pnlMapTypeLayout); - pnlMapTypeLayout.setHorizontalGroup( - pnlMapTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlMapTypeLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnlMapTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(chkRepeat) - .addComponent(chkMips) - .addGroup(pnlMapTypeLayout.createSequentialGroup() - .addComponent(lblMapType) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cmbMapType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addContainerGap(118, Short.MAX_VALUE)) - ); - pnlMapTypeLayout.setVerticalGroup( - pnlMapTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlMapTypeLayout.createSequentialGroup() - .addGroup(pnlMapTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lblMapType) - .addComponent(cmbMapType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(chkMips) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(chkRepeat) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - pnlCompressOpt.setBorder(javax.swing.BorderFactory.createTitledBorder("Compression Options")); - - cmbCompressType.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "RGBA", "DXT1", "DXT1nm", "DXT1a", "DXT3", "DXT5", "DXT5nm", "ATI1", "ATI2/3Dc", "P4RGB565", "P8RGB565", "AWT", "PNG-RGBE" })); - cmbCompressType.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - cmbCompressTypeActionPerformed(evt); - } - }); - - chkLowQuality.setText("Low Quality"); - - lblCompressType.setText("Compression Type: "); - - chkCuda.setSelected(true); - chkCuda.setText("Use GPU Compression (faster)"); - - javax.swing.GroupLayout pnlCompressOptLayout = new javax.swing.GroupLayout(pnlCompressOpt); - pnlCompressOpt.setLayout(pnlCompressOptLayout); - pnlCompressOptLayout.setHorizontalGroup( - pnlCompressOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlCompressOptLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnlCompressOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlCompressOptLayout.createSequentialGroup() - .addComponent(chkLowQuality) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(chkCuda)) - .addGroup(pnlCompressOptLayout.createSequentialGroup() - .addComponent(lblCompressType) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cmbCompressType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addContainerGap(117, Short.MAX_VALUE)) - ); - pnlCompressOptLayout.setVerticalGroup( - pnlCompressOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlCompressOptLayout.createSequentialGroup() - .addGroup(pnlCompressOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(chkLowQuality) - .addComponent(chkCuda)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(pnlCompressOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lblCompressType) - .addComponent(cmbCompressType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - lstFileList.setModel(new DefaultListModel()); - lstFileList.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyTyped(java.awt.event.KeyEvent evt) { - lstFileListKeyTyped(evt); - } - }); - sclFileList.setViewportView(lstFileList); - - btnAddFiles.setText("Add files.."); - btnAddFiles.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnAddFilesActionPerformed(evt); - } - }); - - btnRemoveFiles.setText("Remove Selected"); - btnRemoveFiles.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnRemoveFilesActionPerformed(evt); - } - }); - - pnlExportOpt.setBorder(javax.swing.BorderFactory.createTitledBorder("Export Options")); - - lblTargetDir.setText("Target Folder: "); - - btnBrowse.setText("Browse.."); - btnBrowse.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnBrowseActionPerformed(evt); - } - }); - - chkAsSource.setText("Same as source"); - chkAsSource.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - chkAsSourceActionPerformed(evt); - } - }); - - btnCompress.setText("Compress"); - btnCompress.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnCompressActionPerformed(evt); - } - }); - - btnDecompress.setText("Decompress"); - btnDecompress.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnDecompressActionPerformed(evt); - } - }); - - javax.swing.GroupLayout pnlExportOptLayout = new javax.swing.GroupLayout(pnlExportOpt); - pnlExportOpt.setLayout(pnlExportOptLayout); - pnlExportOptLayout.setHorizontalGroup( - pnlExportOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlExportOptLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnlExportOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlExportOptLayout.createSequentialGroup() - .addComponent(lblTargetDir) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(txtTargetDir, javax.swing.GroupLayout.DEFAULT_SIZE, 217, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(btnBrowse)) - .addComponent(chkAsSource) - .addGroup(pnlExportOptLayout.createSequentialGroup() - .addComponent(btnCompress) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnDecompress))) - .addContainerGap()) - ); - pnlExportOptLayout.setVerticalGroup( - pnlExportOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlExportOptLayout.createSequentialGroup() - .addGroup(pnlExportOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lblTargetDir) - .addComponent(txtTargetDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(btnBrowse)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(chkAsSource) - .addGap(7, 7, 7) - .addGroup(pnlExportOptLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(btnCompress) - .addComponent(btnDecompress)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - barProgress.setStringPainted(true); - - menuFile.setText("File"); - - itemExit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK)); - itemExit.setText("Exit"); - itemExit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - itemExitActionPerformed(evt); - } - }); - menuFile.add(itemExit); - - jMenuBar1.add(menuFile); - - menuHelp.setText("Help"); - - menuAbout.setText("About"); - menuAbout.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - menuAboutActionPerformed(evt); - } - }); - menuHelp.add(menuAbout); - - jMenuBar1.add(menuHelp); - - setJMenuBar(jMenuBar1); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(barProgress, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnlCompressOpt, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnlExportOpt, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnlMapType, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(btnAddFiles) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnRemoveFiles)) - .addComponent(sclFileList, javax.swing.GroupLayout.DEFAULT_SIZE, 263, Short.MAX_VALUE)) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(pnlMapType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(pnlCompressOpt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pnlExportOpt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(sclFileList, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(barProgress, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE) - .addComponent(btnRemoveFiles, javax.swing.GroupLayout.PREFERRED_SIZE, 24, Short.MAX_VALUE) - .addComponent(btnAddFiles, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap()) - ); - - pack(); - }// //GEN-END:initComponents - - private String[] computeCompressParameters(){ - List params = new ArrayList(); - - if (!chkCuda.isSelected()) - params.add("-nocuda"); - - switch (cmbMapType.getSelectedIndex()){ - case 0: params.add("-color"); break; - case 1: params.add("-normal"); break; - case 2: params.add("-tonormal"); break; - } - - if (!chkMips.isSelected()) - params.add("-nomips"); - if (chkRepeat.isSelected()) - params.add("-repeat"); - if (chkLowQuality.isSelected()) - params.add("-fast"); - - switch (cmbCompressType.getSelectedIndex()){ - case 0: params.add("-rgb"); break; - case 1: params.add("-bc1"); break; - case 2: params.add("-bc1n"); break; - case 3: params.add("-bc1a"); break; - case 4: params.add("-bc2"); break; - case 5: params.add("-bc3"); break; - case 6: params.add("-bc3n"); break; - case 7: params.add("-bc4"); break; - case 8: params.add("-bc5"); break; - } - - return params.toArray(new String[0]); - } - - private void updateWork(String workStatus, int percent){ - barProgress.setString(workStatus + " - " + percent+"%"); - barProgress.setValue(percent); - } - - private void setComponentEnabled(Container c, boolean enabled){ - c.setEnabled(enabled); - for (Component child : c.getComponents()){ - if (child instanceof Container) - setComponentEnabled((Container)child, enabled); - else - child.setEnabled(enabled); - } - } - - private void startWork(){ - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - barProgress.setVisible(true); - barProgress.setValue(0); - barProgress.setString("Status: Working"); - - setComponentEnabled(pnlCompressOpt, false); - setComponentEnabled(pnlExportOpt, false); - setComponentEnabled(pnlMapType, false); - lstFileList.setEnabled(false); - btnAddFiles.setEnabled(false); - btnRemoveFiles.setEnabled(false); - } - - private void endWork(){ - workThread = null; - - setCursor(null); - barProgress.setVisible(false); - barProgress.setString("Status: Done"); - - setComponentEnabled(pnlCompressOpt, true); - setComponentEnabled(pnlExportOpt, true); - setComponentEnabled(pnlMapType, true); - lstFileList.setEnabled(true); - btnAddFiles.setEnabled(true); - btnRemoveFiles.setEnabled(true); - - // properly disables/enables certain components - chkAsSourceActionPerformed(null); - - btnCompress.setText("Compress"); - btnDecompress.setText("Decompress"); - } - - private void runJ3(File input, File output, String statusStr) throws InterruptedException{ - updateWork(statusStr, 0); - if (manager == null) - manager = JmeSystem.newAssetManager(); - - manager.registerLocator(input.getParent().toString(), - FileLocator.class.getName()); - - String format = (String) cmbCompressType.getSelectedItem(); - if (format.equals("PNG-RGBE")){ - HDRLoader loader = new HDRLoader(true); - try{ - FileInputStream in = new FileInputStream(input); - Image image = loader.load(in, false); - in.close(); - - BufferedImage rgbeImage = ImageToAwt.convert(image, false, true, 0); - if (output == null){ - output = new File(input.getParent(), input.getName() + ".png"); - } - ImageIO.write(rgbeImage, "png", output); - } catch (IOException ex){ - ex.printStackTrace(); - } - }else{ - Texture tex = manager.loadTexture(input.getName()); - Image image = tex.getImage(); - - boolean mips = chkMips.isSelected(); - if (mips && !image.hasMipmaps()){ - MipMapGenerator.generateMipMaps(image); - } - if (output == null){ - output = new File(input.getParent(), input.getName() + ".j3i"); - } - - try{ - BinaryExporter.getInstance().save(image, output); - BufferedImage preview = ImageToAwt.convert(image, false, true, 0); - ImageIO.write(preview, "png", new File(output + ".png")); - }catch (IOException ex){ - ex.printStackTrace(); - } - } - } - - private void runCommand(String[] args, String statusStr) throws InterruptedException{ - Process p = null; - try{ - ProcessBuilder builder = new ProcessBuilder(args); - updateWork(statusStr, 0); - p = builder.start(); - BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); - String ln; - while ((ln = r.readLine()) != null){ - if (Thread.interrupted()) - throw new InterruptedException(); - - if (ln.endsWith("%")){ - // show status in bar - int percent = Integer.parseInt(ln.substring(0, ln.length()-1)); - updateWork(statusStr, percent); - }else if (ln.startsWith("time taken")){ - ln = ln.substring(12, ln.length()-7).trim(); - System.out.println("Time Taken: "+ln+" seconds"); - } - } - r.close(); - int error = p.waitFor(); - if (error != 0){ - System.out.println("Error Code: " + error); - } - } catch (IOException ex){ - ex.printStackTrace(); - } catch (InterruptedException ex){ - // may get interrupted if user canceled work - if (p != null) - p.destroy(); - - // propegate exception incase caller is interested - throw ex; - } - } - - private void runNVDecompress(final File inFile) throws InterruptedException{ - if (!inFile.getName().toLowerCase().endsWith(".dds")) - return; // not a DDS file - - String[] args = new String[2]; - args[0] = new File(texToolsPath, "nvdecompress").toString(); - args[1] = inFile.toString(); - - System.out.println("Decompressing file "+inFile); - runCommand(args, "Decompressing file "+inFile.getName()); - } - - private void runNVCompress(final File inFile, File outFile) throws InterruptedException{ - String nvcompressCmd = new File(texToolsPath, "nvcompress").toString(); - int argCount = 2; // nvcompressCmd & inFile are always specified - if (outFile != null) - argCount ++; - - String[] params = computeCompressParameters(); - argCount += params.length; - - String[] args = new String[argCount]; - args[0] = nvcompressCmd; - System.arraycopy(params, 0, args, 1, params.length); - args[params.length + 1] = inFile.toString(); - if (outFile != null) - args[params.length + 2] = outFile.toString(); - - System.out.println("Converting file "+inFile); -// System.out.println("Arguments: "); -// for (String arg : args) System.out.println(" "+arg); - - runCommand(args, "Converting "+inFile.getName()); - } - - private void runJ3Compress(final File inFile, File outFile) throws InterruptedException{ - System.out.println("Converting file "+inFile); - runJ3(inFile, outFile, "Converting "+inFile.getName()); - } - - private Object[] compileFileList(){ - Object[] values = lstFileList.getSelectedValues(); - if (values == null || values.length == 0){ - // no specific files selected, add all of them - DefaultListModel listModel = (DefaultListModel) lstFileList.getModel(); - values = listModel.toArray(); - } - return values; - } - - private void runNVCompressAll(final File exportDir){ - final Object[] fileList = compileFileList(); - if (fileList != null && fileList.length > 0){ - startWork(); - workThread = new Thread(){ - @Override - public void run(){ - for (Object val : fileList){ - File inFile = (File) val; - File outFile = null; - if (exportDir != null){ - String name = inFile.getName(); - int extPt = name.lastIndexOf("."); - if (extPt > 0) - name = name.substring(0, extPt); - - outFile = new File(exportDir, name+".dds"); - } - try{ - runNVCompress(inFile, outFile); - }catch (InterruptedException ex){ - return; // user canceled - } - } - endWork(); - } - }; - workThread.setDaemon(true); - workThread.start(); - } - } - - private void runJ3CompressAll(final File exportDir, final String ext){ - final Object[] fileList = compileFileList(); - if (fileList != null && fileList.length > 0){ - startWork(); - workThread = new Thread(){ - @Override - public void run(){ - for (Object val : fileList){ - File inFile = (File) val; - File outFile = null; - if (exportDir != null){ - String name = inFile.getName(); - int extPt = name.lastIndexOf("."); - if (extPt > 0) - name = name.substring(0, extPt); - - outFile = new File(exportDir, name+"."+ext); - } - try{ - runJ3Compress(inFile, outFile); - }catch (InterruptedException ex){ - return; // user canceled - } - } - endWork(); - } - }; - workThread.setDaemon(true); - workThread.start(); - } - } - - private void runNVDecompressAll(){ - final Object[] fileList = compileFileList(); - if (fileList != null && fileList.length > 0){ - startWork(); - workThread = new Thread(){ - @Override - public void run(){ - for (Object val : fileList){ - File inFile = (File) val; - try{ - runNVDecompress(inFile); - }catch (InterruptedException ex){ - return; // user canceled - } - } - endWork(); - } - }; - workThread.setDaemon(true); - workThread.start(); - } - } - - private void cmbCompressTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmbCompressTypeActionPerformed - -}//GEN-LAST:event_cmbCompressTypeActionPerformed - - private void btnCompressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCompressActionPerformed - if (btnCompress.getText().equals("Cancel")){ - if (workThread != null){ - workThread.interrupt(); - System.out.println("User canceled decompression"); - endWork(); - } - }else{ - // find out where to export - File exportDir = null; - if (!chkAsSource.isSelected()){ - String exportPath = txtTargetDir.getText(); - if (exportPath != null && !exportPath.equals("")) - exportDir = new File(exportPath); - } - - String compression = (String) cmbCompressType.getSelectedItem(); - if (compression.equals("AWT") || compression.equals("PNG-RGBE")){ - runJ3CompressAll(exportDir, compression.equals("AWT") ? "j3i" : "pnge"); - }else{ - runNVCompressAll(exportDir); - } - - btnCompress.setEnabled(true); - btnCompress.setText("Cancel"); - } -}//GEN-LAST:event_btnCompressActionPerformed - - private void btnBrowseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBrowseActionPerformed - JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle("Select export directory"); - chooser.setMultiSelectionEnabled(false); - chooser.setDialogType(JFileChooser.OPEN_DIALOG); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - if (txtTargetDir.getText() != null && !txtTargetDir.getText().equals("")) - chooser.setSelectedFile(new File(txtTargetDir.getText())); - - if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){ - File f = chooser.getSelectedFile(); - if (f != null && f.exists() && f.isDirectory()) - txtTargetDir.setText(f.toString()); - else - JOptionPane.showMessageDialog(this, - "Invalid export directory specified", - "Error", JOptionPane.ERROR_MESSAGE); - } - }//GEN-LAST:event_btnBrowseActionPerformed - - private void chkAsSourceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkAsSourceActionPerformed - lblTargetDir.setEnabled(!chkAsSource.isSelected()); - txtTargetDir.setEnabled(!chkAsSource.isSelected()); - btnBrowse.setEnabled(!chkAsSource.isSelected()); - }//GEN-LAST:event_chkAsSourceActionPerformed - - private void btnAddFilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddFilesActionPerformed - JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle("Add input files"); - chooser.setMultiSelectionEnabled(true); - chooser.setDialogType(JFileChooser.OPEN_DIALOG); - chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); - - if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION){ - File[] files = chooser.getSelectedFiles(); - for (File file : files){ - if (file.exists() && !file.isDirectory()){ - // add to file list - DefaultListModel listModel = (DefaultListModel) lstFileList.getModel(); - if (!listModel.contains(file)) - listModel.addElement(file); - } - } - } - }//GEN-LAST:event_btnAddFilesActionPerformed - - private void btnRemoveFilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveFilesActionPerformed - Object[] selected = lstFileList.getSelectedValues(); - DefaultListModel listModel = (DefaultListModel) lstFileList.getModel(); - for (Object val : selected){ - listModel.removeElement(val); - } - }//GEN-LAST:event_btnRemoveFilesActionPerformed - - private void itemExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemExitActionPerformed - dispose(); -}//GEN-LAST:event_itemExitActionPerformed - - private void menuAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuAboutActionPerformed - String aboutText = appName+"\n"+ - "Created by Kirill Vainer.\n"+ - "\n"+ - "NVIDIA Texture Tools is Copyright© 2009 NVIDIA Corporation.\n"+ - "\n"+ - "Usage: \n"+ - " Press \"Add Files..\" to add files to convert\n"+ - " Select conversion options on the left, then\n"+ - " click \"Export\" to convert files to DDS\n"; - JOptionPane.showMessageDialog(this, aboutText, "About", JOptionPane.PLAIN_MESSAGE); - }//GEN-LAST:event_menuAboutActionPerformed - - private void lstFileListKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_lstFileListKeyTyped - if (evt.getKeyCode() == KeyEvent.VK_DELETE){ - btnRemoveFilesActionPerformed(null); - } - }//GEN-LAST:event_lstFileListKeyTyped - - private void btnDecompressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDecompressActionPerformed - if (btnDecompress.getText().equals("Cancel")){ - if (workThread != null){ - workThread.interrupt(); - System.out.println("User canceled decompression"); - endWork(); - } - }else{ - runNVDecompressAll(); - btnDecompress.setEnabled(true); - btnDecompress.setText("Cancel"); - } - -}//GEN-LAST:event_btnDecompressActionPerformed - - private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing - if (workThread != null) - workThread.interrupt(); - }//GEN-LAST:event_formWindowClosing - - private static boolean verifyTexToolsPath(File path){ - if (path.exists()){ - File[] files = path.listFiles(); - for (File f : files){ - if (f.getName().startsWith("nvcompress")){ - return true; - } - } - } - return false; - } - - private static File showToolsPathChooser(File prevPath){ - JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle("Select directory of NVTextureTools"); - chooser.setMultiSelectionEnabled(false); - chooser.setDialogType(JFileChooser.OPEN_DIALOG); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - if (prevPath != null) - chooser.setSelectedFile(prevPath); - - if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){ - return chooser.getSelectedFile(); - }else{ - return null; - } - } - - public static String attemptLocateToolsPath(){ - String path = pref.get("NVTextureToolsPath", null); - if (path == null){ - // if texture tools has been properly installed - // the path is located under TEXTURE_TOOLS_DIR env var - path = System.getenv("TEXTURE_TOOLS_DIR"); - } - return path; - } - - public static void main(String args[]) { - try{ - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception ex){ - ex.printStackTrace(); - } - - System.out.println("Verifiying texture tools path.."); - String path = attemptLocateToolsPath(); - texToolsPath = path == null ? null : new File(path); - - if (texToolsPath != null){ - System.out.println("Found existing path: "+texToolsPath); - } - - if (texToolsPath == null || !verifyTexToolsPath(texToolsPath)){ - while (true){ - File f = showToolsPathChooser(texToolsPath); - if (f == null) - return; - - if (verifyTexToolsPath(f)){ - texToolsPath = f; - pref.put("NVTextureToolsPath", texToolsPath.toString()); - System.out.println("User specified valid path: "+texToolsPath); - try{ - pref.flush(); - } catch (BackingStoreException ex){} - break; - }else{ - JOptionPane.showMessageDialog(null, "Directory must"+ - " contain nvcompress", - "Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - - java.awt.EventQueue.invokeLater(new Runnable() { - public void run() { - new NVCompress().setVisible(true); - } - }); - } - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JProgressBar barProgress; - private javax.swing.JButton btnAddFiles; - private javax.swing.JButton btnBrowse; - private javax.swing.JButton btnCompress; - private javax.swing.JButton btnDecompress; - private javax.swing.JButton btnRemoveFiles; - private javax.swing.JCheckBox chkAsSource; - private javax.swing.JCheckBox chkCuda; - private javax.swing.JCheckBox chkLowQuality; - private javax.swing.JCheckBox chkMips; - private javax.swing.JCheckBox chkRepeat; - private javax.swing.JComboBox cmbCompressType; - private javax.swing.JComboBox cmbMapType; - private javax.swing.JMenuItem itemExit; - private javax.swing.JMenuBar jMenuBar1; - private javax.swing.JLabel lblCompressType; - private javax.swing.JLabel lblMapType; - private javax.swing.JLabel lblTargetDir; - private javax.swing.JList lstFileList; - private javax.swing.JMenuItem menuAbout; - private javax.swing.JMenu menuFile; - private javax.swing.JMenu menuHelp; - private javax.swing.JPanel pnlCompressOpt; - private javax.swing.JPanel pnlExportOpt; - private javax.swing.JPanel pnlMapType; - private javax.swing.JScrollPane sclFileList; - private javax.swing.JTextField txtTargetDir; - // End of variables declaration//GEN-END:variables - -} diff --git a/engine/src/tools/jme3tools/savegame/SaveGame.java b/engine/src/tools/jme3tools/savegame/SaveGame.java deleted file mode 100644 index 5eac8bfd7..000000000 --- a/engine/src/tools/jme3tools/savegame/SaveGame.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package jme3tools.savegame; - -import com.jme3.asset.AssetManager; -import com.jme3.export.Savable; -import com.jme3.export.binary.BinaryExporter; -import com.jme3.export.binary.BinaryImporter; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.prefs.Preferences; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; -import sun.misc.UUDecoder; -import sun.misc.UUEncoder; - -/** - * Tool for saving Savables as SaveGame entries in a system-dependent way. - * @author normenhansen - */ -public class SaveGame { - - /** - * Saves a savable in a system-dependent way. Note that only small amounts of data can be saved. - * @param gamePath A unique path for this game, e.g. com/mycompany/mygame - * @param dataName A unique name for this savegame, e.g. "save_001" - * @param data The Savable to save - */ - public static void saveGame(String gamePath, String dataName, Savable data) { - Preferences prefs = Preferences.userRoot().node(gamePath); - BinaryExporter ex = BinaryExporter.getInstance(); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try { - GZIPOutputStream zos = new GZIPOutputStream(out); - ex.save(data, zos); - zos.close(); - } catch (IOException ex1) { - Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error saving data: {0}", ex1); - ex1.printStackTrace(); - } - UUEncoder enc = new UUEncoder(); - String dataString = enc.encodeBuffer(out.toByteArray()); -// System.out.println(dataString); - if (dataString.length() > Preferences.MAX_VALUE_LENGTH) { - throw new IllegalStateException("SaveGame dataset too large"); - } - prefs.put(dataName, dataString); - } - - /** - * Loads a savable that has been saved on this system with saveGame() before. - * @param gamePath A unique path for this game, e.g. com/mycompany/mygame - * @param dataName A unique name for this savegame, e.g. "save_001" - * @return The savable that was saved - */ - public static Savable loadGame(String gamePath, String dataName) { - return loadGame(gamePath, dataName, null); - } - - /** - * Loads a savable that has been saved on this system with saveGame() before. - * @param gamePath A unique path for this game, e.g. com/mycompany/mygame - * @param dataName A unique name for this savegame, e.g. "save_001" - * @param assetManager Link to an AssetManager if required for loading the data (e.g. models with textures) - * @return The savable that was saved - */ - public static Savable loadGame(String gamePath, String dataName, AssetManager manager) { - Preferences prefs = Preferences.userRoot().node(gamePath); - String data = prefs.get(dataName, ""); - InputStream is = null; - Savable sav = null; - UUDecoder dec = new UUDecoder(); - try { - is = new GZIPInputStream(new ByteArrayInputStream(dec.decodeBuffer(data))); - BinaryImporter imp = BinaryImporter.getInstance(); - if (manager != null) { - imp.setAssetManager(manager); - } - sav = imp.load(is); - } catch (IOException ex) { - Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error loading data: {0}", ex); - ex.printStackTrace(); - } finally { - if (is != null) { - try { - is.close(); - } catch (IOException ex) { - Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error loading data: {0}", ex); - ex.printStackTrace(); - } - } - } - return sav; - } -}