diff --git a/Demos/SerializeDemo/SerializeDemo.cpp b/Demos/SerializeDemo/SerializeDemo.cpp index 0f6e12b5a..aee232ab9 100644 --- a/Demos/SerializeDemo/SerializeDemo.cpp +++ b/Demos/SerializeDemo/SerializeDemo.cpp @@ -15,7 +15,7 @@ subject to the following restrictions: #define TEST_SERIALIZATION 1 -//#define DESERIALIZE_SOFT_BODIES 1 +//#undef DESERIALIZE_SOFT_BODIES #ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES #define CREATE_NEW_BULLETFILE 1 @@ -49,7 +49,9 @@ subject to the following restrictions: #include //printf debugging + #ifdef DESERIALIZE_SOFT_BODIES +#include "BulletSoftBody/btSoftBodyHelpers.h" #include "BulletSoftBody/btSoftRigidDynamicsWorld.h" #include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h" #endif @@ -65,6 +67,7 @@ void SerializeDemo::clientMoveAndDisplay() ///step the simulation if (m_dynamicsWorld) { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); //optional but useful: debug drawing m_dynamicsWorld->debugDrawWorld(); @@ -113,13 +116,16 @@ void SerializeDemo::setupEmptyDynamicsWorld() m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); m_broadphase = new btDbvtBroadphase(); + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; m_solver = sol; #ifdef DESERIALIZE_SOFT_BODIES - m_dynamicsWorld = new btSoftRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + btSoftRigidDynamicsWorld* world = new btSoftRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = world; + //world->setDrawFlags(world->getDrawFlags()^fDrawFlags::Clusters); #else m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); #endif //DESERIALIZE_SOFT_BODIES @@ -130,8 +136,6 @@ void SerializeDemo::setupEmptyDynamicsWorld() } -btAlignedObjectArray vtx; -btAlignedObjectArray masses; #ifdef DESERIALIZE_SOFT_BODIES #include "BulletSoftBody/btSoftBodyData.h" @@ -139,6 +143,11 @@ class MySoftBulletWorldImporter : public btBulletWorldImporter { btSoftRigidDynamicsWorld* m_softRigidWorld; + + btHashMap m_materialMap; + + + public: MySoftBulletWorldImporter(btSoftRigidDynamicsWorld* world) @@ -148,6 +157,11 @@ public: } + virtual ~MySoftBulletWorldImporter() + { + + } + virtual bool convertAllObjects( bParse::btBulletFile* bulletFile2) { bool result = btBulletWorldImporter::convertAllObjects(bulletFile2); @@ -158,84 +172,109 @@ public: if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) { btAssert(0); //not yet - //btSoftBodyFloatData* colObjData = (btSoftBodyFloatData*)bulletFile2->m_softBodies[i]; + //btSoftBodyFloatData* softBodyData = (btSoftBodyFloatData*)bulletFile2->m_softBodies[i]; } else { - btSoftBodyFloatData* colObjData = (btSoftBodyFloatData*)bulletFile2->m_softBodies[i]; + btSoftBodyFloatData* softBodyData = (btSoftBodyFloatData*)bulletFile2->m_softBodies[i]; int i; - int numNodes = colObjData->m_numNodes; + int numNodes = softBodyData->m_numNodes; - for (i=0;im_numLinks;i++) + + btSoftBody* psb=new btSoftBody(&m_softRigidWorld->getWorldInfo()); + + //materials + for (i=0;im_numMaterials;i++) { - SoftBodyLinkData& link = colObjData->m_links[i]; + SoftBodyMaterialData* matData = softBodyData->m_materials[i]; + btSoftBody::Material** matPtr = m_materialMap.find(matData); + btSoftBody::Material* mat = 0; + if (matPtr&& *matPtr) + { + mat = *matPtr; + } else + { + mat = psb->appendMaterial(); + mat->m_flags = matData->m_flags; + mat->m_kAST = matData->m_angularStiffness; + mat->m_kLST = matData->m_linearStiffness; + mat->m_kVST = matData->m_volumeStiffness; + m_materialMap.insert(matData,mat); + } + } + + + + + for (i=0;im_nodes[i]; + btVector3 position; + position.deSerializeFloat(nodeData.m_position); + btScalar mass = nodeData.m_inverseMass? 1./nodeData.m_inverseMass : 0.f; + psb->appendNode(position,mass); + btSoftBody::Node* node = &psb->m_nodes[psb->m_nodes.size()-1]; + node->m_area = nodeData.m_area; + node->m_battach = nodeData.m_attach; + node->m_f.deSerializeFloat(nodeData.m_accumulatedForce); + node->m_im = nodeData.m_inverseMass; + + btSoftBody::Material** matPtr = m_materialMap.find(nodeData.m_material); + if (matPtr && *matPtr) + { + node->m_material = *matPtr; + } else + { + printf("no mat?\n"); + } + + node->m_n.deSerializeFloat(nodeData.m_normal); + node->m_q = node->m_x; + node->m_v.deSerializeFloat(nodeData.m_velocity); } - - - vtx.resize(numNodes); - masses.resize(numNodes); - - for (i=0;im_numLinks;i++) { - SoftBodyNodeData& node = colObjData->m_nodes[i]; - vtx[i].deSerializeFloat(node.m_position); - masses[i] = node.m_inverseMass? 1./node.m_inverseMass : 0.f; - } - - btSoftBody* psb=new btSoftBody(&m_softRigidWorld->getWorldInfo(),numNodes,&vtx[0],&masses[0]); - -#if 0 - for (i=0;im_nodes[i]; - if (!node.m_inverseMass) + SoftBodyLinkData& linkData = softBodyData->m_links[i]; + btSoftBody::Material** matPtr = m_materialMap.find(linkData.m_material); + if (matPtr && *matPtr) { - btScalar mass = node.m_inverseMass? 1.f/node.m_inverseMass : 0; - psb->setMass(i,mass); + psb->appendLink(linkData.m_nodeIndices[0],linkData.m_nodeIndices[1],*matPtr); + } else + { + psb->appendLink(linkData.m_nodeIndices[0],linkData.m_nodeIndices[1]); } + btSoftBody::Link* link = &psb->m_links[psb->m_links.size()-1]; + link->m_bbending = linkData.m_bbending; + link->m_c0 = linkData.m_c0; + link->m_c1 = linkData.m_c1; + link->m_c2 = linkData.m_c2; + link->m_c3.deSerializeFloat(linkData.m_c3); + link->m_rl = linkData.m_restLength; } -#endif - - for (i=0;im_numLinks;i++) + for (i=0;im_numFaces;i++) { - SoftBodyLinkData& link = colObjData->m_links[i]; - psb->appendLink(link.m_nodeIndices[0],link.m_nodeIndices[1]); + SoftBodyFaceData& faceData = softBodyData->m_faces[i]; + btSoftBody::Material** matPtr = m_materialMap.find(faceData.m_material); + if (matPtr && *matPtr) + { + psb->appendFace(faceData.m_nodeIndices[0],faceData.m_nodeIndices[1],faceData.m_nodeIndices[2],*matPtr); + } else + { + psb->appendFace(faceData.m_nodeIndices[0],faceData.m_nodeIndices[1],faceData.m_nodeIndices[2]); + } + btSoftBody::Face* face = &psb->m_faces[psb->m_faces.size()-1]; + face->m_normal.deSerializeFloat(faceData.m_normal); + face->m_ra = faceData.m_restArea; } - for (i=0;im_numFaces;i++) - { - SoftBodyFaceData& face = colObjData->m_faces[i]; - psb->appendFace(face.m_nodeIndices[0],face.m_nodeIndices[1],face.m_nodeIndices[2]); - } - - - // psb->randomizeConstraints(); - - - //psb->updateNormals(); - //psb->updateBounds(); - //psb->updateConstants(); - - - psb->m_cfg.piterations=colObjData->m_config.m_positionIterations; - psb->m_cfg.diterations=colObjData->m_config.m_driftIterations; - psb->m_cfg.citerations=colObjData->m_config.m_clusterIterations; - psb->m_cfg.viterations=colObjData->m_config.m_velocityIterations; - - - //psb->setTotalMass(0.1); - psb->m_cfg.aeromodel = (btSoftBody::eAeroModel::_)colObjData->m_config.m_aeroModel; - psb->m_cfg.kLF = colObjData->m_config.m_lift; - psb->m_cfg.kDG = colObjData->m_config.m_drag; - //psb->addForce(btVector3(0,2,0),0); - + //anchors - for (i=0;im_numAnchors;i++) + for (i=0;im_numAnchors;i++) { - btCollisionObject** colAptr = m_bodyMap.find(colObjData->m_anchors[i].m_rigidBody); + btCollisionObject** colAptr = m_bodyMap.find(softBodyData->m_anchors[i].m_rigidBody); if (colAptr && *colAptr) { btRigidBody* body = btRigidBody::upcast(*colAptr); @@ -243,13 +282,131 @@ public: { bool disableCollision = false; btVector3 localPivot; - localPivot.deSerializeFloat(colObjData->m_anchors[i].m_localFrame); - psb->appendAnchor(colObjData->m_anchors[i].m_nodeIndex,body,localPivot, disableCollision); + localPivot.deSerializeFloat(softBodyData->m_anchors[i].m_localFrame); + psb->appendAnchor(softBodyData->m_anchors[i].m_nodeIndex,body,localPivot, disableCollision); } } } + if (softBodyData->m_pose) + { + psb->m_pose.m_aqq.deSerializeFloat( softBodyData->m_pose->m_aqq); + psb->m_pose.m_bframe = softBodyData->m_pose->m_bframe; + psb->m_pose.m_bvolume = softBodyData->m_pose->m_bvolume; + psb->m_pose.m_com.deSerializeFloat(softBodyData->m_pose->m_com); + + psb->m_pose.m_pos.resize(softBodyData->m_pose->m_numPositions); + for (i=0;im_pose->m_numPositions;i++) + { + psb->m_pose.m_pos[i].deSerializeFloat(softBodyData->m_pose->m_positions[i]); + } + psb->m_pose.m_rot.deSerializeFloat(softBodyData->m_pose->m_rot); + psb->m_pose.m_scl.deSerializeFloat(softBodyData->m_pose->m_scale); + psb->m_pose.m_wgh.resize(softBodyData->m_pose->m_numWeigts); + for (i=0;im_pose->m_numWeigts;i++) + { + psb->m_pose.m_wgh[i] = softBodyData->m_pose->m_weights[i]; + } + psb->m_pose.m_volume = softBodyData->m_pose->m_restVolume; + } + +#if 1 + psb->m_cfg.piterations=softBodyData->m_config.m_positionIterations; + psb->m_cfg.diterations=softBodyData->m_config.m_driftIterations; + psb->m_cfg.citerations=softBodyData->m_config.m_clusterIterations; + psb->m_cfg.viterations=softBodyData->m_config.m_velocityIterations; + + //psb->setTotalMass(0.1); + psb->m_cfg.aeromodel = (btSoftBody::eAeroModel::_)softBodyData->m_config.m_aeroModel; + psb->m_cfg.kLF = softBodyData->m_config.m_lift; + psb->m_cfg.kDG = softBodyData->m_config.m_drag; + psb->m_cfg.kMT = softBodyData->m_config.m_poseMatch; + psb->m_cfg.collisions = softBodyData->m_config.m_collisionFlags; + psb->m_cfg.kDF = softBodyData->m_config.m_dynamicFriction; + psb->m_cfg.kDP = softBodyData->m_config.m_damping; + psb->m_cfg.kPR = softBodyData->m_config.m_pressure; + psb->m_cfg.kVC = softBodyData->m_config.m_volume; + psb->m_cfg.kAHR = softBodyData->m_config.m_anchorHardness; + psb->m_cfg.kKHR = softBodyData->m_config.m_kineticContactHardness; + psb->m_cfg.kSHR = softBodyData->m_config.m_softContactHardness; + psb->m_cfg.kSRHR_CL = softBodyData->m_config.m_softRigidClusterHardness; + psb->m_cfg.kSKHR_CL = softBodyData->m_config.m_softKineticClusterHardness; + psb->m_cfg.kSSHR_CL = softBodyData->m_config.m_softSoftClusterHardness; +#endif + +// pm->m_kLST = 1; + +#if 1 + //clusters + if (softBodyData->m_numClusters) + { + int j; + psb->m_clusters.resize(softBodyData->m_numClusters); + for (i=0;im_numClusters;i++) + { + psb->m_clusters[i] = new(btAlignedAlloc(sizeof(btSoftBody::Cluster),16)) btSoftBody::Cluster(); + psb->m_clusters[i]->m_adamping = softBodyData->m_clusters[i].m_adamping; + psb->m_clusters[i]->m_av.deSerializeFloat(softBodyData->m_clusters[i].m_av); + psb->m_clusters[i]->m_clusterIndex = softBodyData->m_clusters[i].m_clusterIndex; + psb->m_clusters[i]->m_collide = softBodyData->m_clusters[i].m_collide; + psb->m_clusters[i]->m_com.deSerializeFloat(softBodyData->m_clusters[i].m_com); + psb->m_clusters[i]->m_containsAnchor = softBodyData->m_clusters[i].m_containsAnchor; + psb->m_clusters[i]->m_dimpulses[0].deSerializeFloat(softBodyData->m_clusters[i].m_dimpulses[0]); + psb->m_clusters[i]->m_dimpulses[1].deSerializeFloat(softBodyData->m_clusters[i].m_dimpulses[1]); + + psb->m_clusters[i]->m_framerefs.resize(softBodyData->m_clusters[i].m_numFrameRefs); + for (j=0;jm_clusters[i].m_numFrameRefs;j++) + { + psb->m_clusters[i]->m_framerefs[j].deSerializeFloat(softBodyData->m_clusters[i].m_framerefs[j]); + } + psb->m_clusters[i]->m_nodes.resize(softBodyData->m_clusters[i].m_numNodes); + for (j=0;jm_clusters[i].m_numNodes;j++) + { + int nodeIndex = softBodyData->m_clusters[i].m_nodeIndices[j]; + psb->m_clusters[i]->m_nodes[j] = &psb->m_nodes[nodeIndex]; + } + + psb->m_clusters[i]->m_masses.resize(softBodyData->m_clusters[i].m_numMasses); + for (j=0;jm_clusters[i].m_numMasses;j++) + { + psb->m_clusters[i]->m_masses[j] = softBodyData->m_clusters[i].m_masses[j]; + } + psb->m_clusters[i]->m_framexform.deSerializeFloat(softBodyData->m_clusters[i].m_framexform); + psb->m_clusters[i]->m_idmass = softBodyData->m_clusters[i].m_idmass; + psb->m_clusters[i]->m_imass = softBodyData->m_clusters[i].m_imass; + psb->m_clusters[i]->m_invwi.deSerializeFloat(softBodyData->m_clusters[i].m_invwi); + psb->m_clusters[i]->m_ldamping = softBodyData->m_clusters[i].m_ldamping; + psb->m_clusters[i]->m_locii.deSerializeFloat(softBodyData->m_clusters[i].m_locii); + psb->m_clusters[i]->m_lv.deSerializeFloat(softBodyData->m_clusters[i].m_lv); + psb->m_clusters[i]->m_matching = softBodyData->m_clusters[i].m_matching; + psb->m_clusters[i]->m_maxSelfCollisionImpulse = 0;//softBodyData->m_clusters[i].m_maxSelfCollisionImpulse; + psb->m_clusters[i]->m_ndamping = softBodyData->m_clusters[i].m_ndamping; + psb->m_clusters[i]->m_ndimpulses = softBodyData->m_clusters[i].m_ndimpulses; + psb->m_clusters[i]->m_nvimpulses = softBodyData->m_clusters[i].m_nvimpulses; + psb->m_clusters[i]->m_selfCollisionImpulseFactor = softBodyData->m_clusters[i].m_selfCollisionImpulseFactor; + psb->m_clusters[i]->m_vimpulses[0].deSerializeFloat(softBodyData->m_clusters[i].m_vimpulses[0]); + psb->m_clusters[i]->m_vimpulses[1].deSerializeFloat(softBodyData->m_clusters[i].m_vimpulses[1]); + + } + //psb->initializeClusters(); + //psb->updateClusters(); + + } +#else + + psb->m_cfg.piterations = 2; + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ btSoftBody::fCollision::CL_RS; + //psb->setTotalMass(50,true); + //psb->generateClusters(64); + //psb->m_cfg.kDF=1; + psb->generateClusters(8); + + +#endif // + + m_softRigidWorld->getWorldInfo().m_dispatcher = m_softRigidWorld->getDispatcher(); + m_softRigidWorld->addSoftBody(psb); @@ -279,7 +436,7 @@ void SerializeDemo::initPhysics() #endif //DESERIALIZE_SOFT_BODIES // fileLoader->setVerboseMode(true); - if (!fileLoader->loadFile("testFile.bullet")) + if (!fileLoader->loadFile("../SoftDemo/testFile.bullet")) { ///create a few basic rigid bodies and save them to testFile.bullet btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); diff --git a/Demos/SoftDemo/SoftDemo.cpp b/Demos/SoftDemo/SoftDemo.cpp index 086c60f22..0ef09eded 100644 --- a/Demos/SoftDemo/SoftDemo.cpp +++ b/Demos/SoftDemo/SoftDemo.cpp @@ -52,8 +52,8 @@ static btRigidBody* staticBody = 0; static float waveheight = 5.f; const float TRIANGLE_SIZE=8.f; - -#define DEMO_MODE_TIMEOUT 500.f +unsigned current_demo=23; +#define DEMO_MODE_TIMEOUT 15.f //15 seconds for each demo #ifdef _DEBUG @@ -768,6 +768,7 @@ static void Init_Torus(SoftDemo* pdemo) psb->setTotalMass(50,true); pdemo->getSoftDynamicsWorld()->addSoftBody(psb); pdemo->m_cutting=true; + } @@ -1255,7 +1256,7 @@ static void Init_TetraCube(SoftDemo* pdemo) -unsigned current_demo=19; + /* Init */ void (*demofncs[])(SoftDemo*)= @@ -1329,10 +1330,6 @@ void SoftDemo::clientResetScene() delete obj; } - m_softBodyWorldInfo.m_sparsesdf.Reset(); - - current_demo=current_demo%(sizeof(demofncs)/sizeof(demofncs[0])); - //create ground object btTransform tr; @@ -1352,6 +1349,13 @@ void SoftDemo::clientResetScene() m_dynamicsWorld->addCollisionObject(newOb); + m_softBodyWorldInfo.m_sparsesdf.Reset(); + + current_demo=current_demo%(sizeof(demofncs)/sizeof(demofncs[0])); + + + + motorcontrol.goal = 0; motorcontrol.maxtorque = 0; diff --git a/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.cpp b/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.cpp index f031fa72d..1391888b1 100644 --- a/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.cpp +++ b/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.cpp @@ -65,6 +65,28 @@ void btBulletWorldImporter::deleteAllData() } m_allocatedNames.clear(); + + for (i=0;im_shapeType); diff --git a/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h b/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h index d04225087..9770a0193 100644 --- a/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h +++ b/Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h @@ -72,6 +72,12 @@ protected: btAlignedObjectArray m_allocatedTriangleIndexArrays; btAlignedObjectArray m_allocatedNames; + btAlignedObjectArray m_indexArrays; + btAlignedObjectArray m_shortIndexArrays; + btAlignedObjectArray m_floatVertexArrays; + btAlignedObjectArray m_doubleVertexArrays; + + btHashMap m_bvhMap; btHashMap m_timMap; @@ -83,9 +89,10 @@ protected: btHashMap m_shapeMap; btHashMap m_bodyMap; + //methods - btTriangleIndexVertexArray* createMeshInterface(btStridingMeshInterfaceData& meshData); + static btRigidBody& getFixedBody(); @@ -163,6 +170,7 @@ public: virtual btGImpactMeshShape* createGimpactShape(btStridingMeshInterface* trimesh); virtual class btConvexHullShape* createConvexHullShape(); virtual class btCompoundShape* createCompoundShape(); + virtual btTriangleIndexVertexArray* createMeshInterface(btStridingMeshInterfaceData& meshData); ///acceleration and connectivity structures virtual btOptimizedBvh* createOptimizedBvh(); diff --git a/src/BulletSoftBody/btSoftBody.cpp b/src/BulletSoftBody/btSoftBody.cpp index a822b1d52..15ef171af 100644 --- a/src/BulletSoftBody/btSoftBody.cpp +++ b/src/BulletSoftBody/btSoftBody.cpp @@ -24,6 +24,42 @@ btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo,int node_count, const btV :m_worldInfo(worldInfo) { /* Init */ + initDefaults(); + + /* Default material */ + Material* pm=appendMaterial(); + pm->m_kLST = 1; + pm->m_kAST = 1; + pm->m_kVST = 1; + pm->m_flags = fMaterial::Default; + + /* Nodes */ + const btScalar margin=getCollisionShape()->getMargin(); + m_nodes.resize(node_count); + for(int i=0,ni=node_count;i0?1/n.m_im:0; + n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n); + n.m_material= pm; + } + updateBounds(); + +} + +btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo) +:m_worldInfo(worldInfo) +{ + initDefaults(); +} + + +void btSoftBody::initDefaults() +{ m_internalType = CO_SOFT_BODY; m_cfg.aeromodel = eAeroModel::V_Point; m_cfg.kVCF = 1; @@ -64,35 +100,16 @@ btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo,int node_count, const btV m_bounds[1] = btVector3(0,0,0); m_worldTransform.setIdentity(); setSolver(eSolverPresets::Positions); - /* Default material */ - Material* pm=appendMaterial(); - pm->m_kLST = 1; - pm->m_kAST = 1; - pm->m_kVST = 1; - pm->m_flags = fMaterial::Default; + /* Collision shape */ ///for now, create a collision shape internally m_collisionShape = new btSoftBodyCollisionShape(this); m_collisionShape->setMargin(0.25); - /* Nodes */ - const btScalar margin=getCollisionShape()->getMargin(); - m_nodes.resize(node_count); - for(int i=0,ni=node_count;i0?1/n.m_im:0; - n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n); - n.m_material= pm; - } - updateBounds(); - + m_initialWorldTransform.setIdentity(); m_windVelocity = btVector3(0,0,0); + } // @@ -3016,6 +3033,7 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ btCollisionObject::serialize(&sbd->m_collisionObjectData, serializer); + btHashMap m_nodeIndexMap; sbd->m_numMaterials = m_materials.size(); sbd->m_materials = sbd->m_numMaterials? (SoftBodyMaterialData**) serializer->getUniquePointer((void*)&m_materials): 0; @@ -3068,6 +3086,7 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ m_nodes[i].m_x.serializeFloat(memPtr->m_position); m_nodes[i].m_q.serializeFloat(memPtr->m_previousPosition); m_nodes[i].m_v.serializeFloat(memPtr->m_velocity); + m_nodeIndexMap.insert(&m_nodes[i],i); } serializer->finalizeChunk(chunk,"SoftBodyNodeData",BT_SBNODE_CODE,(void*) &m_nodes[0]); } @@ -3167,7 +3186,7 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ } - + sbd->m_config.m_dynamicFriction = m_cfg.kDF; sbd->m_config.m_baumgarte = m_cfg.kVCF; sbd->m_config.m_pressure = m_cfg.kPR; sbd->m_config.m_aeroModel = this->m_cfg.aeromodel; @@ -3195,10 +3214,149 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ sbd->m_config.m_softKineticClusterImpulseSplit = m_cfg.kSK_SPLT_CL; sbd->m_config.m_softSoftClusterImpulseSplit = m_cfg.kSS_SPLT_CL; - - //not yet - sbd->m_pose = 0; + //pose for shape matching + { + sbd->m_pose = (SoftBodyPoseData*)serializer->getUniquePointer((void*)&m_pose); + int sz = sizeof(SoftBodyPoseData); + btChunk* chunk = serializer->allocate(sz,1); + SoftBodyPoseData* memPtr = (SoftBodyPoseData*)chunk->m_oldPtr; + + m_pose.m_aqq.serializeFloat(memPtr->m_aqq); + memPtr->m_bframe = m_pose.m_bframe; + memPtr->m_bvolume = m_pose.m_bvolume; + m_pose.m_com.serializeFloat(memPtr->m_com); + + memPtr->m_numPositions = m_pose.m_pos.size(); + memPtr->m_positions = memPtr->m_numPositions ? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_pose.m_pos[0]): 0; + if (memPtr->m_numPositions) + { + int numElem = memPtr->m_numPositions; + int sz = sizeof(btVector3Data); + btChunk* chunk = serializer->allocate(sz,numElem); + btVector3FloatData* memPtr = (btVector3FloatData*)chunk->m_oldPtr; + for (int i=0;ifinalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)&m_pose.m_pos[0]); + } + memPtr->m_restVolume = m_pose.m_volume; + m_pose.m_rot.serializeFloat(memPtr->m_rot); + m_pose.m_scl.serializeFloat(memPtr->m_scale); + + memPtr->m_numWeigts = m_pose.m_wgh.size(); + memPtr->m_weights = memPtr->m_numWeigts? (float*) serializer->getUniquePointer((void*) &m_pose.m_wgh[0]) : 0; + if (memPtr->m_numWeigts) + { + + int numElem = memPtr->m_numWeigts; + int sz = sizeof(float); + btChunk* chunk = serializer->allocate(sz,numElem); + float* memPtr = (float*) chunk->m_oldPtr; + for (int i=0;ifinalizeChunk(chunk,"float",BT_ARRAY_CODE,(void*)&m_pose.m_wgh[0]); + } + + serializer->finalizeChunk(chunk,"SoftBodyPoseData",BT_ARRAY_CODE,(void*)&m_pose); + } + + //clusters for convex-cluster collision detection + + sbd->m_numClusters = m_clusters.size(); + sbd->m_clusters = sbd->m_numClusters? (SoftBodyClusterData*) serializer->getUniquePointer((void*)&m_clusters[0]) : 0; + if (sbd->m_numClusters) + { + int numElem = sbd->m_numClusters; + int sz = sizeof(SoftBodyClusterData); + btChunk* chunk = serializer->allocate(sz,numElem); + SoftBodyClusterData* memPtr = (SoftBodyClusterData*) chunk->m_oldPtr; + for (int i=0;im_adamping= m_clusters[i]->m_adamping; + m_clusters[i]->m_av.serializeFloat(memPtr->m_av); + memPtr->m_clusterIndex = m_clusters[i]->m_clusterIndex; + memPtr->m_collide = m_clusters[i]->m_collide; + m_clusters[i]->m_com.serializeFloat(memPtr->m_com); + memPtr->m_containsAnchor = m_clusters[i]->m_containsAnchor; + m_clusters[i]->m_dimpulses[0].serializeFloat(memPtr->m_dimpulses[0]); + m_clusters[i]->m_dimpulses[1].serializeFloat(memPtr->m_dimpulses[1]); + m_clusters[i]->m_framexform.serializeFloat(memPtr->m_framexform); + memPtr->m_idmass = m_clusters[i]->m_idmass; + memPtr->m_imass = m_clusters[i]->m_imass; + m_clusters[i]->m_invwi.serializeFloat(memPtr->m_invwi); + memPtr->m_ldamping = m_clusters[i]->m_ldamping; + m_clusters[i]->m_locii.serializeFloat(memPtr->m_locii); + m_clusters[i]->m_lv.serializeFloat(memPtr->m_lv); + memPtr->m_matching = m_clusters[i]->m_matching; + memPtr->m_maxSelfCollisionImpulse = m_clusters[i]->m_maxSelfCollisionImpulse; + memPtr->m_ndamping = m_clusters[i]->m_ndamping; + memPtr->m_ldamping = m_clusters[i]->m_ldamping; + memPtr->m_adamping = m_clusters[i]->m_adamping; + memPtr->m_selfCollisionImpulseFactor = m_clusters[i]->m_selfCollisionImpulseFactor; + + memPtr->m_numFrameRefs = m_clusters[i]->m_framerefs.size(); + memPtr->m_numMasses = m_clusters[i]->m_masses.size(); + memPtr->m_numNodes = m_clusters[i]->m_nodes.size(); + + memPtr->m_nvimpulses = m_clusters[i]->m_nvimpulses; + m_clusters[i]->m_vimpulses[0].serializeFloat(memPtr->m_vimpulses[0]); + m_clusters[i]->m_vimpulses[1].serializeFloat(memPtr->m_vimpulses[1]); + memPtr->m_ndimpulses = m_clusters[i]->m_ndimpulses; + + + + memPtr->m_framerefs = memPtr->m_numFrameRefs? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_clusters[i]->m_framerefs[0]) : 0; + if (memPtr->m_framerefs) + { + int numElem = memPtr->m_numFrameRefs; + int sz = sizeof(btVector3FloatData); + btChunk* chunk = serializer->allocate(sz,numElem); + btVector3FloatData* memPtr = (btVector3FloatData*) chunk->m_oldPtr; + for (int j=0;jm_framerefs[j].serializeFloat(*memPtr); + } + serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_framerefs[0]); + } + + memPtr->m_masses = memPtr->m_numMasses ? (float*) serializer->getUniquePointer((void*)&m_clusters[i]->m_masses[0]): 0; + if (memPtr->m_masses) + { + int numElem = memPtr->m_numMasses; + int sz = sizeof(float); + btChunk* chunk = serializer->allocate(sz,numElem); + float* memPtr = (float*) chunk->m_oldPtr; + for (int j=0;jm_masses[j]; + } + serializer->finalizeChunk(chunk,"float",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_masses[0]); + } + + memPtr->m_nodeIndices = memPtr->m_numNodes ? (int*) serializer->getUniquePointer((void*) &m_clusters[i]->m_nodes) : 0; + if (memPtr->m_nodeIndices ) + { + int numElem = memPtr->m_numMasses; + int sz = sizeof(int); + btChunk* chunk = serializer->allocate(sz,numElem); + int* memPtr = (int*) chunk->m_oldPtr; + for (int j=0;jm_nodes[j]); + btAssert(indexPtr); + *memPtr = *indexPtr; + } + serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_nodes); + } + } + serializer->finalizeChunk(chunk,"SoftBodyClusterData",BT_ARRAY_CODE,(void*)&m_clusters[0]); + + } + return btSoftBodyDataName; } diff --git a/src/BulletSoftBody/btSoftBody.h b/src/BulletSoftBody/btSoftBody.h index 36492550e..fb9bb5a08 100644 --- a/src/BulletSoftBody/btSoftBody.h +++ b/src/BulletSoftBody/btSoftBody.h @@ -396,7 +396,7 @@ public: const btTransform& xform() const { static const btTransform identity=btTransform::getIdentity(); - if(m_collisionObject) return(m_collisionObject->getInterpolationWorldTransform()); + if(m_collisionObject) return(m_collisionObject->getWorldTransform()); if(m_soft) return(m_soft->m_framexform); return(identity); } @@ -665,9 +665,13 @@ public: // /* ctor */ - btSoftBody( btSoftBodyWorldInfo* worldInfo,int node_count, - const btVector3* x, - const btScalar* m); + btSoftBody( btSoftBodyWorldInfo* worldInfo,int node_count, const btVector3* x, const btScalar* m); + + /* ctor */ + btSoftBody( btSoftBodyWorldInfo* worldInfo); + + void initDefaults(); + /* dtor */ virtual ~btSoftBody(); /* Check for existing link */ diff --git a/src/BulletSoftBody/btSoftBodyData.h b/src/BulletSoftBody/btSoftBodyData.h index 01db6c390..d367830eb 100644 --- a/src/BulletSoftBody/btSoftBodyData.h +++ b/src/BulletSoftBody/btSoftBodyData.h @@ -121,18 +121,52 @@ struct SoftBodyPoseData btMatrix3x3FloatData m_rot; // Rotation btMatrix3x3FloatData m_scale; // Scale btMatrix3x3FloatData m_aqq; // Base scaling - btVector3FloatData m_positions; // Reference positions btVector3FloatData m_com; // COM + btVector3FloatData *m_positions; // Reference positions + float *m_weights; // Weights + int m_numPositions; + int m_numWeigts; + int m_bvolume; // Is valid int m_bframe; // Is frame float m_restVolume; // Rest volume - int m_numPositions; - float *m_weights; // Weights - int m_numWeigts; int m_pad; }; +struct SoftBodyClusterData +{ + btTransformFloatData m_framexform; + btMatrix3x3FloatData m_locii; + btMatrix3x3FloatData m_invwi; + btVector3FloatData m_com; + btVector3FloatData m_vimpulses[2]; + btVector3FloatData m_dimpulses[2]; + btVector3FloatData m_lv; + btVector3FloatData m_av; + + btVector3FloatData *m_framerefs; + int *m_nodeIndices; + float *m_masses; + + int m_numFrameRefs; + int m_numNodes; + int m_numMasses; + + float m_idmass; + float m_imass; + int m_nvimpulses; + int m_ndimpulses; + float m_ndamping; + float m_ldamping; + float m_adamping; + float m_matching; + float m_maxSelfCollisionImpulse; + float m_selfCollisionImpulseFactor; + int m_containsAnchor; + int m_collide; + int m_clusterIndex; +}; ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 struct btSoftBodyFloatData @@ -146,6 +180,7 @@ struct btSoftBodyFloatData SoftBodyFaceData *m_faces; SoftBodyTetraData *m_tetrahedra; SoftRigidAnchorData *m_anchors; + SoftBodyClusterData *m_clusters; int m_numMaterials; int m_numNodes; @@ -153,6 +188,8 @@ struct btSoftBodyFloatData int m_numFaces; int m_numTetrahedra; int m_numAnchors; + int m_numClusters; + int m_pad; SoftBodyConfigData m_config; }; diff --git a/src/BulletSoftBody/btSoftBodyInternals.h b/src/BulletSoftBody/btSoftBodyInternals.h index 2cb7744cb..04739e116 100644 --- a/src/BulletSoftBody/btSoftBodyInternals.h +++ b/src/BulletSoftBody/btSoftBodyInternals.h @@ -733,7 +733,7 @@ struct btSoftColliders btGjkEpaSolver2::sResults res; if(btGjkEpaSolver2::SignedDistance( &cshape,btTransform::getIdentity(), - rshape,m_colObj->getInterpolationWorldTransform(), + rshape,m_colObj->getWorldTransform(), btVector3(1,0,0),res)) { btSoftBody::CJoint joint; @@ -766,7 +766,7 @@ struct btSoftColliders btVector3 maxs; ATTRIBUTE_ALIGNED16(btDbvtVolume) volume; - colOb->getCollisionShape()->getAabb(colOb->getInterpolationWorldTransform(),mins,maxs); + colOb->getCollisionShape()->getAabb(colOb->getWorldTransform(),mins,maxs); volume=btDbvtVolume::FromMM(mins,maxs); volume.Expand(btVector3(1,1,1)*m_margin); ps->m_cdbvt.collideTV(ps->m_cdbvt.m_root,volume,*this); @@ -849,7 +849,7 @@ struct btSoftColliders const btScalar ms=ima+imb; if(ms>0) { - const btTransform& wtr=m_rigidBody?m_rigidBody->getInterpolationWorldTransform() : m_colObj1->getWorldTransform(); + const btTransform& wtr=m_rigidBody?m_rigidBody->getWorldTransform() : m_colObj1->getWorldTransform(); static const btMatrix3x3 iwiStatic(0,0,0,0,0,0,0,0,0); const btMatrix3x3& iwi=m_rigidBody?m_rigidBody->getInvInertiaTensorWorld() : iwiStatic; const btVector3 ra=n.m_x-wtr.getOrigin(); diff --git a/src/LinearMath/btSerializer.cpp b/src/LinearMath/btSerializer.cpp index 9133d48c6..49b179f7d 100644 --- a/src/LinearMath/btSerializer.cpp +++ b/src/LinearMath/btSerializer.cpp @@ -1,5 +1,5 @@ unsigned char sBulletDNAstr[]= { -83,68,78,65,78,65,77,69,-4,0,0,0,109,95,115,105,122,101,0,109, +83,68,78,65,78,65,77,69,23,1,0,0,109,95,115,105,122,101,0,109, 95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95, 99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111, 108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110, @@ -189,186 +189,211 @@ unsigned char sBulletDNAstr[]= { 105,116,105,111,110,73,116,101,114,97,116,105,111,110,115,0,109,95,100,114, 105,102,116,73,116,101,114,97,116,105,111,110,115,0,109,95,99,108,117,115, 116,101,114,73,116,101,114,97,116,105,111,110,115,0,109,95,114,111,116,0, -109,95,115,99,97,108,101,0,109,95,97,113,113,0,109,95,112,111,115,105, -116,105,111,110,115,0,109,95,99,111,109,0,109,95,98,118,111,108,117,109, -101,0,109,95,98,102,114,97,109,101,0,109,95,110,117,109,80,111,115,105, -116,105,111,110,115,0,42,109,95,119,101,105,103,104,116,115,0,109,95,110, -117,109,87,101,105,103,116,115,0,42,109,95,112,111,115,101,0,42,42,109, -95,109,97,116,101,114,105,97,108,115,0,42,109,95,110,111,100,101,115,0, -42,109,95,108,105,110,107,115,0,42,109,95,102,97,99,101,115,0,42,109, -95,116,101,116,114,97,104,101,100,114,97,0,42,109,95,97,110,99,104,111, -114,115,0,109,95,110,117,109,77,97,116,101,114,105,97,108,115,0,109,95, -110,117,109,78,111,100,101,115,0,109,95,110,117,109,76,105,110,107,115,0, -109,95,110,117,109,70,97,99,101,115,0,109,95,110,117,109,84,101,116,114, -97,104,101,100,114,97,0,109,95,110,117,109,65,110,99,104,111,114,115,0, -109,95,99,111,110,102,105,103,0,0,0,0,84,89,80,69,67,0,0,0, -99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104, -111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102, -108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100,0,80,111,105, -110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115,105,99,115,83, -121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98,116,86,101,99, -116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116,86,101,99,116, -111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116,77,97,116,114, -105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98,116,77,97,116, -114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97,0,98,116,84, -114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116,97,0,98,116, -84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68,97,116,97,0, -98,116,66,118,104,83,117,98,116,114,101,101,73,110,102,111,68,97,116,97, -0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78,111,100,101,70, -108,111,97,116,68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100, -66,118,104,78,111,100,101,68,111,117,98,108,101,68,97,116,97,0,98,116, -81,117,97,110,116,105,122,101,100,66,118,104,78,111,100,101,68,97,116,97, -0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,70,108,111,97,116, -68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,68, -111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111, -110,83,104,97,112,101,68,97,116,97,0,98,116,83,116,97,116,105,99,80, -108,97,110,101,83,104,97,112,101,68,97,116,97,0,98,116,67,111,110,118, -101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68,97,116,97,0, -98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100,105,117,115,0, -98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97,112,101,68,97, -116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116, -83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116, -83,104,111,114,116,73,110,116,73,110,100,101,120,84,114,105,112,108,101,116, -68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68,97,116,97,0, -98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110,116,101,114,102, -97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,101,77,101, -115,104,83,104,97,112,101,68,97,116,97,0,98,116,84,114,105,97,110,103, -108,101,73,110,102,111,77,97,112,68,97,116,97,0,98,116,67,111,109,112, -111,117,110,100,83,104,97,112,101,67,104,105,108,100,68,97,116,97,0,98, -116,67,111,109,112,111,117,110,100,83,104,97,112,101,68,97,116,97,0,98, -116,67,121,108,105,110,100,101,114,83,104,97,112,101,68,97,116,97,0,98, -116,67,97,112,115,117,108,101,83,104,97,112,101,68,97,116,97,0,98,116, -84,114,105,97,110,103,108,101,73,110,102,111,68,97,116,97,0,98,116,71, -73,109,112,97,99,116,77,101,115,104,83,104,97,112,101,68,97,116,97,0, -98,116,67,111,110,118,101,120,72,117,108,108,83,104,97,112,101,68,97,116, -97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106,101,99,116,68, -111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111, -110,79,98,106,101,99,116,70,108,111,97,116,68,97,116,97,0,98,116,82, -105,103,105,100,66,111,100,121,70,108,111,97,116,68,97,116,97,0,98,116, -82,105,103,105,100,66,111,100,121,68,111,117,98,108,101,68,97,116,97,0, -98,116,67,111,110,115,116,114,97,105,110,116,73,110,102,111,49,0,98,116, -84,121,112,101,100,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0, -98,116,82,105,103,105,100,66,111,100,121,68,97,116,97,0,98,116,80,111, -105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,116,70, -108,111,97,116,68,97,116,97,0,98,116,80,111,105,110,116,50,80,111,105, -110,116,67,111,110,115,116,114,97,105,110,116,68,111,117,98,108,101,68,97, -116,97,0,98,116,72,105,110,103,101,67,111,110,115,116,114,97,105,110,116, -68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,111, -110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116,97,0,98,116, -67,111,110,101,84,119,105,115,116,67,111,110,115,116,114,97,105,110,116,68, -97,116,97,0,98,116,71,101,110,101,114,105,99,54,68,111,102,67,111,110, -115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108,105,100,101,114, -67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,83,111,102,116,66, -111,100,121,77,97,116,101,114,105,97,108,68,97,116,97,0,83,111,102,116, -66,111,100,121,78,111,100,101,68,97,116,97,0,83,111,102,116,66,111,100, -121,76,105,110,107,68,97,116,97,0,83,111,102,116,66,111,100,121,70,97, -99,101,68,97,116,97,0,83,111,102,116,66,111,100,121,84,101,116,114,97, -68,97,116,97,0,83,111,102,116,82,105,103,105,100,65,110,99,104,111,114, -68,97,116,97,0,83,111,102,116,66,111,100,121,67,111,110,102,105,103,68, -97,116,97,0,83,111,102,116,66,111,100,121,80,111,115,101,68,97,116,97, -0,98,116,83,111,102,116,66,111,100,121,70,108,111,97,116,68,97,116,97, -0,0,0,0,84,76,69,78,1,0,1,0,2,0,2,0,4,0,4,0, -4,0,4,0,8,0,0,0,12,0,36,0,8,0,16,0,32,0,48,0, -96,0,64,0,-128,0,20,0,48,0,80,0,16,0,84,0,-124,0,12,0, -52,0,52,0,20,0,64,0,4,0,4,0,8,0,28,0,28,0,60,0, -56,0,76,0,24,0,60,0,60,0,16,0,64,0,68,0,-56,1,-8,0, --32,1,-104,3,8,0,44,0,0,0,76,0,108,0,84,1,-44,0,-52,0, --12,0,-60,0,16,0,100,0,52,0,36,0,100,0,92,0,104,0,-52,0, --108,1,0,0,83,84,82,67,56,0,0,0,10,0,3,0,4,0,0,0, -4,0,1,0,9,0,2,0,11,0,3,0,10,0,3,0,10,0,4,0, -10,0,5,0,12,0,2,0,9,0,6,0,9,0,7,0,13,0,1,0, -7,0,8,0,14,0,1,0,8,0,8,0,15,0,1,0,13,0,9,0, -16,0,1,0,14,0,9,0,17,0,2,0,15,0,10,0,13,0,11,0, -18,0,2,0,16,0,10,0,14,0,11,0,19,0,4,0,4,0,12,0, -4,0,13,0,2,0,14,0,2,0,15,0,20,0,6,0,13,0,16,0, -13,0,17,0,4,0,18,0,4,0,19,0,4,0,20,0,0,0,21,0, -21,0,6,0,14,0,16,0,14,0,17,0,4,0,18,0,4,0,19,0, -4,0,20,0,0,0,21,0,22,0,3,0,2,0,14,0,2,0,15,0, -4,0,22,0,23,0,12,0,13,0,23,0,13,0,24,0,13,0,25,0, -4,0,26,0,4,0,27,0,4,0,28,0,4,0,29,0,20,0,30,0, -22,0,31,0,19,0,32,0,4,0,33,0,4,0,34,0,24,0,12,0, -14,0,23,0,14,0,24,0,14,0,25,0,4,0,26,0,4,0,27,0, -4,0,28,0,4,0,29,0,21,0,30,0,22,0,31,0,4,0,33,0, -4,0,34,0,19,0,32,0,25,0,3,0,0,0,35,0,4,0,36,0, -0,0,37,0,26,0,5,0,25,0,38,0,13,0,39,0,13,0,40,0, -7,0,41,0,0,0,21,0,27,0,5,0,25,0,38,0,13,0,39,0, -13,0,42,0,7,0,43,0,4,0,44,0,28,0,2,0,13,0,45,0, -7,0,46,0,29,0,4,0,27,0,47,0,28,0,48,0,4,0,49,0, -0,0,37,0,30,0,1,0,4,0,50,0,31,0,2,0,2,0,50,0, -0,0,51,0,32,0,2,0,2,0,52,0,0,0,51,0,33,0,7,0, -13,0,53,0,14,0,54,0,30,0,55,0,32,0,56,0,31,0,57,0, -4,0,58,0,4,0,59,0,34,0,4,0,33,0,60,0,13,0,61,0, -4,0,62,0,0,0,37,0,35,0,7,0,25,0,38,0,34,0,63,0, -23,0,64,0,24,0,65,0,36,0,66,0,7,0,43,0,0,0,67,0, -37,0,4,0,17,0,68,0,25,0,69,0,4,0,70,0,7,0,71,0, -38,0,4,0,25,0,38,0,37,0,72,0,4,0,73,0,7,0,43,0, -39,0,3,0,27,0,47,0,4,0,74,0,0,0,37,0,40,0,3,0, -27,0,47,0,4,0,74,0,0,0,37,0,41,0,4,0,4,0,75,0, -7,0,76,0,7,0,77,0,7,0,78,0,36,0,14,0,4,0,79,0, -4,0,80,0,41,0,81,0,4,0,82,0,7,0,83,0,7,0,84,0, -7,0,85,0,7,0,86,0,7,0,87,0,4,0,88,0,4,0,89,0, -4,0,90,0,4,0,91,0,0,0,37,0,42,0,5,0,25,0,38,0, -34,0,63,0,13,0,39,0,7,0,43,0,4,0,92,0,43,0,5,0, -27,0,47,0,13,0,93,0,14,0,94,0,4,0,95,0,0,0,96,0, -44,0,24,0,9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0, -18,0,100,0,18,0,101,0,14,0,102,0,14,0,103,0,14,0,104,0, -8,0,105,0,8,0,106,0,8,0,107,0,8,0,108,0,8,0,109,0, -8,0,110,0,8,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0, -4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0,0,0,37,0, -45,0,23,0,9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0, -17,0,100,0,17,0,101,0,13,0,102,0,13,0,103,0,13,0,104,0, -7,0,105,0,7,0,106,0,7,0,107,0,7,0,108,0,7,0,109,0, -7,0,110,0,7,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0, -4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0,46,0,21,0, -45,0,119,0,15,0,120,0,13,0,121,0,13,0,122,0,13,0,123,0, -13,0,124,0,13,0,125,0,13,0,126,0,13,0,127,0,13,0,-128,0, -13,0,-127,0,7,0,-126,0,7,0,-125,0,7,0,-124,0,7,0,-123,0, -7,0,-122,0,7,0,-121,0,7,0,-120,0,7,0,-119,0,7,0,-118,0, -4,0,-117,0,47,0,22,0,44,0,119,0,16,0,120,0,14,0,121,0, -14,0,122,0,14,0,123,0,14,0,124,0,14,0,125,0,14,0,126,0, -14,0,127,0,14,0,-128,0,14,0,-127,0,8,0,-126,0,8,0,-125,0, -8,0,-124,0,8,0,-123,0,8,0,-122,0,8,0,-121,0,8,0,-120,0, -8,0,-119,0,8,0,-118,0,4,0,-117,0,0,0,37,0,48,0,2,0, -4,0,-116,0,4,0,-115,0,49,0,11,0,50,0,-114,0,50,0,-113,0, -0,0,35,0,4,0,-112,0,4,0,-111,0,4,0,-110,0,4,0,-109,0, -7,0,-108,0,7,0,-107,0,4,0,-106,0,0,0,-105,0,51,0,3,0, -49,0,-104,0,13,0,-103,0,13,0,-102,0,52,0,3,0,49,0,-104,0, -14,0,-103,0,14,0,-102,0,53,0,13,0,49,0,-104,0,18,0,-101,0, -18,0,-100,0,4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0, +109,95,115,99,97,108,101,0,109,95,97,113,113,0,109,95,99,111,109,0, +42,109,95,112,111,115,105,116,105,111,110,115,0,42,109,95,119,101,105,103, +104,116,115,0,109,95,110,117,109,80,111,115,105,116,105,111,110,115,0,109, +95,110,117,109,87,101,105,103,116,115,0,109,95,98,118,111,108,117,109,101, +0,109,95,98,102,114,97,109,101,0,109,95,102,114,97,109,101,120,102,111, +114,109,0,109,95,108,111,99,105,105,0,109,95,105,110,118,119,105,0,109, +95,118,105,109,112,117,108,115,101,115,91,50,93,0,109,95,100,105,109,112, +117,108,115,101,115,91,50,93,0,109,95,108,118,0,109,95,97,118,0,42, +109,95,102,114,97,109,101,114,101,102,115,0,42,109,95,110,111,100,101,73, +110,100,105,99,101,115,0,42,109,95,109,97,115,115,101,115,0,109,95,110, +117,109,70,114,97,109,101,82,101,102,115,0,109,95,110,117,109,78,111,100, +101,115,0,109,95,110,117,109,77,97,115,115,101,115,0,109,95,105,100,109, +97,115,115,0,109,95,105,109,97,115,115,0,109,95,110,118,105,109,112,117, +108,115,101,115,0,109,95,110,100,105,109,112,117,108,115,101,115,0,109,95, +110,100,97,109,112,105,110,103,0,109,95,108,100,97,109,112,105,110,103,0, +109,95,97,100,97,109,112,105,110,103,0,109,95,109,97,116,99,104,105,110, +103,0,109,95,109,97,120,83,101,108,102,67,111,108,108,105,115,105,111,110, +73,109,112,117,108,115,101,0,109,95,115,101,108,102,67,111,108,108,105,115, +105,111,110,73,109,112,117,108,115,101,70,97,99,116,111,114,0,109,95,99, +111,110,116,97,105,110,115,65,110,99,104,111,114,0,109,95,99,111,108,108, +105,100,101,0,109,95,99,108,117,115,116,101,114,73,110,100,101,120,0,42, +109,95,112,111,115,101,0,42,42,109,95,109,97,116,101,114,105,97,108,115, +0,42,109,95,110,111,100,101,115,0,42,109,95,108,105,110,107,115,0,42, +109,95,102,97,99,101,115,0,42,109,95,116,101,116,114,97,104,101,100,114, +97,0,42,109,95,97,110,99,104,111,114,115,0,42,109,95,99,108,117,115, +116,101,114,115,0,109,95,110,117,109,77,97,116,101,114,105,97,108,115,0, +109,95,110,117,109,76,105,110,107,115,0,109,95,110,117,109,70,97,99,101, +115,0,109,95,110,117,109,84,101,116,114,97,104,101,100,114,97,0,109,95, +110,117,109,65,110,99,104,111,114,115,0,109,95,110,117,109,67,108,117,115, +116,101,114,115,0,109,95,99,111,110,102,105,103,0,0,0,84,89,80,69, +68,0,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116, +0,117,115,104,111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111, +110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100, +0,80,111,105,110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115, +105,99,115,83,121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98, +116,86,101,99,116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116, +86,101,99,116,111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116, +77,97,116,114,105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98, +116,77,97,116,114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97, +0,98,116,84,114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116, +97,0,98,116,84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68, +97,116,97,0,98,116,66,118,104,83,117,98,116,114,101,101,73,110,102,111, +68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78, +111,100,101,70,108,111,97,116,68,97,116,97,0,98,116,79,112,116,105,109, +105,122,101,100,66,118,104,78,111,100,101,68,111,117,98,108,101,68,97,116, +97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,78,111,100,101, +68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,70, +108,111,97,116,68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100, +66,118,104,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,83,104,97,112,101,68,97,116,97,0,98,116,83,116,97, +116,105,99,80,108,97,110,101,83,104,97,112,101,68,97,116,97,0,98,116, +67,111,110,118,101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68, +97,116,97,0,98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100, +105,117,115,0,98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97, +112,101,68,97,116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116, +97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116, +97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,84,114,105, +112,108,101,116,68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68, +97,116,97,0,98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110, +116,101,114,102,97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103, +108,101,77,101,115,104,83,104,97,112,101,68,97,116,97,0,98,116,84,114, +105,97,110,103,108,101,73,110,102,111,77,97,112,68,97,116,97,0,98,116, +67,111,109,112,111,117,110,100,83,104,97,112,101,67,104,105,108,100,68,97, +116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,97,112,101,68,97, +116,97,0,98,116,67,121,108,105,110,100,101,114,83,104,97,112,101,68,97, +116,97,0,98,116,67,97,112,115,117,108,101,83,104,97,112,101,68,97,116, +97,0,98,116,84,114,105,97,110,103,108,101,73,110,102,111,68,97,116,97, +0,98,116,71,73,109,112,97,99,116,77,101,115,104,83,104,97,112,101,68, +97,116,97,0,98,116,67,111,110,118,101,120,72,117,108,108,83,104,97,112, +101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106, +101,99,116,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,79,98,106,101,99,116,70,108,111,97,116,68,97,116,97, +0,98,116,82,105,103,105,100,66,111,100,121,70,108,111,97,116,68,97,116, +97,0,98,116,82,105,103,105,100,66,111,100,121,68,111,117,98,108,101,68, +97,116,97,0,98,116,67,111,110,115,116,114,97,105,110,116,73,110,102,111, +49,0,98,116,84,121,112,101,100,67,111,110,115,116,114,97,105,110,116,68, +97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,68,97,116,97,0, +98,116,80,111,105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97, +105,110,116,70,108,111,97,116,68,97,116,97,0,98,116,80,111,105,110,116, +50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,116,68,111,117,98, +108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,111,110,115,116,114, +97,105,110,116,68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110, +103,101,67,111,110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116, +97,0,98,116,67,111,110,101,84,119,105,115,116,67,111,110,115,116,114,97, +105,110,116,68,97,116,97,0,98,116,71,101,110,101,114,105,99,54,68,111, +102,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108, +105,100,101,114,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,83, +111,102,116,66,111,100,121,77,97,116,101,114,105,97,108,68,97,116,97,0, +83,111,102,116,66,111,100,121,78,111,100,101,68,97,116,97,0,83,111,102, +116,66,111,100,121,76,105,110,107,68,97,116,97,0,83,111,102,116,66,111, +100,121,70,97,99,101,68,97,116,97,0,83,111,102,116,66,111,100,121,84, +101,116,114,97,68,97,116,97,0,83,111,102,116,82,105,103,105,100,65,110, +99,104,111,114,68,97,116,97,0,83,111,102,116,66,111,100,121,67,111,110, +102,105,103,68,97,116,97,0,83,111,102,116,66,111,100,121,80,111,115,101, +68,97,116,97,0,83,111,102,116,66,111,100,121,67,108,117,115,116,101,114, +68,97,116,97,0,98,116,83,111,102,116,66,111,100,121,70,108,111,97,116, +68,97,116,97,0,0,0,0,84,76,69,78,1,0,1,0,2,0,2,0, +4,0,4,0,4,0,4,0,8,0,0,0,12,0,36,0,8,0,16,0, +32,0,48,0,96,0,64,0,-128,0,20,0,48,0,80,0,16,0,84,0, +-124,0,12,0,52,0,52,0,20,0,64,0,4,0,4,0,8,0,28,0, +28,0,60,0,56,0,76,0,24,0,60,0,60,0,16,0,64,0,68,0, +-56,1,-8,0,-32,1,-104,3,8,0,44,0,0,0,76,0,108,0,84,1, +-44,0,-52,0,-12,0,-60,0,16,0,100,0,52,0,36,0,100,0,92,0, +104,0,-64,0,92,1,-96,1,83,84,82,67,57,0,0,0,10,0,3,0, +4,0,0,0,4,0,1,0,9,0,2,0,11,0,3,0,10,0,3,0, +10,0,4,0,10,0,5,0,12,0,2,0,9,0,6,0,9,0,7,0, +13,0,1,0,7,0,8,0,14,0,1,0,8,0,8,0,15,0,1,0, +13,0,9,0,16,0,1,0,14,0,9,0,17,0,2,0,15,0,10,0, +13,0,11,0,18,0,2,0,16,0,10,0,14,0,11,0,19,0,4,0, +4,0,12,0,4,0,13,0,2,0,14,0,2,0,15,0,20,0,6,0, +13,0,16,0,13,0,17,0,4,0,18,0,4,0,19,0,4,0,20,0, +0,0,21,0,21,0,6,0,14,0,16,0,14,0,17,0,4,0,18,0, +4,0,19,0,4,0,20,0,0,0,21,0,22,0,3,0,2,0,14,0, +2,0,15,0,4,0,22,0,23,0,12,0,13,0,23,0,13,0,24,0, +13,0,25,0,4,0,26,0,4,0,27,0,4,0,28,0,4,0,29,0, +20,0,30,0,22,0,31,0,19,0,32,0,4,0,33,0,4,0,34,0, +24,0,12,0,14,0,23,0,14,0,24,0,14,0,25,0,4,0,26,0, +4,0,27,0,4,0,28,0,4,0,29,0,21,0,30,0,22,0,31,0, +4,0,33,0,4,0,34,0,19,0,32,0,25,0,3,0,0,0,35,0, +4,0,36,0,0,0,37,0,26,0,5,0,25,0,38,0,13,0,39,0, +13,0,40,0,7,0,41,0,0,0,21,0,27,0,5,0,25,0,38,0, +13,0,39,0,13,0,42,0,7,0,43,0,4,0,44,0,28,0,2,0, +13,0,45,0,7,0,46,0,29,0,4,0,27,0,47,0,28,0,48,0, +4,0,49,0,0,0,37,0,30,0,1,0,4,0,50,0,31,0,2,0, +2,0,50,0,0,0,51,0,32,0,2,0,2,0,52,0,0,0,51,0, +33,0,7,0,13,0,53,0,14,0,54,0,30,0,55,0,32,0,56,0, +31,0,57,0,4,0,58,0,4,0,59,0,34,0,4,0,33,0,60,0, +13,0,61,0,4,0,62,0,0,0,37,0,35,0,7,0,25,0,38,0, +34,0,63,0,23,0,64,0,24,0,65,0,36,0,66,0,7,0,43,0, +0,0,67,0,37,0,4,0,17,0,68,0,25,0,69,0,4,0,70,0, +7,0,71,0,38,0,4,0,25,0,38,0,37,0,72,0,4,0,73,0, +7,0,43,0,39,0,3,0,27,0,47,0,4,0,74,0,0,0,37,0, +40,0,3,0,27,0,47,0,4,0,74,0,0,0,37,0,41,0,4,0, +4,0,75,0,7,0,76,0,7,0,77,0,7,0,78,0,36,0,14,0, +4,0,79,0,4,0,80,0,41,0,81,0,4,0,82,0,7,0,83,0, +7,0,84,0,7,0,85,0,7,0,86,0,7,0,87,0,4,0,88,0, +4,0,89,0,4,0,90,0,4,0,91,0,0,0,37,0,42,0,5,0, +25,0,38,0,34,0,63,0,13,0,39,0,7,0,43,0,4,0,92,0, +43,0,5,0,27,0,47,0,13,0,93,0,14,0,94,0,4,0,95,0, +0,0,96,0,44,0,24,0,9,0,97,0,9,0,98,0,25,0,99,0, +0,0,35,0,18,0,100,0,18,0,101,0,14,0,102,0,14,0,103,0, +14,0,104,0,8,0,105,0,8,0,106,0,8,0,107,0,8,0,108,0, +8,0,109,0,8,0,110,0,8,0,111,0,4,0,112,0,4,0,113,0, +4,0,114,0,4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0, +0,0,37,0,45,0,23,0,9,0,97,0,9,0,98,0,25,0,99,0, +0,0,35,0,17,0,100,0,17,0,101,0,13,0,102,0,13,0,103,0, +13,0,104,0,7,0,105,0,7,0,106,0,7,0,107,0,7,0,108,0, +7,0,109,0,7,0,110,0,7,0,111,0,4,0,112,0,4,0,113,0, +4,0,114,0,4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0, +46,0,21,0,45,0,119,0,15,0,120,0,13,0,121,0,13,0,122,0, +13,0,123,0,13,0,124,0,13,0,125,0,13,0,126,0,13,0,127,0, +13,0,-128,0,13,0,-127,0,7,0,-126,0,7,0,-125,0,7,0,-124,0, +7,0,-123,0,7,0,-122,0,7,0,-121,0,7,0,-120,0,7,0,-119,0, +7,0,-118,0,4,0,-117,0,47,0,22,0,44,0,119,0,16,0,120,0, +14,0,121,0,14,0,122,0,14,0,123,0,14,0,124,0,14,0,125,0, +14,0,126,0,14,0,127,0,14,0,-128,0,14,0,-127,0,8,0,-126,0, +8,0,-125,0,8,0,-124,0,8,0,-123,0,8,0,-122,0,8,0,-121,0, +8,0,-120,0,8,0,-119,0,8,0,-118,0,4,0,-117,0,0,0,37,0, +48,0,2,0,4,0,-116,0,4,0,-115,0,49,0,11,0,50,0,-114,0, +50,0,-113,0,0,0,35,0,4,0,-112,0,4,0,-111,0,4,0,-110,0, +4,0,-109,0,7,0,-108,0,7,0,-107,0,4,0,-106,0,0,0,-105,0, +51,0,3,0,49,0,-104,0,13,0,-103,0,13,0,-102,0,52,0,3,0, +49,0,-104,0,14,0,-103,0,14,0,-102,0,53,0,13,0,49,0,-104,0, +18,0,-101,0,18,0,-100,0,4,0,-99,0,4,0,-98,0,4,0,-97,0, +7,0,-96,0,7,0,-95,0,7,0,-94,0,7,0,-93,0,7,0,-92,0, +7,0,-91,0,7,0,-90,0,54,0,13,0,49,0,-104,0,17,0,-101,0, +17,0,-100,0,4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0, 7,0,-95,0,7,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0, -7,0,-90,0,54,0,13,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, -4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0, -7,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0, -55,0,11,0,49,0,-104,0,17,0,-101,0,17,0,-100,0,7,0,-89,0, -7,0,-88,0,7,0,-87,0,7,0,-92,0,7,0,-91,0,7,0,-90,0, -7,0,-86,0,0,0,21,0,56,0,9,0,49,0,-104,0,17,0,-101,0, -17,0,-100,0,13,0,-85,0,13,0,-84,0,13,0,-83,0,13,0,-82,0, -4,0,-81,0,4,0,-80,0,57,0,9,0,49,0,-104,0,17,0,-101,0, -17,0,-100,0,7,0,-85,0,7,0,-84,0,7,0,-83,0,7,0,-82,0, -4,0,-81,0,4,0,-80,0,58,0,4,0,7,0,-79,0,7,0,-78,0, -7,0,-77,0,4,0,75,0,59,0,10,0,58,0,-76,0,13,0,-75,0, -13,0,-74,0,13,0,-73,0,13,0,-72,0,13,0,-71,0,7,0,-126,0, -7,0,-70,0,4,0,-69,0,4,0,-68,0,60,0,9,0,58,0,-76,0, -4,0,-67,0,13,0,-66,0,7,0,-65,0,4,0,-64,0,7,0,-63,0, -7,0,-62,0,7,0,-61,0,4,0,-68,0,61,0,4,0,13,0,-71,0, -58,0,-76,0,4,0,-60,0,7,0,-59,0,62,0,7,0,13,0,-58,0, -58,0,-76,0,4,0,-57,0,7,0,-56,0,7,0,-62,0,7,0,-61,0, -4,0,-68,0,63,0,6,0,15,0,-63,0,13,0,-62,0,13,0,-55,0, -50,0,-54,0,4,0,-53,0,7,0,-61,0,64,0,26,0,4,0,-52,0, -7,0,-51,0,7,0,-86,0,7,0,-50,0,7,0,-49,0,7,0,-48,0, -7,0,-47,0,7,0,-46,0,7,0,-45,0,7,0,-44,0,7,0,-43,0, -7,0,-42,0,7,0,-41,0,7,0,-40,0,7,0,-39,0,7,0,-38,0, -7,0,-37,0,7,0,-36,0,7,0,-35,0,7,0,-34,0,7,0,-33,0, -4,0,-32,0,4,0,-31,0,4,0,-30,0,4,0,-29,0,4,0,113,0, -65,0,12,0,15,0,-28,0,15,0,-27,0,15,0,-26,0,13,0,-25,0, -13,0,-24,0,4,0,-23,0,4,0,-22,0,7,0,-56,0,4,0,-21,0, -7,0,-20,0,4,0,-19,0,4,0,-68,0,66,0,15,0,45,0,119,0, -65,0,-18,0,58,0,-17,0,59,0,-16,0,60,0,-15,0,61,0,-14,0, -62,0,-13,0,63,0,-12,0,4,0,-11,0,4,0,-10,0,4,0,-9,0, -4,0,-8,0,4,0,-7,0,4,0,-6,0,64,0,-5,0,}; +7,0,-90,0,55,0,11,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, +7,0,-89,0,7,0,-88,0,7,0,-87,0,7,0,-92,0,7,0,-91,0, +7,0,-90,0,7,0,-86,0,0,0,21,0,56,0,9,0,49,0,-104,0, +17,0,-101,0,17,0,-100,0,13,0,-85,0,13,0,-84,0,13,0,-83,0, +13,0,-82,0,4,0,-81,0,4,0,-80,0,57,0,9,0,49,0,-104,0, +17,0,-101,0,17,0,-100,0,7,0,-85,0,7,0,-84,0,7,0,-83,0, +7,0,-82,0,4,0,-81,0,4,0,-80,0,58,0,4,0,7,0,-79,0, +7,0,-78,0,7,0,-77,0,4,0,75,0,59,0,10,0,58,0,-76,0, +13,0,-75,0,13,0,-74,0,13,0,-73,0,13,0,-72,0,13,0,-71,0, +7,0,-126,0,7,0,-70,0,4,0,-69,0,4,0,-68,0,60,0,9,0, +58,0,-76,0,4,0,-67,0,13,0,-66,0,7,0,-65,0,4,0,-64,0, +7,0,-63,0,7,0,-62,0,7,0,-61,0,4,0,-68,0,61,0,4,0, +13,0,-71,0,58,0,-76,0,4,0,-60,0,7,0,-59,0,62,0,7,0, +13,0,-58,0,58,0,-76,0,4,0,-57,0,7,0,-56,0,7,0,-62,0, +7,0,-61,0,4,0,-68,0,63,0,6,0,15,0,-63,0,13,0,-62,0, +13,0,-55,0,50,0,-54,0,4,0,-53,0,7,0,-61,0,64,0,26,0, +4,0,-52,0,7,0,-51,0,7,0,-86,0,7,0,-50,0,7,0,-49,0, +7,0,-48,0,7,0,-47,0,7,0,-46,0,7,0,-45,0,7,0,-44,0, +7,0,-43,0,7,0,-42,0,7,0,-41,0,7,0,-40,0,7,0,-39,0, +7,0,-38,0,7,0,-37,0,7,0,-36,0,7,0,-35,0,7,0,-34,0, +7,0,-33,0,4,0,-32,0,4,0,-31,0,4,0,-30,0,4,0,-29,0, +4,0,113,0,65,0,12,0,15,0,-28,0,15,0,-27,0,15,0,-26,0, +13,0,-25,0,13,0,-24,0,7,0,-23,0,4,0,-22,0,4,0,-21,0, +4,0,-20,0,4,0,-19,0,7,0,-56,0,4,0,-68,0,66,0,27,0, +17,0,-18,0,15,0,-17,0,15,0,-16,0,13,0,-25,0,13,0,-15,0, +13,0,-14,0,13,0,-13,0,13,0,-12,0,13,0,-11,0,4,0,-10,0, +7,0,-9,0,4,0,-8,0,4,0,-7,0,4,0,-6,0,7,0,-5,0, +7,0,-4,0,4,0,-3,0,4,0,-2,0,7,0,-1,0,7,0,0,1, +7,0,1,1,7,0,2,1,7,0,3,1,7,0,4,1,4,0,5,1, +4,0,6,1,4,0,7,1,67,0,18,0,45,0,119,0,65,0,8,1, +58,0,9,1,59,0,10,1,60,0,11,1,61,0,12,1,62,0,13,1, +63,0,14,1,66,0,15,1,4,0,16,1,4,0,-7,0,4,0,17,1, +4,0,18,1,4,0,19,1,4,0,20,1,4,0,21,1,4,0,-68,0, +64,0,22,1,}; int sBulletDNAlen= sizeof(sBulletDNAstr); unsigned char sBulletDNAstr64[]= { -83,68,78,65,78,65,77,69,-4,0,0,0,109,95,115,105,122,101,0,109, +83,68,78,65,78,65,77,69,23,1,0,0,109,95,115,105,122,101,0,109, 95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95, 99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111, 108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110, @@ -558,181 +583,206 @@ unsigned char sBulletDNAstr64[]= { 105,116,105,111,110,73,116,101,114,97,116,105,111,110,115,0,109,95,100,114, 105,102,116,73,116,101,114,97,116,105,111,110,115,0,109,95,99,108,117,115, 116,101,114,73,116,101,114,97,116,105,111,110,115,0,109,95,114,111,116,0, -109,95,115,99,97,108,101,0,109,95,97,113,113,0,109,95,112,111,115,105, -116,105,111,110,115,0,109,95,99,111,109,0,109,95,98,118,111,108,117,109, -101,0,109,95,98,102,114,97,109,101,0,109,95,110,117,109,80,111,115,105, -116,105,111,110,115,0,42,109,95,119,101,105,103,104,116,115,0,109,95,110, -117,109,87,101,105,103,116,115,0,42,109,95,112,111,115,101,0,42,42,109, -95,109,97,116,101,114,105,97,108,115,0,42,109,95,110,111,100,101,115,0, -42,109,95,108,105,110,107,115,0,42,109,95,102,97,99,101,115,0,42,109, -95,116,101,116,114,97,104,101,100,114,97,0,42,109,95,97,110,99,104,111, -114,115,0,109,95,110,117,109,77,97,116,101,114,105,97,108,115,0,109,95, -110,117,109,78,111,100,101,115,0,109,95,110,117,109,76,105,110,107,115,0, -109,95,110,117,109,70,97,99,101,115,0,109,95,110,117,109,84,101,116,114, -97,104,101,100,114,97,0,109,95,110,117,109,65,110,99,104,111,114,115,0, -109,95,99,111,110,102,105,103,0,0,0,0,84,89,80,69,67,0,0,0, -99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104, -111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102, -108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100,0,80,111,105, -110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115,105,99,115,83, -121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98,116,86,101,99, -116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116,86,101,99,116, -111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116,77,97,116,114, -105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98,116,77,97,116, -114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97,0,98,116,84, -114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116,97,0,98,116, -84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68,97,116,97,0, -98,116,66,118,104,83,117,98,116,114,101,101,73,110,102,111,68,97,116,97, -0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78,111,100,101,70, -108,111,97,116,68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100, -66,118,104,78,111,100,101,68,111,117,98,108,101,68,97,116,97,0,98,116, -81,117,97,110,116,105,122,101,100,66,118,104,78,111,100,101,68,97,116,97, -0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,70,108,111,97,116, -68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,68, -111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111, -110,83,104,97,112,101,68,97,116,97,0,98,116,83,116,97,116,105,99,80, -108,97,110,101,83,104,97,112,101,68,97,116,97,0,98,116,67,111,110,118, -101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68,97,116,97,0, -98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100,105,117,115,0, -98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97,112,101,68,97, -116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116, -83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116, -83,104,111,114,116,73,110,116,73,110,100,101,120,84,114,105,112,108,101,116, -68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68,97,116,97,0, -98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110,116,101,114,102, -97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,101,77,101, -115,104,83,104,97,112,101,68,97,116,97,0,98,116,84,114,105,97,110,103, -108,101,73,110,102,111,77,97,112,68,97,116,97,0,98,116,67,111,109,112, -111,117,110,100,83,104,97,112,101,67,104,105,108,100,68,97,116,97,0,98, -116,67,111,109,112,111,117,110,100,83,104,97,112,101,68,97,116,97,0,98, -116,67,121,108,105,110,100,101,114,83,104,97,112,101,68,97,116,97,0,98, -116,67,97,112,115,117,108,101,83,104,97,112,101,68,97,116,97,0,98,116, -84,114,105,97,110,103,108,101,73,110,102,111,68,97,116,97,0,98,116,71, -73,109,112,97,99,116,77,101,115,104,83,104,97,112,101,68,97,116,97,0, -98,116,67,111,110,118,101,120,72,117,108,108,83,104,97,112,101,68,97,116, -97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106,101,99,116,68, -111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111, -110,79,98,106,101,99,116,70,108,111,97,116,68,97,116,97,0,98,116,82, -105,103,105,100,66,111,100,121,70,108,111,97,116,68,97,116,97,0,98,116, -82,105,103,105,100,66,111,100,121,68,111,117,98,108,101,68,97,116,97,0, -98,116,67,111,110,115,116,114,97,105,110,116,73,110,102,111,49,0,98,116, -84,121,112,101,100,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0, -98,116,82,105,103,105,100,66,111,100,121,68,97,116,97,0,98,116,80,111, -105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,116,70, -108,111,97,116,68,97,116,97,0,98,116,80,111,105,110,116,50,80,111,105, -110,116,67,111,110,115,116,114,97,105,110,116,68,111,117,98,108,101,68,97, -116,97,0,98,116,72,105,110,103,101,67,111,110,115,116,114,97,105,110,116, -68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,111, -110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116,97,0,98,116, -67,111,110,101,84,119,105,115,116,67,111,110,115,116,114,97,105,110,116,68, -97,116,97,0,98,116,71,101,110,101,114,105,99,54,68,111,102,67,111,110, -115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108,105,100,101,114, -67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,83,111,102,116,66, -111,100,121,77,97,116,101,114,105,97,108,68,97,116,97,0,83,111,102,116, -66,111,100,121,78,111,100,101,68,97,116,97,0,83,111,102,116,66,111,100, -121,76,105,110,107,68,97,116,97,0,83,111,102,116,66,111,100,121,70,97, -99,101,68,97,116,97,0,83,111,102,116,66,111,100,121,84,101,116,114,97, -68,97,116,97,0,83,111,102,116,82,105,103,105,100,65,110,99,104,111,114, -68,97,116,97,0,83,111,102,116,66,111,100,121,67,111,110,102,105,103,68, -97,116,97,0,83,111,102,116,66,111,100,121,80,111,115,101,68,97,116,97, -0,98,116,83,111,102,116,66,111,100,121,70,108,111,97,116,68,97,116,97, -0,0,0,0,84,76,69,78,1,0,1,0,2,0,2,0,4,0,4,0, -4,0,4,0,8,0,0,0,16,0,48,0,16,0,16,0,32,0,48,0, -96,0,64,0,-128,0,20,0,48,0,80,0,16,0,96,0,-112,0,16,0, -56,0,56,0,20,0,72,0,4,0,4,0,8,0,48,0,32,0,80,0, -72,0,80,0,32,0,64,0,64,0,16,0,72,0,80,0,-40,1,8,1, --16,1,-88,3,8,0,56,0,0,0,88,0,120,0,96,1,-32,0,-40,0, -0,1,-48,0,16,0,104,0,56,0,40,0,104,0,96,0,104,0,-48,0, --64,1,0,0,83,84,82,67,56,0,0,0,10,0,3,0,4,0,0,0, -4,0,1,0,9,0,2,0,11,0,3,0,10,0,3,0,10,0,4,0, -10,0,5,0,12,0,2,0,9,0,6,0,9,0,7,0,13,0,1,0, -7,0,8,0,14,0,1,0,8,0,8,0,15,0,1,0,13,0,9,0, -16,0,1,0,14,0,9,0,17,0,2,0,15,0,10,0,13,0,11,0, -18,0,2,0,16,0,10,0,14,0,11,0,19,0,4,0,4,0,12,0, -4,0,13,0,2,0,14,0,2,0,15,0,20,0,6,0,13,0,16,0, -13,0,17,0,4,0,18,0,4,0,19,0,4,0,20,0,0,0,21,0, -21,0,6,0,14,0,16,0,14,0,17,0,4,0,18,0,4,0,19,0, -4,0,20,0,0,0,21,0,22,0,3,0,2,0,14,0,2,0,15,0, -4,0,22,0,23,0,12,0,13,0,23,0,13,0,24,0,13,0,25,0, -4,0,26,0,4,0,27,0,4,0,28,0,4,0,29,0,20,0,30,0, -22,0,31,0,19,0,32,0,4,0,33,0,4,0,34,0,24,0,12,0, -14,0,23,0,14,0,24,0,14,0,25,0,4,0,26,0,4,0,27,0, -4,0,28,0,4,0,29,0,21,0,30,0,22,0,31,0,4,0,33,0, -4,0,34,0,19,0,32,0,25,0,3,0,0,0,35,0,4,0,36,0, -0,0,37,0,26,0,5,0,25,0,38,0,13,0,39,0,13,0,40,0, -7,0,41,0,0,0,21,0,27,0,5,0,25,0,38,0,13,0,39,0, -13,0,42,0,7,0,43,0,4,0,44,0,28,0,2,0,13,0,45,0, -7,0,46,0,29,0,4,0,27,0,47,0,28,0,48,0,4,0,49,0, -0,0,37,0,30,0,1,0,4,0,50,0,31,0,2,0,2,0,50,0, -0,0,51,0,32,0,2,0,2,0,52,0,0,0,51,0,33,0,7,0, -13,0,53,0,14,0,54,0,30,0,55,0,32,0,56,0,31,0,57,0, -4,0,58,0,4,0,59,0,34,0,4,0,33,0,60,0,13,0,61,0, -4,0,62,0,0,0,37,0,35,0,7,0,25,0,38,0,34,0,63,0, -23,0,64,0,24,0,65,0,36,0,66,0,7,0,43,0,0,0,67,0, -37,0,4,0,17,0,68,0,25,0,69,0,4,0,70,0,7,0,71,0, -38,0,4,0,25,0,38,0,37,0,72,0,4,0,73,0,7,0,43,0, -39,0,3,0,27,0,47,0,4,0,74,0,0,0,37,0,40,0,3,0, -27,0,47,0,4,0,74,0,0,0,37,0,41,0,4,0,4,0,75,0, -7,0,76,0,7,0,77,0,7,0,78,0,36,0,14,0,4,0,79,0, -4,0,80,0,41,0,81,0,4,0,82,0,7,0,83,0,7,0,84,0, -7,0,85,0,7,0,86,0,7,0,87,0,4,0,88,0,4,0,89,0, -4,0,90,0,4,0,91,0,0,0,37,0,42,0,5,0,25,0,38,0, -34,0,63,0,13,0,39,0,7,0,43,0,4,0,92,0,43,0,5,0, -27,0,47,0,13,0,93,0,14,0,94,0,4,0,95,0,0,0,96,0, -44,0,24,0,9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0, -18,0,100,0,18,0,101,0,14,0,102,0,14,0,103,0,14,0,104,0, -8,0,105,0,8,0,106,0,8,0,107,0,8,0,108,0,8,0,109,0, -8,0,110,0,8,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0, -4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0,0,0,37,0, -45,0,23,0,9,0,97,0,9,0,98,0,25,0,99,0,0,0,35,0, -17,0,100,0,17,0,101,0,13,0,102,0,13,0,103,0,13,0,104,0, -7,0,105,0,7,0,106,0,7,0,107,0,7,0,108,0,7,0,109,0, -7,0,110,0,7,0,111,0,4,0,112,0,4,0,113,0,4,0,114,0, -4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0,46,0,21,0, -45,0,119,0,15,0,120,0,13,0,121,0,13,0,122,0,13,0,123,0, -13,0,124,0,13,0,125,0,13,0,126,0,13,0,127,0,13,0,-128,0, -13,0,-127,0,7,0,-126,0,7,0,-125,0,7,0,-124,0,7,0,-123,0, -7,0,-122,0,7,0,-121,0,7,0,-120,0,7,0,-119,0,7,0,-118,0, -4,0,-117,0,47,0,22,0,44,0,119,0,16,0,120,0,14,0,121,0, -14,0,122,0,14,0,123,0,14,0,124,0,14,0,125,0,14,0,126,0, -14,0,127,0,14,0,-128,0,14,0,-127,0,8,0,-126,0,8,0,-125,0, -8,0,-124,0,8,0,-123,0,8,0,-122,0,8,0,-121,0,8,0,-120,0, -8,0,-119,0,8,0,-118,0,4,0,-117,0,0,0,37,0,48,0,2,0, -4,0,-116,0,4,0,-115,0,49,0,11,0,50,0,-114,0,50,0,-113,0, -0,0,35,0,4,0,-112,0,4,0,-111,0,4,0,-110,0,4,0,-109,0, -7,0,-108,0,7,0,-107,0,4,0,-106,0,0,0,-105,0,51,0,3,0, -49,0,-104,0,13,0,-103,0,13,0,-102,0,52,0,3,0,49,0,-104,0, -14,0,-103,0,14,0,-102,0,53,0,13,0,49,0,-104,0,18,0,-101,0, -18,0,-100,0,4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0, +109,95,115,99,97,108,101,0,109,95,97,113,113,0,109,95,99,111,109,0, +42,109,95,112,111,115,105,116,105,111,110,115,0,42,109,95,119,101,105,103, +104,116,115,0,109,95,110,117,109,80,111,115,105,116,105,111,110,115,0,109, +95,110,117,109,87,101,105,103,116,115,0,109,95,98,118,111,108,117,109,101, +0,109,95,98,102,114,97,109,101,0,109,95,102,114,97,109,101,120,102,111, +114,109,0,109,95,108,111,99,105,105,0,109,95,105,110,118,119,105,0,109, +95,118,105,109,112,117,108,115,101,115,91,50,93,0,109,95,100,105,109,112, +117,108,115,101,115,91,50,93,0,109,95,108,118,0,109,95,97,118,0,42, +109,95,102,114,97,109,101,114,101,102,115,0,42,109,95,110,111,100,101,73, +110,100,105,99,101,115,0,42,109,95,109,97,115,115,101,115,0,109,95,110, +117,109,70,114,97,109,101,82,101,102,115,0,109,95,110,117,109,78,111,100, +101,115,0,109,95,110,117,109,77,97,115,115,101,115,0,109,95,105,100,109, +97,115,115,0,109,95,105,109,97,115,115,0,109,95,110,118,105,109,112,117, +108,115,101,115,0,109,95,110,100,105,109,112,117,108,115,101,115,0,109,95, +110,100,97,109,112,105,110,103,0,109,95,108,100,97,109,112,105,110,103,0, +109,95,97,100,97,109,112,105,110,103,0,109,95,109,97,116,99,104,105,110, +103,0,109,95,109,97,120,83,101,108,102,67,111,108,108,105,115,105,111,110, +73,109,112,117,108,115,101,0,109,95,115,101,108,102,67,111,108,108,105,115, +105,111,110,73,109,112,117,108,115,101,70,97,99,116,111,114,0,109,95,99, +111,110,116,97,105,110,115,65,110,99,104,111,114,0,109,95,99,111,108,108, +105,100,101,0,109,95,99,108,117,115,116,101,114,73,110,100,101,120,0,42, +109,95,112,111,115,101,0,42,42,109,95,109,97,116,101,114,105,97,108,115, +0,42,109,95,110,111,100,101,115,0,42,109,95,108,105,110,107,115,0,42, +109,95,102,97,99,101,115,0,42,109,95,116,101,116,114,97,104,101,100,114, +97,0,42,109,95,97,110,99,104,111,114,115,0,42,109,95,99,108,117,115, +116,101,114,115,0,109,95,110,117,109,77,97,116,101,114,105,97,108,115,0, +109,95,110,117,109,76,105,110,107,115,0,109,95,110,117,109,70,97,99,101, +115,0,109,95,110,117,109,84,101,116,114,97,104,101,100,114,97,0,109,95, +110,117,109,65,110,99,104,111,114,115,0,109,95,110,117,109,67,108,117,115, +116,101,114,115,0,109,95,99,111,110,102,105,103,0,0,0,84,89,80,69, +68,0,0,0,99,104,97,114,0,117,99,104,97,114,0,115,104,111,114,116, +0,117,115,104,111,114,116,0,105,110,116,0,108,111,110,103,0,117,108,111, +110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,118,111,105,100, +0,80,111,105,110,116,101,114,65,114,114,97,121,0,98,116,80,104,121,115, +105,99,115,83,121,115,116,101,109,0,76,105,115,116,66,97,115,101,0,98, +116,86,101,99,116,111,114,51,70,108,111,97,116,68,97,116,97,0,98,116, +86,101,99,116,111,114,51,68,111,117,98,108,101,68,97,116,97,0,98,116, +77,97,116,114,105,120,51,120,51,70,108,111,97,116,68,97,116,97,0,98, +116,77,97,116,114,105,120,51,120,51,68,111,117,98,108,101,68,97,116,97, +0,98,116,84,114,97,110,115,102,111,114,109,70,108,111,97,116,68,97,116, +97,0,98,116,84,114,97,110,115,102,111,114,109,68,111,117,98,108,101,68, +97,116,97,0,98,116,66,118,104,83,117,98,116,114,101,101,73,110,102,111, +68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78, +111,100,101,70,108,111,97,116,68,97,116,97,0,98,116,79,112,116,105,109, +105,122,101,100,66,118,104,78,111,100,101,68,111,117,98,108,101,68,97,116, +97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,78,111,100,101, +68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,70, +108,111,97,116,68,97,116,97,0,98,116,81,117,97,110,116,105,122,101,100, +66,118,104,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,83,104,97,112,101,68,97,116,97,0,98,116,83,116,97, +116,105,99,80,108,97,110,101,83,104,97,112,101,68,97,116,97,0,98,116, +67,111,110,118,101,120,73,110,116,101,114,110,97,108,83,104,97,112,101,68, +97,116,97,0,98,116,80,111,115,105,116,105,111,110,65,110,100,82,97,100, +105,117,115,0,98,116,77,117,108,116,105,83,112,104,101,114,101,83,104,97, +112,101,68,97,116,97,0,98,116,73,110,116,73,110,100,101,120,68,97,116, +97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,68,97,116, +97,0,98,116,83,104,111,114,116,73,110,116,73,110,100,101,120,84,114,105, +112,108,101,116,68,97,116,97,0,98,116,77,101,115,104,80,97,114,116,68, +97,116,97,0,98,116,83,116,114,105,100,105,110,103,77,101,115,104,73,110, +116,101,114,102,97,99,101,68,97,116,97,0,98,116,84,114,105,97,110,103, +108,101,77,101,115,104,83,104,97,112,101,68,97,116,97,0,98,116,84,114, +105,97,110,103,108,101,73,110,102,111,77,97,112,68,97,116,97,0,98,116, +67,111,109,112,111,117,110,100,83,104,97,112,101,67,104,105,108,100,68,97, +116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,97,112,101,68,97, +116,97,0,98,116,67,121,108,105,110,100,101,114,83,104,97,112,101,68,97, +116,97,0,98,116,67,97,112,115,117,108,101,83,104,97,112,101,68,97,116, +97,0,98,116,84,114,105,97,110,103,108,101,73,110,102,111,68,97,116,97, +0,98,116,71,73,109,112,97,99,116,77,101,115,104,83,104,97,112,101,68, +97,116,97,0,98,116,67,111,110,118,101,120,72,117,108,108,83,104,97,112, +101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,79,98,106, +101,99,116,68,111,117,98,108,101,68,97,116,97,0,98,116,67,111,108,108, +105,115,105,111,110,79,98,106,101,99,116,70,108,111,97,116,68,97,116,97, +0,98,116,82,105,103,105,100,66,111,100,121,70,108,111,97,116,68,97,116, +97,0,98,116,82,105,103,105,100,66,111,100,121,68,111,117,98,108,101,68, +97,116,97,0,98,116,67,111,110,115,116,114,97,105,110,116,73,110,102,111, +49,0,98,116,84,121,112,101,100,67,111,110,115,116,114,97,105,110,116,68, +97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,68,97,116,97,0, +98,116,80,111,105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97, +105,110,116,70,108,111,97,116,68,97,116,97,0,98,116,80,111,105,110,116, +50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,116,68,111,117,98, +108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,111,110,115,116,114, +97,105,110,116,68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110, +103,101,67,111,110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116, +97,0,98,116,67,111,110,101,84,119,105,115,116,67,111,110,115,116,114,97, +105,110,116,68,97,116,97,0,98,116,71,101,110,101,114,105,99,54,68,111, +102,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108, +105,100,101,114,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,83, +111,102,116,66,111,100,121,77,97,116,101,114,105,97,108,68,97,116,97,0, +83,111,102,116,66,111,100,121,78,111,100,101,68,97,116,97,0,83,111,102, +116,66,111,100,121,76,105,110,107,68,97,116,97,0,83,111,102,116,66,111, +100,121,70,97,99,101,68,97,116,97,0,83,111,102,116,66,111,100,121,84, +101,116,114,97,68,97,116,97,0,83,111,102,116,82,105,103,105,100,65,110, +99,104,111,114,68,97,116,97,0,83,111,102,116,66,111,100,121,67,111,110, +102,105,103,68,97,116,97,0,83,111,102,116,66,111,100,121,80,111,115,101, +68,97,116,97,0,83,111,102,116,66,111,100,121,67,108,117,115,116,101,114, +68,97,116,97,0,98,116,83,111,102,116,66,111,100,121,70,108,111,97,116, +68,97,116,97,0,0,0,0,84,76,69,78,1,0,1,0,2,0,2,0, +4,0,4,0,4,0,4,0,8,0,0,0,16,0,48,0,16,0,16,0, +32,0,48,0,96,0,64,0,-128,0,20,0,48,0,80,0,16,0,96,0, +-112,0,16,0,56,0,56,0,20,0,72,0,4,0,4,0,8,0,48,0, +32,0,80,0,72,0,80,0,32,0,64,0,64,0,16,0,72,0,80,0, +-40,1,8,1,-16,1,-88,3,8,0,56,0,0,0,88,0,120,0,96,1, +-32,0,-40,0,0,1,-48,0,16,0,104,0,56,0,40,0,104,0,96,0, +104,0,-56,0,104,1,-48,1,83,84,82,67,57,0,0,0,10,0,3,0, +4,0,0,0,4,0,1,0,9,0,2,0,11,0,3,0,10,0,3,0, +10,0,4,0,10,0,5,0,12,0,2,0,9,0,6,0,9,0,7,0, +13,0,1,0,7,0,8,0,14,0,1,0,8,0,8,0,15,0,1,0, +13,0,9,0,16,0,1,0,14,0,9,0,17,0,2,0,15,0,10,0, +13,0,11,0,18,0,2,0,16,0,10,0,14,0,11,0,19,0,4,0, +4,0,12,0,4,0,13,0,2,0,14,0,2,0,15,0,20,0,6,0, +13,0,16,0,13,0,17,0,4,0,18,0,4,0,19,0,4,0,20,0, +0,0,21,0,21,0,6,0,14,0,16,0,14,0,17,0,4,0,18,0, +4,0,19,0,4,0,20,0,0,0,21,0,22,0,3,0,2,0,14,0, +2,0,15,0,4,0,22,0,23,0,12,0,13,0,23,0,13,0,24,0, +13,0,25,0,4,0,26,0,4,0,27,0,4,0,28,0,4,0,29,0, +20,0,30,0,22,0,31,0,19,0,32,0,4,0,33,0,4,0,34,0, +24,0,12,0,14,0,23,0,14,0,24,0,14,0,25,0,4,0,26,0, +4,0,27,0,4,0,28,0,4,0,29,0,21,0,30,0,22,0,31,0, +4,0,33,0,4,0,34,0,19,0,32,0,25,0,3,0,0,0,35,0, +4,0,36,0,0,0,37,0,26,0,5,0,25,0,38,0,13,0,39,0, +13,0,40,0,7,0,41,0,0,0,21,0,27,0,5,0,25,0,38,0, +13,0,39,0,13,0,42,0,7,0,43,0,4,0,44,0,28,0,2,0, +13,0,45,0,7,0,46,0,29,0,4,0,27,0,47,0,28,0,48,0, +4,0,49,0,0,0,37,0,30,0,1,0,4,0,50,0,31,0,2,0, +2,0,50,0,0,0,51,0,32,0,2,0,2,0,52,0,0,0,51,0, +33,0,7,0,13,0,53,0,14,0,54,0,30,0,55,0,32,0,56,0, +31,0,57,0,4,0,58,0,4,0,59,0,34,0,4,0,33,0,60,0, +13,0,61,0,4,0,62,0,0,0,37,0,35,0,7,0,25,0,38,0, +34,0,63,0,23,0,64,0,24,0,65,0,36,0,66,0,7,0,43,0, +0,0,67,0,37,0,4,0,17,0,68,0,25,0,69,0,4,0,70,0, +7,0,71,0,38,0,4,0,25,0,38,0,37,0,72,0,4,0,73,0, +7,0,43,0,39,0,3,0,27,0,47,0,4,0,74,0,0,0,37,0, +40,0,3,0,27,0,47,0,4,0,74,0,0,0,37,0,41,0,4,0, +4,0,75,0,7,0,76,0,7,0,77,0,7,0,78,0,36,0,14,0, +4,0,79,0,4,0,80,0,41,0,81,0,4,0,82,0,7,0,83,0, +7,0,84,0,7,0,85,0,7,0,86,0,7,0,87,0,4,0,88,0, +4,0,89,0,4,0,90,0,4,0,91,0,0,0,37,0,42,0,5,0, +25,0,38,0,34,0,63,0,13,0,39,0,7,0,43,0,4,0,92,0, +43,0,5,0,27,0,47,0,13,0,93,0,14,0,94,0,4,0,95,0, +0,0,96,0,44,0,24,0,9,0,97,0,9,0,98,0,25,0,99,0, +0,0,35,0,18,0,100,0,18,0,101,0,14,0,102,0,14,0,103,0, +14,0,104,0,8,0,105,0,8,0,106,0,8,0,107,0,8,0,108,0, +8,0,109,0,8,0,110,0,8,0,111,0,4,0,112,0,4,0,113,0, +4,0,114,0,4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0, +0,0,37,0,45,0,23,0,9,0,97,0,9,0,98,0,25,0,99,0, +0,0,35,0,17,0,100,0,17,0,101,0,13,0,102,0,13,0,103,0, +13,0,104,0,7,0,105,0,7,0,106,0,7,0,107,0,7,0,108,0, +7,0,109,0,7,0,110,0,7,0,111,0,4,0,112,0,4,0,113,0, +4,0,114,0,4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0, +46,0,21,0,45,0,119,0,15,0,120,0,13,0,121,0,13,0,122,0, +13,0,123,0,13,0,124,0,13,0,125,0,13,0,126,0,13,0,127,0, +13,0,-128,0,13,0,-127,0,7,0,-126,0,7,0,-125,0,7,0,-124,0, +7,0,-123,0,7,0,-122,0,7,0,-121,0,7,0,-120,0,7,0,-119,0, +7,0,-118,0,4,0,-117,0,47,0,22,0,44,0,119,0,16,0,120,0, +14,0,121,0,14,0,122,0,14,0,123,0,14,0,124,0,14,0,125,0, +14,0,126,0,14,0,127,0,14,0,-128,0,14,0,-127,0,8,0,-126,0, +8,0,-125,0,8,0,-124,0,8,0,-123,0,8,0,-122,0,8,0,-121,0, +8,0,-120,0,8,0,-119,0,8,0,-118,0,4,0,-117,0,0,0,37,0, +48,0,2,0,4,0,-116,0,4,0,-115,0,49,0,11,0,50,0,-114,0, +50,0,-113,0,0,0,35,0,4,0,-112,0,4,0,-111,0,4,0,-110,0, +4,0,-109,0,7,0,-108,0,7,0,-107,0,4,0,-106,0,0,0,-105,0, +51,0,3,0,49,0,-104,0,13,0,-103,0,13,0,-102,0,52,0,3,0, +49,0,-104,0,14,0,-103,0,14,0,-102,0,53,0,13,0,49,0,-104,0, +18,0,-101,0,18,0,-100,0,4,0,-99,0,4,0,-98,0,4,0,-97,0, +7,0,-96,0,7,0,-95,0,7,0,-94,0,7,0,-93,0,7,0,-92,0, +7,0,-91,0,7,0,-90,0,54,0,13,0,49,0,-104,0,17,0,-101,0, +17,0,-100,0,4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0, 7,0,-95,0,7,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0, -7,0,-90,0,54,0,13,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, -4,0,-99,0,4,0,-98,0,4,0,-97,0,7,0,-96,0,7,0,-95,0, -7,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0,7,0,-90,0, -55,0,11,0,49,0,-104,0,17,0,-101,0,17,0,-100,0,7,0,-89,0, -7,0,-88,0,7,0,-87,0,7,0,-92,0,7,0,-91,0,7,0,-90,0, -7,0,-86,0,0,0,21,0,56,0,9,0,49,0,-104,0,17,0,-101,0, -17,0,-100,0,13,0,-85,0,13,0,-84,0,13,0,-83,0,13,0,-82,0, -4,0,-81,0,4,0,-80,0,57,0,9,0,49,0,-104,0,17,0,-101,0, -17,0,-100,0,7,0,-85,0,7,0,-84,0,7,0,-83,0,7,0,-82,0, -4,0,-81,0,4,0,-80,0,58,0,4,0,7,0,-79,0,7,0,-78,0, -7,0,-77,0,4,0,75,0,59,0,10,0,58,0,-76,0,13,0,-75,0, -13,0,-74,0,13,0,-73,0,13,0,-72,0,13,0,-71,0,7,0,-126,0, -7,0,-70,0,4,0,-69,0,4,0,-68,0,60,0,9,0,58,0,-76,0, -4,0,-67,0,13,0,-66,0,7,0,-65,0,4,0,-64,0,7,0,-63,0, -7,0,-62,0,7,0,-61,0,4,0,-68,0,61,0,4,0,13,0,-71,0, -58,0,-76,0,4,0,-60,0,7,0,-59,0,62,0,7,0,13,0,-58,0, -58,0,-76,0,4,0,-57,0,7,0,-56,0,7,0,-62,0,7,0,-61,0, -4,0,-68,0,63,0,6,0,15,0,-63,0,13,0,-62,0,13,0,-55,0, -50,0,-54,0,4,0,-53,0,7,0,-61,0,64,0,26,0,4,0,-52,0, -7,0,-51,0,7,0,-86,0,7,0,-50,0,7,0,-49,0,7,0,-48,0, -7,0,-47,0,7,0,-46,0,7,0,-45,0,7,0,-44,0,7,0,-43,0, -7,0,-42,0,7,0,-41,0,7,0,-40,0,7,0,-39,0,7,0,-38,0, -7,0,-37,0,7,0,-36,0,7,0,-35,0,7,0,-34,0,7,0,-33,0, -4,0,-32,0,4,0,-31,0,4,0,-30,0,4,0,-29,0,4,0,113,0, -65,0,12,0,15,0,-28,0,15,0,-27,0,15,0,-26,0,13,0,-25,0, -13,0,-24,0,4,0,-23,0,4,0,-22,0,7,0,-56,0,4,0,-21,0, -7,0,-20,0,4,0,-19,0,4,0,-68,0,66,0,15,0,45,0,119,0, -65,0,-18,0,58,0,-17,0,59,0,-16,0,60,0,-15,0,61,0,-14,0, -62,0,-13,0,63,0,-12,0,4,0,-11,0,4,0,-10,0,4,0,-9,0, -4,0,-8,0,4,0,-7,0,4,0,-6,0,64,0,-5,0,}; +7,0,-90,0,55,0,11,0,49,0,-104,0,17,0,-101,0,17,0,-100,0, +7,0,-89,0,7,0,-88,0,7,0,-87,0,7,0,-92,0,7,0,-91,0, +7,0,-90,0,7,0,-86,0,0,0,21,0,56,0,9,0,49,0,-104,0, +17,0,-101,0,17,0,-100,0,13,0,-85,0,13,0,-84,0,13,0,-83,0, +13,0,-82,0,4,0,-81,0,4,0,-80,0,57,0,9,0,49,0,-104,0, +17,0,-101,0,17,0,-100,0,7,0,-85,0,7,0,-84,0,7,0,-83,0, +7,0,-82,0,4,0,-81,0,4,0,-80,0,58,0,4,0,7,0,-79,0, +7,0,-78,0,7,0,-77,0,4,0,75,0,59,0,10,0,58,0,-76,0, +13,0,-75,0,13,0,-74,0,13,0,-73,0,13,0,-72,0,13,0,-71,0, +7,0,-126,0,7,0,-70,0,4,0,-69,0,4,0,-68,0,60,0,9,0, +58,0,-76,0,4,0,-67,0,13,0,-66,0,7,0,-65,0,4,0,-64,0, +7,0,-63,0,7,0,-62,0,7,0,-61,0,4,0,-68,0,61,0,4,0, +13,0,-71,0,58,0,-76,0,4,0,-60,0,7,0,-59,0,62,0,7,0, +13,0,-58,0,58,0,-76,0,4,0,-57,0,7,0,-56,0,7,0,-62,0, +7,0,-61,0,4,0,-68,0,63,0,6,0,15,0,-63,0,13,0,-62,0, +13,0,-55,0,50,0,-54,0,4,0,-53,0,7,0,-61,0,64,0,26,0, +4,0,-52,0,7,0,-51,0,7,0,-86,0,7,0,-50,0,7,0,-49,0, +7,0,-48,0,7,0,-47,0,7,0,-46,0,7,0,-45,0,7,0,-44,0, +7,0,-43,0,7,0,-42,0,7,0,-41,0,7,0,-40,0,7,0,-39,0, +7,0,-38,0,7,0,-37,0,7,0,-36,0,7,0,-35,0,7,0,-34,0, +7,0,-33,0,4,0,-32,0,4,0,-31,0,4,0,-30,0,4,0,-29,0, +4,0,113,0,65,0,12,0,15,0,-28,0,15,0,-27,0,15,0,-26,0, +13,0,-25,0,13,0,-24,0,7,0,-23,0,4,0,-22,0,4,0,-21,0, +4,0,-20,0,4,0,-19,0,7,0,-56,0,4,0,-68,0,66,0,27,0, +17,0,-18,0,15,0,-17,0,15,0,-16,0,13,0,-25,0,13,0,-15,0, +13,0,-14,0,13,0,-13,0,13,0,-12,0,13,0,-11,0,4,0,-10,0, +7,0,-9,0,4,0,-8,0,4,0,-7,0,4,0,-6,0,7,0,-5,0, +7,0,-4,0,4,0,-3,0,4,0,-2,0,7,0,-1,0,7,0,0,1, +7,0,1,1,7,0,2,1,7,0,3,1,7,0,4,1,4,0,5,1, +4,0,6,1,4,0,7,1,67,0,18,0,45,0,119,0,65,0,8,1, +58,0,9,1,59,0,10,1,60,0,11,1,61,0,12,1,62,0,13,1, +63,0,14,1,66,0,15,1,4,0,16,1,4,0,-7,0,4,0,17,1, +4,0,18,1,4,0,19,1,4,0,20,1,4,0,21,1,4,0,-68,0, +64,0,22,1,}; int sBulletDNAlen64= sizeof(sBulletDNAstr64);