Improved BulletSoftBody serialization, added cluster support. Joints and copying data from GPU back to softbody are the main todo.

Updated the Bullet/Demos/SerializeDemo to load .bullet files with the softbody data.

BulletSoftBody should use getWorldTransform and not getInterpolationWorldTransform
Fix btBulletWorldImporter so that it creates a copy of the index/vertex data, this prevents crashes when deleting the .bullet file with triangle meshes.
This commit is contained in:
erwin.coumans 2010-12-03 03:11:21 +00:00
parent 032c6bfe2c
commit 6173a30bce
9 changed files with 964 additions and 472 deletions

View File

@ -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 <stdio.h> //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();
@ -114,12 +117,15 @@ void SerializeDemo::setupEmptyDynamicsWorld()
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<btVector3> vtx;
btAlignedObjectArray<btScalar> masses;
#ifdef DESERIALIZE_SOFT_BODIES
#include "BulletSoftBody/btSoftBodyData.h"
@ -139,6 +143,11 @@ class MySoftBulletWorldImporter : public btBulletWorldImporter
{
btSoftRigidDynamicsWorld* m_softRigidWorld;
btHashMap<btHashPtr,btSoftBody::Material*> 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;i<colObjData->m_numLinks;i++)
btSoftBody* psb=new btSoftBody(&m_softRigidWorld->getWorldInfo());
//materials
for (i=0;i<softBodyData->m_numMaterials;i++)
{
SoftBodyLinkData& link = colObjData->m_links[i];
}
vtx.resize(numNodes);
masses.resize(numNodes);
for (i=0;i<numNodes;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;i<numNodes;i++)
{
SoftBodyNodeData& node = colObjData->m_nodes[i];
if (!node.m_inverseMass)
SoftBodyMaterialData* matData = softBodyData->m_materials[i];
btSoftBody::Material** matPtr = m_materialMap.find(matData);
btSoftBody::Material* mat = 0;
if (matPtr&& *matPtr)
{
btScalar mass = node.m_inverseMass? 1.f/node.m_inverseMass : 0;
psb->setMass(i,mass);
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);
}
}
#endif
for (i=0;i<colObjData->m_numLinks;i++)
for (i=0;i<numNodes;i++)
{
SoftBodyLinkData& link = colObjData->m_links[i];
psb->appendLink(link.m_nodeIndices[0],link.m_nodeIndices[1]);
SoftBodyNodeData& nodeData = softBodyData->m_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);
}
for (i=0;i<colObjData->m_numFaces;i++)
for (i=0;i<softBodyData->m_numLinks;i++)
{
SoftBodyFaceData& face = colObjData->m_faces[i];
psb->appendFace(face.m_nodeIndices[0],face.m_nodeIndices[1],face.m_nodeIndices[2]);
SoftBodyLinkData& linkData = softBodyData->m_links[i];
btSoftBody::Material** matPtr = m_materialMap.find(linkData.m_material);
if (matPtr && *matPtr)
{
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;
}
for (i=0;i<softBodyData->m_numFaces;i++)
{
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;
}
// 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;i<colObjData->m_numAnchors;i++)
for (i=0;i<softBodyData->m_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;i<softBodyData->m_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;i<softBodyData->m_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;i<softBodyData->m_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;j<softBodyData->m_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;j<softBodyData->m_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;j<softBodyData->m_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.)));

View File

@ -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
@ -769,6 +769,7 @@ static void Init_Torus(SoftDemo* pdemo)
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;

View File

@ -65,6 +65,28 @@ void btBulletWorldImporter::deleteAllData()
}
m_allocatedNames.clear();
for (i=0;i<m_indexArrays.size();i++)
{
btAlignedFree(m_indexArrays[i]);
}
for (i=0;i<m_shortIndexArrays.size();i++)
{
btAlignedFree(m_shortIndexArrays[i]);
}
for (i=0;i<m_floatVertexArrays.size();i++)
{
btAlignedFree(m_floatVertexArrays[i]);
}
for (i=0;i<m_doubleVertexArrays.size();i++)
{
btAlignedFree(m_doubleVertexArrays[i]);
}
}
@ -100,23 +122,51 @@ btTriangleIndexVertexArray* btBulletWorldImporter::createMeshInterface(btStridin
for (int i=0;i<meshData.m_numMeshParts;i++)
{
btIndexedMesh meshPart;
meshPart.m_numTriangles = meshData.m_meshPartsPtr[i].m_numTriangles;
meshPart.m_numVertices = meshData.m_meshPartsPtr[i].m_numVertices;
if (meshData.m_meshPartsPtr[i].m_indices32)
{
meshPart.m_indexType = PHY_INTEGER;
meshPart.m_triangleIndexStride = 3*sizeof(int);
meshPart.m_triangleIndexBase = (const unsigned char*)meshData.m_meshPartsPtr[i].m_indices32;
int* indexArray = (int*)btAlignedAlloc(sizeof(int)*3*meshPart.m_numTriangles,16);
m_indexArrays.push_back(indexArray);
for (int j=0;j<3*meshPart.m_numTriangles;j++)
{
indexArray[j] = meshData.m_meshPartsPtr[i].m_indices32[j].m_value;
}
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
} else
{
meshPart.m_indexType = PHY_SHORT;
if (meshData.m_meshPartsPtr[i].m_3indices16)
{
meshPart.m_triangleIndexStride = sizeof(btShortIntIndexTripletData);
meshPart.m_triangleIndexBase = (const unsigned char*)meshData.m_meshPartsPtr[i].m_3indices16;
short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
m_shortIndexArrays.push_back(indexArray);
for (int j=0;j<meshPart.m_numTriangles;j++)
{
indexArray[3*j] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[0];
indexArray[3*j+1] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[1];
indexArray[3*j+2] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[2];
}
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
}
if (meshData.m_meshPartsPtr[i].m_indices16)
{
meshPart.m_triangleIndexStride = 3*sizeof(short int);
meshPart.m_triangleIndexBase = (const unsigned char*)meshData.m_meshPartsPtr[i].m_indices16;
short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
m_shortIndexArrays.push_back(indexArray);
for (int j=0;j<3*meshPart.m_numTriangles;j++)
{
indexArray[j] = meshData.m_meshPartsPtr[i].m_indices16[j].m_value;
}
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
}
}
@ -125,15 +175,35 @@ btTriangleIndexVertexArray* btBulletWorldImporter::createMeshInterface(btStridin
{
meshPart.m_vertexType = PHY_FLOAT;
meshPart.m_vertexStride = sizeof(btVector3FloatData);
meshPart.m_vertexBase = (const unsigned char*)meshData.m_meshPartsPtr[i].m_vertices3f;
btVector3FloatData* vertices = (btVector3FloatData*) btAlignedAlloc(sizeof(btVector3FloatData)*meshPart.m_numVertices,16);
m_floatVertexArrays.push_back(vertices);
for (int j=0;j<meshPart.m_numVertices;j++)
{
vertices[j].m_floats[0] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[0];
vertices[j].m_floats[1] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[1];
vertices[j].m_floats[2] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[2];
vertices[j].m_floats[3] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[3];
}
meshPart.m_vertexBase = (const unsigned char*)vertices;
} else
{
meshPart.m_vertexType = PHY_DOUBLE;
meshPart.m_vertexStride = sizeof(btVector3DoubleData);
meshPart.m_vertexBase = (const unsigned char*)meshData.m_meshPartsPtr[i].m_vertices3d;
btVector3DoubleData* vertices = (btVector3DoubleData*) btAlignedAlloc(sizeof(btVector3DoubleData)*meshPart.m_numVertices,16);
m_doubleVertexArrays.push_back(vertices);
for (int j=0;j<meshPart.m_numVertices;j++)
{
vertices[j].m_floats[0] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[0];
vertices[j].m_floats[1] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[1];
vertices[j].m_floats[2] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[2];
vertices[j].m_floats[3] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[3];
}
meshPart.m_vertexBase = (const unsigned char*)vertices;
}
meshPart.m_numTriangles = meshData.m_meshPartsPtr[i].m_numTriangles;
meshPart.m_numVertices = meshData.m_meshPartsPtr[i].m_numVertices;
if (meshPart.m_triangleIndexBase && meshPart.m_vertexBase)
{
@ -433,6 +503,10 @@ btCollisionShape* btBulletWorldImporter::convertCollisionShape( btCollisionShap
break;
}
case SOFTBODY_SHAPE_PROXYTYPE:
{
return 0;
}
default:
{
printf("unsupported shape type (%d)\n",shapeData->m_shapeType);

View File

@ -72,6 +72,12 @@ protected:
btAlignedObjectArray<btTriangleIndexVertexArray*> m_allocatedTriangleIndexArrays;
btAlignedObjectArray<char*> m_allocatedNames;
btAlignedObjectArray<int*> m_indexArrays;
btAlignedObjectArray<short int*> m_shortIndexArrays;
btAlignedObjectArray<btVector3FloatData*> m_floatVertexArrays;
btAlignedObjectArray<btVector3DoubleData*> m_doubleVertexArrays;
btHashMap<btHashPtr,btOptimizedBvh*> m_bvhMap;
btHashMap<btHashPtr,btTriangleInfoMap*> m_timMap;
@ -83,9 +89,10 @@ protected:
btHashMap<btHashPtr,btCollisionShape*> m_shapeMap;
btHashMap<btHashPtr,btCollisionObject*> 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();

View File

@ -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;i<ni;++i)
{
Node& n=m_nodes[i];
ZeroInitialize(n);
n.m_x = x?*x++:btVector3(0,0,0);
n.m_q = n.m_x;
n.m_im = m?*m++:1;
n.m_im = n.m_im>0?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;i<ni;++i)
{
Node& n=m_nodes[i];
ZeroInitialize(n);
n.m_x = x?*x++:btVector3(0,0,0);
n.m_q = n.m_x;
n.m_im = m?*m++:1;
n.m_im = n.m_im>0?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<btHashPtr,int> 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,9 +3214,148 @@ 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;
//pose for shape matching
{
sbd->m_pose = (SoftBodyPoseData*)serializer->getUniquePointer((void*)&m_pose);
//not yet
sbd->m_pose = 0;
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;i<numElem;i++,memPtr++)
{
m_pose.m_pos[i].serializeFloat(*memPtr);
}
serializer->finalizeChunk(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;i<numElem;i++,memPtr++)
{
*memPtr = m_pose.m_wgh[i];
}
serializer->finalizeChunk(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;i<numElem;i++,memPtr++)
{
memPtr->m_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;j<numElem;j++,memPtr++)
{
m_clusters[i]->m_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;j<numElem;j++,memPtr++)
{
*memPtr = m_clusters[i]->m_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;j<numElem;j++,memPtr++)
{
int* indexPtr = m_nodeIndexMap.find(m_clusters[i]->m_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;
}

View File

@ -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 */

View File

@ -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;
};

View File

@ -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();

View File

@ -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);