#!BPY
""" Registration info for Blender menus:
Name: 'jME XML V2 (.xml)'
Blender: 241
Group: 'Export'
Tip: 'Export to the new (V2) jME XML file format.'
"""
__author__ = ["Kai Rabien"]
__version__ = "03/2006"
__email__ = ('Author, hevee@gmx.de')
__url__ = ('http://www.jmonkeyengine.com')
__bpydoc__ = """\
This script exports Blender Objects to the jMonkeyEngine's xml format.
jMonkeyEngine is a 3d game engine written in java, check link.
Supported:
All Blender Objects can be exported to jMe Nodes with their location,
rotation, and size properties and their names. Optional:
* object level animation (loc, rot, size).
Meshes (tri- and quad faces, subSurfs) can have:
* deformed vertex positions
* Materials,
* UV-coordinates (not sticky),
* morph target animation (by vertex keys, armature... whatever)
exported.
Unsupported:
Per-face-UV, aka smoothing groups or smooth/solid setting. Contact me if you
need that, or know of a good way to implement it.
Notes:
If you export animations, make sure you have only the animated mesh object
selected. Keyframes will otherwise be generated for every selected object,
resulting in quite a bunch of unneccessary data being saved.
Also, check the generated keyframe text in a text window, to manually tweak
keyframe generation.
Animations for meshes with multiple materials or different settings of
"Twoside" for their faces are currently unsupported. You'll have to split your
Mesh up if you want anything like that.
Skeletal animation can be exported at your own risk, it will most probably
not work. If you do so, you probably won't want to export morph target animations
as well, since the skeletal deformation will then be applied twice,
which will just look weird.
Of course, if you give the current skeletal animation export feature a try,
it will look weird anyway, because it is really nowhere near finished yet.
Have fun, and don't hesitate to send comments, claims, flames, and bug reports
to hevee@gmx.de
"""
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# * Neither the name of the project nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import Blender
from Blender.Mathutils import *
roundAmount = 7
xMult = -1
EX_ANIMATIONS = False
EX_OBJECT_ANIMATIONS = False
EX_MATERIALS = True
EX_VERTEXCOLORS = True
EX_UVS = True
CURRENT_FILENAME = None
JOINT_ANIMATION = False
CONV_COORDS = False
CONV_COORDS_BY_OBJECT = False
ONLY_TEX_FILENAME = True
unTriFaces = False
TextureStatesWarningShown = False
HAS_SHOWN_MTA_MATERIAL_SPLIT_WARNING = False
HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING = False
EX_JME_1_XML = False
KEYFRAMES = 'jme keyframes'
ANIMHELPTEXT = \
'''This text contains the frame numbers to be exported by the jMonkeyEngine
exporter. During export, keyframe information will be read from this text.
Any line starting with a non-numerical string will be ignored.
You can name keyframes. The name will be written to the xml file as the "name"
property of the keyframepointintime. jMe won't care but you can have it there
for personal reference. A name is written after the keyframe number, in the
same line, separated by one or more whitespace characters (tab or space).\n'''
animPupShown = False
keyframe_gen_step = 5
#these are for checking if writing out morph animation for the channel in
#question is neccessary at all
OPTIMIZE_SIZE = True
lastCO = ""
lastNO = ""
lastCOL = ""
lastUV = ""
lastIND = ""
lastSPTROT = ""
lastSPTSCALE = ""
lastSPTTRANS = ""
referenceIDs = {}
##matConvert = RotationMatrix(90, 3, 'x') * RotationMatrix(180, 3, 'z')
##matConvertInv = RotationMatrix(-90, 3, 'x') * RotationMatrix(-180, 3, 'z')
##matConvert4x4 = RotationMatrix(90, 4, 'x') * RotationMatrix(180, 4, 'z')
##matConvertInv4x4 = RotationMatrix(-90, 4, 'x') * RotationMatrix(-180, 4, 'z')
##matConvert = RotationMatrix(180, 3, 'z')
##matConvertInv = RotationMatrix(-180, 3, 'z')
##matConvert4x4 = RotationMatrix(180, 4, 'z')
##matConvertInv4x4 = RotationMatrix(-180, 4, 'z')
class jmeVertex:
#---coords[x,y,z], normal[x,y,z], color[r,g,b,a], uv[u,v]---#000000#FFFFFF------
global roundAmount, CONV_COORDS, CONV_COORDS_BY_OBJECT
def __init__(self, xyzCoords, xyzNormal, blender_vert):
if CONV_COORDS and not EX_ANIMATIONS and not CONV_COORDS_BY_OBJECT:
self.coords = [xMult*xyzCoords[0], xyzCoords[2], xyzCoords[1]]
self.normal = [xMult*xyzNormal[0], xyzNormal[2], xyzNormal[1]]
else:
self.coords = xyzCoords
self.normal = xyzNormal
self.color = None
self.uv = None
self.joint = None
self.blender_vert = blender_vert
def setJoint(self, joint):
self.joint = joint
def setRGBA(self, rgbaColor):
self.color = rgbaColor
def setUV(self, uvTexcoords):
self.uv = uvTexcoords
def copyNewColor(self, rgba):
'creates a copy of this jmeVertex with changed color'
ret = jmeVertex(self.coords, self.normal, self.blender_vert)
ret.setRGBA(rgba)
ret.setUV(self.uv)
ret.setJoint(self.joint)
return ret
def copyNewUV(self, uv):
'creates a copy of this jmeVertex with changed uv coords'
ret = jmeVertex(self.coords, self.normal, self.blender_vert)
ret.coords = self.coords
ret.normal = self.normal
ret.setRGBA(self.color)
ret.setUV(uv)
ret.setJoint(self.joint)
return ret
def copyNewNO(self, no):
'creates a copy of this jmeVertex with changed normal coords'
ret = jmeVertex(self.coords, self.normal, self.blender_vert)
ret.coords = self.coords
ret.normal = no
ret.setRGBA(self.color)
ret.setUV(self.uv)
ret.setJoint(self.joint)
return ret
class jmeMesh:
#---name verts indices material texture---#000000#FFFFFF------------------------
def __init__(self, name, refID):
self.name = name
self.verts = []
self.indices = []
self.material = None
self.texture = None
self.oldIndices = {}
self.newIndex = 0
self.refID = refID
def appendVert(self, jmeVert, oldIndex):
if not self.oldIndices.has_key(oldIndex):
self.verts.append(jmeVert)
self.oldIndices[oldIndex] = self.newIndex
self.newIndex += 1
def appendIndex(self, oldIndex):
## if not self.oldIndices.has_key(oldIndex):
## self.oldIndices[oldIndex] = self.newIndex
## self.newIndex += 1
self.indices.append(self.oldIndices[oldIndex])
def setMaterial(self, jmeMat):
self.material = jmeMat
def setTexture(self, jmeTex):
self.texture = jmeTex
def setTwoSided(self, twosided):
self.twosided = twosided
if not twosided:
self.name += '.nocull'
def getVertByOldIndex(self, oldIndex):
newIndex = self.oldIndices[oldIndex]
return self.verts[newIndex]
def toString(self, indentL, children = '', onlyVerts = False, jointmesh = False, attributes = ''):
global EX_MATERIALS, lastCO, lastNO, lastCOL, lastUV, lastIND
ind = makeTag(indentL+2, 'indexBuffer', ints2String('data', self.indices))
(co, no, col, uv, ji, oc, on) = buildStringsFromJmeVerts(indent(indentL+2), self.verts)
tagname = 'com.jme.scene.TriMesh'
jointmeshdata = ''
if jointmesh:
tagname = 'jointmesh'
jointmeshdata = oc
jointmeshdata = jointmeshdata + on
jointmeshdata = jointmeshdata + ji
children += jointmeshdata
children += triMeshData(indentL, co + no + col + uv + ind)
if not onlyVerts:
matString = ''
if self.material:
matString += self.material.toString(indentL+2)
if self.texture:
matString += self.texture.toString(indentL+2)
if self.twosided:
matString += indent(indentL+2)+''+indent(indentL+1)+'\n'
children += triMeshData(indentL, co + no + col + uv + ind)
attributes += ' reference_ID="'+self.refID+'"'
matString = makeTag(indentL+1, 'renderStateList', '', matString)
meshStr = makeTag(indentL, tagname, 'name="'+self.name+'"' + attributes, children + matString)
else:#only for KeyframeController animation, don't output material and outer mesh tags
if OPTIMIZE_SIZE and lastCO == co:
co = ""
else:
lastCO = co
if OPTIMIZE_SIZE and lastNO == no:
no= ""
else:
lastNO = no
if OPTIMIZE_SIZE and lastCOL == col:
col= ""
else:
lastCOL = col
if OPTIMIZE_SIZE and lastUV == uv:
uv = ""
else:
lastUV = uv
if OPTIMIZE_SIZE and lastIND == ind:
ind = ""
else:
lastIND = ind
children += triMeshData(indentL, co + no + col + uv + ind)
meshStr = children
return meshStr
class jmeMaterial:
def __init__(self, blenderMat):
ambMult = lambda x : blenderMat.getAmb() * x # f(x) = x * ambient
self.alpha = blenderMat.getAlpha()
self.diff = blenderMat.getRGBCol() + [self.alpha]
self.amb = map(ambMult, Blender.World.GetCurrent().getAmb())+[self.alpha]
emMult = lambda x : blenderMat.getEmit() * x
self.emi = map(emMult, blenderMat.getRGBCol())+[self.alpha]
specMult = lambda x : blenderMat.getSpec()/2 * x
self.spec = map(specMult, blenderMat.getSpecCol()) + [self.alpha]
self.shiny = blenderMat.getHardness() / 511.0 * 128#range 0-128, as in OpenGL
def toString(self, indentL):
matString = makeTag(indentL, 'com.jme.scene.state.MaterialState' , 'class="com.jme.scene.state.lwjgl.LWJGLMaterialState" shininess="'+str(self.shiny)+'"',\
rgba2String('diffuse', self.diff, indentL+1)+\
rgba2String('ambient', self.amb, indentL+1)+\
rgba2String('emissive', self.emi, indentL+1)+\
rgba2String('specular', self.spec, indentL+1)\
)
return matString
class jmeTexture:
def __init__(self, blenderMTex):
if blenderMTex.tex.type == Blender.Texture.Types.IMAGE:
self.tname = blenderMTex.tex.image.filename
else:
self.tname = None
def toString(self, indentL):
if self.tname:
if self.tname.startswith("//"):
self.tname = self.tname[2:]
tofile = self.tname
if ONLY_TEX_FILENAME:
import os
tofile = tofile.split(os.sep)[-1]
if(EX_JME_1_XML):
texString = makeTag(indentL+2, 'com.jme.image.Texture', \
'imageLocation="'+tofile+\
'" wrap="3"')
else:
texString = makeTag(indentL+3, 'textureKey', 'class="com.jme.util.TextureKey" protocol="file" file="'+tofile+'"')
texString = makeTag(indentL+2, 'com.jme.image.Texture2D', '', texString)
texString = makeTag(indentL+1, 'texture', 'size="1"', texString)
matString = makeTag(indentL, 'com.jme.scene.state.TextureState', 'class="com.jme.scene.state.lwjgl.LWJGLTextureState"', texString)
return matString
else:
return ''
class Joint:
def __init__(self, name, index, parent, mat_localrot, v_localvec, blender_bone):
self.name = name
self.kfrot = []
self.kfloc = []
self.index = index
self.parent = parent
self.mat_localrot = mat_localrot
self.v_localvec = v_localvec
self.blender_bone = blender_bone
def addKeyframeRot(self, time, quat_rot):
self.kfrot.append((time, quat_rot))
def addKeyframeLoc(self, time, trip_xyz):
self.kfloc.append((time, trip_xyz))
def toString(self, indentLevel, parentJoint):
'''this is the point where all blender to jME coordinate space conversion takes place'''
global CONV_COORDS, CONV_COORDS_BY_OBJECT
indentstr = indent(indentLevel)
out = indentstr+"\n"
parentindex = -1
if self.parent:
parentindex = self.parent.index
out = out + indentstr+'"
out = out +'" localrot="'+f2s(mloc[0][0])+' '+f2s(mloc[0][1])+' '+f2s(mloc[0][2])+' '
out = out+f2s(mloc[1][0])+' '+f2s(mloc[1][1])+' '+f2s(mloc[1][2])+' '
out = out +f2s(mloc[2][0])+' '+f2s(mloc[2][1])+' '+f2s(mloc[2][2])+' '
out = out +'" localvec="'+f2s(v_local[0])+' '+f2s(v_local[1])+' '+f2s(v_local[2])+'">'
for kfr in self.kfrot:
qkf = Quaternion((kfr[1][0],kfr[1][1],kfr[1][2],kfr[1][3])).normalize()
childString += '\n'+indent(indentLevel+1)+''
out += childString
out += '\n'+indentstr+''
return out
#for easy switching betweem jME 1.0 and jME 2.x XML
def triMeshData(indentL, childrenString):
if(EX_JME_1_XML):
ret = makeTag(indentL+1, 'batchList', 'size="1"', \
makeTag(indentL+2, 'com.jme.scene.batch.TriangleBatch', '', \
childrenString));
return ret;
else:
return childrenString;
def f2s(float):
# f = round(float,roundAmount)
# if abs(f - round(f, 0)) < pow(10, -(roundAmount-1)):
# f = int(round(f, 0))
# return str(f)
return "%.*f" % (roundAmount, float)
def quatXquat(q1, q2):
w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z
x = q1.w*q2.x + q1.x*q2.w + q1.y*q2.z - q1.z*q2.y
y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x
z = q1.w*q2.z + q1.x*q2.y - q1.y*q2.x + q1.z*q2.w
r = Quaternion(w,x,y,z)
return r
def getIpoValue(ipo, value):
# TODO: update getIpoValue from deprecated ipo.getCurveCurval(i)
ipocurves = ipo.getCurves()
for i in range(len(ipocurves)):
if value == ipocurves[i].getName():
return ipo.getCurveCurval(i)
print "Error: ipo %s has no curve for %s!" %(ipo, value)
def vec3f2String(nodeName, floatList, intIndentL=0):
ret = makeTag(intIndentL, nodeName, 'x="'+f2s(floatList[0])+'" y="'+f2s(floatList[1])+'" z="'+f2s(floatList[2])+'"')
return ret
def quat2String(nodeName, floatList, intIndentL=0):
ret = makeTag(intIndentL, nodeName, 'x="'+f2s(floatList[0])+'" y="'+f2s(floatList[1])+'" z="'+f2s(floatList[2])+'" w="'+f2s(floatList[3])+'"')
return ret
def rgba2String(nodeName, rgba, intIndentL=0):
print rgba
print rgba[0]
ret = makeTag(intIndentL, nodeName, 'r="'+f2s(rgba[0])+'" g="'+f2s(rgba[1])+'" b="'+f2s(rgba[2])+'" a="'+f2s(rgba[3])+'"')
return ret
def floats2String(attrName, floatList):
'result will be: =" f0 f1 f2...", fx being floats from the list'
if not floatList:
return ''
ret = attrName+'="'
for i in floatList:
ret += f2s(i)+' '
if len(floatList):
ret = ret[:-1]
ret += '"'
else:
ret = ''
return ret
def ints2String(attrName, intList):
'result will be: =" i0 i1 i2...", ix being ints from the list'
if not intList:
return ''
ret = attrName+'="'
for i in intList:
ret += str(i)+' '
if len(intList):
ret = ret[:-1]
ret += '" size="'+str(len(intList))+'"'
else:
ret = ''
return ret
def indent(level):
return ' '*level
def makeTag(intIndent, strName, strAttributes, strChildren=''):
if len(strAttributes) > 0:
strAttributes = ' '+strAttributes
if len(strChildren) > 0:
ret = indent(intIndent)+'<'+strName+strAttributes+'>\n'+strChildren+indent(intIndent)+''+strName+'>\n'
else:
ret = indent(intIndent)+'<'+strName+' '+strAttributes+'/>\n'
return ret
def processJointMesh(ob, indentL):
''' returns tuple: (jointindexlist, jointcontrollerstring)'''
ret = [None, None, None]
nmesh = ob.getData()
if not type(nmesh) == Blender.Types.NMeshType:
print 'Not a mesh object: '+ob
arm_object = ob.parent
arm_object_rot = arm_object.getMatrix().toQuat().normalize()
arm = arm_object.getData()
#--- create a dictionary mapping bone names to indices
# this is necessary because blender python does address bones only by their
# names, but jME wants numerical indices. What's more, the indices have to
# be sorted hierarchically, such that the root joint has index 0, it's child
# index 1, and so on.
#sort bones hierarchically
bnamehierlist = []
def boneHierRecurs(re_bone):
bnamehierlist.append(re_bone.name)
if re_bone.hasChildren():
for b in re_bone.children:
boneHierRecurs(b)
for bone in arm.bones.values():
if bone.hasParent():
continue
else:
boneHierRecurs(bone)
# build the actual boneindices dictionary
bonesdict = {}
c = 0
for name in bnamehierlist:
bonesdict[name] = c
c = c+1
jointindexlist = [-1 for x in range(len(nmesh.verts))]
bones = arm.bones
#fill jointlist with Nones
jointlist = [None for x in range(len(bonesdict))]
#create Joints
for bonename in bnamehierlist:
bone = bones[bonename]
boneindex = bonesdict[bonename]
pMat = arm_object.getMatrix()
if bone.parent:
pMat = bone.parent.matrix['ARMATURESPACE']
m = bone.matrix['ARMATURESPACE'] * pMat.invert()
# .invert() inverts the matrix in place, so it has to be re-inverted
pMat.invert()
v = bone.matrix['ARMATURESPACE'].translationPart()
if bone.parent:#this is a child bone
parentindex = bonesdict[bone.parent.name]
v = v - pMat.translationPart()
else:#this is a root bone
parentindex = -1
m = bone.matrix['ARMATURESPACE'].toQuat().normalize().toMatrix()
m = pMat.toQuat().normalize().toMatrix().invert() * m
#make sure m is 3x3
m = m.toQuat().normalize().toMatrix()
parent = None
if parentindex > -1:
parent = jointlist[parentindex]
if parent is None:
print "ERROR! Child Joint created before parent: "+bone.name
j = Joint(bone.name, boneindex, parent, m, v, bone)
jointlist[boneindex] = j
ret[0] = jointlist
has_jointindex_data = False
for vert in nmesh.verts:
i = vert.index
infl_list = nmesh.getVertexInfluences(i)
#sort by weight, highest first, to get the bone with the highest weight value
infl_list.sort(key = lambda x : x[1], reverse = True)
if infl_list:
has_jointindex_data = True
bonename = infl_list[0][0]
boneindex = bonesdict[bonename]
jointindexlist[i] = boneindex
else:
jointindexlist[i] = -1
ret[1] = jointindexlist
actions_dict = Blender.Armature.NLA.GetActions()
action = actions_dict['Action']
ipomap = action.getAllChannelIpos()
def processFrames():
oldframe = Blender.Get('curframe')
for bone in arm.bones.values():
bone_name = bone.name
if not bone_name in ipomap:
continue
ipo = ipomap[bone_name]
boneindex = bonesdict[bone_name]
joint = jointlist[boneindex]
has_rot = ipo.getNcurves() in (4,7)
has_loc = ipo.getNcurves() in (3,7)
if(has_rot):
#---get keyframes from ipo
w = ipo.getCurve("QuatX")
if(w):
for t in w.getPoints():
frame = t.pt[0]
Blender.Set('curframe', frame)
time = frame#Blender.Get('curtime')
ipo_rot = [
getIpoValue(ipo, "QuatW"),
getIpoValue(ipo, "QuatX"),
getIpoValue(ipo, "QuatY"),
getIpoValue(ipo, "QuatZ")
]
if(not ipo_rot[0] is None and not ipo_rot[1] is None and not ipo_rot[2] is None and not ipo_rot[3] is None):
rot = Quaternion(ipo_rot).normalize()
joint.addKeyframeRot(time, rot)
else:
print "Incomplete Quat keys for: "+str(ipo)+" "+str(ipo_rot)
if(has_loc):
pass # TODO: support loc and size keyframes
Blender.Set('curframe', oldframe)
processFrames()
#create xml output string
jointcontrollerstring = indent(indentL)
jointcontrollerstring = jointcontrollerstring +'\n'
fps = Blender.Scene.GetCurrent().getRenderingContext().framesPerSec()
for joint in jointlist:
jointcontrollerstring = jointcontrollerstring +joint.toString(indentL+1, joint.parent)+"\n"
jointcontrollerstring = jointcontrollerstring + indent(indentL) + '\n'
ret[2] = jointcontrollerstring
return ret
def buildStringsFromJmeVerts(indentString, ListOfJmeVerts):
co = indentString+'\n'+indentString+" "+'\n'+indentString+" "+'\n'
no = no[:-2] + '" size="'+str(len(ListOfJmeVerts)*3)+'"/>\n'
if len(col):
col = col[:-2] + '"/>\n'
## if len(ji):
## ji += '"/>\n'
## if len(oc):
## oc += '"/>\n'
## if len(on):
## on += '"/>\n'
if len(uv):
if(EX_JME_1_XML):
uv = uv [:-2] + '" size="'+str(len(ListOfJmeVerts)*2)+'"/>\n'+indentString+'\n'
else:
uv = uv [:-2] + '" size="'+str(len(ListOfJmeVerts)*2)+'"/>\n'+indentString+'\n'
return (co, no, col, uv, ji, oc, on)
def writeObjectAnimation(blenderObject, objectname ,indentL, children=''):
global lastSPTROT, lastSPTSCALE, lastSPTTRANS, OPTIMIZE_SIZE, CONV_COORDS_BY_OBJECT, CONV_COORDS
fps = Blender.Scene.GetCurrent().getRenderingContext().framesPerSec()
out = indent(indentL+1)+'\n'
oldframe = Blender.Get('curframe')
out += indent(indentL+2)+'\n'
out += indent(indentL+3)+'\n'
out += indent(indentL+2)+'\n'
keyframes = loadKeyframes()
lastSPTROT = ""
lastSPTSCALE = ""
lastSPTTRANS = ""
keyList = keyframes.keys()
keyList.sort()
start = keyList[0]#Blender.Get('staframe')
for i in keyList:
#always append last frame
if i == keyList[-1]:
lastSPTROT = ""
lastSPTTRANS = ""
lastSPTSCALE = ""
Blender.Set('curframe', i)
kfname = keyframes[i]
ob = Blender.Object.Get(objectname)
mat = ob.getMatrix('worldspace')
if CONV_COORDS:
mat = mat * matConvert4x4
rotQ = mat.toQuat().normalize()
rot = floats2String("rotvalues", [rotQ.x, rotQ.y, rotQ.z, rotQ.w])
if OPTIMIZE_SIZE and rot == lastSPTROT:
rot = ""
else:
lastSPTROT = rot
rot = makeTag(indentL+3, "sptrot", 'index="0" '+ rot)
trans = floats2String("transvalues", mat.translationPart())
if OPTIMIZE_SIZE and trans == lastSPTTRANS:
trans = ""
else:
lastSPTTRANS = trans
trans = makeTag(indentL+3, "spttrans", 'index="0" '+ trans)
scale = floats2String("scalevalues", ob.getSize())
if OPTIMIZE_SIZE and scale == lastSPTSCALE:
scale = ""
else:
lastSPTSCALE = scale
scale = makeTag(indentL+3, "sptscale", 'index="0" '+ scale)
content = scale+rot+trans
nowTime = i - start
if len(scale) or len(trans) or len(rot):
if len(kfname):
out += indent(indentL+2)+'\n'+content
else:
out += indent(indentL+2)+'\n'+content
out += indent(indentL+2)+'\n'
out += children+indent(indentL)+'\n'
Blender.Set('curframe', oldframe)
return out
def writeMorphAnimation(nmeshObject, meshname, refID, indentL, children=''):
global lastCO, lastNO, lastCOL, lastUV, lastIND, OPTIMIZE_SIZE
fps = Blender.Scene.GetCurrent().getRenderingContext().framesPerSec()
oldframe = Blender.Get('curframe')
BLENDER_FPS = 25
lastCO = ""
lastNO = ""
lastCOL = ""
lastUV = ""
lastIND = ""
keyframes = loadKeyframes()
keyList = keyframes.keys()
keyList.sort()
out = indent(indentL)+'\n'
out += indent(indentL)+'\n'
out += indent(indentL)+'\n'
start = keyList[0]#Blender.Get('staframe')
Blender.Set('curframe', keyList[0])
startTime = Blender.Get('curtime') / BLENDER_FPS
for i in keyList:
#always append last frame
if i == keyList[-1]:
lastCO = ""
lastNO = ""
lastCOL = ""
lastUV = ""
lastIND = ""
Blender.Set('curframe', i)
kfname = keyframes[i]
nmesh = Blender.NMesh.GetRawFromObject(nmeshObject.getName())#get mesh with deformations applied
mstr = writeMesh(nmesh, meshname, '',indentL+3, onlyVerts = True)#don't get materials, and mesh tags
mstr = makeTag(indentL+2, 'newShape', 'class="com.jme.scene.TriMesh" name="shapeKey"', mstr)
nowTime = i - start##Blender.Get('curtime') / BLENDER_FPS - startTime
if len( mstr):
if len(kfname):
out += indent(indentL+1)+'\n'
out += indent(indentL)+'\n'
out = makeTag(indentL, 'geometricalControllers', 'size="1"', out)
Blender.Set('curframe', oldframe)
return out
def getReferenceID(object):
if not object in referenceIDs.keys():
referenceIDs[object] = "ID_"+str(len(referenceIDs))
return referenceIDs[object]
def writeObject(ob, indentL, children = ''):
global EX_ANIMATIONS, EX_OBJECT_ANIMATIONS, CONV_COORDS, JOINT_ANIMATION, CONV_COORDS_BY_OBJECT
if EX_OBJECT_ANIMATIONS:
CONV_COORDS_BY_OBJECT = True
old_CONV_COORDS_BY_OBJECT = CONV_COORDS_BY_OBJECT
if ob.getType() == 'Mesh':
mesh = Blender.NMesh.GetRawFromObject(ob.getName())
meshname = ob.getData().name
refID = getReferenceID(ob.getData())
if len(mesh.verts):#some mesh objects might contain no vertices at all. skip the mesh, then, but keep their object
if EX_ANIMATIONS:
maStr = writeMorphAnimation(ob, meshname, refID,indentL+2)
dataStr = makeTag(indentL+1, 'children', 'size="1"', writeMesh(ob.getData(), meshname, refID,indentL+1, children=maStr))
elif JOINT_ANIMATION and ob.getParent() and ob.getParent().getType() == 'Armature':
#print "Joint animation not implemented... please be patient"
mesh = ob.getData()
jointlist, jointindexlist, jointcontroller = processJointMesh(ob, indentL+1)
dataStr = writeJointMesh(ob.getData(), meshname, indentL+1, children='', onlyVerts = False, jointindexlist = jointindexlist, jointlist = jointlist)
dataStr = dataStr + jointcontroller
else:
dataStr = makeTag(indentL+1, 'children', 'size="1"', writeMesh(ob.getData(), meshname, refID,indentL+1))
else:
dataStr = ''
else:
dataStr = ''
mat = ob.getMatrix('worldspace')
if CONV_COORDS:
## if CONV_COORDS_BY_OBJECT:#don't convert matrix otherwise, since verts are converted anyway
## mat = mat * matConvert4x4
mat = mat * matConvert4x4
rotQ = mat.toQuat().normalize()
rot = quat2String("localRotation", [rotQ.x, rotQ.z, rotQ.y, rotQ.w], indentL+1)
trans = vec3f2String("localTranslation", [xMult*mat.translationPart()[0], mat.translationPart()[2], mat.translationPart()[1]], indentL+1)
scale = vec3f2String("localScale", [ob.getSize()[0],ob.getSize()[2],ob.getSize()[1]], indentL+1)
else:
## mat = mat * matConvert.resize4x4()
rotQ = mat.toQuat().normalize()
rot = quat2String("localRotation", [rotQ.x, rotQ.y, rotQ.z, rotQ.w], indentL+1)
trans = vec3f2String("localTranslation", mat.translationPart(), indentL+1)
scale = vec3f2String("localScale", ob.getSize(), indentL+1)
sharedident = ' reference_ID="'+getReferenceID(ob)+'" '
if EX_OBJECT_ANIMATIONS:
dataStr += writeObjectAnimation(ob, ob.getName(),indentL+1)
CONV_COORDS_BY_OBJECT = old_CONV_COORDS_BY_OBJECT
children = trans+rot+scale;
nodeStr = makeTag(indentL, 'com.jme.scene.Node', sharedident+'name="'+ob.getName()+'" ', dataStr+children)
return nodeStr
def writeMesh(mesh, meshname, refID, indentL = 0, children = '', onlyVerts = False):
global roundAmount, unTriFaces
global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS
global HAS_SHOWN_MTA_MATERIAL_SPLIT_WARNING, HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING
global CONV_COORDS
jmeMeshes = {} # key format is (materialIndex, isDoubleSided)
mindex = 0
if EX_MATERIALS:
materials = mesh.getMaterials()
else:
materials = []
for m in materials:
if len(materials) > 1:
if EX_ANIMATIONS and not HAS_SHOWN_MTA_MATERIAL_SPLIT_WARNING:
Blender.Draw.PupMenu("Warning:%t|Morph Target Animation for single Meshes with \
multiple Materials will NOT WORK. Please split \
your mesh up! (See 'notes' in script docs)")
HAS_SHOWN_MTA_MATERIAL_SPLIT_WARNING = True
j = jmeMesh(meshname+'.'+m.getName(), refID)
else:
j = jmeMesh(meshname, refID)
if EX_MATERIALS:
j.setMaterial(jmeMaterial(m))
jmeMeshes[(mindex, None)] = j
mindex += 1
if not len(materials):# a blender NMesh may have no material at all
jmeMeshes[(0, None)] = jmeMesh(meshname, refID)
numJmeVerts = [len(mesh.verts)] # to make this accessible from within processVertInFace, it cannot be an int, but must be a list. oh wel..
#----faces processing (indices, colors, uvs)---#000000#FFFFFF-------------------------------------------
def processVertInFace(face, vertindex):
global HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING
if EX_MATERIALS:
matIndex = face.materialIndex
else:
matIndex = 0
vert = face.v[vertindex]
#----vertex processing (vertex coords, normals)---#000000#FFFFFF------------------------------------------
twosided = face.mode & Blender.NMesh.FaceModes['TWOSIDE'] == Blender.NMesh.FaceModes['TWOSIDE']
#---make different materials and CullStates different meshes---#000000#FFFFFF---------------------------------
jmeVert = jmeVertex([vert.co[0], vert.co[1], vert.co[2]], [vert.no[0], vert.no[1], vert.no[2]], vert)
if jmeMeshes.has_key((matIndex, twosided)):
jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index)
elif jmeMeshes.has_key((matIndex, None)): # matIndex exists, but twosided has not yet been set
jmeMeshes[(matIndex, twosided)] = jmeMeshes.pop((matIndex, None))
jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index)
else:# matIndex exists, but not with this twosided value
if EX_MATERIALS:
newmesh = jmeMesh(meshname+'.'+materials[matIndex].name, refID)
else:
newmesh = jmeMesh(meshname, refID)
if EX_ANIMATIONS and not HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING:
Blender.Draw.PupMenu("Warning:%t|Morph Target Animation for single Meshes with \
different twosided-values among their faces will not work as expected. Please split \
your mesh up! (See 'notes' in script docs)")
HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING = True
newmesh.setMaterial(jmeMeshes[(matIndex, not twosided)].material)
newmesh.setTexture(jmeMeshes[(matIndex, not twosided)].texture)
jmeMeshes[(matIndex, twosided)] = newmesh
jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index)
retIndex = vert.index
if(len(face.col) and EX_VERTEXCOLORS):
curCol = [ face.col[vertindex].r/255.0,\
face.col[vertindex].g/255.0,\
face.col[vertindex].b/255.0,\
face.col[vertindex].a/255.0]
if not jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).color:
jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).setRGBA(curCol)
# TODO: this might be bad, I just thought that vertex colors are by
# shared vertex anyway, and commented out this whole block to prevent a
# bug resulting in wrong vertex indices happening in there
## elif jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).color <> curCol:#create a new jmeVertex
## newvert = jmeMeshes[(matIndex,twosided)].getVertByOldIndex(retIndex).copyNewColor(curCol)
## numJmeVerts[0] += 1
## retIndex = numJmeVerts[0] - 1
## jmeMeshes[(matIndex,twosided)].appendVert(newvert, retIndex)
# TODO: support sticky uvs (would anybody need them, anyway?)
if(len(face.uv) and EX_UVS and mesh.hasFaceUV()):
curUV = [face.uv[vertindex][0], face.uv[vertindex][1]]
if not jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).uv:
jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).setUV(curUV)
elif jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).uv <> curUV:#create a new jmeVertex
newvert = jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).copyNewUV(curUV)
numJmeVerts[0] += 1
retIndex = numJmeVerts[0] - 1
jmeMeshes[(matIndex, twosided)].appendVert(newvert, retIndex)
return retIndex
for f in mesh.faces:
if EX_MATERIALS:
matIndex = f.materialIndex
else:
matIndex = 0
twosided = f.mode & Blender.NMesh.FaceModes['TWOSIDE'] == Blender.NMesh.FaceModes['TWOSIDE']
if len(f.v) == 3:
for vindex in range(3):#loop through the 3 vertices
indx = processVertInFace(f, vindex)
jmeMeshes[(matIndex, twosided)].appendIndex(indx)
## indices.append(indx)
elif len(f.v) == 4:# triangulate face
for vindex in [0,1,2]:#loop through the first 3 vertices
indx = processVertInFace(f, vindex)
jmeMeshes[(matIndex, twosided)].appendIndex(indx)
## indices.append(indx)
for vindex in [2,3,0]:#loop through the last 3 vertices
indx = processVertInFace(f, vindex)
jmeMeshes[(matIndex, twosided)].appendIndex(indx)
## indices.append(indx)
else:#if len(f.v) < 3 or >4 show a message
if not unTriFaces:#check if we have already shown this message...
Blender.Draw.PupMenu("Export error%t|one or more faces have < 3 or >4 vertices.")
unTriFaces = 1
#----materials creation---#000000#FFFFFF-----------------------------------------
if(EX_MATERIALS and not onlyVerts):
matIndex = 0
for m in mesh.getMaterials():#take only the first material... for now...
if type(m) == Blender.Types.MaterialType:
if jmeMeshes.has_key((matIndex, None)):
jmeMeshes[(matIndex, None)].setMaterial(jmeMaterial(m))
elif jmeMeshes.has_key((matIndex, True)):
jmeMeshes[(matIndex, True)].setMaterial(jmeMaterial(m))
elif jmeMeshes.has_key((matIndex, False)):
jmeMeshes[(matIndex, False)].setMaterial(jmeMaterial(m))
mtex = m.getTextures()[0]
if type(mtex) == Blender.Types.MTexType:
if jmeMeshes.has_key((matIndex, None)):
jmeMeshes[(matIndex, None)].setTexture(jmeTexture(mtex))
if jmeMeshes.has_key((matIndex, True)):
jmeMeshes[(matIndex, True)].setTexture(jmeTexture(mtex))
if jmeMeshes.has_key((matIndex, False)):
jmeMeshes[(matIndex, False)].setTexture(jmeTexture(mtex))
matIndex += 1
ret = ''
for key in jmeMeshes.keys():
twosided = key[1]
value = jmeMeshes[key]
value.setTwoSided(twosided)
ret += value.toString(indentL, children, onlyVerts = onlyVerts)
return ret
def writeJointMesh(mesh, meshname, refID,indentL = 0, children = '', onlyVerts = False, jointindexlist = [], jointlist = []):
global roundAmount, unTriFaces
global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS
global CONV_COORDS
jmeMeshes = {} # key format is (materialIndex, isDoubleSided)
mindex = 0
if EX_MATERIALS:
materials = mesh.getMaterials()
else:
materials = []
for m in materials:
if len(materials) > 1:
j = jmeMesh(meshname+'.'+m.getName(), refID)
else:
j = jmeMesh(meshname, refID)
if EX_MATERIALS:
j.setMaterial(jmeMaterial(m))
jmeMeshes[(mindex, None)] = j
mindex += 1
if not len(materials):# a blender NMesh can have no material at all
jmeMeshes[(0, None)] = jmeMesh(meshname, refID)
numJmeVerts = [len(mesh.verts)] # to make this accessible from within processVertInFace, it cannot be an int, but must be a list. oh wel..
#----faces processing (indices, colors, uvs)---#000000#FFFFFF-------------------------------------------
def processVertInFace(face, vertindex):
## global jointindexlist, jointlist
if EX_MATERIALS:
matIndex = face.materialIndex
else:
matIndex = 0
vert = face.v[vertindex]
#----vertex processing (vertex coords, normals)---#000000#FFFFFF------------------------------------------
twosided = face.mode & Blender.NMesh.FaceModes['TWOSIDE'] == Blender.NMesh.FaceModes['TWOSIDE']
#---make different materials and CullStates different meshes---#000000#FFFFFF---------------------------------
jmeVert = jmeVertex([vert.co[0], vert.co[1], vert.co[2]], [vert.no[0], vert.no[1], vert.no[2]], vert)
if jointindexlist:
ix = jointindexlist[vert.index]
if ix > -1:
jmeVert.setJoint(jointlist[ix])
else:
jmeVert.setJoint(None)
if jmeMeshes.has_key((matIndex, twosided)):
jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index)
elif jmeMeshes.has_key((matIndex, None)): # matIndex exists, but twosided has not yet been set
jmeMeshes[(matIndex, twosided)] = jmeMeshes.pop((matIndex, None))
jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index)
else:# matIndex exists, but not with this twosided value
if EX_MATERIALS:
newmesh = jmeMesh(meshname+'.'+materials[matIndex].name, refID)
else:
newmesh = jmeMesh(meshname, refID)
newmesh.setMaterial(jmeMeshes[(matIndex, not twosided)].material)
newmesh.setTexture(jmeMeshes[(matIndex, not twosided)].texture)
jmeMeshes[(matIndex, twosided)] = newmesh
jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index)
retIndex = vert.index
if(len(face.col) and EX_VERTEXCOLORS):
curCol = [ face.col[vertindex].r/255.0,\
face.col[vertindex].g/255.0,\
face.col[vertindex].b/255.0,\
face.col[vertindex].a/255.0]
if not jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).color:
jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).setRGBA(curCol)
elif jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).color <> curCol:#create a new jmeVertex
newvert = jmeMeshes[(matIndex,twosided)].getVertByOldIndex(retIndex).copyNewColor(curCol)
numJmeVerts[0] += 1
retIndex = numJmeVerts[0] - 1
jmeMeshes[(matIndex,twosided)].appendVert(newvert, retIndex)
# TODO: support sticky uvs (would anybody need them, anyway?)
if(len(face.uv) and EX_UVS and mesh.hasFaceUV()):
curUV = [face.uv[vertindex][0], face.uv[vertindex][1]]
if not jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).uv:
jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).setUV(curUV)
elif jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).uv <> curUV:#create a new jmeVertex
newvert = jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).copyNewUV(curUV)
numJmeVerts[0] += 1
retIndex = numJmeVerts[0] - 1
jmeMeshes[(matIndex, twosided)].appendVert(newvert, retIndex)
return retIndex
for f in mesh.faces:
if EX_MATERIALS:
matIndex = f.materialIndex
else:
matIndex = 0
twosided = f.mode & Blender.NMesh.FaceModes['TWOSIDE'] == Blender.NMesh.FaceModes['TWOSIDE']
if len(f.v) == 3:
for vindex in range(3):#loop through the 3 vertices
indx = processVertInFace(f, vindex)
jmeMeshes[(matIndex, twosided)].appendIndex(indx)
## indices.append(indx)
elif len(f.v) == 4:# triangulate face
for vindex in [0,1,2]:#loop through the first 3 vertices
indx = processVertInFace(f, vindex)
jmeMeshes[(matIndex, twosided)].appendIndex(indx)
## indices.append(indx)
for vindex in [2,3,0]:#loop through the last 3 vertices
indx = processVertInFace(f, vindex)
jmeMeshes[(matIndex, twosided)].appendIndex(indx)
## indices.append(indx)
else:#if len(f.v) < 3 or >4 show a message
if not unTriFaces:#check if we have already shown this message...
Blender.Draw.PupMenu("Export error%t|one or more faces have < 3 or >4 vertices.")
unTriFaces = 1
#----materials creation---#000000#FFFFFF-----------------------------------------
if(EX_MATERIALS and not onlyVerts):
matIndex = 0
for m in mesh.getMaterials():#take only the first material... for now...
if type(m) == Blender.Types.MaterialType:
if jmeMeshes.has_key((matIndex, None)):
jmeMeshes[(matIndex, None)].setMaterial(jmeMaterial(m))
elif jmeMeshes.has_key((matIndex, True)):
jmeMeshes[(matIndex, True)].setMaterial(jmeMaterial(m))
elif jmeMeshes.has_key((matIndex, False)):
jmeMeshes[(matIndex, False)].setMaterial(jmeMaterial(m))
mtex = m.getTextures()[0]
if type(mtex) == Blender.Types.MTexType:
if jmeMeshes.has_key((matIndex, None)):
jmeMeshes[(matIndex, None)].setTexture(jmeTexture(mtex))
if jmeMeshes.has_key((matIndex, True)):
jmeMeshes[(matIndex, True)].setTexture(jmeTexture(mtex))
if jmeMeshes.has_key((matIndex, False)):
jmeMeshes[(matIndex, False)].setTexture(jmeTexture(mtex))
matIndex += 1
ret = ''
for key in jmeMeshes.keys():
twosided = key[1]
value = jmeMeshes[key]
value.setTwoSided(twosided)
ret += value.toString(indentL, children, onlyVerts = False, jointmesh = True)
return ret
def keyframesToBlenderText(keyframes):
try:
text = Blender.Text.Get(KEYFRAMES)
text.clear()
except NameError:# text doesn't exist, this means that keyframes have been generated
text = Blender.Text.New(KEYFRAMES)
text.write(ANIMHELPTEXT+"\n")
text.set('follow_cursor', 0)#don't confuse the user by scrolling to the text's end
ks = keyframes.keys()
ks.sort()
for i in ks:
if len(keyframes[i]):
text.write(str(i)+"\t"+keyframes[i]+"\n")
else:
text.write(str(i)+"\n")
## text.set('follow_cursor', 1)
def textToKFDict(blenderText):
ret = {}
for i in blenderText.asLines():
if len(i):
kfnum = i.split()[0]
kfname = ''
if len(i.split(None, 1)) >= 2:
kfname = i.split(None, 1)[1]
try:
ret[int(kfnum)] = kfname#None as separator: behave as in split()
except ValueError: #assume it's a comment...
pass
return ret
def loadKeyframes(FORCE_NEW_KEYFRAMES = False):
global animPupShown, keyframe_gen_step
ret = {}
start = Blender.Get('staframe')
end = Blender.Get('endframe')
if(FORCE_NEW_KEYFRAMES):
ssel = Blender.Draw.PupIntInput("Keyframe step: ", keyframe_gen_step, 1, 9999)
if ssel:
keyframe_gen_step = ssel
exists = True
try:
ret = textToKFDict(Blender.Text.Get(KEYFRAMES))
if not FORCE_NEW_KEYFRAMES:
return ret
except NameError:#a text named is not found, generate keyframes
exists = False
if not animPupShown:
animPupShown = True
Blender.Draw.PupMenu('Morph target animation keyframes generated%t|Check text "jme keyframes" in a text window')
if exists:
isel = Blender.Draw.PupMenu('Overwrite existing keyframes?%t|Yes|No')
if isel <> 1:
return ret
else:
ret = {}
ret[start] = 'keyframe names go here'
for i in range(start+keyframe_gen_step, end, keyframe_gen_step):
ret[i] = ''
ret[end] = ''
keyframesToBlenderText(ret)#save the generated keyframes in a text window
return ret
def main(filename):
global CURRENT_FILENAME,CONV_COORDS
update_RegistryInfo()
def buildObjectHierarchy(ObjectsList):
'''build a top-down hierarchy of blender objects, which only support getParent()'''
toplevel = {}
hier = {}
for o in ObjectsList:
p = o.getParent()
if p:
if hier.has_key(p.getName()):
hier[p.getName()].append(o.getName())
else:
hier[p.getName()] = [o.getName()]
else:
toplevel[o.getName()] = {}
def recurse(cc):
ret = {}
if(hier.has_key(cc)):
for i in hier[cc]:
ret[i] = recurse(i)
return ret
for t in toplevel.keys():
if hier.has_key(t):
for c in hier[t]:
toplevel[t][c] = recurse(c)
return toplevel
def writeObjectsHierarchy(oDict, indentL=0):
ret = ''
for i in oDict.keys():
ret += writeObject( Blender.Object.Get(i), \
indentL, \
writeObjectsHierarchy(oDict[i], indentL+1))
return ret
print "starting export to jME XML file format..."
print "-----------------------------------------"
if Blender.Window.EditMode(): Blender.Window.EditMode(0)
result = '\n'
result += '\n'
obList = Blender.Object.GetSelected()
result += '\n'
# TODO: hierarchy is not used right now
## oDict = buildObjectHierarchy(Blender.Object.Get())
## result += writeObjectsHierarchy(oDict, 1)
objects = ''
step = 0.95 / len(obList)
pos = 0.0
objectContent = False#flag to indicate if anything containing exportable data has been selected
for obj in Blender.Object.GetSelected():
obstr = writeObject(obj, 2)
## print obstr[-3]
if not obstr[-3] is "/":
objectContent = True
objects += obstr
Blender.Window.DrawProgressBar(pos,'Exporting '+obj.getName())
pos += step
result += objects
result += '\n'
print "-----------------------------------------"
print "done exporting to jME XML file format."
if not objectContent:
Blender.Draw.PupMenu("Warning:%t|No objects with exportable data (e.g. meshes) exported!")
if type(filename) == type(''):
CURRENT_FILENAME = filename
if filename.find('.xml', -4) <= 0:
filename += '.xml'
file = open(filename, "w")
Blender.Window.DrawProgressBar(0.96,'Writing xml file...')
try:
file.write(result)
finally:
file.close()
else:
Blender.Window.DrawProgressBar(0.96,'Sending xml...')
try:
filename.send(result)
except:
Blender.Draw.PupMenu("Error:%t|Unable to send xml to server")
finally:
filename.close()
Blender.Window.DrawProgressBar(1.0,'Done! jME Export finished.')
def gui():
global CURRENT_FILENAME
if CURRENT_FILENAME and len(CURRENT_FILENAME):
i = CURRENT_FILENAME.rfind('.')
if i > 0:
CURRENT_FILENAME = CURRENT_FILENAME[:i] + ".xml"
Blender.Window.FileSelector(main, "Export jME XML", CURRENT_FILENAME)
else:
Blender.Window.FileSelector(main, "Export jME XML")
def draw():
global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS, CURRENT_FILENAME
global CONV_COORDS_BY_OBJECT
# clearing screen
Blender.BGL.glClearColor(0.7, 0.7, 0.7, 1)
Blender.BGL.glClear(Blender.BGL.GL_COLOR_BUFFER_BIT)
# background
width, height = Blender.Window.GetAreaSize()
x = width / 2 - 335 / 2
y = height - 240
if x < 10: x = 10
if y < 220: y = 220
Blender.BGL.glColor3f(0.9, 0.9, 0.9)
Blender.BGL.glRectf(x - 10,y,width - x, y - 222)
lh1 = 16
# logo
Blender.BGL.glColor3f(0.878,0.773,0.545)
Blender.BGL.glRectf(x - 10, y + 14, width - x ,y-2)
Blender.BGL.glColor3f(0.28,0.2,0)
Blender.BGL.glRectf(x - 12, y + 16, width - x - 2,y)
Blender.BGL.glRasterPos2d(x-10, y - 15)
Blender.BGL.glEnable(Blender.BGL.GL_BLEND)
Blender.BGL.glBlendFunc(Blender.BGL.GL_SRC_ALPHA, Blender.BGL.GL_ONE_MINUS_SRC_ALPHA)
Blender.BGL.glDrawPixels(64, 64, Blender.BGL.GL_RGBA, Blender.BGL.GL_BYTE, LOGO)
Blender.BGL.glDisable(Blender.BGL.GL_BLEND)
Blender.BGL.glColor3f(0.2, 0.2, 0.2)
Blender.BGL.glRasterPos2d(x + 55+1, y+4+1)
Blender.Draw.Text("jME Exporter")
Blender.BGL.glColor3f(1, 1, 1)
Blender.BGL.glRasterPos2d(x + 55, y+4)
Blender.Draw.Text("jME Exporter * Version 2 *", "large")
# text
Blender.BGL.glColor3f(0, 0, 0)
Blender.Draw.Button("Help",10, x+270, y+2, (width-x) - (x+275), 14)
y -= 25
Blender.BGL.glRasterPos2d(x+10, y)
Blender.Draw.Text("All selected Objects will be exported to jme Nodes.",'small')
y -= lh1 - 3
Blender.BGL.glRasterPos2d(x+10, y)
Blender.Draw.Text("Only meshes will have data, every Node will have loc, rot and size.",'small')
y -= lh1
Blender.BGL.glRasterPos2d(x+10, y)
Blender.Draw.Text("TextureStates will be created from the first Texture in",'small')
y -= lh1 - 3
Blender.BGL.glRasterPos2d(x+10, y)
Blender.Draw.Text("the Object's Material.",'small')
# Buttons
y -= 40
col2x = x+170
Blender.Draw.Toggle("Export materials", 5, x, y, 155, 20, EX_MATERIALS, '')
Blender.Draw.Toggle("Object animations", 8, col2x, y, 155, 20, EX_OBJECT_ANIMATIONS, '')
y -= 22
Blender.Draw.Toggle("Export texture coordinates", 4, x, y, 155, 20, EX_UVS, '')
Blender.Draw.Toggle("Morph Target animations", 3, col2x, y, 155, 20, EX_ANIMATIONS, '')
y -= 22
Blender.Draw.Toggle("Export vertex colors", 6, x, y, 155, 20, EX_VERTEXCOLORS, '')
## Blender.Draw.Toggle("Skeletal animations", 7, col2x, y, 155, 20, JOINT_ANIMATION, '')
y -= 22
## Blender.Draw.Toggle("Object coord conversion", 11, x, y, 155, 20, CONV_COORDS_BY_OBJECT, 'Convert coords by object rotation, rather than vertex placement')
Blender.Draw.Button("Generate Keyframes", 9, col2x, y, 155, 20, 'Creates keyframes every frames, where can be adjusted')
y -= 40
Blender.Draw.Button("Export", 2, x, y, 107, 25)
Blender.Draw.Button("Cancel", 1, x+109, y, 107, 25)
Blender.Draw.Button("Send", 30, x+218, y, 107, 25, 'Attempts to send xml to a server')
def update_RegistryInfo():
global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS, CURRENT_FILENAME, EX_OBJECT_ANIMATIONS
global CONV_COORDS_BY_OBJECT, JOINT_ANIMATION,animPupShown, keyframe_gen_step
d = {}
d['EX_ANIMATIONS'] = EX_ANIMATIONS
d['EX_MATERIALS'] = EX_MATERIALS
d['EX_VERTEXCOLORS'] = EX_VERTEXCOLORS
d['EX_UVS'] = EX_UVS
if type(CURRENT_FILENAME) == type(''):
d['CURRENT_FILENAME'] = CURRENT_FILENAME
else:
d['CURRENT_FILENAME'] = None
d['KEYFRAMES'] = KEYFRAMES
d['EX_OBJECT_ANIMATIONS'] = EX_OBJECT_ANIMATIONS
d['JOINT_ANIMATION'] = JOINT_ANIMATION
d['animPupShown'] = animPupShown
d['keyframe_gen_step'] = keyframe_gen_step
d['CONV_COORDS_BY_OBJECT'] = CONV_COORDS_BY_OBJECT
Blender.Registry.SetKey('jmeExport', d)
def load_RegistryInfo():
global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS, CURRENT_FILENAME, EX_OBJECT_ANIMATIONS
global CONV_COORDS, KEYFRAMES, JOINT_ANIMATION, animPupShown, keyframe_gen_step
d = Blender.Registry.GetKey('jmeExport')
if d:
try:
EX_ANIMATIONS = d['EX_ANIMATIONS']
EX_MATERIALS = d['EX_MATERIALS']
EX_VERTEXCOLORS = d['EX_VERTEXCOLORS']
EX_UVS = d['EX_UVS']
CURRENT_FILENAME = d['CURRENT_FILENAME']
KEYFRAMES = d['KEYFRAMES']
EX_OBJECT_ANIMATIONS = d['EX_OBJECT_ANIMATIONS']
JOINT_ANIMATION = d['JOINT_ANIMATION']
animPupShown = d['animPupShown']
keyframe_gen_step = d['keyframe_gen_step']
## CONV_COORDS_BY_OBJECT = d['CONV_COORDS_BY_OBJECT']
except:
pass
def bevent(evt):
global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS, CURRENT_FILENAME, EX_OBJECT_ANIMATIONS
global CONV_COORDS_BY_OBJECT, JOINT_ANIMATION
global TextureStatesWarningShown
global animPupShown
if evt == 1: # Cancel
Blender.Draw.Exit()
elif evt == 2: # Export
if not len(Blender.Object.GetSelected()):
Blender.Draw.PupMenu("Error:%t|Nothing selected!")
return
update_RegistryInfo()
Blender.Draw.Exit()
gui()
elif evt == 3:#ex anim
loadKeyframes()
EX_ANIMATIONS = not EX_ANIMATIONS
if EX_ANIMATIONS and JOINT_ANIMATION:
Blender.Draw.PupMenu("Warning%t|It is not recommendable to export skeletal and morph target animation at the same time. See help.")
Blender.Draw.Redraw(1)
elif evt == 4:#ex uvs
EX_UVS = not EX_UVS
if EX_UVS and not EX_MATERIALS and not TextureStatesWarningShown:
TextureStatesWarningShown = True
Blender.Draw.PupMenu("Warning%t|TextureStates will only be created if Export Material is set. UVs will be created, though.")
Blender.Draw.Redraw(1)
elif evt == 5:#ex materials
EX_MATERIALS = not EX_MATERIALS
if EX_UVS and not EX_MATERIALS and not TextureStatesWarningShown:
TextureStatesWarningShown = True
Blender.Draw.PupMenu("Warning%t|TextureStates will only be created if Export Material is set. UVs will be created, though.")
Blender.Draw.Redraw(1)
elif evt == 6:#ex vertex colors
EX_VERTEXCOLORS = not EX_VERTEXCOLORS
Blender.Draw.Redraw(1)
elif evt == 7:#JOINT_ANIMATION
JOINT_ANIMATION = not JOINT_ANIMATION
if JOINT_ANIMATION:
Blender.Draw.PupMenu("Warning%t|Skeletal animation does NOT work currently. Hopefully,.this will be fixed soon, but at present, there is no guarantee at all.")
if EX_ANIMATIONS and JOINT_ANIMATION:
Blender.Draw.PupMenu("Warning%t|It is not recommendable to export skeletal and morph target animation at the same time. See help.")
Blender.Draw.Redraw(1)
elif evt == 8:#ex objectanim
loadKeyframes()
EX_OBJECT_ANIMATIONS = not EX_OBJECT_ANIMATIONS
Blender.Draw.Redraw(1)
elif evt == 9:#generate keyframes
loadKeyframes(True)
update_RegistryInfo()
Blender.Draw.Redraw(1)
elif evt == 10:#show help
Blender.Draw.PupMenu("Info%t|Please use Help->Scripts Help Browser in the Blender menu")
#the following crashes Blender 2.41 when the script is cancelled an restarted (WinXP)
#Blender.ShowHelp('jmeXMLExport.py')
Blender.Draw.Redraw(1)
## elif evt == 11:#coord conversion
## CONV_COORDS_BY_OBJECT = not CONV_COORDS_BY_OBJECT
## Blender.Draw.Redraw(1)
elif evt == 30:#net send
import socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 5678))
main(s)
except:
Blender.Draw.PupMenu("Error::%t|Cannot connect to host")
Blender.Draw.Redraw(1)
def event(evt, val):
if evt == Blender.Draw.ESCKEY and not val:
Blender.Draw.Exit()
LOGO = Blender.BGL.Buffer(Blender.BGL.GL_BYTE, [64, 64*4],\
[\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 39, 21, 99, 56, 49, 27, 124, 66, 58, 33, 127, 71, 61, 32, 127, 75, 65, 33, 127, 79, 67, 34, 127, 81, 69, 35, 127, 81, 69, 34, 127, 78, 66, 33, 127, 74, 63, 33, 127, 68, 58, 32, 127, 58, 51, 30, 112, 34, 33, 21, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 44, 25, 91, 61, 52, 27, 105, 71, 61, 32, 108, 76, 65, 33, 121, 88, 75, 39, 127, 88, 75, 39, 127, 89, 75, 40, 127, 89, 75, 40, 127, 88, 75, 39, 127, 87, 75, 39, 127, 88, 75, 40, 127, 89, 75, 40, 127, 88, 75, 39, 127, 88, 75, 39, 127, 79, 67, 35, 124, 74, 64, 33, 111, 62, 54, 29, 106, 50, 43, 25, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 41, 24, 91, 61, 52, 29, 105, 74, 63, 33, 109, 79, 68, 35, 123, 89, 75, 40, 127, 88, 76, 38, 127, 90, 75, 40, 127, 91, 78, 40, 127, 93, 79, 42, 127, 94, 80, 42, 127, 94, 80, 42, 127, 93, 79, 41, 127, 92, 78, 40, 127, 90, 77, 40, 127, 89, 76, 39, 127, 88, 75, 39, 127, 88, 75, 39, 127, 89, 75, 40, 127, 88, 75, 39, 127, 90, 75, 39, 127, 75, 64, 34, 123, 61, 52, 28, 95, 45, 43, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 42, 23, 91, 64, 56, 29, 109, 77, 66, 34, 123, 89, 75, 40, 127, 92, 78, 41, 127, 96, 82, 43, 127, 101, 87, 46, 127, 106, 89, 45, 127, 109, 92, 48, 127, 108, 91, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 47, 127, 107, 90, 45, 127, 102, 88, 45, 127, 97, 82, 43, 127, 91, 77, 40, 127, 88, 75, 40, 127, 89, 75, 41, 127, 88, 75, 40, 127, 79, 67, 34, 124, 65, 56, 32, 109, 44, 39, 27, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 41, 32, 36, 66, 56, 30, 99, 79, 67, 36, 123, 93, 78, 41, 127, 100, 85, 44, 127, 106, 89, 47, 127, 109, 92, 48, 127, 109, 92, 49, 127, 109, 92, 48, 127, 109, 92, 47, 127, 109, 92, 47, 127, 109, 92, 47, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 110, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 109, 92, 47, 127, 108, 92, 48, 127, 102, 87, 44, 127, 92, 80, 41, 127, 89, 76, 41, 127, 87, 75, 41, 127, 88, 75, 38, 127, 65, 57, 31, 114, 40, 39, 30, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 48, 28, 92, 77, 66, 35, 113, 90, 76, 39, 124, 105, 89, 46, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 101, 86, 45, 127, 90, 77, 40, 127, 88, 76, 39, 127, 80, 68, 35, 125, 64, 55, 28, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 57, 30, 95, 86, 73, 38, 123, 106, 90, 46, 127, 109, 93, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 49, 127, 109, 93, 48, 127, 106, 90, 48, 127, 94, 79, 42, 127, 88, 74, 41, 127, 76, 66, 33, 123, 54, 47, 26, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 63, 33, 95, 93, 78, 40, 123, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 93, 48, 127, 108, 91, 47, 127, 96, 81, 44, 127, 87, 75, 39, 127, 70, 60, 31, 110, 45, 40, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 62, 32, 95, 95, 80, 41, 123, 109, 92, 49, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 109, 92, 48, 127, 95, 81, 43, 127, 80, 68, 35, 124, 54, 47, 25, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 55, 29, 92, 93, 78, 40, 123, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 108, 91, 48, 127, 107, 92, 48, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 109, 91, 47, 127, 93, 79, 42, 127, 64, 54, 29, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 48, 34, 35, 86, 73, 39, 113, 110, 92, 49, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 106, 89, 45, 127, 56, 46, 28, 127, 100, 87, 44, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 105, 90, 47, 127, 78, 65, 34, 110, 30, 31, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 50, 28, 45, 40, 33, 27, 19, 63, 54, 30, 101, 89, 76, 40, 124, 108, 92, 47, 127, 109, 92, 48, 127, 108, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 107, 91, 47, 127, 59, 50, 29, 127, 110, 92, 48, 127, 109, 91, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 87, 74, 38, 124, 43, 36, 18, 97, 34, 30, 22, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 53, 28, 89, 86, 74, 39, 111, 91, 78, 41, 113, 83, 70, 38, 124, 62, 53, 30, 127, 62, 55, 29, 127, 94, 80, 44, 127, 110, 93, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 93, 48, 127, 63, 55, 32, 127, 110, 92, 48, 127, 109, 91, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 108, 92, 47, 127, 56, 45, 20, 124, 56, 41, 10, 111, 55, 40, 10, 106, 48, 36, 10, 106, 39, 28, 10, 106, 25, 18, 6, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 62, 34, 105, 109, 92, 47, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 108, 90, 46, 127, 76, 64, 36, 127, 61, 52, 29, 127, 67, 57, 31, 127, 86, 73, 39, 127, 89, 77, 44, 127, 102, 86, 45, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 49, 127, 109, 92, 49, 127, 96, 84, 45, 127, 97, 82, 42, 127, 110, 92, 47, 127, 61, 53, 31, 127, 110, 93, 48, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 51, 40, 19, 127, 71, 51, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 55, 40, 10, 123, 52, 37, 9, 109, 40, 30, 10, 106, 25, 18, 6, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 54, 31, 91, 93, 79, 41, 123, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 47, 127, 110, 93, 47, 127, 105, 90, 47, 127, 85, 72, 37, 127, 81, 69, 36, 127, 104, 89, 47, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 108, 90, 46, 127, 71, 61, 34, 127, 68, 57, 30, 127, 106, 91, 48, 127, 99, 83, 44, 127, 66, 56, 31, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 111, 93, 49, 127, 47, 37, 14, 127, 72, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 51, 13, 127, 72, 51, 14, 127, 55, 40, 9, 123, 49, 36, 9, 109, 40, 30, 11, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 62, 34, 95, 95, 80, 41, 123, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 47, 127, 108, 93, 48, 127, 109, 92, 48, 127, 108, 92, 49, 127, 73, 63, 33, 127, 57, 52, 30, 127, 96, 83, 44, 127, 109, 92, 48, 127, 109, 92, 48, 127, 103, 87, 44, 127, 107, 91, 49, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 94, 81, 42, 127, 50, 36, 10, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 61, 44, 11, 123, 46, 33, 9, 109, 25, 18, 6, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 57, 31, 106, 104, 89, 45, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 103, 87, 45, 127, 69, 58, 35, 127, 59, 51, 27, 127, 94, 80, 43, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 49, 127, 59, 49, 25, 127, 70, 49, 12, 127, 70, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 14, 127, 73, 51, 13, 127, 53, 38, 9, 123, 42, 32, 10, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 37, 22, 79, 68, 57, 31, 120, 63, 53, 29, 127, 87, 74, 40, 127, 107, 92, 47, 127, 111, 93, 49, 127, 109, 93, 48, 127, 109, 93, 48, 127, 109, 92, 46, 127, 110, 93, 49, 127, 107, 92, 48, 127, 92, 78, 42, 127, 70, 58, 32, 127, 63, 54, 29, 127, 69, 58, 35, 127, 102, 86, 44, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 47, 127, 110, 93, 47, 127, 93, 80, 41, 127, 26, 19, 8, 127, 62, 44, 13, 127, 73, 51, 12, 127, 70, 52, 13, 127, 71, 52, 14, 127, 72, 52, 14, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 60, 44, 11, 123, 47, 34, 10, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 68, 36, 108, 108, 92, 48, 127, 85, 72, 39, 127, 63, 52, 27, 127, 65, 57, 31, 127, 62, 53, 29, 127, 62, 53, 29, 127, 61, 53, 29, 127, 66, 57, 31, 127, 63, 52, 27, 127, 81, 69, 36, 127, 102, 87, 46, 127, 110, 94, 50, 127, 109, 92, 48, 127, 108, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 93, 47, 127, 106, 88, 47, 127, 46, 36, 14, 127, 59, 43, 12, 127, 21, 16, 6, 127, 38, 30, 10, 127, 55, 40, 11, 127, 67, 48, 10, 127, 65, 46, 12, 127, 51, 37, 11, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 62, 44, 10, 123, 46, 34, 10, 95, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 60, 31, 106, 110, 92, 47, 127, 109, 92, 47, 127, 110, 93, 48, 127, 110, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 91, 47, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 107, 90, 46, 127, 47, 37, 20, 127, 67, 48, 15, 127, 71, 53, 14, 127, 55, 41, 12, 127, 43, 31, 9, 127, 58, 43, 10, 127, 49, 37, 9, 127, 51, 39, 12, 127, 66, 46, 14, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 51, 13, 127, 60, 43, 11, 123, 40, 31, 12, 92, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 40, 20, 106, 106, 88, 47, 127, 110, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 102, 86, 46, 127, 40, 33, 18, 127, 59, 43, 12, 127, 71, 52, 12, 127, 71, 51, 12, 127, 72, 52, 14, 127, 57, 43, 13, 127, 42, 31, 8, 127, 70, 51, 15, 127, 72, 52, 13, 127, 71, 52, 15, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 14, 127, 71, 52, 13, 127, 54, 38, 11, 109, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 35, 26, 14, 53, 40, 13, 111, 57, 47, 23, 127, 110, 93, 46, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 93, 48, 127, 110, 92, 46, 127, 110, 93, 47, 127, 107, 92, 46, 127, 110, 92, 48, 127, 108, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 49, 127, 110, 93, 48, 127, 86, 74, 40, 127, 47, 36, 15, 127, 66, 48, 13, 127, 43, 32, 9, 127, 72, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 66, 47, 11, 127, 41, 30, 9, 127, 59, 42, 12, 127, 72, 52, 14, 127, 72, 52, 13, 127, 71, 52, 14, 127, 71, 51, 15, 127, 72, 52, 13, 127, 72, 51, 13, 127, 70, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 63, 45, 12, 123, 45, 34, 15, 109],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 37, 12, 96, 62, 45, 12, 124, 56, 42, 12, 127, 64, 53, 28, 127, 110, 93, 48, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 97, 83, 45, 127, 66, 56, 32, 127, 73, 61, 32, 127, 49, 41, 24, 127, 110, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 102, 86, 46, 127, 57, 48, 26, 127, 54, 39, 13, 127, 71, 52, 14, 127, 71, 52, 13, 127, 45, 33, 11, 127, 64, 47, 16, 127, 72, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 14, 127, 72, 51, 13, 127, 52, 39, 10, 127, 39, 29, 10, 127, 54, 40, 11, 127, 71, 50, 12, 127, 72, 52, 12, 127, 61, 44, 11, 127, 53, 39, 13, 127, 72, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 13, 127, 52, 41, 17, 127],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 37, 10, 95, 61, 44, 12, 123, 70, 52, 12, 127, 71, 52, 13, 127, 57, 43, 14, 127, 57, 47, 26, 127, 105, 89, 46, 127, 109, 92, 47, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 72, 61, 32, 127, 45, 39, 21, 127, 95, 80, 43, 127, 3, 3, 3, 127, 85, 73, 39, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 93, 49, 127, 110, 93, 47, 127, 108, 92, 48, 127, 109, 93, 47, 127, 98, 83, 44, 127, 59, 50, 28, 127, 45, 35, 15, 127, 67, 50, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 15, 127, 70, 51, 13, 127, 37, 28, 7, 127, 71, 50, 11, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 58, 43, 11, 127, 43, 31, 11, 127, 40, 30, 9, 127, 52, 37, 11, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 14, 127, 48, 35, 10, 127],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 30, 12, 91, 54, 40, 11, 109, 63, 46, 12, 123, 70, 52, 14, 127, 47, 34, 12, 127, 42, 31, 11, 127, 52, 38, 10, 127, 48, 36, 9, 127, 28, 23, 11, 127, 70, 60, 32, 127, 108, 90, 47, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 47, 127, 75, 64, 34, 127, 67, 57, 30, 127, 110, 92, 48, 127, 48, 42, 22, 127, 51, 43, 24, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 93, 47, 127, 105, 87, 46, 127, 74, 64, 34, 127, 63, 61, 46, 127, 79, 79, 80, 127, 55, 51, 45, 127, 69, 49, 13, 127, 71, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 63, 46, 12, 127, 43, 32, 9, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 51, 14, 127, 71, 52, 14, 127, 71, 52, 16, 127, 71, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 13, 127, 51, 38, 11, 127],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 32, 14, 95, 58, 42, 12, 123, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 51, 13, 127, 62, 46, 11, 127, 60, 44, 10, 127, 41, 30, 8, 127, 52, 39, 12, 127, 37, 29, 14, 127, 53, 45, 25, 127, 79, 67, 36, 127, 101, 86, 45, 127, 109, 93, 49, 127, 109, 92, 48, 127, 110, 92, 48, 127, 107, 92, 48, 127, 98, 82, 43, 127, 110, 94, 48, 127, 110, 91, 48, 127, 109, 92, 46, 127, 111, 94, 50, 127, 107, 91, 50, 127, 97, 83, 43, 127, 78, 65, 36, 127, 55, 47, 27, 127, 49, 45, 35, 127, 76, 76, 75, 127, 109, 109, 109, 127, 127, 127, 127, 127, 127, 127, 127, 127, 116, 116, 116, 127, 48, 39, 18, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 13, 127, 57, 43, 14, 127, 45, 33, 10, 127, 71, 52, 12, 127, 71, 52, 13, 127, 70, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 14, 127, 52, 40, 16, 127],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 32, 14, 95, 57, 42, 13, 123, 71, 51, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 15, 127, 71, 51, 15, 127, 45, 34, 11, 127, 54, 40, 12, 127, 71, 52, 14, 127, 38, 28, 10, 127, 49, 43, 35, 127, 103, 103, 105, 127, 8, 7, 7, 127, 20, 18, 14, 127, 66, 65, 56, 127, 43, 38, 20, 127, 59, 48, 22, 127, 59, 49, 22, 127, 52, 47, 22, 127, 46, 41, 27, 127, 67, 64, 60, 127, 71, 69, 60, 127, 73, 72, 70, 127, 87, 88, 87, 127, 5, 5, 7, 127, 1, 2, 1, 127, 23, 22, 23, 127, 125, 126, 124, 127, 126, 126, 126, 127, 127, 127, 127, 127, 126, 126, 126, 127, 126, 126, 126, 127, 72, 71, 67, 127, 67, 50, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 13, 127, 71, 52, 15, 127, 61, 45, 13, 127, 41, 29, 9, 127, 69, 50, 15, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 64, 49, 17, 123, 48, 37, 19, 109],\
[0, 0, 0, 0, 0, 0, 0, 0, 39, 30, 13, 91, 57, 42, 13, 123, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 51, 16, 127, 72, 51, 14, 127, 64, 47, 12, 127, 41, 30, 10, 127, 58, 44, 13, 127, 71, 52, 13, 127, 56, 42, 11, 127, 41, 29, 9, 127, 85, 85, 85, 127, 92, 92, 92, 127, 1, 1, 1, 127, 39, 39, 39, 127, 116, 118, 118, 127, 43, 31, 10, 127, 71, 52, 13, 127, 71, 52, 13, 127, 70, 52, 14, 127, 52, 47, 36, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 21, 21, 21, 127, 0, 0, 0, 127, 1, 1, 1, 127, 112, 112, 112, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 115, 115, 116, 127, 48, 37, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 52, 15, 127, 55, 40, 12, 123, 41, 33, 15, 109, 53, 40, 13, 109, 63, 47, 14, 123, 72, 52, 14, 127, 72, 52, 13, 127, 71, 51, 13, 127, 72, 52, 13, 127, 72, 52, 13, 127, 72, 52, 13, 127, 71, 52, 13, 127, 72, 52, 13, 127, 72, 52, 14, 127, 73, 52, 15, 127, 66, 50, 19, 123, 54, 42, 20, 95, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 52, 39, 12, 109, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 60, 44, 10, 127, 42, 31, 10, 127, 44, 33, 10, 127, 69, 51, 13, 127, 70, 52, 14, 127, 71, 51, 14, 127, 40, 30, 8, 127, 41, 33, 17, 127, 123, 123, 123, 127, 70, 70, 70, 127, 0, 0, 0, 127, 78, 78, 78, 127, 104, 104, 105, 127, 51, 38, 11, 127, 71, 53, 14, 127, 71, 53, 14, 127, 71, 52, 16, 127, 54, 48, 38, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 53, 53, 53, 127, 1, 1, 1, 127, 1, 1, 1, 127, 85, 85, 85, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 57, 52, 42, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 52, 15, 127, 55, 40, 11, 109, 0, 0, 0, 0, 0, 0, 0, 0, 43, 34, 17, 91, 52, 40, 18, 109, 59, 45, 18, 123, 76, 59, 24, 127, 75, 57, 21, 127, 74, 56, 20, 127, 74, 55, 19, 127, 75, 56, 20, 127, 75, 58, 23, 127, 78, 61, 27, 127, 66, 52, 24, 123, 54, 43, 22, 95, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 45, 33, 9, 91, 59, 43, 12, 123, 45, 33, 10, 127, 40, 29, 8, 127, 40, 30, 9, 127, 42, 32, 9, 127, 39, 31, 10, 127, 50, 37, 10, 127, 69, 50, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 64, 46, 12, 127, 46, 34, 11, 127, 59, 57, 53, 127, 126, 126, 126, 127, 91, 91, 91, 127, 32, 32, 32, 127, 122, 122, 122, 127, 82, 81, 81, 127, 63, 46, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 51, 46, 34, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 97, 97, 97, 127, 1, 1, 1, 127, 1, 1, 1, 127, 73, 73, 73, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 125, 127, 75, 75, 73, 127, 69, 50, 13, 127, 70, 52, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 52, 14, 127, 52, 38, 10, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 22, 12, 91, 44, 36, 19, 105, 53, 42, 20, 106, 59, 48, 22, 106, 63, 49, 23, 106, 63, 49, 23, 106, 59, 48, 24, 106, 52, 43, 23, 106, 43, 36, 20, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 57, 42, 12, 109, 71, 52, 14, 127, 71, 52, 14, 127, 70, 52, 12, 127, 70, 52, 12, 127, 70, 53, 14, 127, 71, 51, 14, 127, 71, 52, 15, 127, 69, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 72, 53, 16, 127, 48, 38, 16, 127, 56, 40, 9, 127, 84, 86, 86, 127, 126, 126, 126, 127, 126, 126, 126, 127, 126, 126, 126, 127, 126, 126, 126, 127, 59, 56, 51, 127, 72, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 73, 51, 11, 127, 50, 42, 27, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 125, 125, 125, 127, 38, 38, 38, 127, 1, 1, 1, 127, 82, 82, 82, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 99, 99, 99, 127, 58, 41, 13, 127, 71, 52, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 51, 15, 127, 48, 36, 10, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[53, 43, 22, 109, 65, 48, 15, 123, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 51, 14, 127, 71, 51, 14, 127, 73, 55, 17, 127, 80, 63, 32, 127, 45, 36, 17, 127, 53, 39, 11, 127, 105, 106, 105, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 122, 122, 122, 127, 44, 34, 19, 127, 70, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 46, 37, 18, 127, 126, 126, 126, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 119, 119, 119, 127, 85, 85, 85, 127, 123, 123, 123, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 119, 119, 119, 127, 44, 33, 10, 127, 70, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 46, 35, 12, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[57, 48, 29, 127, 73, 54, 18, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 51, 14, 127, 72, 53, 15, 127, 75, 58, 22, 127, 81, 65, 34, 127, 81, 66, 35, 127, 44, 33, 14, 127, 53, 40, 11, 127, 104, 105, 105, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 80, 80, 80, 127, 61, 45, 12, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 72, 52, 16, 127, 49, 36, 10, 127, 114, 114, 114, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 42, 36, 17, 127, 70, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 15, 127, 41, 33, 12, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[59, 48, 28, 127, 79, 62, 29, 127, 71, 53, 16, 127, 71, 52, 13, 127, 70, 52, 14, 127, 70, 52, 14, 127, 70, 53, 13, 127, 71, 53, 16, 127, 75, 57, 22, 127, 80, 63, 32, 127, 81, 66, 35, 127, 73, 59, 31, 123, 64, 52, 27, 112, 48, 37, 15, 123, 64, 49, 13, 127, 70, 67, 68, 127, 125, 126, 125, 127, 126, 127, 125, 127, 113, 115, 115, 127, 46, 38, 22, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 72, 52, 15, 127, 61, 45, 13, 127, 90, 90, 90, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 50, 42, 19, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 59, 44, 12, 118, 38, 31, 13, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[54, 45, 26, 109, 70, 57, 29, 123, 80, 64, 33, 127, 77, 60, 27, 127, 75, 57, 24, 127, 76, 58, 25, 127, 77, 61, 28, 127, 81, 65, 33, 127, 82, 67, 36, 127, 80, 67, 35, 127, 69, 57, 30, 123, 58, 48, 28, 95, 0, 0, 0, 0, 42, 32, 12, 95, 59, 44, 13, 123, 52, 38, 15, 127, 63, 61, 57, 127, 78, 79, 78, 127, 46, 41, 26, 127, 68, 50, 13, 127, 68, 49, 13, 127, 70, 51, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 16, 127, 71, 51, 13, 127, 68, 65, 60, 127, 126, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 43, 39, 19, 127, 71, 51, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 51, 38, 10, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 58, 47, 24, 95, 69, 55, 28, 123, 82, 66, 36, 127, 81, 66, 35, 127, 81, 66, 35, 127, 80, 67, 35, 127, 81, 66, 34, 127, 71, 57, 30, 123, 62, 51, 27, 109, 49, 40, 24, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 41, 11, 109, 71, 52, 16, 127, 68, 50, 12, 127, 65, 47, 13, 127, 71, 52, 14, 127, 68, 50, 15, 127, 40, 30, 10, 127, 71, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 51, 41, 28, 127, 124, 126, 125, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 120, 120, 120, 127, 44, 33, 11, 127, 70, 51, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 51, 15, 127, 61, 45, 12, 123, 43, 33, 12, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 44, 36, 19, 91, 53, 43, 23, 105, 59, 47, 25, 106, 58, 48, 27, 106, 57, 46, 25, 106, 52, 43, 26, 106, 44, 36, 22, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 32, 11, 91, 59, 43, 13, 123, 72, 52, 16, 127, 72, 52, 15, 127, 70, 51, 14, 127, 41, 30, 9, 127, 65, 47, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 54, 41, 10, 127, 99, 99, 99, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 97, 97, 97, 127, 58, 43, 11, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 15, 127, 52, 39, 11, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 32, 11, 91, 51, 38, 10, 105, 50, 37, 10, 106, 44, 33, 12, 109, 55, 42, 21, 123, 73, 54, 18, 127, 70, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 56, 52, 47, 127, 126, 126, 127, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 125, 126, 124, 127, 68, 67, 62, 127, 71, 52, 14, 127, 70, 51, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 59, 43, 12, 123, 40, 31, 12, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 36, 21, 95, 64, 50, 22, 123, 72, 53, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 52, 39, 13, 127, 98, 99, 96, 127, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 116, 117, 116, 127, 47, 38, 17, 127, 71, 52, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 62, 45, 12, 123, 47, 35, 10, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 38, 20, 95, 63, 49, 21, 123, 72, 53, 16, 127, 71, 51, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 57, 42, 11, 127, 73, 52, 15, 127, 47, 40, 26, 127, 116, 117, 117, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 125, 126, 124, 127, 123, 124, 123, 127, 55, 51, 44, 127, 69, 51, 14, 127, 45, 33, 9, 127, 69, 50, 14, 127, 71, 52, 15, 127, 47, 34, 9, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 36, 19, 92, 59, 45, 20, 110, 66, 49, 16, 123, 71, 52, 14, 127, 71, 52, 14, 127, 53, 39, 11, 127, 55, 41, 11, 127, 69, 50, 14, 127, 52, 46, 29, 127, 113, 113, 113, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 114, 115, 115, 127, 56, 52, 45, 127, 65, 48, 15, 127, 64, 47, 13, 127, 44, 33, 11, 127, 70, 51, 13, 127, 51, 37, 10, 123, 25, 19, 7, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 41, 33, 14, 53, 42, 19, 96, 63, 48, 17, 123, 72, 52, 14, 127, 71, 52, 12, 127, 40, 30, 9, 127, 67, 50, 12, 127, 70, 51, 15, 127, 48, 38, 16, 127, 69, 69, 65, 127, 97, 98, 98, 127, 105, 108, 106, 127, 90, 90, 91, 127, 62, 61, 55, 127, 47, 37, 17, 127, 68, 51, 13, 127, 70, 52, 13, 127, 38, 28, 9, 127, 70, 51, 14, 127, 56, 41, 11, 123, 38, 29, 8, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 35, 17, 91, 57, 43, 16, 109, 62, 46, 14, 123, 67, 49, 12, 127, 37, 26, 11, 127, 70, 51, 13, 127, 70, 52, 15, 127, 69, 50, 14, 127, 57, 42, 12, 127, 56, 42, 12, 127, 60, 44, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 14, 127, 43, 32, 10, 127, 61, 46, 12, 127, 57, 42, 12, 123, 41, 31, 12, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 33, 13, 91, 49, 37, 13, 106, 48, 35, 11, 111, 47, 34, 10, 124, 65, 48, 13, 127, 69, 52, 13, 127, 70, 51, 15, 127, 70, 52, 14, 127, 70, 53, 15, 127, 71, 53, 14, 127, 70, 51, 13, 127, 44, 32, 9, 127, 57, 42, 13, 127, 55, 40, 11, 123, 42, 32, 12, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 25, 19, 14, 47, 35, 10, 114, 43, 31, 9, 127, 45, 33, 13, 127, 59, 43, 11, 127, 69, 49, 13, 127, 64, 46, 11, 127, 47, 35, 12, 127, 40, 30, 10, 127, 64, 46, 11, 127, 55, 40, 11, 123, 42, 31, 11, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 35, 12, 96, 61, 44, 12, 124, 71, 52, 15, 127, 68, 50, 14, 127, 54, 39, 11, 127, 46, 35, 9, 127, 51, 38, 10, 127, 64, 46, 14, 127, 72, 52, 15, 127, 56, 41, 13, 123, 41, 31, 12, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 23, 20, 56, 36, 27, 19, 81, 34, 27, 14, 89, 36, 27, 11, 102, 42, 31, 12, 105, 49, 35, 10, 109, 58, 42, 11, 123, 71, 52, 13, 127, 67, 48, 13, 127, 51, 36, 11, 127, 68, 50, 14, 127, 71, 52, 16, 127, 71, 53, 16, 127, 62, 45, 12, 123, 53, 40, 11, 109, 39, 30, 13, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 21, 12, 49, 34, 26, 11, 91, 41, 30, 9, 101, 46, 34, 10, 105, 47, 35, 9, 105, 45, 32, 8, 106, 45, 33, 10, 106, 37, 29, 11, 109, 30, 24, 11, 123, 40, 34, 18, 127, 71, 52, 15, 127, 71, 52, 13, 127, 58, 43, 12, 123, 47, 35, 11, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 27, 10, 113, 51, 39, 12, 124, 57, 42, 12, 111, 49, 36, 13, 106, 36, 29, 13, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 15, 7, 88, 35, 26, 9, 109, 44, 34, 11, 123, 44, 35, 13, 112, 29, 29, 20, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\
]\
)\
if(__name__ == "__main__"):
load_RegistryInfo()
Blender.Draw.Register(draw,event,bevent)