Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorMaxime Curioni <maxime.curioni@gmail.com>2008-10-31 23:05:24 +0300
committerMaxime Curioni <maxime.curioni@gmail.com>2008-10-31 23:05:24 +0300
commit1db8ac58a31b43f1286ca640c939edbfee88a51d (patch)
tree940911ce8f55d0db96f9b5fafeb42480297a18f8 /source
parent911926110baf5b470b4cc06c0be09e3ccfb3934e (diff)
parent027d86b9ff5a4f7b859b28e33d3d40f264a4e55b (diff)
soc-2008-mxcurioni: merged changes to revision 17246
Diffstat (limited to 'source')
-rw-r--r--source/SConscript2
-rw-r--r--source/blender/CMakeLists.txt4
-rw-r--r--source/blender/SConscript16
-rw-r--r--source/blender/blenkernel/BKE_blender.h4
-rw-r--r--source/blender/blenkernel/BKE_displist.h23
-rw-r--r--source/blender/blenkernel/BKE_fluidsim.h1
-rw-r--r--source/blender/blenkernel/BKE_global.h4
-rw-r--r--source/blender/blenkernel/BKE_ipo.h53
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-rw-r--r--source/blender/blenkernel/BKE_particle.h5
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h2
-rw-r--r--source/blender/blenkernel/BKE_writeffmpeg.h10
-rw-r--r--source/blender/blenkernel/BKE_writeframeserver.h2
-rw-r--r--source/blender/blenkernel/CMakeLists.txt7
-rw-r--r--source/blender/blenkernel/SConscript21
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c92
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.h28
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c33
-rw-r--r--source/blender/blenkernel/intern/armature.c19
-rw-r--r--source/blender/blenkernel/intern/bullet.c1
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c2
-rw-r--r--source/blender/blenkernel/intern/collision.c22
-rw-r--r--source/blender/blenkernel/intern/constraint.c32
-rw-r--r--source/blender/blenkernel/intern/curve.c15
-rw-r--r--source/blender/blenkernel/intern/customdata.c7
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c8
-rw-r--r--source/blender/blenkernel/intern/displist.c74
-rw-r--r--source/blender/blenkernel/intern/exotic.c10
-rw-r--r--source/blender/blenkernel/intern/fluidsim.c142
-rw-r--r--source/blender/blenkernel/intern/idprop.c21
-rw-r--r--source/blender/blenkernel/intern/image.c4
-rw-r--r--source/blender/blenkernel/intern/ipo.c3780
-rw-r--r--source/blender/blenkernel/intern/key.c12
-rw-r--r--source/blender/blenkernel/intern/library.c4
-rw-r--r--source/blender/blenkernel/intern/material.c8
-rw-r--r--source/blender/blenkernel/intern/modifier.c80
-rw-r--r--source/blender/blenkernel/intern/multires.c4
-rw-r--r--source/blender/blenkernel/intern/node.c3
-rw-r--r--source/blender/blenkernel/intern/object.c83
-rw-r--r--source/blender/blenkernel/intern/particle.c471
-rw-r--r--source/blender/blenkernel/intern/particle_system.c35
-rw-r--r--source/blender/blenkernel/intern/pointcache.c39
-rw-r--r--source/blender/blenkernel/intern/scene.c25
-rw-r--r--source/blender/blenkernel/intern/script.c4
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c12
-rw-r--r--source/blender/blenkernel/intern/softbody.c44
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c204
-rw-r--r--source/blender/blenkernel/intern/text.c6
-rw-r--r--source/blender/blenkernel/intern/world.c11
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c20
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c2
-rw-r--r--source/blender/blenlib/BLI_arithb.h2
-rw-r--r--source/blender/blenlib/BLI_ghash.h16
-rw-r--r--source/blender/blenlib/BLI_graph.h125
-rw-r--r--source/blender/blenlib/BLI_threads.h26
-rw-r--r--source/blender/blenlib/SConscript2
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c17
-rw-r--r--source/blender/blenlib/intern/arithb.c82
-rw-r--r--source/blender/blenlib/intern/bpath.c6
-rw-r--r--source/blender/blenlib/intern/dynlib.c7
-rw-r--r--source/blender/blenlib/intern/fileops.c7
-rw-r--r--source/blender/blenlib/intern/graph.c1087
-rw-r--r--source/blender/blenlib/intern/psfont.c12
-rw-r--r--source/blender/blenlib/intern/threads.c130
-rw-r--r--source/blender/blenlib/intern/util.c25
-rw-r--r--source/blender/blenloader/BLO_soundfile.h2
-rw-r--r--source/blender/blenloader/intern/readfile.c97
-rw-r--r--source/blender/blenloader/intern/writefile.c8
-rw-r--r--source/blender/blenpluginapi/SConscript2
-rw-r--r--source/blender/gpu/GPU_extensions.h1
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c26
-rw-r--r--source/blender/gpu/intern/gpu_draw.c38
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c12
-rw-r--r--source/blender/gpu/intern/gpu_material.c18
-rw-r--r--source/blender/imbuf/CMakeLists.txt4
-rw-r--r--source/blender/imbuf/SConscript12
-rw-r--r--source/blender/imbuf/intern/cineon/cineon_dpx.c8
-rw-r--r--source/blender/imbuf/intern/cineon/cineonlib.c2
-rw-r--r--source/blender/imbuf/intern/cineon/dpxlib.c2
-rw-r--r--source/blender/imbuf/intern/dds/CMakeLists.txt45
-rw-r--r--source/blender/imbuf/intern/dynlibtiff.c7
-rw-r--r--source/blender/include/BDR_editobject.h3
-rw-r--r--source/blender/include/BDR_gpencil.h6
-rw-r--r--source/blender/include/BIF_drawgpencil.h2
-rw-r--r--source/blender/include/BIF_editaction.h4
-rw-r--r--source/blender/include/BIF_editarmature.h11
-rw-r--r--source/blender/include/BIF_editdeform.h5
-rw-r--r--source/blender/include/BIF_editmesh.h4
-rw-r--r--source/blender/include/BIF_editparticle.h2
-rw-r--r--source/blender/include/BIF_keyframing.h32
-rw-r--r--source/blender/include/BIF_retopo.h18
-rw-r--r--source/blender/include/BSE_seqaudio.h12
-rw-r--r--source/blender/include/butspace.h3
-rw-r--r--source/blender/include/reeb.h119
-rw-r--r--source/blender/makesdna/DNA_actuator_types.h3
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h3
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h2
-rw-r--r--source/blender/makesdna/DNA_ipo_types.h2
-rw-r--r--source/blender/makesdna/DNA_lamp_types.h4
-rw-r--r--source/blender/makesdna/DNA_object_fluidsim.h2
-rw-r--r--source/blender/makesdna/DNA_scene_types.h29
-rw-r--r--source/blender/makesdna/DNA_sensor_types.h9
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h10
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h8
-rw-r--r--source/blender/makesdna/intern/SConscript4
-rw-r--r--source/blender/nodes/SConscript11
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c30
-rw-r--r--source/blender/python/BPY_interface.c122
-rw-r--r--source/blender/python/BPY_menus.c33
-rw-r--r--source/blender/python/SConscript10
-rw-r--r--source/blender/python/api2_2x/Armature.c11
-rw-r--r--source/blender/python/api2_2x/BezTriple.c1
-rw-r--r--source/blender/python/api2_2x/CurNurb.c25
-rw-r--r--source/blender/python/api2_2x/Curve.c2
-rw-r--r--source/blender/python/api2_2x/Draw.c19
-rw-r--r--source/blender/python/api2_2x/Geometry.c36
-rw-r--r--source/blender/python/api2_2x/Group.c8
-rw-r--r--source/blender/python/api2_2x/IDProp.c48
-rw-r--r--source/blender/python/api2_2x/Image.c2
-rw-r--r--source/blender/python/api2_2x/Ipo.c4
-rw-r--r--source/blender/python/api2_2x/Ipocurve.c27
-rw-r--r--source/blender/python/api2_2x/Material.c14
-rw-r--r--source/blender/python/api2_2x/Mesh.c28
-rw-r--r--source/blender/python/api2_2x/NLA.c4
-rw-r--r--source/blender/python/api2_2x/NMesh.c8
-rw-r--r--source/blender/python/api2_2x/Object.c71
-rw-r--r--source/blender/python/api2_2x/Particle.c11
-rw-r--r--source/blender/python/api2_2x/Scene.c8
-rw-r--r--source/blender/python/api2_2x/Sys.c4
-rw-r--r--source/blender/python/api2_2x/Types.c133
-rw-r--r--source/blender/python/api2_2x/Window.c18
-rw-r--r--source/blender/python/api2_2x/bpy_data.c12
-rw-r--r--source/blender/python/api2_2x/constant.c6
-rw-r--r--source/blender/python/api2_2x/doc/BGL.py68
-rw-r--r--source/blender/python/api2_2x/doc/Blender.py6
-rw-r--r--source/blender/python/api2_2x/doc/Draw.py8
-rw-r--r--source/blender/python/api2_2x/doc/Geometry.py12
-rw-r--r--source/blender/python/api2_2x/doc/Image.py2
-rw-r--r--source/blender/python/api2_2x/doc/Ipo.py4
-rw-r--r--source/blender/python/api2_2x/doc/IpoCurve.py31
-rw-r--r--source/blender/python/api2_2x/doc/Material.py2
-rw-r--r--source/blender/python/api2_2x/doc/Mesh.py1
-rw-r--r--source/blender/python/api2_2x/doc/Noise.py6
-rw-r--r--source/blender/python/api2_2x/doc/Object.py28
-rw-r--r--source/blender/python/api2_2x/doc/Particle.py3
-rw-r--r--source/blender/python/api2_2x/doc/Render.py14
-rw-r--r--source/blender/python/api2_2x/doc/Renderlayer.py92
-rw-r--r--source/blender/python/api2_2x/doc/SConscript28
-rw-r--r--source/blender/python/api2_2x/doc/Text.py2
-rw-r--r--source/blender/python/api2_2x/doc/Texture.py4
-rw-r--r--source/blender/python/api2_2x/doc/Types.py25
-rw-r--r--source/blender/python/api2_2x/doc/epy_docgen.sh2
-rw-r--r--source/blender/python/api2_2x/matrix.c2
-rw-r--r--source/blender/python/api2_2x/sceneRender.c178
-rw-r--r--source/blender/python/api2_2x/sceneSequence.c8
-rw-r--r--source/blender/radiosity/intern/source/radfactors.c12
-rw-r--r--source/blender/radiosity/intern/source/radnode.c16
-rw-r--r--source/blender/radiosity/intern/source/radpreprocess.c2
-rw-r--r--source/blender/render/SConscript6
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h1
-rw-r--r--source/blender/render/intern/include/pixelshading.h2
-rw-r--r--source/blender/render/intern/include/shading.h3
-rw-r--r--source/blender/render/intern/include/sss.h2
-rw-r--r--source/blender/render/intern/include/sunsky.h5
-rw-r--r--source/blender/render/intern/include/zbuf.h1
-rw-r--r--source/blender/render/intern/source/convertblender.c50
-rw-r--r--source/blender/render/intern/source/envmap.c14
-rw-r--r--source/blender/render/intern/source/initrender.c7
-rw-r--r--source/blender/render/intern/source/occlusion.c4
-rw-r--r--source/blender/render/intern/source/pipeline.c3
-rw-r--r--source/blender/render/intern/source/pixelshading.c70
-rw-r--r--source/blender/render/intern/source/rayshade.c161
-rw-r--r--source/blender/render/intern/source/rendercore.c12
-rw-r--r--source/blender/render/intern/source/shadeinput.c124
-rw-r--r--source/blender/render/intern/source/shadeoutput.c10
-rw-r--r--source/blender/render/intern/source/sss.c4
-rw-r--r--source/blender/render/intern/source/sunsky.c24
-rw-r--r--source/blender/render/intern/source/texture.c10
-rw-r--r--source/blender/render/intern/source/zbuf.c87
-rw-r--r--source/blender/src/CMakeLists.txt3
-rw-r--r--source/blender/src/SConscript32
-rw-r--r--source/blender/src/autoarmature.c2968
-rw-r--r--source/blender/src/buttons_editing.c312
-rw-r--r--source/blender/src/buttons_logic.c431
-rw-r--r--source/blender/src/buttons_object.c27
-rw-r--r--source/blender/src/buttons_scene.c38
-rw-r--r--source/blender/src/buttons_shading.c95
-rw-r--r--source/blender/src/drawaction.c77
-rw-r--r--source/blender/src/drawarmature.c5
-rw-r--r--source/blender/src/drawgpencil.c90
-rw-r--r--source/blender/src/drawimage.c32
-rw-r--r--source/blender/src/drawipo.c7
-rw-r--r--source/blender/src/drawnode.c4
-rw-r--r--source/blender/src/drawobject.c53
-rw-r--r--source/blender/src/drawscript.c13
-rw-r--r--source/blender/src/drawseq.c6
-rw-r--r--source/blender/src/drawtext.c335
-rw-r--r--source/blender/src/drawtime.c24
-rw-r--r--source/blender/src/drawview.c142
-rw-r--r--source/blender/src/edit.c72
-rw-r--r--source/blender/src/editaction.c92
-rw-r--r--source/blender/src/editaction_gpencil.c255
-rw-r--r--source/blender/src/editarmature.c792
-rw-r--r--source/blender/src/editconstraint.c22
-rw-r--r--source/blender/src/editcurve.c4
-rw-r--r--source/blender/src/editdeform.c41
-rw-r--r--source/blender/src/editface.c15
-rw-r--r--source/blender/src/editipo.c21
-rw-r--r--source/blender/src/editmesh.c8
-rw-r--r--source/blender/src/editmesh_add.c16
-rw-r--r--source/blender/src/editmesh_lib.c4
-rw-r--r--source/blender/src/editmesh_loop.c1
-rw-r--r--source/blender/src/editmesh_tools.c8
-rw-r--r--source/blender/src/editnla.c86
-rw-r--r--source/blender/src/editnode.c7
-rw-r--r--source/blender/src/editobject.c156
-rw-r--r--source/blender/src/editparticle.c6
-rw-r--r--source/blender/src/editscreen.c16
-rw-r--r--source/blender/src/editsima.c8
-rw-r--r--source/blender/src/editsound.c14
-rw-r--r--source/blender/src/fluidsim.c2
-rw-r--r--source/blender/src/ghostwinlay.c12
-rw-r--r--source/blender/src/gpencil.c786
-rw-r--r--source/blender/src/hddaudio.c9
-rw-r--r--source/blender/src/header_action.c44
-rw-r--r--source/blender/src/header_image.c17
-rw-r--r--source/blender/src/header_info.c94
-rw-r--r--source/blender/src/header_ipo.c2
-rw-r--r--source/blender/src/header_nla.c2
-rw-r--r--source/blender/src/header_oops.c2
-rw-r--r--source/blender/src/header_script.c10
-rw-r--r--source/blender/src/header_seq.c2
-rw-r--r--source/blender/src/header_text.c26
-rw-r--r--source/blender/src/header_time.c23
-rw-r--r--source/blender/src/header_view3d.c69
-rw-r--r--source/blender/src/headerbuttons.c8
-rw-r--r--source/blender/src/imagepaint.c9
-rw-r--r--source/blender/src/interface.c73
-rw-r--r--source/blender/src/keyframing.c468
-rw-r--r--source/blender/src/meshtools.c12
-rw-r--r--source/blender/src/outliner.c137
-rw-r--r--source/blender/src/parametrizer.c20
-rw-r--r--source/blender/src/playanim.c6
-rw-r--r--source/blender/src/poselib.c4
-rw-r--r--source/blender/src/poseobject.c10
-rw-r--r--source/blender/src/reeb.c3161
-rw-r--r--source/blender/src/renderwin.c8
-rw-r--r--source/blender/src/retopo.c72
-rw-r--r--source/blender/src/sculptmode.c26
-rw-r--r--source/blender/src/seqaudio.c32
-rw-r--r--source/blender/src/sequence.c13
-rw-r--r--source/blender/src/space.c294
-rw-r--r--source/blender/src/splash.jpg.c10620
-rw-r--r--source/blender/src/toets.c15
-rw-r--r--source/blender/src/toolbox.c11
-rw-r--r--source/blender/src/transform.c14
-rw-r--r--source/blender/src/transform_conversions.c132
-rw-r--r--source/blender/src/transform_manipulator.c13
-rw-r--r--source/blender/src/transform_ndofinput.c8
-rw-r--r--source/blender/src/transform_snap.c6
-rw-r--r--source/blender/src/unwrapper.c3
-rw-r--r--source/blender/src/usiblender.c26
-rw-r--r--source/blender/src/view.c84
-rw-r--r--source/blender/src/vpaint.c6
-rw-r--r--source/blender/yafray/intern/export_Plugin.cpp4
-rw-r--r--source/creator/CMakeLists.txt69
-rw-r--r--source/creator/SConscript12
-rw-r--r--source/creator/creator.c67
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp85
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp26
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp42
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp8
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.cpp40
-rw-r--r--source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp13
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp50
-rw-r--r--source/gameengine/Converter/KX_ConvertSensors.cpp11
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h6
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp126
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_Joystick.h44
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp34
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorSensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_DelaySensor.cpp12
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.cpp26
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.h4
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickManager.cpp3
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.cpp183
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.h16
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardSensor.cpp90
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyActuator.cpp8
-rw-r--r--source/gameengine/GameLogic/SCA_PropertySensor.cpp12
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.cpp24
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.cpp34
-rw-r--r--source/gameengine/GameLogic/SCA_RandomSensor.cpp6
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp19
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp10
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.cpp16
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.h4
-rw-r--r--source/gameengine/Ketsji/KX_CameraActuator.cpp20
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintActuator.cpp154
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintActuator.h12
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp18
-rw-r--r--source/gameengine/Ketsji/KX_GameActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp89
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h10
-rw-r--r--source/gameengine/Ketsji/KX_IPhysicsController.h4
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.cpp60
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_MouseFocusSensor.cpp14
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.cpp22
-rw-r--r--source/gameengine/Ketsji/KX_OdePhysicsController.cpp5
-rw-r--r--source/gameengine/Ketsji/KX_OdePhysicsController.h2
-rw-r--r--source/gameengine/Ketsji/KX_ParentActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.cpp40
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp93
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.h1
-rw-r--r--source/gameengine/Ketsji/KX_RadarSensor.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_RaySensor.cpp8
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp16
-rw-r--r--source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp5
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.cpp12
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.cpp58
-rw-r--r--source/gameengine/Ketsji/KX_StateActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SumoPhysicsController.cpp5
-rw-r--r--source/gameengine/Ketsji/KX_SumoPhysicsController.h1
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.cpp21
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.h1
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.cpp12
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.cpp43
-rw-r--r--source/gameengine/Ketsji/KX_VisibilityActuator.cpp2
-rw-r--r--source/gameengine/Physics/BlOde/OdePhysicsController.h2
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp20
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h69
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp368
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h5
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp3
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h2
-rw-r--r--source/gameengine/Physics/Sumo/SConscript3
-rw-r--r--source/gameengine/Physics/Sumo/SumoPhysicsController.h1
-rw-r--r--source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp4
-rw-r--r--source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h2
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsController.h3
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h2
-rw-r--r--source/gameengine/PyDoc/GameLogic.py61
-rw-r--r--source/gameengine/PyDoc/KX_ActuatorSensor.py1
-rw-r--r--source/gameengine/PyDoc/KX_ConstraintActuator.py22
-rw-r--r--source/gameengine/PyDoc/KX_GameObject.py5
-rw-r--r--source/gameengine/PyDoc/KX_IpoActuator.py6
-rw-r--r--source/gameengine/PyDoc/Rasterizer.py15
-rw-r--r--source/gameengine/PyDoc/SCA_JoystickSensor.py106
-rw-r--r--source/gameengine/PyDoc/SConscript28
-rw-r--r--source/gameengine/PyDoc/epy_docgen.sh2
353 files changed, 25909 insertions, 8914 deletions
diff --git a/source/SConscript b/source/SConscript
index ca264579f6e..9b497edd85a 100644
--- a/source/SConscript
+++ b/source/SConscript
@@ -4,7 +4,7 @@ Import ('env')
SConscript(['blender/SConscript',
'kernel/SConscript',
'creator/SConscript'])
-if env['WITH_BF_GAMEENGINE'] == 1:
+if env['WITH_BF_GAMEENGINE']:
SConscript (['gameengine/SConscript'])
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw'):
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index f5ca2c1a17f..e2add807ae4 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -34,6 +34,10 @@ IF(WITH_OPENEXR)
SUBDIRS(imbuf/intern/openexr)
ENDIF(WITH_OPENEXR)
+IF(WITH_DDS)
+ SUBDIRS(imbuf/intern/dds)
+ENDIF(WITH_DDS)
+
IF(WITH_QUICKTIME)
SUBDIRS(quicktime)
ENDIF(WITH_QUICKTIME)
diff --git a/source/blender/SConscript b/source/blender/SConscript
index 6ab6110d5ea..6e16a01e25f 100644
--- a/source/blender/SConscript
+++ b/source/blender/SConscript
@@ -11,26 +11,30 @@ SConscript(['avi/SConscript',
'imbuf/SConscript',
'imbuf/intern/cineon/SConscript',
'makesdna/SConscript',
- 'python/SConscript',
'radiosity/SConscript',
'readblenfile/SConscript',
'render/SConscript',
'src/SConscript',
'nodes/SConscript'])
-if env['WITH_BF_YAFRAY'] == 1:
+
+
+if env['WITH_BF_PYTHON']:
+ SConscript(['python/SConscript'])
+
+if env['WITH_BF_YAFRAY']:
SConscript(['yafray/SConscript'])
-if env['WITH_BF_INTERNATIONAL'] == 1:
+if env['WITH_BF_INTERNATIONAL']:
SConscript (['ftfont/SConscript'])
-if env['WITH_BF_DDS'] == 1:
+if env['WITH_BF_DDS']:
SConscript (['imbuf/intern/dds/SConscript'])
-if env['WITH_BF_OPENEXR'] == 1:
+if env['WITH_BF_OPENEXR']:
SConscript (['imbuf/intern/openexr/SConscript'])
-if env['WITH_BF_QUICKTIME'] == 1:
+if env['WITH_BF_QUICKTIME']:
SConscript (['quicktime/SConscript'])
if env['WITH_BF_FREESTYLE'] == 1:
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index f7af2e4b938..f392d57521c 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -40,8 +40,8 @@ extern "C" {
struct ListBase;
struct MemFile;
-#define BLENDER_VERSION 247
-#define BLENDER_SUBVERSION 8
+#define BLENDER_VERSION 248
+#define BLENDER_SUBVERSION 1
#define BLENDER_MINVERSION 245
#define BLENDER_MINSUBVERSION 15
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index d6b438a3010..a534dcc3669 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -50,28 +50,6 @@
#define DL_FRONT_CURVE 4
#define DL_BACK_CURVE 8
-#define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev) \
-\
-if( (cyclv)==0 && a==(sizev)-1) break; \
-if(cyclu) { \
- p1= sizeu*a; \
- p2= p1+ sizeu-1; \
- p3= p1+ sizeu; \
- p4= p2+ sizeu; \
- b= 0; \
-} \
-else { \
- p2= sizeu*a; \
- p1= p2+1; \
- p4= p2+ sizeu; \
- p3= p1+ sizeu; \
- b= 1; \
-} \
-if( (cyclv) && a==sizev-1) { \
- p3-= sizeu*sizev; \
- p4-= sizeu*sizev; \
-}
-
/* prototypes */
@@ -114,6 +92,7 @@ extern void makeDispListMBall(struct Object *ob);
extern void shadeDispList(struct Base *base);
extern void shadeMeshMCol(struct Object *ob, struct Mesh *me);
+int surfindex_displist(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4);
void imagestodisplist(void);
void reshadeall_displist(void);
void filldisplist(struct ListBase *dispbase, struct ListBase *to);
diff --git a/source/blender/blenkernel/BKE_fluidsim.h b/source/blender/blenkernel/BKE_fluidsim.h
index 33c706da82b..4aac5eafa00 100644
--- a/source/blender/blenkernel/BKE_fluidsim.h
+++ b/source/blender/blenkernel/BKE_fluidsim.h
@@ -45,6 +45,7 @@ void fluidsim_init(FluidsimModifierData *fluidmd);
void fluidsim_free(FluidsimModifierData *fluidmd);
DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams);
+void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, char *filename);
DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc);
// get bounding box of mesh
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 1cc336db69e..3a2dca525b8 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -157,10 +157,10 @@ typedef struct Global {
/* **************** GLOBAL ********************* */
/* G.f */
-#define G_DISABLE_OK (1 << 0)
+#define G_RENDER_OGL (1 << 0)
#define G_PLAYANIM (1 << 1)
/* also uses G_FILE_AUTOPLAY */
-#define G_SIMULATION (1 << 3)
+#define G_RENDER_SHADOW (1 << 3)
#define G_BACKBUFSEL (1 << 4)
#define G_PICKSEL (1 << 5)
#define G_DRAWNORMALS (1 << 6)
diff --git a/source/blender/blenkernel/BKE_ipo.h b/source/blender/blenkernel/BKE_ipo.h
index 5b209cb8f5b..fdd176e0e64 100644
--- a/source/blender/blenkernel/BKE_ipo.h
+++ b/source/blender/blenkernel/BKE_ipo.h
@@ -54,41 +54,71 @@ struct bPoseChannel;
struct bActionChannel;
struct rctf;
+/* ------------ Time Management ------------ */
+
float frame_to_float(int cfra);
+/* ------------ IPO Management ---------- */
+
void free_ipo_curve(struct IpoCurve *icu);
void free_ipo(struct Ipo *ipo);
+
void ipo_default_v2d_cur(int blocktype, struct rctf *cur);
+
struct Ipo *add_ipo(char *name, int idcode);
struct Ipo *copy_ipo(struct Ipo *ipo);
+
void ipo_idnew(struct Ipo *ipo);
+
+struct IpoCurve *find_ipocurve(struct Ipo *ipo, int adrcode);
+short has_ipo_code(struct Ipo *ipo, int code);
+
+/* -------------- Make Local -------------- */
+
void make_local_obipo(struct Ipo *ipo);
void make_local_matipo(struct Ipo *ipo);
void make_local_keyipo(struct Ipo *ipo);
void make_local_ipo(struct Ipo *ipo);
-struct IpoCurve *find_ipocurve(struct Ipo *ipo, int adrcode);
+
+/* ------------ IPO-Curve Sanity ---------------- */
void calchandles_ipocurve(struct IpoCurve *icu);
void testhandles_ipocurve(struct IpoCurve *icu);
void sort_time_ipocurve(struct IpoCurve *icu);
int test_time_ipocurve(struct IpoCurve *icu);
+
+/* -------- IPO-Curve (Bezier) Calculations ---------- */
+
void correct_bezpart(float *v1, float *v2, float *v3, float *v4);
int findzero(float x, float q0, float q1, float q2, float q3, float *o);
void berekeny(float f1, float f2, float f3, float f4, float *o, int b);
void berekenx(float *f, float *o, int b);
+
+/* -------- IPO Curve Calculation and Evaluation --------- */
+
float eval_icu(struct IpoCurve *icu, float ipotime);
void calc_icu(struct IpoCurve *icu, float ctime);
float calc_ipo_time(struct Ipo *ipo, float ctime);
void calc_ipo(struct Ipo *ipo, float ctime);
+
+/* ------------ Keyframe Column Tools -------------- */
+
+void add_to_cfra_elem(struct ListBase *lb, struct BezTriple *bezt);
+void make_cfra_list(struct Ipo *ipo, struct ListBase *elems);
+
+/* ---------------- IPO DataAPI ----------------- */
+
void write_ipo_poin(void *poin, int type, float val);
float read_ipo_poin(void *poin, int type);
-void *give_mtex_poin(struct MTex *mtex, int adrcode );
-void *get_ipo_poin(struct ID *id, struct IpoCurve *icu, int *type);
+void *give_mtex_poin(struct MTex *mtex, int adrcode );
void *get_pchan_ipo_poin(struct bPoseChannel *pchan, int adrcode);
+void *get_ipo_poin(struct ID *id, struct IpoCurve *icu, int *type);
void set_icu_vars(struct IpoCurve *icu);
+/* ---------------- IPO Execution --------------- */
+
void execute_ipo(struct ID *id, struct Ipo *ipo);
void execute_action_ipo(struct bActionChannel *achan, struct bPoseChannel *pchan);
@@ -99,21 +129,16 @@ void do_ob_ipo(struct Object *ob);
void do_seq_ipo(struct Sequence *seq, int cfra);
void do_ob_ipodrivers(struct Object *ob, struct Ipo *ipo, float ctime);
-int has_ipo_code(struct Ipo *ipo, int code);
void do_all_data_ipos(void);
-int calc_ipo_spec(struct Ipo *ipo, int adrcode, float *ctime);
+short calc_ipo_spec(struct Ipo *ipo, int adrcode, float *ctime);
void clear_delta_obipo(struct Ipo *ipo);
-void add_to_cfra_elem(struct ListBase *lb, struct BezTriple *bezt);
-void make_cfra_list(struct Ipo *ipo, struct ListBase *elems);
-/* the sort is an IPO_Channel... */
-int IPO_GetChannels(struct Ipo *ipo, short *channels);
+/* ----------- IPO <-> GameEngine API ---------------- */
+
+/* the short is an IPO_Channel... */
-float IPO_GetFloatValue(struct Ipo *ipo,
-/* struct IPO_Channel channel, */
- /* channels are shorts... bit ugly for now*/
- short c,
- float ctime);
+short IPO_GetChannels(struct Ipo *ipo, short *channels);
+float IPO_GetFloatValue(struct Ipo *ipo, short c, float ctime);
#ifdef __cplusplus
};
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index ab76fc922ea..a4a06b704bc 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -88,6 +88,8 @@ void set_field_offs(float field);
void disable_speed_curve(int val);
float bsystem_time(struct Object *ob, float cfra, float ofs);
+void object_scale_to_mat3(struct Object *ob, float mat[][3]);
+void object_rot_to_mat3(struct Object *ob, float mat[][3]);
void object_to_mat3(struct Object *ob, float mat[][3]);
void object_to_mat4(struct Object *ob, float mat[][4]);
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index a1a9a883c4f..caba63ef8ce 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -226,7 +226,7 @@ void psys_interpolate_mcol(struct MCol *mcol, int quad, float *uv, struct MCol *
void copy_particle_key(struct ParticleKey *to, struct ParticleKey *from, int time);
-void psys_particle_on_emitter(struct Object *ob, struct ParticleSystemModifierData *psmd, int distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
+void psys_particle_on_emitter(struct ParticleSystemModifierData *psmd, int distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct ParticleSystem *psys);
struct ParticleSettings *psys_new_settings(char *name, struct Main *main);
@@ -284,11 +284,12 @@ void psys_mat_hair_to_orco(struct Object *ob, struct DerivedMesh *dm, short from
float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
void psys_get_texture(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys, struct ParticleData *pa, struct ParticleTexture *ptex, int event);
void psys_interpolate_face(struct MVert *mvert, struct MFace *mface, struct MTFace *tface, float (*orcodata)[3], float *uv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
+float psys_particle_value_from_verts(struct DerivedMesh *dm, short from, struct ParticleData *pa, float *values);
float psys_interpolate_value_from_verts(struct DerivedMesh *dm, short from, int index, float *fw, float *values);
void psys_get_from_key(struct ParticleKey *key, float *loc, float *vel, float *rot, float *time);
int psys_intersect_dm(struct Object *ob, struct DerivedMesh *dm, float *vert_cos, float *co1, float* co2, float *min_d, int *min_face, float *min_uv, float *face_minmax, float *pa_minmax, float radius, float *ipoint);
-void psys_particle_on_dm(struct Object *ob, struct DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
+void psys_particle_on_dm(struct DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
/* particle_system.c */
void initialize_particle(struct ParticleData *pa, int p, struct Object *ob, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd);
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h
index 9662d6fbff8..6584af085cd 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -102,7 +102,7 @@
#define AVG2(x, y) ( 0.5 * ((x) + (y)) )
-#define FTOCHAR(val) (val<=0.0f)? 0 : ((val>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*val)+0.5f))
+#define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
#define VECCOPY2D(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1);}
diff --git a/source/blender/blenkernel/BKE_writeffmpeg.h b/source/blender/blenkernel/BKE_writeffmpeg.h
index 7819919fba8..02f7ba6f860 100644
--- a/source/blender/blenkernel/BKE_writeffmpeg.h
+++ b/source/blender/blenkernel/BKE_writeffmpeg.h
@@ -44,15 +44,7 @@ extern "C" {
#define FFMPEG_XVID 7
#define FFMPEG_FLV 8
#define FFMPEG_MKV 9
-
-#define FFMPEG_CODEC_MPEG1 0
-#define FFMPEG_CODEC_MPEG2 1
-#define FFMPEG_CODEC_MPEG4 2
-#define FFMPEG_CODEC_HUFFYUV 3
-#define FFMPEG_CODEC_DV 4
-#define FFMPEG_CODEC_H264 5
-#define FFMPEG_CODEC_XVID 6
-#define FFMPEG_CODEC_FLV1 7
+#define FFMPEG_OGG 10
#define FFMPEG_PRESET_NONE 0
#define FFMPEG_PRESET_DVD 1
diff --git a/source/blender/blenkernel/BKE_writeframeserver.h b/source/blender/blenkernel/BKE_writeframeserver.h
index a6ece63bc56..4774906a2fa 100644
--- a/source/blender/blenkernel/BKE_writeframeserver.h
+++ b/source/blender/blenkernel/BKE_writeframeserver.h
@@ -37,7 +37,7 @@ struct RenderData;
extern void start_frameserver(struct RenderData *rd, int rectx, int recty);
extern void end_frameserver(void);
extern void append_frameserver(int frame, int *pixels, int rectx, int recty);
-extern int frameserver_loop();
+extern int frameserver_loop(void);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 0345711c9c3..0ed4f38e457 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -47,6 +47,10 @@ IF(WITH_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
+IF(WITH_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
+ENDIF(WITH_DDS)
+
IF(WITH_QUICKTIME)
SET(INC ${INC} ${QUICKTIME_INC})
ADD_DEFINITIONS(-DWITH_QUICKTIME)
@@ -73,3 +77,6 @@ IF(WITH_INTERNATIONAL)
ADD_DEFINITIONS(-DWITH_FREETYPE2)
ENDIF(WITH_INTERNATIONAL)
+IF(NOT WITH_ELBEEM)
+ ADD_DEFINITIONS(-DDISABLE_ELBEEM)
+ENDIF(NOT WITH_ELBEEM)
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index f891b307b2c..4c5cd51b836 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -4,7 +4,7 @@ Import ('env')
sources = env.Glob('intern/*.c')
incs = '. #/intern/guardedalloc ../include ../blenlib ../makesdna'
-incs += ' ../python ../render/extern/include #/intern/decimation/extern'
+incs += ' ../render/extern/include #/intern/decimation/extern'
incs += ' ../imbuf ../avi #/intern/elbeem/extern ../nodes'
incs += ' #/intern/iksolver/extern ../blenloader ../quicktime'
incs += ' #/extern/bullet2/src'
@@ -12,15 +12,20 @@ incs += ' #/intern/bmfont'
incs += ' #/intern/opennl/extern'
incs += ' ../gpu #/extern/glew/include'
-incs += ' ' + env['BF_PYTHON_INC']
incs += ' ' + env['BF_OPENGL_INC']
incs += ' ' + env['BF_ZLIB_INC']
incs += ' ' + env['BF_SDL_INC']
defs = ''
+if not env['WITH_BF_PYTHON']:
+ defs += 'DISABLE_PYTHON'
+else:
+ incs += ' ../python'
+ incs += ' ' + env['BF_PYTHON_INC']
+
if env['WITH_BF_INTERNATIONAL']:
- defs += 'WITH_FREETYPE2'
+ defs += ' WITH_FREETYPE2'
if env['WITH_BF_VERSE']:
defs += ' WITH_VERSE'
@@ -29,21 +34,21 @@ if env['WITH_BF_VERSE']:
if env['WITH_BF_VERSE']:
defs += ' WITH_VERSE'
-if env['WITH_BF_OPENEXR'] == 1:
+if env['WITH_BF_OPENEXR']:
defs += ' WITH_OPENEXR'
-if env['WITH_BF_DDS'] == 1:
+if env['WITH_BF_DDS']:
defs += ' WITH_DDS'
-if env['WITH_BF_FFMPEG'] == 1:
+if env['WITH_BF_FFMPEG']:
defs += ' WITH_FFMPEG'
incs += ' ' + env['BF_FFMPEG_INC']
-if env['WITH_BF_QUICKTIME'] == 1:
+if env['WITH_BF_QUICKTIME']:
defs += ' WITH_QUICKTIME'
incs += ' ' + env['BF_QUICKTIME_INC']
-if env['BF_NO_ELBEEM'] == 1:
+if env['BF_NO_ELBEEM']:
defs += ' DISABLE_ELBEEM'
if env['WITH_BF_PLAYER']:
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 1652b24e1e5..ce4458b4307 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -201,21 +201,21 @@ static CCGAllocatorIFC *_getStandardAllocatorIFC(void) {
static int VertDataEqual(float *a, float *b) {
return a[0]==b[0] && a[1]==b[1] && a[2]==b[2];
}
-#define VertDataZero(av) { float *a = (float*) av; a[0] = a[1] = a[2] = 0.0f; }
-#define VertDataCopy(av, bv) { float *a = (float*) av, *b = (float*) bv; a[0] =b[0]; a[1] =b[1]; a[2] =b[2]; }
-#define VertDataAdd(av, bv) { float *a = (float*) av, *b = (float*) bv; a[0]+=b[0]; a[1]+=b[1]; a[2]+=b[2]; }
-#define VertDataSub(av, bv) { float *a = (float*) av, *b = (float*) bv; a[0]-=b[0]; a[1]-=b[1]; a[2]-=b[2]; }
-#define VertDataMulN(av, n) { float *a = (float*) av; a[0]*=n; a[1]*=n; a[2]*=n; }
+#define VertDataZero(av) { float *_a = (float*) av; _a[0] = _a[1] = _a[2] = 0.0f; }
+#define VertDataCopy(av, bv) { float *_a = (float*) av, *_b = (float*) bv; _a[0] =_b[0]; _a[1] =_b[1]; _a[2] =_b[2]; }
+#define VertDataAdd(av, bv) { float *_a = (float*) av, *_b = (float*) bv; _a[0]+=_b[0]; _a[1]+=_b[1]; _a[2]+=_b[2]; }
+#define VertDataSub(av, bv) { float *_a = (float*) av, *_b = (float*) bv; _a[0]-=_b[0]; _a[1]-=_b[1]; _a[2]-=_b[2]; }
+#define VertDataMulN(av, n) { float *_a = (float*) av; _a[0]*=n; _a[1]*=n; _a[2]*=n; }
#define VertDataAvg4(tv, av, bv, cv, dv) \
{ \
- float *t = (float*) tv, *a = (float*) av, *b = (float*) bv, *c = (float*) cv, *d = (float*) dv; \
- t[0] = (a[0]+b[0]+c[0]+d[0])*.25; \
- t[1] = (a[1]+b[1]+c[1]+d[1])*.25; \
- t[2] = (a[2]+b[2]+c[2]+d[2])*.25; \
+ float *_t = (float*) tv, *_a = (float*) av, *_b = (float*) bv, *_c = (float*) cv, *_d = (float*) dv; \
+ _t[0] = (_a[0]+_b[0]+_c[0]+_d[0])*.25; \
+ _t[1] = (_a[1]+_b[1]+_c[1]+_d[1])*.25; \
+ _t[2] = (_a[2]+_b[2]+_c[2]+_d[2])*.25; \
}
-#define NormZero(av) { float *a = (float*) av; a[0] = a[1] = a[2] = 0.0f; }
-#define NormCopy(av, bv) { float *a = (float*) av, *b = (float*) bv; a[0] =b[0]; a[1] =b[1]; a[2] =b[2]; }
-#define NormAdd(av, bv) { float *a = (float*) av, *b = (float*) bv; a[0]+=b[0]; a[1]+=b[1]; a[2]+=b[2]; }
+#define NormZero(av) { float *_a = (float*) av; _a[0] = _a[1] = _a[2] = 0.0f; }
+#define NormCopy(av, bv) { float *_a = (float*) av, *_b = (float*) bv; _a[0] =_b[0]; _a[1] =_b[1]; _a[2] =_b[2]; }
+#define NormAdd(av, bv) { float *_a = (float*) av, *_b = (float*) bv; _a[0]+=_b[0]; _a[1]+=_b[1]; _a[2]+=_b[2]; }
static int _edge_isBoundary(CCGEdge *e);
@@ -330,7 +330,7 @@ struct _CCGSubSurf {
/***/
-static CCGVert *_vert_new(CCGVertHDL vHDL, int levels, int dataSize, CCGSubSurf *ss) {
+static CCGVert *_vert_new(CCGVertHDL vHDL, CCGSubSurf *ss) {
CCGVert *v = CCGSUBSURF_alloc(ss, sizeof(CCGVert) + ss->meshIFC.vertDataSize * (ss->subdivLevels+1) + ss->meshIFC.vertUserSize);
byte *userData;
@@ -346,7 +346,7 @@ static CCGVert *_vert_new(CCGVertHDL vHDL, int levels, int dataSize, CCGSubSurf
return v;
}
-static void _vert_remEdge(CCGVert *v, CCGEdge *e, CCGSubSurf *ss) {
+static void _vert_remEdge(CCGVert *v, CCGEdge *e) {
int i;
for (i=0; i<v->numEdges; i++) {
if (v->edges[i]==e) {
@@ -355,7 +355,7 @@ static void _vert_remEdge(CCGVert *v, CCGEdge *e, CCGSubSurf *ss) {
}
}
}
-static void _vert_remFace(CCGVert *v, CCGFace *f, CCGSubSurf *ss) {
+static void _vert_remFace(CCGVert *v, CCGFace *f) {
int i;
for (i=0; i<v->numFaces; i++) {
if (v->faces[i]==f) {
@@ -403,13 +403,13 @@ static void _vert_free(CCGVert *v, CCGSubSurf *ss) {
CCGSUBSURF_free(ss, v);
}
-static int VERT_seam(CCGVert *v, CCGSubSurf *ss) {
+static int VERT_seam(CCGVert *v) {
return ((v->flags & Vert_eSeam) != 0);
}
/***/
-static CCGEdge *_edge_new(CCGEdgeHDL eHDL, CCGVert *v0, CCGVert *v1, float crease, int levels, int dataSize, CCGSubSurf *ss) {
+static CCGEdge *_edge_new(CCGEdgeHDL eHDL, CCGVert *v0, CCGVert *v1, float crease, CCGSubSurf *ss) {
CCGEdge *e = CCGSUBSURF_alloc(ss, sizeof(CCGEdge) + ss->meshIFC.vertDataSize *((ss->subdivLevels+1) + (1<<(ss->subdivLevels+1))-1) + ss->meshIFC.edgeUserSize);
byte *userData;
@@ -429,7 +429,7 @@ static CCGEdge *_edge_new(CCGEdgeHDL eHDL, CCGVert *v0, CCGVert *v1, float creas
return e;
}
-static void _edge_remFace(CCGEdge *e, CCGFace *f, CCGSubSurf *ss) {
+static void _edge_remFace(CCGEdge *e, CCGFace *f) {
int i;
for (i=0; i<e->numFaces; i++) {
if (e->faces[i]==f) {
@@ -478,8 +478,8 @@ static void _edge_free(CCGEdge *e, CCGSubSurf *ss) {
CCGSUBSURF_free(ss, e);
}
static void _edge_unlinkMarkAndFree(CCGEdge *e, CCGSubSurf *ss) {
- _vert_remEdge(e->v0, e, ss);
- _vert_remEdge(e->v1, e, ss);
+ _vert_remEdge(e->v0, e);
+ _vert_remEdge(e->v1, e);
e->v0->flags |= Vert_eEffected;
e->v1->flags |= Vert_eEffected;
_edge_free(e, ss);
@@ -496,7 +496,7 @@ static float EDGE_getSharpness(CCGEdge *e, int lvl) {
return e->crease - lvl;
}
-static CCGFace *_face_new(CCGFaceHDL fHDL, CCGVert **verts, CCGEdge **edges, int numVerts, int levels, int dataSize, CCGSubSurf *ss) {
+static CCGFace *_face_new(CCGFaceHDL fHDL, CCGVert **verts, CCGEdge **edges, int numVerts, CCGSubSurf *ss) {
int maxGridSize = 1 + (1<<(ss->subdivLevels-1));
CCGFace *f = CCGSUBSURF_alloc(ss, sizeof(CCGFace) + sizeof(CCGVert*)*numVerts + sizeof(CCGEdge*)*numVerts + ss->meshIFC.vertDataSize *(1 + numVerts*maxGridSize + numVerts*maxGridSize*maxGridSize) + ss->meshIFC.faceUserSize);
byte *userData;
@@ -610,8 +610,8 @@ static void _face_free(CCGFace *f, CCGSubSurf *ss) {
static void _face_unlinkMarkAndFree(CCGFace *f, CCGSubSurf *ss) {
int j;
for (j=0; j<f->numVerts; j++) {
- _vert_remFace(FACE_getVerts(f)[j], f, ss);
- _edge_remFace(FACE_getEdges(f)[j], f, ss);
+ _vert_remFace(FACE_getVerts(f)[j], f);
+ _edge_remFace(FACE_getEdges(f)[j], f);
FACE_getVerts(f)[j]->flags |= Vert_eEffected;
}
_face_free(f, ss);
@@ -884,7 +884,7 @@ CCGError ccgSubSurf_syncVert(CCGSubSurf *ss, CCGVertHDL vHDL, void *vertData, in
if (ss->syncState==eSyncState_Partial) {
v = _ehash_lookupWithPrev(ss->vMap, vHDL, &prevp);
if (!v) {
- v = _vert_new(vHDL, ss->subdivLevels, ss->meshIFC.vertDataSize, ss);
+ v = _vert_new(vHDL, ss);
VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), vertData);
_ehash_insert(ss->vMap, (EHEntry*) v);
v->flags = Vert_eEffected|seamflag;
@@ -913,7 +913,7 @@ CCGError ccgSubSurf_syncVert(CCGSubSurf *ss, CCGVertHDL vHDL, void *vertData, in
v = _ehash_lookupWithPrev(ss->oldVMap, vHDL, &prevp);
if (!v) {
- v = _vert_new(vHDL, ss->subdivLevels, ss->meshIFC.vertDataSize, ss);
+ v = _vert_new(vHDL, ss);
VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), vertData);
_ehash_insert(ss->vMap, (EHEntry*) v);
v->flags = Vert_eEffected|seamflag;
@@ -943,7 +943,7 @@ CCGError ccgSubSurf_syncEdge(CCGSubSurf *ss, CCGEdgeHDL eHDL, CCGVertHDL e_vHDL0
CCGVert *v0 = _ehash_lookup(ss->vMap, e_vHDL0);
CCGVert *v1 = _ehash_lookup(ss->vMap, e_vHDL1);
- eNew = _edge_new(eHDL, v0, v1, crease, ss->subdivLevels, ss->meshIFC.vertDataSize, ss);
+ eNew = _edge_new(eHDL, v0, v1, crease, ss);
if (e) {
*prevp = eNew;
@@ -968,7 +968,7 @@ CCGError ccgSubSurf_syncEdge(CCGSubSurf *ss, CCGEdgeHDL eHDL, CCGVertHDL e_vHDL0
if (!e || e->v0->vHDL!=e_vHDL0 || e->v1->vHDL!=e_vHDL1|| e->crease!=crease) {
CCGVert *v0 = _ehash_lookup(ss->vMap, e_vHDL0);
CCGVert *v1 = _ehash_lookup(ss->vMap, e_vHDL1);
- e = _edge_new(eHDL, v0, v1, crease, ss->subdivLevels, ss->meshIFC.vertDataSize, ss);
+ e = _edge_new(eHDL, v0, v1, crease, ss);
_ehash_insert(ss->eMap, (EHEntry*) e);
e->v0->flags |= Vert_eEffected;
e->v1->flags |= Vert_eEffected;
@@ -1017,7 +1017,7 @@ CCGError ccgSubSurf_syncFace(CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGV
}
if (!f || topologyChanged) {
- fNew = _face_new(fHDL, ss->tempVerts, ss->tempEdges, numVerts, ss->subdivLevels, ss->meshIFC.vertDataSize, ss);
+ fNew = _face_new(fHDL, ss->tempVerts, ss->tempEdges, numVerts, ss);
if (f) {
ss->numGrids += numVerts - f->numVerts;
@@ -1054,7 +1054,7 @@ CCGError ccgSubSurf_syncFace(CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGV
if (!ss->tempEdges[k]) {
if (ss->allowEdgeCreation) {
- CCGEdge *e = ss->tempEdges[k] = _edge_new((CCGEdgeHDL) -1, ss->tempVerts[k], ss->tempVerts[(k+1)%numVerts], ss->defaultCreaseValue, ss->subdivLevels, ss->meshIFC.vertDataSize, ss);
+ CCGEdge *e = ss->tempEdges[k] = _edge_new((CCGEdgeHDL) -1, ss->tempVerts[k], ss->tempVerts[(k+1)%numVerts], ss->defaultCreaseValue, ss);
_ehash_insert(ss->eMap, (EHEntry*) e);
e->v0->flags |= Vert_eEffected;
e->v1->flags |= Vert_eEffected;
@@ -1075,7 +1075,7 @@ CCGError ccgSubSurf_syncFace(CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGV
}
if (!f || topologyChanged) {
- f = _face_new(fHDL, ss->tempVerts, ss->tempEdges, numVerts, ss->subdivLevels, ss->meshIFC.vertDataSize, ss);
+ f = _face_new(fHDL, ss->tempVerts, ss->tempEdges, numVerts, ss);
_ehash_insert(ss->fMap, (EHEntry*) f);
ss->numGrids += numVerts;
@@ -1228,7 +1228,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
void *nCo = VERT_getCo(v, nextLvl);
int sharpCount = 0, allSharp = 1;
float avgSharpness = 0.0;
- int seam = VERT_seam(v, ss), seamEdges = 0;
+ int seam = VERT_seam(v), seamEdges = 0;
for (i=0; i<v->numEdges; i++) {
CCGEdge *e = v->edges[i];
@@ -1526,7 +1526,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
void *nCo = VERT_getCo(v, nextLvl);
int sharpCount = 0, allSharp = 1;
float avgSharpness = 0.0;
- int seam = VERT_seam(v, ss), seamEdges = 0;
+ int seam = VERT_seam(v), seamEdges = 0;
for (i=0; i<v->numEdges; i++) {
CCGEdge *e = v->edges[i];
@@ -2071,7 +2071,7 @@ int ccgSubSurf_getGridLevelSize(CCGSubSurf *ss, int level) {
/* Vert accessors */
-CCGVertHDL ccgSubSurf_getVertVertHandle(CCGSubSurf *ss, CCGVert *v) {
+CCGVertHDL ccgSubSurf_getVertVertHandle(CCGVert *v) {
return v->vHDL;
}
int ccgSubSurf_getVertAge(CCGSubSurf *ss, CCGVert *v) {
@@ -2085,20 +2085,20 @@ int ccgSubSurf_getVertAge(CCGSubSurf *ss, CCGVert *v) {
void *ccgSubSurf_getVertUserData(CCGSubSurf *ss, CCGVert *v) {
return VERT_getLevelData(v) + ss->meshIFC.vertDataSize*(ss->subdivLevels+1);
}
-int ccgSubSurf_getVertNumFaces(CCGSubSurf *ss, CCGVert *v) {
+int ccgSubSurf_getVertNumFaces(CCGVert *v) {
return v->numFaces;
}
-CCGFace *ccgSubSurf_getVertFace(CCGSubSurf *ss, CCGVert *v, int index) {
+CCGFace *ccgSubSurf_getVertFace(CCGVert *v, int index) {
if (index<0 || index>=v->numFaces) {
return NULL;
} else {
return v->faces[index];
}
}
-int ccgSubSurf_getVertNumEdges(CCGSubSurf *ss, CCGVert *v) {
+int ccgSubSurf_getVertNumEdges(CCGVert *v) {
return v->numEdges;
}
-CCGEdge *ccgSubSurf_getVertEdge(CCGSubSurf *ss, CCGVert *v, int index) {
+CCGEdge *ccgSubSurf_getVertEdge(CCGVert *v, int index) {
if (index<0 || index>=v->numEdges) {
return NULL;
} else {
@@ -2118,7 +2118,7 @@ void *ccgSubSurf_getVertLevelData(CCGSubSurf *ss, CCGVert *v, int level) {
/* Edge accessors */
-CCGEdgeHDL ccgSubSurf_getEdgeEdgeHandle(CCGSubSurf *ss, CCGEdge *e) {
+CCGEdgeHDL ccgSubSurf_getEdgeEdgeHandle(CCGEdge *e) {
return e->eHDL;
}
int ccgSubSurf_getEdgeAge(CCGSubSurf *ss, CCGEdge *e) {
@@ -2132,20 +2132,20 @@ int ccgSubSurf_getEdgeAge(CCGSubSurf *ss, CCGEdge *e) {
void *ccgSubSurf_getEdgeUserData(CCGSubSurf *ss, CCGEdge *e) {
return EDGE_getLevelData(e) + ss->meshIFC.vertDataSize *((ss->subdivLevels+1) + (1<<(ss->subdivLevels+1))-1);
}
-int ccgSubSurf_getEdgeNumFaces(CCGSubSurf *ss, CCGEdge *e) {
+int ccgSubSurf_getEdgeNumFaces(CCGEdge *e) {
return e->numFaces;
}
-CCGFace *ccgSubSurf_getEdgeFace(CCGSubSurf *ss, CCGEdge *e, int index) {
+CCGFace *ccgSubSurf_getEdgeFace(CCGEdge *e, int index) {
if (index<0 || index>=e->numFaces) {
return NULL;
} else {
return e->faces[index];
}
}
-CCGVert *ccgSubSurf_getEdgeVert0(CCGSubSurf *ss, CCGEdge *e) {
+CCGVert *ccgSubSurf_getEdgeVert0(CCGEdge *e) {
return e->v0;
}
-CCGVert *ccgSubSurf_getEdgeVert1(CCGSubSurf *ss, CCGEdge *e) {
+CCGVert *ccgSubSurf_getEdgeVert1(CCGEdge *e) {
return e->v1;
}
void *ccgSubSurf_getEdgeDataArray(CCGSubSurf *ss, CCGEdge *e) {
@@ -2161,7 +2161,7 @@ void *ccgSubSurf_getEdgeLevelData(CCGSubSurf *ss, CCGEdge *e, int x, int level)
return _edge_getCo(e, level, x, ss->meshIFC.vertDataSize);
}
}
-float ccgSubSurf_getEdgeCrease(CCGSubSurf *ss, CCGEdge *e) {
+float ccgSubSurf_getEdgeCrease(CCGEdge *e) {
return e->crease;
}
@@ -2182,7 +2182,7 @@ void *ccgSubSurf_getFaceUserData(CCGSubSurf *ss, CCGFace *f) {
int maxGridSize = 1 + (1<<(ss->subdivLevels-1));
return FACE_getCenterData(f) + ss->meshIFC.vertDataSize *(1 + f->numVerts*maxGridSize + f->numVerts*maxGridSize*maxGridSize);
}
-int ccgSubSurf_getFaceNumVerts(CCGSubSurf *ss, CCGFace *f) {
+int ccgSubSurf_getFaceNumVerts(CCGFace *f) {
return f->numVerts;
}
CCGVert *ccgSubSurf_getFaceVert(CCGSubSurf *ss, CCGFace *f, int index) {
@@ -2199,7 +2199,7 @@ CCGEdge *ccgSubSurf_getFaceEdge(CCGSubSurf *ss, CCGFace *f, int index) {
return FACE_getEdges(f)[index];
}
}
-int ccgSubSurf_getFaceEdgeIndex(CCGSubSurf *ss, CCGFace *f, CCGEdge *e) {
+int ccgSubSurf_getFaceEdgeIndex(CCGFace *f, CCGEdge *e) {
int i;
for (i=0; i<f->numVerts; i++)
@@ -2208,7 +2208,7 @@ int ccgSubSurf_getFaceEdgeIndex(CCGSubSurf *ss, CCGFace *f, CCGEdge *e) {
return -1;
}
-void *ccgSubSurf_getFaceCenterData(CCGSubSurf *ss, CCGFace *f) {
+void *ccgSubSurf_getFaceCenterData(CCGFace *f) {
return FACE_getCenterData(f);
}
void *ccgSubSurf_getFaceGridEdgeDataArray(CCGSubSurf *ss, CCGFace *f, int gridIndex) {
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 91f3ffab43b..fbd0aecc0a5 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -82,11 +82,11 @@ int ccgSubSurf_getGridSize (CCGSubSurf *ss);
int ccgSubSurf_getGridLevelSize (CCGSubSurf *ss, int level);
CCGVert* ccgSubSurf_getVert (CCGSubSurf *ss, CCGVertHDL v);
-CCGVertHDL ccgSubSurf_getVertVertHandle (CCGSubSurf *ss, CCGVert *v);
-int ccgSubSurf_getVertNumFaces (CCGSubSurf *ss, CCGVert *v);
-CCGFace* ccgSubSurf_getVertFace (CCGSubSurf *ss, CCGVert *v, int index);
-int ccgSubSurf_getVertNumEdges (CCGSubSurf *ss, CCGVert *v);
-CCGEdge* ccgSubSurf_getVertEdge (CCGSubSurf *ss, CCGVert *v, int index);
+CCGVertHDL ccgSubSurf_getVertVertHandle (CCGVert *v);
+int ccgSubSurf_getVertNumFaces (CCGVert *v);
+CCGFace* ccgSubSurf_getVertFace (CCGVert *v, int index);
+int ccgSubSurf_getVertNumEdges (CCGVert *v);
+CCGEdge* ccgSubSurf_getVertEdge (CCGVert *v, int index);
int ccgSubSurf_getVertAge (CCGSubSurf *ss, CCGVert *v);
void* ccgSubSurf_getVertUserData (CCGSubSurf *ss, CCGVert *v);
@@ -94,12 +94,12 @@ void* ccgSubSurf_getVertData (CCGSubSurf *ss, CCGVert *v);
void* ccgSubSurf_getVertLevelData (CCGSubSurf *ss, CCGVert *v, int level);
CCGEdge* ccgSubSurf_getEdge (CCGSubSurf *ss, CCGEdgeHDL e);
-CCGEdgeHDL ccgSubSurf_getEdgeEdgeHandle (CCGSubSurf *ss, CCGEdge *e);
-int ccgSubSurf_getEdgeNumFaces (CCGSubSurf *ss, CCGEdge *e);
-CCGFace* ccgSubSurf_getEdgeFace (CCGSubSurf *ss, CCGEdge *e, int index);
-CCGVert* ccgSubSurf_getEdgeVert0 (CCGSubSurf *ss, CCGEdge *e);
-CCGVert* ccgSubSurf_getEdgeVert1 (CCGSubSurf *ss, CCGEdge *e);
-float ccgSubSurf_getEdgeCrease (CCGSubSurf *ss, CCGEdge *e);
+CCGEdgeHDL ccgSubSurf_getEdgeEdgeHandle (CCGEdge *e);
+int ccgSubSurf_getEdgeNumFaces (CCGEdge *e);
+CCGFace* ccgSubSurf_getEdgeFace (CCGEdge *e, int index);
+CCGVert* ccgSubSurf_getEdgeVert0 (CCGEdge *e);
+CCGVert* ccgSubSurf_getEdgeVert1 (CCGEdge *e);
+float ccgSubSurf_getEdgeCrease (CCGEdge *e);
int ccgSubSurf_getEdgeAge (CCGSubSurf *ss, CCGEdge *e);
void* ccgSubSurf_getEdgeUserData (CCGSubSurf *ss, CCGEdge *e);
@@ -109,14 +109,14 @@ void* ccgSubSurf_getEdgeLevelData (CCGSubSurf *ss, CCGEdge *e, int x, int lev
CCGFace* ccgSubSurf_getFace (CCGSubSurf *ss, CCGFaceHDL f);
CCGFaceHDL ccgSubSurf_getFaceFaceHandle (CCGSubSurf *ss, CCGFace *f);
-int ccgSubSurf_getFaceNumVerts (CCGSubSurf *ss, CCGFace *f);
+int ccgSubSurf_getFaceNumVerts (CCGFace *f);
CCGVert* ccgSubSurf_getFaceVert (CCGSubSurf *ss, CCGFace *f, int index);
CCGEdge* ccgSubSurf_getFaceEdge (CCGSubSurf *ss, CCGFace *f, int index);
-int ccgSubSurf_getFaceEdgeIndex (CCGSubSurf *ss, CCGFace *f, CCGEdge *e);
+int ccgSubSurf_getFaceEdgeIndex (CCGFace *f, CCGEdge *e);
int ccgSubSurf_getFaceAge (CCGSubSurf *ss, CCGFace *f);
void* ccgSubSurf_getFaceUserData (CCGSubSurf *ss, CCGFace *f);
-void* ccgSubSurf_getFaceCenterData (CCGSubSurf *ss, CCGFace *f);
+void* ccgSubSurf_getFaceCenterData (CCGFace *f);
void* ccgSubSurf_getFaceGridEdgeDataArray (CCGSubSurf *ss, CCGFace *f, int gridIndex);
void* ccgSubSurf_getFaceGridEdgeData (CCGSubSurf *ss, CCGFace *f, int gridIndex, int x);
void* ccgSubSurf_getFaceGridDataArray (CCGSubSurf *ss, CCGFace *f, int gridIndex);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 569229cb8ab..b7f068c936b 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -94,7 +94,7 @@
///////////////////////////////////
///////////////////////////////////
-MVert *dm_getVertArray(DerivedMesh *dm)
+static MVert *dm_getVertArray(DerivedMesh *dm)
{
MVert *mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
@@ -108,7 +108,7 @@ MVert *dm_getVertArray(DerivedMesh *dm)
return mvert;
}
-MEdge *dm_getEdgeArray(DerivedMesh *dm)
+static MEdge *dm_getEdgeArray(DerivedMesh *dm)
{
MEdge *medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
@@ -122,7 +122,7 @@ MEdge *dm_getEdgeArray(DerivedMesh *dm)
return medge;
}
-MFace *dm_getFaceArray(DerivedMesh *dm)
+static MFace *dm_getFaceArray(DerivedMesh *dm)
{
MFace *mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
@@ -136,7 +136,7 @@ MFace *dm_getFaceArray(DerivedMesh *dm)
return mface;
}
-MVert *dm_dupVertArray(DerivedMesh *dm)
+static MVert *dm_dupVertArray(DerivedMesh *dm)
{
MVert *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumVerts(dm),
"dm_dupVertArray tmp");
@@ -146,7 +146,7 @@ MVert *dm_dupVertArray(DerivedMesh *dm)
return tmp;
}
-MEdge *dm_dupEdgeArray(DerivedMesh *dm)
+static MEdge *dm_dupEdgeArray(DerivedMesh *dm)
{
MEdge *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumEdges(dm),
"dm_dupEdgeArray tmp");
@@ -156,7 +156,7 @@ MEdge *dm_dupEdgeArray(DerivedMesh *dm)
return tmp;
}
-MFace *dm_dupFaceArray(DerivedMesh *dm)
+static MFace *dm_dupFaceArray(DerivedMesh *dm)
{
MFace *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumFaces(dm),
"dm_dupFaceArray tmp");
@@ -912,8 +912,8 @@ static void emDM_drawMappedFacesGLSL(DerivedMesh *dm,
glVertexAttrib3fvARB(attribs.orco.glIndex, orco); \
} \
for(b = 0; b < attribs.tottface; b++) { \
- MTFace *tf = (MTFace*)((char*)efa->data + attribs.tface[b].emOffset); \
- glVertexAttrib2fvARB(attribs.tface[b].glIndex, tf->uv[vert]); \
+ MTFace *_tf = (MTFace*)((char*)efa->data + attribs.tface[b].emOffset); \
+ glVertexAttrib2fvARB(attribs.tface[b].glIndex, _tf->uv[vert]); \
} \
for(b = 0; b < attribs.totmcol; b++) { \
MCol *cp = (MCol*)((char*)efa->data + attribs.mcol[b].emOffset); \
@@ -1069,7 +1069,7 @@ static int emDM_getNumFaces(DerivedMesh *dm)
return BLI_countlist(&emdm->em->faces);
}
-void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
+static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
{
EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
int i;
@@ -1087,7 +1087,7 @@ void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
}
-void emDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
+static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
{
EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
EditEdge *ee = em->edges.first;
@@ -1122,7 +1122,7 @@ void emDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
}
}
-void emDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
+static void emDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
{
EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
EditFace *ef = em->faces.first;
@@ -1164,7 +1164,7 @@ void emDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
test_index_face(face_r, NULL, 0, ef->v4?4:3);
}
-void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
+static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
{
EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
@@ -1182,7 +1182,7 @@ void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
}
}
-void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
+static void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
{
EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
EditEdge *ee = em->edges.first;
@@ -1210,7 +1210,7 @@ void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
}
}
-void emDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
+static void emDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
{
EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
EditFace *ef = em->faces.first;
@@ -2701,17 +2701,22 @@ static void mesh_build_data(Object *ob, CustomDataMask dataMask)
if( (G.f & G_WEIGHTPAINT) && ob==obact ) {
MCol *wpcol = (MCol*)calc_weightpaint_colors(ob);
int layernum = CustomData_number_of_layers(&me->fdata, CD_MCOL);
+ int prevactive = CustomData_get_active_layer(&me->fdata, CD_MCOL);
+ int prevrender = CustomData_get_render_layer(&me->fdata, CD_MCOL);
/* ugly hack here, we temporarily add a new active mcol layer with
weightpaint colors in it, that is then duplicated in CDDM_from_mesh */
CustomData_add_layer(&me->fdata, CD_MCOL, CD_ASSIGN, wpcol, me->totface);
CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
+ CustomData_set_layer_render(&me->fdata, CD_MCOL, layernum);
mesh_calc_modifiers(ob, NULL, &ob->derivedDeform,
&ob->derivedFinal, 0, 1,
needMapping, dataMask, -1);
CustomData_free_layer_active(&me->fdata, CD_MCOL, me->totface);
+ CustomData_set_layer_active(&me->fdata, CD_MCOL, prevactive);
+ CustomData_set_layer_render(&me->fdata, CD_MCOL, prevrender);
} else {
mesh_calc_modifiers(ob, NULL, &ob->derivedDeform,
&ob->derivedFinal, G.rendering, 1,
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 720ed0513ed..155d5a7d21c 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -1573,21 +1573,16 @@ static void initialize_posetree(struct Object *ob, bPoseChannel *pchan_tip)
/* find IK constraint, and validate it */
for(con= pchan_tip->constraints.first; con; con= con->next) {
- if(con->type==CONSTRAINT_TYPE_KINEMATIC) break;
+ if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ data=(bKinematicConstraint*)con->data;
+ if (data->flag & CONSTRAINT_IK_AUTO) break;
+ if (data->tar==NULL) continue;
+ if (data->tar->type==OB_ARMATURE && data->subtarget[0]==0) continue;
+ if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) break;
+ }
}
if(con==NULL) return;
- data=(bKinematicConstraint*)con->data;
-
- /* two types of targets */
- if(data->flag & CONSTRAINT_IK_AUTO);
- else {
- if(con->flag & CONSTRAINT_DISABLE) return; /* checked in editconstraint.c */
- if(con->enforce == 0.0f) return;
- if(data->tar==NULL) return;
- if(data->tar->type==OB_ARMATURE && data->subtarget[0]==0) return;
- }
-
/* exclude tip from chain? */
if(!(data->flag & CONSTRAINT_IK_TIP))
pchan_tip= pchan_tip->parent;
diff --git a/source/blender/blenkernel/intern/bullet.c b/source/blender/blenkernel/intern/bullet.c
index f0a70b4767b..8f9a4346b1d 100644
--- a/source/blender/blenkernel/intern/bullet.c
+++ b/source/blender/blenkernel/intern/bullet.c
@@ -78,6 +78,7 @@ BulletSoftBody *bsbNew(void)
bsb->kSHR = 1.0f;
bsb->kAHR = 0.7f;
+
bsb->collisionflags = 0;
//bsb->collisionflags = OB_BSB_COL_CL_RS + OB_BSB_COL_CL_SS;
bsb->numclusteriterations = 64;
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index c30d86431b1..2c1b5ced614 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -121,7 +121,7 @@ static void cdDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
memcpy(edge_r, cddm->medge, sizeof(*edge_r) * dm->numEdgeData);
}
-void cdDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
+static void cdDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
{
CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
memcpy(face_r, cddm->mface, sizeof(*face_r) * dm->numFaceData);
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index b5e09d551f0..775f1dee241 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -1307,18 +1307,24 @@ CollisionModifierData **get_collisionobjects(Object *self, int *numcollobj)
// check all collision objects
for ( base = G.scene->base.first; base; base = base->next )
{
+ /*Only proceed for mesh object in same layer */
+ if(!(base->object->type==OB_MESH && (base->lay & self->lay)))
+ continue;
+
coll_ob = base->object;
+ if(coll_ob == self)
+ continue;
+
if(coll_ob->pd && coll_ob->pd->deflect)
{
collmd = ( CollisionModifierData * ) modifiers_findByType ( coll_ob, eModifierType_Collision );
}
+ else
+ collmd = NULL;
if ( collmd )
- {
- if(coll_ob == self)
- continue;
-
+ {
if(numobj >= maxobj)
{
// realloc
@@ -1347,16 +1353,18 @@ CollisionModifierData **get_collisionobjects(Object *self, int *numcollobj)
coll_ob = go->ob;
collmd = NULL;
+ if(coll_ob == self)
+ continue;
+
if(coll_ob->pd && coll_ob->pd->deflect)
{
collmd = ( CollisionModifierData * ) modifiers_findByType ( coll_ob, eModifierType_Collision );
}
+ else
+ collmd = NULL;
if ( !collmd )
continue;
-
- if(coll_ob == self)
- continue;
if( !collmd->bvhtree)
continue;
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 99cf58e8e5a..5639f00ee39 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -64,8 +64,9 @@
#include "BKE_library.h"
#include "BKE_idprop.h"
-
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "blendef.h"
@@ -842,7 +843,7 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
if (nocopy == 0) { \
datatar= ct->tar; \
strcpy(datasubtarget, ct->subtarget); \
- con->tarspace= ct->space; \
+ con->tarspace= (char)ct->space; \
} \
\
BLI_freelinkN(list, ct); \
@@ -862,7 +863,7 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
bConstraintTarget *ctn = ct->next; \
if (nocopy == 0) { \
datatar= ct->tar; \
- con->tarspace= ct->space; \
+ con->tarspace= (char)ct->space; \
} \
\
BLI_freelinkN(list, ct); \
@@ -1434,9 +1435,9 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
Mat4ToEul(cob->matrix, eul);
/* eulers: radians to degrees! */
- eul[0] = (eul[0] / M_PI * 180);
- eul[1] = (eul[1] / M_PI * 180);
- eul[2] = (eul[2] / M_PI * 180);
+ eul[0] = (float)(eul[0] / M_PI * 180);
+ eul[1] = (float)(eul[1] / M_PI * 180);
+ eul[2] = (float)(eul[2] / M_PI * 180);
/* limiting of euler values... */
if (data->flag & LIMIT_XROT) {
@@ -1462,9 +1463,9 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
}
/* eulers: degrees to radians ! */
- eul[0] = (eul[0] / 180 * M_PI);
- eul[1] = (eul[1] / 180 * M_PI);
- eul[2] = (eul[2] / 180 * M_PI);
+ eul[0] = (float)(eul[0] / 180 * M_PI);
+ eul[1] = (float)(eul[1] / 180 * M_PI);
+ eul[2] = (float)(eul[2] / 180 * M_PI);
LocEulSizeToMat4(cob->matrix, loc, eul, size);
}
@@ -1814,6 +1815,7 @@ static bConstraintTypeInfo CTI_SIZELIKE = {
sizelike_evaluate /* evaluate */
};
+
/* ----------- Python Constraint -------------- */
static void pycon_free (bConstraint *con)
@@ -1888,8 +1890,10 @@ static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintT
constraint_target_to_mat4(ct->tar, ct->subtarget, ct->matrix, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
/* only execute target calculation if allowed */
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS)
BPY_pyconstraint_target(data, ct);
+#endif
}
else if (ct)
Mat4One(ct->matrix);
@@ -1897,6 +1901,9 @@ static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintT
static void pycon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
{
+#ifdef DISABLE_PYTHON
+ return;
+#else
bPythonConstraint *data= con->data;
/* only evaluate in python if we're allowed to do so */
@@ -1913,6 +1920,7 @@ static void pycon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targ
/* Now, run the actual 'constraint' function, which should only access the matrices */
BPY_pyconstraint_eval(data, cob, targets);
+#endif /* DISABLE_PYTHON */
}
static bConstraintTypeInfo CTI_PYTHON = {
@@ -2508,7 +2516,7 @@ static void distlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
else if (data->flag & LIMITDIST_USESOFT) {
// FIXME: there's a problem with "jumping" when this kicks in
if (dist >= (data->dist - data->soft)) {
- sfac = data->soft*(1.0 - exp(-(dist - data->dist)/data->soft)) + data->dist;
+ sfac = (float)( data->soft*(1.0 - exp(-(dist - data->dist)/data->soft)) + data->dist );
sfac /= dist;
clamp_surf= 1;
@@ -3139,7 +3147,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
case 1: /* rotation (convert to degrees first) */
Mat4ToEul(ct->matrix, dvec);
for (i=0; i<3; i++)
- dvec[i] = dvec[i] / M_PI * 180;
+ dvec[i] = (float)(dvec[i] / M_PI * 180);
break;
default: /* location */
VecCopyf(dvec, ct->matrix[3]);
@@ -3189,7 +3197,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
eul[i]= tmin + (sval[data->map[i]] * (tmax - tmin));
/* now convert final value back to radians */
- eul[i] = eul[i] / 180 * M_PI;
+ eul[i] = (float)(eul[i] / 180 * M_PI);
}
break;
default: /* location */
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 06c1dd4ffe6..b090ac2b538 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -832,7 +832,9 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu
if(len==0) return;
sum= (float *)MEM_callocN(sizeof(float)*len, "makeNurbcurve1");
- resolu= (resolu*SEGMENTSU(nu))+1;
+ resolu= (resolu*SEGMENTSU(nu));
+ if((nu->flagu & CU_CYCLIC)==0) resolu++;
+
if(resolu==0) {
MEM_freeN(sum);
return;
@@ -842,7 +844,8 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu
ustart= fp[nu->orderu-1];
if(nu->flagu & CU_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1];
else uend= fp[nu->pntsu];
- ustep= (uend-ustart)/(resolu-1);
+ ustep= (uend-ustart)/(resolu - ((nu->flagu & CU_CYCLIC) ? 0 : 1));
+
basisu= (float *)MEM_mallocN(sizeof(float)*KNOTSU(nu), "makeNurbcurve3");
if(nu->flagu & CU_CYCLIC) cycl= nu->orderu-1;
@@ -1509,7 +1512,7 @@ void makeBevelList(Object *ob)
BevList *bl, *blnew, *blnext;
BevPoint *bevp, *bevp2, *bevp1 = NULL, *bevp0;
float min, inp, x1, x2, y1, y2, vec[3];
- float *coord_array, *tilt_array=NULL, *radius_array=NULL, *coord_fp, *tilt_fp=NULL, *radius_fp;
+ float *coord_array, *tilt_array=NULL, *radius_array=NULL, *coord_fp, *tilt_fp=NULL, *radius_fp=NULL;
float *v1, *v2;
struct bevelsort *sortdata, *sd, *sd1;
int a, b, nr, poly, resolu, len=0;
@@ -1531,7 +1534,7 @@ void makeBevelList(Object *ob)
/* check if we will calculate tilt data */
do_tilt = ((nu->type & CU_2D) && (cu->flag & CU_3D)==0) ? 0 : 1;
- do_radius = do_tilt; /* normal display uses the radius, better just to calculate them */
+ do_radius = (do_tilt || cu->bevobj) ? 1 : 0; /* normal display uses the radius, better just to calculate them */
/* check we are a single point? also check we are not a surface and that the orderu is sane,
* enforced in the UI but can go wrong possibly */
@@ -1678,7 +1681,9 @@ void makeBevelList(Object *ob)
}
else if((nu->type & 7)==CU_NURBS) {
if(nu->pntsv==1) {
- len= (resolu*SEGMENTSU(nu))+1;
+ len= (resolu*SEGMENTSU(nu));
+ if((nu->flagu & CU_CYCLIC)==0) len++;
+
bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList3");
BLI_addtail(&(cu->bev), bl);
bl->nr= len;
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 2c1f6bb84c1..e93266c85f3 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -265,9 +265,9 @@ static void layerSwap_tface(void *data, int *corner_indices)
{
MTFace *tf = data;
float uv[4][2];
- const static short pin_flags[4] =
+ static const short pin_flags[4] =
{ TF_PIN1, TF_PIN2, TF_PIN3, TF_PIN4 };
- const static char sel_flags[4] =
+ static const char sel_flags[4] =
{ TF_SEL1, TF_SEL2, TF_SEL3, TF_SEL4 };
short unwrap = tf->unwrap & ~(TF_PIN1 | TF_PIN2 | TF_PIN3 | TF_PIN4);
char flag = tf->flag & ~(TF_SEL1 | TF_SEL2 | TF_SEL3 | TF_SEL4);
@@ -926,12 +926,9 @@ void *CustomData_add_layer_named(CustomData *data, int type, int alloctype,
int CustomData_free_layer(CustomData *data, int type, int totelem, int index)
{
int i;
- CustomDataLayer *layer;
if (index < 0) return 0;
- layer = &data->layers[index];
-
customData_free_layer__internal(&data->layers[index], totelem);
for (i=index+1; i < data->totlayer; ++i)
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 7f4910a9765..59619b25f8b 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -79,7 +79,9 @@
#include "MEM_guardedalloc.h"
#include "blendef.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "depsgraph_private.h"
@@ -313,6 +315,7 @@ static void dag_add_driver_relation(Ipo *ipo, DagForest *dag, DagNode *node, int
if ((icu->driver->flag & IPO_DRIVER_FLAG_INVALID) || (icu->driver->name[0] == '\0'))
continue; /* empty or invalid expression */
+#ifndef DISABLE_PYTHON
else {
/* now we need refs to all objects mentioned in this
* pydriver expression, to call 'dag_add_relation'
@@ -334,6 +337,7 @@ static void dag_add_driver_relation(Ipo *ipo, DagForest *dag, DagNode *node, int
MEM_freeN(obarray);
}
}
+#endif /* DISABLE_PYTHON */
}
else if (icu->driver->ob) {
node1 = dag_get_node(dag, icu->driver->ob);
@@ -491,8 +495,8 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int
else
dag_add_relation(dag,node2,node,DAG_RL_OB_OB, "Curve Parent");
}
- else
- dag_add_relation(dag,node2,node,DAG_RL_OB_OB, "Curve Parent");
+ else
+ dag_add_relation(dag,node2,node,DAG_RL_OB_OB, "Parent");
}
/* exception case: parent is duplivert */
if(ob->type==OB_MBALL && (ob->parent->transflag & OB_DUPLIVERTS)) {
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index f67fcd7a1b7..3b6820461be 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -206,8 +206,9 @@ void addnormalsDispList(Object *ob, ListBase *lb)
ndata= dl->nors;
for(a=0; a<dl->parts; a++) {
-
- DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+
+ if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+ break;
v1= vdata+ 3*p1;
n1= ndata+ 3*p1;
@@ -271,6 +272,33 @@ void count_displist(ListBase *lb, int *totvert, int *totface)
}
}
+int surfindex_displist(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4)
+{
+ if((dl->flag & DL_CYCL_V)==0 && a==(dl->parts)-1) {
+ return 0;
+ }
+
+ if(dl->flag & DL_CYCL_U) {
+ (*p1)= dl->nr*a;
+ (*p2)= (*p1)+ dl->nr-1;
+ (*p3)= (*p1)+ dl->nr;
+ (*p4)= (*p2)+ dl->nr;
+ (*b)= 0;
+ } else {
+ (*p2)= dl->nr*a;
+ (*p1)= (*p2)+1;
+ (*p4)= (*p2)+ dl->nr;
+ (*p3)= (*p1)+ dl->nr;
+ (*b)= 1;
+ }
+
+ if( (dl->flag & DL_CYCL_V) && a==dl->parts-1) { \
+ (*p3)-= dl->nr*dl->parts; \
+ (*p4)-= dl->nr*dl->parts; \
+ }
+
+ return 1;
+}
/* ***************************** shade displist. note colors now are in rgb(a) order ******************** */
@@ -858,12 +886,14 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
}
}
else if((nu->type & 7)==CU_NURBS) {
- len= (resolu*SEGMENTSU(nu))+1;
+ len= (resolu*SEGMENTSU(nu));
+ if((nu->flagu & CU_CYCLIC)==0) len++;
dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");
BLI_addtail(dispbase, dl);
dl->parts= 1;
+
dl->nr= len;
dl->col= nu->mat_nr;
dl->charidx = nu->charidx;
@@ -1234,7 +1264,7 @@ void curve_calc_modifiers_pre(Object *ob, ListBase *nurb, int forRender, float (
*numVerts_r = numVerts;
}
-void curve_calc_modifiers_post(Object *ob, ListBase *nurb, ListBase *dispbase, int forRender, float (*originalVerts)[3], float (*deformedVerts)[3])
+static void curve_calc_modifiers_post(Object *ob, ListBase *nurb, ListBase *dispbase, int forRender, float (*originalVerts)[3], float (*deformedVerts)[3])
{
int editmode = (!forRender && ob==G.obedit);
ModifierData *md = modifiers_getVirtualModifierList(ob);
@@ -1253,13 +1283,40 @@ void curve_calc_modifiers_post(Object *ob, ListBase *nurb, ListBase *dispbase, i
for (; md; md=md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
+
if ((md->mode & required_mode) != required_mode) continue;
if (mti->isDisabled && mti->isDisabled(md)) continue;
if (mti->type!=eModifierTypeType_OnlyDeform && mti->type!=eModifierTypeType_DeformOrConstruct) continue;
- for (dl=dispbase->first; dl; dl=dl->next) {
- mti->deformVerts(md, ob, NULL, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+ /* need to put all verts in 1 block for curve deform */
+ if(md->type==eModifierType_Curve) {
+ float *allverts, *fp;
+ int totvert= 0;
+
+ for (dl=dispbase->first; dl; dl=dl->next)
+ totvert+= (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr;
+
+ fp= allverts= MEM_mallocN(totvert*sizeof(float)*3, "temp vert");
+ for (dl=dispbase->first; dl; dl=dl->next) {
+ int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+ memcpy(fp, dl->verts, sizeof(float) * offs);
+ fp+= offs;
+ }
+
+ mti->deformVerts(md, ob, NULL, (float(*)[3]) allverts, totvert);
+
+ fp= allverts;
+ for (dl=dispbase->first; dl; dl=dl->next) {
+ int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+ memcpy(dl->verts, fp, sizeof(float) * offs);
+ fp+= offs;
+ }
+ MEM_freeN(allverts);
+ }
+ else {
+ for (dl=dispbase->first; dl; dl=dl->next) {
+ mti->deformVerts(md, ob, NULL, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+ }
}
}
@@ -1281,7 +1338,8 @@ static void displist_surf_indices(DispList *dl)
for(a=0; a<dl->parts; a++) {
- DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+ if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+ break;
for(; b<dl->nr; b++, index+=4) {
index[0]= p1;
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 479be2ee644..9fb8d17d730 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -117,7 +117,9 @@
#include "BKE_curve.h"
#include "BKE_customdata.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "blendef.h"
@@ -2097,8 +2099,10 @@ static void displist_to_mesh(DispList *dlfirst)
}
for(a=0; a<dl->parts; a++) {
-
- DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+
+ if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+ break;
+
p1+= startve;
p2+= startve;
p3+= startve;
@@ -2425,6 +2429,7 @@ int BKE_read_exotic(char *name)
read_stl_mesh_binary(name);
retval = 1;
}
+#ifndef DISABLE_PYTHON
// TODO: this should not be in the kernel...
else { // unknown format, call Python importloader
if (BPY_call_importloader(name)) {
@@ -2434,6 +2439,7 @@ int BKE_read_exotic(char *name)
}
}
+#endif /* DISABLE_PYTHON */
waitcursor(0);
}
}
diff --git a/source/blender/blenkernel/intern/fluidsim.c b/source/blender/blenkernel/intern/fluidsim.c
index 9c1b3ee5a8d..29c4e0f2fb5 100644
--- a/source/blender/blenkernel/intern/fluidsim.c
+++ b/source/blender/blenkernel/intern/fluidsim.c
@@ -77,7 +77,7 @@ void fluidsim_init(FluidsimModifierData *fluidmd)
if(!fss)
return;
- fss->type = 0;
+ fss->type = OB_FSBND_NOSLIP;
fss->show_advancedoptions = 0;
fss->resolutionxyz = 50;
@@ -139,6 +139,9 @@ void fluidsim_init(FluidsimModifierData *fluidmd)
fluid_get_bb(mesh->mvert, mesh->totvert, ob->obmat, fss->bbStart, fss->bbSize);
*/
+ // (ab)used to store velocities
+ fss->meshSurfNormals = NULL;
+
fss->lastgoodframe = -1;
fss->flag = 0;
@@ -153,6 +156,11 @@ void fluidsim_free(FluidsimModifierData *fluidmd)
#ifndef DISABLE_ELBEEM
if(fluidmd)
{
+ if(fluidmd->fss->meshSurfNormals)
+ {
+ MEM_freeN(fluidmd->fss->meshSurfNormals);
+ fluidmd->fss->meshSurfNormals = NULL;
+ }
MEM_freeN(fluidmd->fss);
}
#endif
@@ -462,21 +470,86 @@ DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifie
// load vertex velocities, if they exist...
// TODO? use generate flag as loading flag as well?
// warning, needs original .bobj.gz mesh loading filename
- /*
if(displaymode==3)
{
- readVelgz(targetFile, srcob);
+ fluidsim_read_vel_cache(fluidmd, dm, targetFile);
}
else
{
- // no data for preview, only clear...
- int i,j;
- for(i=0; i<mesh->totvert;i++) { for(j=0; j<3; j++) { srcob->fluidsimSettings->meshSurfNormals[i].co[j] = 0.; }}
- }*/
+ if(fss->meshSurfNormals)
+ MEM_freeN(fss->meshSurfNormals);
+
+ fss->meshSurfNormals = NULL;
+ }
return dm;
}
+
+/* read zipped fluidsim velocities into the co's of the fluidsimsettings normals struct */
+void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, char *filename)
+{
+ int wri, i, j;
+ float wrf;
+ gzFile gzf;
+ FluidsimSettings *fss = fluidmd->fss;
+ int len = strlen(filename);
+ int totvert = dm->getNumVerts(dm);
+ float *velarray = NULL;
+
+ // mesh and vverts have to be valid from loading...
+
+ if(fss->meshSurfNormals)
+ MEM_freeN(fss->meshSurfNormals);
+
+ if(len<7)
+ {
+ return;
+ }
+
+ if(fss->domainNovecgen>0) return;
+
+ // abusing pointer to hold an array of 3d-velocities
+ fss->meshSurfNormals = MEM_callocN(sizeof(float)*3*dm->getNumVerts(dm), "Fluidsim_velocities");
+ // abusing pointer to hold an INT
+ fss->meshSurface = SET_INT_IN_POINTER(totvert);
+
+ velarray = (float *)fss->meshSurfNormals;
+
+ // .bobj.gz , correct filename
+ // 87654321
+ filename[len-6] = 'v';
+ filename[len-5] = 'e';
+ filename[len-4] = 'l';
+
+ gzf = gzopen(filename, "rb");
+ if (!gzf)
+ {
+ MEM_freeN(fss->meshSurfNormals);
+ fss->meshSurfNormals = NULL;
+ return;
+ }
+
+ gzread(gzf, &wri, sizeof( wri ));
+ if(wri != totvert)
+ {
+ MEM_freeN(fss->meshSurfNormals);
+ fss->meshSurfNormals = NULL;
+ return;
+ }
+
+ for(i=0; i<totvert;i++)
+ {
+ for(j=0; j<3; j++)
+ {
+ gzread(gzf, &wrf, sizeof( wrf ));
+ velarray[3*i + j] = wrf;
+ }
+ }
+
+ gzclose(gzf);
+}
+
void fluid_get_bb(MVert *mvert, int totvert, float obmat[][4],
/*RET*/ float start[3], /*RET*/ float size[3] )
{
@@ -583,60 +656,5 @@ void initElbeemMesh(struct Object *ob,
dm->release(dm);
}
-/* read zipped fluidsim velocities into the co's of the fluidsimsettings normals struct */
-void readVelgz(char *filename, Object *srcob)
-{
- int wri, i, j;
- float wrf;
- gzFile gzf;
- MVert *vverts = srcob->fluidsimSettings->meshSurfNormals;
- int len = strlen(filename);
- Mesh *mesh = srcob->data;
- // mesh and vverts have to be valid from loading...
-
- // clean up in any case
- for(i=0; i<mesh->totvert;i++)
- {
- for(j=0; j<3; j++)
- {
- vverts[i].co[j] = 0.;
- }
- }
- if(srcob->fluidsimSettings->domainNovecgen>0) return;
-
- if(len<7)
- {
- return;
- }
-
- // .bobj.gz , correct filename
- // 87654321
- filename[len-6] = 'v';
- filename[len-5] = 'e';
- filename[len-4] = 'l';
-
- gzf = gzopen(filename, "rb");
- if (!gzf)
- return;
-
- gzread(gzf, &wri, sizeof( wri ));
- if(wri != mesh->totvert)
- {
- return;
- }
-
- for(i=0; i<mesh->totvert;i++)
- {
- for(j=0; j<3; j++)
- {
- gzread(gzf, &wrf, sizeof( wrf ));
- vverts[i].co[j] = wrf;
- }
- }
-
- gzclose(gzf);
-}
-
-
#endif // DISABLE_ELBEEM
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index b16f52571f6..79ecbf09f55 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -111,6 +111,7 @@ void IDP_ResizeArray(IDProperty *prop, int newlen)
newp->type = prop->type;
newp->flag = prop->flag;
newp->data.val = prop->data.val;
+ newp->data.val2 = prop->data.val2;
return newp;
}
@@ -219,6 +220,10 @@ IDProperty *IDP_CopyGroup(IDProperty *prop)
return newp;
}
+/*
+ replaces a property with the same name in a group, or adds
+ it if the propery doesn't exist.
+*/
void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
{
IDProperty *loop;
@@ -229,8 +234,7 @@ void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
BLI_remlink(&group->data.group, loop);
IDP_FreeProperty(loop);
- MEM_freeN(loop);
-
+ MEM_freeN(loop);
return;
}
}
@@ -262,7 +266,7 @@ int IDP_InsertToGroup(IDProperty *group, IDProperty *previous, IDProperty *pnew)
}
group->len++;
-
+
BLI_insertlink(&group->data.group, previous, pnew);
return 1;
}
@@ -317,7 +321,7 @@ void IDP_FreeIterBeforeEnd(void *vself)
This is because all ID Property freeing functions free only direct data (not the ID Property
struct itself), but for Groups the child properties *are* considered
direct data.*/
-void IDP_FreeGroup(IDProperty *prop)
+static void IDP_FreeGroup(IDProperty *prop)
{
IDProperty *loop, *next;
for (loop=prop->data.group.first; loop; loop=next)
@@ -348,6 +352,10 @@ IDProperty *IDP_GetProperties(ID *id, int create_if_needed)
if (create_if_needed) {
id->properties = MEM_callocN(sizeof(IDProperty), "IDProperty");
id->properties->type = IDP_GROUP;
+ /* dont overwite the data's name and type
+ * some functions might need this if they
+ * dont have a real ID, should be named elsewhere - Campbell */
+ /* strcpy(id->name, "top_level_group");*/
}
return id->properties;
}
@@ -423,7 +431,7 @@ IDProperty *IDP_New(int type, IDPropertyTemplate val, char *name)
return prop;
}
-/*NOTE: this will free all child properties of list arrays and groups!
+/*NOTE: this will free all child properties including list arrays and groups!
Also, note that this does NOT unlink anything! Plus it doesn't free
the actual IDProperty struct either.*/
void IDP_FreeProperty(IDProperty *prop)
@@ -441,7 +449,8 @@ void IDP_FreeProperty(IDProperty *prop)
}
}
-/*Unlinks any IDProperty<->ID linkage that might be going on.*/
+/*Unlinks any IDProperty<->ID linkage that might be going on.
+ note: currently unused.*/
void IDP_UnlinkProperty(IDProperty *prop)
{
switch (prop->type) {
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 27fa00ac239..d5166fc7a83 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -585,7 +585,7 @@ void tag_image_time(Image *ima)
ima->lastused = (int)PIL_check_seconds_timer();
}
-void tag_all_images_time()
+static void tag_all_images_time()
{
Image *ima;
int ctime = (int)PIL_check_seconds_timer();
@@ -1571,7 +1571,7 @@ static ImBuf *image_load_sequence_multilayer(Image *ima, ImageUser *iuser, int f
ibuf->channels= rpass->channels;
image_initialize_after_load(ima, ibuf);
- image_assign_ibuf(ima, ibuf, iuser->multi_index, frame);
+ image_assign_ibuf(ima, ibuf, iuser?iuser->multi_index:0, frame);
}
// else printf("pass not found\n");
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index b58a9e51b05..29db0ddd808 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -23,7 +23,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): 2008, Joshua Leung (IPO System cleanup)
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -73,15 +73,23 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
+
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h" /* for BPY_pydriver_eval() */
+#endif
#define SMALL -1.0e-10
+/* ***************************** Adrcode Blocktype Defines ********************************* */
+
/* This array concept was meant to make sure that defines such as OB_LOC_X
don't have to be enumerated, also for backward compatibility, future changes,
and to enable it all can be accessed with a for-next loop.
+
+ This should whole adrcode system should eventually be replaced by a proper Data API
*/
+
int co_ar[CO_TOTIPO]= {
CO_ENFORCE, CO_HEADTAIL
};
@@ -151,9 +159,9 @@ int wo_ar[WO_TOTIPO]= {
};
int la_ar[LA_TOTIPO]= {
- LA_ENERGY, LA_COL_R, LA_COL_G, LA_COL_B,
+ LA_ENERGY, LA_COL_R, LA_COL_G, LA_COL_B,
LA_DIST, LA_SPOTSI, LA_SPOTBL,
- LA_QUAD1, LA_QUAD2, LA_HALOINT,
+ LA_QUAD1, LA_QUAD2, LA_HALOINT,
MA_MAP1+MAP_OFS_X, MA_MAP1+MAP_OFS_Y, MA_MAP1+MAP_OFS_Z,
MA_MAP1+MAP_SIZE_X, MA_MAP1+MAP_SIZE_Y, MA_MAP1+MAP_SIZE_Z,
@@ -187,450 +195,605 @@ int part_ar[PART_TOTIPO]= {
PART_BB_TILT, PART_PD_FSTR, PART_PD_FFALL, PART_PD_FMAXD, PART_PD2_FSTR, PART_PD2_FFALL, PART_PD2_FMAXD
};
+/* ************************** Data-Level Functions ************************* */
+
+/* ---------------------- Freeing --------------------------- */
-float frame_to_float(int cfra) /* see also bsystem_time in object.c */
+/* frees the ipo curve itself too */
+void free_ipo_curve (IpoCurve *icu)
{
- extern float bluroffs; /* bad stuff borrowed from object.c */
- extern float fieldoffs;
- float ctime;
+ if (icu == NULL)
+ return;
- ctime= (float)cfra;
- ctime+= bluroffs+fieldoffs;
- ctime*= G.scene->r.framelen;
+ if (icu->bezt)
+ MEM_freeN(icu->bezt);
+ if (icu->driver)
+ MEM_freeN(icu->driver);
- return ctime;
-}
-
-/* includes ipo curve itself */
-void free_ipo_curve(IpoCurve *icu)
-{
- if(icu->bezt) MEM_freeN(icu->bezt);
- if(icu->bp) MEM_freeN(icu->bp);
- if(icu->driver) MEM_freeN(icu->driver);
MEM_freeN(icu);
}
/* do not free ipo itself */
-void free_ipo(Ipo *ipo)
+void free_ipo (Ipo *ipo)
{
- IpoCurve *icu;
+ IpoCurve *icu, *icn;
+
+ if (ipo == NULL)
+ return;
- while( (icu= ipo->curve.first) ) {
+ for (icu= ipo->curve.first; icu; icu= icn) {
+ icn= icu->next;
+
+ /* must remove the link before freeing, as the curve is freed too */
BLI_remlink(&ipo->curve, icu);
free_ipo_curve(icu);
}
}
+/* ---------------------- Init --------------------------- */
+
/* on adding new ipos, or for empty views */
-void ipo_default_v2d_cur(int blocktype, rctf *cur)
+void ipo_default_v2d_cur (int blocktype, rctf *cur)
{
- if(blocktype==ID_CA) {
- cur->xmin= G.scene->r.sfra;
- cur->xmax= G.scene->r.efra;
- cur->ymin= 0.0;
- cur->ymax= 100.0;
- }
- else if ELEM5(blocktype, ID_MA, ID_CU, ID_WO, ID_LA, ID_CO) {
- cur->xmin= (float)G.scene->r.sfra-0.1;
- cur->xmax= G.scene->r.efra;
- cur->ymin= (float)-0.1;
- cur->ymax= (float)+1.1;
- }
- else if(blocktype==ID_TE) {
- cur->xmin= (float)G.scene->r.sfra-0.1;
- cur->xmax= G.scene->r.efra;
- cur->ymin= (float)-0.1;
- cur->ymax= (float)+1.1;
- }
- else if(blocktype==ID_SEQ) {
- cur->xmin= -5.0;
- cur->xmax= 105.0;
- cur->ymin= (float)-0.1;
- cur->ymax= (float)+1.1;
- }
- else if(blocktype==ID_KE) {
- cur->xmin= (float)G.scene->r.sfra-0.1;
- cur->xmax= G.scene->r.efra;
- cur->ymin= (float)-0.1;
- cur->ymax= (float)+2.1;
- }
- else { /* ID_OB and everything else */
- cur->xmin= G.scene->r.sfra;
- cur->xmax= G.scene->r.efra;
- cur->ymin= -5.0;
- cur->ymax= +5.0;
+ switch (blocktype) {
+ case ID_CA:
+ cur->xmin= (float)G.scene->r.sfra;
+ cur->xmax= (float)G.scene->r.efra;
+ cur->ymin= 0.0f;
+ cur->ymax= 100.0f;
+ break;
+
+ case ID_MA: case ID_WO: case ID_LA:
+ case ID_CU: case ID_CO:
+ cur->xmin= (float)(G.scene->r.sfra - 0.1f);
+ cur->xmax= (float)G.scene->r.efra;
+ cur->ymin= (float)-0.1f;
+ cur->ymax= (float)+1.1f;
+ break;
+
+ case ID_TE:
+ cur->xmin= (float)(G.scene->r.sfra - 0.1f);
+ cur->xmax= (float)G.scene->r.efra;
+ cur->ymin= (float)-0.1f;
+ cur->ymax= (float)+1.1f;
+ break;
+
+ case ID_SEQ:
+ cur->xmin= -5.0f;
+ cur->xmax= 105.0f;
+ cur->ymin= (float)-0.1f;
+ cur->ymax= (float)+1.1f;
+ break;
+
+ case ID_KE:
+ cur->xmin= (float)(G.scene->r.sfra - 0.1f);
+ cur->xmax= (float)G.scene->r.efra;
+ cur->ymin= (float)-0.1f;
+ cur->ymax= (float)+2.1f;
+ break;
+
+ default: /* ID_OB and everything else */
+ cur->xmin= (float)G.scene->r.sfra;
+ cur->xmax= (float)G.scene->r.efra;
+ cur->ymin= -5.0f;
+ cur->ymax= +5.0f;
+ break;
}
}
-
-Ipo *add_ipo(char *name, int idcode)
+/* create a new IPO block (allocates the block) */
+Ipo *add_ipo (char name[], int blocktype)
{
Ipo *ipo;
ipo= alloc_libblock(&G.main->ipo, ID_IP, name);
- ipo->blocktype= idcode;
- ipo_default_v2d_cur(idcode, &ipo->cur);
+ ipo->blocktype= blocktype;
+ ipo_default_v2d_cur(blocktype, &ipo->cur);
return ipo;
}
-Ipo *copy_ipo(Ipo *ipo)
+/* ---------------------- Copy --------------------------- */
+
+/* duplicate an IPO block and all its data */
+Ipo *copy_ipo (Ipo *src)
{
- Ipo *ipon;
+ Ipo *dst;
IpoCurve *icu;
- if(ipo==NULL) return 0;
-
- ipon= copy_libblock(ipo);
+ if (src == NULL)
+ return NULL;
- duplicatelist(&(ipon->curve), &(ipo->curve));
+ dst= copy_libblock(src);
+ duplicatelist(&dst->curve, &src->curve);
- for(icu= ipo->curve.first; icu; icu= icu->next) {
+ for (icu= src->curve.first; icu; icu= icu->next) {
icu->bezt= MEM_dupallocN(icu->bezt);
- if(icu->driver) icu->driver= MEM_dupallocN(icu->driver);
+
+ if (icu->driver)
+ icu->driver= MEM_dupallocN(icu->driver);
}
- return ipon;
+ return dst;
}
-/* uses id->newid to match pointers with other copied data */
-void ipo_idnew(Ipo *ipo)
+/* ---------------------- Relink --------------------------- */
+
+/* uses id->newid to match pointers with other copied data
+ * - called after single-user or other such
+ */
+void ipo_idnew (Ipo *ipo)
{
- if(ipo) {
+ if (ipo) {
IpoCurve *icu;
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->driver) {
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ if (icu->driver)
ID_NEW(icu->driver->ob);
- }
}
}
}
-void make_local_obipo(Ipo *ipo)
+/* --------------------- Find + Check ----------------------- */
+
+/* find the IPO-curve within a given IPO-block with the adrcode of interest */
+IpoCurve *find_ipocurve (Ipo *ipo, int adrcode)
+{
+ if (ipo) {
+ IpoCurve *icu;
+
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ if (icu->adrcode == adrcode)
+ return icu;
+ }
+ }
+ return NULL;
+}
+
+/* return whether the given IPO block has a IPO-curve with the given adrcode */
+short has_ipo_code(Ipo *ipo, int adrcode)
+{
+ /* return success of faliure from trying to find such an IPO-curve */
+ return (find_ipocurve(ipo, adrcode) != NULL);
+}
+
+/* ---------------------- Make Local --------------------------- */
+
+
+/* make the given IPO local (for Objects)
+ * - only lib users: do nothing
+ * - only local users: set flag
+ * - mixed: make copy
+ */
+void make_local_obipo (Ipo *src)
{
Object *ob;
- Ipo *ipon;
+ Ipo *dst;
int local=0, lib=0;
- /* - only lib users: do nothing
- * - only local users: set flag
- * - mixed: make copy
- */
-
- ob= G.main->object.first;
- while(ob) {
- if(ob->ipo==ipo) {
- if(ob->id.lib) lib= 1;
+ /* check if only local and/or lib */
+ for (ob= G.main->object.first; ob; ob= ob->id.next) {
+ if (ob->ipo == src) {
+ if (ob->id.lib) lib= 1;
else local= 1;
}
- ob= ob->id.next;
}
- if(local && lib==0) {
- ipo->id.lib= 0;
- ipo->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ipo, 0);
+ /* only local - set flag */
+ if (local && lib==0) {
+ src->id.lib= 0;
+ src->id.flag= LIB_LOCAL;
+ new_id(0, (ID *)src, 0);
}
- else if(local && lib) {
- ipon= copy_ipo(ipo);
- ipon->id.us= 0;
+ /* mixed: make copy */
+ else if (local && lib) {
+ dst= copy_ipo(src);
+ dst->id.us= 0;
- ob= G.main->object.first;
- while(ob) {
- if(ob->ipo==ipo) {
-
- if(ob->id.lib==NULL) {
- ob->ipo= ipon;
- ipon->id.us++;
- ipo->id.us--;
+ for (ob= G.main->object.first; ob; ob= ob->id.next) {
+ if (ob->ipo == src) {
+ if (ob->id.lib == NULL) {
+ ob->ipo= dst;
+ dst->id.us++;
+ src->id.us--;
}
}
- ob= ob->id.next;
}
}
}
-void make_local_matipo(Ipo *ipo)
+/* make the given IPO local (for Materials)
+ * - only lib users: do nothing
+ * - only local users: set flag
+ * - mixed: make copy
+ */
+void make_local_matipo (Ipo *src)
{
Material *ma;
- Ipo *ipon;
+ Ipo *dst;
int local=0, lib=0;
-
- /* - only lib users: do nothing
- * - only local users: set flag
- * - mixed: make copy
- */
- ma= G.main->mat.first;
- while(ma) {
- if(ma->ipo==ipo) {
- if(ma->id.lib) lib= 1;
+ /* check if only local and/or lib */
+ for (ma= G.main->mat.first; ma; ma= ma->id.next) {
+ if (ma->ipo == src) {
+ if (ma->id.lib) lib= 1;
else local= 1;
}
- ma= ma->id.next;
}
- if(local && lib==0) {
- ipo->id.lib= 0;
- ipo->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ipo, 0);
+ /* only local - set flag */
+ if (local && lib==0) {
+ src->id.lib= 0;
+ src->id.flag= LIB_LOCAL;
+ new_id(0, (ID *)src, 0);
}
- else if(local && lib) {
- ipon= copy_ipo(ipo);
- ipon->id.us= 0;
+ /* mixed: make copy */
+ else if (local && lib) {
+ dst= copy_ipo(src);
+ dst->id.us= 0;
- ma= G.main->mat.first;
- while(ma) {
- if(ma->ipo==ipo) {
-
- if(ma->id.lib==NULL) {
- ma->ipo= ipon;
- ipon->id.us++;
- ipo->id.us--;
+ for (ma= G.main->mat.first; ma; ma= ma->id.next) {
+ if (ma->ipo == src) {
+ if (ma->id.lib == NULL) {
+ ma->ipo= dst;
+ dst->id.us++;
+ src->id.us--;
}
}
- ma= ma->id.next;
}
}
}
-void make_local_keyipo(Ipo *ipo)
+/* make the given IPO local (for ShapeKeys)
+ * - only lib users: do nothing
+ * - only local users: set flag
+ * - mixed: make copy
+ */
+void make_local_keyipo (Ipo *src)
{
Key *key;
- Ipo *ipon;
+ Ipo *dst;
int local=0, lib=0;
-
- /* - only lib users: do nothing
- * - only local users: set flag
- * - mixed: make copy
- */
- key= G.main->key.first;
- while(key) {
- if(key->ipo==ipo) {
- if(key->id.lib) lib= 1;
+ /* check if only local and/or lib */
+ for (key= G.main->key.first; key; key= key->id.next) {
+ if (key->ipo == src) {
+ if (key->id.lib) lib= 1;
else local= 1;
}
- key= key->id.next;
}
- if(local && lib==0) {
- ipo->id.lib= 0;
- ipo->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ipo, 0);
+ /* only local - set flag */
+ if (local && lib==0) {
+ src->id.lib= 0;
+ src->id.flag= LIB_LOCAL;
+ new_id(0, (ID *)src, 0);
}
- else if(local && lib) {
- ipon= copy_ipo(ipo);
- ipon->id.us= 0;
+ /* mixed: make copy */
+ else if (local && lib) {
+ dst= copy_ipo(src);
+ dst->id.us= 0;
- key= G.main->key.first;
- while(key) {
- if(key->ipo==ipo) {
-
- if(key->id.lib==NULL) {
- key->ipo= ipon;
- ipon->id.us++;
- ipo->id.us--;
+ for (key= G.main->key.first; key; key= key->id.next) {
+ if (key->ipo == src) {
+ if (key->id.lib == NULL) {
+ key->ipo= dst;
+ dst->id.us++;
+ src->id.us--;
}
}
- key= key->id.next;
}
}
}
-void make_local_ipo(Ipo *ipo)
+/* generic call to make IPO's local */
+void make_local_ipo (Ipo *ipo)
{
-
- if(ipo->id.lib==NULL) return;
- if(ipo->id.us==1) {
+ /* can't touch lib-linked data */
+ if (ipo->id.lib == NULL)
+ return;
+
+ /* with only one user, just set local flag */
+ if (ipo->id.us == 1) {
ipo->id.lib= 0;
ipo->id.flag= LIB_LOCAL;
new_id(0, (ID *)ipo, 0);
return;
}
- if(ipo->blocktype==ID_OB) make_local_obipo(ipo);
- else if(ipo->blocktype==ID_MA) make_local_matipo(ipo);
- else if(ipo->blocktype==ID_KE) make_local_keyipo(ipo);
-
+ /* when more than 1 user, can only make local for certain blocktypes */
+ switch (ipo->blocktype) {
+ case ID_OB:
+ make_local_obipo(ipo);
+ break;
+ case ID_MA:
+ make_local_matipo(ipo);
+ break;
+ case ID_KE:
+ make_local_keyipo(ipo);
+ break;
+ }
}
-IpoCurve *find_ipocurve(Ipo *ipo, int adrcode)
+/* ***************************** Keyframe Column Tools ********************************* */
+
+/* add a BezTriple to a column */
+void add_to_cfra_elem(ListBase *lb, BezTriple *bezt)
{
- if(ipo) {
- IpoCurve *icu;
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->adrcode==adrcode) return icu;
+ CfraElem *ce, *cen;
+
+ for (ce= lb->first; ce; ce= ce->next) {
+ /* double key? */
+ if (ce->cfra == bezt->vec[1][0]) {
+ if (bezt->f2 & SELECT) ce->sel= bezt->f2;
+ return;
}
+ /* should key be inserted before this column? */
+ else if (ce->cfra > bezt->vec[1][0]) break;
}
- return NULL;
+
+ /* create a new column */
+ cen= MEM_callocN(sizeof(CfraElem), "add_to_cfra_elem");
+ if (ce) BLI_insertlinkbefore(lb, ce, cen);
+ else BLI_addtail(lb, cen);
+
+ cen->cfra= bezt->vec[1][0];
+ cen->sel= bezt->f2;
}
-void calchandles_ipocurve(IpoCurve *icu)
+/* make a list of keyframe 'columns' in an IPO block */
+void make_cfra_list (Ipo *ipo, ListBase *elems)
{
- BezTriple *bezt, *prev, *next;
+ IpoCurve *icu;
+ BezTriple *bezt;
int a;
+
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ if (icu->flag & IPO_VISIBLE) {
+ /* ... removed old checks for adrcode types from here ...
+ * - (was this used for IpoKeys in the past?)
+ */
+
+ bezt= icu->bezt;
+ if (bezt) {
+ for (a=0; a < icu->totvert; a++, bezt++) {
+ add_to_cfra_elem(elems, bezt);
+ }
+ }
+ }
+ }
+}
- a= icu->totvert;
+/* ***************************** Timing Stuff ********************************* */
- /* IPO_CONST doesn't have handles */
- if(a<2 || icu->ipo==IPO_CONST || icu->ipo==IPO_LIN) return;
+/* This (evil) function is needed to cope with two legacy Blender rendering features
+ * mblur (motion blur that renders 'subframes' and blurs them together), and fields
+ * rendering. Thus, the use of ugly globals from object.c
+ */
+// BAD... EVIL... JUJU...!!!!
+float frame_to_float (int cfra) /* see also bsystem_time in object.c */
+{
+ extern float bluroffs; /* bad stuff borrowed from object.c */
+ extern float fieldoffs;
+ float ctime;
- bezt= icu->bezt;
- prev= 0;
- next= bezt+1;
+ ctime= (float)cfra;
+ ctime+= bluroffs+fieldoffs;
+ ctime*= G.scene->r.framelen;
+
+ return ctime;
+}
- while(a--) {
+/* ***************************** IPO Curve Sanity ********************************* */
+/* The functions here are used in various parts of Blender, usually after some editing
+ * of keyframe data has occurred. They ensure that keyframe data is properly ordered and
+ * that the handles are correctly
+ */
- if(bezt->vec[0][0]>bezt->vec[1][0]) bezt->vec[0][0]= bezt->vec[1][0];
- if(bezt->vec[2][0]<bezt->vec[1][0]) bezt->vec[2][0]= bezt->vec[1][0];
+/* This function recalculates the handles of an IPO-Curve
+ * If the BezTriples have been rearranged, sort them first before using this.
+ */
+void calchandles_ipocurve (IpoCurve *icu)
+{
+ BezTriple *bezt, *prev, *next;
+ int a= icu->totvert;
- if(icu->flag & IPO_AUTO_HORIZ)
+ /* Error checking:
+ * - need at least two points
+ * - need bezier keys
+ * - only bezier-interpolation has handles (for now)
+ */
+ if (ELEM(NULL, icu, icu->bezt) || (a < 2) || ELEM(icu->ipo, IPO_CONST, IPO_LIN))
+ return;
+
+ /* get initial pointers */
+ bezt= icu->bezt;
+ prev= NULL;
+ next= (bezt + 1);
+
+ /* loop over all beztriples, adjusting handles */
+ while (a--) {
+ /* clamp timing of handles to be on either side of beztriple */
+ if (bezt->vec[0][0] > bezt->vec[1][0]) bezt->vec[0][0]= bezt->vec[1][0];
+ if (bezt->vec[2][0] < bezt->vec[1][0]) bezt->vec[2][0]= bezt->vec[1][0];
+
+ /* calculate autohandles */
+ if (icu->flag & IPO_AUTO_HORIZ)
calchandleNurb(bezt, prev, next, 2); /* 2==special autohandle && keep extrema horizontal */
else
calchandleNurb(bezt, prev, next, 1); /* 1==special autohandle */
-
- prev= bezt;
- if(a==1) {
- next= 0;
- }
- else next++;
-
+
/* for automatic ease in and out */
- if(bezt->h1==HD_AUTO && bezt->h2==HD_AUTO) {
- if(a==0 || a==icu->totvert-1) {
- if(icu->extrap==IPO_HORIZ) {
+ if ((bezt->h1==HD_AUTO) && (bezt->h2==HD_AUTO)) {
+ /* only do this on first or last beztriple */
+ if ((a==0) || (a==icu->totvert-1)) {
+ /* set both handles to have same horizontal value as keyframe */
+ if (icu->extrap==IPO_HORIZ) {
bezt->vec[0][1]= bezt->vec[2][1]= bezt->vec[1][1];
}
}
}
+ /* advance pointers for next iteration */
+ prev= bezt;
+ if (a == 1) next= NULL;
+ else next++;
bezt++;
}
}
-void testhandles_ipocurve(IpoCurve *icu)
+/* Use when IPO-Curve with handles has changed
+ * It treats all BezTriples with the following rules:
+ * - PHASE 1: do types have to be altered?
+ * -> Auto handles: become aligned when selection status is NOT(000 || 111)
+ * -> Vector handles: become 'nothing' when (one half selected AND other not)
+ * - PHASE 2: recalculate handles
+*/
+void testhandles_ipocurve (IpoCurve *icu)
{
- /* use when something has changed with handles.
- it treats all BezTriples with the following rules:
- PHASE 1: do types have to be altered?
- Auto handles: become aligned when selection status is NOT(000 || 111)
- Vector handles: become 'nothing' when (one half selected AND other not)
- PHASE 2: recalculate handles
- */
- BezTriple *bezt;
- int flag, a;
+ BezTriple *bezt;
+ int a;
- bezt= icu->bezt;
- if(bezt==NULL) return;
+ /* only beztriples have handles (bpoints don't though) */
+ if (ELEM(NULL, icu, icu->bezt))
+ return;
- a= icu->totvert;
- while(a--) {
- flag= 0;
- if(bezt->f1 & SELECT) flag++;
- if(bezt->f2 & SELECT) flag += 2;
- if(bezt->f3 & SELECT) flag += 4;
-
- if( !(flag==0 || flag==7) ) {
- if(bezt->h1==HD_AUTO) { /* auto */
+ /* loop over beztriples */
+ for (a=0, bezt=icu->bezt; a < icu->totvert; a++, bezt++) {
+ short flag= 0;
+
+ /* flag is initialised as selection status
+ * of beztriple control-points (labelled 0,1,2)
+ */
+ if (bezt->f1 & SELECT) flag |= (1<<0); // == 1
+ if (bezt->f2 & SELECT) flag |= (1<<1); // == 2
+ if (bezt->f3 & SELECT) flag |= (1<<2); // == 4
+
+ /* one or two handles selected only */
+ if (ELEM(flag, 0, 7)==0) {
+ /* auto handles become aligned */
+ if (bezt->h1==HD_AUTO)
bezt->h1= HD_ALIGN;
- }
- if(bezt->h2==HD_AUTO) { /* auto */
+ if(bezt->h2==HD_AUTO)
bezt->h2= HD_ALIGN;
+
+ /* vector handles become 'free' when only one half selected */
+ if(bezt->h1==HD_VECT) {
+ /* only left half (1 or 2 or 1+2) */
+ if (flag < 4)
+ bezt->h1= 0;
}
-
- if(bezt->h1==HD_VECT) { /* vector */
- if(flag < 4) bezt->h1= 0;
- }
- if(bezt->h2==HD_VECT) { /* vector */
- if( flag > 3) bezt->h2= 0;
+ if(bezt->h2==HD_VECT) {
+ /* only right half (4 or 2+4) */
+ if (flag > 3)
+ bezt->h2= 0;
}
}
- bezt++;
}
+ /* recalculate handles */
calchandles_ipocurve(icu);
}
-
+/* This function sorts BezTriples so that they are arranged in chronological order,
+ * as tools working on IPO-Curves expect that the BezTriples are in order.
+ */
void sort_time_ipocurve(IpoCurve *icu)
{
- BezTriple *bezt;
- int a, ok= 1;
+ short ok= 1;
- while(ok) {
+ /* keep adjusting order of beztriples until nothing moves (bubble-sort) */
+ while (ok) {
ok= 0;
-
- if(icu->bezt) {
- bezt= icu->bezt;
- a= icu->totvert;
- while(a--) {
- if(a>0) {
- if( bezt->vec[1][0] > (bezt+1)->vec[1][0]) {
+
+ /* currently, will only be needed when there are beztriples */
+ if (icu->bezt) {
+ BezTriple *bezt;
+ int a;
+
+ /* loop over ALL points to adjust position in array and recalculate handles */
+ for (a=0, bezt=icu->bezt; a < icu->totvert; a++, bezt++) {
+ /* check if thee's a next beztriple which we could try to swap with current */
+ if (a < (icu->totvert-1)) {
+ /* swap if one is after the other (and indicate that order has changed) */
+ if (bezt->vec[1][0] > (bezt+1)->vec[1][0]) {
SWAP(BezTriple, *bezt, *(bezt+1));
ok= 1;
}
+
+ /* if either one of both of the points exceeds crosses over the keyframe time... */
+ if ( (bezt->vec[0][0] > bezt->vec[1][0]) && (bezt->vec[2][0] < bezt->vec[1][0]) ) {
+ /* swap handles if they have switched sides for some reason */
+ SWAP(float, bezt->vec[0][0], bezt->vec[2][0]);
+ SWAP(float, bezt->vec[0][1], bezt->vec[2][1]);
+ }
+ else {
+ /* clamp handles */
+ if (bezt->vec[0][0] > bezt->vec[1][0])
+ bezt->vec[0][0]= bezt->vec[1][0];
+ if (bezt->vec[2][0] < bezt->vec[1][0])
+ bezt->vec[2][0]= bezt->vec[1][0];
+ }
}
- if(bezt->vec[0][0]>bezt->vec[1][0] && bezt->vec[2][0]<bezt->vec[1][0]) {
- SWAP(float, bezt->vec[0][0], bezt->vec[2][0]);
- SWAP(float, bezt->vec[0][1], bezt->vec[2][1]);
- }
- else {
- if(bezt->vec[0][0]>bezt->vec[1][0]) bezt->vec[0][0]= bezt->vec[1][0];
- if(bezt->vec[2][0]<bezt->vec[1][0]) bezt->vec[2][0]= bezt->vec[1][0];
- }
- bezt++;
}
}
- else {
-
- }
}
}
-int test_time_ipocurve(IpoCurve *icu)
+/* This function tests if any BezTriples are out of order, thus requiring a sort */
+int test_time_ipocurve (IpoCurve *icu)
{
- BezTriple *bezt;
int a;
- if(icu->bezt) {
- bezt= icu->bezt;
- a= icu->totvert-1;
- while(a--) {
- if( bezt->vec[1][0] > (bezt+1)->vec[1][0]) {
- return 1;
- }
- bezt++;
- }
- }
- else {
+ /* currently, only need to test beztriples */
+ if (icu->bezt) {
+ BezTriple *bezt;
+ /* loop through all beztriples, stopping when one exceeds the one after it */
+ for (a=0, bezt= icu->bezt; a < (icu->totvert - 1); a++, bezt++) {
+ if (bezt->vec[1][0] > (bezt+1)->vec[1][0])
+ return 1;
+ }
}
-
+
+ /* none need any swapping */
return 0;
}
-void correct_bezpart(float *v1, float *v2, float *v3, float *v4)
+/* --------- */
+
+/* The total length of the handles is not allowed to be more
+ * than the horizontal distance between (v1-v4).
+ * This is to prevent curve loops.
+*/
+void correct_bezpart (float *v1, float *v2, float *v3, float *v4)
{
- /* the total length of the handles is not allowed to be more
- * than the horizontal distance between (v1-v4)
- * this to prevent curve loops
- */
float h1[2], h2[2], len1, len2, len, fac;
+ /* calculate handle deltas */
h1[0]= v1[0]-v2[0];
h1[1]= v1[1]-v2[1];
h2[0]= v4[0]-v3[0];
h2[1]= v4[1]-v3[1];
+ /* calculate distances:
+ * - len = span of time between keyframes
+ * - len1 = length of handle of start key
+ * - len2 = length of handle of end key
+ */
len= v4[0]- v1[0];
len1= (float)fabs(h1[0]);
len2= (float)fabs(h2[0]);
- if(len1+len2==0.0) return;
- if(len1+len2 > len) {
+ /* if the handles have no length, no need to do any corrections */
+ if ((len1+len2) == 0.0)
+ return;
+
+ /* the two handles cross over each other, so force them
+ * apart using the proportion they overlap
+ */
+ if ((len1+len2) > len) {
fac= len/(len1+len2);
v2[0]= (v1[0]-fac*h1[0]);
@@ -638,57 +801,86 @@ void correct_bezpart(float *v1, float *v2, float *v3, float *v4)
v3[0]= (v4[0]-fac*h2[0]);
v3[1]= (v4[1]-fac*h2[1]);
-
}
}
-/* *********************** ARITH *********************** */
+#if 0 // TODO: enable when we have per-segment interpolation
+/* This function sets the interpolation mode for an entire Ipo-Curve.
+ * It is primarily used for patching old files, but is also used in the interface
+ * to make sure that all segments of the curve use the same interpolation.
+ */
+void set_interpolation_ipocurve (IpoCurve *icu, short ipo)
+{
+ BezTriple *bezt;
+ int a;
+
+ /* validate arguments */
+ if (icu == NULL) return;
+ if (ELEM3(ipo, IPO_CONST, IPO_LIN, IPO_BEZ)==0) return;
-int findzero(float x, float q0, float q1, float q2, float q3, float *o)
+ /* set interpolation mode for whole curve */
+ icu->ipo= ipo;
+
+ /* set interpolation mode of all beztriples */
+ for (a=0, bezt=icu->bezt; a<icu->totvert; a++, bezt++)
+ bezt->ipo= ipo;
+}
+#endif // TODO: enable when we have per-segment interpolation
+
+/* ***************************** Curve Calculations ********************************* */
+
+/* find root/zero */
+int findzero (float x, float q0, float q1, float q2, float q3, float *o)
{
double c0, c1, c2, c3, a, b, c, p, q, d, t, phi;
int nr= 0;
- c0= q0-x;
- c1= 3*(q1-q0);
- c2= 3*(q0-2*q1+q2);
- c3= q3-q0+3*(q1-q2);
+ c0= q0 - x;
+ c1= 3 * (q1 - q0);
+ c2= 3 * (q0 - 2*q1 + q2);
+ c3= q3 - q0 + 3 * (q1 - q2);
- if(c3!=0.0) {
+ if (c3 != 0.0) {
a= c2/c3;
b= c1/c3;
c= c0/c3;
a= a/3;
-
- p= b/3-a*a;
- q= (2*a*a*a-a*b+c)/2;
- d= q*q+p*p*p;
-
- if(d>0.0) {
+
+ p= b/3 - a*a;
+ q= (2*a*a*a - a*b + c) / 2;
+ d= q*q + p*p*p;
+
+ if (d > 0.0) {
t= sqrt(d);
- o[0]= (float)(Sqrt3d(-q+t)+Sqrt3d(-q-t)-a);
- if(o[0]>= SMALL && o[0]<=1.000001) return 1;
+ o[0]= (float)(Sqrt3d(-q+t) + Sqrt3d(-q-t) - a);
+
+ if ((o[0] >= SMALL) && (o[0] <= 1.000001)) return 1;
else return 0;
}
- else if(d==0.0) {
+ else if (d == 0.0) {
t= Sqrt3d(-q);
- o[0]= (float)(2*t-a);
- if(o[0]>=SMALL && o[0]<=1.000001) nr++;
+ o[0]= (float)(2*t - a);
+
+ if ((o[0] >= SMALL) && (o[0] <= 1.000001)) nr++;
o[nr]= (float)(-t-a);
- if(o[nr]>=SMALL && o[nr]<=1.000001) return nr+1;
+
+ if ((o[nr] >= SMALL) && (o[nr] <= 1.000001)) return nr+1;
else return nr;
}
else {
- phi= acos(-q/sqrt(-(p*p*p)));
+ phi= acos(-q / sqrt(-(p*p*p)));
t= sqrt(-p);
p= cos(phi/3);
- q= sqrt(3-3*p*p);
- o[0]= (float)(2*t*p-a);
- if(o[0]>=SMALL && o[0]<=1.000001) nr++;
- o[nr]= (float)(-t*(p+q)-a);
- if(o[nr]>=SMALL && o[nr]<=1.000001) nr++;
- o[nr]= (float)(-t*(p-q)-a);
- if(o[nr]>=SMALL && o[nr]<=1.000001) return nr+1;
+ q= sqrt(3 - 3*p*p);
+ o[0]= (float)(2*t*p - a);
+
+ if ((o[0] >= SMALL) && (o[0] <= 1.000001)) nr++;
+ o[nr]= (float)(-t * (p + q) - a);
+
+ if ((o[nr] >= SMALL) && (o[nr] <= 1.000001)) nr++;
+ o[nr]= (float)(-t * (p - q) - a);
+
+ if ((o[nr] >= SMALL) && (o[nr] <= 1.000001)) return nr+1;
else return nr;
}
}
@@ -697,83 +889,97 @@ int findzero(float x, float q0, float q1, float q2, float q3, float *o)
b=c1;
c=c0;
- if(a!=0.0) {
- p=b*b-4*a*c;
- if(p>0) {
+ if (a != 0.0) {
+ // discriminant
+ p= b*b - 4*a*c;
+
+ if (p > 0) {
p= sqrt(p);
- o[0]= (float)((-b-p)/(2*a));
- if(o[0]>=SMALL && o[0]<=1.000001) nr++;
+ o[0]= (float)((-b-p) / (2 * a));
+
+ if ((o[0] >= SMALL) && (o[0] <= 1.000001)) nr++;
o[nr]= (float)((-b+p)/(2*a));
- if(o[nr]>=SMALL && o[nr]<=1.000001) return nr+1;
+
+ if ((o[nr] >= SMALL) && (o[nr] <= 1.000001)) return nr+1;
else return nr;
}
- else if(p==0) {
- o[0]= (float)(-b/(2*a));
- if(o[0]>=SMALL && o[0]<=1.000001) return 1;
+ else if (p == 0) {
+ o[0]= (float)(-b / (2 * a));
+ if ((o[0] >= SMALL) && (o[0] <= 1.000001)) return 1;
else return 0;
}
}
- else if(b!=0.0) {
+ else if (b != 0.0) {
o[0]= (float)(-c/b);
- if(o[0]>=SMALL && o[0]<=1.000001) return 1;
+
+ if ((o[0] >= SMALL) && (o[0] <= 1.000001)) return 1;
else return 0;
}
- else if(c==0.0) {
+ else if (c == 0.0) {
o[0]= 0.0;
return 1;
}
+
return 0;
}
}
-void berekeny(float f1, float f2, float f3, float f4, float *o, int b)
+void berekeny (float f1, float f2, float f3, float f4, float *o, int b)
{
float t, c0, c1, c2, c3;
int a;
c0= f1;
- c1= 3.0f*(f2 - f1);
- c2= 3.0f*(f1 - 2.0f*f2 + f3);
- c3= f4 - f1 + 3.0f*(f2-f3);
+ c1= 3.0f * (f2 - f1);
+ c2= 3.0f * (f1 - 2.0f*f2 + f3);
+ c3= f4 - f1 + 3.0f * (f2 - f3);
- for(a=0; a<b; a++) {
+ for (a=0; a < b; a++) {
t= o[a];
- o[a]= c0+t*c1+t*t*c2+t*t*t*c3;
+ o[a]= c0 + t*c1 + t*t*c2 + t*t*t*c3;
}
}
-void berekenx(float *f, float *o, int b)
+void berekenx (float *f, float *o, int b)
{
float t, c0, c1, c2, c3;
int a;
c0= f[0];
- c1= 3*(f[3]-f[0]);
- c2= 3*(f[0]-2*f[3]+f[6]);
- c3= f[9]-f[0]+3*(f[3]-f[6]);
- for(a=0; a<b; a++) {
+ c1= 3 * (f[3] - f[0]);
+ c2= 3 * (f[0] - 2*f[3] + f[6]);
+ c3= f[9] - f[0] + 3 * (f[3] - f[6]);
+
+ for (a=0; a < b; a++) {
t= o[a];
- o[a]= c0+t*c1+t*t*c2+t*t*t*c3;
+ o[a]= c0 + t*c1 + t*t*c2 + t*t*t*c3;
}
}
-/* we need the local transform = current transform - (parent transform + bone transform) */
-/* (local transform is on action channel level) */
-static void posechannel_get_local_transform(bPoseChannel *pchan, float *loc, float *eul, float *size)
+/* ***************************** IPO - Calculations ********************************* */
+
+/* ---------------------- Curve Evaluation --------------------------- */
+
+/* helper function for evaluating drivers:
+ * - we need the local transform = current transform - (parent transform + bone transform)
+ * - (local transform is on action channel level)
+ */
+static void posechannel_get_local_transform (bPoseChannel *pchan, float loc[], float eul[], float size[])
{
- float diff_mat[4][4];
float parmat[4][4], offs_bone[4][4], imat[4][4];
+ float diff_mat[4][4];
+ /* get first the parent + bone transform in parmat */
if (pchan->parent) {
- /* get first the parent + bone transform in parmat */
-
/* bone transform itself */
Mat4CpyMat3(offs_bone, pchan->bone->bone_mat);
+
/* The bone's root offset (is in the parent's coordinate system) */
VECCOPY(offs_bone[3], pchan->bone->head);
+
/* Get the length translation of parent (length along y axis) */
offs_bone[3][1]+= pchan->parent->bone->length;
-
+
Mat4MulSerie(parmat, pchan->parent->pose_mat, offs_bone, NULL, NULL, NULL, NULL, NULL, NULL);
/* invert it */
@@ -782,64 +988,83 @@ static void posechannel_get_local_transform(bPoseChannel *pchan, float *loc, flo
else {
Mat4CpyMat3(offs_bone, pchan->bone->bone_mat);
VECCOPY(offs_bone[3], pchan->bone->head);
-
+
/* invert it */
Mat4Invert(imat, offs_bone);
-
}
/* difference: current transform - (parent transform + bone transform) */
Mat4MulMat4(diff_mat, pchan->pose_mat, imat);
- if(loc)
+ /* extract relevant components */
+ if (loc)
VECCOPY(loc, diff_mat[3]);
- if(eul)
+ if (eul)
Mat4ToEul(diff_mat, eul);
- if(size)
+ if (size)
Mat4ToSize(diff_mat, size);
-
}
-/* has to return a float value */
-static float eval_driver(IpoDriver *driver, float ipotime)
+/* evaluate an IPO-driver to get a 'time' value to use instead of "ipotime"
+ * - "ipotime" is the frame at which IPO-curve is being evaluated
+ * - has to return a float value
+ */
+static float eval_driver (IpoDriver *driver, float ipotime)
{
-
- if(driver->type == IPO_DRIVER_TYPE_PYTHON) {
+#ifndef DISABLE_PYTHON
+ /* currently, drivers are either PyDrivers (evaluating a PyExpression, or Object/Pose-Channel transforms) */
+ if (driver->type == IPO_DRIVER_TYPE_PYTHON) {
/* check for empty or invalid expression */
- if ((driver->name[0] == '\0') ||
- (driver->flag & IPO_DRIVER_FLAG_INVALID))
+ if ( (driver->name[0] == '\0') ||
+ (driver->flag & IPO_DRIVER_FLAG_INVALID) )
+ {
return 0.0f;
- /* this evals the expression and returns its result:
- * (on errors it reports, then returns 0.0f) */
+ }
+
+ /* this evaluates the expression using Python,and returns its result:
+ * - on errors it reports, then returns 0.0f
+ */
return BPY_pydriver_eval(driver);
}
- else {
- Object *ob= driver->ob;
+ else
+#endif /* DISABLE_PYTHON */
+ {
- if(ob==NULL) return 0.0f;
- if(ob->proxy_from)
+ Object *ob= driver->ob;
+
+ /* must have an object to evaluate */
+ if (ob == NULL)
+ return 0.0f;
+
+ /* if a proxy, use the proxy source*/
+ if (ob->proxy_from)
ob= ob->proxy_from;
- if(driver->blocktype==ID_OB) {
- /* depsgraph failure; ob ipos are calculated in where_is_object, this might get called too late */
- if(ob->ipo && ob->ctime!=ipotime) {
+ /* use given object as driver */
+ if (driver->blocktype == ID_OB) {
+ /* depsgraph failure: ob ipos are calculated in where_is_object, this might get called too late */
+ if ((ob->ipo) && (ob->ctime != ipotime)) {
+ /* calculate the value of relevant channel on the Object, but do not write the value
+ * calculated on to the Object but onto "ipotime" instead
+ */
calc_ipo_spec(ob->ipo, driver->adrcode, &ipotime);
return ipotime;
}
- switch(driver->adrcode) {
+ /* return the value of the relevant channel */
+ switch (driver->adrcode) {
case OB_LOC_X:
return ob->loc[0];
case OB_LOC_Y:
return ob->loc[1];
case OB_LOC_Z:
return ob->loc[2];
- case OB_ROT_X:
- return ob->rot[0]/(M_PI_2/9.0);
- case OB_ROT_Y:
- return ob->rot[1]/(M_PI_2/9.0);
- case OB_ROT_Z:
- return ob->rot[2]/(M_PI_2/9.0);
+ case OB_ROT_X: /* hack: euler rotations are divided by 10 deg to fit on same axes as other channels */
+ return (float)( ob->rot[0]/(M_PI_2/9.0) );
+ case OB_ROT_Y: /* hack: euler rotations are divided by 10 deg to fit on same axes as other channels */
+ return (float)( ob->rot[1]/(M_PI_2/9.0) );
+ case OB_ROT_Z: /* hack: euler rotations are divided by 10 deg to fit on same axes as other channels */
+ return (float)( ob->rot[2]/(M_PI_2/9.0) );
case OB_SIZE_X:
return ob->size[0];
case OB_SIZE_Y:
@@ -848,14 +1073,20 @@ static float eval_driver(IpoDriver *driver, float ipotime)
return ob->size[2];
}
}
+
+ /* use given pose-channel as driver */
else { /* ID_AR */
bPoseChannel *pchan= get_pose_channel(ob->pose, driver->name);
- if(pchan && pchan->bone) {
-
- /* rotation difference is not a simple driver (i.e. value drives value), but the angle between 2 bones is driving stuff... which is useful */
- if(driver->adrcode==OB_ROT_DIFF) {
+
+ /* must have at least 1 bone to use */
+ if (pchan && pchan->bone) {
+ /* rotation difference is not a simple driver (i.e. value drives value), but the angle between 2 bones is driving stuff...
+ * - the name of the second pchan is also stored in driver->name, but packed after the other one by DRIVER_NAME_OFFS chars
+ */
+ if (driver->adrcode == OB_ROT_DIFF) {
bPoseChannel *pchan2= get_pose_channel(ob->pose, driver->name+DRIVER_NAME_OFFS);
- if(pchan2 && pchan2->bone) {
+
+ if (pchan2 && pchan2->bone) {
float q1[4], q2[4], quat[4], angle;
Mat4ToQuat(pchan->pose_mat, q1);
@@ -866,27 +1097,33 @@ static float eval_driver(IpoDriver *driver, float ipotime)
angle = 2.0f * (saacos(quat[0]));
angle= ABS(angle);
- return angle>M_PI?2.0f*M_PI-angle:angle;
+ return (angle > M_PI) ? (float)((2.0f * M_PI) - angle) : (float)(angle);
}
}
+
+ /* standard driver */
else {
float loc[3], eul[3], size[3];
+ /* retrieve local transforms to return
+ * - we use eulers here NOT quats, so that Objects can be driven by bones easily
+ * also, this way is more understandable for users
+ */
posechannel_get_local_transform(pchan, loc, eul, size);
-
- switch(driver->adrcode) {
+
+ switch (driver->adrcode) {
case OB_LOC_X:
return loc[0];
case OB_LOC_Y:
return loc[1];
case OB_LOC_Z:
return loc[2];
- case OB_ROT_X:
- return eul[0]/(M_PI_2/9.0);
- case OB_ROT_Y:
- return eul[1]/(M_PI_2/9.0);
- case OB_ROT_Z:
- return eul[2]/(M_PI_2/9.0);
+ case OB_ROT_X: /* hack: euler rotations are divided by 10 deg to fit on same axes as other channels */
+ return (float)( eul[0]/(M_PI_2/9.0) );
+ case OB_ROT_Y: /* hack: euler rotations are divided by 10 deg to fit on same axes as other channels */
+ return (float)( eul[1]/(M_PI_2/9.0) );
+ case OB_ROT_Z: /* hack: euler rotations are divided by 10 deg to fit on same axes as other channels */
+ return (float)( eul[2]/(M_PI_2/9.0) );
case OB_SIZE_X:
return size[0];
case OB_SIZE_Y:
@@ -898,261 +1135,722 @@ static float eval_driver(IpoDriver *driver, float ipotime)
}
}
}
+
+ /* return 0.0f, as couldn't find relevant data to use */
return 0.0f;
}
-float eval_icu(IpoCurve *icu, float ipotime)
+/* evaluate and return the value of the given IPO-curve at the specified frame ("evaltime") */
+float eval_icu(IpoCurve *icu, float evaltime)
{
- BezTriple *bezt, *prevbezt;
- float v1[2], v2[2], v3[2], v4[2], opl[32], dx, fac;
- float cycdx, cycdy, ofs, cycyofs, cvalue = 0.0;
- int a, b;
+ float cvalue = 0.0f;
- cycyofs= 0.0;
-
- if(icu->driver) {
+ /* if there is a driver, evaluate it to find value to use as "evaltime"
+ * - this value will also be returned as the value of the 'curve', if there are no keyframes
+ */
+ if (icu->driver) {
/* ipotime now serves as input for the curve */
- ipotime= cvalue= eval_driver(icu->driver, ipotime);
+ evaltime= cvalue= eval_driver(icu->driver, evaltime);
}
- if(icu->bezt) {
+
+ /* there are keyframes (in the form of BezTriples) which can be interpolated between */
+ if (icu->bezt) {
+ /* get pointers */
+ BezTriple *bezt, *prevbezt, *lastbezt;
+ float v1[2], v2[2], v3[2], v4[2], opl[32], dx, fac;
+ float cycdx, cycdy, ofs, cycyofs= 0.0;
+ int a, b;
+
+ /* get pointers */
+ a= icu->totvert-1;
prevbezt= icu->bezt;
bezt= prevbezt+1;
- a= icu->totvert-1;
+ lastbezt= prevbezt + a;
- /* cyclic? */
- if(icu->extrap & IPO_CYCL) {
- ofs= icu->bezt->vec[1][0];
- cycdx= (icu->bezt+icu->totvert-1)->vec[1][0] - ofs;
- cycdy= (icu->bezt+icu->totvert-1)->vec[1][1] - icu->bezt->vec[1][1];
- if(cycdx!=0.0) {
-
- if(icu->extrap & IPO_DIR) {
- cycyofs= (float)floor((ipotime-ofs)/cycdx);
- cycyofs*= cycdy;
+ /* extrapolation mode is 'cyclic' - find relative place within a cycle */
+ if (icu->extrap & IPO_CYCL) {
+ /* ofs is start frame of cycle */
+ ofs= prevbezt->vec[1][0];
+
+ /* calculate period and amplitude (total height) of a cycle */
+ cycdx= lastbezt->vec[1][0] - prevbezt->vec[1][0];
+ cycdy= lastbezt->vec[1][1] - prevbezt->vec[1][1];
+
+ /* cycle occurs over some period of time (cycdx should be positive all the time) */
+ if (cycdx) {
+ /* check if 'cyclic extrapolation', and thus calculate y-offset for this cycle
+ * - IPO_CYCLX = (IPO_CYCL + IPO_DIR)
+ */
+ if (icu->extrap & IPO_DIR) {
+ cycyofs = (float)floor((evaltime - ofs) / cycdx);
+ cycyofs *= cycdy;
}
-
- ipotime= (float)(fmod(ipotime-ofs, cycdx)+ofs);
- if(ipotime<ofs) ipotime+= cycdx;
+
+ /* calculate where in the cycle we are (overwrite evaltime to reflect this) */
+ evaltime= (float)(fmod(evaltime-ofs, cycdx) + ofs);
+ if (evaltime < ofs) evaltime += cycdx;
}
}
- /* endpoints? */
-
- if(prevbezt->vec[1][0]>=ipotime) {
- if( (icu->extrap & IPO_DIR) && icu->ipo!=IPO_CONST) {
+ /* evaluation time at or past endpoints? */
+ // TODO: for per-bezt interpolation, replace all icu->ipo with (bezt)->ipo
+ if (prevbezt->vec[1][0] >= evaltime) {
+ /* before or on first keyframe */
+ if ((icu->extrap & IPO_DIR) && (icu->ipo != IPO_CONST)) {
+ /* linear or bezier interpolation */
if (icu->ipo==IPO_LIN) {
- if (icu->totvert==1) cvalue= prevbezt->vec[1][1];
+ /* Use the next center point instead of our own handle for
+ * linear interpolated extrapolate
+ */
+ if (icu->totvert == 1)
+ cvalue= prevbezt->vec[1][1];
else {
- /* use the next center point instead of our own handle for
- * linear interpolated extrapolate */
bezt = prevbezt+1;
- dx= prevbezt->vec[1][0]-ipotime;
- fac= bezt->vec[1][0]-prevbezt->vec[1][0];
- if(fac!=0.0) {
- fac= (bezt->vec[1][1]-prevbezt->vec[1][1])/fac;
- cvalue= prevbezt->vec[1][1]-fac*dx;
+ dx= prevbezt->vec[1][0] - evaltime;
+ fac= bezt->vec[1][0] - prevbezt->vec[1][0];
+
+ /* prevent division by zero */
+ if (fac) {
+ fac= (bezt->vec[1][1] - prevbezt->vec[1][1]) / fac;
+ cvalue= prevbezt->vec[1][1] - (fac * dx);
}
- else cvalue= prevbezt->vec[1][1];
+ else
+ cvalue= prevbezt->vec[1][1];
}
- } else {
- dx= prevbezt->vec[1][0]-ipotime;
- fac= prevbezt->vec[1][0]-prevbezt->vec[0][0];
- if(fac!=0.0) {
- fac= (prevbezt->vec[1][1]-prevbezt->vec[0][1])/fac;
- cvalue= prevbezt->vec[1][1]-fac*dx;
+ }
+ else {
+ /* Use the first handle (earlier) of first BezTriple to calculate the
+ * gradient and thus the value of the curve at evaltime
+ */
+ dx= prevbezt->vec[1][0] - evaltime;
+ fac= prevbezt->vec[1][0] - prevbezt->vec[0][0];
+
+ /* prevent division by zero */
+ if (fac) {
+ fac= (prevbezt->vec[1][1] - prevbezt->vec[0][1]) / fac;
+ cvalue= prevbezt->vec[1][1] - (fac * dx);
}
- else cvalue= prevbezt->vec[1][1];
+ else
+ cvalue= prevbezt->vec[1][1];
}
}
- else cvalue= prevbezt->vec[1][1];
-
- cvalue+= cycyofs;
+ else {
+ /* constant (IPO_HORIZ) extrapolation or constant interpolation,
+ * so just extend first keyframe's value
+ */
+ cvalue= prevbezt->vec[1][1];
+ }
}
- else if( (prevbezt+a)->vec[1][0]<=ipotime) {
- if( (icu->extrap & IPO_DIR) && icu->ipo!=IPO_CONST) {
- prevbezt+= a;
-
+ else if (lastbezt->vec[1][0] <= evaltime) {
+ /* after or on last keyframe */
+ if( (icu->extrap & IPO_DIR) && (icu->ipo != IPO_CONST)) {
+ /* linear or bezier interpolation */
if (icu->ipo==IPO_LIN) {
- if (icu->totvert==1) cvalue= prevbezt->vec[1][1];
+ /* Use the next center point instead of our own handle for
+ * linear interpolated extrapolate
+ */
+ if (icu->totvert == 1)
+ cvalue= lastbezt->vec[1][1];
else {
- /* use the previous center point instead of our own handle for
- * linear interpolated extrapolate */
- bezt = prevbezt-1;
- dx= ipotime-prevbezt->vec[1][0];
- fac= prevbezt->vec[1][0]-bezt->vec[1][0];
-
- if(fac!=0) {
- fac= (prevbezt->vec[1][1]-bezt->vec[1][1])/fac;
- cvalue= prevbezt->vec[1][1]+fac*dx;
+ prevbezt = lastbezt - 1;
+ dx= evaltime - lastbezt->vec[1][0];
+ fac= lastbezt->vec[1][0] - prevbezt->vec[1][0];
+
+ /* prevent division by zero */
+ if (fac) {
+ fac= (lastbezt->vec[1][1] - prevbezt->vec[1][1]) / fac;
+ cvalue= lastbezt->vec[1][1] + (fac * dx);
}
- else cvalue= prevbezt->vec[1][1];
+ else
+ cvalue= lastbezt->vec[1][1];
}
- } else {
- dx= ipotime-prevbezt->vec[1][0];
- fac= prevbezt->vec[2][0]-prevbezt->vec[1][0];
-
- if(fac!=0) {
- fac= (prevbezt->vec[2][1]-prevbezt->vec[1][1])/fac;
- cvalue= prevbezt->vec[1][1]+fac*dx;
+ }
+ else {
+ /* Use the gradient of the second handle (later) of last BezTriple to calculate the
+ * gradient and thus the value of the curve at evaltime
+ */
+ dx= evaltime - lastbezt->vec[1][0];
+ fac= lastbezt->vec[2][0] - lastbezt->vec[1][0];
+
+ /* prevent division by zero */
+ if (fac) {
+ fac= (lastbezt->vec[2][1] - lastbezt->vec[1][1]) / fac;
+ cvalue= lastbezt->vec[1][1] + (fac * dx);
}
- else cvalue= prevbezt->vec[1][1];
+ else
+ cvalue= lastbezt->vec[1][1];
}
}
- else cvalue= (prevbezt+a)->vec[1][1];
-
- cvalue+= cycyofs;
+ else {
+ /* constant (IPO_HORIZ) extrapolation or constant interpolation,
+ * so just extend last keyframe's value
+ */
+ cvalue= lastbezt->vec[1][1];
+ }
}
else {
- while(a--) {
- if(prevbezt->vec[1][0]<=ipotime && bezt->vec[1][0]>=ipotime) {
- if(icu->ipo==IPO_CONST) {
- cvalue= prevbezt->vec[1][1]+cycyofs;
+ /* evaltime occurs somewhere in the middle of the curve */
+ // TODO: chould be optimised by using a binary search instead???
+ for (a=0; prevbezt && bezt && (a < icu->totvert-1); a++, prevbezt=bezt, bezt++) {
+ /* evaltime occurs within the interval defined by these two keyframes */
+ if ((prevbezt->vec[1][0] <= evaltime) && (bezt->vec[1][0] >= evaltime)) {
+ /* value depends on interpolation mode */
+ if (icu->ipo == IPO_CONST) {
+ /* constant (evaltime not relevant, so no interpolation needed) */
+ cvalue= prevbezt->vec[1][1];
}
- else if(icu->ipo==IPO_LIN) {
- fac= bezt->vec[1][0]-prevbezt->vec[1][0];
- if(fac==0) cvalue= cycyofs+prevbezt->vec[1][1];
- else {
- fac= (ipotime-prevbezt->vec[1][0])/fac;
- cvalue= cycyofs+prevbezt->vec[1][1]+ fac*(bezt->vec[1][1]-prevbezt->vec[1][1]);
+ else if (icu->ipo == IPO_LIN) {
+ /* linear - interpolate between values of the two keyframes */
+ fac= bezt->vec[1][0] - prevbezt->vec[1][0];
+
+ /* prevent division by zero */
+ if (fac) {
+ fac= (evaltime - prevbezt->vec[1][0]) / fac;
+ cvalue= prevbezt->vec[1][1] + (fac * (bezt->vec[1][1] - prevbezt->vec[1][1]));
}
+ else
+ cvalue= prevbezt->vec[1][1];
}
else {
+ /* bezier interpolation */
+ /* v1,v2 are the first keyframe and its 2nd handle */
v1[0]= prevbezt->vec[1][0];
v1[1]= prevbezt->vec[1][1];
v2[0]= prevbezt->vec[2][0];
v2[1]= prevbezt->vec[2][1];
-
+ /* v3,v4 are the last keyframe's 1st handle + the last keyframe */
v3[0]= bezt->vec[0][0];
v3[1]= bezt->vec[0][1];
v4[0]= bezt->vec[1][0];
v4[1]= bezt->vec[1][1];
-
+
+ /* adjust handles so that they don't overlap (forming a loop) */
correct_bezpart(v1, v2, v3, v4);
- b= findzero(ipotime, v1[0], v2[0], v3[0], v4[0], opl);
- if(b) {
+ /* try to get a value for this position - if failure, try another set of points */
+ b= findzero(evaltime, v1[0], v2[0], v3[0], v4[0], opl);
+ if (b) {
berekeny(v1[1], v2[1], v3[1], v4[1], opl, 1);
- cvalue= opl[0]+cycyofs;
+ cvalue= opl[0];
break;
}
}
}
- prevbezt= bezt;
- bezt++;
}
}
+
+ /* apply y-offset (for 'cyclic extrapolation') to calculated value */
+ cvalue+= cycyofs;
}
-
- if(icu->ymin < icu->ymax) {
- if(cvalue < icu->ymin) cvalue= icu->ymin;
- else if(cvalue > icu->ymax) cvalue= icu->ymax;
+
+ /* clamp evaluated value to lie within allowable value range for this channel */
+ if (icu->ymin < icu->ymax) {
+ CLAMP(cvalue, icu->ymin, icu->ymax);
}
+ /* return evaluated value */
return cvalue;
}
-void calc_icu(IpoCurve *icu, float ctime)
+/* ------------------- IPO-Block/Curve Calculation - General API ----------------------- */
+
+/* calculate the value of the given IPO-curve at the current frame, and set its curval */
+void calc_icu (IpoCurve *icu, float ctime)
{
+ /* calculate and set curval (evaluates driver too) */
icu->curval= eval_icu(icu, ctime);
}
-float calc_ipo_time(Ipo *ipo, float ctime)
+/* calculate for the current frame, all IPO-curves in IPO-block that can be evaluated
+ * - icu->curval is set for all IPO-curves which are evaluated!
+ */
+void calc_ipo (Ipo *ipo, float ctime)
{
+ IpoCurve *icu;
+
+ /* if there is no IPO block to evaluate, or whole block is "muted" */
+ if (ipo == NULL) return;
+ if (ipo->muteipo) return;
+
+ /* loop over all curves */
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ /* only evaluated curve if allowed to:
+ * - Muted channels should not be evaluated as they shouldn't have any effect
+ * --> user explictly turned them off!
+ * - Drivers should be evaluated at all updates
+ * --> TODO Note: drivers should be separated from standard channels
+ * - IPO_LOCK is not set, as it is set by some internal mechanisms to prevent
+ * IPO-curve from overwriting data (currently only used for IPO-Record).
+ */
+ if ((icu->driver) || (icu->flag & IPO_LOCK)==0) {
+ if ((icu->flag & IPO_MUTE)==0)
+ calc_icu(icu, ctime);
+ }
+ }
+}
- if(ipo && ipo->blocktype==ID_OB) {
- IpoCurve *icu= ipo->curve.first;
+/* ------------------- IPO-Block/Curve Calculation - Special Hacks ----------------------- */
- while(icu) {
- if (icu->adrcode==OB_TIME) {
- calc_icu(icu, ctime);
- return 10.0f*icu->curval;
- }
- icu= icu->next;
- }
+/* Calculate and return the value of the 'Time' Ipo-Curve from an Object,
+ * OR return the current time if not found
+ * - used in object.c -> bsystem_time()
+ */
+float calc_ipo_time (Ipo *ipo, float ctime)
+{
+ /* only Time IPO from Object IPO-blocks are relevant */
+ if ((ipo) && (ipo->blocktype == ID_OB)) {
+ IpoCurve *icu= find_ipocurve(ipo, OB_TIME);
+
+ /* only calculate (and set icu->curval) for time curve */
+ if (icu) {
+ calc_icu(icu, ctime);
+ return (10.0f * icu->curval);
+ }
}
+ /* no appropriate time-curve found */
return ctime;
}
-void calc_ipo(Ipo *ipo, float ctime)
+/* Evaluate the specified channel in the given IPO block on the specified frame (ctime),
+ * writing the value into that channel's icu->curval, but ALSO dumping it in ctime.
+ * - Returns success and modifies ctime!
+ */
+short calc_ipo_spec (Ipo *ipo, int adrcode, float *ctime)
+{
+ IpoCurve *icu= find_ipocurve(ipo, adrcode);
+
+ /* only evaluate if found */
+ if (icu) {
+ /* only calculate if allowed to (not locked and not muted)
+ * - drivers not taken into account, because this may be called when calculating a driver
+ */
+ if ((icu->flag & (IPO_LOCK|IPO_MUTE))==0)
+ calc_icu(icu, *ctime);
+
+ /* value resulting from calculations is written into ctime! */
+ *ctime= icu->curval;
+ return 1;
+ }
+
+ /* couldn't evaluate */
+ return 0;
+}
+
+/* ***************************** IPO - DataAPI ********************************* */
+
+/* --------------------- Flush/Execute IPO Values ----------------------------- */
+
+/* Flush IpoCurve->curvals to the data they affect (defined by ID)
+ * - not for Actions or Constraints! (those have their own special handling)
+ */
+void execute_ipo (ID *id, Ipo *ipo)
{
IpoCurve *icu;
+ void *poin;
+ int type;
- if(ipo==NULL) return;
- if(ipo->muteipo) return;
+ /* don't do anything without an IPO block */
+ if (ipo == NULL)
+ return;
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->driver || (icu->flag & IPO_LOCK)==0) {
- if((icu->flag & IPO_MUTE)==0)
- calc_icu(icu, ctime);
+ /* loop over IPO Curves, getting pointer to var to affect, and write into that pointer */
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ poin= get_ipo_poin(id, icu, &type);
+ if (poin) write_ipo_poin(poin, type, icu->curval);
+ }
+}
+
+/* Flush Action-Channel IPO data to Pose Channel */
+void execute_action_ipo (bActionChannel *achan, bPoseChannel *pchan)
+{
+ /* only do this if there's an Action Channel and Pose Channel to use */
+ if (achan && achan->ipo && pchan) {
+ IpoCurve *icu;
+
+ /* loop over IPO-curves, getting a pointer to pchan var to write to
+ * - assume for now that only 'float' channels will ever get written into
+ */
+ for (icu= achan->ipo->curve.first; icu; icu= icu->next) {
+ void *poin= get_pchan_ipo_poin(pchan, icu->adrcode);
+ if (poin) write_ipo_poin(poin, IPO_FLOAT, icu->curval);
}
}
}
-/* ************************************** */
-/* DO THE IPO! */
-/* ************************************** */
-void write_ipo_poin(void *poin, int type, float val)
+/* --------------------- Force Calculation + Flush IPO Values ----------------------------- */
+
+/* Calculate values for given IPO block, then flush to all of block's users
+ * - for general usage
+ */
+void do_ipo (Ipo *ipo)
{
+ if (ipo) {
+ float ctime= frame_to_float(G.scene->r.cfra);
+
+ /* calculate values, then flush to all users of this IPO block */
+ calc_ipo(ipo, ctime);
+ do_ipo_nocalc(ipo);
+ }
+}
- switch(type) {
- case IPO_FLOAT:
- *( (float *)poin)= val;
- break;
- case IPO_FLOAT_DEGR:
- *( (float *)poin)= (float)(val*M_PI_2/9.0);
- break;
- case IPO_INT:
- case IPO_INT_BIT:
- case IPO_LONG:
- *( (int *)poin)= (int)val;
- break;
- case IPO_SHORT:
- case IPO_SHORT_BIT:
- *( (short *)poin)= (short)val;
- break;
- case IPO_CHAR:
- case IPO_CHAR_BIT:
- *( (char *)poin)= (char)val;
- break;
+/* Calculate values for given Material's IPO block, then flush to given Material only */
+void do_mat_ipo (Material *ma)
+{
+ float ctime;
+
+ if (ELEM(NULL, ma, ma->ipo))
+ return;
+
+ ctime= frame_to_float(G.scene->r.cfra);
+ /* if(ob->ipoflag & OB_OFFS_OB) ctime-= ob->sf; */
+
+ /* calculate values for current time, then flush values to given material only */
+ calc_ipo(ma->ipo, ctime);
+ execute_ipo((ID *)ma, ma->ipo);
+}
+
+/* Calculate values for given Object's IPO block, then flush to given Object only
+ * - there's also some funky stuff that looks like it's for scene layers
+ */
+void do_ob_ipo (Object *ob)
+{
+ float ctime;
+ unsigned int lay;
+
+ if (ob->ipo == NULL)
+ return;
+
+ /* do not set ob->ctime here: for example when parent in invisible layer */
+ ctime= bsystem_time(ob, (float) G.scene->r.cfra, 0.0);
+
+ /* calculate values of */
+ calc_ipo(ob->ipo, ctime);
+
+ /* Patch: remember localview */
+ lay= ob->lay & 0xFF000000;
+
+ /* flush IPO values to this object only */
+ execute_ipo((ID *)ob, ob->ipo);
+
+ /* hack: for layer animation??? - is this what this is? (Aligorith, 28Sep2008) */
+ ob->lay |= lay;
+ if ((ob->id.name[2]=='S') && (ob->id.name[3]=='C') && (ob->id.name[4]=='E')) {
+ if (strcmp(G.scene->id.name+2, ob->id.name+6)==0) {
+ G.scene->lay= ob->lay;
+ copy_view3d_lock(0);
+ /* no redraw here! creates too many calls */
+ }
}
}
-float read_ipo_poin(void *poin, int type)
+/* Only execute those IPO-Curves with drivers, on the current frame, for the given Object
+ * - TODO: Drivers should really be made separate from standard anim channels
+ */
+void do_ob_ipodrivers (Object *ob, Ipo *ipo, float ctime)
{
- float val = 0.0;
+ IpoCurve *icu;
+ void *poin;
+ int type;
- switch(type) {
- case IPO_FLOAT:
- val= *( (float *)poin);
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ if (icu->driver) {
+ icu->curval= eval_icu(icu, ctime);
+
+ poin= get_ipo_poin((ID *)ob, icu, &type);
+ if (poin) write_ipo_poin(poin, type, icu->curval);
+ }
+ }
+}
+
+/* Special variation to calculate IPO values for Sequence + perform other stuff */
+void do_seq_ipo (Sequence *seq, int cfra)
+{
+ float ctime, div;
+
+ /* seq_ipo has an exception: calc both fields immediately */
+ if (seq->ipo) {
+ if ((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
+ ctime = frame_to_float(cfra);
+ div = 1.0;
+ }
+ else {
+ ctime= frame_to_float(cfra - seq->startdisp);
+ div= (seq->enddisp - seq->startdisp) / 100.0f;
+ if (div == 0.0) return;
+ }
+
+ /* 2nd field */
+ calc_ipo(seq->ipo, (ctime+0.5f)/div);
+ execute_ipo((ID *)seq, seq->ipo);
+ seq->facf1= seq->facf0;
+
+ /* 1st field */
+ calc_ipo(seq->ipo, ctime/div);
+ execute_ipo((ID *)seq, seq->ipo);
+ }
+ else
+ seq->facf1= seq->facf0= 1.0f;
+}
+
+/* --------- */
+
+
+/* exception: it does calc for objects...
+ * now find out why this routine was used anyway!
+ */
+void do_ipo_nocalc (Ipo *ipo)
+{
+ Object *ob;
+ Material *ma;
+ Tex *tex;
+ World *wo;
+ Lamp *la;
+ Camera *ca;
+ bSound *snd;
+
+ if (ipo == NULL)
+ return;
+
+ /* only flush IPO values (without calculating first/again) on
+ * to the datablocks that use the given IPO block
+ */
+ switch (ipo->blocktype) {
+ case ID_OB:
+ for (ob= G.main->object.first; ob; ob= ob->id.next) {
+ if (ob->ipo == ipo) do_ob_ipo(ob);
+ }
break;
- case IPO_FLOAT_DEGR:
- val= *( (float *)poin);
- val = (float)(val/(M_PI_2/9.0));
+ case ID_MA:
+ for (ma= G.main->mat.first; ma; ma= ma->id.next) {
+ if (ma->ipo == ipo) execute_ipo((ID *)ma, ipo);
+ }
break;
- case IPO_INT:
- case IPO_INT_BIT:
- case IPO_LONG:
- val= (float)(*( (int *)poin));
+ case ID_TE:
+ for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ if (tex->ipo == ipo) execute_ipo((ID *)tex, ipo);
+ }
break;
- case IPO_SHORT:
- case IPO_SHORT_BIT:
- val= *( (short *)poin);
+ case ID_WO:
+ for (wo= G.main->world.first; wo; wo= wo->id.next) {
+ if (wo->ipo == ipo) execute_ipo((ID *)wo, ipo);
+ }
break;
- case IPO_CHAR:
- case IPO_CHAR_BIT:
- val= *( (char *)poin);
+ case ID_LA:
+ for (la= G.main->lamp.first; la; la= la->id.next) {
+ if (la->ipo == ipo) execute_ipo((ID *)la, ipo);
+ }
+ break;
+ case ID_CA:
+ for (ca= G.main->camera.first; ca; ca= ca->id.next) {
+ if (ca->ipo == ipo) execute_ipo((ID *)ca, ipo);
+ }
+ break;
+ case ID_SO:
+ for (snd= G.main->sound.first; snd; snd= snd->id.next) {
+ if (snd->ipo == ipo) execute_ipo((ID *)snd, ipo);
+ }
break;
}
- return val;
}
-static void *give_tex_poin(Tex *tex, int adrcode, int *type )
+/* Executes IPO's for whole database on frame change, in a specified order,
+ * with datablocks being calculated in alphabetical order
+ * - called on scene_update_for_newframe() only
+ */
+void do_all_data_ipos ()
+{
+ Material *ma;
+ Tex *tex;
+ World *wo;
+ Ipo *ipo;
+ Lamp *la;
+ Key *key;
+ Camera *ca;
+ bSound *snd;
+ Sequence *seq;
+ Editing *ed;
+ Base *base;
+ float ctime;
+
+ ctime= frame_to_float(G.scene->r.cfra);
+
+ /* this exception cannot be depgraphed yet... what todo with objects in other layers?... */
+ for (base= G.scene->base.first; base; base= base->next) {
+ Object *ob= base->object;
+
+ /* only update layer when an ipo */
+ if (has_ipo_code(ob->ipo, OB_LAY)) {
+ do_ob_ipo(ob);
+ base->lay= ob->lay;
+ }
+ }
+
+ /* layers for the set...*/
+ if (G.scene->set) {
+ for (base= G.scene->set->base.first; base; base= base->next) {
+ Object *ob= base->object;
+
+ if (has_ipo_code(ob->ipo, OB_LAY)) {
+ do_ob_ipo(ob);
+ base->lay= ob->lay;
+ }
+ }
+ }
+
+ /* Calculate all IPO blocks in use, execept those for Objects */
+ for (ipo= G.main->ipo.first; ipo; ipo= ipo->id.next) {
+ if ((ipo->id.us) && (ipo->blocktype != ID_OB)) {
+ calc_ipo(ipo, ctime);
+ }
+ }
+
+ /* Texture Blocks */
+ for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ if (tex->ipo) execute_ipo((ID *)tex, tex->ipo);
+ }
+
+ /* Material Blocks */
+ for (ma= G.main->mat.first; ma; ma= ma->id.next) {
+ if (ma->ipo) execute_ipo((ID *)ma, ma->ipo);
+ }
+
+ /* World Blocks */
+ for (wo= G.main->world.first; wo; wo= wo->id.next) {
+ if (wo->ipo) execute_ipo((ID *)wo, wo->ipo);
+ }
+
+ /* ShapeKey Blocks */
+ for (key= G.main->key.first; key; key= key->id.next) {
+ if (key->ipo) execute_ipo((ID *)key, key->ipo);
+ }
+
+ /* Lamp Blocks */
+ for (la= G.main->lamp.first; la; la= la->id.next) {
+ if (la->ipo) execute_ipo((ID *)la, la->ipo);
+ }
+
+ /* Camera Blocks */
+ for (ca= G.main->camera.first; ca; ca= ca->id.next) {
+ if (ca->ipo) execute_ipo((ID *)ca, ca->ipo);
+ }
+
+ /* Sound Blocks (Old + Unused) */
+ for (snd= G.main->sound.first; snd; snd= snd->id.next) {
+ if (snd->ipo) execute_ipo((ID *)snd, snd->ipo);
+ }
+
+ /* Sequencer: process FAC Ipos used as volume envelopes */
+ ed= G.scene->ed;
+ if (ed) {
+ for (seq= ed->seqbasep->first; seq; seq= seq->next) {
+ if ( ((seq->type == SEQ_RAM_SOUND) || (seq->type == SEQ_HD_SOUND)) &&
+ (seq->startdisp <= G.scene->r.cfra+2) &&
+ (seq->enddisp>G.scene->r.cfra) &&
+ (seq->ipo) )
+ {
+ do_seq_ipo(seq, G.scene->r.cfra);
+ }
+ }
+ }
+}
+
+
+/* --------------------- Assorted ----------------------------- */
+
+/* clear delta-transforms on all Objects which use the given IPO block */
+void clear_delta_obipo(Ipo *ipo)
{
- void *poin=0;
+ Object *ob;
+
+ /* only search if there's an IPO */
+ if (ipo == NULL)
+ return;
+
+ /* search through all objects in database */
+ for (ob= G.main->object.first; ob; ob= ob->id.next) {
+ /* can only update if not a library */
+ if (ob->id.lib == NULL) {
+ if (ob->ipo == ipo) {
+ memset(&ob->dloc, 0, 12);
+ memset(&ob->drot, 0, 12);
+ memset(&ob->dsize, 0, 12);
+ }
+ }
+ }
+}
- switch(adrcode) {
+/* ***************************** IPO - DataAPI ********************************* */
+
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!! FIXME - BAD CRUFT WARNING !!!!!!!!!!!!!!!!!!!!!!!
+
+/* These functions here should be replaced eventually by the Data API, as this is
+ * inflexible duplication...
+ */
+
+/* --------------------- Get Pointer API ----------------------------- */
+
+/* get pointer to pose-channel's channel, but set appropriate flags first */
+void *get_pchan_ipo_poin (bPoseChannel *pchan, int adrcode)
+{
+ void *poin= NULL;
+
+ switch (adrcode) {
+ case AC_QUAT_W:
+ poin= &(pchan->quat[0]);
+ pchan->flag |= POSE_ROT;
+ break;
+ case AC_QUAT_X:
+ poin= &(pchan->quat[1]);
+ pchan->flag |= POSE_ROT;
+ break;
+ case AC_QUAT_Y:
+ poin= &(pchan->quat[2]);
+ pchan->flag |= POSE_ROT;
+ break;
+ case AC_QUAT_Z:
+ poin= &(pchan->quat[3]);
+ pchan->flag |= POSE_ROT;
+ break;
+
+ case AC_LOC_X:
+ poin= &(pchan->loc[0]);
+ pchan->flag |= POSE_LOC;
+ break;
+ case AC_LOC_Y:
+ poin= &(pchan->loc[1]);
+ pchan->flag |= POSE_LOC;
+ break;
+ case AC_LOC_Z:
+ poin= &(pchan->loc[2]);
+ pchan->flag |= POSE_LOC;
+ break;
+
+ case AC_SIZE_X:
+ poin= &(pchan->size[0]);
+ pchan->flag |= POSE_SIZE;
+ break;
+ case AC_SIZE_Y:
+ poin= &(pchan->size[1]);
+ pchan->flag |= POSE_SIZE;
+ break;
+ case AC_SIZE_Z:
+ poin= &(pchan->size[2]);
+ pchan->flag |= POSE_SIZE;
+ break;
+ }
+
+ /* return pointer */
+ return poin;
+}
+
+/* get texture channel */
+static void *give_tex_poin (Tex *tex, int adrcode, int *type )
+{
+ void *poin= NULL;
+
+ switch (adrcode) {
case TE_NSIZE:
poin= &(tex->noisesize); break;
case TE_TURB:
@@ -1205,17 +1903,18 @@ static void *give_tex_poin(Tex *tex, int adrcode, int *type )
poin= &(tex->bright); break;
case TE_CONTRA:
poin= &(tex->contrast); break;
-
}
+ /* return pointer */
return poin;
}
-void *give_mtex_poin(MTex *mtex, int adrcode )
+/* get texture-slot/mapping channel */
+void *give_mtex_poin (MTex *mtex, int adrcode)
{
- void *poin=0;
-
- switch(adrcode) {
+ void *poin= NULL;
+
+ switch (adrcode) {
case MAP_OFS_X:
poin= &(mtex->ofs[0]); break;
case MAP_OFS_Y:
@@ -1246,6 +1945,7 @@ void *give_mtex_poin(MTex *mtex, int adrcode )
poin= &(mtex->dispfac); break;
}
+ /* return pointer */
return poin;
}
@@ -1262,1321 +1962,923 @@ void *give_mtex_poin(MTex *mtex, int adrcode )
/* from misc_util: flip the bytes from x */
/* #define GS(x) (((unsigned char *)(x))[0] << 8 | ((unsigned char *)(x))[1]) */
-void *get_ipo_poin(ID *id, IpoCurve *icu, int *type)
+
+/* general function to get pointer to source/destination data */
+void *get_ipo_poin (ID *id, IpoCurve *icu, int *type)
{
void *poin= NULL;
- Object *ob;
- Material *ma;
- MTex *mtex;
- Tex *tex;
- Lamp *la;
- Sequence *seq;
- World *wo;
- ParticleSettings *part;
+ MTex *mtex= NULL;
+ /* most channels will have float data, but those with other types will override this */
*type= IPO_FLOAT;
- if( GS(id->name)==ID_OB) {
-
- ob= (Object *)id;
-
- switch(icu->adrcode) {
- case OB_LOC_X:
- poin= &(ob->loc[0]); break;
- case OB_LOC_Y:
- poin= &(ob->loc[1]); break;
- case OB_LOC_Z:
- poin= &(ob->loc[2]); break;
- case OB_DLOC_X:
- poin= &(ob->dloc[0]); break;
- case OB_DLOC_Y:
- poin= &(ob->dloc[1]); break;
- case OB_DLOC_Z:
- poin= &(ob->dloc[2]); break;
-
- case OB_ROT_X:
- poin= &(ob->rot[0]); *type= IPO_FLOAT_DEGR; break;
- case OB_ROT_Y:
- poin= &(ob->rot[1]); *type= IPO_FLOAT_DEGR; break;
- case OB_ROT_Z:
- poin= &(ob->rot[2]); *type= IPO_FLOAT_DEGR; break;
- case OB_DROT_X:
- poin= &(ob->drot[0]); *type= IPO_FLOAT_DEGR; break;
- case OB_DROT_Y:
- poin= &(ob->drot[1]); *type= IPO_FLOAT_DEGR; break;
- case OB_DROT_Z:
- poin= &(ob->drot[2]); *type= IPO_FLOAT_DEGR; break;
+ /* data is divided into 'blocktypes' based on ID-codes */
+ switch (GS(id->name)) {
+ case ID_OB: /* object channels ----------------------------- */
+ {
+ Object *ob= (Object *)id;
- case OB_SIZE_X:
- poin= &(ob->size[0]); break;
- case OB_SIZE_Y:
- poin= &(ob->size[1]); break;
- case OB_SIZE_Z:
- poin= &(ob->size[2]); break;
- case OB_DSIZE_X:
- poin= &(ob->dsize[0]); break;
- case OB_DSIZE_Y:
- poin= &(ob->dsize[1]); break;
- case OB_DSIZE_Z:
- poin= &(ob->dsize[2]); break;
-
- case OB_LAY:
- poin= &(ob->lay); *type= IPO_INT_BIT; break;
+ switch (icu->adrcode) {
+ case OB_LOC_X:
+ poin= &(ob->loc[0]); break;
+ case OB_LOC_Y:
+ poin= &(ob->loc[1]); break;
+ case OB_LOC_Z:
+ poin= &(ob->loc[2]); break;
+ case OB_DLOC_X:
+ poin= &(ob->dloc[0]); break;
+ case OB_DLOC_Y:
+ poin= &(ob->dloc[1]); break;
+ case OB_DLOC_Z:
+ poin= &(ob->dloc[2]); break;
- case OB_COL_R:
- poin= &(ob->col[0]);
- break;
- case OB_COL_G:
- poin= &(ob->col[1]);
- break;
- case OB_COL_B:
- poin= &(ob->col[2]);
- break;
- case OB_COL_A:
- poin= &(ob->col[3]);
- break;
- case OB_PD_FSTR:
- if(ob->pd) poin= &(ob->pd->f_strength);
- break;
- case OB_PD_FFALL:
- if(ob->pd) poin= &(ob->pd->f_power);
- break;
- case OB_PD_SDAMP:
- if(ob->pd) poin= &(ob->pd->pdef_damp);
- break;
- case OB_PD_RDAMP:
- if(ob->pd) poin= &(ob->pd->pdef_rdamp);
- break;
- case OB_PD_PERM:
- if(ob->pd) poin= &(ob->pd->pdef_perm);
- break;
- case OB_PD_FMAXD:
- if(ob->pd) poin= &(ob->pd->maxdist);
- break;
- }
- }
- else if( GS(id->name)==ID_MA) {
-
- ma= (Material *)id;
-
- switch(icu->adrcode) {
- case MA_COL_R:
- poin= &(ma->r); break;
- case MA_COL_G:
- poin= &(ma->g); break;
- case MA_COL_B:
- poin= &(ma->b); break;
- case MA_SPEC_R:
- poin= &(ma->specr); break;
- case MA_SPEC_G:
- poin= &(ma->specg); break;
- case MA_SPEC_B:
- poin= &(ma->specb); break;
- case MA_MIR_R:
- poin= &(ma->mirr); break;
- case MA_MIR_G:
- poin= &(ma->mirg); break;
- case MA_MIR_B:
- poin= &(ma->mirb); break;
- case MA_REF:
- poin= &(ma->ref); break;
- case MA_ALPHA:
- poin= &(ma->alpha); break;
- case MA_EMIT:
- poin= &(ma->emit); break;
- case MA_AMB:
- poin= &(ma->amb); break;
- case MA_SPEC:
- poin= &(ma->spec); break;
- case MA_HARD:
- poin= &(ma->har); *type= IPO_SHORT; break;
- case MA_SPTR:
- poin= &(ma->spectra); break;
- case MA_IOR:
- poin= &(ma->ang); break;
- case MA_MODE:
- poin= &(ma->mode); *type= IPO_INT_BIT; break;
- case MA_HASIZE:
- poin= &(ma->hasize); break;
- case MA_TRANSLU:
- poin= &(ma->translucency); break;
- case MA_RAYM:
- poin= &(ma->ray_mirror); break;
- case MA_FRESMIR:
- poin= &(ma->fresnel_mir); break;
- case MA_FRESMIRI:
- poin= &(ma->fresnel_mir_i); break;
- case MA_FRESTRA:
- poin= &(ma->fresnel_tra); break;
- case MA_FRESTRAI:
- poin= &(ma->fresnel_tra_i); break;
- case MA_ADD:
- poin= &(ma->add); break;
- }
-
- if(poin==NULL) {
- mtex= 0;
- if(icu->adrcode & MA_MAP1) mtex= ma->mtex[0];
- else if(icu->adrcode & MA_MAP2) mtex= ma->mtex[1];
- else if(icu->adrcode & MA_MAP3) mtex= ma->mtex[2];
- else if(icu->adrcode & MA_MAP4) mtex= ma->mtex[3];
- else if(icu->adrcode & MA_MAP5) mtex= ma->mtex[4];
- else if(icu->adrcode & MA_MAP6) mtex= ma->mtex[5];
- else if(icu->adrcode & MA_MAP7) mtex= ma->mtex[6];
- else if(icu->adrcode & MA_MAP8) mtex= ma->mtex[7];
- else if(icu->adrcode & MA_MAP9) mtex= ma->mtex[8];
- else if(icu->adrcode & MA_MAP10) mtex= ma->mtex[9];
- else if(icu->adrcode & MA_MAP12) mtex= ma->mtex[11];
- else if(icu->adrcode & MA_MAP11) mtex= ma->mtex[10];
- else if(icu->adrcode & MA_MAP13) mtex= ma->mtex[12];
- else if(icu->adrcode & MA_MAP14) mtex= ma->mtex[13];
- else if(icu->adrcode & MA_MAP15) mtex= ma->mtex[14];
- else if(icu->adrcode & MA_MAP16) mtex= ma->mtex[15];
- else if(icu->adrcode & MA_MAP17) mtex= ma->mtex[16];
- else if(icu->adrcode & MA_MAP18) mtex= ma->mtex[17];
+ case OB_ROT_X:
+ poin= &(ob->rot[0]); *type= IPO_FLOAT_DEGR; break;
+ case OB_ROT_Y:
+ poin= &(ob->rot[1]); *type= IPO_FLOAT_DEGR; break;
+ case OB_ROT_Z:
+ poin= &(ob->rot[2]); *type= IPO_FLOAT_DEGR; break;
+ case OB_DROT_X:
+ poin= &(ob->drot[0]); *type= IPO_FLOAT_DEGR; break;
+ case OB_DROT_Y:
+ poin= &(ob->drot[1]); *type= IPO_FLOAT_DEGR; break;
+ case OB_DROT_Z:
+ poin= &(ob->drot[2]); *type= IPO_FLOAT_DEGR; break;
+
+ case OB_SIZE_X:
+ poin= &(ob->size[0]); break;
+ case OB_SIZE_Y:
+ poin= &(ob->size[1]); break;
+ case OB_SIZE_Z:
+ poin= &(ob->size[2]); break;
+ case OB_DSIZE_X:
+ poin= &(ob->dsize[0]); break;
+ case OB_DSIZE_Y:
+ poin= &(ob->dsize[1]); break;
+ case OB_DSIZE_Z:
+ poin= &(ob->dsize[2]); break;
- if(mtex) {
- poin= give_mtex_poin(mtex, icu->adrcode & (MA_MAP1-1) );
- }
- }
- }
- else if( GS(id->name)==ID_TE) {
- tex= (Tex *)id;
-
- if(tex) poin= give_tex_poin(tex, icu->adrcode, type);
- }
- else if( GS(id->name)==ID_SEQ) {
- seq= (Sequence *)id;
-
- switch(icu->adrcode) {
- case SEQ_FAC1:
- poin= &(seq->facf0); break;
- }
- }
- else if( GS(id->name)==ID_CU) {
-
- poin= &(icu->curval);
-
- }
- else if( GS(id->name)==ID_KE) {
- KeyBlock *kb= ((Key *)id)->block.first;
-
- for(; kb; kb= kb->next)
- if(kb->adrcode==icu->adrcode)
+ case OB_LAY:
+ poin= &(ob->lay); *type= IPO_INT_BIT; break;
+
+ case OB_COL_R:
+ poin= &(ob->col[0]); break;
+ case OB_COL_G:
+ poin= &(ob->col[1]); break;
+ case OB_COL_B:
+ poin= &(ob->col[2]); break;
+ case OB_COL_A:
+ poin= &(ob->col[3]); break;
+
+ case OB_PD_FSTR:
+ if (ob->pd) poin= &(ob->pd->f_strength);
+ break;
+ case OB_PD_FFALL:
+ if (ob->pd) poin= &(ob->pd->f_power);
+ break;
+ case OB_PD_SDAMP:
+ if (ob->pd) poin= &(ob->pd->pdef_damp);
+ break;
+ case OB_PD_RDAMP:
+ if (ob->pd) poin= &(ob->pd->pdef_rdamp);
+ break;
+ case OB_PD_PERM:
+ if (ob->pd) poin= &(ob->pd->pdef_perm);
+ break;
+ case OB_PD_FMAXD:
+ if (ob->pd) poin= &(ob->pd->maxdist);
break;
- if(kb)
- poin= &(kb->curval);
-
- }
- else if(GS(id->name)==ID_WO) {
-
- wo= (World *)id;
-
- switch(icu->adrcode) {
- case WO_HOR_R:
- poin= &(wo->horr); break;
- case WO_HOR_G:
- poin= &(wo->horg); break;
- case WO_HOR_B:
- poin= &(wo->horb); break;
- case WO_ZEN_R:
- poin= &(wo->zenr); break;
- case WO_ZEN_G:
- poin= &(wo->zeng); break;
- case WO_ZEN_B:
- poin= &(wo->zenb); break;
-
- case WO_EXPOS:
- poin= &(wo->exposure); break;
-
- case WO_MISI:
- poin= &(wo->misi); break;
- case WO_MISTDI:
- poin= &(wo->mistdist); break;
- case WO_MISTSTA:
- poin= &(wo->miststa); break;
- case WO_MISTHI:
- poin= &(wo->misthi); break;
-
- case WO_STAR_R:
- poin= &(wo->starr); break;
- case WO_STAR_G:
- poin= &(wo->starg); break;
- case WO_STAR_B:
- poin= &(wo->starb); break;
-
- case WO_STARDIST:
- poin= &(wo->stardist); break;
- case WO_STARSIZE:
- poin= &(wo->starsize); break;
- }
-
- if(poin==NULL) {
- mtex= 0;
- if(icu->adrcode & MA_MAP1) mtex= wo->mtex[0];
- else if(icu->adrcode & MA_MAP2) mtex= wo->mtex[1];
- else if(icu->adrcode & MA_MAP3) mtex= wo->mtex[2];
- else if(icu->adrcode & MA_MAP4) mtex= wo->mtex[3];
- else if(icu->adrcode & MA_MAP5) mtex= wo->mtex[4];
- else if(icu->adrcode & MA_MAP6) mtex= wo->mtex[5];
- else if(icu->adrcode & MA_MAP7) mtex= wo->mtex[6];
- else if(icu->adrcode & MA_MAP8) mtex= wo->mtex[7];
- else if(icu->adrcode & MA_MAP9) mtex= wo->mtex[8];
- else if(icu->adrcode & MA_MAP10) mtex= wo->mtex[9];
- else if(icu->adrcode & MA_MAP11) mtex= wo->mtex[10];
- else if(icu->adrcode & MA_MAP12) mtex= wo->mtex[11];
- else if(icu->adrcode & MA_MAP13) mtex= wo->mtex[12];
- else if(icu->adrcode & MA_MAP14) mtex= wo->mtex[13];
- else if(icu->adrcode & MA_MAP15) mtex= wo->mtex[14];
- else if(icu->adrcode & MA_MAP16) mtex= wo->mtex[15];
- else if(icu->adrcode & MA_MAP17) mtex= wo->mtex[16];
- else if(icu->adrcode & MA_MAP18) mtex= wo->mtex[17];
- if(mtex) {
- poin= give_mtex_poin(mtex, icu->adrcode & (MA_MAP1-1) );
- }
- }
- }
- else if( GS(id->name)==ID_LA) {
-
- la= (Lamp *)id;
-
- switch(icu->adrcode) {
- case LA_ENERGY:
- poin= &(la->energy); break;
- case LA_COL_R:
- poin= &(la->r); break;
- case LA_COL_G:
- poin= &(la->g); break;
- case LA_COL_B:
- poin= &(la->b); break;
- case LA_DIST:
- poin= &(la->dist); break;
- case LA_SPOTSI:
- poin= &(la->spotsize); break;
- case LA_SPOTBL:
- poin= &(la->spotblend); break;
- case LA_QUAD1:
- poin= &(la->att1); break;
- case LA_QUAD2:
- poin= &(la->att2); break;
- case LA_HALOINT:
- poin= &(la->haint); break;
- }
-
- if(poin==NULL) {
- mtex= 0;
- if(icu->adrcode & MA_MAP1) mtex= la->mtex[0];
- else if(icu->adrcode & MA_MAP2) mtex= la->mtex[1];
- else if(icu->adrcode & MA_MAP3) mtex= la->mtex[2];
- else if(icu->adrcode & MA_MAP4) mtex= la->mtex[3];
- else if(icu->adrcode & MA_MAP5) mtex= la->mtex[4];
- else if(icu->adrcode & MA_MAP6) mtex= la->mtex[5];
- else if(icu->adrcode & MA_MAP7) mtex= la->mtex[6];
- else if(icu->adrcode & MA_MAP8) mtex= la->mtex[7];
- else if(icu->adrcode & MA_MAP9) mtex= la->mtex[8];
- else if(icu->adrcode & MA_MAP10) mtex= la->mtex[9];
- else if(icu->adrcode & MA_MAP11) mtex= la->mtex[10];
- else if(icu->adrcode & MA_MAP12) mtex= la->mtex[11];
- else if(icu->adrcode & MA_MAP13) mtex= la->mtex[12];
- else if(icu->adrcode & MA_MAP14) mtex= la->mtex[13];
- else if(icu->adrcode & MA_MAP15) mtex= la->mtex[14];
- else if(icu->adrcode & MA_MAP16) mtex= la->mtex[15];
- else if(icu->adrcode & MA_MAP17) mtex= la->mtex[16];
- else if(icu->adrcode & MA_MAP18) mtex= la->mtex[17];
-
- if(mtex) {
- poin= give_mtex_poin(mtex, icu->adrcode & (MA_MAP1-1) );
}
}
- }
- else if(GS(id->name)==ID_CA) {
- Camera *ca= (Camera *)id;
-
- /* yafray: aperture & focal distance params */
- switch(icu->adrcode) {
- case CAM_LENS:
- if(ca->type==CAM_ORTHO)
- poin= &(ca->ortho_scale);
- else
- poin= &(ca->lens);
break;
- case CAM_STA:
- poin= &(ca->clipsta); break;
- case CAM_END:
- poin= &(ca->clipend); break;
- case CAM_YF_APERT:
- poin= &(ca->YF_aperture); break;
- case CAM_YF_FDIST:
- poin= &(ca->YF_dofdist); break;
- case CAM_SHIFT_X:
- poin= &(ca->shiftx); break;
- case CAM_SHIFT_Y:
- poin= &(ca->shifty); break;
- }
- }
- else if(GS(id->name)==ID_SO) {
- bSound *snd= (bSound *)id;
-
- switch(icu->adrcode) {
- case SND_VOLUME:
- poin= &(snd->volume); break;
- case SND_PITCH:
- poin= &(snd->pitch); break;
- case SND_PANNING:
- poin= &(snd->panning); break;
- case SND_ATTEN:
- poin= &(snd->attenuation); break;
- }
- }
- else if( GS(id->name)==ID_PA) {
-
- part= (ParticleSettings *)id;
-
- switch(icu->adrcode) {
- case PART_EMIT_FREQ:
- case PART_EMIT_LIFE:
- case PART_EMIT_VEL:
- case PART_EMIT_AVE:
- case PART_EMIT_SIZE:
- poin= NULL; break;
- case PART_CLUMP:
- poin= &(part->clumpfac); break;
- case PART_AVE:
- poin= &(part->avefac); break;
- case PART_SIZE:
- poin= &(part->size); break;
- case PART_DRAG:
- poin= &(part->dragfac); break;
- case PART_BROWN:
- poin= &(part->brownfac); break;
- case PART_DAMP:
- poin= &(part->dampfac); break;
- case PART_LENGTH:
- poin= &(part->length); break;
- case PART_GRAV_X:
- poin= &(part->acc[0]); break;
- case PART_GRAV_Y:
- poin= &(part->acc[1]); break;
- case PART_GRAV_Z:
- poin= &(part->acc[2]); break;
- case PART_KINK_AMP:
- poin= &(part->kink_amp); break;
- case PART_KINK_FREQ:
- poin= &(part->kink_freq); break;
- case PART_KINK_SHAPE:
- poin= &(part->kink_shape); break;
- case PART_BB_TILT:
- poin= &(part->bb_tilt); break;
- case PART_PD_FSTR:
- poin= (part->pd?(&(part->pd->f_strength)):NULL); break;
- case PART_PD_FFALL:
- poin= (part->pd?(&(part->pd->f_power)):NULL); break;
- case PART_PD_FMAXD:
- poin= (part->pd?(&(part->pd->maxdist)):NULL); break;
- case PART_PD2_FSTR:
- poin= (part->pd2?(&(part->pd2->f_strength)):NULL); break;
- case PART_PD2_FFALL:
- poin= (part->pd2?(&(part->pd2->f_power)):NULL); break;
- case PART_PD2_FMAXD:
- poin= (part->pd2?(&(part->pd2->maxdist)):NULL); break;
- }
- }
-
- return poin;
-}
-
-void set_icu_vars(IpoCurve *icu)
-{
- /* defaults. 0.0 for y-extents makes these ignored */
- icu->ymin= icu->ymax= 0.0;
- icu->ipo= IPO_BEZ;
-
- if(icu->blocktype==ID_OB) {
-
- if(icu->adrcode==OB_LAY) {
- icu->ipo= IPO_CONST;
- icu->vartype= IPO_BITS;
- }
-
- }
- else if(icu->blocktype==ID_MA) {
-
- if(icu->adrcode < MA_MAP1) {
- switch(icu->adrcode) {
- case MA_HASIZE:
- icu->ymax= 10000.0; break;
- case MA_HARD:
- icu->ymax= 511.0; break;
+ case ID_MA: /* material channels ----------------------------- */
+ {
+ Material *ma= (Material *)id;
+
+ switch (icu->adrcode) {
+ case MA_COL_R:
+ poin= &(ma->r); break;
+ case MA_COL_G:
+ poin= &(ma->g); break;
+ case MA_COL_B:
+ poin= &(ma->b); break;
+ case MA_SPEC_R:
+ poin= &(ma->specr); break;
+ case MA_SPEC_G:
+ poin= &(ma->specg); break;
+ case MA_SPEC_B:
+ poin= &(ma->specb); break;
+ case MA_MIR_R:
+ poin= &(ma->mirr); break;
+ case MA_MIR_G:
+ poin= &(ma->mirg); break;
+ case MA_MIR_B:
+ poin= &(ma->mirb); break;
+ case MA_REF:
+ poin= &(ma->ref); break;
+ case MA_ALPHA:
+ poin= &(ma->alpha); break;
+ case MA_EMIT:
+ poin= &(ma->emit); break;
+ case MA_AMB:
+ poin= &(ma->amb); break;
case MA_SPEC:
- icu->ymax= 2.0; break;
+ poin= &(ma->spec); break;
+ case MA_HARD:
+ poin= &(ma->har); *type= IPO_SHORT; break;
+ case MA_SPTR:
+ poin= &(ma->spectra); break;
+ case MA_IOR:
+ poin= &(ma->ang); break;
case MA_MODE:
- icu->ipo= IPO_CONST;
- icu->vartype= IPO_BITS; break;
- case MA_RAYM:
- icu->ymax= 1.0; break;
+ poin= &(ma->mode); *type= IPO_INT_BIT; break; // evil... dumping bitflags directly to user!
+ case MA_HASIZE:
+ poin= &(ma->hasize); break;
case MA_TRANSLU:
- icu->ymax= 1.0; break;
- case MA_IOR:
- icu->ymin= 1.0;
- icu->ymax= 3.0; break;
+ poin= &(ma->translucency); break;
+ case MA_RAYM:
+ poin= &(ma->ray_mirror); break;
case MA_FRESMIR:
- icu->ymax= 5.0; break;
+ poin= &(ma->fresnel_mir); break;
case MA_FRESMIRI:
- icu->ymin= 1.0;
- icu->ymax= 5.0; break;
+ poin= &(ma->fresnel_mir_i); break;
case MA_FRESTRA:
- icu->ymax= 5.0; break;
+ poin= &(ma->fresnel_tra); break;
case MA_FRESTRAI:
- icu->ymin= 1.0;
- icu->ymax= 5.0; break;
+ poin= &(ma->fresnel_tra_i); break;
case MA_ADD:
- icu->ymax= 1.0; break;
- case MA_EMIT:
- icu->ymax= 2.0; break;
- default:
- icu->ymax= 1.0; break;
+ poin= &(ma->add); break;
+ }
+
+ if (poin == NULL) {
+ if (icu->adrcode & MA_MAP1) mtex= ma->mtex[0];
+ else if (icu->adrcode & MA_MAP2) mtex= ma->mtex[1];
+ else if (icu->adrcode & MA_MAP3) mtex= ma->mtex[2];
+ else if (icu->adrcode & MA_MAP4) mtex= ma->mtex[3];
+ else if (icu->adrcode & MA_MAP5) mtex= ma->mtex[4];
+ else if (icu->adrcode & MA_MAP6) mtex= ma->mtex[5];
+ else if (icu->adrcode & MA_MAP7) mtex= ma->mtex[6];
+ else if (icu->adrcode & MA_MAP8) mtex= ma->mtex[7];
+ else if (icu->adrcode & MA_MAP9) mtex= ma->mtex[8];
+ else if (icu->adrcode & MA_MAP10) mtex= ma->mtex[9];
+ else if (icu->adrcode & MA_MAP12) mtex= ma->mtex[11];
+ else if (icu->adrcode & MA_MAP11) mtex= ma->mtex[10];
+ else if (icu->adrcode & MA_MAP13) mtex= ma->mtex[12];
+ else if (icu->adrcode & MA_MAP14) mtex= ma->mtex[13];
+ else if (icu->adrcode & MA_MAP15) mtex= ma->mtex[14];
+ else if (icu->adrcode & MA_MAP16) mtex= ma->mtex[15];
+ else if (icu->adrcode & MA_MAP17) mtex= ma->mtex[16];
+ else if (icu->adrcode & MA_MAP18) mtex= ma->mtex[17];
+
+ if (mtex)
+ poin= give_mtex_poin(mtex, (icu->adrcode & (MA_MAP1-1)));
}
}
- else {
- switch(icu->adrcode & (MA_MAP1-1)) {
- case MAP_OFS_X:
- case MAP_OFS_Y:
- case MAP_OFS_Z:
- case MAP_SIZE_X:
- case MAP_SIZE_Y:
- case MAP_SIZE_Z:
- icu->ymax= 1000.0;
- icu->ymin= -1000.0;
+ break;
+ case ID_TE: /* texture channels ----------------------------- */
+ {
+ Tex *tex= (Tex *)id;
- break;
- case MAP_R:
- case MAP_G:
- case MAP_B:
- case MAP_DVAR:
- case MAP_COLF:
- case MAP_VARF:
- case MAP_DISP:
- icu->ymax= 1.0;
- break;
- case MAP_NORF:
- icu->ymax= 25.0;
- break;
+ if (tex)
+ poin= give_tex_poin(tex, icu->adrcode, type);
+ }
+ break;
+ case ID_SEQ: /* sequence channels ----------------------------- */
+ {
+ Sequence *seq= (Sequence *)id;
+
+ switch (icu->adrcode) {
+ case SEQ_FAC1:
+ poin= &(seq->facf0); break;
}
}
- }
- else if(icu->blocktype==ID_TE) {
- switch(icu->adrcode & (MA_MAP1-1)) {
- case TE_NSIZE:
- icu->ymin= 0.0001;
- icu->ymax= 2.0; break;
- case TE_NDEPTH:
- icu->vartype= IPO_SHORT;
- icu->ipo= IPO_CONST;
- icu->ymax= 6.0; break;
- case TE_NTYPE:
- icu->vartype= IPO_SHORT;
- icu->ipo= IPO_CONST;
- icu->ymax= 1.0; break;
- case TE_TURB:
- icu->ymax= 200.0; break;
- case TE_VNW1:
- case TE_VNW2:
- case TE_VNW3:
- case TE_VNW4:
- icu->ymax= 2.0;
- icu->ymin= -2.0; break;
- case TE_VNMEXP:
- icu->ymax= 10.0;
- icu->ymin= 0.01; break;
- case TE_VN_DISTM:
- icu->vartype= IPO_SHORT;
- icu->ipo= IPO_CONST;
- icu->ymax= 6.0; break;
- case TE_VN_COLT:
- icu->vartype= IPO_SHORT;
- icu->ipo= IPO_CONST;
- icu->ymax= 3.0; break;
- case TE_ISCA:
- icu->ymax= 10.0;
- icu->ymin= 0.01; break;
- case TE_DISTA:
- icu->ymax= 10.0; break;
- case TE_MG_TYP:
- icu->vartype= IPO_SHORT;
- icu->ipo= IPO_CONST;
- icu->ymax= 6.0; break;
- case TE_MGH:
- icu->ymin= 0.0001;
- icu->ymax= 2.0; break;
- case TE_MG_LAC:
- case TE_MG_OFF:
- case TE_MG_GAIN:
- icu->ymax= 6.0; break;
- case TE_MG_OCT:
- icu->ymax= 8.0; break;
- case TE_N_BAS1:
- case TE_N_BAS2:
- icu->vartype= IPO_SHORT;
- icu->ipo= IPO_CONST;
- icu->ymax= 8.0; break;
- case TE_COL_R:
- icu->ymax= 0.0; break;
- case TE_COL_G:
- icu->ymax= 2.0; break;
- case TE_COL_B:
- icu->ymax= 2.0; break;
- case TE_BRIGHT:
- icu->ymax= 2.0; break;
- case TE_CONTRA:
- icu->ymax= 5.0; break;
-
+ break;
+ case ID_CU: /* curve channels ----------------------------- */
+ {
+ poin= &(icu->curval);
}
- }
- else if(icu->blocktype==ID_SEQ) {
-
- icu->ymax= 1.0;
-
- }
- else if(icu->blocktype==ID_CU) {
-
- icu->ymax= 1.0;
-
- }
- else if(icu->blocktype==ID_WO) {
-
- if(icu->adrcode < MA_MAP1) {
- switch(icu->adrcode) {
+ break;
+ case ID_KE: /* shapekey channels ----------------------------- */
+ {
+ Key *key= (Key *)id;
+ KeyBlock *kb;
+
+ for(kb= key->block.first; kb; kb= kb->next) {
+ if (kb->adrcode == icu->adrcode)
+ break;
+ }
+
+ if (kb)
+ poin= &(kb->curval);
+ }
+ break;
+ case ID_WO: /* world channels ----------------------------- */
+ {
+ World *wo= (World *)id;
+
+ switch (icu->adrcode) {
+ case WO_HOR_R:
+ poin= &(wo->horr); break;
+ case WO_HOR_G:
+ poin= &(wo->horg); break;
+ case WO_HOR_B:
+ poin= &(wo->horb); break;
+ case WO_ZEN_R:
+ poin= &(wo->zenr); break;
+ case WO_ZEN_G:
+ poin= &(wo->zeng); break;
+ case WO_ZEN_B:
+ poin= &(wo->zenb); break;
+
case WO_EXPOS:
- icu->ymax= 5.0; break;
+ poin= &(wo->exposure); break;
+
+ case WO_MISI:
+ poin= &(wo->misi); break;
case WO_MISTDI:
+ poin= &(wo->mistdist); break;
case WO_MISTSTA:
+ poin= &(wo->miststa); break;
case WO_MISTHI:
+ poin= &(wo->misthi); break;
+
+ case WO_STAR_R:
+ poin= &(wo->starr); break;
+ case WO_STAR_G:
+ poin= &(wo->starg); break;
+ case WO_STAR_B:
+ poin= &(wo->starb); break;
+
case WO_STARDIST:
+ poin= &(wo->stardist); break;
case WO_STARSIZE:
- break;
-
- default:
- icu->ymax= 1.0;
- break;
+ poin= &(wo->starsize); break;
}
- }
- else {
- switch(icu->adrcode & (MA_MAP1-1)) {
- case MAP_OFS_X:
- case MAP_OFS_Y:
- case MAP_OFS_Z:
- case MAP_SIZE_X:
- case MAP_SIZE_Y:
- case MAP_SIZE_Z:
- icu->ymax= 100.0;
- icu->ymin= -100.0;
- break;
- case MAP_R:
- case MAP_G:
- case MAP_B:
- case MAP_DVAR:
- case MAP_COLF:
- case MAP_NORF:
- case MAP_VARF:
- case MAP_DISP:
- icu->ymax= 1.0;
+ if (poin == NULL) {
+ if (icu->adrcode & MA_MAP1) mtex= wo->mtex[0];
+ else if (icu->adrcode & MA_MAP2) mtex= wo->mtex[1];
+ else if (icu->adrcode & MA_MAP3) mtex= wo->mtex[2];
+ else if (icu->adrcode & MA_MAP4) mtex= wo->mtex[3];
+ else if (icu->adrcode & MA_MAP5) mtex= wo->mtex[4];
+ else if (icu->adrcode & MA_MAP6) mtex= wo->mtex[5];
+ else if (icu->adrcode & MA_MAP7) mtex= wo->mtex[6];
+ else if (icu->adrcode & MA_MAP8) mtex= wo->mtex[7];
+ else if (icu->adrcode & MA_MAP9) mtex= wo->mtex[8];
+ else if (icu->adrcode & MA_MAP10) mtex= wo->mtex[9];
+ else if (icu->adrcode & MA_MAP11) mtex= wo->mtex[10];
+ else if (icu->adrcode & MA_MAP12) mtex= wo->mtex[11];
+ else if (icu->adrcode & MA_MAP13) mtex= wo->mtex[12];
+ else if (icu->adrcode & MA_MAP14) mtex= wo->mtex[13];
+ else if (icu->adrcode & MA_MAP15) mtex= wo->mtex[14];
+ else if (icu->adrcode & MA_MAP16) mtex= wo->mtex[15];
+ else if (icu->adrcode & MA_MAP17) mtex= wo->mtex[16];
+ else if (icu->adrcode & MA_MAP18) mtex= wo->mtex[17];
+
+ if (mtex)
+ poin= give_mtex_poin(mtex, (icu->adrcode & (MA_MAP1-1)));
}
}
- }
- else if(icu->blocktype==ID_LA) {
- if(icu->adrcode < MA_MAP1) {
- switch(icu->adrcode) {
+ break;
+ case ID_LA: /* lamp channels ----------------------------- */
+ {
+ Lamp *la= (Lamp *)id;
+
+ switch (icu->adrcode) {
case LA_ENERGY:
- case LA_DIST:
- break;
-
+ poin= &(la->energy); break;
case LA_COL_R:
+ poin= &(la->r); break;
case LA_COL_G:
+ poin= &(la->g); break;
case LA_COL_B:
+ poin= &(la->b); break;
+ case LA_DIST:
+ poin= &(la->dist); break;
+ case LA_SPOTSI:
+ poin= &(la->spotsize); break;
case LA_SPOTBL:
+ poin= &(la->spotblend); break;
case LA_QUAD1:
+ poin= &(la->att1); break;
case LA_QUAD2:
- icu->ymax= 1.0; break;
- case LA_SPOTSI:
- icu->ymax= 180.0; break;
+ poin= &(la->att2); break;
case LA_HALOINT:
- icu->ymax= 5.0; break;
+ poin= &(la->haint); break;
+ }
+
+ if (poin == NULL) {
+ if (icu->adrcode & MA_MAP1) mtex= la->mtex[0];
+ else if (icu->adrcode & MA_MAP2) mtex= la->mtex[1];
+ else if (icu->adrcode & MA_MAP3) mtex= la->mtex[2];
+ else if (icu->adrcode & MA_MAP4) mtex= la->mtex[3];
+ else if (icu->adrcode & MA_MAP5) mtex= la->mtex[4];
+ else if (icu->adrcode & MA_MAP6) mtex= la->mtex[5];
+ else if (icu->adrcode & MA_MAP7) mtex= la->mtex[6];
+ else if (icu->adrcode & MA_MAP8) mtex= la->mtex[7];
+ else if (icu->adrcode & MA_MAP9) mtex= la->mtex[8];
+ else if (icu->adrcode & MA_MAP10) mtex= la->mtex[9];
+ else if (icu->adrcode & MA_MAP11) mtex= la->mtex[10];
+ else if (icu->adrcode & MA_MAP12) mtex= la->mtex[11];
+ else if (icu->adrcode & MA_MAP13) mtex= la->mtex[12];
+ else if (icu->adrcode & MA_MAP14) mtex= la->mtex[13];
+ else if (icu->adrcode & MA_MAP15) mtex= la->mtex[14];
+ else if (icu->adrcode & MA_MAP16) mtex= la->mtex[15];
+ else if (icu->adrcode & MA_MAP17) mtex= la->mtex[16];
+ else if (icu->adrcode & MA_MAP18) mtex= la->mtex[17];
+
+ if (mtex)
+ poin= give_mtex_poin(mtex, (icu->adrcode & (MA_MAP1-1)));
}
}
- else {
- switch(icu->adrcode & (MA_MAP1-1)) {
- case MAP_OFS_X:
- case MAP_OFS_Y:
- case MAP_OFS_Z:
- case MAP_SIZE_X:
- case MAP_SIZE_Y:
- case MAP_SIZE_Z:
- icu->ymax= 100.0;
- icu->ymin= -100.0;
+ break;
+ case ID_CA: /* camera channels ----------------------------- */
+ {
+ Camera *ca= (Camera *)id;
+
+ switch (icu->adrcode) {
+ case CAM_LENS:
+ if (ca->type == CAM_ORTHO)
+ poin= &(ca->ortho_scale);
+ else
+ poin= &(ca->lens);
break;
- case MAP_R:
- case MAP_G:
- case MAP_B:
- case MAP_DVAR:
- case MAP_COLF:
- case MAP_NORF:
- case MAP_VARF:
- case MAP_DISP:
- icu->ymax= 1.0;
+ case CAM_STA:
+ poin= &(ca->clipsta); break;
+ case CAM_END:
+ poin= &(ca->clipend); break;
+
+ case CAM_YF_APERT:
+ poin= &(ca->YF_aperture); break;
+ case CAM_YF_FDIST:
+ poin= &(ca->YF_dofdist); break;
+
+ case CAM_SHIFT_X:
+ poin= &(ca->shiftx); break;
+ case CAM_SHIFT_Y:
+ poin= &(ca->shifty); break;
}
}
- }
- else if(icu->blocktype==ID_CA) {
-
- /* yafray: aperture & focal distance params */
- switch(icu->adrcode) {
- case CAM_LENS:
- icu->ymin= 1.0;
- icu->ymax= 1000.0;
- break;
- case CAM_STA:
- icu->ymin= 0.001f;
- break;
- case CAM_END:
- icu->ymin= 0.1f;
- break;
- case CAM_YF_APERT:
- icu->ymin = 0.0;
- icu->ymax = 2.0;
- break;
- case CAM_YF_FDIST:
- icu->ymin = 0.0;
- icu->ymax = 5000.0;
break;
+ case ID_SO: /* sound channels ----------------------------- */
+ {
+ bSound *snd= (bSound *)id;
- case CAM_SHIFT_X:
- case CAM_SHIFT_Y:
- icu->ymin= -2.0f;
- icu->ymax= 2.0f;
- break;
+ switch (icu->adrcode) {
+ case SND_VOLUME:
+ poin= &(snd->volume); break;
+ case SND_PITCH:
+ poin= &(snd->pitch); break;
+ case SND_PANNING:
+ poin= &(snd->panning); break;
+ case SND_ATTEN:
+ poin= &(snd->attenuation); break;
+ }
}
- }
- else if(icu->blocktype==ID_SO) {
-
- switch(icu->adrcode) {
- case SND_VOLUME:
- icu->ymin= 0.0;
- icu->ymax= 1.0;
- break;
- case SND_PITCH:
- icu->ymin= -12.0;
- icu->ymin= 12.0;
- break;
- case SND_PANNING:
- icu->ymin= 0.0;
- icu->ymax= 1.0;
- break;
- case SND_ATTEN:
- icu->ymin= 0.0;
- icu->ymin= 1.0;
break;
+ case ID_PA: /* particle channels ----------------------------- */
+ {
+ ParticleSettings *part= (ParticleSettings *)id;
+
+ switch (icu->adrcode) {
+ case PART_EMIT_FREQ:
+ case PART_EMIT_LIFE:
+ case PART_EMIT_VEL:
+ case PART_EMIT_AVE:
+ case PART_EMIT_SIZE:
+ poin= NULL;
+ break;
+
+ case PART_CLUMP:
+ poin= &(part->clumpfac); break;
+ case PART_AVE:
+ poin= &(part->avefac); break;
+ case PART_SIZE:
+ poin= &(part->size); break;
+ case PART_DRAG:
+ poin= &(part->dragfac); break;
+ case PART_BROWN:
+ poin= &(part->brownfac); break;
+ case PART_DAMP:
+ poin= &(part->dampfac); break;
+ case PART_LENGTH:
+ poin= &(part->length); break;
+ case PART_GRAV_X:
+ poin= &(part->acc[0]); break;
+ case PART_GRAV_Y:
+ poin= &(part->acc[1]); break;
+ case PART_GRAV_Z:
+ poin= &(part->acc[2]); break;
+ case PART_KINK_AMP:
+ poin= &(part->kink_amp); break;
+ case PART_KINK_FREQ:
+ poin= &(part->kink_freq); break;
+ case PART_KINK_SHAPE:
+ poin= &(part->kink_shape); break;
+ case PART_BB_TILT:
+ poin= &(part->bb_tilt); break;
+
+ case PART_PD_FSTR:
+ if (part->pd) poin= &(part->pd->f_strength);
+ break;
+ case PART_PD_FFALL:
+ if (part->pd) poin= &(part->pd->f_power);
+ break;
+ case PART_PD_FMAXD:
+ if (part->pd) poin= &(part->pd->maxdist);
+ break;
+ case PART_PD2_FSTR:
+ if (part->pd2) poin= &(part->pd2->f_strength);
+ break;
+ case PART_PD2_FFALL:
+ if (part->pd2) poin= &(part->pd2->f_power);
+ break;
+ case PART_PD2_FMAXD:
+ if (part->pd2) poin= &(part->pd2->maxdist);
+ break;
+ }
}
- }
- else if(icu->blocktype==ID_PA){
-
- switch(icu->adrcode) {
- case PART_EMIT_LIFE:
- case PART_SIZE:
- case PART_KINK_FREQ:
- case PART_EMIT_VEL:
- case PART_EMIT_AVE:
- case PART_EMIT_SIZE:
- icu->ymin= 0.0;
break;
- case PART_CLUMP:
- icu->ymin= -1.0;
- icu->ymax= 1.0;
- break;
- case PART_DRAG:
- case PART_DAMP:
- case PART_LENGTH:
- icu->ymin= 0.0;
- icu->ymax= 1.0;
- break;
- case PART_KINK_SHAPE:
- icu->ymin= -0.999;
- icu->ymax= 0.999;
- break;
- }
}
- else if(icu->blocktype==ID_CO) {
- icu->ymin= 0.0;
- icu->ymax= 1.0f;
- }
-
- /* by default, slider limits will be icu->ymin and icu->ymax */
- icu->slide_min= icu->ymin;
- icu->slide_max= icu->ymax;
-}
-/* not for actions or constraints! */
-void execute_ipo(ID *id, Ipo *ipo)
-{
- IpoCurve *icu;
- void *poin;
- int type;
-
- if(ipo==NULL) return;
-
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- poin= get_ipo_poin(id, icu, &type);
- if(poin) write_ipo_poin(poin, type, icu->curval);
- }
+ /* return pointer */
+ return poin;
}
-void *get_pchan_ipo_poin(bPoseChannel *pchan, int adrcode)
+/* --------------------- IPO-Curve Limits ----------------------------- */
+
+/* set limits for IPO-curve
+ * Note: must be synced with UI and PyAPI
+ */
+void set_icu_vars (IpoCurve *icu)
{
- void *poin= NULL;
+ /* defaults. 0.0 for y-extents makes these ignored */
+ icu->ymin= icu->ymax= 0.0;
+ icu->ipo= IPO_BEZ;
- switch (adrcode) {
- case AC_QUAT_W:
- poin= &(pchan->quat[0]);
- pchan->flag |= POSE_ROT;
+ switch (icu->blocktype) {
+ case ID_OB: /* object channels ----------------------------- */
+ {
+ if (icu->adrcode == OB_LAY) {
+ icu->ipo= IPO_CONST;
+ icu->vartype= IPO_BITS;
+ }
+ }
break;
- case AC_QUAT_X:
- poin= &(pchan->quat[1]);
- pchan->flag |= POSE_ROT;
+ case ID_MA: /* material channels ----------------------------- */
+ {
+ if (icu->adrcode < MA_MAP1) {
+ switch (icu->adrcode) {
+ case MA_HASIZE:
+ icu->ymax= 10000.0; break;
+ case MA_HARD:
+ icu->ymax= 511.0; break;
+ case MA_SPEC:
+ icu->ymax= 2.0; break;
+ case MA_MODE:
+ icu->ipo= IPO_CONST;
+ icu->vartype= IPO_BITS; break;
+ case MA_RAYM:
+ icu->ymax= 1.0; break;
+ case MA_TRANSLU:
+ icu->ymax= 1.0; break;
+ case MA_IOR:
+ icu->ymin= 1.0;
+ icu->ymax= 3.0; break;
+ case MA_FRESMIR:
+ icu->ymax= 5.0; break;
+ case MA_FRESMIRI:
+ icu->ymin= 1.0;
+ icu->ymax= 5.0; break;
+ case MA_FRESTRA:
+ icu->ymax= 5.0; break;
+ case MA_FRESTRAI:
+ icu->ymin= 1.0;
+ icu->ymax= 5.0; break;
+ case MA_ADD:
+ icu->ymax= 1.0; break;
+ case MA_EMIT:
+ icu->ymax= 2.0; break;
+ default:
+ icu->ymax= 1.0; break;
+ }
+ }
+ else {
+ switch (icu->adrcode & (MA_MAP1-1)) {
+ case MAP_OFS_X:
+ case MAP_OFS_Y:
+ case MAP_OFS_Z:
+ case MAP_SIZE_X:
+ case MAP_SIZE_Y:
+ case MAP_SIZE_Z:
+ icu->ymax= 1000.0;
+ icu->ymin= -1000.0;
+ break;
+ case MAP_R:
+ case MAP_G:
+ case MAP_B:
+ case MAP_DVAR:
+ case MAP_COLF:
+ case MAP_VARF:
+ case MAP_DISP:
+ icu->ymax= 1.0;
+ break;
+ case MAP_NORF:
+ icu->ymax= 25.0;
+ break;
+ }
+ }
+ }
break;
- case AC_QUAT_Y:
- poin= &(pchan->quat[2]);
- pchan->flag |= POSE_ROT;
+ case ID_TE: /* texture channels ----------------------------- */
+ {
+ switch (icu->adrcode & (MA_MAP1-1)) {
+ case TE_NSIZE:
+ icu->ymin= 0.0001f;
+ icu->ymax= 2.0f;
+ break;
+ case TE_NDEPTH:
+ icu->vartype= IPO_SHORT;
+ icu->ipo= IPO_CONST;
+ icu->ymax= 6.0f;
+ break;
+ case TE_NTYPE:
+ icu->vartype= IPO_SHORT;
+ icu->ipo= IPO_CONST;
+ icu->ymax= 1.0f;
+ break;
+ case TE_TURB:
+ icu->ymax= 200.0f;
+ break;
+ case TE_VNW1:
+ case TE_VNW2:
+ case TE_VNW3:
+ case TE_VNW4:
+ icu->ymax= 2.0f;
+ icu->ymin= -2.0f;
+ break;
+ case TE_VNMEXP:
+ icu->ymax= 10.0f;
+ icu->ymin= 0.01f;
+ break;
+ case TE_VN_DISTM:
+ icu->vartype= IPO_SHORT;
+ icu->ipo= IPO_CONST;
+ icu->ymax= 6.0f;
+ break;
+ case TE_VN_COLT:
+ icu->vartype= IPO_SHORT;
+ icu->ipo= IPO_CONST;
+ icu->ymax= 3.0f;
+ break;
+ case TE_ISCA:
+ icu->ymax= 10.0f;
+ icu->ymin= 0.01f;
+ break;
+ case TE_DISTA:
+ icu->ymax= 10.0f;
+ break;
+ case TE_MG_TYP:
+ icu->vartype= IPO_SHORT;
+ icu->ipo= IPO_CONST;
+ icu->ymax= 6.0f;
+ break;
+ case TE_MGH:
+ icu->ymin= 0.0001f;
+ icu->ymax= 2.0f;
+ break;
+ case TE_MG_LAC:
+ case TE_MG_OFF:
+ case TE_MG_GAIN:
+ icu->ymax= 6.0f; break;
+ case TE_MG_OCT:
+ icu->ymax= 8.0f; break;
+ case TE_N_BAS1:
+ case TE_N_BAS2:
+ icu->vartype= IPO_SHORT;
+ icu->ipo= IPO_CONST;
+ icu->ymax= 8.0f;
+ break;
+ case TE_COL_R:
+ icu->ymax= 0.0f; break;
+ case TE_COL_G:
+ icu->ymax= 2.0f; break;
+ case TE_COL_B:
+ icu->ymax= 2.0f; break;
+ case TE_BRIGHT:
+ icu->ymax= 2.0f; break;
+ case TE_CONTRA:
+ icu->ymax= 5.0f; break;
+ }
+ }
break;
- case AC_QUAT_Z:
- poin= &(pchan->quat[3]);
- pchan->flag |= POSE_ROT;
+ case ID_SEQ: /* sequence channels ----------------------------- */
+ {
+ icu->ymax= 1.0f;
+ }
break;
- case AC_LOC_X:
- poin= &(pchan->loc[0]);
- pchan->flag |= POSE_LOC;
+ case ID_CU: /* curve channels ----------------------------- */
+ {
+ icu->ymax= 1.0f;
+ }
break;
- case AC_LOC_Y:
- poin= &(pchan->loc[1]);
- pchan->flag |= POSE_LOC;
+ case ID_WO: /* world channels ----------------------------- */
+ {
+ if (icu->adrcode < MA_MAP1) {
+ switch (icu->adrcode) {
+ case WO_EXPOS:
+ icu->ymax= 5.0f; break;
+
+ case WO_MISTDI:
+ case WO_MISTSTA:
+ case WO_MISTHI:
+ case WO_STARDIST:
+ case WO_STARSIZE:
+ break;
+
+ default:
+ icu->ymax= 1.0f;
+ break;
+ }
+ }
+ else {
+ switch (icu->adrcode & (MA_MAP1-1)) {
+ case MAP_OFS_X:
+ case MAP_OFS_Y:
+ case MAP_OFS_Z:
+ case MAP_SIZE_X:
+ case MAP_SIZE_Y:
+ case MAP_SIZE_Z:
+ icu->ymax= 100.0f;
+ icu->ymin= -100.0f;
+ break;
+ case MAP_R:
+ case MAP_G:
+ case MAP_B:
+ case MAP_DVAR:
+ case MAP_COLF:
+ case MAP_NORF:
+ case MAP_VARF:
+ case MAP_DISP:
+ icu->ymax= 1.0f;
+ }
+ }
+ }
break;
- case AC_LOC_Z:
- poin= &(pchan->loc[2]);
- pchan->flag |= POSE_LOC;
- break;
- case AC_SIZE_X:
- poin= &(pchan->size[0]);
- pchan->flag |= POSE_SIZE;
+ case ID_LA: /* lamp channels ----------------------------- */
+ {
+ if (icu->adrcode < MA_MAP1) {
+ switch (icu->adrcode) {
+ case LA_ENERGY:
+ case LA_DIST:
+ break;
+
+ case LA_COL_R:
+ case LA_COL_G:
+ case LA_COL_B:
+ case LA_SPOTBL:
+ case LA_QUAD1:
+ case LA_QUAD2:
+ icu->ymax= 1.0f; break;
+
+ case LA_SPOTSI:
+ icu->ymax= 180.0f; break;
+
+ case LA_HALOINT:
+ icu->ymax= 5.0f; break;
+ }
+ }
+ else {
+ switch (icu->adrcode & (MA_MAP1-1)) {
+ case MAP_OFS_X:
+ case MAP_OFS_Y:
+ case MAP_OFS_Z:
+ case MAP_SIZE_X:
+ case MAP_SIZE_Y:
+ case MAP_SIZE_Z:
+ icu->ymax= 100.0f;
+ icu->ymin= -100.0f;
+ break;
+ case MAP_R:
+ case MAP_G:
+ case MAP_B:
+ case MAP_DVAR:
+ case MAP_COLF:
+ case MAP_NORF:
+ case MAP_VARF:
+ case MAP_DISP:
+ icu->ymax= 1.0f;
+ }
+ }
+ }
break;
- case AC_SIZE_Y:
- poin= &(pchan->size[1]);
- pchan->flag |= POSE_SIZE;
+ case ID_CA: /* camera channels ----------------------------- */
+ {
+ switch (icu->adrcode) {
+ case CAM_LENS:
+ icu->ymin= 1.0f;
+ icu->ymax= 1000.0f;
+ break;
+ case CAM_STA:
+ icu->ymin= 0.001f;
+ break;
+ case CAM_END:
+ icu->ymin= 0.1f;
+ break;
+
+ case CAM_YF_APERT:
+ icu->ymin = 0.0f;
+ icu->ymax = 2.0f;
+ break;
+ case CAM_YF_FDIST:
+ icu->ymin = 0.0f;
+ icu->ymax = 5000.0f;
+ break;
+
+ case CAM_SHIFT_X:
+ case CAM_SHIFT_Y:
+ icu->ymin= -2.0f;
+ icu->ymax= 2.0f;
+ break;
+ }
+ }
break;
- case AC_SIZE_Z:
- poin= &(pchan->size[2]);
- pchan->flag |= POSE_SIZE;
+ case ID_SO: /* sound channels ----------------------------- */
+ {
+ switch (icu->adrcode) {
+ case SND_VOLUME:
+ icu->ymin= 0.0f;
+ icu->ymax= 1.0f;
+ break;
+ case SND_PITCH:
+ icu->ymin= -12.0f;
+ icu->ymin= 12.0f;
+ break;
+ case SND_PANNING:
+ icu->ymin= 0.0f;
+ icu->ymax= 1.0f;
+ break;
+ case SND_ATTEN:
+ icu->ymin= 0.0f;
+ icu->ymin= 1.0f;
+ break;
+ }
+ }
break;
- }
- return poin;
-}
-
-void execute_action_ipo(bActionChannel *achan, bPoseChannel *pchan)
-{
-
- if(achan && achan->ipo) {
- IpoCurve *icu;
- for(icu= achan->ipo->curve.first; icu; icu= icu->next) {
- void *poin= get_pchan_ipo_poin(pchan, icu->adrcode);
- if(poin) {
- write_ipo_poin(poin, IPO_FLOAT, icu->curval);
- //printf("execute_action_ipo wrote_ipo_poin: %f\n", icu->curval);
- //printf("%s has poin %p value %f\n", achan->name, poin, icu->curval);
+ case ID_PA: /* particle channels ----------------------------- */
+ {
+ switch (icu->adrcode) {
+ case PART_EMIT_LIFE:
+ case PART_SIZE:
+ case PART_KINK_FREQ:
+ case PART_EMIT_VEL:
+ case PART_EMIT_AVE:
+ case PART_EMIT_SIZE:
+ icu->ymin= 0.0f;
+ break;
+ case PART_CLUMP:
+ icu->ymin= -1.0f;
+ icu->ymax= 1.0f;
+ break;
+ case PART_DRAG:
+ case PART_DAMP:
+ case PART_LENGTH:
+ icu->ymin= 0.0f;
+ icu->ymax= 1.0f;
+ break;
+ case PART_KINK_SHAPE:
+ icu->ymin= -0.999f;
+ icu->ymax= 0.999f;
+ break;
}
}
+ break;
+ case ID_CO: /* constraint channels ----------------------------- */
+ {
+ icu->ymin= 0.0f;
+ icu->ymax= 1.0f;
+ }
+ break;
}
+
+ /* by default, slider limits will be icu->ymin and icu->ymax */
+ icu->slide_min= icu->ymin;
+ icu->slide_max= icu->ymax;
}
-/* exception: it does calc for objects...
- * now find out why this routine was used anyway!
- */
-void do_ipo_nocalc(Ipo *ipo)
+/* --------------------- Pointer I/O API ----------------------------- */
+
+/* write the given value directly into the given pointer */
+void write_ipo_poin (void *poin, int type, float val)
{
- Object *ob;
- Material *ma;
- Tex *tex;
- World *wo;
- Lamp *la;
- Camera *ca;
- bSound *snd;
-
- if(ipo==NULL) return;
-
- switch(ipo->blocktype) {
- case ID_OB:
- ob= G.main->object.first;
- while(ob) {
- if(ob->ipo==ipo) {
- do_ob_ipo(ob);
- /* execute_ipo((ID *)ob, ipo); */
- }
- ob= ob->id.next;
- }
- break;
- case ID_MA:
- ma= G.main->mat.first;
- while(ma) {
- if(ma->ipo==ipo) execute_ipo((ID *)ma, ipo);
- ma= ma->id.next;
- }
- break;
- case ID_TE:
- tex= G.main->tex.first;
- while(tex) {
- if(tex->ipo==ipo) execute_ipo((ID *)tex, ipo);
- tex=tex->id.next;
- }
+ /* Note: we only support a limited number of types, with the value
+ * to set needing to be cast to the appropriate type first
+ * -> (float to integer conversions could be slow)
+ */
+ switch(type) {
+ case IPO_FLOAT:
+ *((float *)poin)= val;
break;
- case ID_WO:
- wo= G.main->world.first;
- while(wo) {
- if(wo->ipo==ipo) execute_ipo((ID *)wo, ipo);
- wo= wo->id.next;
- }
+
+ case IPO_FLOAT_DEGR: /* special hack for rotation so that it fits on same axis as other transforms */
+ *((float *)poin)= (float)(val * M_PI_2 / 9.0);
break;
- case ID_LA:
- la= G.main->lamp.first;
- while(la) {
- if(la->ipo==ipo) execute_ipo((ID *)la, ipo);
- la= la->id.next;
- }
+
+ case IPO_INT:
+ case IPO_INT_BIT: // fixme... directly revealing bitflag combinations is evil!
+ case IPO_LONG:
+ *((int *)poin)= (int)val;
break;
- case ID_CA:
- ca= G.main->camera.first;
- while(ca) {
- if(ca->ipo==ipo) execute_ipo((ID *)ca, ipo);
- ca= ca->id.next;
- }
+
+ case IPO_SHORT:
+ case IPO_SHORT_BIT: // fixme... directly revealing bitflag combinations is evil!
+ *((short *)poin)= (short)val;
break;
- case ID_SO:
- snd= G.main->sound.first;
- while(snd) {
- if(snd->ipo==ipo) execute_ipo((ID *)snd, ipo);
- snd= snd->id.next;
- }
+
+ case IPO_CHAR:
+ case IPO_CHAR_BIT: // fixme... directly revealing bitflag combinations is evil!
+ *((char *)poin)= (char)val;
break;
}
}
-void do_ipo(Ipo *ipo)
+/* read the value from the pointer that was obtained */
+float read_ipo_poin (void *poin, int type)
{
- if(ipo) {
- float ctime= frame_to_float(G.scene->r.cfra);
- calc_ipo(ipo, ctime);
-
- do_ipo_nocalc(ipo);
- }
-}
-
-
-
-void do_mat_ipo(Material *ma)
-{
- float ctime;
-
- if(ma==NULL || ma->ipo==NULL) return;
-
- ctime= frame_to_float(G.scene->r.cfra);
- /* if(ob->ipoflag & OB_OFFS_OB) ctime-= ob->sf; */
-
- calc_ipo(ma->ipo, ctime);
-
- execute_ipo((ID *)ma, ma->ipo);
-}
-
-void do_ob_ipo(Object *ob)
-{
- float ctime;
- unsigned int lay;
-
- if(ob->ipo==NULL) return;
-
- /* do not set ob->ctime here: for example when parent in invisible layer */
-
- ctime= bsystem_time(ob, (float) G.scene->r.cfra, 0.0);
-
- calc_ipo(ob->ipo, ctime);
-
- /* Patch: remember localview */
- lay= ob->lay & 0xFF000000;
-
- execute_ipo((ID *)ob, ob->ipo);
-
- ob->lay |= lay;
- if(ob->id.name[2]=='S' && ob->id.name[3]=='C' && ob->id.name[4]=='E') {
- if(strcmp(G.scene->id.name+2, ob->id.name+6)==0) {
- G.scene->lay= ob->lay;
- copy_view3d_lock(0);
- /* no redraw here! creates too many calls */
- }
- }
-}
-
-void do_ob_ipodrivers(Object *ob, Ipo *ipo, float ctime)
-{
- IpoCurve *icu;
- void *poin;
- int type;
-
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->driver) {
- icu->curval= eval_icu(icu, ctime);
- poin= get_ipo_poin((ID *)ob, icu, &type);
- if(poin) write_ipo_poin(poin, type, icu->curval);
- }
- }
-}
-
-void do_seq_ipo(Sequence *seq, int cfra)
-{
- float ctime, div;
-
- /* seq_ipo has an exception: calc both fields immediately */
+ float val = 0.0;
- if(seq->ipo) {
- if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
- ctime = frame_to_float(cfra);
- div = 1.0;
- } else {
- ctime= frame_to_float(cfra - seq->startdisp);
- div= (seq->enddisp - seq->startdisp)/100.0f;
- if(div==0.0) return;
- }
+ /* Note: we only support a limited number of types, with the value
+ * to set needing to be cast to the appropriate type first
+ * -> (int to float conversions may loose accuracy in rare cases)
+ */
+ switch (type) {
+ case IPO_FLOAT:
+ val= *((float *)poin);
+ break;
- /* 2nd field */
- calc_ipo(seq->ipo, (ctime+0.5f)/div);
- execute_ipo((ID *)seq, seq->ipo);
- seq->facf1= seq->facf0;
-
- /* 1st field */
- calc_ipo(seq->ipo, ctime/div);
- execute_ipo((ID *)seq, seq->ipo);
-
- }
- else seq->facf1= seq->facf0= 1.0f;
-}
-
-int has_ipo_code(Ipo *ipo, int code)
-{
- IpoCurve *icu;
-
- if(ipo==NULL) return 0;
-
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->adrcode==code) return 1;
- }
- return 0;
-}
-
-void do_all_data_ipos()
-{
- Material *ma;
- Tex *tex;
- World *wo;
- Ipo *ipo;
- Lamp *la;
- Key *key;
- Camera *ca;
- bSound *snd;
- Sequence *seq;
- Editing *ed;
- Base *base;
- float ctime;
-
- ctime= frame_to_float(G.scene->r.cfra);
-
- /* this exception cannot be depgraphed yet... what todo with objects in other layers?... */
- for(base= G.scene->base.first; base; base= base->next) {
- /* only update layer when an ipo */
- if( has_ipo_code(base->object->ipo, OB_LAY) ) {
- do_ob_ipo(base->object);
- base->lay= base->object->lay;
- }
- }
-
- /* layers for the set...*/
- if(G.scene->set) {
- for(base= G.scene->set->base.first; base; base= base->next) {
- if( has_ipo_code(base->object->ipo, OB_LAY) ) {
- do_ob_ipo(base->object);
- base->lay= base->object->lay;
- }
- }
- }
-
-
- ipo= G.main->ipo.first;
- while(ipo) {
- if(ipo->id.us && ipo->blocktype!=ID_OB) {
- calc_ipo(ipo, ctime);
- }
- ipo= ipo->id.next;
- }
-
- for(tex= G.main->tex.first; tex; tex= tex->id.next) {
- if(tex->ipo) execute_ipo((ID *)tex, tex->ipo);
- }
-
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->ipo) execute_ipo((ID *)ma, ma->ipo);
- }
-
- for(wo= G.main->world.first; wo; wo= wo->id.next) {
- if(wo->ipo) execute_ipo((ID *)wo, wo->ipo);
- }
-
- for(key= G.main->key.first; key; key= key->id.next) {
- if(key->ipo) execute_ipo((ID *)key, key->ipo);
- }
-
- la= G.main->lamp.first;
- while(la) {
- if(la->ipo) execute_ipo((ID *)la, la->ipo);
- la= la->id.next;
- }
-
- ca= G.main->camera.first;
- while(ca) {
- if(ca->ipo) execute_ipo((ID *)ca, ca->ipo);
- ca= ca->id.next;
- }
-
- snd= G.main->sound.first;
- while(snd) {
- if(snd->ipo) execute_ipo((ID *)snd, snd->ipo);
- snd= snd->id.next;
- }
-
- /* process FAC Ipos used as volume envelopes */
- ed= G.scene->ed;
- if (ed) {
- seq= ed->seqbasep->first;
- while(seq) {
- if ((seq->type == SEQ_RAM_SOUND
- || seq->type == SEQ_HD_SOUND) && (seq->ipo) &&
- (seq->startdisp<=G.scene->r.cfra+2) &&
- (seq->enddisp>G.scene->r.cfra))
- do_seq_ipo(seq, G.scene->r.cfra);
- seq= seq->next;
- }
- }
-
-}
-
-
-int calc_ipo_spec(Ipo *ipo, int adrcode, float *ctime)
-{
- IpoCurve *icu;
-
- if(ipo==NULL) return 0;
-
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->adrcode == adrcode) {
- if(icu->flag & IPO_LOCK);
- else calc_icu(icu, *ctime);
-
- *ctime= icu->curval;
- return 1;
- }
- }
-
- return 0;
-}
-
-
-/* ************************** */
-
-void clear_delta_obipo(Ipo *ipo)
-{
- Object *ob;
+ case IPO_FLOAT_DEGR: /* special hack for rotation so that it fits on same axis as other transforms */
+ val= *( (float *)poin);
+ val = (float)(val / (M_PI_2/9.0));
+ break;
- if(ipo==NULL) return;
+ case IPO_INT:
+ case IPO_INT_BIT: // fixme... directly revealing bitflag combinations is evil!
+ case IPO_LONG:
+ val= (float)( *((int *)poin) );
+ break;
+
+ case IPO_SHORT:
+ case IPO_SHORT_BIT: // fixme... directly revealing bitflag combinations is evil!
+ val= *((short *)poin);
+ break;
- ob= G.main->object.first;
- while(ob) {
- if(ob->id.lib==NULL) {
- if(ob->ipo==ipo) {
- memset(&ob->dloc, 0, 12);
- memset(&ob->drot, 0, 12);
- memset(&ob->dsize, 0, 12);
- }
- }
- ob= ob->id.next;
+ case IPO_CHAR:
+ case IPO_CHAR_BIT: // fixme... directly revealing bitflag combinations is evil
+ val= *((char *)poin);
+ break;
}
-}
-
-void add_to_cfra_elem(ListBase *lb, BezTriple *bezt)
-{
- CfraElem *ce, *cen;
-
- ce= lb->first;
- while(ce) {
-
- if( ce->cfra==bezt->vec[1][0] ) {
- /* do because of double keys */
- if(bezt->f2 & SELECT) ce->sel= bezt->f2;
- return;
- }
- else if(ce->cfra > bezt->vec[1][0]) break;
-
- ce= ce->next;
- }
- cen= MEM_callocN(sizeof(CfraElem), "add_to_cfra_elem");
- if(ce) BLI_insertlinkbefore(lb, ce, cen);
- else BLI_addtail(lb, cen);
-
- cen->cfra= bezt->vec[1][0];
- cen->sel= bezt->f2;
+ /* return value */
+ return val;
}
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!! FIXME - BAD CRUFT WARNING !!!!!!!!!!!!!!!!!!!!!!!
-void make_cfra_list(Ipo *ipo, ListBase *elems)
-{
- IpoCurve *icu;
- BezTriple *bezt;
- int a;
-
- if(ipo->blocktype==ID_OB) {
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->flag & IPO_VISIBLE) {
- switch(icu->adrcode) {
- case OB_DLOC_X:
- case OB_DLOC_Y:
- case OB_DLOC_Z:
- case OB_DROT_X:
- case OB_DROT_Y:
- case OB_DROT_Z:
- case OB_DSIZE_X:
- case OB_DSIZE_Y:
- case OB_DSIZE_Z:
-
- case OB_LOC_X:
- case OB_LOC_Y:
- case OB_LOC_Z:
- case OB_ROT_X:
- case OB_ROT_Y:
- case OB_ROT_Z:
- case OB_SIZE_X:
- case OB_SIZE_Y:
- case OB_SIZE_Z:
- case OB_PD_FSTR:
- case OB_PD_FFALL:
- case OB_PD_SDAMP:
- case OB_PD_RDAMP:
- case OB_PD_PERM:
- case OB_PD_FMAXD:
- bezt= icu->bezt;
- if(bezt) {
- a= icu->totvert;
- while(a--) {
- add_to_cfra_elem(elems, bezt);
- bezt++;
- }
- }
- break;
- }
- }
- }
- }
- else if(ipo->blocktype==ID_AC) {
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->flag & IPO_VISIBLE) {
- switch(icu->adrcode) {
- case AC_LOC_X:
- case AC_LOC_Y:
- case AC_LOC_Z:
- case AC_SIZE_X:
- case AC_SIZE_Y:
- case AC_SIZE_Z:
- case AC_QUAT_W:
- case AC_QUAT_X:
- case AC_QUAT_Y:
- case AC_QUAT_Z:
- bezt= icu->bezt;
- if(bezt) {
- a= icu->totvert;
- while(a--) {
- add_to_cfra_elem(elems, bezt);
- bezt++;
- }
- }
- break;
- }
- }
- }
- }
- else {
- for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->flag & IPO_VISIBLE) {
- bezt= icu->bezt;
- if(bezt) {
- a= icu->totvert;
- while(a--) {
- add_to_cfra_elem(elems, bezt);
- bezt++;
- }
- }
- }
- }
- }
-
- /* what's the point of this little block of code? */
-#if 0
- if(ipo->showkey==0) {
- /* deselect all keys */
- ce= elems->first;
- while(ce) {
- ce->sel= 0;
- ce= ce->next;
- }
- }
-#endif
-}
-
-/* *********************** INTERFACE FOR KETSJI ********** */
-
+/* ***************************** IPO <--> GameEngine Interface ********************************* */
-int IPO_GetChannels(Ipo *ipo, IPO_Channel *channels)
+/* channels is max 32 items, allocated by calling function */
+short IPO_GetChannels (Ipo *ipo, IPO_Channel *channels)
{
- /* channels is max 32 items, allocated by calling function */
-
IpoCurve *icu;
- int total=0;
+ int total = 0;
- if(ipo==NULL) return 0;
+ /* don't do anything with no IPO-block */
+ if (ipo == NULL)
+ return 0;
- for(icu= ipo->curve.first; icu; icu= icu->next) {
+ /* store the IPO-curve's adrcode in the relevant channel slot */
+ for (icu=ipo->curve.first; (icu) && (total < 31); icu=icu->next, total++)
channels[total]= icu->adrcode;
- total++;
- if(total>31) break;
- }
+ /* return the number of channels stored */
return total;
}
-
-
/* Get the float value for channel 'channel' at time 'ctime' */
-
-float IPO_GetFloatValue(Ipo *ipo, IPO_Channel channel, float ctime)
+float IPO_GetFloatValue (Ipo *ipo, IPO_Channel channel, float ctime)
{
- if(ipo==NULL) return 0;
+ /* don't evaluate if no IPO to use */
+ if (ipo == NULL)
+ return 0;
+ /* only calculate the specified channel */
calc_ipo_spec(ipo, channel, &ctime);
- if (OB_ROT_X <= channel && channel <= OB_DROT_Z) {
+ /* unapply rotation hack, as gameengine doesn't use it */
+ if ((OB_ROT_X <= channel) && (channel <= OB_DROT_Z))
ctime *= (float)(M_PI_2/9.0);
- }
+ /* return the value of this channel */
return ctime;
}
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index dd6c7ddacd2..755a41ec4b2 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -284,10 +284,10 @@ void set_four_ipo(float d, float *data, int type)
}
else if(type==KEY_BSPLINE) {
- data[0]= -0.1666f*d3 +0.5f*d2 -0.5f*d +0.16666f;
- data[1]= 0.5f*d3 -d2 +0.6666f;
- data[2]= -0.5f*d3 +0.5f*d2 +0.5f*d +0.1666f;
- data[3]= 0.1666f*d3 ;
+ data[0]= -0.16666666f*d3 +0.5f*d2 -0.5f*d +0.16666666f;
+ data[1]= 0.5f*d3 -d2 +0.6666666f;
+ data[2]= -0.5f*d3 +0.5f*d2 +0.5f*d +0.16666666f;
+ data[3]= 0.16666666f*d3 ;
}
}
}
@@ -313,10 +313,10 @@ void set_afgeleide_four_ipo(float d, float *data, int type)
}
else if(type==KEY_BSPLINE) {
- data[0]= -0.1666f*3.0f*d2 +d -0.5f;
+ data[0]= -0.16666666f*3.0f*d2 +d -0.5f;
data[1]= 1.5f*d2 -2.0f*d;
data[2]= -1.5f*d2 +d +0.5f;
- data[3]= 0.1666f*3.0f*d2 ;
+ data[3]= 0.16666666f*3.0f*d2 ;
}
}
}
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index c3dddf06e7c..3d1b342bf73 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -407,6 +407,10 @@ void *copy_libblock(void *rt)
lb= wich_libbase(G.main, GS(id->name));
idn= alloc_libblock(lb, GS(id->name), id->name+2);
+ if(idn==NULL) {
+ printf("ERROR: Illegal ID name for %s (Crashing now)\n", id->name);
+ }
+
idn_len= MEM_allocN_len(idn);
if(idn_len - sizeof(ID) > 0) {
cp= (char *)id;
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index f05b84f6e90..27f4fd3bc05 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -59,7 +59,9 @@
#include "BKE_node.h"
#include "BKE_utildefines.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "GPU_material.h"
@@ -78,7 +80,9 @@ void free_material(Material *ma)
MTex *mtex;
int a;
+#ifndef DISABLE_PYTHON
BPY_free_scriptlink(&ma->scriptlink);
+#endif
for(a=0; a<MAX_MTEX; a++) {
mtex= ma->mtex[a];
@@ -201,8 +205,10 @@ Material *copy_material(Material *ma)
id_us_plus((ID *)man->mtex[a]->tex);
}
}
-
+
+#ifndef DISABLE_PYTHON
BPY_copy_scriptlink(&ma->scriptlink);
+#endif
if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 5ef7f985435..13dc2e834f2 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -2139,6 +2139,8 @@ typedef struct SmoothMesh {
DerivedMesh *dm;
float threshold; /* the cosine of the smoothing angle */
int flags;
+ MemArena *arena;
+ ListBase propagatestack, reusestack;
} SmoothMesh;
static SmoothVert *smoothvert_copy(SmoothVert *vert, SmoothMesh *mesh)
@@ -2221,6 +2223,9 @@ static void smoothmesh_free(SmoothMesh *mesh)
for(i = 0; i < mesh->num_edges; ++i)
BLI_linklist_free(mesh->edges[i].faces, NULL);
+
+ if(mesh->arena)
+ BLI_memarena_free(mesh->arena);
MEM_freeN(mesh->verts);
MEM_freeN(mesh->edges);
@@ -2872,6 +2877,49 @@ static void split_single_vert(SmoothVert *vert, SmoothFace *face,
face_replace_vert(face, &repdata);
}
+typedef struct PropagateEdge {
+ struct PropagateEdge *next, *prev;
+ SmoothEdge *edge;
+ SmoothVert *vert;
+} PropagateEdge;
+
+static void push_propagate_stack(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
+{
+ PropagateEdge *pedge = mesh->reusestack.first;
+
+ if(pedge) {
+ BLI_remlink(&mesh->reusestack, pedge);
+ }
+ else {
+ if(!mesh->arena) {
+ mesh->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+ BLI_memarena_use_calloc(mesh->arena);
+ }
+
+ pedge = BLI_memarena_alloc(mesh->arena, sizeof(PropagateEdge));
+ }
+
+ pedge->edge = edge;
+ pedge->vert = vert;
+ BLI_addhead(&mesh->propagatestack, pedge);
+}
+
+static void pop_propagate_stack(SmoothEdge **edge, SmoothVert **vert, SmoothMesh *mesh)
+{
+ PropagateEdge *pedge = mesh->propagatestack.first;
+
+ if(pedge) {
+ *edge = pedge->edge;
+ *vert = pedge->vert;
+ BLI_remlink(&mesh->propagatestack, pedge);
+ BLI_addhead(&mesh->reusestack, pedge);
+ }
+ else {
+ *edge = NULL;
+ *vert = NULL;
+ }
+}
+
static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh);
static void propagate_split(SmoothEdge *edge, SmoothVert *vert,
@@ -2949,7 +2997,7 @@ static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
if(!edge2) {
/* didn't find a sharp or loose edge, so try the other vert */
vert2 = other_vert(edge, vert);
- propagate_split(edge, vert2, mesh);
+ push_propagate_stack(edge, vert2, mesh);
} else if(!edge_is_loose(edge2)) {
/* edge2 is not loose, so it must be sharp */
SmoothEdge *copy_edge = smoothedge_copy(edge, mesh);
@@ -2978,11 +3026,11 @@ static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
/* all copying and replacing is done; the mesh should be consistent.
* now propagate the split to the vertices at either end
*/
- propagate_split(copy_edge, other_vert(copy_edge, vert2), mesh);
- propagate_split(copy_edge2, other_vert(copy_edge2, vert2), mesh);
+ push_propagate_stack(copy_edge, other_vert(copy_edge, vert2), mesh);
+ push_propagate_stack(copy_edge2, other_vert(copy_edge2, vert2), mesh);
if(smoothedge_has_vert(edge, vert))
- propagate_split(edge, vert, mesh);
+ push_propagate_stack(edge, vert, mesh);
} else {
/* edge2 is loose */
SmoothEdge *copy_edge = smoothedge_copy(edge, mesh);
@@ -3005,10 +3053,10 @@ static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
/* copying and replacing is done; the mesh should be consistent.
* now propagate the split to the vertex at the other end
*/
- propagate_split(copy_edge, other_vert(copy_edge, vert2), mesh);
+ push_propagate_stack(copy_edge, other_vert(copy_edge, vert2), mesh);
if(smoothedge_has_vert(edge, vert))
- propagate_split(edge, vert, mesh);
+ push_propagate_stack(edge, vert, mesh);
}
BLI_linklist_free(visited_faces, NULL);
@@ -3080,6 +3128,7 @@ static void tag_and_count_extra_edges(SmoothMesh *mesh, float split_angle,
static void split_sharp_edges(SmoothMesh *mesh, float split_angle, int flags)
{
+ SmoothVert *vert;
int i;
/* if normal1 dot normal2 < threshold, angle is greater, so split */
/* FIXME not sure if this always works */
@@ -3092,10 +3141,16 @@ static void split_sharp_edges(SmoothMesh *mesh, float split_angle, int flags)
for(i = 0; i < mesh->num_edges; i++) {
SmoothEdge *edge = &mesh->edges[i];
- if(edge_is_sharp(edge, flags, mesh->threshold))
+ if(edge_is_sharp(edge, flags, mesh->threshold)) {
split_edge(edge, edge->verts[0], mesh);
- }
+ do {
+ pop_propagate_stack(&edge, &vert, mesh);
+ if(edge && smoothedge_has_vert(edge, vert))
+ propagate_split(edge, vert, mesh);
+ } while(edge);
+ }
+ }
}
static int count_bridge_verts(SmoothMesh *mesh)
@@ -6543,7 +6598,7 @@ static void explodeModifier_createFacepa(ExplodeModifierData *emd,
/* make tree of emitter locations */
tree=BLI_kdtree_new(totpart);
for(p=0,pa=psys->particles; p<totpart; p++,pa++){
- psys_particle_on_dm(ob,psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,0,0);
+ psys_particle_on_dm(psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,0,0);
BLI_kdtree_insert(tree, p, co, NULL);
}
BLI_kdtree_balance(tree);
@@ -7063,7 +7118,6 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
{
DerivedMesh *explode, *dm=to_explode;
MFace *mf=0;
- MVert *dupvert=0;
ParticleSettings *part=psmd->psys->part;
ParticleData *pa=NULL, *pars=psmd->psys->particles;
ParticleKey state;
@@ -7118,7 +7172,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
/* the final duplicated vertices */
explode= CDDM_from_template(dm, totdup, 0,totface);
- dupvert= CDDM_get_verts(explode);
+ /*dupvert= CDDM_get_verts(explode);*/
/* getting back to object space */
Mat4Invert(imat,ob->obmat);
@@ -7147,7 +7201,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
pa= pars+i;
/* get particle state */
- psys_particle_on_emitter(ob, psmd,part->from,pa->num,-1,pa->fuv,pa->foffset,loc0,nor,0,0,0,0);
+ psys_particle_on_emitter(psmd,part->from,pa->num,-1,pa->fuv,pa->foffset,loc0,nor,0,0,0,0);
Mat4MulVecfl(ob->obmat,loc0);
state.time=cfra;
@@ -7705,6 +7759,8 @@ static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target)
tsmd->keepDist = smd->keepDist;
tsmd->shrinkType= smd->shrinkType;
tsmd->shrinkOpts= smd->shrinkOpts;
+ tsmd->projAxis = smd->projAxis;
+ tsmd->subsurfLevels = smd->subsurfLevels;
}
CustomDataMask shrinkwrapModifier_requiredDataMask(ModifierData *md)
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 259a4e0de04..4d312632b1a 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -642,6 +642,10 @@ static void multires_update_vertices(Mesh *me, EditMesh *em)
MultiApplyData data;
int i, j;
+ /* XXX added this to prevent crash, but if it works? (ton) */
+ if(me->mr->verts==NULL)
+ return;
+
/* Prepare deltas */
pr_deltas= MEM_callocN(sizeof(vec3f)*last_lvl->totvert, "multires deltas 1");
cr_deltas= MEM_callocN(sizeof(vec3f)*last_lvl->totvert, "multires deltas 2");
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 94a21cdd5df..b881b681ed9 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -27,7 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#ifndef DISABLE_PYTHON
#include <Python.h>
+#endif
+
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 2dfa849fc43..77c891ee82e 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -70,6 +70,7 @@
#include "BKE_armature.h"
#include "BKE_action.h"
+#include "BKE_bullet.h"
#include "BKE_colortools.h"
#include "BKE_deform.h"
#include "BKE_DerivedMesh.h"
@@ -110,7 +111,9 @@
#include "LBM_fluidsim.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "GPU_material.h"
@@ -182,7 +185,7 @@ void object_free_softbody(Object *ob)
void object_free_bulletsoftbody(Object *ob)
{
if(ob->bsoft) {
- sbFree(ob->bsoft);
+ bsbFree(ob->bsoft);
ob->bsoft= NULL;
}
}
@@ -268,8 +271,10 @@ void free_object(Object *ob)
free_constraints(&ob->constraints);
free_constraint_channels(&ob->constraintChannels);
free_nlastrips(&ob->nlastrips);
-
+
+#ifndef DISABLE_PYTHON
BPY_free_scriptlink(&ob->scriptlink);
+#endif
if(ob->pd){
if(ob->pd->tex)
@@ -636,9 +641,9 @@ Camera *copy_camera(Camera *cam)
camn= copy_libblock(cam);
id_us_plus((ID *)camn->ipo);
-
+#ifndef DISABLE_PYTHON
BPY_copy_scriptlink(&camn->scriptlink);
-
+#endif
return camn;
}
@@ -758,7 +763,9 @@ void *add_lamp(char *name)
la->sun_intensity = 1.0;
la->skyblendtype= MA_RAMP_ADD;
la->skyblendfac= 1.0f;
-
+ la->sky_colorspace= BLI_CS_CIE;
+ la->sky_exposure= 1.0f;
+
curvemapping_initialize(la->curfalloff);
return la;
}
@@ -783,9 +790,9 @@ Lamp *copy_lamp(Lamp *la)
id_us_plus((ID *)lan->ipo);
if (la->preview) lan->preview = BKE_previewimg_copy(la->preview);
-
+#ifndef DISABLE_PYTHON
BPY_copy_scriptlink(&la->scriptlink);
-
+#endif
return lan;
}
@@ -843,7 +850,9 @@ void make_local_lamp(Lamp *la)
void free_camera(Camera *ca)
{
+#ifndef DISABLE_PYTHON
BPY_free_scriptlink(&ca->scriptlink);
+#endif
}
void free_lamp(Lamp *la)
@@ -852,8 +861,9 @@ void free_lamp(Lamp *la)
int a;
/* scriptlinks */
-
+#ifndef DISABLE_PYTHON
BPY_free_scriptlink(&la->scriptlink);
+#endif
for(a=0; a<MAX_MTEX; a++) {
mtex= la->mtex[a];
@@ -1199,9 +1209,9 @@ Object *copy_object(Object *ob)
modifier_copyData(md, nmd);
BLI_addtail(&obn->modifiers, nmd);
}
-
+#ifndef DISABLE_PYTHON
BPY_copy_scriptlink(&ob->scriptlink);
-
+#endif
obn->prop.first = obn->prop.last = NULL;
copy_properties(&obn->prop, &ob->prop);
@@ -1477,22 +1487,42 @@ float bsystem_time(Object *ob, float cfra, float ofs)
return cfra;
}
-void object_to_mat3(Object *ob, float mat[][3]) /* no parent */
+void object_scale_to_mat3(Object *ob, float mat[][3])
{
- float smat[3][3], vec[3];
- float rmat[3][3];
- /*float q1[4];*/
-
- /* size */
+ float vec[3];
if(ob->ipo) {
vec[0]= ob->size[0]+ob->dsize[0];
vec[1]= ob->size[1]+ob->dsize[1];
vec[2]= ob->size[2]+ob->dsize[2];
- SizeToMat3(vec, smat);
+ SizeToMat3(vec, mat);
}
else {
- SizeToMat3(ob->size, smat);
+ SizeToMat3(ob->size, mat);
}
+}
+
+void object_rot_to_mat3(Object *ob, float mat[][3])
+{
+ float vec[3];
+ if(ob->ipo) {
+ vec[0]= ob->rot[0]+ob->drot[0];
+ vec[1]= ob->rot[1]+ob->drot[1];
+ vec[2]= ob->rot[2]+ob->drot[2];
+ EulToMat3(vec, mat);
+ }
+ else {
+ EulToMat3(ob->rot, mat);
+ }
+}
+
+void object_to_mat3(Object *ob, float mat[][3]) /* no parent */
+{
+ float smat[3][3];
+ float rmat[3][3];
+ /*float q1[4];*/
+
+ /* size */
+ object_scale_to_mat3(ob, smat);
/* rot */
/* Quats arnt used yet */
@@ -1506,15 +1536,7 @@ void object_to_mat3(Object *ob, float mat[][3]) /* no parent */
}
}
else {*/
- if(ob->ipo) {
- vec[0]= ob->rot[0]+ob->drot[0];
- vec[1]= ob->rot[1]+ob->drot[1];
- vec[2]= ob->rot[2]+ob->drot[2];
- EulToMat3(vec, rmat);
- }
- else {
- EulToMat3(ob->rot, rmat);
- }
+ object_rot_to_mat3(ob, rmat);
/*}*/
Mat3MulMat3(mat, rmat, smat);
}
@@ -1903,10 +1925,11 @@ void where_is_object_time(Object *ob, float ctime)
constraints_clear_evalob(cob);
}
-
+#ifndef DISABLE_PYTHON
if(ob->scriptlink.totscript && !during_script()) {
if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_REDRAW);
}
+#endif
/* set negative scale flag in object */
Crossf(vec, ob->obmat[0], ob->obmat[1]);
@@ -2273,7 +2296,9 @@ void object_handle_update(Object *ob)
}
else
where_is_object(ob);
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_OBJECTUPDATE);
+#endif
}
if(ob->recalc & OB_RECALC_DATA) {
@@ -2349,7 +2374,9 @@ void object_handle_update(Object *ob)
psys_get_modifier(ob, psys)->flag &= ~eParticleSystemFlag_psys_updated;
}
}
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_OBDATAUPDATE);
+#endif
}
/* the no-group proxy case, we call update */
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 878cb08c950..44ee5c236fa 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -1117,8 +1117,8 @@ static void psys_origspace_to_w(OrigSpaceFace *osface, int quad, float *w, float
}
}
-/* find the derived mesh face for a particle, set the mf passed.
-This is slow, can be optimized but only for many lookups, return the face lookup index*/
+/* find the derived mesh face for a particle, set the mf passed. this is slow
+ * and can be optimized but only for many lookups. returns the face index. */
int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, float *fw, struct LinkNode *node)
{
Mesh *me= (Mesh*)ob->data;
@@ -1186,168 +1186,142 @@ int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, float *
return DMCACHE_NOTFOUND;
}
-/* interprets particle data to get a point on a mesh in object space */
-#define PARTICLE_ON_DM_ERROR \
- { if(vec) { vec[0]=vec[1]=vec[2]=0.0; } \
- if(nor) { nor[0]=nor[1]=0.0; nor[2]=1.0; } \
- if(orco) { orco[0]=orco[1]=orco[2]=0.0; } \
- if(ornor) { ornor[0]=ornor[1]=0.0; ornor[2]=1.0; } \
- if(utan) { utan[0]=utan[1]=utan[2]=0.0; } \
- if(vtan) { vtan[0]=vtan[1]=vtan[2]=0.0; } }
-
-void psys_particle_on_dm(Object *ob, DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
+static int psys_map_index_on_dm(DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, int *mapindex, float *mapfw)
{
- float temp1[3];
- float (*orcodata)[3];
-
- if(index < 0) { /* 'no dm' error has happened! */
- PARTICLE_ON_DM_ERROR;
- return;
- }
- orcodata= dm->getVertDataArray(dm, CD_ORCO);
+ if(index < 0)
+ return 0;
if (dm->deformedOnly || index_dmcache == DMCACHE_ISCHILD) {
- /* this works for meshes with deform verts only - constructive modifiers wont work properly*/
+ /* for meshes that are either only defined or for child particles, the
+ * index and fw do not require any mapping, so we can directly use it */
if(from == PART_FROM_VERT) {
- if(index >= dm->getNumVerts(dm)) {
- PARTICLE_ON_DM_ERROR;
- return;
- }
-
- dm->getVertCo(dm,index,vec);
- if(nor){
- dm->getVertNo(dm,index,nor);
- Normalize(nor);
- }
- if(orco)
- VECCOPY(orco, orcodata[index])
- if(ornor) {
- dm->getVertNo(dm,index,nor);
- Normalize(nor);
- }
- }
- else { /* PART_FROM_FACE / PART_FROM_VOLUME */
- MFace *mface;
- MTFace *mtface=0;
- MVert *mvert;
- int uv_index;
-
- if(index >= dm->getNumFaces(dm)) {
- PARTICLE_ON_DM_ERROR;
- return;
- }
-
- mface=dm->getFaceData(dm,index,CD_MFACE);
- mvert=dm->getVertDataArray(dm,CD_MVERT);
- uv_index=CustomData_get_active_layer_index(&dm->faceData,CD_MTFACE);
+ if(index >= dm->getNumVerts(dm))
+ return 0;
- if(uv_index>=0){
- CustomDataLayer *layer=&dm->faceData.layers[uv_index];
- mtface= &((MTFace*)layer->data)[index];
- }
+ *mapindex = index;
+ }
+ else { /* FROM_FACE/FROM_VOLUME */
+ if(index >= dm->getNumFaces(dm))
+ return 0;
- if(from==PART_FROM_VOLUME){
- psys_interpolate_face(mvert,mface,mtface,orcodata,fw,vec,temp1,utan,vtan,orco,ornor);
- if(nor)
- VECCOPY(nor,temp1);
- Normalize(temp1);
- VecMulf(temp1,-foffset);
- VECADD(vec,vec,temp1);
- }
- else
- psys_interpolate_face(mvert,mface,mtface,orcodata,fw,vec,nor,utan,vtan,orco,ornor);
+ *mapindex = index;
+ QUATCOPY(mapfw, fw);
}
} else {
- /* Need to support constructive modifiers, this is a bit more tricky
- we need a customdata layer like UV's so we can position the particle */
-
- /* Only face supported at the moment */
- if(ELEM(from, PART_FROM_FACE, PART_FROM_VOLUME)) {
+ /* for other meshes that have been modified, we try to map the particle
+ * to their new location, which means a different index, and for faces
+ * also a new face interpolation weights */
+ if(from == PART_FROM_VERT) {
+ if (index_dmcache == DMCACHE_NOTFOUND || index_dmcache > dm->getNumVerts(dm))
+ return 0;
+
+ *mapindex = index_dmcache;
+ }
+ else { /* FROM_FACE/FROM_VOLUME */
/* find a face on the derived mesh that uses this face */
- Mesh *me= (Mesh*)ob->data;
- MVert *mvert;
MFace *mface;
- MTFace *mtface;
OrigSpaceFace *osface;
- int *origindex;
- float fw_mod[4];
- int i, totface;
-
- mvert= dm->getVertDataArray(dm,CD_MVERT);
+ int i;
+
+ i = index_dmcache;
+
+ if(i== DMCACHE_NOTFOUND || i >= dm->getNumFaces(dm))
+ return 0;
+ *mapindex = i;
+
+ /* modify the original weights to become
+ * weights for the derived mesh face */
osface= dm->getFaceDataArray(dm, CD_ORIGSPACE);
- origindex= dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ mface= dm->getFaceData(dm, i, CD_MFACE);
- /* For this to work we need origindex and OrigSpace coords */
- if(origindex==NULL || osface==NULL || index>=me->totface) {
- PARTICLE_ON_DM_ERROR;
- return;
- }
-
- if (index_dmcache == DMCACHE_NOTFOUND)
- i = psys_particle_dm_face_lookup(ob, dm, index, fw, (LinkNode*)NULL);
+ if(osface == NULL)
+ mapfw[0]= mapfw[1]= mapfw[2]= mapfw[3]= 0.0f;
else
- i = index_dmcache;
+ psys_origspace_to_w(&osface[i], mface->v4, fw, mapfw);
+ }
+ }
- totface = dm->getNumFaces(dm);
+ return 1;
+}
- /* Any time this happens, and the face has not been removed,
- * its a BUG watch out for this error! */
- if (i==-1) {
- printf("Cannot find original face %i\n", index);
- PARTICLE_ON_DM_ERROR;
- return;
- }
- else if(i >= totface)
- return;
+/* interprets particle data to get a point on a mesh in object space */
+void psys_particle_on_dm(DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
+{
+ float tmpnor[3], mapfw[4];
+ float (*orcodata)[3];
+ int mapindex;
- mface= dm->getFaceData(dm, i, CD_MFACE);
- mtface= dm->getFaceData(dm, i, CD_MTFACE);
- osface += i;
-
- /* we need to modify the original weights to become weights for
- * the derived mesh face */
- psys_origspace_to_w(osface, mface->v4, fw, fw_mod);
-
- if(from==PART_FROM_VOLUME){
- psys_interpolate_face(mvert,mface,mtface,orcodata,fw_mod,vec,temp1,utan,vtan,orco,ornor);
- if(nor)
- VECCOPY(nor,temp1);
- Normalize(temp1);
- VecMulf(temp1,-foffset);
- VECADD(vec,vec,temp1);
- }
- else
- psys_interpolate_face(mvert,mface,mtface,orcodata,fw_mod,vec,nor,utan,vtan,orco,ornor);
+ if(!psys_map_index_on_dm(dm, from, index, index_dmcache, fw, foffset, &mapindex, mapfw)) {
+ if(vec) { vec[0]=vec[1]=vec[2]=0.0; }
+ if(nor) { nor[0]=nor[1]=0.0; nor[2]=1.0; }
+ if(orco) { orco[0]=orco[1]=orco[2]=0.0; }
+ if(ornor) { ornor[0]=ornor[1]=0.0; ornor[2]=1.0; }
+ if(utan) { utan[0]=utan[1]=utan[2]=0.0; }
+ if(vtan) { vtan[0]=vtan[1]=vtan[2]=0.0; }
+
+ return;
+ }
+
+ orcodata= dm->getVertDataArray(dm, CD_ORCO);
+
+ if(from == PART_FROM_VERT) {
+ dm->getVertCo(dm,mapindex,vec);
+
+ if(nor) {
+ dm->getVertNo(dm,mapindex,nor);
+ Normalize(nor);
}
- else if(from == PART_FROM_VERT) {
- if (index_dmcache == DMCACHE_NOTFOUND || index_dmcache > dm->getNumVerts(dm)) {
- PARTICLE_ON_DM_ERROR;
- return;
- }
- dm->getVertCo(dm,index_dmcache,vec);
- if(nor) {
- dm->getVertNo(dm,index_dmcache,nor);
- Normalize(nor);
- }
- if(orco)
- VECCOPY(orco, orcodata[index])
- if(ornor) {
- dm->getVertNo(dm,index_dmcache,nor);
- Normalize(nor);
- }
- if(utan && vtan) {
- utan[0]= utan[1]= utan[2]= 0.0f;
- vtan[0]= vtan[1]= vtan[2]= 0.0f;
- }
+ if(orco)
+ VECCOPY(orco, orcodata[mapindex])
+
+ if(ornor) {
+ dm->getVertNo(dm,mapindex,nor);
+ Normalize(nor);
}
- else {
- PARTICLE_ON_DM_ERROR;
+
+ if(utan && vtan) {
+ utan[0]= utan[1]= utan[2]= 0.0f;
+ vtan[0]= vtan[1]= vtan[2]= 0.0f;
}
}
+ else { /* PART_FROM_FACE / PART_FROM_VOLUME */
+ MFace *mface;
+ MTFace *mtface;
+ MVert *mvert;
+
+ mface=dm->getFaceData(dm,mapindex,CD_MFACE);
+ mvert=dm->getVertDataArray(dm,CD_MVERT);
+ mtface=CustomData_get_layer(&dm->faceData,CD_MTFACE);
+
+ if(mtface)
+ mtface += mapindex;
+
+ if(from==PART_FROM_VOLUME) {
+ psys_interpolate_face(mvert,mface,mtface,orcodata,mapfw,vec,tmpnor,utan,vtan,orco,ornor);
+ if(nor)
+ VECCOPY(nor,tmpnor);
+
+ Normalize(tmpnor);
+ VecMulf(tmpnor,-foffset);
+ VECADD(vec,vec,tmpnor);
+ }
+ else
+ psys_interpolate_face(mvert,mface,mtface,orcodata,mapfw,vec,nor,utan,vtan,orco,ornor);
+ }
+}
+
+float psys_particle_value_from_verts(DerivedMesh *dm, short from, ParticleData *pa, float *values)
+{
+ float mapfw[4];
+ int mapindex;
+
+ if(!psys_map_index_on_dm(dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, &mapindex, mapfw))
+ return 0.0f;
+
+ return psys_interpolate_value_from_verts(dm, from, mapindex, mapfw, values);
}
-#undef PARTICLE_ON_DM_ERROR
ParticleSystemModifierData *psys_get_modifier(Object *ob, ParticleSystem *psys)
{
@@ -1368,7 +1342,7 @@ ParticleSystemModifierData *psys_get_modifier(Object *ob, ParticleSystem *psys)
/* Particles on a shape */
/************************************************/
/* ready for future use */
-void psys_particle_on_shape(int distr, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
+static void psys_particle_on_shape(int distr, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
{
/* TODO */
float zerovec[3]={0.0f,0.0f,0.0f};
@@ -1394,7 +1368,7 @@ void psys_particle_on_shape(int distr, int index, float *fuv, float *vec, float
/************************************************/
/* Particles on emitter */
/************************************************/
-void psys_particle_on_emitter(Object *ob, ParticleSystemModifierData *psmd, int from, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor){
+void psys_particle_on_emitter(ParticleSystemModifierData *psmd, int from, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor){
if(psmd){
if(psmd->psys->part->distr==PART_DISTR_GRID && psmd->psys->part->from != PART_FROM_VERT){
if(vec){
@@ -1403,7 +1377,7 @@ void psys_particle_on_emitter(Object *ob, ParticleSystemModifierData *psmd, int
return;
}
/* we cant use the num_dmcache */
- psys_particle_on_dm(ob, psmd->dm,from,index,index_dmcache,fuv,foffset,vec,nor,utan,vtan,orco,ornor);
+ psys_particle_on_dm(psmd->dm,from,index,index_dmcache,fuv,foffset,vec,nor,utan,vtan,orco,ornor);
}
else
psys_particle_on_shape(from,index,fuv,vec,nor,utan,vtan,orco,ornor);
@@ -1834,14 +1808,14 @@ void psys_find_parents(Object *ob, ParticleSystemModifierData *psmd, ParticleSys
tree=BLI_kdtree_new(totparent);
for(p=0,cpa=psys->child; p<totparent; p++,cpa++){
- psys_particle_on_emitter(ob,psmd,from,cpa->num,-1,cpa->fuv,cpa->foffset,co,0,0,0,orco,0);
+ psys_particle_on_emitter(psmd,from,cpa->num,-1,cpa->fuv,cpa->foffset,co,0,0,0,orco,0);
BLI_kdtree_insert(tree, p, orco, NULL);
}
BLI_kdtree_balance(tree);
for(; p<totchild; p++,cpa++){
- psys_particle_on_emitter(ob,psmd,from,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co,0,0,0,orco,0);
+ psys_particle_on_emitter(psmd,from,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co,0,0,0,orco,0);
cpa->parent=BLI_kdtree_find_nearest(tree, orco, NULL, NULL);
}
@@ -2033,7 +2007,7 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
cpa_fuv = cpa->fuv;
cpa_from = PART_FROM_FACE;
- psys_particle_on_emitter(ob,ctx->psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,co,ornor,0,0,orco,0);
+ psys_particle_on_emitter(ctx->psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,co,ornor,0,0,orco,0);
/* we need to save the actual root position of the child for positioning it accurately to the surface of the emitter */
VECCOPY(cpa_1st,co);
@@ -2059,7 +2033,7 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
cpa_num=pa->num;
cpa_fuv=pa->fuv;
- psys_particle_on_emitter(ob,ctx->psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,ornor,0,0,orco,0);
+ psys_particle_on_emitter(ctx->psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,ornor,0,0,orco,0);
}
keys->steps = ctx->steps;
@@ -2268,7 +2242,7 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
}
}
-void *exec_child_path_cache(void *data)
+static void *exec_child_path_cache(void *data)
{
ParticleThread *thread= (ParticleThread*)data;
ParticleThreadContext *ctx= thread->ctx;
@@ -2437,7 +2411,7 @@ void psys_cache_paths(Object *ob, ParticleSystem *psys, float cfra, int editupda
if(!edit && !psys->totchild) {
pa_length = part->length * (1.0f - part->randlength*pa->r_ave[0]);
if(vg_length)
- pa_length *= psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_length);
+ pa_length *= psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_length);
}
cache[i]->steps = steps;
@@ -2598,7 +2572,7 @@ void psys_cache_paths(Object *ob, ParticleSystem *psys, float cfra, int editupda
effector= 1.0f;
if(vg_effector)
- effector*= psys_interpolate_value_from_verts(psmd->dm,psys->part->from,pa->num,pa->fuv,vg_effector);
+ effector*= psys_particle_value_from_verts(psmd->dm,psys->part->from,pa,vg_effector);
for(k=0, ca=cache[i]; k<=steps; k++, ca++) {
/* apply effectors */
@@ -2839,7 +2813,7 @@ void psys_mat_hair_to_object(Object *ob, DerivedMesh *dm, short from, ParticleDa
float vec[3];
psys_face_mat(0, dm, pa, hairmat, 0);
- psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, 0, 0);
+ psys_particle_on_dm(dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, 0, 0);
VECCOPY(hairmat[3],vec);
}
@@ -2848,62 +2822,14 @@ void psys_mat_hair_to_orco(Object *ob, DerivedMesh *dm, short from, ParticleData
float vec[3], orco[3];
psys_face_mat(ob, dm, pa, hairmat, 1);
- psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, orco, 0);
+ psys_particle_on_dm(dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, orco, 0);
/* see psys_face_mat for why this function is called */
transform_mesh_orco_verts(ob->data, &orco, 1, 1);
VECCOPY(hairmat[3],orco);
}
-/*
-void psys_key_to_geometry(DerivedMesh *dm, ParticleData *pa, ParticleKey *key)
-{
- float q[4], v1[3], v2[3], v3[3];
-
- dm->getVertCo(dm,pa->verts[0],v1);
- dm->getVertCo(dm,pa->verts[1],v2);
- dm->getVertCo(dm,pa->verts[2],v3);
-
- triatoquat(v1, v2, v3, q);
-
- QuatInv(q);
-
- VECSUB(key->co,key->co,v1);
-
- VECADD(key->vel,key->vel,key->co);
-
- QuatMulVecf(q, key->co);
- QuatMulVecf(q, key->vel);
-
- VECSUB(key->vel,key->vel,key->co);
-
- QuatMul(key->rot,q,key->rot);
-}
-
-void psys_key_from_geometry(DerivedMesh *dm, ParticleData *pa, ParticleKey *key)
-{
- float q[4], v1[3], v2[3], v3[3];
-
- dm->getVertCo(dm,pa->verts[0],v1);
- dm->getVertCo(dm,pa->verts[1],v2);
- dm->getVertCo(dm,pa->verts[2],v3);
-
- triatoquat(v1, v2, v3, q);
-
- VECADD(key->vel,key->vel,key->co);
-
- QuatMulVecf(q, key->co);
- QuatMulVecf(q, key->vel);
-
- VECSUB(key->vel,key->vel,key->co);
-
- VECADD(key->co,key->co,v1);
-
- QuatMul(key->rot,q,key->rot);
-}
-*/
-
-void psys_vec_rot_to_face(DerivedMesh *dm, ParticleData *pa, float *vec)//to_geometry(DerivedMesh *dm, ParticleData *pa, float *vec)
+void psys_vec_rot_to_face(DerivedMesh *dm, ParticleData *pa, float *vec)
{
float mat[4][4];
@@ -2912,36 +2838,6 @@ void psys_vec_rot_to_face(DerivedMesh *dm, ParticleData *pa, float *vec)//to_geo
Mat4Mul3Vecfl(mat, vec);
}
-/* unused */
-#if 0
-static void psys_vec_rot_from_face(DerivedMesh *dm, ParticleData *pa, float *vec)//from_geometry(DerivedMesh *dm, ParticleData *pa, float *vec)
-{
- float q[4], v1[3], v2[3], v3[3];
- /*
- dm->getVertCo(dm,pa->verts[0],v1);
- dm->getVertCo(dm,pa->verts[1],v2);
- dm->getVertCo(dm,pa->verts[2],v3);
- */
- /* replace with this */
- MFace *mface;
- int i; // = psys_particle_dm_face_lookup(dm, pa->num, pa->fuv, pa->foffset, (LinkNode*)NULL);
- i = pa->num_dmcache==DMCACHE_NOTFOUND ? pa->num : pa->num_dmcache;
- if (i==-1 || i >= dm->getNumFaces(dm)) { vec[0] = vec[1] = 0; vec[2] = 1; return; }
- mface=dm->getFaceData(dm,i,CD_MFACE);
-
- dm->getVertCo(dm,mface->v1,v1);
- dm->getVertCo(dm,mface->v2,v2);
- dm->getVertCo(dm,mface->v3,v3);
- /* done */
-
- triatoquat(v1, v2, v3, q);
-
- QuatMulVecf(q, vec);
-
- //VECADD(vec,vec,v1);
-}
-#endif
-
void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
{
float facemat[4][4];
@@ -3191,6 +3087,47 @@ LinkNode *psys_using_settings(ParticleSettings *part, int flush_update)
/************************************************/
/* Textures */
/************************************************/
+
+static int get_particle_uv(DerivedMesh *dm, ParticleData *pa, int face_index, float *fuv, char *name, float *texco)
+{
+ MFace *mf;
+ MTFace *tf;
+ int i;
+
+ tf= CustomData_get_layer_named(&dm->faceData, CD_MTFACE, name);
+
+ if(tf == NULL)
+ tf= CustomData_get_layer(&dm->faceData, CD_MTFACE);
+
+ if(tf == NULL)
+ return 0;
+
+ if(pa) {
+ i= (pa->num_dmcache==DMCACHE_NOTFOUND)? pa->num: pa->num_dmcache;
+ if(i >= dm->getNumFaces(dm))
+ i = -1;
+ }
+ else
+ i= face_index;
+
+ if (i==-1) {
+ texco[0]= 0.0f;
+ texco[1]= 0.0f;
+ texco[2]= 0.0f;
+ }
+ else {
+ mf= dm->getFaceData(dm, i, CD_MFACE);
+
+ psys_interpolate_uvs(&tf[i], mf->v4, fuv, texco);
+
+ texco[0]= texco[0]*2.0f - 1.0f;
+ texco[1]= texco[1]*2.0f - 1.0f;
+ texco[2]= 0.0f;
+ }
+
+ return 1;
+}
+
static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index, float *fw, float *orco, ParticleTexture *ptex, int event)
{
MTex *mtex;
@@ -3205,27 +3142,13 @@ static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index, float
short blend=mtex->blendtype;
short neg=mtex->pmaptoneg;
- if(mtex->texco & TEXCO_UV && fw){
- int uv_index=CustomData_get_named_layer_index(&dm->faceData,CD_MTFACE,mtex->uvname);
- if(uv_index<0){
- uv_index=CustomData_get_active_layer_index(&dm->faceData,CD_MTFACE);
- }
- if(uv_index>=0){
- CustomDataLayer *layer=&dm->faceData.layers[uv_index];
- MTFace *mtface= &((MTFace*)layer->data)[face_index];
- MFace *mf=dm->getFaceData(dm,face_index,CD_MFACE);
- psys_interpolate_uvs(mtface,mf->v4,fw,texco);
- texco[0]*=2.0;
- texco[1]*=2.0;
- texco[0]-=1.0;
- texco[1]-=1.0;
- }
- else
+ if((mtex->texco & TEXCO_UV) && fw) {
+ if(!get_particle_uv(dm, NULL, face_index, fw, mtex->uvname, texco))
VECCOPY(texco,orco);
}
- else{
+ else
VECCOPY(texco,orco);
- }
+
externtex(mtex, texco, &value, rgba, rgba+1, rgba+2, rgba+3);
if((event & mtex->pmapto) & MAP_PA_TIME){
if((setvars&MAP_PA_TIME)==0){
@@ -3265,33 +3188,16 @@ void psys_get_texture(Object *ob, Material *ma, ParticleSystemModifierData *psmd
short blend=mtex->blendtype;
short neg=mtex->pmaptoneg;
- if(mtex->texco & TEXCO_UV){
- int uv_index=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,mtex->uvname);
- if(uv_index<0){
- uv_index=CustomData_get_active_layer_index(&psmd->dm->faceData,CD_MTFACE);
+ if((mtex->texco & TEXCO_UV) && ELEM(psys->part->from, PART_FROM_FACE, PART_FROM_VOLUME)) {
+ if(!get_particle_uv(psmd->dm, pa, 0, pa->fuv, mtex->uvname, texco)) {
+ /* failed to get uv's, let's try orco's */
+ psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
}
- if(uv_index>=0){
- CustomDataLayer *layer=&psmd->dm->faceData.layers[uv_index];
- MTFace *mtface= &((MTFace*)layer->data)[pa->num];
- MFace *mf=psmd->dm->getFaceData(psmd->dm,pa->num,CD_MFACE);
- psys_interpolate_uvs(mtface,mf->v4,pa->fuv,texco);
- texco[0]*=2.0;
- texco[1]*=2.0;
- texco[0]-=1.0;
- texco[1]-=1.0;
- }
- else
- //psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,pa->fuv,pa->foffset,texco,0,0,0);
- /* <jahka> anyways I think it will be too small a difference to notice, so psys_get_texture should only know about the original mesh structure.. no dm needed anywhere */
- /* <brecht> the code only does dm based lookup now, so passing num_dmcache anyway to avoid^
- * massive slowdown here */
- psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
}
- else{
- //psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,pa->fuv,pa->offset,texco,0,0,0);
- /* ditto above */
- psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
+ else {
+ psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
}
+
externtex(mtex, texco, &value, rgba, rgba+1, rgba+2, rgba+3);
if((event & mtex->pmapto) & MAP_PA_TIME){
@@ -3356,7 +3262,7 @@ float psys_get_size(Object *ob, Material *ma, ParticleSystemModifierData *psmd,
}
if(vg_size)
- size*=psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_size);
+ size*=psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_size);
if(part->randsize!=0.0)
size*= 1.0f - part->randsize*pa->sizemul;
@@ -3603,7 +3509,7 @@ void psys_get_particle_on_path(Object *ob, ParticleSystem *psys, int p, Particle
cpa_fuv = cpa->fuv;
cpa_from = PART_FROM_FACE;
- psys_particle_on_emitter(ob,psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,co,0,0,0,orco,0);
+ psys_particle_on_emitter(psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,co,0,0,0,orco,0);
/* we need to save the actual root position of the child for positioning it accurately to the surface of the emitter */
//VECCOPY(cpa_1st,co);
@@ -3625,7 +3531,7 @@ void psys_get_particle_on_path(Object *ob, ParticleSystem *psys, int p, Particle
cpa_num=pa->num;
cpa_fuv=pa->fuv;
- psys_particle_on_emitter(ob,psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,0,0,0,orco,0);
+ psys_particle_on_emitter(psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,0,0,0,orco,0);
}
/* correct child ipo timing */
@@ -3796,7 +3702,7 @@ int psys_get_particle_state(Object *ob, ParticleSystem *psys, int p, ParticleKey
}
else{
if (pa) { /* TODO PARTICLE - should this ever be NULL? - Campbell */
- if(pa->state.time==state->time)
+ if(pa->state.time==state->time || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED))
copy_particle_key(state, &pa->state, 1);
else if(pa->prev_state.time==state->time)
copy_particle_key(state, &pa->prev_state, 1);
@@ -3828,6 +3734,9 @@ int psys_get_particle_state(Object *ob, ParticleSystem *psys, int p, ParticleKey
/* convert back to real velocity */
VecMulf(state->vel, frs_sec / dfra);
+
+ VecLerpf(state->ave, keys[1].ave, keys[2].ave, keytime);
+ QuatInterpol(state->rot, keys[1].rot, keys[2].rot, keytime);
}
}
else {
@@ -3870,7 +3779,7 @@ void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemMo
else
uv[0]= uv[1]= 0.0f;
- psys_particle_on_emitter(ob, psmd,
+ psys_particle_on_emitter(psmd,
(part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,0,0,0,orco,0);
}
@@ -3894,7 +3803,7 @@ void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemMo
else
uv[0]= uv[1]= 0.0f;
- psys_particle_on_emitter(ob,psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,orco,0);
+ psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,orco,0);
}
}
@@ -3907,9 +3816,9 @@ void psys_get_dupli_path_transform(Object *ob, ParticleSystem *psys, ParticleSys
len= Normalize(vec);
if(pa)
- psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0);
+ psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0);
else
- psys_particle_on_emitter(ob, psmd,
+ psys_particle_on_emitter(psmd,
(psys->part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0);
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index fe5ea79e462..39226faff1e 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -622,7 +622,7 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
KDTreeNearest ptn[3];
int w, maxw;
- psys_particle_on_dm(ctx->ob,ctx->dm,from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,orco1,0);
+ psys_particle_on_dm(ctx->dm,from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,orco1,0);
transform_mesh_orco_verts((Mesh*)ob->data, &orco1, 1, 1);
maxw = BLI_kdtree_find_n_nearest(ctx->tree,3,orco1,NULL,ptn);
@@ -766,7 +766,7 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
do_seams= (part->flag&PART_CHILD_SEAMS && ctx->seams);
- psys_particle_on_dm(ob,dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,0,0,orco1,ornor1);
+ psys_particle_on_dm(dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,0,0,orco1,ornor1);
transform_mesh_orco_verts((Mesh*)ob->data, &orco1, 1, 1);
maxw = BLI_kdtree_find_n_nearest(ctx->tree,(do_seams)?10:4,orco1,ornor1,ptn);
@@ -864,7 +864,7 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
}
}
-void *exec_distribution(void *data)
+static void *exec_distribution(void *data)
{
ParticleThread *thread= (ParticleThread*)data;
ParticleSystem *psys= thread->ctx->psys;
@@ -980,7 +980,7 @@ int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm
tree=BLI_kdtree_new(totpart);
for(p=0,pa=psys->particles; p<totpart; p++,pa++){
- psys_particle_on_dm(ob,dm,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,ornor);
+ psys_particle_on_dm(dm,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,ornor);
transform_mesh_orco_verts((Mesh*)ob->data, &orco, 1, 1);
BLI_kdtree_insert(tree, p, orco, ornor);
}
@@ -1741,7 +1741,7 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi
where_is_object_time(ob,pa->time);
/* get birth location from object */
- psys_particle_on_emitter(ob,psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
+ psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
/* save local coordinates for later */
VECCOPY(tloc,loc);
@@ -1750,7 +1750,7 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi
psys_get_texture(ob,give_current_material(ob,part->omat),psmd,psys,pa,&ptex,MAP_PA_IVEL);
if(vg_vel && pa->num != -1)
- ptex.ivel*=psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_vel);
+ ptex.ivel*=psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_vel);
/* particles live in global space so */
/* let's convert: */
@@ -1765,7 +1765,7 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi
/* -tangent */
if(part->tanfac!=0.0){
- float phase=vg_rot?2.0f*(psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_rot)-0.5f):0.0f;
+ float phase=vg_rot?2.0f*(psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_rot)-0.5f):0.0f;
VecMulf(vtan,-(float)cos(M_PI*(part->tanphase+phase)));
fac=-(float)sin(M_PI*(part->tanphase+phase));
VECADDFAC(vtan,vtan,utan,fac);
@@ -1825,7 +1825,7 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi
/* *emitter tangent */
if(part->tanfac!=0.0)
- VECADDFAC(vel,vel,vtan,part->tanfac*(vg_tan?psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_tan):1.0f));
+ VECADDFAC(vel,vel,vtan,part->tanfac*(vg_tan?psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_tan):1.0f));
/* *texture */
/* TODO */
@@ -2483,7 +2483,7 @@ static void precalc_effectors(Object *ob, ParticleSystem *psys, ParticleSystemMo
ec->locations=MEM_callocN(totpart*3*sizeof(float),"particle locations");
for(p=0,pa=psys->particles; p<totpart; p++, pa++){
- psys_particle_on_emitter(ob,psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,0,0);
+ psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,0,0);
Mat4MulVecfl(ob->obmat,loc);
ec->distances[p]=VecLenf(loc,vec);
VECSUB(loc,loc,vec);
@@ -3101,7 +3101,7 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part
col.md = ( CollisionModifierData * ) ( modifiers_findByType ( ec->ob, eModifierType_Collision ) );
col.ob_t = ob;
- if(col.md->bvhtree)
+ if(col.md && col.md->bvhtree)
BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col);
}
}
@@ -3877,7 +3877,7 @@ static void boid_body(BoidVecFunc *bvf, ParticleData *pa, ParticleSystem *psys,
/************************************************/
/* Hair */
/************************************************/
-void save_hair(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra){
+static void save_hair(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra){
ParticleData *pa;
HairKey *key;
int totpart;
@@ -3973,9 +3973,6 @@ static void dynamics_step(Object *ob, ParticleSystem *psys, ParticleSystemModifi
}
pa->size=psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size);
- if(part->type==PART_REACTOR)
- initialize_particle(pa,p,ob,psys,psmd);
-
reset_particle(pa,psys,psmd,ob,dtime,cfra,vg_vel,vg_tan,vg_rot);
if(cfra>pa->time && part->flag & PART_LOOP && part->type!=PART_HAIR){
@@ -4154,7 +4151,7 @@ static void psys_update_path_cache(Object *ob, ParticleSystemModifierData *psmd,
}
if((part->type==PART_HAIR || psys->flag&PSYS_KEYED) && (psys_in_edit_mode(psys)
- || (part->type==PART_HAIR || part->draw_as==PART_DRAW_PATH) || part->draw&PART_DRAW_KEYS)){
+ || (part->type==PART_HAIR || part->draw_as==PART_DRAW_PATH))){
psys_cache_paths(ob, psys, cfra, 0);
/* for render, child particle paths are computed on the fly */
@@ -4464,10 +4461,8 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
return;
}
- /* cache shouldn't be used for hair or "none" or "first keyed" physics */
- if(part->type == PART_HAIR || part->phystype == PART_PHYS_NO)
- usecache= 0;
- else if(part->type == PART_PHYS_KEYED && (psys->flag & PSYS_FIRST_KEYED))
+ /* cache shouldn't be used for hair or "none" or "keyed" physics */
+ if(part->type == PART_HAIR || ELEM(part->phystype, PART_PHYS_NO, PART_PHYS_KEYED))
usecache= 0;
else if(BKE_ptcache_get_continue_physics())
usecache= 0;
@@ -4645,7 +4640,7 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
}
}
-void psys_to_softbody(Object *ob, ParticleSystem *psys)
+static void psys_to_softbody(Object *ob, ParticleSystem *psys)
{
SoftBody *sb;
short softflag;
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 43805959e62..d4676653a4e 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -70,6 +70,12 @@
#include <unistd.h>
#endif
+#ifdef _WIN32
+#ifndef snprintf
+#define snprintf _snprintf
+#endif
+#endif
+
/* Creating ID's */
void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
@@ -164,6 +170,9 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob)
- stack_index: index in the modifier stack. we can have cache for more then one stack_index
*/
+#define MAX_PTCACHE_PATH FILE_MAX
+#define MAX_PTCACHE_FILE ((FILE_MAXDIR+FILE_MAXFILE)*2)
+
static int ptcache_path(PTCacheID *pid, char *filename)
{
Library *lib;
@@ -172,7 +181,7 @@ static int ptcache_path(PTCacheID *pid, char *filename)
lib= (pid)? pid->ob->id.lib: NULL;
if (G.relbase_valid || lib) {
- char file[FILE_MAX]; /* we dont want the dir, only the file */
+ char file[MAX_PTCACHE_PATH]; /* we dont want the dir, only the file */
char *blendfilename;
blendfilename= (lib)? lib->filename: G.sce;
@@ -184,7 +193,7 @@ static int ptcache_path(PTCacheID *pid, char *filename)
if (i > 6)
file[i-6] = '\0';
- sprintf(filename, "//"PTCACHE_PATH"%s", file); /* add blend file name to pointcache dir */
+ snprintf(filename, MAX_PTCACHE_PATH, "//"PTCACHE_PATH"%s", file); /* add blend file name to pointcache dir */
BLI_convertstringcode(filename, blendfilename);
BLI_add_slash(filename);
return strlen(filename);
@@ -192,7 +201,7 @@ static int ptcache_path(PTCacheID *pid, char *filename)
/* use the temp path. this is weak but better then not using point cache at all */
/* btempdir is assumed to exist and ALWAYS has a trailing slash */
- sprintf(filename, "%s"PTCACHE_PATH"%d", btempdir, abs(getpid()));
+ snprintf(filename, MAX_PTCACHE_PATH, "%s"PTCACHE_PATH"%d", btempdir, abs(getpid()));
BLI_add_slash(filename);
return strlen(filename);
}
@@ -215,13 +224,13 @@ static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, sho
idname = (pid->ob->id.name+2);
/* convert chars to hex so they are always a valid filename */
while('\0' != *idname) {
- sprintf(newname, "%02X", (char)(*idname++));
+ snprintf(newname, MAX_PTCACHE_FILE, "%02X", (char)(*idname++));
newname+=2;
len += 2;
}
if (do_ext) {
- sprintf(newname, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */
+ snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */
len += 16;
}
@@ -290,9 +299,10 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
/* mode is same as fopen's modes */
DIR *dir;
struct dirent *de;
- char path[FILE_MAX];
- char filename[(FILE_MAXDIR+FILE_MAXFILE)*2];
- char path_full[(FILE_MAXDIR+FILE_MAXFILE)*2];
+ char path[MAX_PTCACHE_PATH];
+ char filename[MAX_PTCACHE_FILE];
+ char path_full[MAX_PTCACHE_FILE];
+ char ext[MAX_PTCACHE_PATH];
if(!pid->cache)
return;
@@ -315,9 +325,11 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
dir = opendir(path);
if (dir==NULL)
return;
+
+ snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, pid->stack_index);
while ((de = readdir(dir)) != NULL) {
- if (strstr(de->d_name, PTCACHE_EXT)) { /* do we have the right extension?*/
+ if (strstr(de->d_name, ext)) { /* do we have the right extension?*/
if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */
if (mode == PTCACHE_CLEAR_ALL) {
BLI_join_dirfile(path_full, path, de->d_name);
@@ -326,8 +338,9 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
/* read the number of the file */
int frame, len2 = strlen(de->d_name);
char num[7];
+
if (len2 > 15) { /* could crash if trying to copy a string out of this range*/
- strncpy(num, de->d_name + (strlen(de->d_name) - 15), 6);
+ BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num));
frame = atoi(num);
if((mode==PTCACHE_CLEAR_BEFORE && frame < cfra) ||
@@ -353,7 +366,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
{
- char filename[(FILE_MAXDIR+FILE_MAXFILE)*2];
+ char filename[MAX_PTCACHE_FILE];
if(!pid->cache)
return 0;
@@ -499,8 +512,8 @@ int BKE_ptcache_object_reset(Object *ob, int mode)
/* Use this when quitting blender, with unsaved files */
void BKE_ptcache_remove(void)
{
- char path[FILE_MAX];
- char path_full[FILE_MAX];
+ char path[MAX_PTCACHE_PATH];
+ char path_full[MAX_PTCACHE_PATH];
int rmdir = 1;
ptcache_path(NULL, path);
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index dea36a69643..1727edc10fc 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -82,7 +82,10 @@
#include "BIF_previewrender.h"
#include "BIF_editseq.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
+
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
@@ -139,7 +142,10 @@ void free_scene(Scene *sce)
if(sce->radio) MEM_freeN(sce->radio);
sce->radio= 0;
+#ifndef DISABLE_PYTHON
BPY_free_scriptlink(&sce->scriptlink);
+#endif
+
if (sce->r.avicodecdata) {
free_avicodecdata(sce->r.avicodecdata);
MEM_freeN(sce->r.avicodecdata);
@@ -253,6 +259,21 @@ Scene *add_scene(char *name)
sce->toolsettings->select_thresh= 0.01f;
sce->toolsettings->jointrilimit = 0.8f;
+ sce->toolsettings->skgen_resolution = 100;
+ sce->toolsettings->skgen_threshold_internal = 0.01f;
+ sce->toolsettings->skgen_threshold_external = 0.01f;
+ sce->toolsettings->skgen_angle_limit = 45.0f;
+ sce->toolsettings->skgen_length_ratio = 1.3f;
+ sce->toolsettings->skgen_length_limit = 1.5f;
+ sce->toolsettings->skgen_correlation_limit = 0.98f;
+ sce->toolsettings->skgen_symmetry_limit = 0.1f;
+ sce->toolsettings->skgen_postpro = SKGEN_SMOOTH;
+ sce->toolsettings->skgen_postpro_passes = 1;
+ sce->toolsettings->skgen_options = SKGEN_FILTER_INTERNAL|SKGEN_FILTER_EXTERNAL|SKGEN_FILTER_SMART|SKGEN_HARMONIC|SKGEN_SUB_CORRELATION|SKGEN_STICK_TO_EMBEDDING;
+ sce->toolsettings->skgen_subdivisions[0] = SKGEN_SUB_CORRELATION;
+ sce->toolsettings->skgen_subdivisions[1] = SKGEN_SUB_LENGTH;
+ sce->toolsettings->skgen_subdivisions[2] = SKGEN_SUB_ANGLE;
+
pset= &sce->toolsettings->particle;
pset->flag= PE_KEEP_LENGTHS|PE_LOCK_FIRST|PE_DEFLECT_EMITTER;
pset->emitterdist= 0.25f;
@@ -570,9 +591,9 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay)
/* object ipos are calculated in where_is_object */
do_all_data_ipos();
-
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED, 0);
-
+#endif
/* sets first, we allow per definition current scene to have dependencies on sets */
for(sce= sce->set; sce; sce= sce->set)
scene_update(sce, lay);
diff --git a/source/blender/blenkernel/intern/script.c b/source/blender/blenkernel/intern/script.c
index b93821da218..6145f6c3063 100644
--- a/source/blender/blenkernel/intern/script.c
+++ b/source/blender/blenkernel/intern/script.c
@@ -44,7 +44,9 @@
#include "BKE_global.h"
#include "BKE_main.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h" // Blender Python library
+#endif
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -57,5 +59,7 @@
void free_script (Script *script)
{
if (!script) return;
+#ifndef DISABLE_PYTHON
BPY_clear_script(script);
+#endif
}
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 76af9a763ee..28bf7aee884 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -215,7 +215,11 @@ void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
BENCH(bvhtree_from_mesh_verts(&treeData, calc->target, 0.0, 2, 6));
- if(treeData.tree == NULL) return OUT_OF_MEMORY();
+ if(treeData.tree == NULL)
+ {
+ OUT_OF_MEMORY();
+ return;
+ }
//Setup nearest
nearest.index = -1;
@@ -526,7 +530,11 @@ void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
//Create a bvh-tree of the given target
BENCH(bvhtree_from_mesh_faces( &treeData, calc->target, 0.0, 2, 6));
- if(treeData.tree == NULL) return OUT_OF_MEMORY();
+ if(treeData.tree == NULL)
+ {
+ OUT_OF_MEMORY();
+ return;
+ }
//Setup nearest
nearest.index = -1;
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 508b2233536..5d93f10526a 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -236,7 +236,7 @@ typedef struct ccd_Mesh {
-ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm)
+static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm)
{
ccd_Mesh *pccd_M = NULL;
ccdf_minmax *mima =NULL;
@@ -333,7 +333,7 @@ ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm)
}
return pccd_M;
}
-void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm)
+static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm)
{
ccdf_minmax *mima =NULL;
MFace *mface=NULL;
@@ -472,7 +472,7 @@ void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm)
return ;
}
-void ccd_mesh_free(ccd_Mesh *ccdm)
+static void ccd_mesh_free(ccd_Mesh *ccdm)
{
if(ccdm && (ccdm->savety == CCD_SAVETY )){ /*make sure we're not nuking objects we don't know*/
MEM_freeN(ccdm->mface);
@@ -484,7 +484,7 @@ void ccd_mesh_free(ccd_Mesh *ccdm)
}
}
-void ccd_build_deflector_hache(Object *vertexowner,GHash *hash)
+static void ccd_build_deflector_hache(Object *vertexowner,GHash *hash)
{
Base *base;
Object *ob;
@@ -536,7 +536,7 @@ void ccd_build_deflector_hache(Object *vertexowner,GHash *hash)
} /* while (base) */
}
-void ccd_update_deflector_hache(Object *vertexowner,GHash *hash)
+static void ccd_update_deflector_hache(Object *vertexowner,GHash *hash)
{
Base *base;
Object *ob;
@@ -991,7 +991,7 @@ static int query_external_colliders(Object *me)
/* +++ the aabb "force" section*/
-int sb_detect_aabb_collisionCached( float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
{
Object *ob;
SoftBody *sb=vertexowner->soft;
@@ -1055,7 +1055,7 @@ int sb_detect_aabb_collisionCached( float force[3], unsigned int par_layer,struc
/* +++ the face external section*/
-int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
+static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
{
Object *ob;
@@ -1153,7 +1153,7 @@ int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3
}
-int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
+static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
{
Object *ob;
@@ -1291,7 +1291,7 @@ int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_
-void scan_for_ext_face_forces(Object *ob,float timenow)
+static void scan_for_ext_face_forces(Object *ob,float timenow)
{
SoftBody *sb = ob->soft;
BodyFace *bf;
@@ -1379,7 +1379,7 @@ void scan_for_ext_face_forces(Object *ob,float timenow)
/* +++ the spring external section*/
-int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp,
+static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp,
float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
{
Object *ob;
@@ -1530,7 +1530,7 @@ int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp
-void _scan_for_ext_spring_forces(Object *ob,float timenow,int ifirst,int ilast, struct ListBase *do_effector)
+static void _scan_for_ext_spring_forces(Object *ob,float timenow,int ifirst,int ilast, struct ListBase *do_effector)
{
SoftBody *sb = ob->soft;
int a;
@@ -1601,7 +1601,7 @@ void _scan_for_ext_spring_forces(Object *ob,float timenow,int ifirst,int ilast,
}
-void scan_for_ext_spring_forces(Object *ob,float timenow)
+static void scan_for_ext_spring_forces(Object *ob,float timenow)
{
SoftBody *sb = ob->soft;
ListBase *do_effector= NULL;
@@ -1613,14 +1613,14 @@ void scan_for_ext_spring_forces(Object *ob,float timenow)
pdEndEffectors(do_effector);
}
-void *exec_scan_for_ext_spring_forces(void *data)
+static void *exec_scan_for_ext_spring_forces(void *data)
{
SB_thread_context *pctx = (SB_thread_context*)data;
_scan_for_ext_spring_forces(pctx->ob,pctx->timenow,pctx->ifirst,pctx->ilast,pctx->do_effector);
return 0;
}
-void sb_sfesf_threads_run(struct Object *ob, float timenow,int totsprings,int *ptr_to_break_func())
+static void sb_sfesf_threads_run(struct Object *ob, float timenow,int totsprings,int *ptr_to_break_func())
{
ListBase *do_effector = NULL;
ListBase threads;
@@ -1682,7 +1682,7 @@ void sb_sfesf_threads_run(struct Object *ob, float timenow,int totsprings,int *p
/* --- the spring external section*/
-int choose_winner(float*w, float* pos,float*a,float*b,float*c,float*ca,float*cb,float*cc)
+static int choose_winner(float*w, float* pos,float*a,float*b,float*c,float*ca,float*cb,float*cc)
{
float mindist,cp;
int winner =1;
@@ -1709,7 +1709,7 @@ int choose_winner(float*w, float* pos,float*a,float*b,float*c,float*ca,float*cb,
-int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *damp,
+static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *damp,
float force[3], unsigned int par_layer,struct Object *vertexowner,
float time,float vel[3], float *intrusion)
{
@@ -2119,7 +2119,7 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo
/* since this is definitely the most CPU consuming task here .. try to spread it */
/* core function _softbody_calc_forces_slice_in_a_thread */
/* result is int to be able to flag user break */
-int _softbody_calc_forces_slice_in_a_thread(Object *ob, float forcetime, float timenow,int ifirst,int ilast,int *ptr_to_break_func(),ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
+static int _softbody_calc_forces_slice_in_a_thread(Object *ob, float forcetime, float timenow,int ifirst,int ilast,int *ptr_to_break_func(),ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
{
float iks;
int bb,do_selfcollision,do_springcollision,do_aero;
@@ -2319,14 +2319,14 @@ int _softbody_calc_forces_slice_in_a_thread(Object *ob, float forcetime, float t
return 0; /*done fine*/
}
-void *exec_softbody_calc_forces(void *data)
+static void *exec_softbody_calc_forces(void *data)
{
SB_thread_context *pctx = (SB_thread_context*)data;
_softbody_calc_forces_slice_in_a_thread(pctx->ob,pctx->forcetime,pctx->timenow,pctx->ifirst,pctx->ilast,NULL,pctx->do_effector,pctx->do_deflector,pctx->fieldfactor,pctx->windfactor);
return 0;
}
-void sb_cf_threads_run(struct Object *ob, float forcetime, float timenow,int totpoint,int *ptr_to_break_func(),struct ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
+static void sb_cf_threads_run(struct Object *ob, float forcetime, float timenow,int totpoint,int *ptr_to_break_func(),struct ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
{
ListBase threads;
SB_thread_context *sb_threads;
@@ -3067,7 +3067,7 @@ static void softbody_apply_goalsnap(Object *ob)
}
-void apply_spring_memory(Object *ob)
+static void apply_spring_memory(Object *ob)
{
SoftBody *sb = ob->soft;
BodySpring *bs;
@@ -3293,7 +3293,7 @@ static void mesh_faces_to_scratch(Object *ob)
helper function to get proper spring length
when object is rescaled
*/
-float globallen(float *v1,float *v2,Object *ob)
+static float globallen(float *v1,float *v2,Object *ob)
{
float p1[3],p2[3];
VECCOPY(p1,v1);
@@ -3711,7 +3711,7 @@ static int softbody_read_cache(Object *ob, float framenr)
}
/* +++ ************ maintaining scratch *************** */
-void sb_new_scratch(SoftBody *sb)
+static void sb_new_scratch(SoftBody *sb)
{
if (!sb) return;
sb->scratch = MEM_callocN(sizeof(SBScratch), "SBScratch");
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index e6797186b53..f79009e673d 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -86,9 +86,9 @@ struct CCGDerivedMesh {
typedef struct CCGDerivedMesh CCGDerivedMesh;
-static int ccgDM_getVertMapIndex(CCGDerivedMesh *ccgdm, CCGSubSurf *ss, CCGVert *v);
-static int ccgDM_getEdgeMapIndex(CCGDerivedMesh *ccgdm, CCGSubSurf *ss, CCGEdge *e);
-static int ccgDM_getFaceMapIndex(CCGDerivedMesh *ccgdm, CCGSubSurf *ss, CCGFace *f);
+static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v);
+static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e);
+static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f);
///
@@ -161,8 +161,8 @@ static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAgin
}
static int getEdgeIndex(CCGSubSurf *ss, CCGEdge *e, int x, int edgeSize) {
- CCGVert *v0 = ccgSubSurf_getEdgeVert0(ss, e);
- CCGVert *v1 = ccgSubSurf_getEdgeVert1(ss, e);
+ CCGVert *v0 = ccgSubSurf_getEdgeVert0(e);
+ CCGVert *v1 = ccgSubSurf_getEdgeVert1(e);
int v0idx = *((int*) ccgSubSurf_getVertUserData(ss, v0));
int v1idx = *((int*) ccgSubSurf_getVertUserData(ss, v1));
int edgeBase = *((int*) ccgSubSurf_getEdgeUserData(ss, e));
@@ -177,7 +177,7 @@ static int getEdgeIndex(CCGSubSurf *ss, CCGEdge *e, int x, int edgeSize) {
}
static int getFaceIndex(CCGSubSurf *ss, CCGFace *f, int S, int x, int y, int edgeSize, int gridSize) {
int faceBase = *((int*) ccgSubSurf_getFaceUserData(ss, f));
- int numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int numVerts = ccgSubSurf_getFaceNumVerts(f);
if (x==gridSize-1 && y==gridSize-1) {
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
@@ -186,7 +186,7 @@ static int getFaceIndex(CCGSubSurf *ss, CCGFace *f, int S, int x, int y, int edg
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
CCGEdge *e = ccgSubSurf_getFaceEdge(ss, f, S);
int edgeBase = *((int*) ccgSubSurf_getEdgeUserData(ss, e));
- if (v==ccgSubSurf_getEdgeVert0(ss, e)) {
+ if (v==ccgSubSurf_getEdgeVert0(e)) {
return edgeBase + (gridSize-1-y)-1;
} else {
return edgeBase + (edgeSize-2-1)-((gridSize-1-y)-1);
@@ -195,7 +195,7 @@ static int getFaceIndex(CCGSubSurf *ss, CCGFace *f, int S, int x, int y, int edg
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
CCGEdge *e = ccgSubSurf_getFaceEdge(ss, f, (S+numVerts-1)%numVerts);
int edgeBase = *((int*) ccgSubSurf_getEdgeUserData(ss, e));
- if (v==ccgSubSurf_getEdgeVert0(ss, e)) {
+ if (v==ccgSubSurf_getEdgeVert0(e)) {
return edgeBase + (gridSize-1-x)-1;
} else {
return edgeBase + (edgeSize-2-1)-((gridSize-1-x)-1);
@@ -300,7 +300,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
if ((mv0->flag&mv1->flag) & ME_VERT_MERGED)
crease = creaseFactor;
else
- crease = ccgSubSurf_getEdgeCrease(origss, orige);
+ crease = ccgSubSurf_getEdgeCrease(orige);
ccgSubSurf_syncEdge(ss, ehdl, fverts[j], fverts[(j+1)%nverts], crease, &e);
BLI_edgehash_insert(ehash, v0, v1, NULL);
@@ -368,7 +368,7 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap[index];
- int numVerts = ccgSubSurf_getFaceNumVerts(uvss, f);
+ int numVerts = ccgSubSurf_getFaceNumVerts(f);
for (S=0; S<numVerts; S++) {
VertData *faceGridData= ccgSubSurf_getFaceGridDataArray(uvss, f, S);
@@ -399,12 +399,12 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditmesh, DispListMesh *dlm, MEdge *medge, MTFace *tface)
{
unsigned int flags = 0;
- int N = ccgSubSurf_getEdgeNumFaces(ss, e);
+ int N = ccgSubSurf_getEdgeNumFaces(e);
if (!N) flags |= ME_LOOSEEDGE;
if (ssFromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
+ EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(e);
flags |= ME_EDGEDRAW|ME_EDGERENDER;
if (eed->seam) {
@@ -470,7 +470,7 @@ static void calc_ss_weights(int gridFaces,
}
}
-DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
+static DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int drawInteriorEdges, int useSubsurfUv,
DerivedMesh *dm)
{
@@ -480,7 +480,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int gridFaces = gridSize - 1;
int edgeBase, faceBase;
int i, j, k, S, x, y, index;
- int vertBase = 0;
CCGVertIterator *vi;
CCGEdgeIterator *ei;
CCGFaceIterator *fi;
@@ -503,7 +502,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- vertMap2[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v))] = v;
+ vertMap2[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))] = v;
}
ccgVertIterator_free(vi);
@@ -513,7 +512,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- edgeMap2[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ss, e))] = e;
+ edgeMap2[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))] = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -543,18 +542,18 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
FaceVertWeight *weight = (numVerts == 4) ? qweight : tweight;
int vertIdx[4];
for(S = 0; S < numVerts; S++) {
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
- vertIdx[S] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
+ vertIdx[S] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
}
DM_interp_vert_data(dm, result, vertIdx, weight[0][0], numVerts, i);
- VecCopyf(mvert->co, ccgSubSurf_getFaceCenterData(ss, f));
+ VecCopyf(mvert->co, ccgSubSurf_getFaceCenterData(f));
*origIndex = ORIGINDEX_NONE;
++mvert;
++origIndex;
@@ -613,10 +612,10 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int vertIdx[2];
CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
+ v = ccgSubSurf_getEdgeVert0(e);
+ vertIdx[0] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+ v = ccgSubSurf_getEdgeVert1(e);
+ vertIdx[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
for(x = 1; x < edgeSize - 1; x++) {
float w[2];
@@ -634,18 +633,17 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
edgeBase += edgeSize-2;
}
- vertBase = i;
for(index = 0; index < totvert; index++) {
CCGVert *v = vertMap2[index];
int vertIdx;
- vertIdx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
+ vertIdx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
DM_copy_vert_data(dm, result, vertIdx, i, 1);
VecCopyf(mvert->co, ccgSubSurf_getVertData(ss, v));
*((int*)ccgSubSurf_getVertUserData(ss, v)) = i;
- *origIndex = ccgDM_getVertMapIndex(NULL, ss, v);
+ *origIndex = ccgDM_getVertMapIndex(ss, v);
++mvert;
++origIndex;
i++;
@@ -658,7 +656,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
- int numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int numVerts = ccgSubSurf_getFaceNumVerts(f);
for(k = 0; k < numVerts; k++) {
for(x = 0; x < gridFaces; x++) {
@@ -701,9 +699,9 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
CCGEdge *e = edgeMap2[index];
unsigned int flags = 0;
char bweight = 0;
- int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ss, e));
+ int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e));
- if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
+ if(!ccgSubSurf_getEdgeNumFaces(e)) flags |= ME_LOOSEEDGE;
if(edgeIdx != -1 && dm) {
@@ -719,7 +717,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
med->v2 = getEdgeIndex(ss, e, x + 1, edgeSize);
med->flag = flags;
med->bweight = bweight;
- *origIndex = ccgDM_getEdgeMapIndex(NULL, ss, e);
+ *origIndex = ccgDM_getEdgeMapIndex(ss, e);
++med;
++origIndex;
i++;
@@ -733,10 +731,10 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
- int numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int numVerts = ccgSubSurf_getFaceNumVerts(f);
int mat_nr;
int flag;
- int mapIndex = ccgDM_getFaceMapIndex(NULL, ss, f);
+ int mapIndex = ccgDM_getFaceMapIndex(ss, f);
int faceIdx = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
if(!ssFromEditmesh) {
@@ -900,15 +898,15 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
/***/
-static int ccgDM_getVertMapIndex(CCGDerivedMesh *ccgdm, CCGSubSurf *ss, CCGVert *v) {
+static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v) {
return ((int*) ccgSubSurf_getVertUserData(ss, v))[1];
}
-static int ccgDM_getEdgeMapIndex(CCGDerivedMesh *ccgdm, CCGSubSurf *ss, CCGEdge *e) {
+static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e) {
return ((int*) ccgSubSurf_getEdgeUserData(ss, e))[1];
}
-static int ccgDM_getFaceMapIndex(CCGDerivedMesh *ccgdm, CCGSubSurf *ss, CCGFace *f) {
+static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f) {
return ((int*) ccgSubSurf_getFaceUserData(ss, f))[1];
}
@@ -941,7 +939,7 @@ static void ccgDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3]) {
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
for (S=0; S<numVerts; S++) {
VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
@@ -997,7 +995,7 @@ static void ccgDM_getFinalVert(DerivedMesh *dm, int vertNum, MVert *mv)
++i;
f = ccgdm->faceMap[i].face;
- numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ numVerts = ccgSubSurf_getFaceNumVerts(f);
gridSideVerts = gridSize - 2;
gridInternalVerts = gridSideVerts * gridSideVerts;
@@ -1007,7 +1005,7 @@ static void ccgDM_getFinalVert(DerivedMesh *dm, int vertNum, MVert *mv)
offset = vertNum - ccgdm->faceMap[i].startVert;
if(offset < 1) {
- VecCopyf(mv->co, ccgSubSurf_getFaceCenterData(ss, f));
+ VecCopyf(mv->co, ccgSubSurf_getFaceCenterData(f));
} else if(offset < gridSideEnd) {
offset -= 1;
grid = offset / gridSideVerts;
@@ -1069,7 +1067,7 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
++i;
f = ccgdm->faceMap[i].face;
- numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ numVerts = ccgSubSurf_getFaceNumVerts(f);
gridSideEdges = gridSize - 1;
gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
@@ -1105,7 +1103,7 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
e = ccgdm->edgeMap[i].edge;
- if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
+ if(!ccgSubSurf_getEdgeNumFaces(e)) flags |= ME_LOOSEEDGE;
x = edgeNum - ccgdm->edgeMap[i].startEdge;
@@ -1147,7 +1145,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
++i;
f = ccgdm->faceMap[i].face;
- numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ numVerts = ccgSubSurf_getFaceNumVerts(f);
offset = faceNum - ccgdm->faceMap[i].startFace;
grid = offset / gridFaces;
@@ -1177,9 +1175,9 @@ static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert)
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
CCGFace *f = ccgdm->faceMap[index].face;
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
- VecCopyf(mvert[i++].co, ccgSubSurf_getFaceCenterData(ss, f));
+ VecCopyf(mvert[i++].co, ccgSubSurf_getFaceCenterData(f));
for(S = 0; S < numVerts; S++) {
for(x = 1; x < gridSize - 1; x++) {
@@ -1232,7 +1230,7 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
CCGFace *f = ccgdm->faceMap[index].face;
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
for(S = 0; S < numVerts; S++) {
for(x = 0; x < gridSize - 1; x++) {
@@ -1276,9 +1274,9 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
CCGEdge *e = ccgdm->edgeMap[index].edge;
unsigned int flags = 0;
int x;
- int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ss, e));
+ int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e));
- if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
+ if(!ccgSubSurf_getEdgeNumFaces(e)) flags |= ME_LOOSEEDGE;
if(edgeFlags) {
if(edgeIdx != -1) {
@@ -1313,7 +1311,7 @@ static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, MFace *mface)
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
CCGFace *f = ccgdm->faceMap[index].face;
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
int mat_nr = 0;
int flag = ME_SMOOTH; /* assume face is smooth by default */
@@ -1360,7 +1358,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- vertMap2[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v))] = v;
+ vertMap2[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))] = v;
}
ccgVertIterator_free(vi);
@@ -1370,7 +1368,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
for (i=0; !ccgEdgeIterator_isStopped(ei); i++,ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- edgeMap2[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ss, e))] = e;
+ edgeMap2[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))] = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -1386,9 +1384,9 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
i = 0;
for (index=0; index<totface; index++) {
CCGFace *f = faceMap2[index];
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
- VecCopyf(cos[i++], ccgSubSurf_getFaceCenterData(ss, f));
+ VecCopyf(cos[i++], ccgSubSurf_getFaceCenterData(f));
for (S=0; S<numVerts; S++) {
for (x=1; x<gridSize-1; x++) {
@@ -1430,7 +1428,7 @@ static void ccgDM_foreachMappedVert(DerivedMesh *dm, void (*func)(void *userData
for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
VertData *vd = ccgSubSurf_getVertData(ccgdm->ss, v);
- int index = ccgDM_getVertMapIndex(ccgdm, ccgdm->ss, v);
+ int index = ccgDM_getVertMapIndex(ccgdm->ss, v);
if (index!=-1)
func(userData, index, vd->co, vd->no, NULL);
@@ -1447,7 +1445,7 @@ static void ccgDM_foreachMappedEdge(DerivedMesh *dm, void (*func)(void *userData
for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
- int index = ccgDM_getEdgeMapIndex(ccgdm, ss, e);
+ int index = ccgDM_getEdgeMapIndex(ss, e);
if (index!=-1) {
for (i=0; i<edgeSize-1; i++)
@@ -1488,9 +1486,9 @@ static void ccgDM_drawVerts(DerivedMesh *dm) {
fi = ccgSubSurf_getFaceIterator(ss);
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
- glVertex3fv(ccgSubSurf_getFaceCenterData(ss, f));
+ glVertex3fv(ccgSubSurf_getFaceCenterData(f));
for (S=0; S<numVerts; S++)
for (x=1; x<gridSize-1; x++)
glVertex3fv(ccgSubSurf_getFaceGridEdgeData(ss, f, S, x));
@@ -1517,7 +1515,7 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
- if (!drawLooseEdges && !ccgSubSurf_getEdgeNumFaces(ss, e))
+ if (!drawLooseEdges && !ccgSubSurf_getEdgeNumFaces(e))
continue;
if (useAging && !(G.f&G_BACKBUFSEL)) {
@@ -1540,7 +1538,7 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges) {
if (ccgdm->drawInteriorEdges) {
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
for (S=0; S<numVerts; S++) {
VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
@@ -1578,7 +1576,7 @@ static void ccgDM_drawLooseEdges(DerivedMesh *dm) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
- if (!ccgSubSurf_getEdgeNumFaces(ss, e)) {
+ if (!ccgSubSurf_getEdgeNumFaces(e)) {
glBegin(GL_LINE_STRIP);
for (i=0; i<edgeSize-1; i++) {
glVertex3fv(edgeData[i].co);
@@ -1615,7 +1613,7 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int, void *
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
int drawSmooth, mat_nr;
@@ -1723,9 +1721,9 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, v
CCGFace *f = ccgdm->faceMap[i].face;
int S, x, y, drawSmooth;
int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
- int origIndex = ccgDM_getFaceMapIndex(ccgdm, ss, f);
+ int origIndex = ccgDM_getFaceMapIndex(ss, f);
- numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ numVerts = ccgSubSurf_getFaceNumVerts(f);
if(faceFlags) {
drawSmooth = (faceFlags[index*4] & ME_SMOOTH);
@@ -1858,7 +1856,7 @@ static void ccgDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned ch
glBegin(GL_QUADS);
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
for (S=0; S<numVerts; S++) {
VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
@@ -1916,8 +1914,8 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
totface = ccgSubSurf_getNumFaces(ss);
for(i = 0; i < totface; i++) {
CCGFace *f = ccgdm->faceMap[i].face;
- int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
- int drawSmooth, index = ccgDM_getFaceMapIndex(ccgdm, ss, f);
+ int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
+ int drawSmooth, index = ccgDM_getFaceMapIndex(ss, f);
int origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
unsigned char *cp= NULL;
int mat_nr;
@@ -1999,28 +1997,28 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
glBegin(GL_QUADS);
for (y=0; y<gridFaces; y++) {
for (x=0; x<gridFaces; x++) {
- float *a = faceGridData[(y+0)*gridSize + x].co;
- float *b = faceGridData[(y+0)*gridSize + x + 1].co;
- float *c = faceGridData[(y+1)*gridSize + x + 1].co;
- float *d = faceGridData[(y+1)*gridSize + x].co;
+ float *a_co = faceGridData[(y+0)*gridSize + x].co;
+ float *b_co = faceGridData[(y+0)*gridSize + x + 1].co;
+ float *c_co = faceGridData[(y+1)*gridSize + x + 1].co;
+ float *d_co = faceGridData[(y+1)*gridSize + x].co;
- ccgDM_glNormalFast(a, b, c, d);
+ ccgDM_glNormalFast(a_co, b_co, c_co, d_co);
if(tf) glTexCoord2fv(tf->uv[1]);
if(cp) glColor3ub(cp[7], cp[6], cp[5]);
- glVertex3fv(d);
+ glVertex3fv(d_co);
if(tf) glTexCoord2fv(tf->uv[2]);
if(cp) glColor3ub(cp[11], cp[10], cp[9]);
- glVertex3fv(c);
+ glVertex3fv(c_co);
if(tf) glTexCoord2fv(tf->uv[3]);
if(cp) glColor3ub(cp[15], cp[14], cp[13]);
- glVertex3fv(b);
+ glVertex3fv(b_co);
if(tf) glTexCoord2fv(tf->uv[0]);
if(cp) glColor3ub(cp[3], cp[2], cp[1]);
- glVertex3fv(a);
+ glVertex3fv(a_co);
if(tf) tf++;
if(cp) cp += 16;
@@ -2084,8 +2082,8 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
for (i=0; !ccgFaceIterator_isStopped(fi); i++,ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
- int drawSmooth, index = ccgDM_getFaceMapIndex(ccgdm, ss, f);
+ int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
+ int drawSmooth, index = ccgDM_getFaceMapIndex(ss, f);
int origIndex;
origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
@@ -2166,7 +2164,7 @@ static void ccgDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *u
for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
- int index = ccgDM_getEdgeMapIndex(ccgdm, ss, e);
+ int index = ccgDM_getEdgeMapIndex(ss, e);
glBegin(GL_LINE_STRIP);
if (index!=-1 && (!setDrawOptions || setDrawOptions(userData, index))) {
@@ -2196,7 +2194,7 @@ static void ccgDM_drawMappedEdgesInterp(DerivedMesh *dm, int (*setDrawOptions)(v
for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
- int index = ccgDM_getEdgeMapIndex(ccgdm, ss, e);
+ int index = ccgDM_getEdgeMapIndex(ss, e);
glBegin(GL_LINE_STRIP);
if (index!=-1 && (!setDrawOptions || setDrawOptions(userData, index))) {
@@ -2223,7 +2221,7 @@ static void ccgDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *us
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- int index = ccgDM_getFaceMapIndex(ccgdm, ss, f);
+ int index = ccgDM_getFaceMapIndex(ss, f);
if (index!=-1) {
/* Face center data normal isn't updated atm. */
@@ -2259,17 +2257,17 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int index, totvert, totedge, totface;
int i;
int vertNum, edgeNum, faceNum;
- int *vertOrigIndex, *edgeOrigIndex, *faceOrigIndex;
+ int *vertOrigIndex, *faceOrigIndex; /* *edgeOrigIndex - as yet, unused */
int *edgeFlags;
char *faceFlags;
int edgeSize;
int gridSize;
int gridFaces;
int gridSideVerts;
- int gridInternalVerts;
+ /*int gridInternalVerts; - as yet unused */
int gridSideEdges;
int gridInternalEdges;
- MVert *mvert = NULL;
+ /* MVert *mvert = NULL; - as yet unused */
MEdge *medge = NULL;
MFace *mface = NULL;
FaceVertWeight *qweight, *tweight;
@@ -2333,7 +2331,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- ccgdm->vertMap[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v))].vert = v;
+ ccgdm->vertMap[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))].vert = v;
}
ccgVertIterator_free(vi);
@@ -2343,7 +2341,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- ccgdm->edgeMap[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ss, e))].edge = e;
+ ccgdm->edgeMap[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))].edge = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -2360,7 +2358,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
gridSize = ccgSubSurf_getGridSize(ss);
gridFaces = gridSize - 1;
gridSideVerts = gridSize - 2;
- gridInternalVerts = gridSideVerts * gridSideVerts;
+ /*gridInternalVerts = gridSideVerts * gridSideVerts; - as yet, unused */
gridSideEdges = gridSize - 1;
gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
@@ -2370,21 +2368,21 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
edgeNum = 0;
faceNum = 0;
- mvert = dm->getVertArray(dm);
+ /* mvert = dm->getVertArray(dm); - as yet unused */
medge = dm->getEdgeArray(dm);
mface = dm->getFaceArray(dm);
vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, CD_ORIGINDEX);
- edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, CD_ORIGINDEX);
+ /*edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, CD_ORIGINDEX);*/
faceOrigIndex = DM_get_face_data_layer(&ccgdm->dm, CD_ORIGINDEX);
faceFlags = DM_get_face_data_layer(&ccgdm->dm, CD_FLAGS);
for(index = 0; index < totface; ++index) {
CCGFace *f = ccgdm->faceMap[index].face;
- int numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+ int numVerts = ccgSubSurf_getFaceNumVerts(f);
int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges);
- int mapIndex = ccgDM_getFaceMapIndex(ccgdm, ss, f);
+ int mapIndex = ccgDM_getFaceMapIndex(ss, f);
int origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
FaceVertWeight *weight = (numVerts == 4) ? qweight : tweight;
int S, x, y;
@@ -2400,7 +2398,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
for(S = 0; S < numVerts; S++) {
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
- vertIdx[S] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
+ vertIdx[S] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
}
DM_interp_vert_data(dm, &ccgdm->dm, vertIdx, weight[0][0],
@@ -2503,16 +2501,16 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
for(index = 0; index < totedge; ++index) {
CCGEdge *e = ccgdm->edgeMap[index].edge;
int numFinalEdges = edgeSize - 1;
- int mapIndex = ccgDM_getEdgeMapIndex(ccgdm, ss, e);
+ int mapIndex = ccgDM_getEdgeMapIndex(ss, e);
int x;
int vertIdx[2];
- int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ss, e));
+ int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e));
CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
+ v = ccgSubSurf_getEdgeVert0(e);
+ vertIdx[0] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+ v = ccgSubSurf_getEdgeVert1(e);
+ vertIdx[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
ccgdm->edgeMap[index].startVert = vertNum;
ccgdm->edgeMap[index].startEdge = edgeNum;
@@ -2543,10 +2541,10 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
for(index = 0; index < totvert; ++index) {
CCGVert *v = ccgdm->vertMap[index].vert;
- int mapIndex = ccgDM_getVertMapIndex(ccgdm, ccgdm->ss, v);
+ int mapIndex = ccgDM_getVertMapIndex(ccgdm->ss, v);
int vertIdx;
- vertIdx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
+ vertIdx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
ccgdm->vertMap[index].startVert = vertNum;
@@ -2679,9 +2677,9 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
vi = ccgSubSurf_getVertIterator(ss);
for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- int idx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ss, v));
- int N = ccgSubSurf_getVertNumEdges(ss, v);
- int numFaces = ccgSubSurf_getVertNumFaces(ss, v);
+ int idx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+ int N = ccgSubSurf_getVertNumEdges(v);
+ int numFaces = ccgSubSurf_getVertNumFaces(v);
float *co;
int i;
@@ -2689,12 +2687,12 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
face_sum[0]= face_sum[1]= face_sum[2]= 0.0;
for (i=0; i<N; i++) {
- CCGEdge *e = ccgSubSurf_getVertEdge(ss, v, i);
+ CCGEdge *e = ccgSubSurf_getVertEdge(v, i);
VecAddf(edge_sum, edge_sum, ccgSubSurf_getEdgeData(ss, e, 1));
}
for (i=0; i<numFaces; i++) {
- CCGFace *f = ccgSubSurf_getVertFace(ss, v, i);
- VecAddf(face_sum, face_sum, ccgSubSurf_getFaceCenterData(ss, f));
+ CCGFace *f = ccgSubSurf_getVertFace(v, i);
+ VecAddf(face_sum, face_sum, ccgSubSurf_getFaceCenterData(f));
}
/* ad-hoc correction for boundary vertices, to at least avoid them
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 9e6efa59d71..d33721541f8 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -47,7 +47,9 @@
#include "BKE_global.h"
#include "BKE_main.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -158,7 +160,9 @@ void free_text(Text *text)
if(text->name) MEM_freeN(text->name);
MEM_freeN(text->undo_buf);
+#ifndef DISABLE_PYTHON
if (text->compiled) BPY_free_compiled_text(text);
+#endif
}
Text *add_empty_text(char *name)
@@ -571,7 +575,9 @@ int txt_get_span (TextLine *from, TextLine *to)
static void txt_make_dirty (Text *text)
{
text->flags |= TXT_ISDIRTY;
+#ifndef DISABLE_PYTHON
if (text->compiled) BPY_free_compiled_text(text);
+#endif
}
/* 0:whitespace, 1:punct, 2:alphanumeric */
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 814d6f8baf1..2e89ce3f805 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -54,7 +54,9 @@
#include "BKE_main.h"
#include "BKE_icons.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -64,9 +66,10 @@ void free_world(World *wrld)
{
MTex *mtex;
int a;
-
+
+#ifndef DISABLE_PYTHON
BPY_free_scriptlink(&wrld->scriptlink);
-
+#endif
for(a=0; a<MAX_MTEX; a++) {
mtex= wrld->mtex[a];
if(mtex && mtex->tex) mtex->tex->id.us--;
@@ -124,9 +127,9 @@ World *copy_world(World *wrld)
}
if (wrld->preview) wrldn->preview = BKE_previewimg_copy(wrld->preview);
-
+#ifndef DISABLE_PYTHON
BPY_copy_scriptlink(&wrld->scriptlink);
-
+#endif
id_us_plus((ID *)wrldn->ipo);
return wrldn;
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index 64af8258f80..cef6f802729 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -230,6 +230,10 @@ static const char** get_file_extensions(int format)
static const char * rv[] = { ".mkv", NULL };
return rv;
}
+ case FFMPEG_OGG: {
+ static const char * rv[] = { ".ogg", ".ogv", NULL };
+ return rv;
+ }
default:
return NULL;
}
@@ -251,14 +255,18 @@ static void write_video_frame(AVFrame* frame)
AVPacket packet;
av_init_packet(&packet);
+ if (c->coded_frame->pts != AV_NOPTS_VALUE) {
#ifdef FFMPEG_CODEC_TIME_BASE
- packet.pts = av_rescale_q(c->coded_frame->pts,
- c->time_base,
- video_stream->time_base);
+ packet.pts = av_rescale_q(c->coded_frame->pts,
+ c->time_base,
+ video_stream->time_base);
#else
- packet.pts = c->coded_frame->pts;
+ packet.pts = c->coded_frame->pts;
#endif
- fprintf(stderr, "Video Frame PTS: %lld\n", packet.pts);
+ fprintf(stderr, "Video Frame PTS: %lld\n", packet.pts);
+ } else {
+ fprintf(stderr, "Video Frame PTS: not set\n");
+ }
if (c->coded_frame->key_frame)
packet.flags |= PKT_FLAG_KEY;
packet.stream_index = video_stream->index;
@@ -669,6 +677,8 @@ void start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty)
switch(ffmpeg_type) {
case FFMPEG_AVI:
case FFMPEG_MOV:
+ case FFMPEG_OGG:
+ case FFMPEG_MKV:
fmt->video_codec = ffmpeg_codec;
break;
case FFMPEG_DV:
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index 6b38d7deadb..40e1dc1bb03 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -251,7 +251,7 @@ static int handle_request(char * req)
return -1;
}
-int frameserver_loop()
+int frameserver_loop(void)
{
fd_set readfds;
struct timeval tv;
diff --git a/source/blender/blenlib/BLI_arithb.h b/source/blender/blenlib/BLI_arithb.h
index e2e71a2fb1a..e4b983d9ba3 100644
--- a/source/blender/blenlib/BLI_arithb.h
+++ b/source/blender/blenlib/BLI_arithb.h
@@ -245,6 +245,7 @@ void VecMulf(float *v1, float f);
int VecLenCompare(float *v1, float *v2, float limit);
int VecCompare(float *v1, float *v2, float limit);
int VecEqual(float *v1, float *v2);
+int VecIsNull(float *v);
void printvecf(char *str,float v[3]);
void printvec4f(char *str, float v[4]);
@@ -265,6 +266,7 @@ void Vec2Copyf(float *v1, float *v2);
void Vec2Lerpf(float *target, float *a, float *b, float t);
void AxisAngleToQuat(float *q, float *axis, float angle);
+void RotationBetweenVectorsToQuat(float *q, float v1[3], float v2[3]);
void vectoquat(float *vec, short axis, short upflag, float *q);
float VecAngle2(float *v1, float *v2);
diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h
index aec77f5f385..c77e82f0a2b 100644
--- a/source/blender/blenlib/BLI_ghash.h
+++ b/source/blender/blenlib/BLI_ghash.h
@@ -34,7 +34,12 @@
struct GHash;
typedef struct GHash GHash;
-typedef struct GHashIterator GHashIterator;
+
+typedef struct GHashIterator {
+ GHash *gh;
+ int curBucket;
+ struct Entry *curEntry;
+} GHashIterator;
typedef unsigned int (*GHashHashFP) (void *key);
typedef int (*GHashCmpFP) (void *a, void *b);
@@ -63,6 +68,15 @@ int BLI_ghash_size (GHash *gh);
*/
GHashIterator* BLI_ghashIterator_new (GHash *gh);
/**
+ * Init an already allocated GHashIterator. The hash table must not
+ * be mutated while the iterator is in use, and the iterator will
+ * step exactly BLI_ghash_size(gh) times before becoming done.
+ *
+ * @param ghi The GHashIterator to initialize.
+ * @param gh The GHash to iterate over.
+ */
+void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh);
+ /**
* Free a GHashIterator.
*
* @param ghi The iterator to free.
diff --git a/source/blender/blenlib/BLI_graph.h b/source/blender/blenlib/BLI_graph.h
new file mode 100644
index 00000000000..160c2e04cf5
--- /dev/null
+++ b/source/blender/blenlib/BLI_graph.h
@@ -0,0 +1,125 @@
+#ifndef BLI_GRAPH_H_
+#define BLI_GRAPH_H_
+
+#include "DNA_listBase.h"
+
+struct BGraph;
+struct BNode;
+struct BArc;
+
+struct RadialArc;
+
+typedef void (*FreeArc)(struct BArc*);
+typedef void (*FreeNode)(struct BNode*);
+typedef void (*RadialSymmetry)(struct BNode* root_node, struct RadialArc* ring, int total);
+typedef void (*AxialSymmetry)(struct BNode* root_node, struct BNode* node1, struct BNode* node2, struct BArc* arc1, struct BArc* arc2);
+
+/* IF YOU MODIFY THOSE TYPES, YOU NEED TO UPDATE ALL THOSE THAT "INHERIT" FROM THEM
+ *
+ * RigGraph, ReebGraph
+ *
+ * */
+
+typedef struct BGraph {
+ ListBase arcs;
+ ListBase nodes;
+
+ float length;
+
+ /* function pointer to deal with custom fonctionnality */
+ FreeArc free_arc;
+ FreeNode free_node;
+ RadialSymmetry radial_symmetry;
+ AxialSymmetry axial_symmetry;
+} BGraph;
+
+typedef struct BNode {
+ void *next, *prev;
+ float p[3];
+ int flag;
+
+ int degree;
+ struct BArc **arcs;
+
+ int subgraph_index;
+
+ int symmetry_level;
+ int symmetry_flag;
+ float symmetry_axis[3];
+} BNode;
+
+typedef struct BArc {
+ void *next, *prev;
+ struct BNode *head, *tail;
+ int flag;
+
+ float length;
+
+ int symmetry_level;
+ int symmetry_group;
+ int symmetry_flag;
+} BArc;
+
+/* Helper structure for radial symmetry */
+typedef struct RadialArc
+{
+ struct BArc *arc;
+ float n[3]; /* normalized vector joining the nodes of the arc */
+} RadialArc;
+
+BNode *BLI_otherNode(BArc *arc, BNode *node);
+
+void BLI_freeNode(BGraph *graph, BNode *node);
+void BLI_removeNode(BGraph *graph, BNode *node);
+
+void BLI_removeArc(BGraph *graph, BArc *arc);
+
+void BLI_flagNodes(BGraph *graph, int flag);
+void BLI_flagArcs(BGraph *graph, int flag);
+
+int BLI_hasAdjacencyList(BGraph *rg);
+void BLI_buildAdjacencyList(BGraph *rg);
+void BLI_rebuildAdjacencyList(BGraph* rg);
+void BLI_rebuildAdjacencyListForNode(BGraph* rg, BNode *node);
+void BLI_freeAdjacencyList(BGraph *rg);
+
+int BLI_FlagSubgraphs(BGraph *graph);
+void BLI_ReflagSubgraph(BGraph *graph, int old_subgraph, int new_subgraph);
+
+#define SHAPE_RADIX 10 /* each shape level is encoded this base */
+
+int BLI_subtreeShape(BGraph *graph, BNode *node, BArc *rootArc, int include_root);
+float BLI_subtreeLength(BNode *node);
+void BLI_calcGraphLength(BGraph *graph);
+
+void BLI_replaceNode(BGraph *graph, BNode *node_src, BNode *node_replaced);
+void BLI_replaceNodeInArc(BGraph *graph, BArc *arc, BNode *node_src, BNode *node_replaced);
+void BLI_removeDoubleNodes(BGraph *graph, float limit);
+BNode * BLI_FindNodeByPosition(BGraph *graph, float *p, float limit);
+
+BArc * BLI_findConnectedArc(BGraph *graph, BArc *arc, BNode *v);
+
+int BLI_isGraphCyclic(BGraph *graph);
+
+/*------------ Symmetry handling ------------*/
+void BLI_markdownSymmetry(BGraph *graph, BNode *root_node, float limit);
+
+void BLI_mirrorAlongAxis(float v[3], float center[3], float axis[3]);
+
+/* BNode symmetry flags */
+#define SYM_TOPOLOGICAL 1
+#define SYM_PHYSICAL 2
+
+/* the following two are exclusive */
+#define SYM_AXIAL 4
+#define SYM_RADIAL 8
+
+/* BArc symmetry flags
+ *
+ * axial symetry sides */
+#define SYM_SIDE_POSITIVE 1
+#define SYM_SIDE_NEGATIVE 2
+/* Anything higher is the order in radial symmetry */
+#define SYM_SIDE_RADIAL 3
+
+#endif /*BLI_GRAPH_H_*/
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index 39162b8bd91..5a7e84c42fb 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -39,17 +39,41 @@
#define BLENDER_MAX_THREADS 8
struct ListBase;
-
void BLI_init_threads (struct ListBase *threadbase, void *(*do_thread)(void *), int tot);
int BLI_available_threads(struct ListBase *threadbase);
int BLI_available_thread_index(struct ListBase *threadbase);
void BLI_insert_thread (struct ListBase *threadbase, void *callerdata);
void BLI_remove_thread (struct ListBase *threadbase, void *callerdata);
+void BLI_remove_thread_index(struct ListBase *threadbase, int index);
+void BLI_remove_threads(struct ListBase *threadbase);
void BLI_end_threads (struct ListBase *threadbase);
void BLI_lock_thread (int type);
void BLI_unlock_thread (int type);
int BLI_system_thread_count( void ); /* gets the number of threads the system can make use of */
+
+/* ThreadedWorker is a simple tool for dispatching work to a limited number of threads in a transparent
+ * fashion from the caller's perspective
+ * */
+
+struct ThreadedWorker;
+
+/* Create a new worker supporting tot parallel threads.
+ * When new work in inserted and all threads are busy, sleep(sleep_time) before checking again
+ */
+struct ThreadedWorker *BLI_create_worker(void *(*do_thread)(void *), int tot, int sleep_time);
+
+/* join all working threads */
+void BLI_end_worker(struct ThreadedWorker *worker);
+
+/* also ends all working threads */
+void BLI_destroy_worker(struct ThreadedWorker *worker);
+
+/* Spawns a new work thread if possible, sleeps until one is available otherwise
+ * NOTE: inserting work is NOT thread safe, so make sure it is only done from one thread */
+void BLI_insert_work(struct ThreadedWorker *worker, void *param);
+
+
#endif
diff --git a/source/blender/blenlib/SConscript b/source/blender/blenlib/SConscript
index 65cebf02f62..e7a4f2eaf13 100644
--- a/source/blender/blenlib/SConscript
+++ b/source/blender/blenlib/SConscript
@@ -10,7 +10,7 @@ incs += ' ' + env['BF_ZLIB_INC']
incs += ' ' + env['BF_SDL_INC']
defs = ''
-if env['WITH_BF_INTERNATIONAL'] == 1:
+if env['WITH_BF_INTERNATIONAL']:
defs = 'WITH_FREETYPE2'
if env['WITH_BF_VERSE']:
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index e9271ca3bb5..1967b8a88e2 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -200,12 +200,6 @@ void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreef
/***/
-struct GHashIterator {
- GHash *gh;
- int curBucket;
- Entry *curEntry;
-};
-
GHashIterator *BLI_ghashIterator_new(GHash *gh) {
GHashIterator *ghi= malloc(sizeof(*ghi));
ghi->gh= gh;
@@ -219,6 +213,17 @@ GHashIterator *BLI_ghashIterator_new(GHash *gh) {
}
return ghi;
}
+void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh) {
+ ghi->gh= gh;
+ ghi->curEntry= NULL;
+ ghi->curBucket= -1;
+ while (!ghi->curEntry) {
+ ghi->curBucket++;
+ if (ghi->curBucket==ghi->gh->nbuckets)
+ break;
+ ghi->curEntry= ghi->gh->buckets[ghi->curBucket];
+ }
+}
void BLI_ghashIterator_free(GHashIterator *ghi) {
free(ghi);
}
diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c
index 888a5ab2f64..149d3cf1f8f 100644
--- a/source/blender/blenlib/intern/arithb.c
+++ b/source/blender/blenlib/intern/arithb.c
@@ -1371,6 +1371,18 @@ void NormalQuat(float *q)
}
}
+void RotationBetweenVectorsToQuat(float *q, float v1[3], float v2[3])
+{
+ float axis[3];
+ float angle;
+
+ Crossf(axis, v1, v2);
+
+ angle = NormalizedVecAngle2(v1, v2);
+
+ AxisAngleToQuat(q, axis, angle);
+}
+
void AxisAngleToQuat(float *q, float *axis, float angle)
{
float nor[3];
@@ -2219,6 +2231,11 @@ int VecEqual(float *v1, float *v2)
return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]));
}
+int VecIsNull(float *v)
+{
+ return (v[0] == 0 && v[1] == 0 && v[2] == 0);
+}
+
void CalcNormShort( short *v1, short *v2, short *v3, float *n) /* is also cross product */
{
float n1[3],n2[3];
@@ -2503,7 +2520,7 @@ short IsectLL2Df(float *v1, float *v2, float *v3, float *v4)
1: intersection
*/
-short IsectLLPt2Df(float x0,float y0,float x1,float y1,
+static short IsectLLPt2Df(float x0,float y0,float x1,float y1,
float x2,float y2,float x3,float y3, float *xi,float *yi)
{
@@ -2553,29 +2570,47 @@ short IsectLLPt2Df(float x0,float y0,float x1,float y1,
} // end Intersect_Lines
#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
-#define ISECT_EPSILON 1e-6
-
/* point in tri */
int IsectPT2Df(float pt[2], float v1[2], float v2[2], float v3[2])
{
- if ((SIDE_OF_LINE(v1,v2,pt)>=-ISECT_EPSILON) &&
- (SIDE_OF_LINE(v2,v3,pt)>=-ISECT_EPSILON) &&
- (SIDE_OF_LINE(v3,v1,pt)>=-ISECT_EPSILON))
- return 1;
- else {
- return 0;
+ if (SIDE_OF_LINE(v1,v2,pt)>=0.0) {
+ if (SIDE_OF_LINE(v2,v3,pt)>=0.0) {
+ if (SIDE_OF_LINE(v3,v1,pt)>=0.0) {
+ return 1;
+ }
+ }
+ } else {
+ if (! (SIDE_OF_LINE(v2,v3,pt)>=0.0) ) {
+ if (! (SIDE_OF_LINE(v3,v1,pt)>=0.0)) {
+ return -1;
+ }
+ }
}
+
+ return 0;
}
/* point in quad - only convex quads */
int IsectPQ2Df(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2])
{
- if ((SIDE_OF_LINE(v1,v2,pt)>=-ISECT_EPSILON) &&
- (SIDE_OF_LINE(v2,v3,pt)>=-ISECT_EPSILON) &&
- (SIDE_OF_LINE(v3,v4,pt)>=-ISECT_EPSILON) &&
- (SIDE_OF_LINE(v4,v1,pt)>=-ISECT_EPSILON))
- return 1;
- else
- return 0;
+ if (SIDE_OF_LINE(v1,v2,pt)>=0.0) {
+ if (SIDE_OF_LINE(v2,v3,pt)>=0.0) {
+ if (SIDE_OF_LINE(v3,v4,pt)>=0.0) {
+ if (SIDE_OF_LINE(v4,v1,pt)>=0.0) {
+ return 1;
+ }
+ }
+ }
+ } else {
+ if (! (SIDE_OF_LINE(v2,v3,pt)>=0.0) ) {
+ if (! (SIDE_OF_LINE(v3,v4,pt)>=0.0)) {
+ if (! (SIDE_OF_LINE(v4,v1,pt)>=0.0)) {
+ return -1;
+ }
+ }
+ }
+ }
+
+ return 0;
}
@@ -3508,7 +3543,7 @@ int constrain_rgb(float *r, float *g, float *b)
Parameter Values for the HDTV Standard for the Studio and
for International Programme Exchange'', formerly CCIR Rec.
709.*/
-void gamma_correct(float *c)
+static void gamma_correct(float *c)
{
/* Rec. 709 gamma correction. */
float cc = 0.018;
@@ -3614,6 +3649,8 @@ void spheremap(float x, float y, float z, float *u, float *v)
/* ------------------------------------------------------------------------- */
+/* proposed api by ton and zr, not used yet */
+#if 0
/* ***************** m1 = m2 ***************** */
void cpy_m3_m3(float m1[][3], float m2[][3])
{
@@ -3637,7 +3674,6 @@ void ident_m4(float m[][4])
m[3][0]= m[3][1]= m[3][2]= 0.0;
}
-
/* ***************** m1 = m2 (pre) * m3 (post) ***************** */
void mul_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
{
@@ -3775,6 +3811,8 @@ void mul_v3_v3m4(float *v1, float *v2, float mat[][4])
}
+#endif
+
/* moved from effect.c
test if the line starting at p1 ending at p2 intersects the triangle v0..v2
return non zero if it does
@@ -4222,7 +4260,7 @@ float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3])
}
/* little sister we only need to know lambda */
-float lambda_cp_line(float p[3], float l1[3], float l2[3])
+static float lambda_cp_line(float p[3], float l1[3], float l2[3])
{
float h[3],u[3];
VecSubf(u, l2, l1);
@@ -4381,7 +4419,7 @@ void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, floa
v[2]= 3*a[2]*t2 + 2*b[2]*t + v1[2];
}
-int point_in_slice(float p[3], float v1[3], float l1[3], float l2[3])
+static int point_in_slice(float p[3], float v1[3], float l1[3], float l2[3])
{
/*
what is a slice ?
@@ -4408,7 +4446,7 @@ but see a 'spat' which is a deformed cube with paired parallel planes needs only
/*adult sister defining the slice planes by the origin and the normal
NOTE |normal| may not be 1 but defining the thickness of the slice*/
-int point_in_slice_as(float p[3],float origin[3],float normal[3])
+static int point_in_slice_as(float p[3],float origin[3],float normal[3])
{
float h,rp[3];
VecSubf(rp,p,origin);
@@ -4418,7 +4456,7 @@ int point_in_slice_as(float p[3],float origin[3],float normal[3])
}
/*mama (knowing the squared lenght of the normal)*/
-int point_in_slice_m(float p[3],float origin[3],float normal[3],float lns)
+static int point_in_slice_m(float p[3],float origin[3],float normal[3],float lns)
{
float h,rp[3];
VecSubf(rp,p,origin);
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index 898ad6ddd67..e23c2658399 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -254,7 +254,7 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
return NULL;
}
-void seq_getpath(struct BPathIterator *bpi, char *path) {
+static void seq_getpath(struct BPathIterator *bpi, char *path) {
Sequence *seq = (Sequence *)bpi->data;
@@ -275,7 +275,7 @@ void seq_getpath(struct BPathIterator *bpi, char *path) {
}
}
-void seq_setpath(struct BPathIterator *bpi, char *path) {
+static void seq_setpath(struct BPathIterator *bpi, char *path) {
Sequence *seq = (Sequence *)bpi->data;
if (seq==NULL) return;
@@ -456,7 +456,6 @@ void checkMissingFiles( char *txtname ) {
/* be sure there is low chance of the path being too short */
char filepath_expanded[FILE_MAXDIR*2];
- int files_missing = 0;
BLI_bpathIterator_init(&bpi);
while (!BLI_bpathIterator_isDone(&bpi)) {
@@ -470,7 +469,6 @@ void checkMissingFiles( char *txtname ) {
}
}
bpathToText(btxt, &bpi);
- files_missing = 1;
}
BLI_bpathIterator_step(&bpi);
}
diff --git a/source/blender/blenlib/intern/dynlib.c b/source/blender/blenlib/intern/dynlib.c
index e7fa3332f43..858aa6e60bf 100644
--- a/source/blender/blenlib/intern/dynlib.c
+++ b/source/blender/blenlib/intern/dynlib.c
@@ -78,10 +78,7 @@ char *PIL_dynlib_get_error_as_string(PILdynlib* lib) {
/* if lib is NULL reset the last error code */
err= GetLastError();
- if (!lib) {
- SetLastError(ERROR_SUCCESS);
- err = ERROR_SUCCESS;
- }
+ if (!lib) SetLastError(ERROR_SUCCESS);
if (err) {
static char buf[1024];
@@ -96,7 +93,7 @@ char *PIL_dynlib_get_error_as_string(PILdynlib* lib) {
return buf;
}
- return "unrecognized error";
+ return err;
}
void PIL_dynlib_close(PILdynlib *lib) {
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index 2acbbbe6712..ebd8f4be1cf 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -95,12 +95,12 @@ char *BLI_last_slash(const char *string) {
void BLI_add_slash(char *string) {
int len = strlen(string);
#ifdef WIN32
- if (string[len-1]!='\\') {
+ if (len==0 || string[len-1]!='\\') {
string[len] = '\\';
string[len+1] = '\0';
}
#else
- if (string[len-1]!='/') {
+ if (len==0 || string[len-1]!='/') {
string[len] = '/';
string[len+1] = '\0';
}
@@ -303,7 +303,8 @@ void BLI_recurdir_fileops(char *dirname) {
int BLI_rename(char *from, char *to) {
if (!BLI_exists(from)) return 0;
- if (BLI_exists(to))
+ /* make sure the filenames are different (case insensitive) before removing */
+ if (BLI_exists(to) && BLI_strcasecmp(from, to))
if(BLI_delete(to, 0, 0)) return 1;
return rename(from, to);
diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c
new file mode 100644
index 00000000000..8f35b38379e
--- /dev/null
+++ b/source/blender/blenlib/intern/graph.c
@@ -0,0 +1,1087 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Martin Poirier
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * graph.c: Common graph interface and methods
+ */
+
+#include <float.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_graph.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "BKE_utildefines.h"
+
+static void testRadialSymmetry(BGraph *graph, BNode* root_node, RadialArc* ring, int total, float axis[3], float limit, int group);
+
+static void handleAxialSymmetry(BGraph *graph, BNode *root_node, int depth, float axis[3], float limit);
+static void testAxialSymmetry(BGraph *graph, BNode* root_node, BNode* node1, BNode* node2, BArc* arc1, BArc* arc2, float axis[3], float limit, int group);
+static void flagAxialSymmetry(BNode *root_node, BNode *end_node, BArc *arc, int group);
+
+void BLI_freeNode(BGraph *graph, BNode *node)
+{
+ if (node->arcs)
+ {
+ MEM_freeN(node->arcs);
+ }
+
+ if (graph->free_node)
+ {
+ graph->free_node(node);
+ }
+}
+
+void BLI_removeNode(BGraph *graph, BNode *node)
+{
+ BLI_freeNode(graph, node);
+ BLI_freelinkN(&graph->nodes, node);
+}
+
+BNode *BLI_otherNode(BArc *arc, BNode *node)
+{
+ return (arc->head == node) ? arc->tail : arc->head;
+}
+
+void BLI_removeArc(BGraph *graph, BArc *arc)
+{
+ if (graph->free_arc)
+ {
+ graph->free_arc(arc);
+ }
+
+ BLI_freelinkN(&graph->arcs, arc);
+}
+
+void BLI_flagNodes(BGraph *graph, int flag)
+{
+ BNode *node;
+
+ for(node = graph->nodes.first; node; node = node->next)
+ {
+ node->flag = flag;
+ }
+}
+
+void BLI_flagArcs(BGraph *graph, int flag)
+{
+ BArc *arc;
+
+ for(arc = graph->arcs.first; arc; arc = arc->next)
+ {
+ arc->flag = flag;
+ }
+}
+
+static void addArcToNodeAdjacencyList(BNode *node, BArc *arc)
+{
+ node->arcs[node->flag] = arc;
+ node->flag++;
+}
+
+void BLI_buildAdjacencyList(BGraph *graph)
+{
+ BNode *node;
+ BArc *arc;
+
+ for(node = graph->nodes.first; node; node = node->next)
+ {
+ if (node->arcs != NULL)
+ {
+ MEM_freeN(node->arcs);
+ }
+
+ node->arcs = MEM_callocN((node->degree) * sizeof(BArc*), "adjacency list");
+
+ /* temporary use to indicate the first index available in the lists */
+ node->flag = 0;
+ }
+
+ for(arc = graph->arcs.first; arc; arc= arc->next)
+ {
+ addArcToNodeAdjacencyList(arc->head, arc);
+ addArcToNodeAdjacencyList(arc->tail, arc);
+ }
+
+ for(node = graph->nodes.first; node; node = node->next)
+ {
+ if (node->degree != node->flag)
+ {
+ printf("error in node [%p]. Added only %i arcs out of %i\n", node, node->flag, node->degree);
+ }
+ }
+}
+
+void BLI_rebuildAdjacencyListForNode(BGraph* graph, BNode *node)
+{
+ BArc *arc;
+
+ if (node->arcs != NULL)
+ {
+ MEM_freeN(node->arcs);
+ }
+
+ node->arcs = MEM_callocN((node->degree) * sizeof(BArc*), "adjacency list");
+
+ /* temporary use to indicate the first index available in the lists */
+ node->flag = 0;
+
+ for(arc = graph->arcs.first; arc; arc= arc->next)
+ {
+ if (arc->head == node)
+ {
+ addArcToNodeAdjacencyList(arc->head, arc);
+ }
+ else if (arc->tail == node)
+ {
+ addArcToNodeAdjacencyList(arc->tail, arc);
+ }
+ }
+
+ if (node->degree != node->flag)
+ {
+ printf("error in node [%p]. Added only %i arcs out of %i\n", node, node->flag, node->degree);
+ }
+}
+
+void BLI_freeAdjacencyList(BGraph *graph)
+{
+ BNode *node;
+
+ for(node = graph->nodes.first; node; node = node->next)
+ {
+ if (node->arcs != NULL)
+ {
+ MEM_freeN(node->arcs);
+ node->arcs = NULL;
+ }
+ }
+}
+
+int BLI_hasAdjacencyList(BGraph *graph)
+{
+ BNode *node;
+
+ for(node = graph->nodes.first; node; node = node->next)
+ {
+ if (node->arcs == NULL)
+ {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+void BLI_replaceNodeInArc(BGraph *graph, BArc *arc, BNode *node_src, BNode *node_replaced)
+{
+ if (arc->head == node_replaced)
+ {
+ arc->head = node_src;
+ node_src->degree++;
+ }
+
+ if (arc->tail == node_replaced)
+ {
+ arc->tail = node_src;
+ node_src->degree++;
+ }
+
+ if (arc->head == arc->tail)
+ {
+ node_src->degree -= 2;
+
+ graph->free_arc(arc);
+ BLI_freelinkN(&graph->arcs, arc);
+ }
+
+ if (node_replaced->degree == 0)
+ {
+ BLI_removeNode(graph, node_replaced);
+ }
+}
+
+void BLI_replaceNode(BGraph *graph, BNode *node_src, BNode *node_replaced)
+{
+ BArc *arc, *next_arc;
+
+ for (arc = graph->arcs.first; arc; arc = next_arc)
+ {
+ next_arc = arc->next;
+
+ if (arc->head == node_replaced)
+ {
+ arc->head = node_src;
+ node_replaced->degree--;
+ node_src->degree++;
+ }
+
+ if (arc->tail == node_replaced)
+ {
+ arc->tail = node_src;
+ node_replaced->degree--;
+ node_src->degree++;
+ }
+
+ if (arc->head == arc->tail)
+ {
+ node_src->degree -= 2;
+
+ graph->free_arc(arc);
+ BLI_freelinkN(&graph->arcs, arc);
+ }
+ }
+
+ if (node_replaced->degree == 0)
+ {
+ BLI_removeNode(graph, node_replaced);
+ }
+}
+
+void BLI_removeDoubleNodes(BGraph *graph, float limit)
+{
+ BNode *node_src, *node_replaced;
+
+ for(node_src = graph->nodes.first; node_src; node_src = node_src->next)
+ {
+ for(node_replaced = graph->nodes.first; node_replaced; node_replaced = node_replaced->next)
+ {
+ if (node_replaced != node_src && VecLenf(node_replaced->p, node_src->p) <= limit)
+ {
+ BLI_replaceNode(graph, node_src, node_replaced);
+ }
+ }
+ }
+
+}
+
+BNode * BLI_FindNodeByPosition(BGraph *graph, float *p, float limit)
+{
+ BNode *closest_node = NULL, *node;
+ float min_distance;
+
+ for(node = graph->nodes.first; node; node = node->next)
+ {
+ float distance = VecLenf(p, node->p);
+ if (distance <= limit && (closest_node == NULL || distance < min_distance))
+ {
+ closest_node = node;
+ min_distance = distance;
+ }
+ }
+
+ return closest_node;
+}
+/************************************* SUBGRAPH DETECTION **********************************************/
+
+void flagSubgraph(BNode *node, int subgraph)
+{
+ if (node->subgraph_index == 0)
+ {
+ BArc *arc;
+ int i;
+
+ node->subgraph_index = subgraph;
+
+ for(i = 0; i < node->degree; i++)
+ {
+ arc = node->arcs[i];
+ flagSubgraph(BLI_otherNode(arc, node), subgraph);
+ }
+ }
+}
+
+int BLI_FlagSubgraphs(BGraph *graph)
+{
+ BNode *node;
+ int subgraph = 0;
+
+ if (BLI_hasAdjacencyList(graph) == 0)
+ {
+ BLI_buildAdjacencyList(graph);
+ }
+
+ for(node = graph->nodes.first; node; node = node->next)
+ {
+ node->subgraph_index = 0;
+ }
+
+ for (node = graph->nodes.first; node; node = node->next)
+ {
+ if (node->subgraph_index == 0)
+ {
+ subgraph++;
+ flagSubgraph(node, subgraph);
+ }
+ }
+
+ return subgraph;
+}
+
+void BLI_ReflagSubgraph(BGraph *graph, int old_subgraph, int new_subgraph)
+{
+ BNode *node;
+
+ for (node = graph->nodes.first; node; node = node->next)
+ {
+ if (node->flag == old_subgraph)
+ {
+ node->flag = new_subgraph;
+ }
+ }
+}
+
+/*************************************** CYCLE DETECTION ***********************************************/
+
+int detectCycle(BNode *node, BArc *src_arc)
+{
+ int value = 0;
+
+ if (node->flag == 0)
+ {
+ int i;
+
+ /* mark node as visited */
+ node->flag = 1;
+
+ for(i = 0; i < node->degree && value == 0; i++)
+ {
+ BArc *arc = node->arcs[i];
+
+ /* don't go back on the source arc */
+ if (arc != src_arc)
+ {
+ value = detectCycle(BLI_otherNode(arc, node), arc);
+ }
+ }
+ }
+ else
+ {
+ value = 1;
+ }
+
+ return value;
+}
+
+int BLI_isGraphCyclic(BGraph *graph)
+{
+ BNode *node;
+ int value = 0;
+
+ /* NEED TO CHECK IF ADJACENCY LIST EXIST */
+
+ /* Mark all nodes as not visited */
+ BLI_flagNodes(graph, 0);
+
+ /* detectCycles in subgraphs */
+ for(node = graph->nodes.first; node && value == 0; node = node->next)
+ {
+ /* only for nodes in subgraphs that haven't been visited yet */
+ if (node->flag == 0)
+ {
+ value = value || detectCycle(node, NULL);
+ }
+ }
+
+ return value;
+}
+
+BArc * BLI_findConnectedArc(BGraph *graph, BArc *arc, BNode *v)
+{
+ BArc *nextArc = arc->next;
+
+ for(nextArc = graph->arcs.first; nextArc; nextArc = nextArc->next)
+ {
+ if (arc != nextArc && (nextArc->head == v || nextArc->tail == v))
+ {
+ break;
+ }
+ }
+
+ return nextArc;
+}
+
+/*********************************** GRAPH AS TREE FUNCTIONS *******************************************/
+
+int subtreeShape(BNode *node, BArc *rootArc, int include_root)
+{
+ int depth = 0;
+
+ node->flag = 1;
+
+ if (include_root)
+ {
+ BNode *newNode = BLI_otherNode(rootArc, node);
+ return subtreeShape(newNode, rootArc, 0);
+ }
+ else
+ {
+ /* Base case, no arcs leading away */
+ if (node->arcs == NULL || *(node->arcs) == NULL)
+ {
+ return 0;
+ }
+ else
+ {
+ int i;
+
+ for(i = 0; i < node->degree; i++)
+ {
+ BArc *arc = node->arcs[i];
+ BNode *newNode = BLI_otherNode(arc, node);
+
+ /* stop immediate and cyclic backtracking */
+ if (arc != rootArc && newNode->flag == 0)
+ {
+ depth += subtreeShape(newNode, arc, 0);
+ }
+ }
+ }
+
+ return SHAPE_RADIX * depth + 1;
+ }
+}
+
+int BLI_subtreeShape(BGraph *graph, BNode *node, BArc *rootArc, int include_root)
+{
+ BNode *test_node;
+
+ BLI_flagNodes(graph, 0);
+ return subtreeShape(node, rootArc, include_root);
+}
+
+float BLI_subtreeLength(BNode *node)
+{
+ float length = 0;
+ int i;
+
+ node->flag = 0; /* flag node as visited */
+
+ for(i = 0; i < node->degree; i++)
+ {
+ BArc *arc = node->arcs[i];
+ BNode *other_node = BLI_otherNode(arc, node);
+
+ if (other_node->flag != 0)
+ {
+ float subgraph_length = arc->length + BLI_subtreeLength(other_node);
+ length = MAX2(length, subgraph_length);
+ }
+ }
+
+ return length;
+}
+
+void BLI_calcGraphLength(BGraph *graph)
+{
+ float length = 0;
+ int nb_subgraphs;
+ int i;
+
+ nb_subgraphs = BLI_FlagSubgraphs(graph);
+
+ for (i = 1; i <= nb_subgraphs; i++)
+ {
+ BNode *node;
+
+ for (node = graph->nodes.first; node; node = node->next)
+ {
+ /* start on an external node of the subgraph */
+ if (node->subgraph_index == i && node->degree == 1)
+ {
+ float subgraph_length = BLI_subtreeLength(node);
+ length = MAX2(length, subgraph_length);
+ break;
+ }
+ }
+ }
+
+ graph->length = length;
+}
+
+/********************************* SYMMETRY DETECTION **************************************************/
+
+void markdownSymmetryArc(BGraph *graph, BArc *arc, BNode *node, int level, float limit);
+
+void BLI_mirrorAlongAxis(float v[3], float center[3], float axis[3])
+{
+ float dv[3], pv[3];
+
+ VecSubf(dv, v, center);
+ Projf(pv, dv, axis);
+ VecMulf(pv, -2);
+ VecAddf(v, v, pv);
+}
+
+static void testRadialSymmetry(BGraph *graph, BNode* root_node, RadialArc* ring, int total, float axis[3], float limit, int group)
+{
+ int symmetric = 1;
+ int i;
+
+ /* sort ring by angle */
+ for (i = 0; i < total - 1; i++)
+ {
+ float minAngle = FLT_MAX;
+ int minIndex = -1;
+ int j;
+
+ for (j = i + 1; j < total; j++)
+ {
+ float angle = Inpf(ring[i].n, ring[j].n);
+
+ /* map negative values to 1..2 */
+ if (angle < 0)
+ {
+ angle = 1 - angle;
+ }
+
+ if (angle < minAngle)
+ {
+ minIndex = j;
+ minAngle = angle;
+ }
+ }
+
+ /* swap if needed */
+ if (minIndex != i + 1)
+ {
+ RadialArc tmp;
+ tmp = ring[i + 1];
+ ring[i + 1] = ring[minIndex];
+ ring[minIndex] = tmp;
+ }
+ }
+
+ for (i = 0; i < total && symmetric; i++)
+ {
+ BNode *node1, *node2;
+ float tangent[3];
+ float normal[3];
+ float p[3];
+ int j = (i + 1) % total; /* next arc in the circular list */
+
+ VecAddf(tangent, ring[i].n, ring[j].n);
+ Crossf(normal, tangent, axis);
+
+ node1 = BLI_otherNode(ring[i].arc, root_node);
+ node2 = BLI_otherNode(ring[j].arc, root_node);
+
+ VECCOPY(p, node2->p);
+ BLI_mirrorAlongAxis(p, root_node->p, normal);
+
+ /* check if it's within limit before continuing */
+ if (VecLenf(node1->p, p) > limit)
+ {
+ symmetric = 0;
+ }
+
+ }
+
+ if (symmetric)
+ {
+ /* mark node as symmetric physically */
+ VECCOPY(root_node->symmetry_axis, axis);
+ root_node->symmetry_flag |= SYM_PHYSICAL;
+ root_node->symmetry_flag |= SYM_RADIAL;
+
+ /* FLAG SYMMETRY GROUP */
+ for (i = 0; i < total; i++)
+ {
+ ring[i].arc->symmetry_group = group;
+ ring[i].arc->symmetry_flag = SYM_SIDE_RADIAL + i;
+ }
+
+ if (graph->radial_symmetry)
+ {
+ graph->radial_symmetry(root_node, ring, total);
+ }
+ }
+}
+
+static void handleRadialSymmetry(BGraph *graph, BNode *root_node, int depth, float axis[3], float limit)
+{
+ RadialArc *ring = NULL;
+ RadialArc *unit;
+ int total = 0;
+ int group;
+ int first;
+ int i;
+
+ /* mark topological symmetry */
+ root_node->symmetry_flag |= SYM_TOPOLOGICAL;
+
+ /* total the number of arcs in the symmetry ring */
+ for (i = 0; i < root_node->degree; i++)
+ {
+ BArc *connectedArc = root_node->arcs[i];
+
+ /* depth is store as a negative in flag. symmetry level is positive */
+ if (connectedArc->symmetry_level == -depth)
+ {
+ total++;
+ }
+ }
+
+ ring = MEM_callocN(sizeof(RadialArc) * total, "radial symmetry ring");
+ unit = ring;
+
+ /* fill in the ring */
+ for (unit = ring, i = 0; i < root_node->degree; i++)
+ {
+ BArc *connectedArc = root_node->arcs[i];
+
+ /* depth is store as a negative in flag. symmetry level is positive */
+ if (connectedArc->symmetry_level == -depth)
+ {
+ BNode *otherNode = BLI_otherNode(connectedArc, root_node);
+ float vec[3];
+
+ unit->arc = connectedArc;
+
+ /* project the node to node vector on the symmetry plane */
+ VecSubf(unit->n, otherNode->p, root_node->p);
+ Projf(vec, unit->n, axis);
+ VecSubf(unit->n, unit->n, vec);
+
+ Normalize(unit->n);
+
+ unit++;
+ }
+ }
+
+ /* sort ring by arc length
+ * using a rather bogus insertion sort
+ * butrings will never get too big to matter
+ * */
+ for (i = 0; i < total; i++)
+ {
+ int j;
+
+ for (j = i - 1; j >= 0; j--)
+ {
+ BArc *arc1, *arc2;
+
+ arc1 = ring[j].arc;
+ arc2 = ring[j + 1].arc;
+
+ if (arc1->length > arc2->length)
+ {
+ /* swap with smaller */
+ RadialArc tmp;
+
+ tmp = ring[j + 1];
+ ring[j + 1] = ring[j];
+ ring[j] = tmp;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+
+ /* Dispatch to specific symmetry tests */
+ first = 0;
+ group = 0;
+
+ for (i = 1; i < total; i++)
+ {
+ int dispatch = 0;
+ int last = i - 1;
+
+ if (fabs(ring[first].arc->length - ring[i].arc->length) > limit)
+ {
+ dispatch = 1;
+ }
+
+ /* if not dispatching already and on last arc
+ * Dispatch using current arc as last
+ * */
+ if (dispatch == 0 && i == total - 1)
+ {
+ last = i;
+ dispatch = 1;
+ }
+
+ if (dispatch)
+ {
+ int sub_total = last - first + 1;
+
+ group += 1;
+
+ if (sub_total == 1)
+ {
+ group -= 1; /* not really a group so decrement */
+ /* NOTHING TO DO */
+ }
+ else if (sub_total == 2)
+ {
+ BArc *arc1, *arc2;
+ BNode *node1, *node2;
+
+ arc1 = ring[first].arc;
+ arc2 = ring[last].arc;
+
+ node1 = BLI_otherNode(arc1, root_node);
+ node2 = BLI_otherNode(arc2, root_node);
+
+ testAxialSymmetry(graph, root_node, node1, node2, arc1, arc2, axis, limit, group);
+ }
+ else if (sub_total != total) /* allocate a new sub ring if needed */
+ {
+ RadialArc *sub_ring = MEM_callocN(sizeof(RadialArc) * sub_total, "radial symmetry ring");
+ int sub_i;
+
+ /* fill in the sub ring */
+ for (sub_i = 0; sub_i < sub_total; sub_i++)
+ {
+ sub_ring[sub_i] = ring[first + sub_i];
+ }
+
+ testRadialSymmetry(graph, root_node, sub_ring, sub_total, axis, limit, group);
+
+ MEM_freeN(sub_ring);
+ }
+ else if (sub_total == total)
+ {
+ testRadialSymmetry(graph, root_node, ring, total, axis, limit, group);
+ }
+
+ first = i;
+ }
+ }
+
+
+ MEM_freeN(ring);
+}
+
+static void flagAxialSymmetry(BNode *root_node, BNode *end_node, BArc *arc, int group)
+{
+ float vec[3];
+
+ arc->symmetry_group = group;
+
+ VecSubf(vec, end_node->p, root_node->p);
+
+ if (Inpf(vec, root_node->symmetry_axis) < 0)
+ {
+ arc->symmetry_flag |= SYM_SIDE_NEGATIVE;
+ }
+ else
+ {
+ arc->symmetry_flag |= SYM_SIDE_POSITIVE;
+ }
+}
+
+static void testAxialSymmetry(BGraph *graph, BNode* root_node, BNode* node1, BNode* node2, BArc* arc1, BArc* arc2, float axis[3], float limit, int group)
+{
+ float nor[3], vec[3], p[3];
+
+ VecSubf(p, node1->p, root_node->p);
+ Crossf(nor, p, axis);
+
+ VecSubf(p, root_node->p, node2->p);
+ Crossf(vec, p, axis);
+ VecAddf(vec, vec, nor);
+
+ Crossf(nor, vec, axis);
+
+ if (abs(nor[0]) > abs(nor[1]) && abs(nor[0]) > abs(nor[2]) && nor[0] < 0)
+ {
+ VecMulf(nor, -1);
+ }
+ else if (abs(nor[1]) > abs(nor[0]) && abs(nor[1]) > abs(nor[2]) && nor[1] < 0)
+ {
+ VecMulf(nor, -1);
+ }
+ else if (abs(nor[2]) > abs(nor[1]) && abs(nor[2]) > abs(nor[0]) && nor[2] < 0)
+ {
+ VecMulf(nor, -1);
+ }
+
+ /* mirror node2 along axis */
+ VECCOPY(p, node2->p);
+ BLI_mirrorAlongAxis(p, root_node->p, nor);
+
+ /* check if it's within limit before continuing */
+ if (VecLenf(node1->p, p) <= limit)
+ {
+ /* mark node as symmetric physically */
+ VECCOPY(root_node->symmetry_axis, nor);
+ root_node->symmetry_flag |= SYM_PHYSICAL;
+ root_node->symmetry_flag |= SYM_AXIAL;
+
+ /* flag side on arcs */
+ flagAxialSymmetry(root_node, node1, arc1, group);
+ flagAxialSymmetry(root_node, node2, arc2, group);
+
+ if (graph->axial_symmetry)
+ {
+ graph->axial_symmetry(root_node, node1, node2, arc1, arc2);
+ }
+ }
+ else
+ {
+ /* NOT SYMMETRIC */
+ }
+}
+
+static void handleAxialSymmetry(BGraph *graph, BNode *root_node, int depth, float axis[3], float limit)
+{
+ BArc *arc1 = NULL, *arc2 = NULL;
+ BNode *node1 = NULL, *node2 = NULL;
+ int i;
+
+ /* mark topological symmetry */
+ root_node->symmetry_flag |= SYM_TOPOLOGICAL;
+
+ for (i = 0; i < root_node->degree; i++)
+ {
+ BArc *connectedArc = root_node->arcs[i];
+
+ /* depth is store as a negative in flag. symmetry level is positive */
+ if (connectedArc->symmetry_level == -depth)
+ {
+ if (arc1 == NULL)
+ {
+ arc1 = connectedArc;
+ node1 = BLI_otherNode(arc1, root_node);
+ }
+ else
+ {
+ arc2 = connectedArc;
+ node2 = BLI_otherNode(arc2, root_node);
+ break; /* Can stop now, the two arcs have been found */
+ }
+ }
+ }
+
+ /* shouldn't happen, but just to be sure */
+ if (node1 == NULL || node2 == NULL)
+ {
+ return;
+ }
+
+ testAxialSymmetry(graph, root_node, node1, node2, arc1, arc2, axis, limit, 1);
+}
+
+static void markdownSecondarySymmetry(BGraph *graph, BNode *node, int depth, int level, float limit)
+{
+ float axis[3] = {0, 0, 0};
+ int count = 0;
+ int i;
+
+ /* count the number of branches in this symmetry group
+ * and determinte the axis of symmetry
+ * */
+ for (i = 0; i < node->degree; i++)
+ {
+ BArc *connectedArc = node->arcs[i];
+
+ /* depth is store as a negative in flag. symmetry level is positive */
+ if (connectedArc->symmetry_level == -depth)
+ {
+ count++;
+ }
+ /* If arc is on the axis */
+ else if (connectedArc->symmetry_level == level)
+ {
+ VecAddf(axis, axis, connectedArc->head->p);
+ VecSubf(axis, axis, connectedArc->tail->p);
+ }
+ }
+
+ Normalize(axis);
+
+ /* Split between axial and radial symmetry */
+ if (count == 2)
+ {
+ handleAxialSymmetry(graph, node, depth, axis, limit);
+ }
+ else
+ {
+ handleRadialSymmetry(graph, node, depth, axis, limit);
+ }
+
+ /* markdown secondary symetries */
+ for (i = 0; i < node->degree; i++)
+ {
+ BArc *connectedArc = node->arcs[i];
+
+ if (connectedArc->symmetry_level == -depth)
+ {
+ /* markdown symmetry for branches corresponding to the depth */
+ markdownSymmetryArc(graph, connectedArc, node, level + 1, limit);
+ }
+ }
+}
+
+void markdownSymmetryArc(BGraph *graph, BArc *arc, BNode *node, int level, float limit)
+{
+ int i;
+
+ /* if arc is null, we start straight from a node */
+ if (arc)
+ {
+ arc->symmetry_level = level;
+
+ node = BLI_otherNode(arc, node);
+ }
+
+ for (i = 0; i < node->degree; i++)
+ {
+ BArc *connectedArc = node->arcs[i];
+
+ if (connectedArc != arc)
+ {
+ BNode *connectedNode = BLI_otherNode(connectedArc, node);
+
+ /* symmetry level is positive value, negative values is subtree depth */
+ connectedArc->symmetry_level = -BLI_subtreeShape(graph, connectedNode, connectedArc, 0);
+ }
+ }
+
+ arc = NULL;
+
+ for (i = 0; i < node->degree; i++)
+ {
+ int issymmetryAxis = 0;
+ BArc *connectedArc = node->arcs[i];
+
+ /* only arcs not already marked as symetric */
+ if (connectedArc->symmetry_level < 0)
+ {
+ int j;
+
+ /* true by default */
+ issymmetryAxis = 1;
+
+ for (j = 0; j < node->degree; j++)
+ {
+ BArc *otherArc = node->arcs[j];
+
+ /* different arc, same depth */
+ if (otherArc != connectedArc && otherArc->symmetry_level == connectedArc->symmetry_level)
+ {
+ /* not on the symmetry axis */
+ issymmetryAxis = 0;
+ break;
+ }
+ }
+ }
+
+ /* arc could be on the symmetry axis */
+ if (issymmetryAxis == 1)
+ {
+ /* no arc as been marked previously, keep this one */
+ if (arc == NULL)
+ {
+ arc = connectedArc;
+ }
+ else if (connectedArc->symmetry_level < arc->symmetry_level)
+ {
+ /* go with more complex subtree as symmetry arc */
+ arc = connectedArc;
+ }
+ }
+ }
+
+ /* go down the arc continuing the symmetry axis */
+ if (arc)
+ {
+ markdownSymmetryArc(graph, arc, node, level, limit);
+ }
+
+
+ /* secondary symmetry */
+ for (i = 0; i < node->degree; i++)
+ {
+ BArc *connectedArc = node->arcs[i];
+
+ /* only arcs not already marked as symetric and is not the next arc on the symmetry axis */
+ if (connectedArc->symmetry_level < 0)
+ {
+ /* subtree depth is store as a negative value in the symmetry */
+ markdownSecondarySymmetry(graph, node, -connectedArc->symmetry_level, level, limit);
+ }
+ }
+}
+
+void BLI_markdownSymmetry(BGraph *graph, BNode *root_node, float limit)
+{
+ BNode *node;
+ BArc *arc;
+
+ if (BLI_isGraphCyclic(graph))
+ {
+ return;
+ }
+
+ /* mark down all arcs as non-symetric */
+ BLI_flagArcs(graph, 0);
+
+ /* mark down all nodes as not on the symmetry axis */
+ BLI_flagNodes(graph, 0);
+
+ node = root_node;
+
+ /* sanity check REMOVE ME */
+ if (node->degree > 0)
+ {
+ arc = node->arcs[0];
+
+ if (node->degree == 1)
+ {
+ markdownSymmetryArc(graph, arc, node, 1, limit);
+ }
+ else
+ {
+ markdownSymmetryArc(graph, NULL, node, 1, limit);
+ }
+
+
+
+ /* mark down non-symetric arcs */
+ for (arc = graph->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->symmetry_level < 0)
+ {
+ arc->symmetry_level = 0;
+ }
+ else
+ {
+ /* mark down nodes with the lowest level symmetry axis */
+ if (arc->head->symmetry_level == 0 || arc->head->symmetry_level > arc->symmetry_level)
+ {
+ arc->head->symmetry_level = arc->symmetry_level;
+ }
+ if (arc->tail->symmetry_level == 0 || arc->tail->symmetry_level > arc->symmetry_level)
+ {
+ arc->tail->symmetry_level = arc->symmetry_level;
+ }
+ }
+ }
+ }
+}
+
diff --git a/source/blender/blenlib/intern/psfont.c b/source/blender/blenlib/intern/psfont.c
index 216246dcdd7..54d7f8ec1af 100644
--- a/source/blender/blenlib/intern/psfont.c
+++ b/source/blender/blenlib/intern/psfont.c
@@ -977,7 +977,7 @@ static void applymat(float mat[][2], float *x, float *y)
static void setcharlist(void)
{
- char *name, found;
+ char *name; /*found;*/
int i, j;
for(i=0; i<NASCII; i++) ISOcharlist[i].prog = -1;
@@ -985,11 +985,11 @@ static void setcharlist(void)
for(j=0; j<my_nchars; j++) {
name = my_charname[j];
if(name) {
- found = 0;
+ /*found = 0;*/
for(i=0; i<NASCII; i++) {
if(ISOcharlist[i].name && (strcmp(name,ISOcharlist[i].name) == 0)){
ISOcharlist[i].prog = j;
- found = 1;
+ /*found = 1;*/
}
}
/*if (found == 0) printf("no match found for: %s\n", name);*/
@@ -1258,10 +1258,10 @@ static void subr0(void)
int x1, y1;
int x2, y2;
int x3, y3;
- int xpos, ypos, noise;
+ int noise;
- ypos = pop();
- xpos = pop();
+ pop(); /* xpos, unused */
+ pop(); /* ypos, unused */
noise = pop();
if(coordpos!=7) {
fprintf(stderr,"subr0: bad poop\n");
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index 92fad291e83..9df8bbc81e3 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -38,6 +38,8 @@
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "PIL_time.h"
+
/* for checking system threads - BLI_system_thread_count */
#ifdef WIN32
#include "Windows.h"
@@ -199,6 +201,34 @@ void BLI_remove_thread(ListBase *threadbase, void *callerdata)
}
}
+void BLI_remove_thread_index(ListBase *threadbase, int index)
+{
+ ThreadSlot *tslot;
+ int counter=0;
+
+ for(tslot = threadbase->first; tslot; tslot = tslot->next, counter++) {
+ if (counter == index && tslot->avail == 0) {
+ tslot->callerdata = NULL;
+ pthread_join(tslot->pthread, NULL);
+ tslot->avail = 1;
+ break;
+ }
+ }
+}
+
+void BLI_remove_threads(ListBase *threadbase)
+{
+ ThreadSlot *tslot;
+
+ for(tslot = threadbase->first; tslot; tslot = tslot->next) {
+ if (tslot->avail == 0) {
+ tslot->callerdata = NULL;
+ pthread_join(tslot->pthread, NULL);
+ tslot->avail = 1;
+ }
+ }
+}
+
void BLI_end_threads(ListBase *threadbase)
{
ThreadSlot *tslot;
@@ -265,4 +295,104 @@ int BLI_system_thread_count( void )
return t;
}
+/* ************************************************ */
+
+typedef struct ThreadedWorker {
+ ListBase threadbase;
+ void *(*work_fnct)(void *);
+ char busy[RE_MAX_THREAD];
+ int total;
+ int sleep_time;
+} ThreadedWorker;
+
+typedef struct WorkParam {
+ ThreadedWorker *worker;
+ void *param;
+ int index;
+} WorkParam;
+
+void *exec_work_fnct(void *v_param)
+{
+ WorkParam *p = (WorkParam*)v_param;
+ void *value;
+
+ value = p->worker->work_fnct(p->param);
+
+ p->worker->busy[p->index] = 0;
+ MEM_freeN(p);
+
+ return value;
+}
+
+ThreadedWorker *BLI_create_worker(void *(*do_thread)(void *), int tot, int sleep_time)
+{
+ ThreadedWorker *worker;
+
+ worker = MEM_callocN(sizeof(ThreadedWorker), "threadedworker");
+
+ if (tot > RE_MAX_THREAD)
+ {
+ tot = RE_MAX_THREAD;
+ }
+ else if (tot < 1)
+ {
+ tot= 1;
+ }
+
+ worker->total = tot;
+ worker->work_fnct = do_thread;
+
+ BLI_init_threads(&worker->threadbase, exec_work_fnct, tot);
+
+ return worker;
+}
+
+void BLI_end_worker(ThreadedWorker *worker)
+{
+ BLI_remove_threads(&worker->threadbase);
+}
+
+void BLI_destroy_worker(ThreadedWorker *worker)
+{
+ BLI_end_worker(worker);
+ BLI_freelistN(&worker->threadbase);
+ MEM_freeN(worker);
+}
+
+void BLI_insert_work(ThreadedWorker *worker, void *param)
+{
+ WorkParam *p = MEM_callocN(sizeof(WorkParam), "workparam");
+ int index;
+
+ if (BLI_available_threads(&worker->threadbase) == 0)
+ {
+ index = worker->total;
+ while(index == worker->total)
+ {
+ PIL_sleep_ms(worker->sleep_time);
+
+ for (index = 0; index < worker->total; index++)
+ {
+ if (worker->busy[index] == 0)
+ {
+ BLI_remove_thread_index(&worker->threadbase, index);
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ index = BLI_available_thread_index(&worker->threadbase);
+ }
+
+ worker->busy[index] = 1;
+
+ p->param = param;
+ p->index = index;
+ p->worker = worker;
+
+ BLI_insert_thread(&worker->threadbase, p);
+}
+
/* eof */
diff --git a/source/blender/blenlib/intern/util.c b/source/blender/blenlib/intern/util.c
index d65fe8a476a..013b9e0bb1b 100644
--- a/source/blender/blenlib/intern/util.c
+++ b/source/blender/blenlib/intern/util.c
@@ -893,7 +893,10 @@ void BLI_cleanup_file(const char *relabase, char *dir)
*/
#ifdef WIN32
- if(dir[0]=='.') { /* happens for example in FILE_MAIN */
+
+ /* Note, this should really be moved to the file selector,
+ * since this function is used in many areas */
+ if(strcmp(dir, ".")==0) { /* happens for example in FILE_MAIN */
get_default_root(dir);
return;
}
@@ -1149,15 +1152,13 @@ int BLI_convertstringframe(char *path, int frame)
int BLI_convertstringcode(char *path, const char *basepath)
{
- int wasrelative;
+ int wasrelative = (strncmp(path, "//", 2)==0);
char tmp[FILE_MAX];
char base[FILE_MAX];
+#ifdef WIN32
char vol[3] = {'\0', '\0', '\0'};
BLI_strncpy(vol, path, 3);
- wasrelative= (vol[0]=='/' && vol[1]=='/');
-
-#ifdef WIN32
/* we are checking here if we have an absolute path that is not in the current
blend file as a lib main - we are basically checking for the case that a
UNIX root '/' is passed.
@@ -1176,6 +1177,20 @@ int BLI_convertstringcode(char *path, const char *basepath)
}
#else
BLI_strncpy(tmp, path, FILE_MAX);
+
+ /* Check for loading a windows path on a posix system
+ * in this case, there is no use in trying C:/ since it
+ * will never exist on a unix os.
+ *
+ * Add a / prefix and lowercase the driveletter, remove the :
+ * C:\foo.JPG -> /c/foo.JPG */
+
+ if (isalpha(tmp[0]) && tmp[1] == ':' && (tmp[2]=='\\' || tmp[2]=='/') ) {
+ tmp[1] = tolower(tmp[0]); /* replace ':' with driveletter */
+ tmp[0] = '/';
+ /* '\' the slash will be converted later */
+ }
+
#endif
BLI_strncpy(base, basepath, FILE_MAX);
diff --git a/source/blender/blenloader/BLO_soundfile.h b/source/blender/blenloader/BLO_soundfile.h
index 3d133b2d3bd..a239c7d8965 100644
--- a/source/blender/blenloader/BLO_soundfile.h
+++ b/source/blender/blenloader/BLO_soundfile.h
@@ -35,7 +35,5 @@
struct bSound;
struct PackedFile;
-//void sound_read_wav_data(bSound * sound, PackedFile * pf);
-
#endif
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 0999c8b0ce3..3a9d0a6ae6a 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1347,7 +1347,7 @@ static void test_pointer_array(FileData *fd, void **mat)
void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, void *fd);
void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, void *fd);
-void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, void *fd)
+static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, void *fd)
{
int i;
@@ -1368,14 +1368,14 @@ void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, void *fd)
}
}
-void IDP_DirectLinkString(IDProperty *prop, int switch_endian, void *fd)
+static void IDP_DirectLinkString(IDProperty *prop, int switch_endian, void *fd)
{
/*since we didn't save the extra string buffer, set totallen to len.*/
prop->totallen = prop->len;
prop->data.pointer = newdataadr(fd, prop->data.pointer);
}
-void IDP_DirectLinkGroup(IDProperty *prop, int switch_endian, void *fd)
+static void IDP_DirectLinkGroup(IDProperty *prop, int switch_endian, void *fd)
{
ListBase *lb = &prop->data.group;
IDProperty *loop;
@@ -4874,7 +4874,7 @@ static void ntree_version_245(FileData *fd, Library *lib, bNodeTree *ntree)
}
}
-void idproperties_fix_groups_lengths_recurse(IDProperty *prop)
+static void idproperties_fix_groups_lengths_recurse(IDProperty *prop)
{
IDProperty *loop;
int i;
@@ -4889,7 +4889,7 @@ void idproperties_fix_groups_lengths_recurse(IDProperty *prop)
}
}
-void idproperties_fix_group_lengths(ListBase idlist)
+static void idproperties_fix_group_lengths(ListBase idlist)
{
ID *id;
@@ -4900,7 +4900,7 @@ void idproperties_fix_group_lengths(ListBase idlist)
}
}
-void alphasort_version_246(FileData *fd, Library *lib, Mesh *me)
+static void alphasort_version_246(FileData *fd, Library *lib, Mesh *me)
{
Material *ma;
MFace *mf;
@@ -4921,6 +4921,12 @@ void alphasort_version_246(FileData *fd, Library *lib, Mesh *me)
ma= newlibadr(fd, lib, me->mat[mf->mat_nr]);
texalpha = 0;
+ /* we can't read from this if it comes from a library,
+ * because direct_link might not have happened on it,
+ * so ma->mtex is not pointing to valid memory yet */
+ if(ma && ma->id.lib)
+ ma= NULL;
+
for(b=0; ma && b<MAX_MTEX; b++)
if(ma->mtex && ma->mtex[b] && ma->mtex[b]->mapto & MAP_ALPHA)
texalpha = 1;
@@ -7373,6 +7379,24 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
+
+ /* sanity check for skgen
+ * */
+ {
+ Scene *sce;
+ for(sce=main->scene.first; sce; sce = sce->id.next)
+ {
+ if (sce->toolsettings->skgen_subdivisions[0] == sce->toolsettings->skgen_subdivisions[1] ||
+ sce->toolsettings->skgen_subdivisions[0] == sce->toolsettings->skgen_subdivisions[2] ||
+ sce->toolsettings->skgen_subdivisions[1] == sce->toolsettings->skgen_subdivisions[2])
+ {
+ sce->toolsettings->skgen_subdivisions[0] = SKGEN_SUB_CORRELATION;
+ sce->toolsettings->skgen_subdivisions[1] = SKGEN_SUB_LENGTH;
+ sce->toolsettings->skgen_subdivisions[2] = SKGEN_SUB_ANGLE;
+ }
+ }
+ }
+
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 2)) {
Image *ima;
@@ -7767,23 +7791,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* sun/sky */
if(main->versionfile < 246) {
- Lamp *la;
Object *ob;
bActuator *act;
- for(la=main->lamp.first; la; la= la->id.next) {
- la->sun_effect_type = 0;
- la->horizon_brightness = 1.0;
- la->spread = 1.0;
- la->sun_brightness = 1.0;
- la->sun_size = 1.0;
- la->backscattered_light = 1.0;
- la->atm_turbidity = 2.0;
- la->atm_inscattering_factor = 1.0;
- la->atm_extinction_factor = 1.0;
- la->atm_distance_factor = 1.0;
- la->sun_intensity = 1.0;
- }
/* dRot actuator change direction in 2.46 */
for(ob = main->object.first; ob; ob= ob->id.next) {
for(act= ob->actuators.first; act; act= act->next) {
@@ -7920,6 +7930,53 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
+ if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 9)) {
+ Lamp *la= main->lamp.first;
+ for(; la; la= la->id.next) {
+ la->sky_exposure= 1.0f;
+ }
+ }
+
+ /* BGE message actuators needed OB prefix, very confusing */
+ if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 10)) {
+ bActuator *act;
+ Object *ob;
+
+ for(ob = main->object.first; ob; ob= ob->id.next) {
+ for(act= ob->actuators.first; act; act= act->next) {
+ if (act->type == ACT_MESSAGE) {
+ bMessageActuator *msgAct = (bMessageActuator *) act->data;
+ if (strlen(msgAct->toPropName) > 2) {
+ /* strip first 2 chars, would have only worked if these were OB anyway */
+ memmove( msgAct->toPropName, msgAct->toPropName+2, sizeof(msgAct->toPropName)-2 );
+ } else {
+ msgAct->toPropName[0] = '\0';
+ }
+ }
+ }
+ }
+ }
+
+ if (main->versionfile < 248) {
+ Lamp *la;
+
+ for(la=main->lamp.first; la; la= la->id.next) {
+ if(la->atm_turbidity == 0.0) {
+ la->sun_effect_type = 0;
+ la->horizon_brightness = 1.0;
+ la->spread = 1.0;
+ la->sun_brightness = 1.0;
+ la->sun_size = 1.0;
+ la->backscattered_light = 1.0;
+ la->atm_turbidity = 2.0;
+ la->atm_inscattering_factor = 1.0;
+ la->atm_extinction_factor = 1.0;
+ la->atm_distance_factor = 1.0;
+ la->sun_intensity = 1.0;
+ }
+ }
+ }
+
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 9ca9a3d9287..3c2ca92f3fc 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -399,7 +399,7 @@ static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not
void IDP_WriteProperty_OnlyData(IDProperty *prop, void *wd);
void IDP_WriteProperty(IDProperty *prop, void *wd);
-void IDP_WriteArray(IDProperty *prop, void *wd)
+static void IDP_WriteArray(IDProperty *prop, void *wd)
{
/*REMEMBER to set totalen to len in the linking code!!*/
if (prop->data.pointer) {
@@ -407,13 +407,13 @@ void IDP_WriteArray(IDProperty *prop, void *wd)
}
}
-void IDP_WriteString(IDProperty *prop, void *wd)
+static void IDP_WriteString(IDProperty *prop, void *wd)
{
/*REMEMBER to set totalen to len in the linking code!!*/
writedata(wd, DATA, prop->len+1, prop->data.pointer);
}
-void IDP_WriteGroup(IDProperty *prop, void *wd)
+static void IDP_WriteGroup(IDProperty *prop, void *wd)
{
IDProperty *loop;
@@ -1066,7 +1066,7 @@ static void write_mballs(WriteData *wd, ListBase *idbase)
}
}
-int amount_of_chars(char *str)
+static int amount_of_chars(char *str)
{
// Since the data is saved as UTF-8 to the cu->str
// The cu->len is not same as the strlen(cu->str)
diff --git a/source/blender/blenpluginapi/SConscript b/source/blender/blenpluginapi/SConscript
index d17a35e933e..4cf52a50e8c 100644
--- a/source/blender/blenpluginapi/SConscript
+++ b/source/blender/blenpluginapi/SConscript
@@ -7,7 +7,7 @@ incs = '. .. #/intern/guardedalloc ../blenlib ../imbuf ../makesdna'
defs = []
-if env['WITH_BF_QUICKTIME'] == 1:
+if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME')
incs += ' ' + env['BF_QUICKTIME_INC']
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index 3813fe3da8e..66b19449419 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -51,6 +51,7 @@ typedef struct GPUFrameBuffer GPUFrameBuffer;
struct GPUShader;
typedef struct GPUShader GPUShader;
+void GPU_extensions_disable(void);
void GPU_extensions_init(void); /* call this before running any of the functions below */
void GPU_extensions_exit(void);
int GPU_extensions_minimum_support(void);
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 1c29bdc8741..94c1910e3bc 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -516,10 +516,14 @@ static void codegen_set_unique_ids(ListBase *nodes)
input->texid = GET_INT_FROM_POINTER(BLI_ghash_lookup(bindhash, input->ima));
}
else {
- /* input is user created texture, we know there there is
- only one, so assign new texid */
- input->bindtex = 1;
- input->texid = texid++;
+ if (!BLI_ghash_haskey(bindhash, input->tex)) {
+ /* input is user created texture, check tex pointer */
+ input->texid = texid++;
+ input->bindtex = 1;
+ BLI_ghash_insert(bindhash, input->tex, SET_INT_IN_POINTER(input->texid));
+ }
+ else
+ input->texid = GET_INT_FROM_POINTER(BLI_ghash_lookup(bindhash, input->tex));
}
/* make sure this pixel is defined exactly once */
@@ -836,11 +840,9 @@ void GPU_pass_bind(GPUPass *pass, double time)
if (input->ima)
input->tex = GPU_texture_from_blender(input->ima, input->iuser, time);
- if(input->ima || input->tex) {
- if(input->tex) {
- GPU_texture_bind(input->tex, input->texid);
- GPU_shader_uniform_texture(shader, input->shaderloc, input->tex);
- }
+ if(input->tex && input->bindtex) {
+ GPU_texture_bind(input->tex, input->texid);
+ GPU_shader_uniform_texture(shader, input->shaderloc, input->tex);
}
}
}
@@ -871,9 +873,9 @@ void GPU_pass_unbind(GPUPass *pass)
return;
for (input=inputs->first; input; input=input->next) {
- if (input->tex)
- if(input->bindtex)
- GPU_texture_unbind(input->tex);
+ if(input->tex && input->bindtex)
+ GPU_texture_unbind(input->tex);
+
if (input->ima)
input->tex = 0;
}
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 700dd6dedb2..4025a12a867 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -220,12 +220,24 @@ static int gpu_get_mipmap(void)
return GTS.domipmap && (!(G.f & G_TEXTUREPAINT));
}
-static GLenum gpu_get_mipmap_filter()
+static GLenum gpu_get_mipmap_filter(int mag)
{
- /* linearmipmap is off by default
- * when mipmapping is off, use unfiltered display */
- return GTS.linearmipmap? GL_LINEAR_MIPMAP_LINEAR :
- (GTS.domipmap ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST);
+ /* linearmipmap is off by default *when mipmapping is off,
+ * use unfiltered display */
+ if(mag) {
+ if(GTS.linearmipmap || GTS.domipmap)
+ return GL_LINEAR;
+ else
+ return GL_NEAREST;
+ }
+ else {
+ if(GTS.linearmipmap)
+ return GL_LINEAR_MIPMAP_LINEAR;
+ else if(GTS.domipmap)
+ return GL_LINEAR_MIPMAP_NEAREST;
+ else
+ return GL_NEAREST;
+ }
}
/* Set OpenGL state for an MTFace */
@@ -359,6 +371,8 @@ int GPU_verify_image(Image *ima, int tftile, int tfmode, int compare)
else
GTS.tile= tftile;
+ GTS.tile = MAX2(0, GTS.tile);
+
if(ima) {
GTS.tileXRep = ima->xrep;
GTS.tileYRep = ima->yrep;
@@ -477,12 +491,12 @@ int GPU_verify_image(Image *ima, int tftile, int tfmode, int compare)
if (!gpu_get_mipmap()) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, rectw, recth, 0, GL_RGBA, GL_UNSIGNED_BYTE, rect);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter());
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
}
else {
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, rectw, recth, GL_RGBA, GL_UNSIGNED_BYTE, rect);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gpu_get_mipmap_filter());
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter());
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gpu_get_mipmap_filter(0));
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
ima->tpageflag |= IMA_MIPMAP_COMPLETE;
}
@@ -574,8 +588,8 @@ void GPU_paint_set_mipmap(int mipmap)
if(ima->bindcode) {
if(ima->tpageflag & IMA_MIPMAP_COMPLETE) {
glBindTexture(GL_TEXTURE_2D, ima->bindcode);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gpu_get_mipmap_filter());
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter());
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gpu_get_mipmap_filter(0));
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
}
else
GPU_free_image(ima);
@@ -588,7 +602,7 @@ void GPU_paint_set_mipmap(int mipmap)
if(ima->bindcode) {
glBindTexture(GL_TEXTURE_2D, ima->bindcode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter());
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
}
}
}
@@ -1046,7 +1060,7 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4
if(la->type==LA_SUN) {
/* sun lamp */
- VECCOPY(position, base->object->obmat[2]);
+ VECCOPY(direction, base->object->obmat[2]);
direction[3]= 0.0;
glLightfv(GL_LIGHT0+count, GL_POSITION, direction);
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index a8dc369460c..7654c67419b 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -66,11 +66,17 @@
- arb draw buffers? 2.0 core
*/
-struct GPUGlobal {
+static struct GPUGlobal {
GLint maxtextures;
GLuint currentfb;
int minimumsupport;
-} GG = {1, 0, 0};
+ int extdisabled;
+} GG = {1, 0, 0, 0};
+
+void GPU_extensions_disable()
+{
+ GG.extdisabled = 1;
+}
void GPU_extensions_init()
{
@@ -89,7 +95,7 @@ void GPU_extensions_init()
int GPU_extensions_minimum_support()
{
- return GG.minimumsupport;
+ return !GG.extdisabled && GG.minimumsupport;
}
int GPU_print_error(char *str)
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index d4da2866d96..46df003cbbc 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -693,7 +693,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
shr->spec, &shr->spec);
add_user_list(&mat->lamps, lamp);
- add_user_list(&lamp->materials, ma);
+ add_user_list(&lamp->materials, shi->gpumat->ma);
return;
}
@@ -702,7 +702,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
}
else if((G.fileflags & G_FILE_GLSL_NO_SHADOWS) && (lamp->mode & LA_ONLYSHADOW)) {
add_user_list(&mat->lamps, lamp);
- add_user_list(&lamp->materials, ma);
+ add_user_list(&lamp->materials, shi->gpumat->ma);
return;
}
else
@@ -755,7 +755,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
}
add_user_list(&mat->lamps, lamp);
- add_user_list(&lamp->materials, ma);
+ add_user_list(&lamp->materials, shi->gpumat->ma);
}
static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
@@ -928,7 +928,7 @@ static void do_material_tex(GPUShadeInput *shi)
else if(mtex->texco==TEXCO_OBJECT)
texco= texco_object;
else if(mtex->texco==TEXCO_NORM)
- texco= texco_norm;
+ texco= orn;
else if(mtex->texco==TEXCO_TANGENT)
texco= texco_object;
else if(mtex->texco==TEXCO_GLOB)
@@ -1145,6 +1145,8 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
if((G.fileflags & G_FILE_GLSL_NO_LIGHTS) || (ma->mode & MA_SHLESS)) {
shr->combined = shi->rgb;
shr->alpha = shi->alpha;
+ GPU_link(mat, "set_rgb", shi->rgb, &shr->diff);
+ GPU_link(mat, "set_rgb_zero", &shr->spec);
}
else {
if(GPU_link_changed(shi->emit) || ma->emit != 0.0f) {
@@ -1360,10 +1362,14 @@ static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *l
static void gpu_lamp_shadow_free(GPULamp *lamp)
{
- if(lamp->tex)
+ if(lamp->tex) {
GPU_texture_free(lamp->tex);
- if(lamp->fb)
+ lamp->tex= NULL;
+ }
+ if(lamp->fb) {
GPU_framebuffer_free(lamp->fb);
+ lamp->fb= NULL;
+ }
}
GPULamp *GPU_lamp_from_blender(Scene *scene, Object *ob, Object *par)
diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt
index 0aac462573a..2d41a6d73e6 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -54,5 +54,9 @@ IF(WITH_FFMPEG)
ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
+if(WITH_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
+ENDIF(WITH_DDS)
+
BLENDERLIB(bf_imbuf "${SRC}" "${INC}")
#env.BlenderLib ( libname = 'bf_imbuf', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [80, 40] )
diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript
index 7349f481731..4eba4a843b2 100644
--- a/source/blender/imbuf/SConscript
+++ b/source/blender/imbuf/SConscript
@@ -17,25 +17,25 @@ if env['WITH_BF_VERSE']:
defs.append('WITH_VERSE')
incs += ' ' + env['BF_VERSE_INCLUDE']
-if env['WITH_BF_OPENEXR'] == 1:
+if env['WITH_BF_OPENEXR']:
defs.append('WITH_OPENEXR')
-if env['WITH_BF_DDS'] == 1:
+if env['WITH_BF_DDS']:
defs.append('WITH_DDS')
-if env['WITH_BF_FFMPEG'] == 1:
+if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
-if env['WITH_BF_OPENJPEG'] == 1:
+if env['WITH_BF_OPENJPEG']:
defs.append('WITH_OPENJPEG')
incs += ' ' + env['BF_OPENJPEG_INC']
-if env['WITH_BF_REDCODE'] == 1:
+if env['WITH_BF_REDCODE']:
defs.append('WITH_REDCODE')
incs += ' ' + env['BF_REDCODE_INC']
-if env['WITH_BF_QUICKTIME']==1:
+if env['WITH_BF_QUICKTIME']:
incs += ' ' + env['BF_QUICKTIME_INC']
defs.append('WITH_QUICKTIME')
diff --git a/source/blender/imbuf/intern/cineon/cineon_dpx.c b/source/blender/imbuf/intern/cineon/cineon_dpx.c
index 2959ed654ab..514d6b5522b 100644
--- a/source/blender/imbuf/intern/cineon/cineon_dpx.c
+++ b/source/blender/imbuf/intern/cineon/cineon_dpx.c
@@ -48,10 +48,10 @@
static void cineon_conversion_parameters(LogImageByteConversionParameters *params)
{
- params->blackPoint = G.scene->r.cineonblack;
- params->whitePoint = G.scene->r.cineonwhite;
- params->gamma = G.scene->r.cineongamma;
- params->doLogarithm = G.scene->r.subimtype & R_CINEON_LOG;
+ params->blackPoint = G.scene?G.scene->r.cineonblack:95;
+ params->whitePoint = G.scene?G.scene->r.cineonwhite:685;
+ params->gamma = G.scene?G.scene->r.cineongamma:1.7f;
+ params->doLogarithm = G.scene?G.scene->r.subimtype & R_CINEON_LOG:0;
}
static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int size, int flags)
diff --git a/source/blender/imbuf/intern/cineon/cineonlib.c b/source/blender/imbuf/intern/cineon/cineonlib.c
index ecee3c7d6c0..75516bbf3ae 100644
--- a/source/blender/imbuf/intern/cineon/cineonlib.c
+++ b/source/blender/imbuf/intern/cineon/cineonlib.c
@@ -617,7 +617,7 @@ cineonOpenFromMem(unsigned char *mem, unsigned int size) {
cineon->file = 0;
cineon->reading = 1;
- verbose = 1;
+ verbose = 0;
if (size < sizeof(CineonGenericHeader)) {
if (verbose) d_printf("Not enough data for header!\n");
cineonClose(cineon);
diff --git a/source/blender/imbuf/intern/cineon/dpxlib.c b/source/blender/imbuf/intern/cineon/dpxlib.c
index 1710cdde501..8a9adc73cdc 100644
--- a/source/blender/imbuf/intern/cineon/dpxlib.c
+++ b/source/blender/imbuf/intern/cineon/dpxlib.c
@@ -199,7 +199,7 @@ dumpDpxMainHeader(DpxMainHeader* header) {
#endif
}
-static int verbose = 1;
+static int verbose = 0;
void
dpxSetVerbose(int verbosity) {
verbose = verbosity;
diff --git a/source/blender/imbuf/intern/dds/CMakeLists.txt b/source/blender/imbuf/intern/dds/CMakeLists.txt
new file mode 100644
index 00000000000..842f53bd88b
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/CMakeLists.txt
@@ -0,0 +1,45 @@
+# $Id: CMakeLists.txt 14444 2008-04-16 22:40:48Z hos $
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s):
+#
+# ***** END GPL LICENSE BLOCK *****
+
+FILE (GLOB SRC *.cpp)
+
+SET(INC
+ .
+ ../../../blenkernel
+ ../../../makesdna
+ ../../
+ ..
+ ../../../blenlib
+ intern/include
+ ../../../../../intern/guardedalloc
+)
+
+if(WITH_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
+ENDIF(WITH_DDS)
+
+BLENDERLIB(bf_dds "${SRC}" "${INC}")
+#env.BlenderLib ('bf_dds', source_files, incs, defs, libtype=['core','player'], priority = [90, 200])
diff --git a/source/blender/imbuf/intern/dynlibtiff.c b/source/blender/imbuf/intern/dynlibtiff.c
index b057e3f8bd2..b9186e482c5 100644
--- a/source/blender/imbuf/intern/dynlibtiff.c
+++ b/source/blender/imbuf/intern/dynlibtiff.c
@@ -106,8 +106,11 @@ void *libtiff_findsymbol(char *name)
assert(libtiff != NULL);
symbol = PIL_dynlib_find_symbol(libtiff, name);
if (symbol == NULL) {
- printf("libtiff_findsymbol: error %s\n",
- PIL_dynlib_get_error_as_string(libtiff));
+ char *err = PIL_dynlib_get_error_as_string(libtiff);
+
+ if (err) printf("libtiff_findsymbol: error %s\n",err);
+ else printf("libtiff_findsymbol: error Unknown.\n");
+
libtiff = NULL;
G.have_libtiff = (0);
return NULL;
diff --git a/source/blender/include/BDR_editobject.h b/source/blender/include/BDR_editobject.h
index ac60aece344..11e6478f29a 100644
--- a/source/blender/include/BDR_editobject.h
+++ b/source/blender/include/BDR_editobject.h
@@ -76,7 +76,10 @@ void link_to_scene(unsigned short nr);
void make_links_menu(void);
void make_links(short event);
void make_duplilist_real(void);
+void make_object_duplilist_real(struct Base *base);
void apply_objects_locrot(void);
+void apply_objects_scale(void);
+void apply_objects_rot(void);
void apply_objects_visual_tx(void);
void apply_object(void);
diff --git a/source/blender/include/BDR_gpencil.h b/source/blender/include/BDR_gpencil.h
index 9b9294b0343..6af156775be 100644
--- a/source/blender/include/BDR_gpencil.h
+++ b/source/blender/include/BDR_gpencil.h
@@ -1,5 +1,5 @@
/**
- * $Id: BDR_gpencil.h 14444 2008-04-16 22:40:48Z aligorith $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -57,10 +57,13 @@ struct bGPDframe *gpencil_frame_addnew(struct bGPDlayer *gpl, int cframe);
struct bGPDlayer *gpencil_layer_addnew(struct bGPdata *gpd);
struct bGPdata *gpencil_data_addnew(void);
+struct bGPDframe *gpencil_frame_duplicate(struct bGPDframe *src);
+struct bGPDlayer *gpencil_layer_duplicate(struct bGPDlayer *src);
struct bGPdata *gpencil_data_duplicate(struct bGPdata *gpd);
struct bGPdata *gpencil_data_getactive(struct ScrArea *sa);
short gpencil_data_setactive(struct ScrArea *sa, struct bGPdata *gpd);
+struct ScrArea *gpencil_data_findowner(struct bGPdata *gpd);
void gpencil_frame_delete_laststroke(struct bGPDframe *gpf);
@@ -79,7 +82,6 @@ void gpencil_delete_menu(void);
void gpencil_convert_operation(short mode);
void gpencil_convert_menu(void);
-//short gpencil_paint(short mousebutton);
short gpencil_do_paint(struct ScrArea *sa, short mousebutton);
#endif /* BDR_GPENCIL_H */
diff --git a/source/blender/include/BIF_drawgpencil.h b/source/blender/include/BIF_drawgpencil.h
index eacafce058d..ae2ec192cc7 100644
--- a/source/blender/include/BIF_drawgpencil.h
+++ b/source/blender/include/BIF_drawgpencil.h
@@ -1,5 +1,5 @@
/**
- * $Id: BIF_drawgpencil.h 14444 2008-04-16 22:40:48Z aligorith $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/include/BIF_editaction.h b/source/blender/include/BIF_editaction.h
index 1425cf6a67c..ae330b30d81 100644
--- a/source/blender/include/BIF_editaction.h
+++ b/source/blender/include/BIF_editaction.h
@@ -201,6 +201,10 @@ void delete_gpencil_layers(void);
void delete_gplayer_frames(struct bGPDlayer *gpl);
void duplicate_gplayer_frames(struct bGPDlayer *gpd);
+void free_gpcopybuf(void);
+void copy_gpdata(void);
+void paste_gpdata(void);
+
void snap_gplayer_frames(struct bGPDlayer *gpl, short mode);
void mirror_gplayer_frames(struct bGPDlayer *gpl, short mode);
diff --git a/source/blender/include/BIF_editarmature.h b/source/blender/include/BIF_editarmature.h
index d390b96f61f..02d73680818 100644
--- a/source/blender/include/BIF_editarmature.h
+++ b/source/blender/include/BIF_editarmature.h
@@ -68,6 +68,8 @@ typedef struct EditBone
} EditBone;
+void make_boneList(struct ListBase *list, struct ListBase *bones, EditBone *parent);
+void editbones_to_armature (struct ListBase *list, struct Object *ob);
void adduplicate_armature(void);
void addvert_armature(void);
@@ -148,6 +150,15 @@ void align_selected_bones(void);
#define BONESEL_NOSEL 0x80000000 /* Indicates a negative number */
+/* from autoarmature */
+void BIF_retargetArmature();
+void BIF_adjustRetarget();
+void BIF_freeRetarget();
+
+struct ReebArc;
+float calcVariance(struct ReebArc *arc, int start, int end, float v0[3], float n[3]);
+float calcDistance(struct ReebArc *arc, int start, int end, float head[3], float tail[3]);
+
/* useful macros */
#define EBONE_VISIBLE(arm, ebone) ((arm->layer & ebone->layer) && !(ebone->flag & BONE_HIDDEN_A))
#define EBONE_EDITABLE(ebone) ((ebone->flag & BONE_SELECTED) && !(ebone->flag & BONE_EDITMODE_LOCKED))
diff --git a/source/blender/include/BIF_editdeform.h b/source/blender/include/BIF_editdeform.h
index 8e8b1be2dd3..6429b60a888 100644
--- a/source/blender/include/BIF_editdeform.h
+++ b/source/blender/include/BIF_editdeform.h
@@ -42,9 +42,10 @@ struct bDeformGroup;
struct bDeformGroup *add_defgroup_name (struct Object *ob, char *name);
void add_defgroup (struct Object *ob);
-void del_defgroup_in_object_mode ( Object *ob );
+void del_defgroup_in_object_mode (struct Object *ob );
void del_defgroup (struct Object *ob);
-void duplicate_defgroup ( struct Object *ob );
+void del_all_defgroups (struct Object *ob);
+void duplicate_defgroup (struct Object *ob );
void assign_verts_defgroup (void);
void remove_verts_defgroup (int allverts);
void remove_verts_defgroups (int allverts);
diff --git a/source/blender/include/BIF_editmesh.h b/source/blender/include/BIF_editmesh.h
index 9354a577ac1..30e9e16355e 100644
--- a/source/blender/include/BIF_editmesh.h
+++ b/source/blender/include/BIF_editmesh.h
@@ -73,7 +73,7 @@ extern void add_primitiveMesh(int type);
extern void adduplicate_mesh(void);
extern void add_click_mesh(void);
extern void addedgeface_mesh(void);
-void addfaces_from_edgenet();
+void addfaces_from_edgenet(void);
/* ******************* editmesh_lib.c */
@@ -221,7 +221,7 @@ extern void beauty_fill(void);
extern void join_triangles(void);
extern void edge_flip(void);
extern void fill_mesh(void);
-extern void bevel_menu();
+extern void bevel_menu(void);
void mesh_set_face_flags(short mode);
extern void mesh_set_smooth_faces(short event);
extern void mesh_rotate_uvs(void);
diff --git a/source/blender/include/BIF_editparticle.h b/source/blender/include/BIF_editparticle.h
index 41d86565b13..aecaee31d53 100644
--- a/source/blender/include/BIF_editparticle.h
+++ b/source/blender/include/BIF_editparticle.h
@@ -54,7 +54,7 @@ short PE_get_current_num(struct Object *ob);
int PE_minmax(float *min, float *max);
void PE_get_colors(char sel[4], char nosel[4]);
struct ParticleEditSettings *PE_settings(void);
-struct RadialControl **PE_radialcontrol();
+struct RadialControl **PE_radialcontrol(void);
/* update calls */
void PE_hide_keys_time(struct ParticleSystem *psys, float cfra);
diff --git a/source/blender/include/BIF_keyframing.h b/source/blender/include/BIF_keyframing.h
index 7989e6adb45..dbbe55123e4 100644
--- a/source/blender/include/BIF_keyframing.h
+++ b/source/blender/include/BIF_keyframing.h
@@ -1,5 +1,5 @@
/**
- * $Id: BIF_keyframing.h 14444 2008-04-16 22:40:48Z aligorith $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -49,19 +49,23 @@ int insert_bezt_icu(struct IpoCurve *icu, struct BezTriple *bezt);
void insert_vert_icu(struct IpoCurve *icu, float x, float y, short flag);
-/* flags for use in insert_key(), and insert_vert_icu() */
+/* flags for use by keyframe creation/deletion calls */
enum {
+ /* used by isnertkey() and insert_vert_icu() */
INSERTKEY_NEEDED = (1<<0), /* only insert keyframes where they're needed */
INSERTKEY_MATRIX = (1<<1), /* insert 'visual' keyframes where possible/needed */
INSERTKEY_FAST = (1<<2), /* don't recalculate handles,etc. after adding key */
INSERTKEY_FASTR = (1<<3), /* don't realloc mem (or increase count, as array has already been set out) */
INSERTKEY_REPLACE = (1<<4), /* only replace an existing keyframe (this overrides INSERTKEY_NEEDED) */
+
+ /* used by common_*key() functions */
+ COMMONKEY_ADDMAP = (1<<10), /* common key: add texture-slot offset bitflag to adrcode before use */
} eInsertKeyFlags;
/* -------- */
/* Main Keyframing API calls:
- * Use this to create any necessary animation data,, and then insert a keyframe
+ * Use this to create any necessary animation data, and then insert a keyframe
* using the current value being keyframed, in the relevant place. Returns success.
*/
// TODO: adapt this for new data-api -> this blocktype, etc. stuff is evil!
@@ -100,18 +104,28 @@ void common_deletekey(void);
/* ************ Keyframe Checking ******************** */
-/* Checks whether a keyframe exists for the given ID-block one the given frame */
-short id_cfra_has_keyframe(struct ID *id, short filter);
+/* Main Keyframe Checking API call:
+ * Checks whether a keyframe exists for the given ID-block one the given frame.
+ * - It is recommended to call this method over the other keyframe-checkers directly,
+ * in case some detail of the implementation changes...
+ * - frame: the value of this is quite often result of frame_to_float(CFRA)
+ */
+short id_frame_has_keyframe(struct ID *id, float frame, short filter);
-/* filter flags fr id_cfra_has_keyframe */
+/* filter flags for id_cfra_has_keyframe
+ *
+ * WARNING: do not alter order of these, as also stored in files
+ * (for v3d->keyflags)
+ */
enum {
/* general */
- ANIMFILTER_ALL = 0, /* include all available animation data */
ANIMFILTER_LOCAL = (1<<0), /* only include locally available anim data */
+ ANIMFILTER_MUTED = (1<<1), /* include muted elements */
+ ANIMFILTER_ACTIVE = (1<<2), /* only include active-subelements */
/* object specific */
- ANIMFILTER_MAT = (1<<1), /* include material keyframes too */
- ANIMFILTER_SKEY = (1<<2), /* shape keys (for geometry) */
+ ANIMFILTER_NOMAT = (1<<9), /* don't include material keyframes */
+ ANIMFILTER_NOSKEY = (1<<10), /* don't include shape keys (for geometry) */
} eAnimFilterFlags;
#endif /* BIF_KEYFRAMING_H */
diff --git a/source/blender/include/BIF_retopo.h b/source/blender/include/BIF_retopo.h
index 5d39923a398..cc2fda56b07 100644
--- a/source/blender/include/BIF_retopo.h
+++ b/source/blender/include/BIF_retopo.h
@@ -79,27 +79,27 @@ typedef struct RetopoPaintData {
struct View3D *paint_v3d;
} RetopoPaintData;
-RetopoPaintData *get_retopo_paint_data();
+RetopoPaintData *get_retopo_paint_data(void);
-char retopo_mesh_check();
-char retopo_curve_check();
+char retopo_mesh_check(void);
+char retopo_curve_check(void);
-void retopo_end_okee();
+void retopo_end_okee(void);
void retopo_free_paint_data(RetopoPaintData *rpd);
-void retopo_free_paint();
+void retopo_free_paint(void);
-char retopo_mesh_paint_check();
+char retopo_mesh_paint_check(void);
void retopo_paint_view_update(struct View3D *v3d);
-void retopo_force_update();
+void retopo_force_update(void);
void retopo_paint_toggle(void*,void*);
char retopo_paint(const unsigned short event);
-void retopo_draw_paint_lines();
+void retopo_draw_paint_lines(void);
RetopoPaintData *retopo_paint_data_copy(RetopoPaintData *rpd);
void retopo_toggle(void*,void*);
void retopo_do_vert(struct View3D *v3d, float *v);
-void retopo_do_all();
+void retopo_do_all(void);
void retopo_do_all_cb(void *, void *);
void retopo_queue_updates(struct View3D *v3d);
diff --git a/source/blender/include/BSE_seqaudio.h b/source/blender/include/BSE_seqaudio.h
index 9b2c21a0817..64aa50c661d 100644
--- a/source/blender/include/BSE_seqaudio.h
+++ b/source/blender/include/BSE_seqaudio.h
@@ -29,20 +29,24 @@
#ifndef BSE_SEQAUDIO_H
#define BSE_SEQAUDIO_H
+#ifndef DISABLE_SDL
#include "SDL.h"
+#endif
+
/* muha, we don't init (no SDL_main)! */
#ifdef main
# undef main
#endif
#include "DNA_sound_types.h"
+#include "BLO_sys_types.h"
void audio_mixdown();
void audio_makestream(bSound *sound);
-void audiostream_play(Uint32 startframe, Uint32 duration, int mixdown);
-void audiostream_fill(Uint8* mixdown, int len);
-void audiostream_start(Uint32 frame);
-void audiostream_scrub(Uint32 frame);
+void audiostream_play(uint32_t startframe, uint32_t duration, int mixdown);
+void audiostream_fill(uint8_t* mixdown, int len);
+void audiostream_start(uint32_t frame);
+void audiostream_scrub(uint32_t frame);
void audiostream_stop(void);
int audiostream_pos(void);
diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h
index 00d6f38e627..1e437083e85 100644
--- a/source/blender/include/butspace.h
+++ b/source/blender/include/butspace.h
@@ -443,7 +443,8 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_SETMCOL_RND 2083
#define B_DRAWBWEIGHTS 2084
-#define B_GEN_SKELETON 2090
+#define B_GEN_SKELETON 2085
+#define B_RETARGET_SKELETON 2086
/* *********************** */
#define B_VGROUPBUTS 2100
diff --git a/source/blender/include/reeb.h b/source/blender/include/reeb.h
index c8352aedec5..57f7d1b60cf 100644
--- a/source/blender/include/reeb.h
+++ b/source/blender/include/reeb.h
@@ -28,18 +28,35 @@
#ifndef REEB_H_
#define REEB_H_
+//#define WITH_BF_REEB
+
#include "DNA_listBase.h"
+#include "BLI_graph.h"
+
+struct GHash;
struct EdgeHash;
struct ReebArc;
struct ReebEdge;
struct ReebNode;
typedef struct ReebGraph {
- ListBase arcs;
- ListBase nodes;
+ ListBase arcs;
+ ListBase nodes;
+
+ float length;
+
+ FreeArc free_arc;
+ FreeNode free_node;
+ RadialSymmetry radial_symmetry;
+ AxialSymmetry axial_symmetry;
+ /*********************************/
+
+ int resolution;
int totnodes;
struct EdgeHash *emap;
+ int multi_level;
+ struct ReebGraph *link_up; /* for multi resolution filtering, points to higher levels */
} ReebGraph;
typedef struct EmbedBucket {
@@ -49,13 +66,25 @@ typedef struct EmbedBucket {
} EmbedBucket;
typedef struct ReebNode {
- struct ReebNode *next, *prev;
+ void *next, *prev;
+ float p[3];
+ int flag;
+
+ int degree;
struct ReebArc **arcs;
+
+ int subgraph_index;
+
+ int symmetry_level;
+ int symmetry_flag;
+ float symmetry_axis[3];
+ /*********************************/
+
int index;
- int degree;
float weight;
- float p[3];
- int flags;
+ int multi_level;
+ struct ReebNode *link_down; /* for multi resolution filtering, points to lower levels, if present */
+ struct ReebNode *link_up;
} ReebNode;
typedef struct ReebEdge {
@@ -63,15 +92,28 @@ typedef struct ReebEdge {
struct ReebArc *arc;
struct ReebNode *v1, *v2;
struct ReebEdge *nextEdge;
+ int flag;
} ReebEdge;
typedef struct ReebArc {
- struct ReebArc *next, *prev;
+ void *next, *prev;
+ struct ReebNode *head, *tail;
+ int flag;
+
+ float length;
+
+ int symmetry_level;
+ int symmetry_group;
+ int symmetry_flag;
+ /*********************************/
+
ListBase edges;
- struct ReebNode *v1, *v2;
+ int bcount;
struct EmbedBucket *buckets;
- int bcount;
- int flags;
+
+ struct GHash *faces;
+ float angle;
+ struct ReebArc *link_up; /* for multi resolution filtering, points to higher levels */
} ReebArc;
typedef struct ReebArcIterator {
@@ -79,29 +121,37 @@ typedef struct ReebArcIterator {
int index;
int start;
int end;
- int stride;
+ int stride;
+ int length;
} ReebArcIterator;
struct EditMesh;
+struct EdgeIndex;
-int weightToHarmonic(struct EditMesh *em);
-int weightFromDistance(struct EditMesh *em);
+int weightToHarmonic(struct EditMesh *em, struct EdgeIndex *indexed_edges);
+int weightFromDistance(struct EditMesh *em, struct EdgeIndex *indexed_edges);
int weightFromLoc(struct EditMesh *me, int axis);
-void weightToVCol(struct EditMesh *em);
+void weightToVCol(struct EditMesh *em, int index);
+void arcToVCol(struct ReebGraph *rg, struct EditMesh *em, int index);
+void angleToVCol(struct EditMesh *em, int index);
void renormalizeWeight(struct EditMesh *em, float newmax);
ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
-void freeGraph(ReebGraph *rg);
-void exportGraph(ReebGraph *rg, int count);
-
-#define OTHER_NODE(arc, node) ((arc->v1 == node) ? arc->v2 : arc->v1)
+ReebGraph * newReebGraph();
void initArcIterator(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
void initArcIterator2(struct ReebArcIterator *iter, struct ReebArc *arc, int start, int end);
+void initArcIteratorStart(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head, int start);
struct EmbedBucket * nextBucket(struct ReebArcIterator *iter);
+struct EmbedBucket * nextNBucket(ReebArcIterator *iter, int n);
+struct EmbedBucket * peekBucket(ReebArcIterator *iter, int n);
+struct EmbedBucket * currentBucket(struct ReebArcIterator *iter);
+struct EmbedBucket * previousBucket(struct ReebArcIterator *iter);
+int iteratorStopped(struct ReebArcIterator *iter);
/* Filtering */
void filterNullReebGraph(ReebGraph *rg);
+int filterSmartReebGraph(ReebGraph *rg, float threshold);
int filterExternalReebGraph(ReebGraph *rg, float threshold);
int filterInternalReebGraph(ReebGraph *rg, float threshold);
@@ -110,18 +160,33 @@ void repositionNodes(ReebGraph *rg);
void postprocessGraph(ReebGraph *rg, char mode);
void removeNormalNodes(ReebGraph *rg);
-/* Graph processing */
-void buildAdjacencyList(ReebGraph *rg);
-
void sortNodes(ReebGraph *rg);
void sortArcs(ReebGraph *rg);
-int subtreeDepth(ReebNode *node, ReebArc *rootArc);
-int countConnectedArcs(ReebGraph *rg, ReebNode *node);
-int hasAdjacencyList(ReebGraph *rg);
-int isGraphCyclic(ReebGraph *rg);
-
-/* Sanity check */
+/*------------ Sanity check ------------*/
void verifyBuckets(ReebGraph *rg);
+void verifyFaces(ReebGraph *rg);
+
+/*********************** PUBLIC *********************************/
+
+#define REEB_MAX_MULTI_LEVEL 10
+
+ReebGraph *BIF_ReebGraphFromEditMesh(void);
+ReebGraph *BIF_ReebGraphMultiFromEditMesh(void);
+void BIF_flagMultiArcs(ReebGraph *rg, int flag);
+
+void BIF_GlobalReebGraphFromEditMesh(void);
+void BIF_GlobalReebFree(void);
+
+ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
+ReebNode *BIF_NodeFromIndex(ReebArc *arc, ReebNode *node);
+ReebNode *BIF_lowestLevelNode(ReebNode *node);
+
+ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
+
+void REEB_freeGraph(ReebGraph *rg);
+void REEB_exportGraph(ReebGraph *rg, int count);
+void REEB_draw();
+
#endif /*REEB_H_*/
diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h
index 2487216f764..43dada97d0e 100644
--- a/source/blender/makesdna/DNA_actuator_types.h
+++ b/source/blender/makesdna/DNA_actuator_types.h
@@ -113,6 +113,7 @@ typedef struct bIpoActuator {
short flag, type;
int sta, end;
char name[32];
+ char frameProp[32]; /* Set this property to the actions current frame */
short pad1, cur, butsta, butend;
@@ -369,6 +370,7 @@ typedef struct FreeCamera {
#define ACT_CONST_PERMANENT 256
#define ACT_CONST_DISTANCE 512
#define ACT_CONST_LOCAL 1024
+#define ACT_CONST_DOROTFH 2048
/* constraint mode */
#define ACT_CONST_DIRPX 1
@@ -382,6 +384,7 @@ typedef struct FreeCamera {
#define ACT_CONST_TYPE_LOC 0
#define ACT_CONST_TYPE_DIST 1
#define ACT_CONST_TYPE_ORI 2
+#define ACT_CONST_TYPE_FH 3
/* editObjectActuator->type */
#define ACT_EDOB_ADD_OBJECT 0
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index fa5b5a75941..fe19cf60f12 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -463,7 +463,9 @@ typedef enum B_CONSTRAINTCHANNEL_FLAG {
/* bKinematicConstraint->flag */
#define CONSTRAINT_IK_TIP 1
#define CONSTRAINT_IK_ROT 2
+ /* targetless */
#define CONSTRAINT_IK_AUTO 4
+ /* autoik */
#define CONSTRAINT_IK_TEMP 8
#define CONSTRAINT_IK_STRETCH 16
#define CONSTRAINT_IK_POS 32
@@ -518,6 +520,7 @@ typedef enum B_CONSTRAINTCHANNEL_FLAG {
/* Rigid-Body Constraint */
#define CONSTRAINT_DRAW_PIVOT 0x40
+#define CONSTRAINT_DISABLE_LINKED_COLLISION 0x80
/* important: these defines need to match up with PHY_DynamicTypes headerfile */
#define CONSTRAINT_RB_BALL 1
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index cc0c9912057..70f469b2bb8 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -1,5 +1,5 @@
/**
- * $Id: DNA_gpencil_types.h 8768 2006-11-07 00:10:37Z aligorith $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/makesdna/DNA_ipo_types.h b/source/blender/makesdna/DNA_ipo_types.h
index 5be6dd727c0..432399e3581 100644
--- a/source/blender/makesdna/DNA_ipo_types.h
+++ b/source/blender/makesdna/DNA_ipo_types.h
@@ -201,6 +201,8 @@ typedef struct Ipo {
#define MA_MAP17 (1<<21)
#define MA_MAP18 (1<<22)
+/* ********** Texture Slots (MTex) ********** */
+
#define TEX_TOTNAM 14
#define MAP_OFS_X 1
diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h
index 217e3ed1463..f8f2255c1a7 100644
--- a/source/blender/makesdna/DNA_lamp_types.h
+++ b/source/blender/makesdna/DNA_lamp_types.h
@@ -91,7 +91,9 @@ typedef struct Lamp {
float atm_extinction_factor;
float atm_distance_factor;
float skyblendfac;
-
+ float sky_exposure;
+ short sky_colorspace, pad4;
+
/* yafray: photonlight params */
int YF_numphotons, YF_numsearch;
short YF_phdepth, YF_useqmc, YF_bufsize, YF_pad;
diff --git a/source/blender/makesdna/DNA_object_fluidsim.h b/source/blender/makesdna/DNA_object_fluidsim.h
index fde1ce57875..2914330a2b0 100644
--- a/source/blender/makesdna/DNA_object_fluidsim.h
+++ b/source/blender/makesdna/DNA_object_fluidsim.h
@@ -142,7 +142,7 @@ typedef struct FluidsimSettings {
#define OB_FLUIDSIM_PARTICLE 64
#define OB_FLUIDSIM_CONTROL 128
-#define OB_TYPEFLAG_START 0
+#define OB_TYPEFLAG_START 7
#define OB_FSGEO_THIN (1<<(OB_TYPEFLAG_START+1))
#define OB_FSBND_NOSLIP (1<<(OB_TYPEFLAG_START+2))
#define OB_FSBND_PARTSLIP (1<<(OB_TYPEFLAG_START+3))
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index af8192b638d..395372d894a 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -434,14 +434,20 @@ typedef struct ToolSettings {
float skgen_angle_limit;
float skgen_correlation_limit;
float skgen_symmetry_limit;
+ float skgen_retarget_angle_weight;
+ float skgen_retarget_length_weight;
+ float skgen_retarget_distance_weight;
short skgen_options;
char skgen_postpro;
char skgen_postpro_passes;
char skgen_subdivisions[3];
+ char skgen_multi_level;
+ char skgen_optimisation_method;
+
+ char tpad[6];
/* Alt+RMB option */
char edge_mode;
- char pad3[4];
} ToolSettings;
/* Used by all brushes to store their properties, which can be directly set
@@ -840,12 +846,21 @@ typedef struct Scene {
#define RETOPO_ELLIPSE 4
/* toolsettings->skgen_options */
-#define SKGEN_FILTER_INTERNAL 1
-#define SKGEN_FILTER_EXTERNAL 2
-#define SKGEN_SYMMETRY 4
-#define SKGEN_CUT_LENGTH 8
-#define SKGEN_CUT_ANGLE 16
-#define SKGEN_CUT_CORRELATION 32
+#define SKGEN_FILTER_INTERNAL (1 << 0)
+#define SKGEN_FILTER_EXTERNAL (1 << 1)
+#define SKGEN_SYMMETRY (1 << 2)
+#define SKGEN_CUT_LENGTH (1 << 3)
+#define SKGEN_CUT_ANGLE (1 << 4)
+#define SKGEN_CUT_CORRELATION (1 << 5)
+#define SKGEN_HARMONIC (1 << 6)
+#define SKGEN_STICK_TO_EMBEDDING (1 << 7)
+#define SKGEN_ADAPTIVE_DISTANCE (1 << 8)
+#define SKGEN_FILTER_SMART (1 << 9)
+#define SKGEN_DISP_LENGTH (1 << 10)
+#define SKGEN_DISP_WEIGHT (1 << 11)
+#define SKGEN_DISP_ORIG (1 << 12)
+#define SKGEN_DISP_EMBED (1 << 13)
+#define SKGEN_DISP_INDEX (1 << 14)
#define SKGEN_SUB_LENGTH 0
#define SKGEN_SUB_ANGLE 1
diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h
index 1fd97fe0158..d8a1ffc6c24 100644
--- a/source/blender/makesdna/DNA_sensor_types.h
+++ b/source/blender/makesdna/DNA_sensor_types.h
@@ -163,12 +163,12 @@ typedef struct bSensor {
typedef struct bJoystickSensor {
char name[32];
- short type;
- short joyindex;
+ char type;
+ char joyindex;
+ short flag;
int axis;
int axisf;
int button;
- int buttonf;
int hat;
int hatf;
int precision;
@@ -252,6 +252,8 @@ typedef struct bJoystickSensor {
#define BL_SENS_MOUSE_MOUSEOVER 16
#define BL_SENS_MOUSE_MOUSEOVER_ANY 32
+#define SENS_JOY_ANY_EVENT 1
+
#define SENS_JOY_BUTTON 0
#define SENS_JOY_BUTTON_PRESSED 0
#define SENS_JOY_BUTTON_RELEASED 1
@@ -266,6 +268,7 @@ typedef struct bJoystickSensor {
#define SENS_JOY_HAT 2
#define SENS_JOY_HAT_DIR 0
+
#define SENS_DELAY_REPEAT 1
// should match JOYINDEX_MAX in SCA_JoystickDefines.h */
#define SENS_JOY_MAXINDEX 8
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index ead1df4ddac..fbd962f9372 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -189,8 +189,8 @@ typedef struct UserDef {
struct ListBase themes;
short undosteps;
short undomemory;
- short gp_manhattendist, gp_euclideandist, pad;
- short curssize;
+ short gp_manhattendist, gp_euclideandist, gp_eraser;
+ short gp_settings;
short tb_leftmouse, tb_rightmouse;
struct SolidLight light[3];
short tw_hotspot, tw_flag, tw_handlesize, tw_size;
@@ -206,7 +206,7 @@ typedef struct UserDef {
short smooth_viewtx; /* miliseconds to spend spinning the view */
short glreslimit;
short ndof_pan, ndof_rotate;
- short pads[2];
+ short curssize, pad;
// char pad[8];
char versemaster[160];
char verseuser[160];
@@ -326,5 +326,9 @@ extern UserDef U; /* from usiblender.c !!!! */
/* tw_flag (transform widget) */
+/* gp_settings (Grease Pencil Settings) */
+#define GP_PAINT_DOSMOOTH (1<<0)
+#define GP_PAINT_DOSIMPLIFY (1<<1)
+
#endif
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index b30a7162b93..b7b5f71c845 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -137,13 +137,19 @@ typedef struct View3D {
short gridsubdiv; /* Number of subdivisions in the grid between each highlighted grid line */
- short pad3;
+ short keyflags; /* flags for display of keyframes */
char ndofmode; /* mode of transform for 6DOF devices -1 not found, 0 normal, 1 fly, 2 ob transform */
char ndoffilter; /*filter for 6DOF devices 0 normal, 1 dominant */
void *properties_storage; /* Nkey panel stores stuff here, not in file */
struct bGPdata *gpd; /* Grease-Pencil Data (annotation layers) */
+
+ /* last view */
+ float lviewquat[4];
+ short lpersp, lview;
+
+ short pad5, pad6;
} View3D;
diff --git a/source/blender/makesdna/intern/SConscript b/source/blender/makesdna/intern/SConscript
index acba9ae2d1d..aaf5ecc910b 100644
--- a/source/blender/makesdna/intern/SConscript
+++ b/source/blender/makesdna/intern/SConscript
@@ -10,8 +10,8 @@ root_build_dir=env['BF_BUILDDIR']
source_files = ['makesdna.c']
header_files = env.Glob('../*.h')
-makesdna_tool = env.Copy()
-dna = env.Copy()
+makesdna_tool = env.Clone()
+dna = env.Clone()
makesdna_tool.Append(CCFLAGS = '-DBASE_HEADER="\\"source/blender/makesdna/\\"" ')
makesdna_tool.Append (CPPPATH = ['#/intern/guardedalloc',
diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript
index 8af7b67520e..038ce4b749e 100644
--- a/source/blender/nodes/SConscript
+++ b/source/blender/nodes/SConscript
@@ -21,8 +21,11 @@ incs += ' ' + env['BF_SDL_INC']
defs = ''
+if not env['WITH_BF_PYTHON']:
+ defs += 'DISABLE_PYTHON'
+
if env['WITH_BF_INTERNATIONAL']:
- defs += 'WITH_FREETYPE2'
+ defs += ' WITH_FREETYPE2'
if env['WITH_BF_VERSE']:
defs += ' WITH_VERSE'
@@ -31,14 +34,14 @@ if env['WITH_BF_VERSE']:
if env['WITH_BF_VERSE']:
defs += ' WITH_VERSE'
-if env['WITH_BF_OPENEXR'] == 1:
+if env['WITH_BF_OPENEXR']:
defs += ' WITH_OPENEXR'
-if env['WITH_BF_FFMPEG'] == 1:
+if env['WITH_BF_FFMPEG']:
defs += ' WITH_FFMPEG'
incs += ' ' + env['BF_FFMPEG_INC']
-if env['WITH_BF_QUICKTIME'] == 1:
+if env['WITH_BF_QUICKTIME']:
defs += ' WITH_QUICKTIME'
incs += ' ' + env['BF_QUICKTIME_INC']
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
index 49473b213ce..2065ac2ed33 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
@@ -27,17 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#ifndef DISABLE_PYTHON
#include <Python.h>
#include <compile.h>
#include <eval.h>
+#endif
#include "DNA_text_types.h"
#include "BKE_text.h"
#include "BKE_utildefines.h"
+#ifndef DISABLE_PYTHON
#include "api2_2x/Node.h"
#include "api2_2x/gen_utils.h"
#include "BPY_extern.h"
+#endif
#include "../SHD_util.h"
@@ -45,6 +49,7 @@ static void node_dynamic_setup(bNode *node);
static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNodeStack **out);
static void node_dynamic_free_storage_cb(bNode *node);
+#ifndef DISABLE_PYTHON
static PyObject *init_dynamicdict(void) {
PyObject *newscriptdict;
PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -58,6 +63,7 @@ static PyObject *init_dynamicdict(void) {
return newscriptdict;
}
+#endif
static bNodeType *node_dynamic_find_typeinfo(ListBase *list, ID *id)
{
@@ -140,12 +146,12 @@ static void node_dynamic_update_socket_links(bNode *node, bNodeTree *ntree)
static void node_dynamic_free_storage_cb(bNode *node)
{
+#ifndef DISABLE_PYTHON
NodeScriptDict *nsd;
PyObject *pydict;
BPy_Node *pynode;
if (!node->storage) return;
-
nsd = (NodeScriptDict *)(node->storage);
pydict = nsd->dict;
if (pydict) {
@@ -155,6 +161,7 @@ static void node_dynamic_free_storage_cb(bNode *node)
if (pynode) {
Py_DECREF(pynode);
}
+#endif
MEM_freeN(node->storage);
node->storage = NULL;
}
@@ -169,6 +176,7 @@ static void node_dynamic_disable(bNode *node)
/* Disable all pynodes using the given text (script) id */
static void node_dynamic_disable_all_by_id(ID *id)
{
+#ifndef DISABLE_PYTHON
Material *ma; /* XXX hardcoded for shaders */
for (ma= G.main->mat.first; ma; ma= ma->id.next) {
@@ -183,6 +191,7 @@ static void node_dynamic_disable_all_by_id(ID *id)
}
}
}
+#endif
}
static void node_rem_socklist_links(bNodeTree *ntree, ListBase *lb)
@@ -327,6 +336,7 @@ int nodeDynamicUnlinkText(ID *txtid) {
static void node_dynamic_pyerror_print(bNode *node)
{
+#ifndef DISABLE_PYTHON
PyGILState_STATE gilstate = PyGILState_Ensure();
fprintf(stderr, "\nError in dynamic node script \"%s\":\n", node->name);
@@ -334,6 +344,7 @@ static void node_dynamic_pyerror_print(bNode *node)
else { fprintf(stderr, "Not a valid dynamic node Python script.\n"); }
PyGILState_Release(gilstate);
+#endif
}
static void node_dynamic_register_type(bNode *node)
@@ -348,6 +359,7 @@ static void node_dynamic_register_type(bNode *node)
node->typeinfo->name = BLI_strdup(node->name);
}
+#ifndef DISABLE_PYTHON
/* node_dynamic_get_pynode:
* Find the pynode definition from the script */
static PyObject *node_dynamic_get_pynode(PyObject *dict)
@@ -389,9 +401,13 @@ static PyObject *node_dynamic_get_pynode(PyObject *dict)
"no PyNode definition found in the script!");
return NULL;
}
+#endif /* DISABLE_PYTHON */
static int node_dynamic_parse(struct bNode *node)
{
+#ifdef DISABLE_PYTHON
+ return -1;
+#else
PyObject *dict= NULL;
PyObject *pynode_data= NULL;
PyObject *pynode= NULL;
@@ -479,12 +495,14 @@ static int node_dynamic_parse(struct bNode *node)
}
return 0;
+#endif
}
/* node_dynamic_setup: prepare for execution (state: NODE_DYNAMIC_READY)
* pynodes already linked to a script (node->id != NULL). */
static void node_dynamic_setup(bNode *node)
{
+#ifndef DISABLE_PYTHON
NodeScriptDict *nsd = NULL;
bNodeTree *nodetree = NULL;
bNodeType *ntype = NULL;
@@ -608,7 +626,7 @@ static void node_dynamic_setup(bNode *node)
node->custom1 = BSET(node->custom1, NODE_DYNAMIC_READY);
PyGILState_Release(gilstate);
-
+#endif /* DISABLE_PYTHON */
return;
}
@@ -641,6 +659,9 @@ static void node_dynamic_init_cb(bNode *node) {
/* node_dynamic_copy_cb: pynode copy callback */
static void node_dynamic_copy_cb(bNode *orig_node, bNode *new_node)
{
+#ifdef DISABLE_PYTHON
+ return;
+#else
NodeScriptDict *nsd;
PyGILState_STATE gilstate;
@@ -657,11 +678,15 @@ static void node_dynamic_copy_cb(bNode *orig_node, bNode *new_node)
Py_INCREF((PyObject *)(nsd->dict));
PyGILState_Release(gilstate);
+#endif
}
/* node_dynamic_exec_cb: the execution callback called per pixel
* during rendering. */
static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNodeStack **out) {
+#ifdef DISABLE_PYTHON
+ return;
+#else
BPy_Node *mynode = NULL;
NodeScriptDict *nsd = NULL;
PyObject *pyresult = NULL;
@@ -716,6 +741,7 @@ static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNode
PyGILState_Release(gilstate);
}
}
+#endif
}
bNodeType node_dynamic_typeinfo = {
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c
index 31609970f6f..1c8b606ace3 100644
--- a/source/blender/python/BPY_interface.c
+++ b/source/blender/python/BPY_interface.c
@@ -95,12 +95,13 @@
PyObject *bpy_pydriver_Dict = NULL;
PyObject *bpy_orig_syspath_List = NULL;
+
/*
* set up a weakref list for Armatures
* creates list in __main__ module dict
*/
-int setup_armature_weakrefs()
+static int setup_armature_weakrefs()
{
PyObject *maindict;
PyObject *main_module;
@@ -159,19 +160,18 @@ ScriptError g_script_error;
/***************************************************************************
* Function prototypes
***************************************************************************/
-PyObject *RunPython( Text * text, PyObject * globaldict );
-PyObject *CreateGlobalDictionary( void );
-void ReleaseGlobalDictionary( PyObject * dict );
-void DoAllScriptsFromList( ListBase * list, short event );
+static PyObject *RunPython( Text * text, PyObject * globaldict );
+static PyObject *CreateGlobalDictionary( void );
+static void ReleaseGlobalDictionary( PyObject * dict );
+static void DoAllScriptsFromList( ListBase * list, short event );
static PyObject *importText( char *name );
-void init_ourImport( void );
-void init_ourReload( void );
-PyObject *blender_import( PyObject * self, PyObject * args );
-PyObject *RunPython2( Text * text, PyObject * globaldict, PyObject *localdict );
+static void init_ourImport( void );
+static void init_ourReload( void );
+static PyObject *blender_import( PyObject * self, PyObject * args );
-void BPY_Err_Handle( char *script_name );
-PyObject *traceback_getFilename( PyObject * tb );
+static void BPY_Err_Handle( char *script_name );
+static PyObject *traceback_getFilename( PyObject * tb );
/****************************************************************************
* Description: This function will start the interpreter and load all modules
@@ -195,7 +195,7 @@ void BPY_start_python( int argc, char **argv )
//stuff for Registry module
bpy_registryDict = PyDict_New( );/* check comment at start of this file */
if( !bpy_registryDict )
- printf( "Error: Couldn't create the Registry Python Dictionary!" );
+ printf( "Warning: Couldn't create the Registry Python Dictionary!" );
Py_SetProgramName( "blender" );
/* Py_Initialize() will attempt to import the site module and
@@ -223,11 +223,11 @@ void BPY_start_python( int argc, char **argv )
//Start the interpreter
Py_Initialize( );
+
PySys_SetArgv( argc_copy, argv_copy );
-
/* Initialize thread support (also acquires lock) */
PyEval_InitThreads();
-
+
//Overrides __import__
init_ourImport( );
init_ourReload( );
@@ -237,7 +237,6 @@ void BPY_start_python( int argc, char **argv )
//Look for a python installation
init_syspath( first_time ); /* not first_time: some msgs are suppressed */
-
py_tstate = PyGILState_GetThisThreadState();
PyEval_ReleaseThread(py_tstate);
@@ -290,9 +289,6 @@ void syspath_append( char *dirname )
{
PyObject *mod_sys= NULL, *dict= NULL, *path= NULL, *dir= NULL;
short ok=1;
- PyErr_Clear( );
-
- dir = PyString_FromString( dirname );
mod_sys = PyImport_ImportModule( "sys" ); /* new ref */
@@ -304,16 +300,21 @@ void syspath_append( char *dirname )
}
} else {
/* cant get the sys module */
+ /* PyErr_Clear(); is called below */
ok = 0;
}
- if (PySequence_Contains(path, dir)==0) { /* Only add if we need to */
- if (ok && PyList_Append( path, dir ) != 0) /* decref below */
- ok = 0; /* append failed */
+ dir = PyString_FromString( dirname );
- if( (ok==0) || PyErr_Occurred( ) )
- Py_FatalError( "could import or build sys.path, can't continue" );
+ if (ok && PySequence_Contains(path, dir)==0) { /* Only add if we need to */
+ if (PyList_Append( path, dir ) != 0) /* decref below */
+ ok = 0; /* append failed */
}
+
+ if( (ok==0) || PyErr_Occurred( ) )
+ fprintf(stderr, "Warning: could import or build sys.path\n" );
+
+ PyErr_Clear();
Py_DECREF( dir );
Py_XDECREF( mod_sys );
}
@@ -332,8 +333,10 @@ void init_syspath( int first_time )
d = PyModule_GetDict( mod );
EXPP_dict_set_item_str( d, "progname", PyString_FromString( bprogname ) );
Py_DECREF( mod );
- } else
- printf( "Warning: could not set Blender.sys.progname\n" );
+ } else {
+ printf( "Warning: could not set Blender.sys\n" );
+ PyErr_Clear();
+ }
progname = BLI_last_slash( bprogname ); /* looks for the last dir separator */
@@ -392,7 +395,8 @@ void init_syspath( int first_time )
Py_DECREF( mod );
} else{
- printf("import of sys module failed\n");
+ PyErr_Clear( );
+ printf("Warning: import of sys module failed\n");
}
}
@@ -405,13 +409,14 @@ void BPY_rebuild_syspath( void )
mod = PyImport_ImportModule( "sys" );
if (!mod) {
- printf("error: could not import python sys module. some modules may not import.\n");
+ printf("Warning: could not import python sys module. some modules may not import.\n");
+ PyErr_Clear( );
PyGILState_Release(gilstate);
return;
}
if (!bpy_orig_syspath_List) { /* should never happen */
- printf("error refershing python path\n");
+ printf("Warning: cant refresh python path, bpy_orig_syspath_List is NULL\n");
Py_DECREF(mod);
PyGILState_Release(gilstate);
return;
@@ -507,7 +512,7 @@ const char *BPY_Err_getFilename( void )
/*****************************************************************************/
/* Description: Return PyString filename from a traceback object */
/*****************************************************************************/
-PyObject *traceback_getFilename( PyObject * tb )
+static PyObject *traceback_getFilename( PyObject * tb )
{
PyObject *v = NULL;
@@ -527,16 +532,27 @@ PyObject *traceback_getFilename( PyObject * tb )
else return PyString_FromString("unknown");
}
+static void BPY_Err_Clear(void)
+{
+ /* Added in 2.48a, the last_traceback can reference Objects for example, increasing
+ * their user count. Not to mention holding references to wrapped data.
+ * This is especially bad when the PyObject for the wrapped data is free'd, after blender
+ * has alredy dealocated the pointer */
+ PySys_SetObject( "last_traceback", Py_None);
+
+ PyErr_Clear();
+}
/****************************************************************************
* Description: Blender Python error handler. This catches the error and
* stores filename and line number in a global
*****************************************************************************/
-void BPY_Err_Handle( char *script_name )
+static void BPY_Err_Handle( char *script_name )
{
PyObject *exception, *err, *tb, *v;
if( !script_name ) {
printf( "Error: script has NULL name\n" );
+ BPY_Err_Clear();
return;
}
@@ -563,8 +579,9 @@ void BPY_Err_Handle( char *script_name )
} else {
g_script_error.lineno = -1;
}
- /* this avoids an abort in Python 2.3's garbage collecting: */
- PyErr_Clear( );
+ /* this avoids an abort in Python 2.3's garbage collecting:
+ PyErr_Clear() */
+ BPY_Err_Clear(); /* Calls PyErr_Clear as well */
return;
} else {
PyErr_NormalizeException( &exception, &err, &tb );
@@ -574,6 +591,7 @@ void BPY_Err_Handle( char *script_name )
if( !tb ) {
printf( "\nCan't get traceback\n" );
+ BPY_Err_Clear(); /* incase there is still some data hanging about */
return;
}
@@ -611,7 +629,8 @@ void BPY_Err_Handle( char *script_name )
}
Py_DECREF( tb );
}
-
+
+ BPY_Err_Clear();
return;
}
@@ -1227,6 +1246,8 @@ static int bpy_pydriver_create_dict(void)
PyDict_SetItemString(d, "Blender", mod);
PyDict_SetItemString(d, "b", mod);
Py_DECREF(mod);
+ } else {
+ PyErr_Clear();
}
mod = PyImport_ImportModule("math");
@@ -1244,6 +1265,8 @@ static int bpy_pydriver_create_dict(void)
PyDict_SetItemString(d, "noise", mod);
PyDict_SetItemString(d, "n", mod);
Py_DECREF(mod);
+ } else {
+ PyErr_Clear();
}
/* If there's a Blender text called pydrivers.py, import it.
@@ -1269,6 +1292,8 @@ static int bpy_pydriver_create_dict(void)
PyDict_SetItemString(d, "ob", fcn);
Py_DECREF(fcn);
}
+ } else {
+ PyErr_Clear();
}
/* TODO - change these */
@@ -1281,6 +1306,8 @@ static int bpy_pydriver_create_dict(void)
PyDict_SetItemString(d, "me", fcn);
Py_DECREF(fcn);
}
+ } else {
+ PyErr_Clear();
}
/* ma(matname) == Blender.Material.Get(matname) */
@@ -1292,6 +1319,8 @@ static int bpy_pydriver_create_dict(void)
PyDict_SetItemString(d, "ma", fcn);
Py_DECREF(fcn);
}
+ } else {
+ PyErr_Clear();
}
return 0;
@@ -2712,8 +2741,10 @@ int BPY_call_importloader( char *name )
* Description: This function executes the python script passed by text.
* The Python dictionary containing global variables needs to
* be passed in globaldict.
+* NOTE: Make sure BPY_Err_Handle() runs if this returns NULL
+* otherwise pointers can be left in sys.last_traceback that become invalid.
*****************************************************************************/
-PyObject *RunPython( Text * text, PyObject * globaldict )
+static PyObject *RunPython( Text * text, PyObject * globaldict )
{
char *buf = NULL;
@@ -2741,7 +2772,7 @@ PyObject *RunPython( Text * text, PyObject * globaldict )
/*****************************************************************************
* Description: This function creates a new Python dictionary object.
*****************************************************************************/
-PyObject *CreateGlobalDictionary( void )
+static PyObject *CreateGlobalDictionary( void )
{
PyObject *dict = PyDict_New( );
@@ -2755,7 +2786,7 @@ PyObject *CreateGlobalDictionary( void )
/*****************************************************************************
* Description: This function deletes a given Python dictionary object.
*****************************************************************************/
-void ReleaseGlobalDictionary( PyObject * dict )
+static void ReleaseGlobalDictionary( PyObject * dict )
{
PyDict_Clear( dict );
Py_DECREF( dict ); /* Release dictionary. */
@@ -2768,7 +2799,7 @@ void ReleaseGlobalDictionary( PyObject * dict )
* list argument. The event by which the function has been
* called, is passed in the event argument.
*****************************************************************************/
-void DoAllScriptsFromList( ListBase * list, short event )
+static void DoAllScriptsFromList( ListBase * list, short event )
{
ID *id;
@@ -2821,17 +2852,24 @@ static PyMethodDef bimport[] = {
{"blimport", blender_import, METH_VARARGS, "our own import"}
};
-PyObject *blender_import( PyObject * self, PyObject * args )
+static PyObject *blender_import( PyObject * self, PyObject * args )
{
PyObject *exception, *err, *tb;
char *name;
PyObject *globals = NULL, *locals = NULL, *fromlist = NULL;
PyObject *m;
-
+ //PyObject_Print(args, stderr, 0);
+#if (PY_VERSION_HEX >= 0x02060000)
+ int dummy_val; /* what does this do?*/
+
+ if( !PyArg_ParseTuple( args, "s|OOOi:bimport",
+ &name, &globals, &locals, &fromlist, &dummy_val) )
+ return NULL;
+#else
if( !PyArg_ParseTuple( args, "s|OOO:bimport",
&name, &globals, &locals, &fromlist ) )
return NULL;
-
+#endif
m = PyImport_ImportModuleEx( name, globals, locals, fromlist );
if( m )
@@ -2852,7 +2890,7 @@ PyObject *blender_import( PyObject * self, PyObject * args )
return m;
}
-void init_ourImport( void )
+static void init_ourImport( void )
{
PyObject *m, *d;
PyObject *import = PyCFunction_New( bimport, NULL );
@@ -2953,7 +2991,7 @@ static PyMethodDef breload[] = {
{"blreload", blender_reload, METH_VARARGS, "our own reload"}
};
-void init_ourReload( void )
+static void init_ourReload( void )
{
PyObject *m, *d;
PyObject *reload = PyCFunction_New( breload, NULL );
diff --git a/source/blender/python/BPY_menus.c b/source/blender/python/BPY_menus.c
index 69b50e5c47a..9e7abc44657 100644
--- a/source/blender/python/BPY_menus.c
+++ b/source/blender/python/BPY_menus.c
@@ -479,7 +479,7 @@ static int bpymenu_CreateFromFile( void )
char line[255], w1[255], w2[255], tooltip[255], *tip;
char upythondir[FILE_MAX];
char *homedir = NULL;
- int parsing, version, is_userdir;
+ int parsing, version, w2_len, is_userdir;
short group;
BPyMenu *pymenu = NULL;
@@ -554,17 +554,32 @@ will use 'Misc'.\n", w1 );
else if( line[0] == '\n' )
continue;
else if( line[0] == '\'' ) { /* menu entry */
- parsing =
+/* parsing =
sscanf( line,
"'%[^']' %d %s %d '%[^']'\n",
w1, &version, w2, &is_userdir,
tooltip );
-
- if( parsing <= 0 ) { /* invalid line, get rid of it */
+*/
+ /* previously filenames with spaces were not supported;
+ * this adds support for that w/o breaking the existing
+ * few, exotic scripts that parse the Bpymenus file */
+ parsing = sscanf( line,
+ "'%[^']' %d %[^'\n] '%[^']'\n",
+ w1, &version, w2, tooltip );
+ if( parsing <= 0 ) { /* invalid line, get rid of it */
fgets( line, 255, fp );
- } else if( parsing == 5 )
+ } else if( parsing == 4 )
tip = tooltip; /* has tooltip */
+ w2_len = strlen(w2);
+ if( w2[w2_len-1] == ' ') {
+ w2[w2_len-1] = '\0';
+ w2_len -= 1;
+ }
+ if( w2[w2_len-1] == '1') is_userdir = 1;
+ else is_userdir = 0;
+ w2[w2_len-2] = '\0';
+
pymenu = bpymenu_AddEntry( group,
( short ) version,
w1, w2, is_userdir,
@@ -693,13 +708,7 @@ void BPyMenu_PrintAllEntries( void )
}
/* bpymenu_ParseFile:
- * recursively scans folders looking for scripts to register.
- *
- * This function scans the scripts directory looking for .py files with the
- * right header and menu info, using that to fill the bpymenu structs.
- * is_userdir defines if the script is in the default scripts dir or the
- * user defined one (U.pythondir: is_userdir == 1).
- * Speed is important.
+ * parse a given .py file looking for a proper header.
*
* The first line of the script must be '#!BPY'.
* The header registration lines must appear between the first pair of
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index cb33f8437f1..7f8dd0e1227 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -1,7 +1,7 @@
#!/usr/bin/python
Import ('env')
-sources = Split('BPY_interface.c BPY_menus.c') + env.Glob('api2_2x/*.c')
+sources = env.Glob('*.c') + env.Glob('api2_2x/*.c')
incs = 'api2_2x ../blenkernel ../nodes ../blenlib ../blenloader'
incs += ' ../render/extern/include ../radiosity/extern/include ../freestyle/intern/python'
@@ -14,17 +14,17 @@ defs = []
if env['OURPLATFORM'] in ('win32-mingw') and env['BF_DEBUG']:
defs.append('Py_TRACE_REFS')
-if env['WITH_BF_QUICKTIME']==1:
+if env['WITH_BF_QUICKTIME']:
incs += ' ' + env['BF_QUICKTIME_INC']
defs.append('WITH_QUICKTIME')
-if env['WITH_BF_OPENEXR'] == 1:
+if env['WITH_BF_OPENEXR']:
defs.append('WITH_OPENEXR')
-if env['WITH_BF_FFMPEG'] == 1:
+if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
-if env['BF_BUILDINFO'] == 1:
+if env['BF_BUILDINFO']:
defs.append('NAN_BUILDINFO')
env.BlenderLib ( libname='blender_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype=['core','game2'], priority = [60,115] )
diff --git a/source/blender/python/api2_2x/Armature.c b/source/blender/python/api2_2x/Armature.c
index 0db87c00dd2..aa3ef82a3e8 100644
--- a/source/blender/python/api2_2x/Armature.c
+++ b/source/blender/python/api2_2x/Armature.c
@@ -57,9 +57,9 @@ static const char sArmatureBadArgs[] = "ArmatureType - Bad Arguments: ";
static const char sModuleError[] = "Blender.Armature - Error: ";
static const char sModuleBadArgs[] = "Blender.Armature - Bad Arguments: ";
-PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject *weakref);
+static PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject *weakref);
/* python callable */
-PyObject * arm_weakref_callback_weakref_dealloc__pyfunc;
+static PyObject * arm_weakref_callback_weakref_dealloc__pyfunc;
//################## BonesDict_Type (internal) ########################
/*This is an internal psuedo-dictionary type that allows for manipulation
@@ -923,7 +923,7 @@ AttributeError:
sArmatureError, "You are not allowed to change the .Bones attribute");
}
-//------------------------Bone.layerMask (get)
+//------------------------Armature.layerMask (get)
static PyObject *Armature_getLayerMask(BPy_Armature *self)
{
/* do this extra stuff because the short's bits can be negative values */
@@ -931,7 +931,7 @@ static PyObject *Armature_getLayerMask(BPy_Armature *self)
laymask |= self->armature->layer;
return PyInt_FromLong((int)laymask);
}
-//------------------------Bone.layerMask (set)
+//------------------------Armature.layerMask (set)
static int Armature_setLayerMask(BPy_Armature *self, PyObject *value)
{
int laymask;
@@ -1295,7 +1295,6 @@ static PyObject *M_Armature_New(PyObject * self, PyObject * args)
return (PyObject *)obj;
}
-
//-------------------MODULE METHODS DEFINITION-----------------------------
static char M_Armature_Get_doc[] = "(name) - return the armature with the name 'name', \
@@ -1323,7 +1322,7 @@ PyObject *Armature_RebuildBones(PyObject *pyarmature)
}
/* internal func to remove weakref from weakref list */
-PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject *weakref)
+static PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject *weakref)
{
char *list_name = ARM_WEAKREF_LIST_NAME;
PyObject *maindict = NULL, *armlist = NULL;
diff --git a/source/blender/python/api2_2x/BezTriple.c b/source/blender/python/api2_2x/BezTriple.c
index b7b94dc93e1..9e57994d2da 100644
--- a/source/blender/python/api2_2x/BezTriple.c
+++ b/source/blender/python/api2_2x/BezTriple.c
@@ -694,6 +694,7 @@ PyObject *newBezTriple( float *numbuf )
}
bzt->h1 = HD_ALIGN;
bzt->h2 = HD_ALIGN;
+ bzt->radius = 1.0;
/* wrap it */
pyobj = BezTriple_CreatePyObject( bzt );
diff --git a/source/blender/python/api2_2x/CurNurb.c b/source/blender/python/api2_2x/CurNurb.c
index b2120bd63c6..63a1dccbc50 100644
--- a/source/blender/python/api2_2x/CurNurb.c
+++ b/source/blender/python/api2_2x/CurNurb.c
@@ -522,7 +522,7 @@ PyObject *CurNurb_appendPointToNurb( Nurb * nurb, PyObject * value )
else if( PySequence_Check( value ) ) {
size = PySequence_Size( value );
/* printf("\ndbg: got a sequence of size %d\n", size ); */
- if( size == 4 || size == 5 ) {
+ if( size == 4 || size == 5 || size == 6) {
BPoint *tmp;
tmp = nurb->bp; /* save old pts */
@@ -556,8 +556,8 @@ PyObject *CurNurb_appendPointToNurb( Nurb * nurb, PyObject * value )
Py_DECREF( item );
}
- if (size == 5) {
- PyObject *item = PySequence_GetItem( value, i );
+ if (size >= 5) {
+ PyObject *item = PySequence_GetItem( value, 4 );
if (item == NULL)
return NULL;
@@ -568,18 +568,33 @@ PyObject *CurNurb_appendPointToNurb( Nurb * nurb, PyObject * value )
else {
nurb->bp[npoints].alfa = 0.0f;
}
+
+ if (size == 6) {
+ PyObject *item = PySequence_GetItem( value, 5 );
+
+ if (item == NULL)
+ return NULL;
+ nurb->bp[npoints].radius = ( float ) PyFloat_AsDouble( item );
+ Py_DECREF( item );
+ }
+ else {
+ nurb->bp[npoints].radius = 1.0f;
+ }
+
+ nurb->bp[npoints].weight = 0.0; /* softbody weight TODO - add access to this, is zero elsewhere but through blender is 1.0 by default */
+
makeknots( nurb, 1, nurb->flagu >> 1 );
} else {
return EXPP_ReturnPyObjError( PyExc_TypeError,
- "expected a sequence of 4 or 5 floats" );
+ "expected a sequence of 4 or 6 floats" );
}
} else {
/* bail with error */
return EXPP_ReturnPyObjError( PyExc_TypeError,
- "expected a sequence of 4 or 5 floats" );
+ "expected a sequence of 4 to 6 floats" );
}
diff --git a/source/blender/python/api2_2x/Curve.c b/source/blender/python/api2_2x/Curve.c
index 26208e600e6..d1abde19de9 100644
--- a/source/blender/python/api2_2x/Curve.c
+++ b/source/blender/python/api2_2x/Curve.c
@@ -822,6 +822,7 @@ static PyObject *Curve_appendNurb( BPy_Curve * self, PyObject * value )
new_nurb->bezt->f2 = SELECT;
new_nurb->bezt->f3 = SELECT;
new_nurb->bezt->hide = 0;
+ new_nurb->bezt->radius = 1.0;
/* calchandlesNurb( new_nurb ); */
} else { /* set up bp */
new_nurb->pntsv = 1;
@@ -831,6 +832,7 @@ static PyObject *Curve_appendNurb( BPy_Curve * self, PyObject * value )
new_nurb->flagv = 0;
new_nurb->bp->f1 = 0;
new_nurb->bp->hide = 0;
+ new_nurb->bp->radius = 1.0;
new_nurb->knotsu = 0;
/*makenots( new_nurb, 1, new_nurb->flagu >> 1); */
}
diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c
index b04366d5579..e0111f099aa 100644
--- a/source/blender/python/api2_2x/Draw.c
+++ b/source/blender/python/api2_2x/Draw.c
@@ -141,7 +141,7 @@ static uiBlock *uiblock=NULL;
static char Draw_doc[] = "The Blender.Draw submodule";
-static char Method_UIBlock_doc[] = "(drawfunc, x,y) - Popup dialog where buttons can be drawn (expemental)";
+static char Method_UIBlock_doc[] = "(drawfunc, mouse_exit) - Popup dialog where buttons can be drawn (expemental)";
static char Method_Register_doc[] =
"(draw, event, button) - Register callbacks for windowing\n\n\
@@ -290,9 +290,9 @@ static char Method_Text_doc[] =
This function returns the width of the drawn string.";
static char Method_Label_doc[] =
- "(text, x, y) - Draw a text label onscreen\n\n\
+ "(text, x, y, w, h, tip, callback) - Draw a text label onscreen\n\n\
(text) The text to draw\n\
-(x, y) The lower left coordinate of the lable";
+(x, y, w, h) The lower left coordinate of the lable, width and height";
static char Method_PupMenu_doc[] =
"(string, maxrow = None) - Display a pop-up menu at the screen.\n\
@@ -1101,15 +1101,16 @@ static PyObject *Method_UIBlock( PyObject * self, PyObject * args )
PyObject *val = NULL;
PyObject *result = NULL;
ListBase listb= {NULL, NULL};
+ int mouse_exit = 1;
if (G.background) {
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"Can't run Draw.UIBlock() in background mode." );
}
- if ( !PyArg_ParseTuple( args, "O", &val ) || !PyCallable_Check( val ) )
+ if ( !PyArg_ParseTuple( args, "O|i", &val, &mouse_exit ) || !PyCallable_Check( val ) )
return EXPP_ReturnPyObjError( PyExc_AttributeError,
- "expected 1 python function and 2 ints" );
+ "expected 1 python function and an optional int" );
if (uiblock)
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
@@ -1121,7 +1122,7 @@ static PyObject *Method_UIBlock( PyObject * self, PyObject * args )
uiblock= uiNewBlock(&listb, "numbuts", UI_EMBOSS, UI_HELV, G.curscreen->mainwin);
uiBlockSetFlag(uiblock, UI_BLOCK_LOOP|UI_BLOCK_REDRAW);
- result = PyObject_CallObject( val, Py_BuildValue( "()" ) );
+ result = PyObject_CallObject( val, NULL );
if (!result) {
PyErr_Print( );
@@ -1146,7 +1147,7 @@ static PyObject *Method_UIBlock( PyObject * self, PyObject * args )
/* Done clearing events */
uiBoundsBlock(uiblock, 5);
- uiDoBlocks(&listb, 0, 1);
+ uiDoBlocks(&listb, 0, mouse_exit);
}
uiFreeBlocks(&listb);
uiblock = NULL;
@@ -1156,10 +1157,12 @@ static PyObject *Method_UIBlock( PyObject * self, PyObject * args )
Py_RETURN_NONE;
}
-void Set_uiBlock(uiBlock *block)
+#if 0 /* not used yet */
+static void Set_uiBlock(uiBlock *block)
{
uiblock = block;
}
+#endif
static uiBlock *Get_uiBlock( void )
{
diff --git a/source/blender/python/api2_2x/Geometry.c b/source/blender/python/api2_2x/Geometry.c
index c800adee30b..89c63870d59 100644
--- a/source/blender/python/api2_2x/Geometry.c
+++ b/source/blender/python/api2_2x/Geometry.c
@@ -54,6 +54,7 @@ static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq );
static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args );
static PyObject *M_Geometry_ClosestPointOnLine( PyObject * self, PyObject * args );
static PyObject *M_Geometry_PointInTriangle2D( PyObject * self, PyObject * args );
+static PyObject *M_Geometry_PointInQuad2D( PyObject * self, PyObject * args );
static PyObject *M_Geometry_BoxPack2D( PyObject * self, PyObject * args );
@@ -62,7 +63,8 @@ static char M_Geometry_doc[] = "The Blender Geometry module\n\n";
static char M_Geometry_PolyFill_doc[] = "(veclist_list) - takes a list of polylines (each point a vector) and returns the point indicies for a polyline filled with triangles";
static char M_Geometry_LineIntersect2D_doc[] = "(lineA_p1, lineA_p2, lineB_p1, lineB_p2) - takes 2 lines (as 4 vectors) and returns a vector for their point of intersection or None";
static char M_Geometry_ClosestPointOnLine_doc[] = "(pt, line_p1, line_p2) - takes a point and a line and returns a (Vector, Bool) for the point on the line, and the bool so you can know if the point was between the 2 points";
-static char M_Geometry_PointInTriangle2D_doc[] = "(pt, tri_p1, tri_p2, tri_p3) - takes 4 vectors, one is the point and the next 3 define the triabgle, only the x and y are used from the vectors";
+static char M_Geometry_PointInTriangle2D_doc[] = "(pt, tri_p1, tri_p2, tri_p3) - takes 4 vectors, one is the point and the next 3 define the triangle, only the x and y are used from the vectors";
+static char M_Geometry_PointInQuad2D_doc[] = "(pt, quad_p1, quad_p2, quad_p3, quad_p4) - takes 5 vectors, one is the point and the next 4 define the quad, only the x and y are used from the vectors";
static char M_Geometry_BoxPack2D_doc[] = "";
/*-----------------------METHOD DEFINITIONS ----------------------*/
struct PyMethodDef M_Geometry_methods[] = {
@@ -70,6 +72,7 @@ struct PyMethodDef M_Geometry_methods[] = {
{"LineIntersect2D", ( PyCFunction ) M_Geometry_LineIntersect2D, METH_VARARGS, M_Geometry_LineIntersect2D_doc},
{"ClosestPointOnLine", ( PyCFunction ) M_Geometry_ClosestPointOnLine, METH_VARARGS, M_Geometry_ClosestPointOnLine_doc},
{"PointInTriangle2D", ( PyCFunction ) M_Geometry_PointInTriangle2D, METH_VARARGS, M_Geometry_PointInTriangle2D_doc},
+ {"PointInQuad2D", ( PyCFunction ) M_Geometry_PointInQuad2D, METH_VARARGS, M_Geometry_PointInQuad2D_doc},
{"BoxPack2D", ( PyCFunction ) M_Geometry_BoxPack2D, METH_O, M_Geometry_BoxPack2D_doc},
{NULL, NULL, 0, NULL}
};
@@ -313,9 +316,6 @@ static PyObject *M_Geometry_ClosestPointOnLine( PyObject * self, PyObject * args
return ret;
}
-#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
-#define POINT_IN_TRI(p0,p1,p2,p3) ((SIDE_OF_LINE(p1,p2,p0)>=0) && (SIDE_OF_LINE(p2,p3,p0)>=0) && (SIDE_OF_LINE(p3,p1,p0)>=0))
-
static PyObject *M_Geometry_PointInTriangle2D( PyObject * self, PyObject * args )
{
VectorObject *pt_vec, *tri_p1, *tri_p2, *tri_p3;
@@ -329,13 +329,27 @@ static PyObject *M_Geometry_PointInTriangle2D( PyObject * self, PyObject * args
return ( EXPP_ReturnPyObjError
( PyExc_TypeError, "expected 4 vector types\n" ) );
- if POINT_IN_TRI(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec)
- Py_RETURN_TRUE;
- else
- Py_RETURN_FALSE;
+ return PyInt_FromLong(IsectPT2Df(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec));
+}
+
+static PyObject *M_Geometry_PointInQuad2D( PyObject * self, PyObject * args )
+{
+ VectorObject *pt_vec, *quad_p1, *quad_p2, *quad_p3, *quad_p4;
+
+ if( !PyArg_ParseTuple ( args, "O!O!O!O!O!",
+ &vector_Type, &pt_vec,
+ &vector_Type, &quad_p1,
+ &vector_Type, &quad_p2,
+ &vector_Type, &quad_p3,
+ &vector_Type, &quad_p4)
+ )
+ return ( EXPP_ReturnPyObjError
+ ( PyExc_TypeError, "expected 5 vector types\n" ) );
+
+ return PyInt_FromLong(IsectPQ2Df(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
}
-int boxPack_FromPyObject(PyObject * value, boxPack **boxarray )
+static int boxPack_FromPyObject(PyObject * value, boxPack **boxarray )
{
int len, i;
PyObject *list_item, *item_1, *item_2;
@@ -379,7 +393,7 @@ int boxPack_FromPyObject(PyObject * value, boxPack **boxarray )
return 0;
}
-void boxPack_ToPyObject(PyObject * value, boxPack **boxarray)
+static void boxPack_ToPyObject(PyObject * value, boxPack **boxarray)
{
int len, i;
PyObject *list_item;
@@ -399,7 +413,7 @@ void boxPack_ToPyObject(PyObject * value, boxPack **boxarray)
static PyObject *M_Geometry_BoxPack2D( PyObject * self, PyObject * boxlist )
{
- boxPack *boxarray;
+ boxPack *boxarray = NULL;
float tot_width, tot_height;
int len;
int error;
diff --git a/source/blender/python/api2_2x/Group.c b/source/blender/python/api2_2x/Group.c
index 3152d3a973f..0998053e7e1 100644
--- a/source/blender/python/api2_2x/Group.c
+++ b/source/blender/python/api2_2x/Group.c
@@ -56,8 +56,8 @@
/* Python API function prototypes for the Blender module. */
/*****************************************************************************/
static PyObject *M_Group_New( PyObject * self, PyObject * args );
-PyObject *M_Group_Get( PyObject * self, PyObject * args );
-PyObject *M_Group_Unlink( PyObject * self, BPy_Group * pygrp );
+static PyObject *M_Group_Get( PyObject * self, PyObject * args );
+static PyObject *M_Group_Unlink( PyObject * self, BPy_Group * pygrp );
/* internal */
static PyObject *GroupObSeq_CreatePyObject( BPy_Group *self, GroupObject *iter );
@@ -405,7 +405,7 @@ PyObject *M_Group_New( PyObject * self, PyObject * args )
/* Function: M_Group_Get */
/* Python equivalent: Blender.Group.Get */
/*****************************************************************************/
-PyObject *M_Group_Get( PyObject * self, PyObject * args )
+static PyObject *M_Group_Get( PyObject * self, PyObject * args )
{
char *name = NULL;
Group *group_iter;
@@ -475,7 +475,7 @@ PyObject *M_Group_Get( PyObject * self, PyObject * args )
/* Function: M_Group_Unlink */
/* Python equivalent: Blender.Group.Unlink */
/*****************************************************************************/
-PyObject *M_Group_Unlink( PyObject * self, BPy_Group * pygrp )
+static PyObject *M_Group_Unlink( PyObject * self, BPy_Group * pygrp )
{
Group *group;
if( !BPy_Group_Check(pygrp) )
diff --git a/source/blender/python/api2_2x/IDProp.c b/source/blender/python/api2_2x/IDProp.c
index 4a51619aec4..07269e54c7c 100644
--- a/source/blender/python/api2_2x/IDProp.c
+++ b/source/blender/python/api2_2x/IDProp.c
@@ -154,7 +154,7 @@ PyObject *BPy_IDGroup_GetName(BPy_IDProperty *self, void *bleh)
return PyString_FromString(self->prop->name);
}
-int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *bleh)
+static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *bleh)
{
char *st;
if (!PyString_Check(value))
@@ -168,7 +168,7 @@ int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *bleh)
return 0;
}
-PyObject *BPy_IDGroup_GetType(BPy_IDProperty *self)
+static PyObject *BPy_IDGroup_GetType(BPy_IDProperty *self)
{
return PyInt_FromLong((long)self->prop->type);
}
@@ -181,7 +181,7 @@ static PyGetSetDef BPy_IDGroup_getseters[] = {
{NULL, NULL, NULL, NULL, NULL}
};
-int BPy_IDGroup_Map_Len(BPy_IDProperty *self)
+static int BPy_IDGroup_Map_Len(BPy_IDProperty *self)
{
if (self->prop->type != IDP_GROUP)
return EXPP_ReturnIntError( PyExc_TypeError,
@@ -190,7 +190,7 @@ int BPy_IDGroup_Map_Len(BPy_IDProperty *self)
return self->prop->len;
}
-PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
+static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
{
IDProperty *loop;
char *st;
@@ -212,7 +212,7 @@ PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
}
/*returns NULL on success, error string on failure*/
-char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObject *ob)
+static char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObject *ob)
{
IDProperty *prop = NULL;
IDPropertyTemplate val = {0};
@@ -297,7 +297,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
return NULL;
}
-int BPy_IDGroup_Map_SetItem(BPy_IDProperty *self, PyObject *key, PyObject *val)
+static int BPy_IDGroup_Map_SetItem(BPy_IDProperty *self, PyObject *key, PyObject *val)
{
char *err;
@@ -325,7 +325,7 @@ int BPy_IDGroup_Map_SetItem(BPy_IDProperty *self, PyObject *key, PyObject *val)
return 0;
}
-PyObject *BPy_IDGroup_SpawnIterator(BPy_IDProperty *self)
+static PyObject *BPy_IDGroup_SpawnIterator(BPy_IDProperty *self)
{
BPy_IDGroup_Iter *iter = PyObject_New(BPy_IDGroup_Iter, &IDGroup_Iter_Type);
@@ -339,7 +339,7 @@ PyObject *BPy_IDGroup_SpawnIterator(BPy_IDProperty *self)
return (PyObject*) iter;
}
-PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
+static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
{
switch (prop->type) {
case IDP_STRING:
@@ -401,7 +401,7 @@ PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
"eek!! a property exists with a bad type code!!!" );
}
-PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
+static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
{
IDProperty *loop;
PyObject *pyform;
@@ -431,7 +431,7 @@ PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
"item not in group" );
}
-PyObject *BPy_IDGroup_IterItems(BPy_IDProperty *self)
+static PyObject *BPy_IDGroup_IterItems(BPy_IDProperty *self)
{
BPy_IDGroup_Iter *iter = PyObject_New(BPy_IDGroup_Iter, &IDGroup_Iter_Type);
@@ -446,7 +446,7 @@ PyObject *BPy_IDGroup_IterItems(BPy_IDProperty *self)
return (PyObject*) iter;
}
-PyObject *BPy_IDGroup_GetKeys(BPy_IDProperty *self)
+static PyObject *BPy_IDGroup_GetKeys(BPy_IDProperty *self)
{
PyObject *seq = PyList_New(self->prop->len);
IDProperty *loop;
@@ -481,7 +481,7 @@ PyObject *BPy_IDGroup_GetKeys(BPy_IDProperty *self)
return seq;
}
-PyObject *BPy_IDGroup_GetValues(BPy_IDProperty *self)
+static PyObject *BPy_IDGroup_GetValues(BPy_IDProperty *self)
{
PyObject *seq = PyList_New(self->prop->len);
IDProperty *loop;
@@ -517,7 +517,7 @@ PyObject *BPy_IDGroup_GetValues(BPy_IDProperty *self)
return seq;
}
-PyObject *BPy_IDGroup_HasKey(BPy_IDProperty *self, PyObject *value)
+static PyObject *BPy_IDGroup_HasKey(BPy_IDProperty *self, PyObject *value)
{
IDProperty *loop;
char *name = PyString_AsString(value);
@@ -533,7 +533,7 @@ PyObject *BPy_IDGroup_HasKey(BPy_IDProperty *self, PyObject *value)
Py_RETURN_FALSE;
}
-PyObject *BPy_IDGroup_Update(BPy_IDProperty *self, PyObject *vars)
+static PyObject *BPy_IDGroup_Update(BPy_IDProperty *self, PyObject *vars)
{
PyObject *pyob, *pkey, *pval;
Py_ssize_t i=0;
@@ -555,7 +555,7 @@ PyObject *BPy_IDGroup_Update(BPy_IDProperty *self, PyObject *vars)
Py_RETURN_NONE;
}
-PyObject *BPy_IDGroup_ConvertToPy(BPy_IDProperty *self)
+static PyObject *BPy_IDGroup_ConvertToPy(BPy_IDProperty *self)
{
return BPy_IDGroup_MapDataToPy(self->prop);
}
@@ -665,18 +665,18 @@ PyObject *BPy_Wrap_IDProperty(ID *id, IDProperty *prop, IDProperty *parent)
/********Array Wrapper********/
-PyObject *IDArray_repr(BPy_IDArray *self)
+static PyObject *IDArray_repr(BPy_IDArray *self)
{
return PyString_FromString("(ID Array)");
}
-PyObject *BPy_IDArray_GetType(BPy_IDArray *self)
+static PyObject *BPy_IDArray_GetType(BPy_IDArray *self)
{
return PyInt_FromLong( (long)self->prop->subtype );
}
-PyObject *BPy_IDArray_GetLen(BPy_IDArray *self)
+static PyObject *BPy_IDArray_GetLen(BPy_IDArray *self)
{
return PyInt_FromLong( (long)self->prop->len );
}
@@ -693,12 +693,12 @@ static PyGetSetDef BPy_IDArray_getseters[] = {
{NULL, NULL, NULL, NULL, NULL},
};
-int BPy_IDArray_Len(BPy_IDArray *self)
+static int BPy_IDArray_Len(BPy_IDArray *self)
{
return self->prop->len;
}
-PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index)
+static PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index)
{
if (index < 0 || index >= self->prop->len)
return EXPP_ReturnPyObjError( PyExc_IndexError,
@@ -719,7 +719,7 @@ PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index)
"invalid/corrupt array type!");
}
-int BPy_IDArray_SetItem(BPy_IDArray *self, int index, PyObject *val)
+static int BPy_IDArray_SetItem(BPy_IDArray *self, int index, PyObject *val)
{
int i;
float f;
@@ -865,18 +865,18 @@ PyTypeObject IDArray_Type = {
/*********** ID Property Group iterator ********/
-PyObject *IDGroup_Iter_iterself(PyObject *self)
+static PyObject *IDGroup_Iter_iterself(PyObject *self)
{
Py_XINCREF(self);
return self;
}
-PyObject *IDGroup_Iter_repr(BPy_IDGroup_Iter *self)
+static PyObject *IDGroup_Iter_repr(BPy_IDGroup_Iter *self)
{
return PyString_FromString("(ID Property Group)");
}
-PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
+static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
{
IDProperty *cur=NULL;
PyObject *tmpval;
diff --git a/source/blender/python/api2_2x/Image.c b/source/blender/python/api2_2x/Image.c
index 5ef2cbadbdc..dc15e008209 100644
--- a/source/blender/python/api2_2x/Image.c
+++ b/source/blender/python/api2_2x/Image.c
@@ -1380,6 +1380,8 @@ static PyGetSetDef BPy_Image_getseters[] = {
"image odd fields toggle", (void *)IMA_STD_FIELD },
{"antialias", (getter)Image_getFlag, (setter)Image_setFlag,
"image antialiasing toggle", (void *)IMA_ANTIALI },
+ {"premul", (getter)Image_getFlag, (setter)Image_setFlag,
+ "image premultiply alpha toggle", (void *)IMA_DO_PREMUL },
{"reflect", (getter)Image_getFlag, (setter)Image_setFlag,
"image reflect toggle", (void *)IMA_REFLECT },
{"clampX", (getter)Image_getFlagTpage, (setter)Image_setFlagTpage,
diff --git a/source/blender/python/api2_2x/Ipo.c b/source/blender/python/api2_2x/Ipo.c
index 7c2e18bcdf6..e6c67534a36 100644
--- a/source/blender/python/api2_2x/Ipo.c
+++ b/source/blender/python/api2_2x/Ipo.c
@@ -1027,7 +1027,6 @@ static PyObject *Ipo_getCurveNames( BPy_Ipo * self )
{
namefunc lookup_name;
int size;
- PyObject *dict;
int *vals = NULL;
char name[32];
PyObject *attr = Py_None;
@@ -1131,7 +1130,6 @@ static PyObject *Ipo_getCurveNames( BPy_Ipo * self )
* with string as key and adrcode as value
*/
- dict = PyModule_GetDict( submodule );
attr = PyConstant_New();
while( size-- ) {
@@ -1148,7 +1146,7 @@ static PyObject *Ipo_getCurveNames( BPy_Ipo * self )
return attr;
}
-void generate_curveconsts( PyObject* module )
+static void generate_curveconsts( PyObject* module )
{
namefunc lookup_name = NULL;
int size = 0;
diff --git a/source/blender/python/api2_2x/Ipocurve.c b/source/blender/python/api2_2x/Ipocurve.c
index 4a8cba30e8e..5dfb52f2733 100644
--- a/source/blender/python/api2_2x/Ipocurve.c
+++ b/source/blender/python/api2_2x/Ipocurve.c
@@ -41,6 +41,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_ipo_types.h"
#include "DNA_key_types.h"
+#include "DNA_scene_types.h"
#include "BezTriple.h"
#include "gen_utils.h"
@@ -80,6 +81,7 @@ static PyObject *IpoCurve_getExtrapolation( C_IpoCurve * self );
static PyObject *IpoCurve_newgetExtend( C_IpoCurve * self );
static int IpoCurve_newsetExtend( C_IpoCurve * self, PyObject * args );
static PyObject *IpoCurve_getPoints( C_IpoCurve * self );
+static PyObject *IpoCurve_clean( C_IpoCurve * self, PyObject *value );
static PyObject *IpoCurve_evaluate( C_IpoCurve * self, PyObject * args );
static PyObject *IpoCurve_getDriver( C_IpoCurve * self );
static int IpoCurve_setDriver( C_IpoCurve * self, PyObject * args );
@@ -127,6 +129,8 @@ static PyMethodDef C_IpoCurve_methods[] = {
"() - Returns list of all bezTriples of the curve"},
{"evaluate", ( PyCFunction ) IpoCurve_evaluate, METH_VARARGS,
"(float) - Evaluate curve at given time"},
+ {"clean", ( PyCFunction ) IpoCurve_clean, METH_VARARGS,
+ "(float) - Clean BezTriples using the given threshold value"},
{NULL, NULL, 0, NULL}
};
@@ -770,6 +774,29 @@ static PyObject *IpoCurve_evaluate( C_IpoCurve * self, PyObject * args )
}
+/***************************************************************************/
+/* Function: IpoCurve_clean( thresh ) */
+/* Description: Cleans IPO curve with the (optional) threshold. */
+/***************************************************************************/
+static PyObject *IpoCurve_clean( C_IpoCurve * self, PyObject * args )
+{
+ float thresh, othresh;
+
+ thresh= othresh= G.scene->toolsettings->clean_thresh;
+
+ /* expecting float */
+ if( !PyArg_ParseTuple( args, "|f", &thresh ) )
+ return ( EXPP_ReturnPyObjError
+ ( PyExc_TypeError, "expected float argument" ) );
+
+ /* set IPO-cleaning threshold based on value provided by user (temporarily) */
+ G.scene->toolsettings->clean_thresh= thresh;
+ clean_ipo_curve( self->ipocurve );
+ G.scene->toolsettings->clean_thresh= othresh;
+
+ Py_RETURN_NONE;
+}
+
static PyObject *IpoCurve_getDriver( C_IpoCurve * self )
{
if( !self->ipocurve->driver )
diff --git a/source/blender/python/api2_2x/Material.c b/source/blender/python/api2_2x/Material.c
index d3bb6c8d158..cb2c81aba6e 100644
--- a/source/blender/python/api2_2x/Material.c
+++ b/source/blender/python/api2_2x/Material.c
@@ -109,7 +109,7 @@
#define EXPP_MAT_SUBSIZE_MAX 25.0
#define EXPP_MAT_HARD_MIN 1
-#define EXPP_MAT_HARD_MAX 255 /* 127 with MODE HALO ON */
+#define EXPP_MAT_HARD_MAX 511 /* 127 with MODE HALO ON */
#define EXPP_MAT_HALOSEED_MIN 0
#define EXPP_MAT_HALOSEED_MAX 255
#define EXPP_MAT_NFLARES_MIN 1
@@ -699,7 +699,7 @@ static PyObject *Material_clearScriptLinks(BPy_Material *self, PyObject *args);
static PyObject *Material_insertIpoKey( BPy_Material * self, PyObject * args );
static PyObject *Material_getColorband( BPy_Material * self, void * type);
-int Material_setColorband( BPy_Material * self, PyObject * value, void * type);
+static int Material_setColorband( BPy_Material * self, PyObject * value, void * type);
static PyObject *Material_copy( BPy_Material * self );
static PyObject *Material_freeNodes( BPy_Material * self );
@@ -2506,10 +2506,10 @@ static PyObject *Material_setTexture( BPy_Material * self, PyObject * args )
if( !PyArg_ParseTuple( args, "iO!|ii", &texnum, &Texture_Type, &pytex,
&texco, &mapto ) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
- "expected int in [0,9] and Texture" );
+ "expected int in [0,17] and Texture" );
if( ( texnum < 0 ) || ( texnum >= MAX_MTEX ) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
- "expected int in [0,9] and Texture" );
+ "expected int in [0,17] and Texture" );
bltex = Texture_FromPyObject( pytex );
@@ -2782,10 +2782,10 @@ int EXPP_Colorband_fromPyList( ColorBand **coba, PyObject * value )
for (i=0; i<5; i++) {
pyflt = PySequence_GetItem( colseq, i );
if (!PyNumber_Check(pyflt)) {
- return ( EXPP_ReturnIntError( PyExc_ValueError,
- "Colorband colors must be sequences of 5 floats" ) );
Py_DECREF ( pyflt );
Py_DECREF ( colseq );
+ return ( EXPP_ReturnIntError( PyExc_ValueError,
+ "Colorband colors must be sequences of 5 floats" ) );
}
Py_DECREF ( pyflt );
}
@@ -3038,7 +3038,7 @@ static PyObject *Material_getColorband( BPy_Material * self, void * type)
Py_RETURN_NONE;
}
-int Material_setColorband( BPy_Material * self, PyObject * value, void * type)
+static int Material_setColorband( BPy_Material * self, PyObject * value, void * type)
{
switch( (long)type ) {
case 0: /* these are backwards, but that how it works */
diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c
index 6471fb16e92..32ddb464c88 100644
--- a/source/blender/python/api2_2x/Mesh.c
+++ b/source/blender/python/api2_2x/Mesh.c
@@ -160,7 +160,7 @@ typedef struct FaceEdges {
* compare edges by vertex indices
*/
-int medge_comp( const void *va, const void *vb )
+static int medge_comp( const void *va, const void *vb )
{
const unsigned int *a = ((SrchEdges *)va)->v;
const unsigned int *b = ((SrchEdges *)vb)->v;
@@ -180,7 +180,7 @@ int medge_comp( const void *va, const void *vb )
* compare edges by insert list indices
*/
-int medge_index_comp( const void *va, const void *vb )
+static int medge_index_comp( const void *va, const void *vb )
{
const SrchEdges *a = (SrchEdges *)va;
const SrchEdges *b = (SrchEdges *)vb;
@@ -196,7 +196,7 @@ int medge_index_comp( const void *va, const void *vb )
* compare faces by vertex indices
*/
-int mface_comp( const void *va, const void *vb )
+static int mface_comp( const void *va, const void *vb )
{
const SrchFaces *a = va;
const SrchFaces *b = vb;
@@ -231,7 +231,7 @@ int mface_comp( const void *va, const void *vb )
* compare faces by insert list indices
*/
-int mface_index_comp( const void *va, const void *vb )
+static int mface_index_comp( const void *va, const void *vb )
{
const SrchFaces *a = va;
const SrchFaces *b = vb;
@@ -248,7 +248,7 @@ int mface_index_comp( const void *va, const void *vb )
* compare edges by vertex indices
*/
-int faceedge_comp( const void *va, const void *vb )
+static int faceedge_comp( const void *va, const void *vb )
{
const unsigned int *a = ((FaceEdges *)va)->v;
const unsigned int *b = ((FaceEdges *)vb)->v;
@@ -4239,7 +4239,7 @@ static int MFace_setTransp( BPy_MFace *self, PyObject *value )
return -1;
return EXPP_setIValueRange( value,
- &self->mesh->mtface[self->index].transp, TF_SOLID, TF_SUB, 'b' );
+ &self->mesh->mtface[self->index].transp, TF_SOLID, TF_CLIP, 'b' );
}
/*
@@ -6271,19 +6271,12 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
if( origmesh->mat ) {
for( i = origmesh->totcol; i-- > 0; ) {
/* are we an object material or data based? */
- if (ob->colbits & 1<<i) {
+ if (ob->colbits & 1<<i)
self->mesh->mat[i] = ob->mat[i];
-
- if (ob->mat[i])
- ob->mat[i]->id.us++;
- if (origmesh->mat[i])
- origmesh->mat[i]->id.us--;
- } else {
+ else
self->mesh->mat[i] = origmesh->mat[i];
-
- if (origmesh->mat[i])
- origmesh->mat[i]->id.us++;
- }
+ if (self->mesh->mat[i])
+ self->mesh->mat[i]->id.us++;
}
}
}
@@ -8743,6 +8736,7 @@ static PyObject *M_Mesh_FaceTranspModesDict( void )
PyConstant_Insert( d, "ADD", PyInt_FromLong( TF_ADD ) );
PyConstant_Insert( d, "ALPHA", PyInt_FromLong( TF_ALPHA ) );
PyConstant_Insert( d, "SUB", PyInt_FromLong( TF_SUB ) );
+ PyConstant_Insert( d, "CLIP", PyInt_FromLong( TF_CLIP ) );
}
return FTM;
diff --git a/source/blender/python/api2_2x/NLA.c b/source/blender/python/api2_2x/NLA.c
index cc477c7b5cf..18eef7c1a2f 100644
--- a/source/blender/python/api2_2x/NLA.c
+++ b/source/blender/python/api2_2x/NLA.c
@@ -1438,7 +1438,11 @@ static PyObject *ActionStrips_append( BPy_ActionStrips *self, PyObject * args )
strip->flag = ACTSTRIP_LOCK_ACTION;
find_stridechannel(ob, strip);
+ if(ob->nlastrips.first == NULL)
+ ob->nlaflag |= OB_NLA_OVERRIDE;
+
strip->repeat = 1.0;
+ strip->scale = 1.0;
act->id.us++;
BLI_addtail(&ob->nlastrips, strip);
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index e7ed89573fb..2e82c55155f 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -88,9 +88,6 @@ extern void countall(void);
#define NMESH_SUBDIV_MIN 0
#define NMESH_SUBDIV_MAX 6
-/* Globals */
-static PyObject *g_nmeshmodule = NULL;
-
static int unlink_existingMeshData( Mesh * mesh );
static int convert_NMeshToMesh( Mesh *mesh, BPy_NMesh *nmesh );
static void check_dverts(Mesh *me, int old_totverts);
@@ -2161,8 +2158,8 @@ static PyObject *new_NMesh_displist(ListBase *lb, Object *ob)
for(a=0; a<dl->parts; a++) {
- DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
-
+ if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+ break;
for(; b<dl->nr; b++) {
vidx[0] = p2 + ioffset;
@@ -3321,7 +3318,6 @@ PyObject *NMesh_Init( void )
if( EdgeFlags )
PyModule_AddObject( submodule, "EdgeFlags", EdgeFlags );
- g_nmeshmodule = submodule;
return submodule;
}
diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c
index da80e0a25cb..1282b9bd82c 100644
--- a/source/blender/python/api2_2x/Object.c
+++ b/source/blender/python/api2_2x/Object.c
@@ -299,26 +299,25 @@ static PyObject *internal_makeParent(Object *parent, PyObject *py_child, int par
/* In Python these will be written to the console when doing a */
/* Blender.Object.__doc__ */
/*****************************************************************************/
-char M_Object_doc[] = "The Blender Object module\n\n\
+static char M_Object_doc[] = "The Blender Object module\n\n\
This module provides access to **Object Data** in Blender.\n";
-char M_Object_New_doc[] =
+static char M_Object_New_doc[] =
"(type) - Add a new object of type 'type' in the current scene";
-char M_Object_Get_doc[] =
+static char M_Object_Get_doc[] =
"(name) - return the object with the name 'name', returns None if not\
found.\n\
If 'name' is not specified, it returns a list of all objects in the\n\
current scene.";
-char M_Object_GetSelected_doc[] =
+static char M_Object_GetSelected_doc[] =
"() - Returns a list of selected Objects in the active layer(s)\n\
The active object is the first in the list, if visible";
-char M_Object_Duplicate_doc[] =
+static char M_Object_Duplicate_doc[] =
"(linked) - Duplicate all selected, visible objects in the current scene";
-
/*****************************************************************************/
/* Python method structure definition for Blender.Object module: */
/*****************************************************************************/
@@ -342,9 +341,8 @@ static int setupSB(Object* ob); /*Make sure Softbody Pointer is initialized */
static int setupPI(Object* ob);
static PyObject *Object_getParticleSys( BPy_Object * self );
-/* fixme Object_newParticleSys( self, default-partsys-name ) */
static PyObject *Object_addVertexGroupsFromArmature( BPy_Object * self, PyObject * args);
-static PyObject *Object_newParticleSys( BPy_Object * self );
+static PyObject *Object_newParticleSys( BPy_Object * self, PyObject * args );
static PyObject *Object_buildParts( BPy_Object * self );
static PyObject *Object_clearIpo( BPy_Object * self );
static PyObject *Object_clrParent( BPy_Object * self, PyObject * args );
@@ -478,7 +476,7 @@ static PyMethodDef BPy_Object_methods[] = {
/* name, method, flags, doc */
{"getParticleSystems", ( PyCFunction ) Object_getParticleSys, METH_NOARGS,
"Return a list of particle systems"},
- {"newParticleSystem", ( PyCFunction ) Object_newParticleSys, METH_NOARGS,
+ {"newParticleSystem", ( PyCFunction ) Object_newParticleSys, METH_VARARGS,
"Create and link a new particle system"},
{"addVertexGroupsFromArmature" , ( PyCFunction ) Object_addVertexGroupsFromArmature, METH_VARARGS,
"Add vertex groups from armature using the bone heat method"},
@@ -1038,48 +1036,53 @@ static PyObject *M_Object_Duplicate( PyObject * self_unused,
Py_RETURN_NONE;
}
-
/*****************************************************************************/
/* Python BPy_Object methods: */
/*****************************************************************************/
PyObject *Object_getParticleSys( BPy_Object * self ){
- ParticleSystem *blparticlesys = 0;
+ PyObject *list;
+ ParticleSystem *psys= NULL;
Object *ob = self->object;
- PyObject *partsyslist,*current;
-
- blparticlesys = ob->particlesystem.first;
-
- partsyslist = PyList_New( 0 );
+ int i= 0;
- if (!blparticlesys)
- return partsyslist;
-
-/* fixme: for(;;) */
- current = ParticleSys_CreatePyObject( blparticlesys, ob );
- PyList_Append(partsyslist,current);
- Py_DECREF(current);
+ list = PyList_New( BLI_countlist( &ob->particlesystem ) );
+ if( !list )
+ return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "PyList_New() failed" );
- while((blparticlesys = blparticlesys->next)){
- current = ParticleSys_CreatePyObject( blparticlesys, ob );
- PyList_Append(partsyslist,current);
- Py_DECREF(current);
- }
+ for( psys=ob->particlesystem.first; psys; psys=psys->next )
+ PyList_SET_ITEM( list, i++, ParticleSys_CreatePyObject( psys, ob ) );
- return partsyslist;
+ return list;
}
-PyObject *Object_newParticleSys( BPy_Object * self ){
+PyObject *Object_newParticleSys( BPy_Object * self, PyObject * args ) {
ParticleSystem *psys = 0;
ParticleSystem *rpsys = 0;
ModifierData *md;
ParticleSystemModifierData *psmd;
Object *ob = self->object;
-/* char *name = NULL; optional name param */
+ char *name = NULL;
ID *id;
- int nr;
+ int nr;
+
+ if( !PyArg_ParseTuple( args, "|s", &name ) )
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "expected a string or nothing" );
- id = (ID *)psys_new_settings("PSys", G.main);
+ if( name ) {
+ for( id= G.main->particle.first; id; id= id->next ) {
+ if( !strcmp( name, id->name + 2 ) )
+ break;
+ }
+ if( !id )
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "specified particle system not found" );
+ else
+ id->us++;
+ } else
+ id = (ID *)psys_new_settings("PSys", G.main);
psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
psys->pointcache = BKE_ptcache_add();
@@ -1698,11 +1701,9 @@ static PyObject *Object_getBoundBox( BPy_Object * self, PyObject *args )
"This object isn't linked to any object data (mesh, curve, etc) yet" );
if( !self->object->bb ) { /* if no ob bbox, we look in obdata */
- Mesh *me;
Curve *curve;
switch ( self->object->type ) {
case OB_MESH:
- me = self->object->data;
vec = (float*) mesh_get_bb(self->object)->vec;
break;
case OB_CURVE:
diff --git a/source/blender/python/api2_2x/Particle.c b/source/blender/python/api2_2x/Particle.c
index 893ee077d67..bbdc3942fc7 100644
--- a/source/blender/python/api2_2x/Particle.c
+++ b/source/blender/python/api2_2x/Particle.c
@@ -138,7 +138,7 @@ static PyObject *Part_GetAge( BPy_PartSys * self, PyObject * args );
/*****************************************************************************/
/* Python Effect_Type callback function prototypes: */
/*****************************************************************************/
-static PyObject *ParticleSys_repr( void );
+static PyObject *ParticleSys_repr( BPy_PartSys * self );
/*****************************************************************************/
/* The following string definitions are used for documentation strings. */
@@ -415,13 +415,14 @@ PyTypeObject ParticleSys_Type = {
/*****************************************************************************/
/* Function: PARTICLESYS_repr */
-/* Description: This is a callback function for the BPy_Effect type. It */
-/* builds a meaninful string to represent effcte objects. */
+/* Description: This is a callback function for the BPy_PartSys type. It */
+/* builds a meaningful string to represent effect objects. */
/*****************************************************************************/
-static PyObject *ParticleSys_repr( void )
+static PyObject *ParticleSys_repr( BPy_PartSys * self )
{
- return PyString_FromString( "ParticleSys" );
+ return PyString_FromFormat( "ParticleSys \"%s\"",
+ self->psys->part->id.name+2 );
}
/*****************************************************************************/
diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c
index 662656663c1..8a2be2391a4 100644
--- a/source/blender/python/api2_2x/Scene.c
+++ b/source/blender/python/api2_2x/Scene.c
@@ -591,7 +591,7 @@ PyObject *Scene_CreatePyObject( Scene * scene )
}
/*-----------------------FromPyObject-----------------------------------*/
-Scene *Scene_FromPyObject( PyObject * pyobj )
+static Scene *Scene_FromPyObject( PyObject * pyobj )
{
return ( ( BPy_Scene * ) pyobj )->scene;
}
@@ -1221,7 +1221,7 @@ static PyObject *SceneObSeq_getObjects( BPy_SceneObSeq *self, void *mode)
return SceneObSeq_CreatePyObject(self->bpyscene, NULL, (int)((long)mode));
}
-int SceneObSeq_setObjects( BPy_SceneObSeq *self, PyObject *value, void *_mode_)
+static int SceneObSeq_setObjects( BPy_SceneObSeq *self, PyObject *value, void *_mode_)
{
/*
ONLY SUPPORTS scn.objects.selected and scn.objects.context
@@ -1642,7 +1642,7 @@ static PyObject *SceneObSeq_unlink( BPy_SceneObSeq * self, PyObject *args )
Py_RETURN_FALSE;
}
-PyObject *SceneObSeq_getActive(BPy_SceneObSeq *self)
+static PyObject *SceneObSeq_getActive(BPy_SceneObSeq *self)
{
Base *base;
SCENE_DEL_CHECK_PY(self->bpyscene);
@@ -1687,7 +1687,7 @@ static int SceneObSeq_setActive(BPy_SceneObSeq *self, PyObject *value)
return 0;
}
-PyObject *SceneObSeq_getCamera(BPy_SceneObSeq *self)
+static PyObject *SceneObSeq_getCamera(BPy_SceneObSeq *self)
{
SCENE_DEL_CHECK_PY(self->bpyscene);
diff --git a/source/blender/python/api2_2x/Sys.c b/source/blender/python/api2_2x/Sys.c
index baae2220143..16d879c3032 100644
--- a/source/blender/python/api2_2x/Sys.c
+++ b/source/blender/python/api2_2x/Sys.c
@@ -149,16 +149,12 @@ struct PyMethodDef M_sys_methods[] = {
/* Module Functions */
-static PyObject *g_sysmodule = NULL; /* pointer to Blender.sys module */
-
PyObject *sys_Init( void )
{
PyObject *submodule, *dict;
submodule = Py_InitModule3( "Blender.sys", M_sys_methods, M_sys_doc );
- g_sysmodule = submodule;
-
dict = PyModule_GetDict( submodule );
EXPP_dict_set_item_str( dict, "dirsep", PyString_FromString(DIRSEP_STR) );
diff --git a/source/blender/python/api2_2x/Types.c b/source/blender/python/api2_2x/Types.c
index 1ce19071885..10b968cacba 100644
--- a/source/blender/python/api2_2x/Types.c
+++ b/source/blender/python/api2_2x/Types.c
@@ -26,8 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "Types.h"
+#include "Types.h"
#include "IDProp.h"
+#include "gen_utils.h"
+#include "BLI_blenlib.h"
/*
stuff pasted from the old Types.h
is only need here now
@@ -65,10 +67,126 @@ extern PyTypeObject ThemeSpace_Type;
extern PyTypeObject ThemeUI_Type;
extern PyTypeObject TimeLine_Type;
+/* includes to get structs for CSizeof */
+#include "Armature.h"
+#include "Bone.h"
+#include "BezTriple.h"
+#include "Camera.h"
+#include "Constraint.h"
+#include "Curve.h"
+#include "CurNurb.h"
+#include "Draw.h"
+#include "Effect.h"
+#include "Ipo.h"
+#include "Ipocurve.h"
+#include "Key.h"
+#include "Lamp.h"
+#include "Lattice.h"
+#include "Library.h"
+#include "Mathutils.h"
+#include "Geometry.h"
+#include "Mesh.h"
+#include "Metaball.h"
+#include "Modifier.h"
+#include "NMesh.h"
+#include "Node.h"
+#include "Object.h"
+#include "Group.h"
+#include "Registry.h"
+#include "Scene.h"
+#include "Sound.h"
+#include "SurfNurb.h"
+#include "Sys.h"
+#include "Text.h"
+#include "Texture.h"
+#include "Window.h"
+#include "World.h"
+#include "Particle.h"
+
char M_Types_doc[] = "The Blender Types module\n\n\
This module is a dictionary of all Blender Python types";
-struct PyMethodDef Null_methods[] = { {NULL, NULL, 0, NULL} };
+static PyObject *Types_CSizeof(PyObject * self, PyObject *o)
+{
+ int ret = 0;
+ if(o) {
+ if((void *)o == (void *)&Action_Type) {
+ ret = sizeof(struct bAction);
+ } else if ((void *)o==(void *)&Armature_Type) {
+ ret = sizeof(struct bArmature);
+ } else if ((void *)o==(void *)&BezTriple_Type) {
+ ret = sizeof(struct BezTriple);
+ } else if ((void *)o==(void *)&Bone_Type) {
+ ret = sizeof(struct Bone);
+ } else if ((void *)o==(void *)&Camera_Type) {
+ ret = sizeof(struct Camera);
+ } else if ((void *)o==(void *)&CurNurb_Type) {
+ ret = sizeof(struct Nurb);
+ } else if ((void *)o==(void *)&Curve_Type) {
+ ret = sizeof(struct Curve);
+ } else if ((void *)o==(void *)&Group_Type) {
+ ret = sizeof(struct Group);
+ } else if ((void *)o==(void *)&IDGroup_Type) {
+ ret = sizeof(struct IDProperty);
+ } else if ((void *)o==(void *)&Image_Type) {
+ ret = sizeof(struct Image);
+ } else if ((void *)o==(void *)&Ipo_Type) {
+ ret = sizeof(struct Ipo);
+ } else if ((void *)o==(void *)&IpoCurve_Type) {
+ ret = sizeof(struct IpoCurve);
+ } else if ((void *)o==(void *)&Lamp_Type) {
+ ret = sizeof(struct Lamp);
+ } else if ((void *)o==(void *)&Lattice_Type) {
+ ret = sizeof(struct Lattice);
+ } else if ((void *)o==(void *)&MCol_Type) {
+ ret = sizeof(struct MCol);
+ } else if ((void *)o==(void *)&MEdge_Type) {
+ ret = sizeof(struct MEdge);
+ } else if ((void *)o==(void *)&MFace_Type) {
+ ret = sizeof(struct MFace);
+ } else if ((void *)o==(void *)&MTex_Type) {
+ ret = sizeof(struct MTex);
+ } else if ((void *)o==(void *)&MVert_Type) {
+ ret = sizeof(struct MVert);
+ } else if ((void *)o==(void *)&Material_Type) {
+ ret = sizeof(struct Material);
+ } else if ((void *)o==(void *)&Mesh_Type) {
+ ret = sizeof(struct Mesh);
+ } else if ((void *)o==(void *)&Metaball_Type) {
+ ret = sizeof(struct MetaBall);
+ } else if ((void *)o==(void *)&ModSeq_Type) {
+ ret = sizeof(struct ModifierData);
+ } else if ((void *)o==(void *)&Modifier_Type) {
+ ret = sizeof(struct ModifierData);
+ } else if ((void *)o==(void *)&Object_Type) {
+ ret = sizeof(struct Object);
+ } else if ((void *)o==(void *)&Pose_Type) {
+ ret = sizeof(struct bPose);
+ } else if ((void *)o==(void *)&RenderData_Type) {
+ ret = sizeof(struct RenderData);
+ } else if ((void *)o==(void *)&Scene_Type) {
+ ret = sizeof(struct Scene);
+ } else if ((void *)o==(void *)&SurfNurb_Type) {
+ ret = sizeof(struct Nurb);
+ } else if ((void *)o==(void *)&Text3d_Type) {
+ ret = sizeof(struct Curve);
+ } else if ((void *)o==(void *)&Text_Type) {
+ ret = sizeof(struct Text);
+ } else if ((void *)o==(void *)&Texture_Type) {
+ ret = sizeof(struct Tex);
+ } else {
+ ret = -1;
+ }
+ }
+
+ return PyInt_FromLong(ret);
+}
+
+struct PyMethodDef M_Types_methods[] = {
+ {"CSizeof", Types_CSizeof, METH_O,
+ "(type) - Returns sizeof of the underlying C structure of the given type"},
+ {NULL, NULL, 0, NULL}
+};
@@ -145,7 +263,7 @@ PyObject *Types_Init( void )
PyObject *submodule, *dict;
submodule =
- Py_InitModule3( "Blender.Types", Null_methods, M_Types_doc );
+ Py_InitModule3( "Blender.Types", M_Types_methods, M_Types_doc );
dict = PyModule_GetDict( submodule );
@@ -187,13 +305,14 @@ PyObject *Types_Init( void )
( PyObject * ) &Armature_Type );
PyDict_SetItemString( dict, "BoneType", ( PyObject * ) &Bone_Type );
- PyDict_SetItemString( dict, "CurNurb_Type",
+ PyDict_SetItemString( dict, "CurNurbType",
( PyObject * ) &CurNurb_Type );
- PyDict_SetItemString( dict, "SurfNurb_Type",
+ PyDict_SetItemString( dict, "SurfNurbType",
( PyObject * ) &SurfNurb_Type );
PyDict_SetItemString( dict, "CurveType", ( PyObject * ) &Curve_Type );
PyDict_SetItemString( dict, "IpoType", ( PyObject * ) &Ipo_Type );
+ PyDict_SetItemString( dict, "IpoCurveType", ( PyObject * ) &IpoCurve_Type );
PyDict_SetItemString( dict, "MetaballType",
( PyObject * ) &Metaball_Type );
@@ -226,7 +345,7 @@ PyObject *Types_Init( void )
( PyObject * ) &constant_Type );
PyDict_SetItemString( dict, "rgbTupleType",
( PyObject * ) &rgbTuple_Type );
- PyDict_SetItemString( dict, "matrix_Type",
+ PyDict_SetItemString( dict, "matrixType",
( PyObject * ) &matrix_Type );
PyDict_SetItemString( dict, "eulerType", ( PyObject * ) &euler_Type );
PyDict_SetItemString( dict, "quaternionType",
@@ -249,7 +368,7 @@ PyObject *Types_Init( void )
( PyObject * ) &EditBone_Type);
PyDict_SetItemString( dict, "ThemeSpaceType",
( PyObject * ) &ThemeSpace_Type);
- PyDict_SetItemString( dict, "ThemeUI_Type",
+ PyDict_SetItemString( dict, "ThemeUIType",
( PyObject * ) &ThemeUI_Type);
PyDict_SetItemString( dict, "IDGroupType",
( PyObject * ) &IDGroup_Type);
diff --git a/source/blender/python/api2_2x/Window.c b/source/blender/python/api2_2x/Window.c
index 41a4e4e215f..40f6d52d8da 100644
--- a/source/blender/python/api2_2x/Window.c
+++ b/source/blender/python/api2_2x/Window.c
@@ -577,8 +577,6 @@ static PyObject * FileAndImageSelector(PyObject * self, PyObject * args, int typ
"\nexpected a callback function (and optionally one or two strings) "
"as argument(s)" );
- Py_INCREF(pycallback);
-
/* trick: we move to a spacescript because then the fileselector will properly
* unset our SCRIPT_FILESEL flag when the user chooses a file or cancels the
* selection. This is necessary because when a user cancels, the
@@ -605,9 +603,18 @@ static PyObject * FileAndImageSelector(PyObject * self, PyObject * args, int typ
script->lastspace = startspace;
sc->script = script;
}
-
+
+ if (!script) {
+ /* should never happen unless we are executed
+ * from the BGE or somthing really strange like that */
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "Could not allocate a screen for an unknown reason." );
+ }
+
+ Py_INCREF(pycallback);
+
script->flags |= SCRIPT_FILESEL;
-
+
/* clear any previous callback (nested calls to selector) */
if (script->py_browsercallback) {
Py_DECREF((PyObject *)script->py_browsercallback);
@@ -1209,7 +1216,7 @@ static PyObject *M_Window_QHandle( PyObject * self, PyObject * args )
if( sa ) {
BWinEvent evt;
- short do_redraw = 0, do_change = 0;
+ short do_redraw = 0;
if( sa != curarea || sa->win != mywinget( ) ) {
oldsa = curarea;
@@ -1221,7 +1228,6 @@ static PyObject *M_Window_QHandle( PyObject * self, PyObject * args )
do_redraw = 1;
} else if( evt.event == CHANGED ) {
sa->win_swap = 0;
- do_change = 1;
do_redraw = 1;
} else {
scrarea_do_winhandle( sa, &evt );
diff --git a/source/blender/python/api2_2x/bpy_data.c b/source/blender/python/api2_2x/bpy_data.c
index 47232c6707a..d3499a79874 100644
--- a/source/blender/python/api2_2x/bpy_data.c
+++ b/source/blender/python/api2_2x/bpy_data.c
@@ -243,7 +243,7 @@ static PyObject *LibBlockSeq_nextIter( BPy_LibBlockSeq * self )
return object;
}
-PyObject *LibBlockSeq_getActive(BPy_LibBlockSeq *self)
+static PyObject *LibBlockSeq_getActive(BPy_LibBlockSeq *self)
{
switch (self->type) {
case ID_SCE:
@@ -382,7 +382,7 @@ static int LibBlockSeq_setTag(BPy_LibBlockSeq *self, PyObject *value)
/* New Data, internal functions */
-Mesh *add_mesh__internal(char *name)
+static Mesh *add_mesh__internal(char *name)
{
Mesh *mesh = add_mesh(name); /* doesn't return NULL now, but might someday */
@@ -453,8 +453,7 @@ PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd)
return EXPP_ReturnPyObjError( PyExc_IOError,
"couldn't create pyobject on load, unknown error" );
if (name) {
- ID *id = ((BPy_GenericLib *)ret)->id;
- rename_id( id, name );
+ rename_id( ((BPy_GenericLib *)ret)->id, name );
}
return ret;
}
@@ -599,7 +598,7 @@ PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd)
}
-PyObject *LibBlockSeq_unlink(BPy_LibBlockSeq *self, PyObject * value)
+static PyObject *LibBlockSeq_unlink(BPy_LibBlockSeq *self, PyObject * value)
{
switch (self->type) {
case ID_SCE:
@@ -790,15 +789,12 @@ PyTypeObject LibBlockSeq_Type = {
PyObject * Data_Init( void )
{
PyObject *module;
- PyObject *dict;
-
PyType_Ready( &LibBlockSeq_Type );
PyType_Ready( &Config_Type );
/*submodule = Py_InitModule3( "Blender.Main", NULL, M_Main_doc );*/
module = Py_InitModule3( "bpy.data", NULL, "The bpy.data submodule" );
- dict = PyModule_GetDict( module );
/* Python Data Types */
PyModule_AddObject( module, "scenes", LibBlockSeq_CreatePyObject(NULL, ID_SCE) );
diff --git a/source/blender/python/api2_2x/constant.c b/source/blender/python/api2_2x/constant.c
index 7cf6a83e602..2bf1d189961 100644
--- a/source/blender/python/api2_2x/constant.c
+++ b/source/blender/python/api2_2x/constant.c
@@ -37,19 +37,19 @@ PyTypeObject constant_Type;
//------------------METHOD IMPLEMENTATIONS-----------------------------
//------------------------constant.items()
//Returns a list of key:value pairs like dict.items()
-PyObject* constant_items(BPy_constant *self)
+static PyObject* constant_items(BPy_constant *self)
{
return PyDict_Items(self->dict);
}
//------------------------constant.keys()
//Returns a list of keys like dict.keys()
-PyObject* constant_keys(BPy_constant *self)
+static PyObject* constant_keys(BPy_constant *self)
{
return PyDict_Keys(self->dict);
}
//------------------------constant.values()
//Returns a list of values like dict.values()
-PyObject* constant_values(BPy_constant *self)
+static PyObject* constant_values(BPy_constant *self)
{
return PyDict_Values(self->dict);
}
diff --git a/source/blender/python/api2_2x/doc/BGL.py b/source/blender/python/api2_2x/doc/BGL.py
index 661042f341b..4a10de4a05c 100644
--- a/source/blender/python/api2_2x/doc/BGL.py
+++ b/source/blender/python/api2_2x/doc/BGL.py
@@ -146,11 +146,11 @@ def glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap):
@type width, height: int
@param width, height: Specify the pixel width and height of the bitmap image.
- @type xorig,yorig: float
- @param xorig,yorig: Specify the location of the origin in the bitmap image. The origin is measured
+ @type xorig, yorig: float
+ @param xorig, yorig: Specify the location of the origin in the bitmap image. The origin is measured
from the lower left corner of the bitmap, with right and up being the positive axes.
- @type xmove,ymove: float
- @param xmove,ymove: Specify the x and y offsets to be added to the current raster position after
+ @type xmove, ymove: float
+ @param xmove, ymove: Specify the x and y offsets to be added to the current raster position after
the bitmap is drawn.
@type bitmap: Buffer object I{type GL_BYTE}
@param bitmap: Specifies the address of the bitmap image.
@@ -207,8 +207,8 @@ def glClearAccum(red, green, blue, alpha):
Specify clear values for the accumulation buffer
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearaccum.html}
- @type red,green,blue,alpha: float
- @param red,green,blue,alpha: Specify the red, green, blue, and alpha values used when the
+ @type red, green, blue, alpha: float
+ @param red, green, blue, alpha: Specify the red, green, blue, and alpha values used when the
accumulation buffer is cleared. The initial values are all 0.
"""
@@ -217,8 +217,8 @@ def glClearColor(red, green, blue, alpha):
Specify clear values for the color buffers
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearcolor.html}
- @type red,green,blue,alpha: float
- @param red,green,blue,alpha: Specify the red, green, blue, and alpha values used when the
+ @type red, green, blue, alpha: float
+ @param red, green, blue, alpha: Specify the red, green, blue, and alpha values used when the
color buffers are cleared. The initial values are all 0.
"""
@@ -274,8 +274,8 @@ def glColor (red, green, blue, alpha):
Set a new color.
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/color.html}
- @type red,green,blue,alpha: Depends on function prototype.
- @param red,green,blue: Specify new red, green, and blue values for the current color.
+ @type red, green, blue, alpha: Depends on function prototype.
+ @param red, green, blue: Specify new red, green, and blue values for the current color.
@param alpha: Specifies a new alpha value for the current color. Included only in the
four-argument glColor4 commands. (With '4' colors only)
"""
@@ -285,8 +285,8 @@ def glColorMask(red, green, blue, alpha):
Enable and disable writing of frame buffer color components
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/colormask.html}
- @type red,green,blue,alpha: int (boolean)
- @param red,green,blue,alpha: Specify whether red, green, blue, and alpha can or cannot be
+ @type red, green, blue, alpha: int (boolean)
+ @param red, green, blue, alpha: Specify whether red, green, blue, and alpha can or cannot be
written into the frame buffer. The initial values are all GL_TRUE, indicating that the
color components can be written.
"""
@@ -308,8 +308,8 @@ def glCopyPixels(x, y, width, height, type):
Copy pixels in the frame buffer
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/copypixels.html}
- @type x,y: int
- @param x,y: Specify the window coordinates of the lower left corner of the rectangular
+ @type x, y: int
+ @param x, y: Specify the window coordinates of the lower left corner of the rectangular
region of pixels to be copied.
@type width, height: int
@param width,height: Specify the dimensions of the rectangular region of pixels to be copied.
@@ -1079,7 +1079,7 @@ def glNormal3 (nx, ny, nz, v):
@param nx, ny, nz: Specify the x, y, and z coordinates of the new current normal.
The initial value of the current normal is the unit vector, (0, 0, 1).
@type v: Buffer object. Depends on function prototype. ('v' prototypes)
- @param v: Specifies a pointer to an array of three elements: the x,y, and z coordinates
+ @param v: Specifies a pointer to an array of three elements: the x, y, and z coordinates
of the new current normal.
"""
@@ -1290,7 +1290,7 @@ def glRasterPos (x,y,z,w):
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rasterpos.html}
@type x, y, z, w: Depends on function prototype. (z and w for '3' and '4' prototypes only)
- @param x,y,z,w: Specify the x,y,z, and w object coordinates (if present) for the
+ @param x, y, z, w: Specify the x,y,z, and w object coordinates (if present) for the
raster position. If function prototype ends in 'v' specifies a pointer to an array of two,
three, or four elements, specifying x, y, z, and w coordinates, respectively.
@note:
@@ -1326,8 +1326,8 @@ def glReadPixels(x, y, width, height, format, type, pixels):
Read a block of pixels from the frame buffer
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/readpixels.html}
- @type x,y: int
- @param x,y:Specify the window coordinates of the first pixel that is read
+ @type x, y: int
+ @param x, y:Specify the window coordinates of the first pixel that is read
from the frame buffer. This location is the lower left corner of a rectangular
block of pixels.
@type width, height: int
@@ -1375,8 +1375,8 @@ def glRotate (angle, x, y, z):
@type angle: Depends on function prototype.
@param angle: Specifies the angle of rotation in degrees.
- @type x,y,z: Depends on function prototype.
- @param x,y,z: Specify the x,y, and z coordinates of a vector respectively.
+ @type x, y, z: Depends on function prototype.
+ @param x, y, z: Specify the x, y, and z coordinates of a vector respectively.
"""
def glScale (x,y,z):
@@ -1386,8 +1386,8 @@ def glScale (x,y,z):
Multiply the current matrix by a general scaling matrix
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/scale.html}
- @type x,y,z: Depends on function prototype.
- @param x,y,z: Specify scale factors along the x,y, and z axes, respectively.
+ @type x, y, z: Depends on function prototype.
+ @param x, y, z: Specify scale factors along the x, y, and z axes, respectively.
"""
def glScissor(x,y,width,height):
@@ -1395,8 +1395,8 @@ def glScissor(x,y,width,height):
Define the scissor box
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/scissor.html}
- @type x,y: int
- @param x,y: Specify the lower left corner of the scissor box. Initially (0, 0).
+ @type x, y: int
+ @param x, y: Specify the lower left corner of the scissor box. Initially (0, 0).
@type width, height: int
@param width height: Specify the width and height of the scissor box. When a
GL context is first attached to a window, width and height are set to the
@@ -1480,8 +1480,8 @@ def glTexCoord (s,t,r,q,v):
Set the current texture coordinates
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texcoord.html}
- @type s,t,r,q: Depends on function prototype. (r and q for '3' and '4' prototypes only)
- @param s,t,r,q: Specify s, t, r, and q texture coordinates. Not all parameters are
+ @type s, t, r, q: Depends on function prototype. (r and q for '3' and '4' prototypes only)
+ @param s, t, r, q: Specify s, t, r, and q texture coordinates. Not all parameters are
present in all forms of the command.
@type v: Buffer object. Depends on function prototype. (for 'v' prototypes only)
@param v: Specifies a pointer to an array of one, two, three, or four elements,
@@ -1604,8 +1604,8 @@ def glTranslate (x, y, z):
Multiply the current matrix by a translation matrix
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/translate.html}
- @type x,y,z: Depends on function prototype.
- @param x,y,z: Specify the x, y, and z coordinates of a translation vector.
+ @type x, y, z: Depends on function prototype.
+ @param x, y, z: Specify the x, y, and z coordinates of a translation vector.
"""
def glVertex (x,y,z,w,v):
@@ -1618,8 +1618,8 @@ def glVertex (x,y,z,w,v):
Specify a vertex
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/vertex.html}
- @type x,y,z,w: Depends on function prototype (z and w for '3' and '4' prototypes only)
- @param x,y,z,w: Specify x, y, z, and w coordinates of a vertex. Not all parameters
+ @type x, y, z, w: Depends on function prototype (z and w for '3' and '4' prototypes only)
+ @param x, y, z, w: Specify x, y, z, and w coordinates of a vertex. Not all parameters
are present in all forms of the command.
@type v: Buffer object. Depends of function prototype (for 'v' prototypes only)
@param v: Specifies a pointer to an array of two, three, or four elements. The
@@ -1632,11 +1632,11 @@ def glViewport(x,y,width,height):
Set the viewport
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/viewport.html}
- @type x,y: int
- @param x,y: Specify the lower left corner of the viewport rectangle,
+ @type x, y: int
+ @param x, y: Specify the lower left corner of the viewport rectangle,
in pixels. The initial value is (0,0).
- @type width,height: int
- @param width,height: Specify the width and height of the viewport. When a GL context
+ @type width, height: int
+ @param width, height: Specify the width and height of the viewport. When a GL context
is first attached to a window, width and height are set to the dimensions of that window.
"""
diff --git a/source/blender/python/api2_2x/doc/Blender.py b/source/blender/python/api2_2x/doc/Blender.py
index 9d89cae7137..8767df43ee1 100644
--- a/source/blender/python/api2_2x/doc/Blender.py
+++ b/source/blender/python/api2_2x/doc/Blender.py
@@ -73,7 +73,7 @@ def Set (request, data):
- 'renderdir': default render output dir
- 'soundsdir': sound dir
- 'tempdir': temp file storage dir
- - 'mipmap' : Use mipmapping in the 3d view (Use a boolean value True/False).
+ - 'mipmap' : Use mipmapping in the 3d view (Use a boolean value True/False).
@type data: int or string
@param data: The new value.
"""
@@ -111,7 +111,7 @@ def Get (request):
- 'soundsdir': the path to the user defined dir for sound files. (*)
- 'tempdir': the path to the user defined dir for storage of Blender
temporary files. (*)
- - 'mipmap' : Use mipmapping in the 3d view. (*)
+ - 'mipmap' : Use mipmapping in the 3d view. (*)
- 'version' : the Blender version number.
@note: (*) these can be set in Blender at the User Preferences window -> File
Paths tab.
@@ -255,6 +255,6 @@ def Quit ():
def SaveUndoState (message):
"""
Sets an undo at the current state.
- @param message: Message that appiers in the undo menu
+ @param message: Message that appears in the undo menu
@type message: string
"""
diff --git a/source/blender/python/api2_2x/doc/Draw.py b/source/blender/python/api2_2x/doc/Draw.py
index 97e22797902..127f37bfbad 100644
--- a/source/blender/python/api2_2x/doc/Draw.py
+++ b/source/blender/python/api2_2x/doc/Draw.py
@@ -235,19 +235,21 @@ def EndAlign():
Use after BeginAlign() to stop aligning the buttons (button layout only).
"""
-def UIBlock(draw):
+def UIBlock(draw, mouse_exit=1):
"""
This function creates a popup area where buttons, labels, sliders etc can be drawn.
+ @type mouse_exit: int
+ @param mouse_exit: When zero the popup wont close when the mouse moves away from the popup.
@type draw: function
@param draw: A function to draw to the popup area, taking no arguments: draw().
@note: The size of the popup will expand to fit the bounds of the buttons created in the draw function.
- @note: Be sure to use the mouse coordinates to position the buttons under the mouse,
+ @note: If mouse_exit is nonzero be sure to use the mouse coordinates if to position the buttons under the mouse,
so the popup dosn't exit as soon as it opens.
The coordinates for buttons start 0,0 at the bottom left hand side of the screen.
@note: Within this popup, Redraw events and the registered button callback will not work.
- For buttons to run events, use per button callbacks.
+ For buttons to run events, use per button callbacks instead.
@note: OpenGL drawing functions wont work within this popup, for text use L{Label} rather then L{Text}
@warning: L{Menu} will not work properly within a UIBlock, this is a limitation with blenders user interface internals.
"""
diff --git a/source/blender/python/api2_2x/doc/Geometry.py b/source/blender/python/api2_2x/doc/Geometry.py
index f882f4b3b57..5d507956cdb 100644
--- a/source/blender/python/api2_2x/doc/Geometry.py
+++ b/source/blender/python/api2_2x/doc/Geometry.py
@@ -59,8 +59,16 @@ def PointInTriangle2D(pt, tri_pt1, tri_pt2, tri_pt3):
"""
Takes 4 vectors (one for the test point and 3 for the triangle)
This is a 2d function so only X and Y are used, Z and W will be ignored.
- @rtype: bool
- @return: True or False depending on the points intersection.
+ @rtype: int
+ @return: 1 for a clockwise intersection, -1 for counter clockwise intersection, 0 when there is no intersection.
+ """
+
+def PointInQuad2D(pt, quad_pt1, quad_pt2, quad_pt3):
+ """
+ Takes 5 vectors (one for the test point and 5 for the quad)
+ This is a 2d function so only X and Y are used, Z and W will be ignored.
+ @rtype: int
+ @return: 1 for a clockwise intersection, -1 for counter clockwise intersection, 0 when there is no intersection.
"""
def BoxPack2D(boxlist):
diff --git a/source/blender/python/api2_2x/doc/Image.py b/source/blender/python/api2_2x/doc/Image.py
index 564cac3ef9b..e376b11c4fa 100644
--- a/source/blender/python/api2_2x/doc/Image.py
+++ b/source/blender/python/api2_2x/doc/Image.py
@@ -107,6 +107,8 @@ class Image:
@type fields_odd: boolean
@ivar antialias: enable or disable the antialias option for this image.
@type antialias: boolean
+ @ivar premul: premultiply alpha toggle.
+ @type premul: boolean
@ivar bindcode: Texture's bind code (readonly).
@type bindcode: int
@ivar source: Image source type. See L{the Sources dictionary<Sources>} .
diff --git a/source/blender/python/api2_2x/doc/Ipo.py b/source/blender/python/api2_2x/doc/Ipo.py
index d1c72f8cb86..507592ce8a6 100644
--- a/source/blender/python/api2_2x/doc/Ipo.py
+++ b/source/blender/python/api2_2x/doc/Ipo.py
@@ -57,8 +57,8 @@ The valid IpoCurve constants are:
TE_DISTA, TE_MGTYPE, TE_MGH, TE_LACU, TE_OCT, TE_MGOFF,
TE_MGGAIN, TE_NBASE1, TE_NBASE2, TE_COLR, TE_COLG, TE_COLB,
TE_BRIGHT, TE_CONTRAS
- 9. Pose/Action Ipo: PO_LOCX, PO_LOCY, PO_LOCZ, PO_SIZEX, PO_SIZEY,
- PO_SIZEZ, PO_QUATW, PO_QUATX, PO_QUATY, PO_QUATZ
+ 9. Pose/Action Ipo: PO_LOCX, PO_LOCY, PO_LOCZ, PO_SCALEX, PO_SCALEY,
+ PO_SCALEZ, PO_QUATW, PO_QUATX, PO_QUATY, PO_QUATZ
10. Sequence Ipo: SQ_FAC
Shape Key Ipos are handled differently from other Ipos. The user can rename
diff --git a/source/blender/python/api2_2x/doc/IpoCurve.py b/source/blender/python/api2_2x/doc/IpoCurve.py
index 54d9136ec1e..850a1825325 100644
--- a/source/blender/python/api2_2x/doc/IpoCurve.py
+++ b/source/blender/python/api2_2x/doc/IpoCurve.py
@@ -16,7 +16,7 @@ BezTriples.
Example::
import Blender
ipo = Blender.Ipo.Get('ObIpo') # retrieves an Ipo object
- ipo.name = 'ipo1' # change the Ipo's name
+ ipo.name = 'ipo1' # change the Ipo's name
icu = ipo[Blender.Ipo.OB_LOCX] # request X Location Ipo curve object
if icu != None and len(icu.bezierPoints) > 0: # if curve exists and has BezTriple points
val = icu[2.5] # get the curve's value at time 2.5
@@ -78,27 +78,27 @@ class IpoCurve:
get the value of the final curve point, read the final point from the
curve::
- ipo = Blender.Object.Get('Cube').ipo
- icu = ipo['LocX']
- endtime,endvalue = icu.bezierPoints[-1].pt
+ ipo = Blender.Object.Get('Cube').ipo
+ icu = ipo['LocX']
+ endtime,endvalue = icu.bezierPoints[-1].pt
@type extend: int
"""
def __getitem__ (time):
- """
- Returns the value of the curve at a particular time.
+ """
+ Returns the value of the curve at a particular time.
@type time: float
@param time: time (Vertex X) on the curve
@rtype: float
@return: value (Vertex Y) corresponding to the given time
- """
+ """
def __setitem__ (time):
- """
- Sets the value (Vertex Y) of the curve at a particular time.
+ """
+ Sets the value (Vertex Y) of the curve at a particular time.
@type time: float
@param time: time (Vertex X) on the curve
- """
+ """
def setExtrapolation(extendmode):
"""
@@ -216,6 +216,17 @@ class IpoCurve:
@return: the points of the Ipo curve.
"""
+ def clean( thresh=0.0000001 ):
+ """
+ Calls the IPO-curve cleaning function on this IpoCurve.
+ There is no need to recalculate curve manually.
+ @type thresh: float
+ @param thresh: The threshold to used to determine if two values are identical.
+ By default, the IPO-editor tool's value is used.
+ @rtype: None
+ @return: None
+ """
+
def evaluate( time ):
"""
Compute the value of the Ipo curve at a particular time (B{deprecated}).
diff --git a/source/blender/python/api2_2x/doc/Material.py b/source/blender/python/api2_2x/doc/Material.py
index fa6a9f7047a..b37fd660810 100644
--- a/source/blender/python/api2_2x/doc/Material.py
+++ b/source/blender/python/api2_2x/doc/Material.py
@@ -212,7 +212,7 @@ class Material:
Value is clamped to the range [0.0,100.0].
@type haloSize: float
@ivar hard: Hardness of the specularity.
- Value is clamped to the range [1,255].
+ Value is clamped to the range [1,511].
@type hard: int
@ivar ipo: Material Ipo data.
Contains the Ipo if one is assigned to the object, None otherwise. Setting to None clears the current Ipo.
diff --git a/source/blender/python/api2_2x/doc/Mesh.py b/source/blender/python/api2_2x/doc/Mesh.py
index e48f41e8f9c..9b6dcae8bb6 100644
--- a/source/blender/python/api2_2x/doc/Mesh.py
+++ b/source/blender/python/api2_2x/doc/Mesh.py
@@ -85,6 +85,7 @@ done once.
- ADD - add to background (halo).
- ALPHA - draw with transparency.
- SUB - subtract from background.
+ - CLIP - Clipped alpha.
@var EdgeFlags: The available edge flags.
- SELECT - selected (B{deprecated}). Use edge.sel attribute instead.
- EDGEDRAW - edge is drawn out of edition mode.
diff --git a/source/blender/python/api2_2x/doc/Noise.py b/source/blender/python/api2_2x/doc/Noise.py
index 5a246031fd0..122fdd3eda1 100644
--- a/source/blender/python/api2_2x/doc/Noise.py
+++ b/source/blender/python/api2_2x/doc/Noise.py
@@ -128,11 +128,9 @@ def turbulence (xyz, octaves, hard, basis = NoiseTypes['STDPERLIN'],
@return: the generated turbulence value.
"""
-def vTurbulence (xyz, octaves, hard, basis = NoiseTypes['STDPERLIN'],
- ampscale = 0.5, freqscale = 2.0):
+def vTurbulence (xyz, octaves, hard, basis = NoiseTypes['STDPERLIN'], ampscale = 0.5, freqscale = 2.0):
"""
- Returns general turbulence vector using the optional specified noise basis
-function.
+ Returns general turbulence vector using the optional specified noise basis function.
@type xyz: 3-float tuple
@param xyz: (x,y,z) float values.
@type octaves: int
diff --git a/source/blender/python/api2_2x/doc/Object.py b/source/blender/python/api2_2x/doc/Object.py
index 49cb14d1e66..c5ce7a4d2bf 100644
--- a/source/blender/python/api2_2x/doc/Object.py
+++ b/source/blender/python/api2_2x/doc/Object.py
@@ -264,7 +264,7 @@ class Object:
B{Note}:
When dealing with properties and functions such as LocX/RotY/getLocation(), getSize() and getEuler(),
- keep in mind that these transformation properties are relative to the object's parent (if any).
+ keep in mind that these transformation properties are relative to the object itself, ignoring any other transformations.
To get these values in worldspace (taking into account vertex parents, constraints, etc.)
pass the argument 'worldspace' to these functions.
@@ -656,9 +656,13 @@ class Object:
Return a list of particle systems linked to this object (see Blender.Particle).
"""
- def newParticleSystem():
+ def newParticleSystem(name = None):
"""
- Link a new particle system (see Blender.Particle).
+ Link a particle system (see Blender.Particle). If no name is
+ given, a new particle system is created. If a name is given and a
+ particle system with that name exists, it is linked to the object.
+ @type name: string
+ @param name: The name of the requested Particle system (optional).
"""
def addVertexGroupsFromArmature(object):
@@ -780,9 +784,9 @@ class Object:
"""
@type space: string
@param space: The desired space for the size:
- - localspace: (default) relative to the object's parent;
- - worldspace: absolute, taking vertex parents, tracking and
- Ipo's into account;
+ - localspace: (default) location without other transformations
+ - worldspace: location taking vertex parents, tracking and
+ Ipos into account
Returns the object's localspace rotation as Euler rotation vector (rotX, rotY, rotZ). Angles are in radians.
@rtype: Py_Euler
@return: A python Euler. Data is wrapped when euler is present.
@@ -812,9 +816,9 @@ class Object:
"""
@type space: string
@param space: The desired space for the location:
- - localspace: (default) relative to the object's parent;
- - worldspace: absolute, taking vertex parents, tracking and
- Ipo's into account;
+ - localspace: (default) location without other transformations
+ - worldspace: location taking vertex parents, tracking and
+ Ipos into account
Returns the object's location (x, y, z).
@return: (x, y, z)
@@ -895,9 +899,9 @@ class Object:
"""
@type space: string
@param space: The desired space for the size:
- - localspace: (default) relative to the object's parent;
- - worldspace: absolute, taking vertex parents, tracking and
- Ipo's into account;
+ - localspace: (default) location without other transformations
+ - worldspace: location taking vertex parents, tracking and
+ Ipos into account
Returns the object's size.
@return: (SizeX, SizeY, SizeZ)
@note: the worldspace size will not return negative (flipped) scale values.
diff --git a/source/blender/python/api2_2x/doc/Particle.py b/source/blender/python/api2_2x/doc/Particle.py
index 511ad81b45f..cf662d9147a 100644
--- a/source/blender/python/api2_2x/doc/Particle.py
+++ b/source/blender/python/api2_2x/doc/Particle.py
@@ -131,8 +131,7 @@ class Particle:
Get the particles locations.
A list of tuple is returned in particle mode.
A list of list of tuple is returned in hair mode.
- The tuple is a vector of 3 or 4 floats in world space (x,y,z,
-optionally the particle's id).
+ The tuple is a vector of 3 or 4 floats in world space (x,y,z, optionally the particle's id).
@type all: int
@param all: if not 0 export all particles (uninitialized (unborn or died)particles exported as None).
@type id: int
diff --git a/source/blender/python/api2_2x/doc/Render.py b/source/blender/python/api2_2x/doc/Render.py
index 5300fdab808..397020fb909 100644
--- a/source/blender/python/api2_2x/doc/Render.py
+++ b/source/blender/python/api2_2x/doc/Render.py
@@ -1228,3 +1228,17 @@ class RenderData:
@rtype: int (if prototype is empty)
@return: Current new map value for the scene.
"""
+
+ def addRenderLayer():
+ """
+ Add a new render layer to the rendering context, see L{RenderLayer}.
+ @rtype: RenderLayer
+ @return: The newly created renderlayer.
+ """
+
+ def removeRenderLayer(renderlayer):
+ """
+ Remove the specified render layer from the rendering context.
+ @type renderlayer: L{RenderLayer}
+ @param renderlayer: must be a L{RenderLayer}
+ """
diff --git a/source/blender/python/api2_2x/doc/Renderlayer.py b/source/blender/python/api2_2x/doc/Renderlayer.py
new file mode 100644
index 00000000000..60b8ec46b74
--- /dev/null
+++ b/source/blender/python/api2_2x/doc/Renderlayer.py
@@ -0,0 +1,92 @@
+# Blender.Scene.Render.RenderLayer module and the RenderLayer PyType object
+
+"""
+The Blender.Scene.Render.RenderLayer submodule.
+
+Scene.Render.RenderLayer
+========================
+
+This module provides access to B{Render Layers} in Blender.
+
+Example::
+ import bpy
+ sce = bpy.data.scenes.active
+ render = sce.render
+ layer = render.addRenderLayer()
+ render.removeRenderLayer(layer)
+"""
+
+class RenderLayer:
+ """
+ The RenderLayer object
+ ======================
+ @type name: string
+ @ivar name: Get or set the name for the L{RenderLayer}
+ @type lightGroup: group
+ @ivar lightGroup: group of lights
+ @type enable: bool
+ @ivar enable: enable this render layer
+ @type enableZMask: bool
+ @ivar enableZMask: Only render what's in front of the solid z values
+ @type enableZMaskAll: bool
+ @ivar enableZMaskAll: Fill in Z values for solid faces in invisible layers, for masking
+ @type enableSolid: bool
+ @ivar enableSolid: Render Solid faces in this Layer
+ @type enableZTra: bool
+ @ivar enableZTra: Render Z-Transparent faces in this Layer (On top of Solid and Halos)
+ @type enableHalo: bool
+ @ivar enableHalo: Render Halos in this Layer (on top of Solid)
+ @type enableEdge: bool
+ @ivar enableEdge: Render Edge-enhance in this Layer (only works for Solid faces)
+ @type enableSky: bool
+ @ivar enableSky: Render Sky or backbuffer in this Layer
+ @type enableStrand: bool
+ @ivar enableStrand: Render Strands in this Layer
+ @type layerMask: bool
+ @ivar layerMask: ...
+ @type zLayerMask: bool
+ @ivar zLayerMask: ...
+
+ @type passCombined: bool
+ @ivar passCombined: Deliver full combined RGBA buffer
+ @type passZ: bool
+ @ivar passZ: Deliver Z values pass
+ @type passSpeed: bool
+ @ivar passSpeed: Deliver Speed Vector pass
+ @type passNormal: bool
+ @ivar passNormal: Deliver Normal pass
+ @type passUV: bool
+ @ivar passUV: Deliver Texture UV pass
+ @type passMist: bool
+ @ivar passMist: Deliver Mist factor pass (0-1)
+ @type passIndex: bool
+ @ivar passIndex: Deliver Object Index pass
+ @type passColor: bool
+ @ivar passColor: Deliver shade-less Color pass
+ @type passDiffuse: bool
+ @ivar passDiffuse: Deliver Diffuse pass
+ @type passSpecular: bool
+ @ivar passSpecular: Deliver Specular pass
+ @type passShadow: bool
+ @ivar passShadow: Deliver Shadow pass
+ @type passAO: bool
+ @ivar passAO: Deliver AO pass
+ @type passReflect: bool
+ @ivar passReflect: Deliver Raytraced Reflection pass
+ @type passRefract: bool
+ @ivar passRefract: Deliver Raytraced Reflection pass
+ @type passRadiosity: bool
+ @ivar passRadiosity: Deliver Radiosity pass
+
+
+ @type passSpecularXOR: bool
+ @ivar passSpecularXOR: Deliver Specular pass XOR
+ @type passShadowXOR: bool
+ @ivar passShadowXOR: Deliver Shadow pass XOR
+ @type passAOXOR: bool
+ @ivar passAOXOR: Deliver AO pass XOR
+ @type passRefractXOR: bool
+ @ivar passRefractXOR: Deliver Raytraced Reflection pass XOR
+ @type passRadiosityXOR: bool
+ @ivar passRadiosityXOR: Deliver Radiosity pass XOR
+ """ \ No newline at end of file
diff --git a/source/blender/python/api2_2x/doc/SConscript b/source/blender/python/api2_2x/doc/SConscript
new file mode 100644
index 00000000000..eca5d9a615c
--- /dev/null
+++ b/source/blender/python/api2_2x/doc/SConscript
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+Import ('env')
+
+
+from optparse import OptionParser
+try:
+ import epydoc
+except ImportError:
+ print "No epydoc install detected, Python API Docs will not be generated "
+if epydoc:
+ from epydoc.docbuilder import build_doc_index
+ from epydoc import cli
+ names = env.Glob("source/blender/python/api2_2x/doc/[A-Z]*.py")
+ docindex = build_doc_index(names)
+ optvalues = cli.OPTION_DEFAULTS
+ optvalues["verbose"] = 1
+ optvalues["target"] = env["BF_DOCDIR"]+"/BPY_API/"
+ optvalues["url"] = "http://www.blender.org"
+ optvalues["top"] = "API_intro"
+ optvalues["name"] = "Blender"
+ optvalues["noprivate"] = 1
+ optvalues["noframes"] = 1
+ optvalues["names"] = names
+ optparser = OptionParser()
+ optparser.set_defaults(**optvalues)
+ (options, args) = optparser.parse_args([])
+ cli.write_html(docindex, options)
+
diff --git a/source/blender/python/api2_2x/doc/Text.py b/source/blender/python/api2_2x/doc/Text.py
index 022205573aa..3093b636658 100644
--- a/source/blender/python/api2_2x/doc/Text.py
+++ b/source/blender/python/api2_2x/doc/Text.py
@@ -143,7 +143,7 @@ class Text:
Retrieve the contents of this Text buffer as a list of strings between
the start and end lines specified. If end < 0 all lines from start will
be included.
- @type start int
+ @type start: int
@param start: Optional index of first line of the span to return
@type end int
@param end: Optional index of the line to which the span is taken or
diff --git a/source/blender/python/api2_2x/doc/Texture.py b/source/blender/python/api2_2x/doc/Texture.py
index b5b82b1a519..ad57c303ed2 100644
--- a/source/blender/python/api2_2x/doc/Texture.py
+++ b/source/blender/python/api2_2x/doc/Texture.py
@@ -432,9 +432,9 @@ class Texture:
def setFlags(f1=None, f2=None, f3=None, f4=None):
"""
Set this object's flags.
- @param f1,f2,f3,f4: Flags to be set (omitted flags are cleared). Can be any of
+ @param f1, f2, f3, f4: Flags to be set (omitted flags are cleared). Can be any of
'FlipBlendXY', 'NegAlpha', 'CheckerOdd', and 'CheckerEven'
- @type f1,f2,f3,f4: string
+ @type f1, f2, f3, f4: string
"""
def setImage(image):
diff --git a/source/blender/python/api2_2x/doc/Types.py b/source/blender/python/api2_2x/doc/Types.py
index a08226e46ee..d9cd70a1f5b 100644
--- a/source/blender/python/api2_2x/doc/Types.py
+++ b/source/blender/python/api2_2x/doc/Types.py
@@ -25,6 +25,17 @@ Example::
elif type(data) == Types.LampType:
print "Let there be light!"
+Since Blender 2.48a you can get the size of the underlying DNA structs for a collection of Blender Python types.
+
+Example::
+ # loop over Types dictionary and print the struct sizes
+ # -1 where the type is not supported byt the CSizeof function
+ import Blender.Types as bt
+ x = dir(bt)
+ for t in x:
+ s = 'bt.CSizeof(bt.' + t + ')'
+ print t,"=", eval(s)
+
@var ObjectType: Blender Object. The base object, linked to its specific data
at its .data member variable.
@var GroupType: Blender Group. A Group that references a list of objects that are a part of this group.
@@ -45,8 +56,12 @@ Example::
@var ArmatureType: Blender Armature. The "skeleton", for animating and deforming
objects.
@var BoneType: Blender Bone. Bones are, obviously, the "pieces" of an Armature.
+@var EditBoneType: Blender Editbone. Bones in editmode.
@var CurveType: Blender Curve.
@var IpoType: Blender Ipo.
+@var CurNurbType: Blender CurNurb.
+@var SurfNurbType: Blender SurfNurb.
+@var IpoCurveType: Blender IpoCurve.
@var MetaballType: Blender Metaball.
@var CameraType: Blender Camera.
@var ImageType: Blender Image.
@@ -57,7 +72,7 @@ objects.
@var SceneType: A Blender Scene. Container of all other objects.
@var ButtonType: Blender Button. One of the Draw widgets.
@var vectorType: Blender vector. Used in NMesh, Mesh and elsewhere.
-@var matrix_Type: Blender matrix.
+@var matrixType: Blender matrix.
@var quaternionType: Blender quaternion. Used in armatures.
@var eulerType: Blender euler.
@var bufferType: Blender buffer. A contiguous piece of storage, used in BGL.
@@ -68,3 +83,11 @@ objects.
@var IDGroupType: Blender IDProperty Group type.
@var IDArrayType: Blender IDProperty Array type.
"""
+
+def CSizeof (type):
+ """
+ Get the size in bytes of the underlying DNA struct for the given type.
+ @param type: A Blender Python type.
+ @type type: type
+ @return: size in bytes or -1 if not supported type.
+ """ \ No newline at end of file
diff --git a/source/blender/python/api2_2x/doc/epy_docgen.sh b/source/blender/python/api2_2x/doc/epy_docgen.sh
index 8cbebf82f8d..0e5350e41ae 100644
--- a/source/blender/python/api2_2x/doc/epy_docgen.sh
+++ b/source/blender/python/api2_2x/doc/epy_docgen.sh
@@ -7,5 +7,5 @@
# set posix locale so regex works properly for [A-Z]*.py
LC_ALL=POSIX
-epydoc -v -o BPY_API --url "http://www.blender.org" --top API_intro \
+epydoc --debug -v -o BPY_API --url "http://www.blender.org" --top API_intro \
--name "Blender" --no-private --no-frames [A-Z]*.py
diff --git a/source/blender/python/api2_2x/matrix.c b/source/blender/python/api2_2x/matrix.c
index 9f5e49e8d88..79ca5e09b25 100644
--- a/source/blender/python/api2_2x/matrix.c
+++ b/source/blender/python/api2_2x/matrix.c
@@ -774,7 +774,7 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
return EXPP_ReturnPyObjError(PyExc_TypeError,
"Matrix multiplication: arguments not acceptable for this operation\n");
}
-PyObject* Matrix_inv(MatrixObject *self)
+static PyObject* Matrix_inv(MatrixObject *self)
{
return Matrix_Invert(self);
}
diff --git a/source/blender/python/api2_2x/sceneRender.c b/source/blender/python/api2_2x/sceneRender.c
index 40bcdc9a8b8..8f28557c449 100644
--- a/source/blender/python/api2_2x/sceneRender.c
+++ b/source/blender/python/api2_2x/sceneRender.c
@@ -89,7 +89,8 @@ enum rend_constants {
EXPP_RENDER_ATTR_BAKEMODE,
EXPP_RENDER_ATTR_BAKEDIST,
EXPP_RENDER_ATTR_BAKENORMALSPACE,
- EXPP_RENDER_ATTR_BAKEBIAS
+ EXPP_RENDER_ATTR_BAKEBIAS,
+ EXPP_RENDER_ATTR_OCRES
};
#define EXPP_RENDER_ATTR_CFRA 2
@@ -397,13 +398,13 @@ static PyObject *M_Render_getInt( BPy_RenderData *self, int var )
/* Render Module Function Definitions */
/***************************************************************************/
-PyObject *M_Render_CloseRenderWindow( PyObject * self )
+static PyObject *M_Render_CloseRenderWindow( PyObject * self )
{
BIF_close_render_display( );
Py_RETURN_NONE;
}
-PyObject *M_Render_SetRenderWinPos( PyObject * self, PyObject * args )
+static PyObject *M_Render_SetRenderWinPos( PyObject * self, PyObject * args )
{
PyObject *list = NULL;
char *loc = NULL;
@@ -446,7 +447,7 @@ PyObject *M_Render_SetRenderWinPos( PyObject * self, PyObject * args )
Py_RETURN_NONE;
}
-PyObject *M_Render_EnableDispView( PyObject * self )
+static PyObject *M_Render_EnableDispView( PyObject * self )
{
G.displaymode = R_DISPLAYIMAGE;
EXPP_allqueue( REDRAWBUTSSCENE, 0 );
@@ -454,7 +455,7 @@ PyObject *M_Render_EnableDispView( PyObject * self )
Py_RETURN_NONE;
}
-PyObject *M_Render_EnableDispWin( PyObject * self )
+static PyObject *M_Render_EnableDispWin( PyObject * self )
{
G.displaymode = R_DISPLAYWIN;
EXPP_allqueue( REDRAWBUTSSCENE, 0 );
@@ -467,7 +468,7 @@ PyObject *M_Render_EnableDispWin( PyObject * self )
/* BPy_RenderData Function Definitions */
/***************************************************************************/
-PyObject *RenderData_Render( BPy_RenderData * self )
+static PyObject *RenderData_Render( BPy_RenderData * self )
{
Scene *oldsce;
/* unlock to prevent a deadlock when there are pynodes: */
@@ -511,7 +512,7 @@ PyObject *RenderData_Render( BPy_RenderData * self )
/* BPy_Bake Function Definitions */
/***************************************************************************/
-PyObject *RenderData_Bake( BPy_RenderData * self )
+static PyObject *RenderData_Bake( BPy_RenderData * self )
{
char *error_msg = NULL;
Scene *oldsce;
@@ -532,7 +533,7 @@ PyObject *RenderData_Bake( BPy_RenderData * self )
/*
* This will save the rendered image to an output file path already defined.
*/
-PyObject *RenderData_SaveRenderedImage ( BPy_RenderData * self, PyObject *args )
+static PyObject *RenderData_SaveRenderedImage ( BPy_RenderData * self, PyObject *args )
{
char dir[FILE_MAXDIR * 2], str[FILE_MAXFILE * 2];
char *name_str, filepath[FILE_MAXDIR+FILE_MAXFILE];
@@ -571,7 +572,7 @@ PyObject *RenderData_SaveRenderedImage ( BPy_RenderData * self, PyObject *args )
Py_RETURN_NONE;
}
-PyObject *RenderData_RenderAnim( BPy_RenderData * self )
+static PyObject *RenderData_RenderAnim( BPy_RenderData * self )
{
Scene *oldsce;
/* unlock to prevent a deadlock when there are pynodes: */
@@ -609,7 +610,7 @@ PyObject *RenderData_RenderAnim( BPy_RenderData * self )
Py_RETURN_NONE;
}
-PyObject *RenderData_Play( BPy_RenderData * self )
+static PyObject *RenderData_Play( BPy_RenderData * self )
{
char file[FILE_MAXDIR + FILE_MAXFILE];
extern char bprogname[];
@@ -668,46 +669,46 @@ PyObject *RenderData_Play( BPy_RenderData * self )
Py_RETURN_NONE;
}
-PyObject *RenderData_EnableBackbuf( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EnableBackbuf( BPy_RenderData * self, PyObject * args )
{
return M_Render_BitToggleShort( args, 1,
&self->renderContext->bufflag );
}
-PyObject *RenderData_EnableExtensions( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EnableExtensions( BPy_RenderData * self, PyObject * args )
{
return M_Render_BitToggleInt( args, R_EXTENSION,
&self->renderContext->scemode );
}
-PyObject *RenderData_EnableSequencer( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EnableSequencer( BPy_RenderData * self, PyObject * args )
{
return M_Render_BitToggleInt( args, R_DOSEQ,
&self->renderContext->scemode );
}
-PyObject *RenderData_EnableRenderDaemon( BPy_RenderData * self,
+static PyObject *RenderData_EnableRenderDaemon( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_BG_RENDER,
&self->renderContext->scemode );
}
-PyObject *RenderData_EnableToonShading( BPy_RenderData * self,
+static PyObject *RenderData_EnableToonShading( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_EDGE,
&self->renderContext->mode );
}
-PyObject *RenderData_EdgeIntensity( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EdgeIntensity( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeShort( args,
&self->renderContext->edgeint, 0,
255 );
}
-PyObject *RenderData_SetEdgeColor( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_SetEdgeColor( BPy_RenderData * self, PyObject * args )
{
float red, green, blue;
@@ -732,7 +733,7 @@ PyObject *RenderData_SetEdgeColor( BPy_RenderData * self, PyObject * args )
Py_RETURN_NONE;
}
-PyObject *RenderData_GetEdgeColor( BPy_RenderData * self )
+static PyObject *RenderData_GetEdgeColor( BPy_RenderData * self )
{
char rgb[24];
@@ -741,7 +742,7 @@ PyObject *RenderData_GetEdgeColor( BPy_RenderData * self )
return PyString_FromString( rgb );
}
-PyObject *RenderData_EnableOversampling( BPy_RenderData * self,
+static PyObject *RenderData_EnableOversampling( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_OSA,
@@ -768,34 +769,34 @@ static int RenderData_setOSALevel( BPy_RenderData * self,
return 0;
}
-PyObject *RenderData_EnableMotionBlur( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EnableMotionBlur( BPy_RenderData * self, PyObject * args )
{
return M_Render_BitToggleInt( args, R_MBLUR,
&self->renderContext->mode );
}
-PyObject *RenderData_MotionBlurLevel( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_MotionBlurLevel( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeFloat( args,
&self->renderContext->blurfac,
0.01f, 5.0f );
}
-PyObject *RenderData_PartsX( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_PartsX( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeShort( args,
&self->renderContext->xparts, 1,
512 );
}
-PyObject *RenderData_PartsY( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_PartsY( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeShort( args,
&self->renderContext->yparts, 1,
64 );
}
-PyObject *RenderData_EnableSky( BPy_RenderData * self )
+static PyObject *RenderData_EnableSky( BPy_RenderData * self )
{
self->renderContext->alphamode = R_ADDSKY;
EXPP_allqueue( REDRAWBUTSSCENE, 0 );
@@ -803,7 +804,7 @@ PyObject *RenderData_EnableSky( BPy_RenderData * self )
Py_RETURN_NONE;
}
-PyObject *RenderData_EnablePremultiply( BPy_RenderData * self )
+static PyObject *RenderData_EnablePremultiply( BPy_RenderData * self )
{
self->renderContext->alphamode = R_ALPHAPREMUL;
EXPP_allqueue( REDRAWBUTSSCENE, 0 );
@@ -811,7 +812,7 @@ PyObject *RenderData_EnablePremultiply( BPy_RenderData * self )
Py_RETURN_NONE;
}
-PyObject *RenderData_EnableKey( BPy_RenderData * self )
+static PyObject *RenderData_EnableKey( BPy_RenderData * self )
{
self->renderContext->alphamode = R_ALPHAKEY;
EXPP_allqueue( REDRAWBUTSSCENE, 0 );
@@ -819,59 +820,59 @@ PyObject *RenderData_EnableKey( BPy_RenderData * self )
Py_RETURN_NONE;
}
-PyObject *RenderData_EnableShadow( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EnableShadow( BPy_RenderData * self, PyObject * args )
{
return M_Render_BitToggleInt( args, R_SHADOW,
&self->renderContext->mode );
}
-PyObject *RenderData_EnableEnvironmentMap( BPy_RenderData * self,
+static PyObject *RenderData_EnableEnvironmentMap( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_ENVMAP,
&self->renderContext->mode );
}
-PyObject *RenderData_EnablePanorama( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EnablePanorama( BPy_RenderData * self, PyObject * args )
{
return M_Render_BitToggleInt( args, R_PANORAMA,
&self->renderContext->mode );
}
-PyObject *RenderData_EnableRayTracing( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EnableRayTracing( BPy_RenderData * self, PyObject * args )
{
return M_Render_BitToggleInt( args, R_RAYTRACE,
&self->renderContext->mode );
}
-PyObject *RenderData_EnableRadiosityRender( BPy_RenderData * self,
+static PyObject *RenderData_EnableRadiosityRender( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_RADIO,
&self->renderContext->mode );
}
-PyObject *RenderData_EnableFieldRendering( BPy_RenderData * self,
+static PyObject *RenderData_EnableFieldRendering( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_FIELDS,
&self->renderContext->mode );
}
-PyObject *RenderData_EnableOddFieldFirst( BPy_RenderData * self,
+static PyObject *RenderData_EnableOddFieldFirst( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_ODDFIELD,
&self->renderContext->mode );
}
-PyObject *RenderData_EnableFieldTimeDisable( BPy_RenderData * self,
+static PyObject *RenderData_EnableFieldTimeDisable( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_FIELDSTILL,
&self->renderContext->mode );
}
-PyObject *RenderData_EnableGaussFilter( BPy_RenderData * self,
+static PyObject *RenderData_EnableGaussFilter( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_GAUSS,
@@ -882,7 +883,7 @@ PyObject *RenderData_EnableGaussFilter( BPy_RenderData * self,
/* choices are listed in DNA_scene_types.h (search filtertype) */
}
-PyObject *RenderData_EnableBorderRender( BPy_RenderData * self,
+static PyObject *RenderData_EnableBorderRender( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_BORDER,
@@ -924,57 +925,57 @@ static PyObject *RenderData_getBorder( BPy_RenderData * self )
self->renderContext->border.ymax );
}
-PyObject *RenderData_EnableGammaCorrection( BPy_RenderData * self,
+static PyObject *RenderData_EnableGammaCorrection( BPy_RenderData * self,
PyObject * args )
{
return M_Render_BitToggleInt( args, R_GAMMA,
&self->renderContext->mode );
}
-PyObject *RenderData_GaussFilterSize( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_GaussFilterSize( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeFloat( args,
&self->renderContext->gauss,
0.5f, 1.5f );
}
-PyObject *RenderData_AspectRatioX( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_AspectRatioX( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeFloat( args, &self->renderContext->xasp,
1.0f, 200.0f );
}
-PyObject *RenderData_AspectRatioY( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_AspectRatioY( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeFloat( args, &self->renderContext->yasp,
1.0f, 200.0f );
}
-PyObject *RenderData_StartFrame( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_StartFrame( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeInt( args, &self->renderContext->sfra,
1, MAXFRAME );
}
-PyObject *RenderData_CurrentFrame( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_CurrentFrame( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeInt( args, &self->renderContext->cfra,
1, MAXFRAME );
}
-PyObject *RenderData_EndFrame( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_EndFrame( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeInt( args, &self->renderContext->efra,
1, MAXFRAME );
}
-PyObject *RenderData_ImageSizeX( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_ImageSizeX( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeShort( args, &self->renderContext->xsch,
4, 10000 );
}
-PyObject *RenderData_ImageSizeY( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_ImageSizeY( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeShort( args, &self->renderContext->ysch,
4, 10000 );
@@ -1003,7 +1004,7 @@ static int RenderData_setRenderer( BPy_RenderData * self, PyObject * value )
return 0;
}
-PyObject *RenderData_EnableCropping( void )
+static PyObject *RenderData_EnableCropping( void )
{
/* return M_Render_BitToggleInt( args, R_MOVIECROP,
&self->renderContext->mode );
@@ -1069,21 +1070,21 @@ static int RenderData_setImageType( BPy_RenderData *self, PyObject *value )
return 0;
}
-PyObject *RenderData_Quality( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_Quality( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeShort( args,
&self->renderContext->quality,
10, 100 );
}
-PyObject *RenderData_FramesPerSec( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_FramesPerSec( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeShort( args,
&self->renderContext->frs_sec, 1,
120 );
}
-PyObject *RenderData_EnableGrayscale( BPy_RenderData * self )
+static PyObject *RenderData_EnableGrayscale( BPy_RenderData * self )
{
self->renderContext->planes = R_PLANESBW;
EXPP_allqueue( REDRAWBUTSSCENE, 0 );
@@ -1091,7 +1092,7 @@ PyObject *RenderData_EnableGrayscale( BPy_RenderData * self )
Py_RETURN_NONE;
}
-PyObject *RenderData_EnableRGBColor( BPy_RenderData * self )
+static PyObject *RenderData_EnableRGBColor( BPy_RenderData * self )
{
self->renderContext->planes = R_PLANES24;
EXPP_allqueue( REDRAWBUTSSCENE, 0 );
@@ -1099,7 +1100,7 @@ PyObject *RenderData_EnableRGBColor( BPy_RenderData * self )
Py_RETURN_NONE;
}
-PyObject *RenderData_EnableRGBAColor( BPy_RenderData * self )
+static PyObject *RenderData_EnableRGBAColor( BPy_RenderData * self )
{
self->renderContext->planes = R_PLANES32;
EXPP_allqueue( REDRAWBUTSSCENE, 0 );
@@ -1107,7 +1108,7 @@ PyObject *RenderData_EnableRGBAColor( BPy_RenderData * self )
Py_RETURN_NONE;
}
-PyObject *RenderData_SizePreset( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_SizePreset( BPy_RenderData * self, PyObject * args )
{
int type;
@@ -1491,7 +1492,7 @@ static PyObject *RenderData_getYafrayGITunePhotons( BPy_RenderData * self )
/* (die) end */
-PyObject *RenderData_YafrayGIPower( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_YafrayGIPower( BPy_RenderData * self, PyObject * args )
{
if( self->renderContext->GImethod > 0 ) {
return M_Render_GetSetAttributeFloat( args,
@@ -1503,7 +1504,7 @@ PyObject *RenderData_YafrayGIPower( BPy_RenderData * self, PyObject * args )
"YafrayGIMethod must be set to 'SKYDOME' or 'FULL'" ) );
}
-PyObject *RenderData_YafrayGIIndirPower( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_YafrayGIIndirPower( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeFloat( args,
&self->renderContext->
@@ -1511,7 +1512,7 @@ PyObject *RenderData_YafrayGIIndirPower( BPy_RenderData * self, PyObject * args
100.00f );
}
-PyObject *RenderData_YafrayGIDepth( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_YafrayGIDepth( BPy_RenderData * self, PyObject * args )
{
if( self->renderContext->GImethod == 2 ) {
return M_Render_GetSetAttributeInt( args,
@@ -1522,7 +1523,7 @@ PyObject *RenderData_YafrayGIDepth( BPy_RenderData * self, PyObject * args )
"YafrayGIMethod must be set to 'FULL'" ) );
}
-PyObject *RenderData_YafrayGICDepth( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_YafrayGICDepth( BPy_RenderData * self, PyObject * args )
{
if( self->renderContext->GImethod == 2 ) {
return M_Render_GetSetAttributeInt( args,
@@ -1533,7 +1534,7 @@ PyObject *RenderData_YafrayGICDepth( BPy_RenderData * self, PyObject * args )
"YafrayGIMethod must be set to 'FULL'" ) );
}
-PyObject *RenderData_EnableYafrayGICache( BPy_RenderData * self,
+static PyObject *RenderData_EnableYafrayGICache( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2 ) {
@@ -1545,7 +1546,7 @@ PyObject *RenderData_EnableYafrayGICache( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL'" ) );
}
-PyObject *RenderData_EnableYafrayGIPhotons( BPy_RenderData * self,
+static PyObject *RenderData_EnableYafrayGIPhotons( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2 ) {
@@ -1557,7 +1558,7 @@ PyObject *RenderData_EnableYafrayGIPhotons( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL'" ) );
}
-PyObject *RenderData_YafrayGIPhotonCount( BPy_RenderData * self,
+static PyObject *RenderData_YafrayGIPhotonCount( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2
@@ -1571,7 +1572,7 @@ PyObject *RenderData_YafrayGIPhotonCount( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL' and GIPhotons must be enabled" ) );
}
-PyObject *RenderData_YafrayGIPhotonRadius( BPy_RenderData * self,
+static PyObject *RenderData_YafrayGIPhotonRadius( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2
@@ -1585,7 +1586,7 @@ PyObject *RenderData_YafrayGIPhotonRadius( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL' and GIPhotons must be enabled" ) );
}
-PyObject *RenderData_YafrayGIPhotonMixCount( BPy_RenderData * self,
+static PyObject *RenderData_YafrayGIPhotonMixCount( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2
@@ -1598,7 +1599,7 @@ PyObject *RenderData_YafrayGIPhotonMixCount( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL' and GIPhotons must be enabled" ) );
}
-PyObject *RenderData_EnableYafrayGITunePhotons( BPy_RenderData * self,
+static PyObject *RenderData_EnableYafrayGITunePhotons( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2
@@ -1611,7 +1612,7 @@ PyObject *RenderData_EnableYafrayGITunePhotons( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL' and GIPhotons must be enabled" ) );
}
-PyObject *RenderData_YafrayGIShadowQuality( BPy_RenderData * self,
+static PyObject *RenderData_YafrayGIShadowQuality( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2
@@ -1625,7 +1626,7 @@ PyObject *RenderData_YafrayGIShadowQuality( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL' and GICache must be enabled" ) );
}
-PyObject *RenderData_YafrayGIPixelsPerSample( BPy_RenderData * self,
+static PyObject *RenderData_YafrayGIPixelsPerSample( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2
@@ -1638,7 +1639,7 @@ PyObject *RenderData_YafrayGIPixelsPerSample( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL' and GICache must be enabled" ) );
}
-PyObject *RenderData_YafrayGIRefinement( BPy_RenderData * self,
+static PyObject *RenderData_YafrayGIRefinement( BPy_RenderData * self,
PyObject * args )
{
if( self->renderContext->GImethod == 2
@@ -1652,53 +1653,53 @@ PyObject *RenderData_YafrayGIRefinement( BPy_RenderData * self,
"YafrayGIMethod must be set to 'FULL' and GICache must be enabled" ) );
}
-PyObject *RenderData_YafrayRayBias( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_YafrayRayBias( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeFloat( args,
&self->renderContext->YF_raybias,
0.0f, 10.0f );
}
-PyObject *RenderData_YafrayRayDepth( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_YafrayRayDepth( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeInt( args,
&self->renderContext->YF_raydepth,
1, 80 );
}
-PyObject *RenderData_YafrayGamma( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_YafrayGamma( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeFloat( args,
&self->renderContext->YF_gamma,
0.001f, 5.0f );
}
-PyObject *RenderData_YafrayExposure( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_YafrayExposure( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeFloat( args,
&self->renderContext->
YF_exposure, 0.0f, 10.0f );
}
-PyObject *RenderData_EnableGameFrameStretch( BPy_RenderData * self )
+static PyObject *RenderData_EnableGameFrameStretch( BPy_RenderData * self )
{
self->scene->framing.type = SCE_GAMEFRAMING_SCALE;
Py_RETURN_NONE;
}
-PyObject *RenderData_EnableGameFrameExpose( BPy_RenderData * self )
+static PyObject *RenderData_EnableGameFrameExpose( BPy_RenderData * self )
{
self->scene->framing.type = SCE_GAMEFRAMING_EXTEND;
Py_RETURN_NONE;
}
-PyObject *RenderData_EnableGameFrameBars( BPy_RenderData * self )
+static PyObject *RenderData_EnableGameFrameBars( BPy_RenderData * self )
{
self->scene->framing.type = SCE_GAMEFRAMING_BARS;
Py_RETURN_NONE;
}
-PyObject *RenderData_SetGameFrameColor( BPy_RenderData * self,
+static PyObject *RenderData_SetGameFrameColor( BPy_RenderData * self,
PyObject * args )
{
float red = 0.0f;
@@ -1726,7 +1727,7 @@ PyObject *RenderData_SetGameFrameColor( BPy_RenderData * self,
Py_RETURN_NONE;
}
-PyObject *RenderData_GetGameFrameColor( BPy_RenderData * self )
+static PyObject *RenderData_GetGameFrameColor( BPy_RenderData * self )
{
char rgb[24];
@@ -1736,33 +1737,33 @@ PyObject *RenderData_GetGameFrameColor( BPy_RenderData * self )
}
#ifdef __sgi
-PyObject *RenderData_SGIMaxsize( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_SGIMaxsize( BPy_RenderData * self, PyObject * args )
{
return M_Render_GetSetAttributeShort( args,
&self->renderContext->maximsize,
0, 500 );
}
-PyObject *RenderData_EnableSGICosmo( BPy_RenderData *self, PyObject *args )
+static PyObject *RenderData_EnableSGICosmo( BPy_RenderData *self, PyObject *args )
{
return M_Render_BitToggleInt( args, R_COSMO,
&self->renderContext->mode );
}
#else
-PyObject *RenderData_SGIMaxsize( void )
+static PyObject *RenderData_SGIMaxsize( void )
{
return EXPP_ReturnPyObjError( PyExc_StandardError,
"SGI is not defined on this machine" );
}
-PyObject *RenderData_EnableSGICosmo( void )
+static PyObject *RenderData_EnableSGICosmo( void )
{
return EXPP_ReturnPyObjError( PyExc_StandardError,
"SGI is not defined on this machine" );
}
#endif
-PyObject *RenderData_OldMapValue( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_OldMapValue( BPy_RenderData * self, PyObject * args )
{
PyObject *tmp = M_Render_GetSetAttributeInt(args,
&self->renderContext->framapto, 1, 900);
@@ -1771,7 +1772,7 @@ PyObject *RenderData_OldMapValue( BPy_RenderData * self, PyObject * args )
return tmp;
}
-PyObject *RenderData_NewMapValue( BPy_RenderData * self, PyObject * args )
+static PyObject *RenderData_NewMapValue( BPy_RenderData * self, PyObject * args )
{
PyObject *tmp = M_Render_GetSetAttributeInt(args,
&self->renderContext->images, 1, 900);
@@ -1803,7 +1804,7 @@ static PyObject *RenderData_getTimeCode( BPy_RenderData * self) {
/***************************************************************************/
/* Render layer functions */
/***************************************************************************/
-PyObject *RenderData_getRenderLayers(BPy_RenderData * self)
+static PyObject *RenderData_getRenderLayers(BPy_RenderData * self)
{
PyObject *list, *layer;
SceneRenderLayer *srl;
@@ -1818,7 +1819,7 @@ PyObject *RenderData_getRenderLayers(BPy_RenderData * self)
return list;
}
-PyObject *RenderData_removeRenderLayer(BPy_RenderData * self, BPy_RenderLayer *value)
+static PyObject *RenderData_removeRenderLayer(BPy_RenderData * self, BPy_RenderLayer *value)
{
int index;
if (!BPy_RenderLayer_Check(value))
@@ -1855,7 +1856,7 @@ PyObject *RenderData_removeRenderLayer(BPy_RenderData * self, BPy_RenderLayer *v
Py_RETURN_NONE;
}
-PyObject *RenderData_addRenderLayer(BPy_RenderData * self ) {
+static PyObject *RenderData_addRenderLayer(BPy_RenderData * self ) {
scene_add_render_layer(self->scene);
return RenderLayer_CreatePyObject( self->scene, self->renderContext->layers.last );
@@ -1997,6 +1998,9 @@ static PyObject *RenderData_getIValueAttr( BPy_RenderData *self, void *type )
case EXPP_RENDER_ATTR_BAKENORMALSPACE:
param = self->renderContext->bake_normal_space;
break;
+ case EXPP_RENDER_ATTR_OCRES:
+ param = self->renderContext->ocres;
+ break;
default:
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"undefined type constant in RenderData_setIValueAttrClamp" );
@@ -2798,6 +2802,10 @@ static PyGetSetDef BPy_RenderData_getseters[] = {
(getter)RenderData_getMapNew, (setter)RenderData_setMapNew,
"New mapping value (in frames)",
NULL},
+ {"octreeResolution",
+ (getter)RenderData_getIValueAttr, (setter)NULL,
+ "Resolution for octree",
+ (void *)EXPP_RENDER_ATTR_OCRES},
{"set",
(getter)RenderData_getSet, (setter)RenderData_setSet,
"Scene link 'set' value",
@@ -3587,7 +3595,7 @@ static PyGetSetDef BPy_RenderLayer_getseters[] = {
(getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
"Deliver Raytraced Reflection pass",
(void *)SCE_PASS_REFRACT},
- {"passRadiosiy",
+ {"passRadiosity",
(getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
"Deliver Radiosity pass",
(void *)SCE_PASS_RADIO},
@@ -3609,7 +3617,7 @@ static PyGetSetDef BPy_RenderLayer_getseters[] = {
(getter)RenderLayer_getPassXorBits, (setter)RenderLayer_setPassXorBits,
"Deliver Raytraced Reflection pass XOR",
(void *)SCE_PASS_REFRACT},
- {"passRadiosiyXOR",
+ {"passRadiosityXOR",
(getter)RenderLayer_getPassXorBits, (setter)RenderLayer_setPassXorBits,
"Deliver Radiosity pass XOR",
(void *)SCE_PASS_RADIO},
diff --git a/source/blender/python/api2_2x/sceneSequence.c b/source/blender/python/api2_2x/sceneSequence.c
index ddc4eb6aea8..c7daea19fe7 100644
--- a/source/blender/python/api2_2x/sceneSequence.c
+++ b/source/blender/python/api2_2x/sceneSequence.c
@@ -305,16 +305,16 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
} else if (BPy_Scene_Check(py_data)) {
/* scene */
- Scene *sce = ((BPy_Scene *)py_data)->scene;
+ Scene *sceseq = ((BPy_Scene *)py_data)->scene;
seq->type= SEQ_SCENE;
- seq->scene= sce;
+ seq->scene= sceseq;
/*seq->sfra= sce->r.sfra;*/
- seq->len= sce->r.efra - sce->r.sfra + 1;
+ seq->len= sceseq->r.efra - sceseq->r.sfra + 1;
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
- strncpy(seq->name + 2, sce->id.name + 2,
+ strncpy(seq->name + 2, sceseq->id.name + 2,
sizeof(seq->name) - 2);
strip->len= seq->len;
strip->us= 1;
diff --git a/source/blender/radiosity/intern/source/radfactors.c b/source/blender/radiosity/intern/source/radfactors.c
index 8c89e806034..ba4dbf1b793 100644
--- a/source/blender/radiosity/intern/source/radfactors.c
+++ b/source/blender/radiosity/intern/source/radfactors.c
@@ -53,9 +53,9 @@
#include "RE_render_ext.h" /* for `RE_zbufferall_radio and RE_zbufferall_radio */
/* locals */
-void rad_setmatrices(RadView *vw);
-void clearsubflagelem(RNode *rn);
-void setsubflagelem(RNode *rn);
+static void rad_setmatrices(RadView *vw);
+static void clearsubflagelem(RNode *rn);
+static void setsubflagelem(RNode *rn);
RadView hemitop, hemiside;
@@ -254,7 +254,7 @@ void rad_make_hocos(RadView *vw)
/* } */
}
-void rad_setmatrices(RadView *vw) /* for hemi's */
+static void rad_setmatrices(RadView *vw) /* for hemi's */
{
float up1[3], len, twist;
@@ -628,7 +628,7 @@ void minmaxradelemfilt(RNode *rn, float *min, float *max, float *errmin, float *
}
}
-void setsubflagelem(RNode *rn)
+static void setsubflagelem(RNode *rn)
{
if(rn->down1) {
@@ -640,7 +640,7 @@ void setsubflagelem(RNode *rn)
}
}
-void clearsubflagelem(RNode *rn)
+static void clearsubflagelem(RNode *rn)
{
if(rn->down1) {
diff --git a/source/blender/radiosity/intern/source/radnode.c b/source/blender/radiosity/intern/source/radnode.c
index 042fe6840fc..ae246476e6d 100644
--- a/source/blender/radiosity/intern/source/radnode.c
+++ b/source/blender/radiosity/intern/source/radnode.c
@@ -57,10 +57,10 @@
#endif
/* locals */
-void *malloc_fast(int size);
-void *calloc_fast(int size);
-void free_fast(void *poin, int siz);
-void deleteTriNodes(RNode *node);
+static void *malloc_fast(int size);
+static void *calloc_fast(int size);
+static void free_fast(void *poin, int siz);
+static void deleteTriNodes(RNode *node);
/* lower because of local type define */
/* void check_mallocgroup(MallocGroup *mg); */
@@ -122,7 +122,7 @@ void check_mallocgroup(MallocGroup *mg)
printf("fastmalloc: shouldnt be here\n");
}
-void *malloc_fast(int size)
+static void *malloc_fast(int size)
{
MallocGroup *mg;
void *retval;
@@ -156,7 +156,7 @@ void *malloc_fast(int size)
return mg->data;
}
-void *calloc_fast(int size)
+static void *calloc_fast(int size)
{
void *poin;
@@ -166,7 +166,7 @@ void *calloc_fast(int size)
return poin;
}
-void free_fast(void *poin, int size)
+static void free_fast(void *poin, int size)
{
MallocGroup *mg;
intptr_t val;
@@ -958,7 +958,7 @@ int comparelevel(RNode *node, RNode *nb, int level)
return 1;
}
-void deleteTriNodes(RNode *node) /* both children of node */
+static void deleteTriNodes(RNode *node) /* both children of node */
{
RNode *n1, *n2;
diff --git a/source/blender/radiosity/intern/source/radpreprocess.c b/source/blender/radiosity/intern/source/radpreprocess.c
index 07b933b6db9..694cb261b08 100644
--- a/source/blender/radiosity/intern/source/radpreprocess.c
+++ b/source/blender/radiosity/intern/source/radpreprocess.c
@@ -289,7 +289,7 @@ void setedgepointers()
MEM_freeN(esblock);
}
-int materialIndex(Material *ma)
+static int materialIndex(Material *ma)
{
int i = 0;
for(i=0;i< RG.totmat; i++)
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index 96075ba6ef4..b5cab267955 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -11,16 +11,16 @@ incs += ' ../freestyle'
defs = []
-if env['WITH_BF_YAFRAY'] == 1:
+if env['WITH_BF_YAFRAY']:
incs += ' ../yafray'
else:
defs.append('DISABLE_YAFRAY')
-if env['WITH_BF_QUICKTIME'] == 1:
+if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME')
incs += ' ' + env['BF_QUICKTIME_INC']
-if env['WITH_BF_FFMPEG'] == 1:
+if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
if env['WITH_BF_OPENEXR']:
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index e8403053e0b..888474ffa18 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -157,6 +157,7 @@ typedef struct ShadeInput
int xs, ys; /* pixel to be rendered */
int mask; /* subsample mask */
+ float scanco[3]; /* original scanline coordinate without jitter */
int samplenr; /* sample counter, to detect if we should do shadow again */
int depth; /* 1 or larger on raytrace shading */
diff --git a/source/blender/render/intern/include/pixelshading.h b/source/blender/render/intern/include/pixelshading.h
index 15d696df89d..c6b11b4af9a 100644
--- a/source/blender/render/intern/include/pixelshading.h
+++ b/source/blender/render/intern/include/pixelshading.h
@@ -56,7 +56,7 @@ int shadeHaloFloat(HaloRen *har,
void shadeSkyPixel(float *collector, float fx, float fy);
void shadeSkyView(float *colf, float *rco, float *view, float *dxyview);
void shadeAtmPixel(struct SunSky *sunsky, float *collector, float fx, float fy, float distance);
-
+void shadeSunView(float *colf, float *view);
/* ------------------------------------------------------------------------- */
#endif
diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h
index 6f1cb8dd7a9..54311d2515a 100644
--- a/source/blender/render/intern/include/shading.h
+++ b/source/blender/render/intern/include/shading.h
@@ -56,7 +56,8 @@ void shade_material_loop(struct ShadeInput *shi, struct ShadeResult *shr);
void shade_input_set_triangle_i(struct ShadeInput *shi, struct ObjectInstanceRen *obi, struct VlakRen *vlr, short i1, short i2, short i3);
void shade_input_set_triangle(struct ShadeInput *shi, volatile int obi, volatile int facenr, int normal_flip);
void shade_input_copy_triangle(struct ShadeInput *shi, struct ShadeInput *from);
-void shade_input_set_viewco(struct ShadeInput *shi, float x, float y, float z);
+void shade_input_calc_viewco(struct ShadeInput *shi, float x, float y, float z, float *view, float *dxyview, float *co, float *dxco, float *dyco);
+void shade_input_set_viewco(struct ShadeInput *shi, float x, float y, float sx, float sy, float z);
void shade_input_set_uv(struct ShadeInput *shi);
void shade_input_set_normals(struct ShadeInput *shi);
void shade_input_flip_normals(struct ShadeInput *shi);
diff --git a/source/blender/render/intern/include/sss.h b/source/blender/render/intern/include/sss.h
index 660fb544227..9ffdcaf206a 100644
--- a/source/blender/render/intern/include/sss.h
+++ b/source/blender/render/intern/include/sss.h
@@ -59,7 +59,7 @@ void sss_add_points(Render *re, float (*co)[3], float (*color)[3], float *area,
void free_sss(struct Render *re);
int sample_sss(struct Render *re, struct Material *mat, float *co, float *col);
-int has_sss_tree(struct Render *re, struct Material *mat);
+int sss_pass_done(struct Render *re, struct Material *mat);
#endif /*SSS_H*/
diff --git a/source/blender/render/intern/include/sunsky.h b/source/blender/render/intern/include/sunsky.h
index c5e547097d2..f61338bcf27 100644
--- a/source/blender/render/intern/include/sunsky.h
+++ b/source/blender/render/intern/include/sunsky.h
@@ -33,7 +33,7 @@
typedef struct SunSky
{
- short effect_type, skyblendtype;
+ short effect_type, skyblendtype, sky_colorspace;
float turbidity;
float theta, phi;
@@ -54,6 +54,7 @@ typedef struct SunSky
float sun_size;
float backscattered_light;
float skyblendfac;
+ float sky_exposure;
float atm_HGg;
@@ -86,7 +87,7 @@ typedef struct SunSky
* */
void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_brightness,
float spread,float sun_brightness, float sun_size, float back_scatter,
- float skyblendfac, short skyblendtype);
+ float skyblendfac, short skyblendtype, float sky_exposure, float sky_colorspace);
/**
* GetSkyXYZRadiance:
diff --git a/source/blender/render/intern/include/zbuf.h b/source/blender/render/intern/include/zbuf.h
index 346ed653977..b6d0c656f63 100644
--- a/source/blender/render/intern/include/zbuf.h
+++ b/source/blender/render/intern/include/zbuf.h
@@ -53,7 +53,6 @@ void zbuffer_shadow(struct Render *re, float winmat[][4], struct LampRen *lar, i
void zbuffer_solid(struct RenderPart *pa, struct RenderLayer *rl, void (*fillfunc)(struct RenderPart*, struct ZSpan*, int, void*), void *data);
unsigned short *zbuffer_transp_shade(struct RenderPart *pa, struct RenderLayer *rl, float *pass, struct ListBase *psmlist);
-void convert_zbuf_to_distbuf(struct RenderPart *pa, struct RenderLayer *rl);
void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(void*, int, int, int, int, int));
int zbuffer_strands_abuf(struct Render *re, struct RenderPart *pa, struct RenderLayer *rl, struct APixstrand *apixbuf, struct ListBase *apsmbase, struct StrandShadeCache *cache);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 6dc5cd45e03..1a387ad7466 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -1703,10 +1703,10 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
/* get orco */
if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
tpa=tpsys->particles+pa->num;
- psys_particle_on_emitter(ob, psmd,tpart->from,tpa->num,pa->num_dmcache,tpa->fuv,tpa->foffset,co,nor,0,0,orco,0);
+ psys_particle_on_emitter(psmd,tpart->from,tpa->num,pa->num_dmcache,tpa->fuv,tpa->foffset,co,nor,0,0,orco,0);
}
else
- psys_particle_on_emitter(ob, psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,0);
+ psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,0);
num= pa->num_dmcache;
@@ -1780,13 +1780,13 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
/* get orco */
if(part->childtype == PART_CHILD_FACES) {
- psys_particle_on_emitter(ob, psmd,
+ psys_particle_on_emitter(psmd,
PART_FROM_FACE, cpa->num,DMCACHE_ISCHILD,
cpa->fuv,cpa->foffset,co,nor,0,0,orco,0);
}
else {
ParticleData *par = psys->particles + cpa->parent;
- psys_particle_on_emitter(ob, psmd, part->from,
+ psys_particle_on_emitter(psmd, part->from,
par->num,DMCACHE_ISCHILD,par->fuv,
par->foffset,co,nor,0,0,orco,0);
}
@@ -1868,7 +1868,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
dosimplify= psys_render_simplify_params(psys, cpa, simplify);
- if(path_nbr) {
+ if(path_nbr && psys->childcache) {
cache = psys->childcache[a-totpart];
max_k = (int)cache->steps;
}
@@ -2442,7 +2442,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
VertRen *v1, *v2, *v3, *v4, *ver;
VlakRen *vlr, *vlr1, *vlr2, *vlr3;
Curve *cu= ob->data;
- float *data, n1[3], flen;
+ float *data, n1[3];
int u, v, orcoret= 0;
int p1, p2, p3, p4, a;
int sizeu, nsizeu, sizev, nsizev;
@@ -2514,7 +2514,8 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
vlr->v1= v1; vlr->v2= v2; vlr->v3= v3; vlr->v4= v4;
- flen= CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, n1);
+ CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, n1);
+
VECCOPY(vlr->n, n1);
vlr->mat= matar[ dl->col];
@@ -2786,8 +2787,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
for(a=0; a<dl->parts; a++) {
frontside= (a >= dl->nr/2);
-
- DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+
+ if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+ break;
+
p1+= startvert;
p2+= startvert;
p3+= startvert;
@@ -3528,7 +3531,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
InitSunSky(lar->sunsky, la->atm_turbidity, vec, la->horizon_brightness,
la->spread, la->sun_brightness, la->sun_size, la->backscattered_light,
- la->skyblendfac, la->skyblendtype);
+ la->skyblendfac, la->skyblendtype, la->sky_exposure, la->sky_colorspace);
InitAtmosphere(lar->sunsky, la->sun_intensity, 1.0, 1.0, la->atm_inscattering_factor, la->atm_extinction_factor,
la->atm_distance_factor);
@@ -4789,6 +4792,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
Mat4Ortho(re->scene->camera->obmat);
Mat4Invert(mat, re->scene->camera->obmat);
RE_SetView(re, mat);
+ re->scene->camera->recalc= OB_RECALC_OB; /* force correct matrix for scaled cameras */
}
init_render_world(re); /* do first, because of ambient. also requires re->osa set correct */
@@ -5137,23 +5141,30 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
float hoco[4], ho[4], fsvec[4], camco[4];
float mat[4][4], winmat[4][4];
float imat[4][4];
- MVert *vverts;
-
+ FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(fsob, eModifierType_Fluidsim);
+ FluidsimSettings *fss = fluidmd->fss;
+ float *velarray = NULL;
+
/* only one step needed */
if(step) return 1;
+ if(fluidmd)
+ fss = fluidmd->fss;
+ else
+ return 0;
+
Mat4CpyMat4(mat, re->viewmat);
MTC_Mat4Invert(imat, mat);
/* set first vertex OK */
- if( (!fsob->fluidsimSettings) || (!fsob->fluidsimSettings->meshSurfNormals) ) return 0;
- vverts = fsob->fluidsimSettings->meshSurfNormals;
- //fprintf(stderr, "GZ_VEL obj '%s', calc load_fluidsimspeedvectors\n",fsob->id.name); // NT DEBUG
-
- if( obr->totvert != fsob->fluidsimSettings->meshSurface->totvert ) {
+ if(!fss->meshSurfNormals) return 0;
+
+ if( obr->totvert != GET_INT_FROM_POINTER(fss->meshSurface) ) {
//fprintf(stderr, "load_fluidsimspeedvectors - modified fluidsim mesh, not using speed vectors (%d,%d)...\n", obr->totvert, fsob->fluidsimSettings->meshSurface->totvert); // DEBUG
return 0;
}
+
+ velarray = (float *)fss->meshSurfNormals;
if(obi->flag & R_TRANSFORMED)
Mat4MulMat4(winmat, obi->mat, re->winmat);
@@ -5165,7 +5176,8 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
so that also small drops/little water volumes return a velocity != 0.
But I had no luck in fixing that function - DG */
for(a=0; a<obr->totvert; a++) {
- for(j=0;j<3;j++) avgvel[j] += vverts[a].co[j];
+ for(j=0;j<3;j++) avgvel[j] += velarray[3*a + j];
+
}
for(j=0;j<3;j++) avgvel[j] /= (float)(obr->totvert);
@@ -5179,7 +5191,7 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
// get fluid velocity
fsvec[3] = 0.;
//fsvec[0] = fsvec[1] = fsvec[2] = fsvec[3] = 0.; fsvec[2] = 2.; // NT fixed test
- for(j=0;j<3;j++) fsvec[j] = vverts[a].co[j];
+ for(j=0;j<3;j++) fsvec[j] = velarray[3*a + j];
/* (bad) HACK insert average velocity if none is there (see previous comment) */
if((fsvec[0] == 0.0) && (fsvec[1] == 0.0) && (fsvec[2] == 0.0))
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index aa4e40739da..d281ac9e5c8 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -640,7 +640,7 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe
/* texvec should be the already reflected normal */
EnvMap *env;
ImBuf *ibuf;
- float fac, vec[3], sco[3], dxts[3], dyts[3], w[3];
+ float fac, vec[3], sco[3], dxts[3], dyts[3];
int face, face1;
env= tex->env;
@@ -722,15 +722,9 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe
if(fac!=0.0) {
fac= 1.0/fac;
- /* weight contributions based on alpha */
- w[0]= texres->ta*fac;
- w[1]= texr1.ta*fac;
- w[2]= texr2.ta*fac;
-
- /* interpolate premultiplied result (imagewraposa returns key) */
- texres->tr= (w[0]*texres->ta*texres->tr + w[1]*texr1.ta*texr1.tr + w[2]*texr2.ta*texr2.tr);
- texres->tg= (w[0]*texres->ta*texres->tg + w[1]*texr1.ta*texr1.tg + w[2]*texr2.ta*texr2.tg);
- texres->tb= (w[0]*texres->ta*texres->tb + w[1]*texr1.ta*texr1.tb + w[2]*texr2.ta*texr2.tb);
+ texres->tr= fac*(texres->ta*texres->tr + texr1.ta*texr1.tr + texr2.ta*texr2.tr );
+ texres->tg= fac*(texres->ta*texres->tg + texr1.ta*texr1.tg + texr2.ta*texr2.tg );
+ texres->tb= fac*(texres->ta*texres->tb + texr1.ta*texr1.tb + texr2.ta*texr2.tb );
}
texres->ta= 1.0;
}
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index e9035f29b3c..40c0edb6e5f 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -257,7 +257,7 @@ void make_sample_tables(Render *re)
{
static int firsttime= 1;
SampleTables *st;
- float flweight[32], fmask[256];
+ float flweight[32];
float weight[32], totw, val, *fpx1, *fpx2, *fpy1, *fpy2, *m3, *m4;
int i, j, a;
@@ -300,11 +300,6 @@ void make_sample_tables(Render *re)
st->centLut[a]= -0.45+((float)a)/16.0;
}
- val= 1.0/((float)re->osa);
- for(a=0; a<256; a++) {
- fmask[a]= ((float)st->cmask[a])*val;
- }
-
/* calculate totw */
totw= 0.0;
for(j= -1; j<2; j++) {
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index 15c57eb9362..d2d2cf3fb77 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -402,7 +402,7 @@ static int occ_find_bbox_axis(OcclusionTree *tree, int begin, int end, float *mi
return axis;
}
-void occ_node_from_face(OccFace *face, OccNode *node)
+static void occ_node_from_face(OccFace *face, OccNode *node)
{
float n[3];
@@ -1143,7 +1143,7 @@ static float occ_quad_form_factor(float *p, float *n, float *q0, float *q1, floa
return result;
}
-float occ_form_factor(OccFace *face, float *p, float *n)
+static float occ_form_factor(OccFace *face, float *p, float *n)
{
ObjectInstanceRen *obi;
VlakRen *vlr;
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index f3f380f599b..ebaef19062e 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -2656,6 +2656,8 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
scene_update_for_newframe(scene, lay);
continue;
}
+ else
+ nfra+= tfra;
if (scene->r.mode & (R_NO_OVERWRITE | R_TOUCH) ) {
BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype);
@@ -2686,7 +2688,6 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
break;
}
- nfra+= tfra;
}
}
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index 9551a7b3227..60723963af9 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -570,33 +570,37 @@ void shadeSkyView(float *colf, float *rco, float *view, float *dxyview)
}
/* shade sky according to sun lamps, all parameters are like shadeSkyView except sunsky*/
-void shadeSunView(struct SunSky *sunsky, float *colf, float *rco, float *view, float *dxyview)
+void shadeSunView(float *colf, float *view)
{
- float colorxyz[3];
- float scale;
+ GroupObject *go;
+ LampRen *lar;
+ float sview[3];
+ int do_init= 1;
+
+ for(go=R.lights.first; go; go= go->next) {
+ lar= go->lampren;
+ if(lar->type==LA_SUN && lar->sunsky && (lar->sunsky->effect_type & LA_SUN_EFFECT_SKY)){
+ float sun_collector[3];
+ float colorxyz[3];
- /**
- sunAngle = sqrt(sunsky->sunSolidAngle / M_PI);
-
- sunDir[0] = sunsky->toSun[0];
- sunDir[1] = sunsky->toSun[1];
- sunDir[2] = sunsky->toSun[2];
- */
+ if(do_init) {
+
+ VECCOPY(sview, view);
+ Normalize(sview);
+ MTC_Mat3MulVecfl(R.imat, sview);
+ if (sview[2] < 0.0)
+ sview[2] = 0.0;
+ Normalize(sview);
+ do_init= 0;
+ }
- Normalize(view);
- MTC_Mat3MulVecfl(R.imat, view);
- if (view[2] < 0.0)
- view[2] = 0.0;
- Normalize(view);
- GetSkyXYZRadiancef(sunsky, view, colorxyz);
- scale = MAX3(colorxyz[0], colorxyz[1], colorxyz[2]);
- colorxyz[0] /= scale;
- colorxyz[1] /= scale;
- colorxyz[2] /= scale;
-
- xyz_to_rgb(colorxyz[0], colorxyz[1], colorxyz[2], &colf[0], &colf[1], &colf[2], BLI_CS_SMPTE);
-
- ClipColor(colf);
+ GetSkyXYZRadiancef(lar->sunsky, sview, colorxyz);
+ xyz_to_rgb(colorxyz[0], colorxyz[1], colorxyz[2], &sun_collector[0], &sun_collector[1], &sun_collector[2],
+ lar->sunsky->sky_colorspace);
+
+ ramp_blend(lar->sunsky->skyblendtype, colf, colf+1, colf+2, lar->sunsky->skyblendfac, sun_collector);
+ }
+ }
}
@@ -605,8 +609,6 @@ void shadeSunView(struct SunSky *sunsky, float *colf, float *rco, float *view, f
*/
void shadeSkyPixel(float *collector, float fx, float fy)
{
- GroupObject *go;
- LampRen *lar;
float view[3], dxyview[2];
/*
@@ -654,19 +656,9 @@ void shadeSkyPixel(float *collector, float fx, float fy)
shadeSkyView(collector, NULL, view, dxyview);
collector[3] = 0.0f;
}
-
- for(go=R.lights.first; go; go= go->next) {
- lar= go->lampren;
- if(lar->type==LA_SUN && lar->sunsky && (lar->sunsky->effect_type & LA_SUN_EFFECT_SKY)){
- float sun_collector[3];
-
- calc_view_vector(view, fx, fy);
- Normalize(view);
-
- shadeSunView(lar->sunsky, sun_collector, NULL, view, NULL);
- ramp_blend(lar->sunsky->skyblendtype, collector, collector+1, collector+2, lar->sunsky->skyblendfac, sun_collector);
- }
- }
+
+ calc_view_vector(view, fx, fy);
+ shadeSunView(collector, view);
}
/* aerial perspective */
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 0fd9365477c..f822d41bb85 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -397,6 +397,7 @@ static void ray_fadeout_endcolor(float *col, ShadeInput *origshi, ShadeInput *sh
Normalize(shi->view);
shadeSkyView(col, isec->start, shi->view, NULL);
+ shadeSunView(col, shi->view);
}
}
@@ -633,24 +634,27 @@ void init_jitter_plane(LampRen *lar)
/* at least 4, or max threads+1 tables */
if(BLENDER_MAX_THREADS < 4) x= 4;
else x= BLENDER_MAX_THREADS+1;
- fp= lar->jitter= MEM_mallocN(x*tot*2*sizeof(float), "lamp jitter tab");
+ fp= lar->jitter= MEM_callocN(x*tot*2*sizeof(float), "lamp jitter tab");
- /* set per-lamp fixed seed */
- BLI_srandom(tot);
-
- /* fill table with random locations, area_size large */
- for(x=0; x<tot; x++, fp+=2) {
- fp[0]= (BLI_frand()-0.5)*lar->area_size;
- fp[1]= (BLI_frand()-0.5)*lar->area_sizey;
- }
-
- while(iter--) {
- fp= lar->jitter;
- for(x=tot; x>0; x--, fp+=2) {
- DP_energy(lar->jitter, fp, tot, lar->area_size, lar->area_sizey);
+ /* if 1 sample, we leave table to be zero's */
+ if(tot>1) {
+
+ /* set per-lamp fixed seed */
+ BLI_srandom(tot);
+
+ /* fill table with random locations, area_size large */
+ for(x=0; x<tot; x++, fp+=2) {
+ fp[0]= (BLI_frand()-0.5)*lar->area_size;
+ fp[1]= (BLI_frand()-0.5)*lar->area_sizey;
}
- }
-
+
+ while(iter--) {
+ fp= lar->jitter;
+ for(x=tot; x>0; x--, fp+=2) {
+ DP_energy(lar->jitter, fp, tot, lar->area_size, lar->area_sizey);
+ }
+ }
+ }
/* create the dithered tables (could just check lamp type!) */
jitter_plane_offset(lar->jitter, lar->jitter+2*tot, tot, lar->area_size, lar->area_sizey, 0.5f, 0.0f);
jitter_plane_offset(lar->jitter, lar->jitter+4*tot, tot, lar->area_size, lar->area_sizey, 0.5f, 0.5f);
@@ -733,7 +737,7 @@ static void hammersley_create(double *out, int n)
}
}
-struct QMCSampler *QMC_initSampler(int type, int tot)
+static struct QMCSampler *QMC_initSampler(int type, int tot)
{
QMCSampler *qsa = MEM_callocN(sizeof(QMCSampler), "qmc sampler");
qsa->samp2d = MEM_callocN(2*sizeof(double)*tot, "qmc sample table");
@@ -882,7 +886,7 @@ void init_render_qmcsampler(Render *re)
re->qmcsamplers= MEM_callocN(sizeof(ListBase)*BLENDER_MAX_THREADS, "QMCListBase");
}
-QMCSampler *get_thread_qmcsampler(Render *re, int thread, int type, int tot)
+static QMCSampler *get_thread_qmcsampler(Render *re, int thread, int type, int tot)
{
QMCSampler *qsa;
@@ -903,7 +907,7 @@ QMCSampler *get_thread_qmcsampler(Render *re, int thread, int type, int tot)
return qsa;
}
-void release_thread_qmcsampler(Render *re, int thread, QMCSampler *qsa)
+static void release_thread_qmcsampler(Render *re, int thread, QMCSampler *qsa)
{
qsa->used= 0;
}
@@ -1173,7 +1177,6 @@ static void trace_reflect(float *col, ShadeInput *shi, ShadeResult *shr, float f
/* extern call from render loop */
void ray_trace(ShadeInput *shi, ShadeResult *shr)
{
- VlakRen *vlr;
float i, f, f1, fr, fg, fb;
float mircol[4], tracol[4];
float diff[3];
@@ -1181,7 +1184,7 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
do_tra= ((shi->mat->mode & (MA_RAYTRANSP)) && shr->alpha!=1.0f);
do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f);
- vlr= shi->vlr;
+
/* raytrace mirror amd refract like to separate the spec color */
if(shi->combinedflag & SCE_PASS_SPEC)
@@ -1524,7 +1527,7 @@ static float *sphere_sampler(int type, int resol, int thread, int xs, int ys)
}
}
-void ray_ao_qmc(ShadeInput *shi, float *shadfac)
+static void ray_ao_qmc(ShadeInput *shi, float *shadfac)
{
Isect isec;
QMCSampler *qsa=NULL;
@@ -1535,7 +1538,6 @@ void ray_ao_qmc(ShadeInput *shi, float *shadfac)
float fac=0.0f, prev=0.0f;
float adapt_thresh = G.scene->world->ao_adapt_thresh;
float adapt_speed_fac = G.scene->world->ao_adapt_speed_fac;
- float bias = G.scene->world->aobias;
int samples=0;
int max_samples = R.wrld.aosamp*R.wrld.aosamp;
@@ -1563,13 +1565,10 @@ void ray_ao_qmc(ShadeInput *shi, float *shadfac)
dxyview[2]= 0.0f;
}
- /* bias prevents smoothed faces to appear flat */
if(shi->vlr->flag & R_SMOOTH) {
- bias= G.scene->world->aobias;
VECCOPY(nrm, shi->vn);
}
else {
- bias= 0.0f;
VECCOPY(nrm, shi->facenor);
}
@@ -1629,6 +1628,7 @@ void ray_ao_qmc(ShadeInput *shi, float *shadfac)
}
else { /* WO_AOSKYTEX */
shadeSkyView(skycol, isec.start, view, dxyview);
+ shadeSunView(skycol, shi->view);
shadfac[0]+= skycol[0];
shadfac[1]+= skycol[1];
shadfac[2]+= skycol[2];
@@ -1664,7 +1664,7 @@ void ray_ao_qmc(ShadeInput *shi, float *shadfac)
}
/* extern call from shade_lamp_loop, ambient occlusion calculus */
-void ray_ao_spheresamp(ShadeInput *shi, float *shadfac)
+static void ray_ao_spheresamp(ShadeInput *shi, float *shadfac)
{
Isect isec;
float *vec, *nrm, div, bias, sh=0.0f;
@@ -1753,6 +1753,7 @@ void ray_ao_spheresamp(ShadeInput *shi, float *shadfac)
}
else { /* WO_AOSKYTEX */
shadeSkyView(skycol, isec.start, view, dxyview);
+ shadeSunView(skycol, shi->view);
shadfac[0]+= skycol[0];
shadfac[1]+= skycol[1];
shadfac[2]+= skycol[2];
@@ -1791,21 +1792,62 @@ void ray_ao(ShadeInput *shi, float *shadfac)
ray_ao_spheresamp(shi, shadfac);
}
+static void ray_shadow_jittered_coords(ShadeInput *shi, int max, float jitco[RE_MAX_OSA][3], int *totjitco)
+{
+ /* magic numbers for reordering sample positions to give better
+ * results with adaptive sample, when it usually only takes 4 samples */
+ int order8[8] = {0, 1, 5, 6, 2, 3, 4, 7};
+ int order11[11] = {1, 3, 8, 10, 0, 2, 4, 5, 6, 7, 9};
+ int order16[16] = {1, 3, 9, 12, 0, 6, 7, 8, 13, 2, 4, 5, 10, 11, 14, 15};
+ int count = count_mask(shi->mask);
+
+ /* for better antialising shadow samples are distributed over the subpixel
+ * sample coordinates, this only works for raytracing depth 0 though */
+ if(!shi->strand && shi->depth == 0 && count > 1 && count <= max) {
+ float xs, ys, zs, view[3];
+ int samp, ordsamp, tot= 0;
+
+ for(samp=0; samp<R.osa; samp++) {
+ if(R.osa == 8) ordsamp = order8[samp];
+ else if(R.osa == 11) ordsamp = order11[samp];
+ else if(R.osa == 16) ordsamp = order16[samp];
+ else ordsamp = samp;
+
+ if(shi->mask & (1<<ordsamp)) {
+ /* zbuffer has this inverse corrected, ensures xs,ys are inside pixel */
+ xs= (float)shi->scanco[0] + R.jit[ordsamp][0] + 0.5f;
+ ys= (float)shi->scanco[1] + R.jit[ordsamp][1] + 0.5f;
+ zs= shi->scanco[2];
+
+ shade_input_calc_viewco(shi, xs, ys, zs, view, NULL, jitco[tot], NULL, NULL);
+ tot++;
+ }
+ }
+
+ *totjitco= tot;
+ }
+ else {
+ VECCOPY(jitco[0], shi->co);
+ *totjitco= 1;
+ }
+}
static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *shadfac, Isect *isec)
{
QMCSampler *qsa=NULL;
- QMCSampler *qsa_jit=NULL;
int samples=0;
- float samp3d[3], jit[3], jitbias= 0.0f;
+ float samp3d[3];
float fac=0.0f, vec[3];
float colsq[4];
float adapt_thresh = lar->adapt_thresh;
- int max_samples = lar->ray_totsamp;
- float pos[3];
+ int min_adapt_samples=4, max_samples = lar->ray_totsamp;
+ float *co;
int do_soft=1, full_osa=0;
+ float jitco[RE_MAX_OSA][3];
+ int totjitco;
+
colsq[0] = colsq[1] = colsq[2] = 0.0;
if(isec->mode==RE_RAY_SHADOW_TRA) {
shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 0.0f;
@@ -1822,21 +1864,16 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
if (do_soft) max_samples = lar->ray_totsamp;
else max_samples = (R.osa > 4)?R.osa:5;
}
-
- if(shi->vlr && ((shi->vlr->flag & R_FULL_OSA) == 0))
- jitbias= 0.5f*(VecLength(shi->dxco) + VecLength(shi->dyco));
+
+ ray_shadow_jittered_coords(shi, max_samples, jitco, &totjitco);
/* sampling init */
- if (lar->ray_samp_method==LA_SAMP_HALTON) {
+ if (lar->ray_samp_method==LA_SAMP_HALTON)
qsa = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HALTON, max_samples);
- qsa_jit = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HALTON, max_samples);
- } else if (lar->ray_samp_method==LA_SAMP_HAMMERSLEY) {
+ else if (lar->ray_samp_method==LA_SAMP_HAMMERSLEY)
qsa = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HAMMERSLEY, max_samples);
- qsa_jit = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HAMMERSLEY, max_samples);
- }
QMC_initPixel(qsa, shi->thread);
- QMC_initPixel(qsa_jit, shi->thread);
VECCOPY(vec, lampco);
@@ -1844,18 +1881,11 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
while (samples < max_samples) {
isec->faceorig= (RayFace*)shi->vlr;
isec->oborig= RAY_OBJECT_SET(&R, shi->obi);
-
+
/* manually jitter the start shading co-ord per sample
* based on the pre-generated OSA texture sampling offsets,
* for anti-aliasing sharp shadow edges. */
- VECCOPY(pos, shi->co);
- if (shi->vlr && !full_osa) {
- QMC_sampleRect(jit, qsa_jit, shi->thread, samples, 1.0, 1.0);
-
- pos[0] += shi->dxco[0]*jit[0] + shi->dyco[0]*jit[1];
- pos[1] += shi->dxco[1]*jit[0] + shi->dyco[1]*jit[1];
- pos[2] += shi->dxco[2]*jit[0] + shi->dyco[2]*jit[1];
- }
+ co = jitco[samples % totjitco];
if (do_soft) {
/* sphere shadow source */
@@ -1863,9 +1893,9 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
float ru[3], rv[3], v[3], s[3];
/* calc tangent plane vectors */
- v[0] = pos[0] - lampco[0];
- v[1] = pos[1] - lampco[1];
- v[2] = pos[2] - lampco[2];
+ v[0] = co[0] - lampco[0];
+ v[1] = co[1] - lampco[1];
+ v[2] = co[2] - lampco[2];
Normalize(v);
VecOrthoBasisf(v, ru, rv);
@@ -1878,13 +1908,6 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
s[2] = samp3d[0]*ru[2] + samp3d[1]*rv[2];
VECCOPY(samp3d, s);
-
- if(jitbias != 0.0f) {
- /* bias away somewhat to avoid self intersection */
- pos[0] -= jitbias*v[0];
- pos[1] -= jitbias*v[1];
- pos[2] -= jitbias*v[2];
- }
}
else {
/* sampling, returns quasi-random vector in [sizex,sizey]^2 plane */
@@ -1900,20 +1923,20 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
VECCOPY(isec->end, vec);
}
- if(jitbias != 0.0f && !(do_soft && lar->type==LA_LOCAL)) {
+ if(shi->strand) {
/* bias away somewhat to avoid self intersection */
+ float jitbias= 0.5f*(VecLength(shi->dxco) + VecLength(shi->dyco));
float v[3];
- VECSUB(v, pos, isec->end);
+ VECSUB(v, co, isec->end);
Normalize(v);
- pos[0] -= jitbias*v[0];
- pos[1] -= jitbias*v[1];
- pos[2] -= jitbias*v[2];
+ co[0] -= jitbias*v[0];
+ co[1] -= jitbias*v[1];
+ co[2] -= jitbias*v[2];
}
- VECCOPY(isec->start, pos);
-
+ VECCOPY(isec->start, co);
/* trace the ray */
if(isec->mode==RE_RAY_SHADOW_TRA) {
@@ -1940,7 +1963,7 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
if ((lar->ray_samp_method == LA_SAMP_HALTON)) {
/* adaptive sampling - consider samples below threshold as in shadow (or vice versa) and exit early */
- if ((max_samples > 4) && (adapt_thresh > 0.0) && (samples > max_samples / 3)) {
+ if ((max_samples > min_adapt_samples) && (adapt_thresh > 0.0) && (samples > max_samples / 3)) {
if (isec->mode==RE_RAY_SHADOW_TRA) {
if ((shadfac[3] / samples > (1.0-adapt_thresh)) || (shadfac[3] / samples < adapt_thresh))
break;
@@ -1962,8 +1985,6 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
} else
shadfac[3]= 1.0f-fac/samples;
- if (qsa_jit)
- release_thread_qmcsampler(&R, shi->thread, qsa_jit);
if (qsa)
release_thread_qmcsampler(&R, shi->thread, qsa);
}
@@ -2120,7 +2141,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
}
/* only when face points away from lamp, in direction of lamp, trace ray and find first exit point */
-void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co)
+static void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co)
{
Isect isec;
float lampco[3], maxsize;
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 05ff0d3c020..1eb42bca569 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -1465,7 +1465,7 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRe
{
ShadeInput *shi= ssamp->shi;
ShadeResult shr;
- float texfac, orthoarea, nor[3], alpha;
+ float texfac, orthoarea, nor[3], alpha, sx, sy;
/* cache for shadow */
shi->samplenr= R.shadowsamplenr[shi->thread]++;
@@ -1476,8 +1476,8 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRe
shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
/* center pixel */
- x += 0.5f;
- y += 0.5f;
+ sx = x + 0.5f;
+ sy = y + 0.5f;
/* we estimate the area here using shi->dxco and shi->dyco. we need to
enabled shi->osatex these are filled. we compute two areas, one with
@@ -1486,13 +1486,13 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRe
shi->osatex= 1;
VECCOPY(nor, shi->facenor);
- calc_view_vector(shi->facenor, x, y);
+ calc_view_vector(shi->facenor, sx, sy);
Normalize(shi->facenor);
- shade_input_set_viewco(shi, x, y, z);
+ shade_input_set_viewco(shi, x, y, sx, sy, z);
orthoarea= VecLength(shi->dxco)*VecLength(shi->dyco);
VECCOPY(shi->facenor, nor);
- shade_input_set_viewco(shi, x, y, z);
+ shade_input_set_viewco(shi, x, y, sx, sy, z);
*area= VecLength(shi->dxco)*VecLength(shi->dyco);
*area= MIN2(*area, 2.0f*orthoarea);
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index 8904999432a..476330152ec 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -573,31 +573,25 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
}
}
-/* scanline pixel coordinates */
-/* requires set_triangle */
-void shade_input_set_viewco(ShadeInput *shi, float x, float y, float z)
+/* from scanline pixel coordinates to 3d coordinates, requires set_triangle */
+void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float *view, float *dxyview, float *co, float *dxco, float *dyco)
{
- float fac;
+ /* returns not normalized, so is in viewplane coords */
+ calc_view_vector(view, x, y);
- /* currently in use for dithering (soft shadow), node preview, irregular shad */
- shi->xs= (int)(x);
- shi->ys= (int)(y);
-
- calc_view_vector(shi->view, x, y); /* returns not normalized, so is in viewplane coords */
-
- /* wire cannot use normal for calculating shi->co */
if(shi->mat->mode & MA_WIRE) {
-
+ /* wire cannot use normal for calculating shi->co, so
+ * we reconstruct the coordinate less accurate */
if(R.r.mode & R_ORTHO)
- calc_renderco_ortho(shi->co, x, y, z);
+ calc_renderco_ortho(co, x, y, z);
else
- calc_renderco_zbuf(shi->co, shi->view, z);
+ calc_renderco_zbuf(co, view, z);
}
else {
- float dface, v1[3];
+ /* for non-wire, intersect with the triangle to get the exact coord */
+ float fac, dface, v1[3];
VECCOPY(v1, shi->v1->co);
-
if(shi->obi->flag & R_TRANSFORMED)
Mat4MulVecfl(shi->obi->mat, v1);
@@ -609,72 +603,98 @@ void shade_input_set_viewco(ShadeInput *shi, float x, float y, float z)
float fx= 2.0f/(R.winx*R.winmat[0][0]);
float fy= 2.0f/(R.winy*R.winmat[1][1]);
- shi->co[0]= (x - 0.5f*R.winx)*fx - R.winmat[3][0]/R.winmat[0][0];
- shi->co[1]= (y - 0.5f*R.winy)*fy - R.winmat[3][1]/R.winmat[1][1];
+ co[0]= (x - 0.5f*R.winx)*fx - R.winmat[3][0]/R.winmat[0][0];
+ co[1]= (y - 0.5f*R.winy)*fy - R.winmat[3][1]/R.winmat[1][1];
/* using a*x + b*y + c*z = d equation, (a b c) is normal */
if(shi->facenor[2]!=0.0f)
- shi->co[2]= (dface - shi->facenor[0]*shi->co[0] - shi->facenor[1]*shi->co[1])/shi->facenor[2];
+ co[2]= (dface - shi->facenor[0]*co[0] - shi->facenor[1]*co[1])/shi->facenor[2];
else
- shi->co[2]= 0.0f;
+ co[2]= 0.0f;
- if(shi->osatex || (R.r.mode & R_SHADOW) ) {
- shi->dxco[0]= fx;
- shi->dxco[1]= 0.0f;
+ if(dxco && dyco) {
+ dxco[0]= fx;
+ dxco[1]= 0.0f;
if(shi->facenor[2]!=0.0f)
- shi->dxco[2]= (shi->facenor[0]*fx)/shi->facenor[2];
+ dxco[2]= (shi->facenor[0]*fx)/shi->facenor[2];
else
- shi->dxco[2]= 0.0f;
+ dxco[2]= 0.0f;
- shi->dyco[0]= 0.0f;
- shi->dyco[1]= fy;
+ dyco[0]= 0.0f;
+ dyco[1]= fy;
if(shi->facenor[2]!=0.0f)
- shi->dyco[2]= (shi->facenor[1]*fy)/shi->facenor[2];
+ dyco[2]= (shi->facenor[1]*fy)/shi->facenor[2];
else
- shi->dyco[2]= 0.0f;
+ dyco[2]= 0.0f;
- if( (shi->mat->texco & TEXCO_REFL) ) {
- if(shi->co[2]!=0.0f) fac= 1.0f/shi->co[2]; else fac= 0.0f;
- shi->dxview= -R.viewdx*fac;
- shi->dyview= -R.viewdy*fac;
+ if(dxyview) {
+ if(co[2]!=0.0f) fac= 1.0f/co[2]; else fac= 0.0f;
+ dxyview[0]= -R.viewdx*fac;
+ dxyview[1]= -R.viewdy*fac;
}
}
}
else {
float div;
- div= shi->facenor[0]*shi->view[0] + shi->facenor[1]*shi->view[1] + shi->facenor[2]*shi->view[2];
+ div= shi->facenor[0]*view[0] + shi->facenor[1]*view[1] + shi->facenor[2]*view[2];
if (div!=0.0f) fac= dface/div;
else fac= 0.0f;
- shi->co[0]= fac*shi->view[0];
- shi->co[1]= fac*shi->view[1];
- shi->co[2]= fac*shi->view[2];
+ co[0]= fac*view[0];
+ co[1]= fac*view[1];
+ co[2]= fac*view[2];
/* pixel dx/dy for render coord */
- if(shi->osatex || (R.r.mode & R_SHADOW) ) {
+ if(dxco && dyco) {
float u= dface/(div - R.viewdx*shi->facenor[0]);
float v= dface/(div - R.viewdy*shi->facenor[1]);
- shi->dxco[0]= shi->co[0]- (shi->view[0]-R.viewdx)*u;
- shi->dxco[1]= shi->co[1]- (shi->view[1])*u;
- shi->dxco[2]= shi->co[2]- (shi->view[2])*u;
+ dxco[0]= co[0]- (view[0]-R.viewdx)*u;
+ dxco[1]= co[1]- (view[1])*u;
+ dxco[2]= co[2]- (view[2])*u;
- shi->dyco[0]= shi->co[0]- (shi->view[0])*v;
- shi->dyco[1]= shi->co[1]- (shi->view[1]-R.viewdy)*v;
- shi->dyco[2]= shi->co[2]- (shi->view[2])*v;
+ dyco[0]= co[0]- (view[0])*v;
+ dyco[1]= co[1]- (view[1]-R.viewdy)*v;
+ dyco[2]= co[2]- (view[2])*v;
- if( (shi->mat->texco & TEXCO_REFL) ) {
+ if(dxyview) {
if(fac!=0.0f) fac= 1.0f/fac;
- shi->dxview= -R.viewdx*fac;
- shi->dyview= -R.viewdy*fac;
+ dxyview[0]= -R.viewdx*fac;
+ dxyview[1]= -R.viewdy*fac;
}
}
}
}
/* cannot normalize earlier, code above needs it at viewplane level */
- Normalize(shi->view);
+ Normalize(view);
+}
+
+/* from scanline pixel coordinates to 3d coordinates, requires set_triangle */
+void shade_input_set_viewco(ShadeInput *shi, float x, float y, float xs, float ys, float z)
+{
+ float *dxyview= NULL, *dxco= NULL, *dyco= NULL;
+
+ /* currently in use for dithering (soft shadow), node preview, irregular shad */
+ shi->xs= (int)xs;
+ shi->ys= (int)ys;
+
+ /* original scanline coordinate without jitter */
+ shi->scanco[0]= x;
+ shi->scanco[1]= y;
+ shi->scanco[2]= z;
+
+ /* check if we need derivatives */
+ if(shi->osatex || (R.r.mode & R_SHADOW)) {
+ dxco= shi->dxco;
+ dyco= shi->dyco;
+
+ if((shi->mat->texco & TEXCO_REFL))
+ dxyview= &shi->dxview;
+ }
+
+ shade_input_calc_viewco(shi, xs, ys, z, shi->view, dxyview, shi->co, dxco, dyco);
}
/* calculate U and V, for scanline (silly render face u and v are in range -1 to 0) */
@@ -1301,7 +1321,8 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
for(samp=0; samp<R.osa; samp++) {
if(curmask & (1<<samp)) {
- xs= (float)x + R.jit[samp][0] + 0.5f; /* zbuffer has this inverse corrected, ensures xs,ys are inside pixel */
+ /* zbuffer has this inverse corrected, ensures xs,ys are inside pixel */
+ xs= (float)x + R.jit[samp][0] + 0.5f;
ys= (float)y + R.jit[samp][1] + 0.5f;
if(shi_cp)
@@ -1310,7 +1331,7 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
shi->mask= (1<<samp);
// shi->rl= ssamp->rlpp[samp];
shi->samplenr= R.shadowsamplenr[shi->thread]++; /* this counter is not being reset per pixel */
- shade_input_set_viewco(shi, xs, ys, (float)ps->z);
+ shade_input_set_viewco(shi, x, y, xs, ys, (float)ps->z);
shade_input_set_uv(shi);
shade_input_set_normals(shi);
@@ -1329,9 +1350,10 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
xs= (float)x + 0.5f;
ys= (float)y + 0.5f;
}
+
shi->mask= curmask;
shi->samplenr= R.shadowsamplenr[shi->thread]++;
- shade_input_set_viewco(shi, xs, ys, (float)ps->z);
+ shade_input_set_viewco(shi, x, y, xs, ys, (float)ps->z);
shade_input_set_uv(shi);
shade_input_set_normals(shi);
shi++;
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 91621c24365..4c627056c1d 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -1460,10 +1460,10 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
LampRen *lar;
GroupObject *go;
float inpr, lv[3];
- float *vn, *view, shadfac[4];
+ float *view, shadfac[4];
float ir, accum, visifac, lampdist;
- vn= shi->vn;
+
view= shi->view;
accum= ir= 0.0f;
@@ -1568,7 +1568,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shr->col[2]= shi->b*shi->alpha;
shr->col[3]= shi->alpha;
- if((ma->sss_flag & MA_DIFF_SSS) && !has_sss_tree(&R, ma)) {
+ if((ma->sss_flag & MA_DIFF_SSS) && !sss_pass_done(&R, ma)) {
if(ma->sss_texfac == 0.0f) {
shi->r= shi->g= shi->b= shi->alpha= 1.0f;
shr->col[0]= shr->col[1]= shr->col[2]= shr->col[3]= 1.0f;
@@ -1722,7 +1722,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shr->alpha= shi->alpha;
/* from now stuff everything in shr->combined: ambient, AO, radio, ramps, exposure */
- if(!(ma->sss_flag & MA_DIFF_SSS) || !has_sss_tree(&R, ma)) {
+ if(!(ma->sss_flag & MA_DIFF_SSS) || !sss_pass_done(&R, ma)) {
shr->combined[0]+= shi->ambr;
shr->combined[1]+= shi->ambg;
shr->combined[2]+= shi->ambb;
@@ -1772,7 +1772,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* modulate by the object color */
if((ma->shade_flag & MA_OBCOLOR) && shi->obr->ob) {
- if(!(ma->sss_flag & MA_DIFF_SSS) || !has_sss_tree(&R, ma)) {
+ if(!(ma->sss_flag & MA_DIFF_SSS) || !sss_pass_done(&R, ma)) {
float obcol[4];
QUATCOPY(obcol, shi->obr->ob->col);
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index e41c7c38069..9fb48a08503 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -1023,8 +1023,8 @@ int sample_sss(Render *re, Material *mat, float *co, float *color)
return 0;
}
-int has_sss_tree(struct Render *re, struct Material *mat)
+int sss_pass_done(struct Render *re, struct Material *mat)
{
- return (re->sss_hash && BLI_ghash_lookup(re->sss_hash, mat));
+ return ((re->flag & R_BAKING) || !(re->r.mode & R_SSS) || (re->sss_hash && BLI_ghash_lookup(re->sss_hash, mat)));
}
diff --git a/source/blender/render/intern/source/sunsky.c b/source/blender/render/intern/source/sunsky.c
index e1c7933cea1..2b490e71142 100644
--- a/source/blender/render/intern/source/sunsky.c
+++ b/source/blender/render/intern/source/sunsky.c
@@ -22,7 +22,7 @@
#include "sunsky.h"
#include "math.h"
#include "BLI_arithb.h"
-
+#include "BKE_global.h"
/**
* These macros are defined for vector operations
@@ -111,15 +111,14 @@ static void DirectionToThetaPhi(float *toSun, float *theta, float *phi)
float PerezFunction(struct SunSky *sunsky, const float *lam, float theta, float gamma, float lvz)
{
float den, num;
-
+
den = ((1 + lam[0] * exp(lam[1])) *
- (1 + lam[2] * exp(lam[3] * sunsky->theta) + lam[4] * cos(sunsky->theta) * cos(sunsky->theta)));
-
+ (1 + lam[2] * exp(lam[3] * sunsky->theta) + lam[4] * cos(sunsky->theta) * cos(sunsky->theta)));
+
num = ((1 + lam[0] * exp(lam[1] / cos(theta))) *
- (1 + lam[2] * exp(lam[3] * gamma) + lam[4] * cos(gamma) * cos(gamma)));
-
- return(lvz * num / den);
-}
+ (1 + lam[2] * exp(lam[3] * gamma) + lam[4] * cos(gamma) * cos(gamma)));
+
+ return(lvz * num / den);}
/**
* InitSunSky:
@@ -136,7 +135,7 @@ float PerezFunction(struct SunSky *sunsky, const float *lam, float theta, float
* */
void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_brightness,
float spread,float sun_brightness, float sun_size, float back_scatter,
- float skyblendfac, short skyblendtype)
+ float skyblendfac, short skyblendtype, float sky_exposure, float sky_colorspace)
{
float theta2;
@@ -154,6 +153,8 @@ void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_b
sunsky->backscattered_light = back_scatter;
sunsky->skyblendfac= skyblendfac;
sunsky->skyblendtype= skyblendtype;
+ sunsky->sky_exposure= -sky_exposure;
+ sunsky->sky_colorspace= sky_colorspace;
sunsky->toSun[0] = toSun[0];
sunsky->toSun[1] = toSun[1];
@@ -262,8 +263,11 @@ void GetSkyXYZRadiance(struct SunSky* sunsky, float theta, float phi, float colo
// Compute xyY values
x = PerezFunction(sunsky, sunsky->perez_x, theta, gamma, sunsky->zenith_x);
y = PerezFunction(sunsky, sunsky->perez_y, theta, gamma, sunsky->zenith_y);
- Y = nfade * hfade * PerezFunction(sunsky, sunsky->perez_Y, theta, gamma, sunsky->zenith_Y);
+ Y = 6.666666667e-5 * nfade * hfade * PerezFunction(sunsky, sunsky->perez_Y, theta, gamma, sunsky->zenith_Y);
+ if(sunsky->sky_exposure!=0.0f)
+ Y = 1.0 - exp(Y*sunsky->sky_exposure);
+
X = (x / y) * Y;
Z = ((1 - x - y) / y) * Y;
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c
index c14425e274f..7ce66ff6d12 100644
--- a/source/blender/render/intern/source/texture.c
+++ b/source/blender/render/intern/source/texture.c
@@ -1712,18 +1712,18 @@ void do_material_tex(ShadeInput *shi)
texres.nor[2]= texres.tb;
}
else {
- float co= 0.5*cos(texres.tin-0.5);
+ float co_nor= 0.5*cos(texres.tin-0.5);
float si= 0.5*sin(texres.tin-0.5);
float f1, f2;
f1= shi->vn[0];
f2= shi->vn[1];
- texres.nor[0]= f1*co+f2*si;
- texres.nor[1]= f2*co-f1*si;
+ texres.nor[0]= f1*co_nor+f2*si;
+ texres.nor[1]= f2*co_nor-f1*si;
f1= shi->vn[1];
f2= shi->vn[2];
- texres.nor[1]= f1*co+f2*si;
- texres.nor[2]= f2*co-f1*si;
+ texres.nor[1]= f1*co_nor+f2*si;
+ texres.nor[2]= f2*co_nor-f1*si;
}
}
// warping, local space
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 1726c061df1..509ac81c58b 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -3570,19 +3570,15 @@ void add_transp_speed(RenderLayer *rl, int offset, float *speed, float alpha, in
}
}
-static void add_transp_obindex(RenderLayer *rl, int offset, int obi)
+static void add_transp_obindex(RenderLayer *rl, int offset, Object *ob)
{
- ObjectRen *obr= R.objectinstance[obi].obr;
-
- if(obr->ob) {
- RenderPass *rpass;
-
- for(rpass= rl->passes.first; rpass; rpass= rpass->next) {
- if(rpass->passtype == SCE_PASS_INDEXOB) {
- float *fp= rpass->rect + offset;
- *fp= (float)obr->ob->index;
- break;
- }
+ RenderPass *rpass;
+
+ for(rpass= rl->passes.first; rpass; rpass= rpass->next) {
+ if(rpass->passtype == SCE_PASS_INDEXOB) {
+ float *fp= rpass->rect + offset;
+ *fp= (float)ob->index;
+ break;
}
}
}
@@ -3839,7 +3835,7 @@ static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int
}
shi->mask= (1<<samp);
shi->samplenr= R.shadowsamplenr[shi->thread]++;
- shade_input_set_viewco(shi, xs, ys, (float)z);
+ shade_input_set_viewco(shi, x, y, xs, ys, (float)z);
shade_input_set_uv(shi);
shade_input_set_normals(shi);
@@ -3859,7 +3855,7 @@ static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int
}
shi->mask= curmask;
shi->samplenr= R.shadowsamplenr[shi->thread]++;
- shade_input_set_viewco(shi, xs, ys, (float)z);
+ shade_input_set_viewco(shi, x, y, xs, ys, (float)z);
shade_input_set_uv(shi);
shade_input_set_normals(shi);
}
@@ -4009,10 +4005,11 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
ShadeResult samp_shr[16]; /* MAX_OSA */
ZTranspRow zrow[MAX_ZROW];
StrandShadeCache *sscache= NULL;
+ RenderLayer *rlpp[RE_MAX_OSA];
float sampalpha, alpha, *passrect= pass;
intptr_t *rdrect;
- int x, y, crop=0, a, b, totface, totsample, doztra;
- int addpassflag, offs= 0, od, addzbuf, osa = (R.osa? R.osa: 1);
+ int x, y, crop=0, a, b, totface, totfullsample, totsample, doztra;
+ int addpassflag, offs= 0, od, osa = (R.osa? R.osa: 1);
unsigned short *ztramask= NULL, filled;
/* looks nicer for calling code */
@@ -4034,7 +4031,6 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
/* general shader info, passes */
shade_sample_initialize(&ssamp, pa, rl);
addpassflag= rl->passflag & ~(SCE_PASS_COMBINED);
- addzbuf= rl->passflag & SCE_PASS_Z;
if(R.osa)
sampalpha= 1.0f/(float)R.osa;
@@ -4062,6 +4058,9 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
aprect= APixbuf;
aprectstrand= APixbufstrand;
rdrect= pa->rectdaps;
+
+ /* needed for correct zbuf/index pass */
+ totfullsample= get_sample_layers(pa, rl, rlpp);
/* irregular shadowb buffer creation */
if(R.r.mode & R_SHADOW)
@@ -4164,13 +4163,14 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
qsort(zrow, totface, sizeof(ZTranspRow), vergzvlak);
}
- /* zbuffer and index pass for transparent, no AA or filters */
- if(addzbuf)
- if(pa->rectz[od]>zrow[totface-1].z)
- pa->rectz[od]= zrow[totface-1].z;
-
- if(addpassflag & SCE_PASS_INDEXOB)
- add_transp_obindex(rl, od, zrow[totface-1].obi);
+ /* front face does index pass for transparent, no AA or filters, but yes FSA */
+ if(addpassflag & SCE_PASS_INDEXOB) {
+ ObjectRen *obr= R.objectinstance[zrow[totface-1].obi].obr;
+ if(obr->ob) {
+ for(a= 0; a<totfullsample; a++)
+ add_transp_obindex(rlpp[a], od, obr->ob);
+ }
+ }
/* for each mask-sample we alpha-under colors. then in end it's added using filter */
memset(samp_shr, 0, sizeof(ShadeResult)*osa);
@@ -4287,45 +4287,6 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
return ztramask;
}
-/* *************** */
-
-/* uses part zbuffer values to convert into distances from camera in renderlayer */
-void convert_zbuf_to_distbuf(RenderPart *pa, RenderLayer *rl)
-{
- RenderPass *rpass;
- float *rectzf, zco;
- int a, *rectz, ortho= R.r.mode & R_ORTHO;
-
- if(pa->rectz==NULL) return;
- for(rpass= rl->passes.first; rpass; rpass= rpass->next)
- if(rpass->passtype==SCE_PASS_Z)
- break;
-
- if(rpass==NULL) {
- printf("called convert zbuf wrong...\n");
- return;
- }
-
- rectzf= rpass->rect;
- rectz= pa->rectz;
-
- for(a=pa->rectx*pa->recty; a>0; a--, rectz++, rectzf++) {
- if(*rectz>=0x7FFFFFF0)
- *rectzf= 10e10;
- else {
- /* inverse of zbuf calc: zbuf = MAXZ*hoco_z/hoco_w */
- /* or: (R.winmat[3][2] - zco*R.winmat[3][3])/(R.winmat[2][2] - R.winmat[2][3]*zco); */
- /* if ortho [2][3] is zero, else [3][3] is zero */
-
- zco= ((float)*rectz)/2147483647.0f;
- if(ortho)
- *rectzf= (R.winmat[3][2] - zco*R.winmat[3][3])/(R.winmat[2][2]);
- else
- *rectzf= (R.winmat[3][2])/(R.winmat[2][2] - R.winmat[2][3]*zco);
- }
- }
-}
-
/* end of zbuf.c */
diff --git a/source/blender/src/CMakeLists.txt b/source/blender/src/CMakeLists.txt
index fc77ae69451..e8b43082e86 100644
--- a/source/blender/src/CMakeLists.txt
+++ b/source/blender/src/CMakeLists.txt
@@ -80,3 +80,6 @@ IF(WITH_VERSE)
ADD_DEPENDENCIES(src mkprot verse)
ENDIF(WITH_VERSE)
+IF(NOT WITH_ELBEEM)
+ ADD_DEFINITIONS(-DDISABLE_ELBEEM)
+ENDIF(NOT WITH_ELBEEM)
diff --git a/source/blender/src/SConscript b/source/blender/src/SConscript
index c9b5fdb9c4b..cecca5c5969 100644
--- a/source/blender/src/SConscript
+++ b/source/blender/src/SConscript
@@ -5,7 +5,7 @@ Import ('env')
sources = env.Glob('*.c')
-if env['BF_SPLIT_SRC'] == 1:
+if env['BF_SPLIT_SRC']:
numobj = len(sources)
maxobj = 30
@@ -36,35 +36,41 @@ incs += ' ' + env['BF_OPENGL_INC']
defs = []
-if env['BF_TWEAK_MODE'] == 1:
+if not env['WITH_BF_PYTHON']:
+ defs.append('DISABLE_PYTHON')
+
+if env['BF_TWEAK_MODE']:
defs.append('TWEAK_MODE')
-if env['WITH_BF_YAFRAY'] == 0:
+if not env['WITH_BF_YAFRAY']:
defs.append('DISABLE_YAFRAY')
-if env['WITH_BF_INTERNATIONAL'] == 1:
+if env['WITH_BF_INTERNATIONAL']:
incs += ' ../ftfont'
defs.append('INTERNATIONAL')
defs.append('FTGL_STATIC_LIBRARY')
-if env['WITH_BF_OPENEXR'] == 1:
+if env['WITH_BF_OPENEXR']:
defs.append('WITH_OPENEXR')
-if env['WITH_BF_DDS'] == 1:
+if env['WITH_BF_DDS']:
defs.append('WITH_DDS')
-if env['WITH_BF_QUICKTIME']==1:
+if env['WITH_BF_QUICKTIME']:
incs += ' ' + env['BF_QUICKTIME_INC']
defs.append('WITH_QUICKTIME')
-if env['WITH_BF_ICONV'] == 1:
+if env['WITH_BF_ICONV']:
incs += ' ' + env['BF_ICONV_INC']
defs.append('WITH_ICONV')
-if env['WITH_BF_FFMPEG'] == 1:
+if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
+if env['WITH_BF_OGG']:
+ defs.append('WITH_OGG')
+
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw'):
incs += ' ' + env['BF_PTHREADS_INC']
@@ -73,16 +79,16 @@ if env['WITH_BF_VERSE']:
incs += ' ' + env['BF_VERSE_INCLUDE']
# TODO buildinfo
-if env['BF_BUILDINFO'] == 1:
+if env['BF_BUILDINFO']:
defs.append('NAN_BUILDINFO')
-if env['BF_NO_ELBEEM'] == 1:
+if env['BF_NO_ELBEEM']:
defs.append('DISABLE_ELBEEM')
-if env['WITH_BF_SDL'] == 0:
+if not env['WITH_BF_SDL']:
defs.append('DISABLE_SDL')
-if (env['BF_SPLIT_SRC'] == 1) and (env['OURPLATFORM'] == 'win32-mingw'):
+if env['BF_SPLIT_SRC'] and (env['OURPLATFORM'] == 'win32-mingw'):
for i in range(numlibs):
env.BlenderLib ( libname = 'src%d' % (i), sources = subsources[i], includes = Split(incs), defines = defs, libtype=['core', 'intern'], priority = [5, 25] )
else:
diff --git a/source/blender/src/autoarmature.c b/source/blender/src/autoarmature.c
new file mode 100644
index 00000000000..b0a7a2ab5cc
--- /dev/null
+++ b/source/blender/src/autoarmature.c
@@ -0,0 +1,2968 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Martin Poirier
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * autoarmature.c: Interface for automagically manipulating armature (retarget, created, ...)
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "PIL_time.h"
+
+#include "DNA_ID.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+#include "BLI_ghash.h"
+#include "BLI_graph.h"
+#include "BLI_rand.h"
+#include "BLI_threads.h"
+
+#include "BDR_editobject.h"
+
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+#include "BKE_constraint.h"
+#include "BKE_armature.h"
+
+#include "BIF_editarmature.h"
+#include "BIF_space.h"
+
+#include "PIL_time.h"
+
+#include "mydevice.h"
+#include "reeb.h" // FIX ME
+#include "blendef.h"
+
+/************ RIG RETARGET DATA STRUCTURES ***************/
+
+struct RigJoint;
+struct RigGraph;
+struct RigNode;
+struct RigArc;
+struct RigEdge;
+
+//#define USE_THREADS
+
+typedef struct RigGraph {
+ ListBase arcs;
+ ListBase nodes;
+
+ float length;
+
+ FreeArc free_arc;
+ FreeNode free_node;
+ RadialSymmetry radial_symmetry;
+ AxialSymmetry axial_symmetry;
+ /*********************************/
+
+ struct RigNode *head;
+ ReebGraph *link_mesh;
+
+ ListBase editbones;
+
+ ListBase controls;
+ struct ThreadedWorker *worker;
+
+ GHash *bones_map; /* map of editbones by name */
+ GHash *controls_map; /* map of rigcontrols by bone pointer */
+
+ Object *ob;
+} RigGraph;
+
+typedef struct RigNode {
+ void *next, *prev;
+ float p[3];
+ int flag;
+
+ int degree;
+ struct BArc **arcs;
+
+ int subgraph_index;
+
+ int symmetry_level;
+ int symmetry_flag;
+ float symmetry_axis[3];
+ /*********************************/
+
+ ReebNode *link_mesh;
+} RigNode;
+
+typedef struct RigArc {
+ void *next, *prev;
+ RigNode *head, *tail;
+ int flag;
+
+ float length;
+
+ int symmetry_level;
+ int symmetry_group;
+ int symmetry_flag;
+ /*********************************/
+
+ ListBase edges;
+ int count;
+ ReebArc *link_mesh;
+} RigArc;
+
+typedef struct RigEdge {
+ struct RigEdge *next, *prev;
+ float head[3], tail[3];
+ float length;
+ float angle;
+ EditBone *bone;
+ float up_axis[3];
+} RigEdge;
+
+/* Control flags */
+#define RIG_CTRL_DONE 1
+#define RIG_CTRL_PARENT_DEFORM 2
+#define RIG_CTRL_FIT_ROOT 4
+#define RIG_CTRL_FIT_BONE 8
+
+typedef struct RigControl {
+ struct RigControl *next, *prev;
+ float head[3], tail[3];
+ EditBone *bone;
+ EditBone *link;
+ float up_axis[3];
+ float offset[3];
+ int flag;
+} RigControl;
+
+typedef struct MemoNode {
+ float weight;
+ int next;
+} MemoNode;
+
+typedef struct RetargetParam {
+ RigGraph *rigg;
+ RigArc *iarc;
+ RigNode *inode_start;
+} RetargetParam;
+
+typedef enum
+{
+ RETARGET_LENGTH,
+ RETARGET_AGGRESSIVE
+} RetargetMode;
+
+typedef enum
+{
+ METHOD_BRUTE_FORCE = 0,
+ METHOD_MEMOIZE = 1,
+ METHOD_ANNEALING = 2
+} RetargetMethod;
+
+typedef enum
+{
+ ARC_FREE = 0,
+ ARC_TAKEN = 1,
+ ARC_USED = 2
+} ArcUsageFlags;
+
+
+RigGraph *GLOBAL_RIGG = NULL;
+
+/*******************************************************************************************************/
+
+void *exec_retargetArctoArc(void *param);
+
+static void RIG_calculateEdgeAngle(RigEdge *edge_first, RigEdge *edge_second);
+
+/* two levels */
+#define SHAPE_LEVELS (SHAPE_RADIX * SHAPE_RADIX)
+
+/*********************************** EDITBONE UTILS ****************************************************/
+
+int countEditBoneChildren(ListBase *list, EditBone *parent)
+{
+ EditBone *ebone;
+ int count = 0;
+
+ for (ebone = list->first; ebone; ebone = ebone->next)
+ {
+ if (ebone->parent == parent)
+ {
+ count++;
+ }
+ }
+
+ return count;
+}
+
+EditBone* nextEditBoneChild(ListBase *list, EditBone *parent, int n)
+{
+ EditBone *ebone;
+
+ for (ebone = list->first; ebone; ebone = ebone->next)
+ {
+ if (ebone->parent == parent)
+ {
+ if (n == 0)
+ {
+ return ebone;
+ }
+ n--;
+ }
+ }
+
+ return NULL;
+}
+
+void getEditBoneRollUpAxis(EditBone *bone, float roll, float up_axis[3])
+{
+ float mat[3][3], nor[3];
+
+ VecSubf(nor, bone->tail, bone->head);
+
+ vec_roll_to_mat3(nor, roll, mat);
+ VECCOPY(up_axis, mat[2]);
+}
+
+float getNewBoneRoll(EditBone *bone, float old_up_axis[3], float quat[4])
+{
+ float mat[3][3];
+ float nor[3], up_axis[3], new_up_axis[3], vec[3];
+ float roll;
+
+ VECCOPY(new_up_axis, old_up_axis);
+ QuatMulVecf(quat, new_up_axis);
+
+ VecSubf(nor, bone->tail, bone->head);
+
+ vec_roll_to_mat3(nor, 0, mat);
+ VECCOPY(up_axis, mat[2]);
+
+ roll = NormalizedVecAngle2(new_up_axis, up_axis);
+
+ Crossf(vec, up_axis, new_up_axis);
+
+ if (Inpf(vec, nor) < 0)
+ {
+ roll = -roll;
+ }
+
+ return roll;
+}
+
+/************************************ DESTRUCTORS ******************************************************/
+
+void RIG_freeRigArc(BArc *arc)
+{
+ BLI_freelistN(&((RigArc*)arc)->edges);
+}
+
+void RIG_freeRigGraph(BGraph *rg)
+{
+ BNode *node;
+ BArc *arc;
+
+#ifdef USE_THREADS
+ BLI_destroy_worker(((RigGraph*)rg)->worker);
+#endif
+
+ REEB_freeGraph(((RigGraph*)rg)->link_mesh);
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ RIG_freeRigArc(arc);
+ }
+ BLI_freelistN(&rg->arcs);
+
+ for (node = rg->nodes.first; node; node = node->next)
+ {
+ BLI_freeNode(rg, (BNode*)node);
+ }
+ BLI_freelistN(&rg->nodes);
+
+ BLI_freelistN(&((RigGraph*)rg)->controls);
+
+ BLI_ghash_free(((RigGraph*)rg)->bones_map, NULL, NULL);
+ BLI_ghash_free(((RigGraph*)rg)->controls_map, NULL, NULL);
+
+ BLI_freelistN(&((RigGraph*)rg)->editbones);
+
+ MEM_freeN(rg);
+}
+
+/************************************* ALLOCATORS ******************************************************/
+
+static RigGraph *newRigGraph()
+{
+ RigGraph *rg;
+ int totthread;
+
+ rg = MEM_callocN(sizeof(RigGraph), "rig graph");
+
+ rg->head = NULL;
+
+ rg->bones_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
+ rg->controls_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
+
+ rg->free_arc = RIG_freeRigArc;
+ rg->free_node = NULL;
+
+#ifdef USE_THREADS
+ if(G.scene->r.mode & R_FIXED_THREADS)
+ {
+ totthread = G.scene->r.threads;
+ }
+ else
+ {
+ totthread = BLI_system_thread_count();
+ }
+
+ rg->worker = BLI_create_worker(exec_retargetArctoArc, totthread, 20); /* fix number of threads */
+#endif
+
+ return rg;
+}
+
+static RigArc *newRigArc(RigGraph *rg)
+{
+ RigArc *arc;
+
+ arc = MEM_callocN(sizeof(RigArc), "rig arc");
+ arc->count = 0;
+ BLI_addtail(&rg->arcs, arc);
+
+ return arc;
+}
+
+static RigControl *newRigControl(RigGraph *rg)
+{
+ RigControl *ctrl;
+
+ ctrl = MEM_callocN(sizeof(RigControl), "rig control");
+
+ BLI_addtail(&rg->controls, ctrl);
+
+ return ctrl;
+}
+
+static RigNode *newRigNodeHead(RigGraph *rg, RigArc *arc, float p[3])
+{
+ RigNode *node;
+ node = MEM_callocN(sizeof(RigNode), "rig node");
+ BLI_addtail(&rg->nodes, node);
+
+ VECCOPY(node->p, p);
+ node->degree = 1;
+ node->arcs = NULL;
+
+ arc->head = node;
+
+ return node;
+}
+
+static void addRigNodeHead(RigGraph *rg, RigArc *arc, RigNode *node)
+{
+ node->degree++;
+
+ arc->head = node;
+}
+
+static RigNode *newRigNode(RigGraph *rg, float p[3])
+{
+ RigNode *node;
+ node = MEM_callocN(sizeof(RigNode), "rig node");
+ BLI_addtail(&rg->nodes, node);
+
+ VECCOPY(node->p, p);
+ node->degree = 0;
+ node->arcs = NULL;
+
+ return node;
+}
+
+static RigNode *newRigNodeTail(RigGraph *rg, RigArc *arc, float p[3])
+{
+ RigNode *node = newRigNode(rg, p);
+
+ node->degree = 1;
+ arc->tail = node;
+
+ return node;
+}
+
+static void RIG_appendEdgeToArc(RigArc *arc, RigEdge *edge)
+{
+ BLI_addtail(&arc->edges, edge);
+
+ if (edge->prev == NULL)
+ {
+ VECCOPY(edge->head, arc->head->p);
+ }
+ else
+ {
+ RigEdge *last_edge = edge->prev;
+ VECCOPY(edge->head, last_edge->tail);
+ RIG_calculateEdgeAngle(last_edge, edge);
+ }
+
+ edge->length = VecLenf(edge->head, edge->tail);
+
+ arc->length += edge->length;
+
+ arc->count += 1;
+}
+
+static void RIG_addEdgeToArc(RigArc *arc, float tail[3], EditBone *bone)
+{
+ RigEdge *edge;
+
+ edge = MEM_callocN(sizeof(RigEdge), "rig edge");
+
+ VECCOPY(edge->tail, tail);
+ edge->bone = bone;
+
+ if (bone)
+ {
+ getEditBoneRollUpAxis(bone, bone->roll, edge->up_axis);
+ }
+
+ RIG_appendEdgeToArc(arc, edge);
+}
+
+/*******************************************************************************************************/
+
+static void RIG_calculateEdgeAngle(RigEdge *edge_first, RigEdge *edge_second)
+{
+ float vec_first[3], vec_second[3];
+
+ VecSubf(vec_first, edge_first->tail, edge_first->head);
+ VecSubf(vec_second, edge_second->tail, edge_second->head);
+
+ Normalize(vec_first);
+ Normalize(vec_second);
+
+ edge_first->angle = saacos(Inpf(vec_first, vec_second));
+}
+
+/************************************ CONTROL BONES ****************************************************/
+
+static void RIG_addControlBone(RigGraph *rg, EditBone *bone)
+{
+ RigControl *ctrl = newRigControl(rg);
+ ctrl->bone = bone;
+ VECCOPY(ctrl->head, bone->head);
+ VECCOPY(ctrl->tail, bone->tail);
+ getEditBoneRollUpAxis(bone, bone->roll, ctrl->up_axis);
+
+ BLI_ghash_insert(rg->controls_map, bone->name, ctrl);
+}
+
+static int RIG_parentControl(RigControl *ctrl, EditBone *link)
+{
+ if (link)
+ {
+ float offset[3];
+ int flag = 0;
+
+ VecSubf(offset, ctrl->bone->head, link->head);
+
+ /* if root matches, check for direction too */
+ if (Inpf(offset, offset) < 0.0001)
+ {
+ float vbone[3], vparent[3];
+
+ flag |= RIG_CTRL_FIT_ROOT;
+
+ VecSubf(vbone, ctrl->bone->tail, ctrl->bone->head);
+ VecSubf(vparent, link->tail, link->head);
+
+ /* test for opposite direction */
+ if (Inpf(vbone, vparent) > 0)
+ {
+ float nor[3];
+ float len;
+
+ Crossf(nor, vbone, vparent);
+
+ len = Inpf(nor, nor);
+ if (len < 0.0001)
+ {
+ flag |= RIG_CTRL_FIT_BONE;
+ }
+ }
+ }
+
+ /* Bail out if old one is automatically better */
+ if (flag < ctrl->flag)
+ {
+ return 0;
+ }
+
+ /* if there's already a link
+ * overwrite only if new link is higher in the chain */
+ if (ctrl->link && flag == ctrl->flag)
+ {
+ EditBone *bone = NULL;
+
+ for (bone = ctrl->link; bone; bone = bone->parent)
+ {
+ /* if link is in the chain, break and use that one */
+ if (bone == link)
+ {
+ break;
+ }
+ }
+
+ /* not in chain, don't update link */
+ if (bone == NULL)
+ {
+ return 0;
+ }
+ }
+
+
+ ctrl->link = link;
+ ctrl->flag = flag;
+
+ VECCOPY(ctrl->offset, offset);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+static void RIG_reconnectControlBones(RigGraph *rg)
+{
+ RigControl *ctrl;
+ int change = 1;
+
+ /* first pass, link to deform bones */
+ for (ctrl = rg->controls.first; ctrl; ctrl = ctrl->next)
+ {
+ bPoseChannel *pchan;
+ bConstraint *con;
+ int found = 0;
+
+ /* DO SOME MAGIC HERE */
+ for (pchan= rg->ob->pose->chanbase.first; pchan; pchan= pchan->next)
+ {
+ for (con= pchan->constraints.first; con; con= con->next)
+ {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ /* constraint targets */
+ if (cti && cti->get_constraint_targets)
+ {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next)
+ {
+ if ((ct->tar == rg->ob) && strcmp(ct->subtarget, ctrl->bone->name) == 0)
+ {
+ /* SET bone link to bone corresponding to pchan */
+ EditBone *link = BLI_ghash_lookup(rg->bones_map, pchan->name);
+
+ found = RIG_parentControl(ctrl, link);
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
+ }
+ }
+ }
+
+ /* if not found yet, check parent */
+ if (found == 0)
+ {
+ if (ctrl->bone->parent)
+ {
+ /* make sure parent is a deforming bone
+ * NULL if not
+ * */
+ EditBone *link = BLI_ghash_lookup(rg->bones_map, ctrl->bone->parent->name);
+
+ found = RIG_parentControl(ctrl, link);
+ }
+
+ /* check if bone is not superposed on another one */
+ {
+ RigArc *arc;
+ RigArc *best_arc = NULL;
+ EditBone *link = NULL;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ RigEdge *edge;
+ for (edge = arc->edges.first; edge; edge = edge->next)
+ {
+ if (edge->bone)
+ {
+ int fit = 0;
+
+ fit = VecLenf(ctrl->bone->head, edge->bone->head) < 0.0001;
+ fit = fit || VecLenf(ctrl->bone->tail, edge->bone->tail) < 0.0001;
+
+ if (fit)
+ {
+ /* pick the bone on the arc with the lowest symmetry level
+ * means you connect control to the trunk of the skeleton */
+ if (best_arc == NULL || arc->symmetry_level < best_arc->symmetry_level)
+ {
+ best_arc = arc;
+ link = edge->bone;
+ }
+ }
+ }
+ }
+ }
+
+ found = RIG_parentControl(ctrl, link);
+ }
+ }
+
+ /* if not found yet, check child */
+ if (found == 0)
+ {
+ RigArc *arc;
+ RigArc *best_arc = NULL;
+ EditBone *link = NULL;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ RigEdge *edge;
+ for (edge = arc->edges.first; edge; edge = edge->next)
+ {
+ if (edge->bone && edge->bone->parent == ctrl->bone)
+ {
+ /* pick the bone on the arc with the lowest symmetry level
+ * means you connect control to the trunk of the skeleton */
+ if (best_arc == NULL || arc->symmetry_level < best_arc->symmetry_level)
+ {
+ best_arc = arc;
+ link = edge->bone;
+ }
+ }
+ }
+ }
+
+ found = RIG_parentControl(ctrl, link);
+ }
+
+ }
+
+
+ /* second pass, make chains in control bones */
+ while (change)
+ {
+ change = 0;
+
+ printf("-------------------------\n");
+
+ for (ctrl = rg->controls.first; ctrl; ctrl = ctrl->next)
+ {
+ /* if control is not linked yet */
+ if (ctrl->link == NULL)
+ {
+ bPoseChannel *pchan;
+ bConstraint *con;
+ RigControl *ctrl_parent = NULL;
+ RigControl *ctrl_child;
+ int found = 0;
+
+ if (ctrl->bone->parent)
+ {
+ ctrl_parent = BLI_ghash_lookup(rg->controls_map, ctrl->bone->parent->name);
+ }
+
+ /* check constraints first */
+
+ /* DO SOME MAGIC HERE */
+ for (pchan= rg->ob->pose->chanbase.first; pchan; pchan= pchan->next)
+ {
+ for (con= pchan->constraints.first; con; con= con->next)
+ {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ /* constraint targets */
+ if (cti && cti->get_constraint_targets)
+ {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next)
+ {
+ if ((ct->tar == rg->ob) && strcmp(ct->subtarget, ctrl->bone->name) == 0)
+ {
+ /* SET bone link to ctrl corresponding to pchan */
+ RigControl *link = BLI_ghash_lookup(rg->controls_map, pchan->name);
+
+ /* if owner is a control bone, link with it */
+ if (link && link->link)
+ {
+ printf("%s -constraint- %s\n", ctrl->bone->name, link->bone->name);
+ RIG_parentControl(ctrl, link->bone);
+ found = 1;
+ break;
+ }
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
+ }
+ }
+ }
+
+ if (found == 0)
+ {
+ /* check if parent is already linked */
+ if (ctrl_parent && ctrl_parent->link)
+ {
+ printf("%s -parent- %s\n", ctrl->bone->name, ctrl_parent->bone->name);
+ RIG_parentControl(ctrl, ctrl_parent->bone);
+ change = 1;
+ }
+ else
+ {
+ /* check childs */
+ for (ctrl_child = rg->controls.first; ctrl_child; ctrl_child = ctrl_child->next)
+ {
+ /* if a child is linked, link to that one */
+ if (ctrl_child->link && ctrl_child->bone->parent == ctrl->bone)
+ {
+ printf("%s -child- %s\n", ctrl->bone->name, ctrl_child->bone->name);
+ RIG_parentControl(ctrl, ctrl_child->bone);
+ change = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+}
+
+/*******************************************************************************************************/
+
+static void RIG_joinArcs(RigGraph *rg, RigNode *node, RigArc *joined_arc1, RigArc *joined_arc2)
+{
+ RigEdge *edge, *next_edge;
+
+ /* ignore cases where joint is at start or end */
+ if (joined_arc1->head == joined_arc2->head || joined_arc1->tail == joined_arc2->tail)
+ {
+ return;
+ }
+
+ /* swap arcs to make sure arc1 is before arc2 */
+ if (joined_arc1->head == joined_arc2->tail)
+ {
+ RigArc *tmp = joined_arc1;
+ joined_arc1 = joined_arc2;
+ joined_arc2 = tmp;
+ }
+
+ for (edge = joined_arc2->edges.first; edge; edge = next_edge)
+ {
+ next_edge = edge->next;
+
+ RIG_appendEdgeToArc(joined_arc1, edge);
+ }
+
+ joined_arc1->tail = joined_arc2->tail;
+
+ joined_arc2->edges.first = joined_arc2->edges.last = NULL;
+
+ BLI_removeArc((BGraph*)rg, (BArc*)joined_arc2);
+
+ BLI_removeNode((BGraph*)rg, (BNode*)node);
+}
+
+static void RIG_removeNormalNodes(RigGraph *rg)
+{
+ RigNode *node, *next_node;
+
+ for (node = rg->nodes.first; node; node = next_node)
+ {
+ next_node = node->next;
+
+ if (node->degree == 2)
+ {
+ RigArc *arc, *joined_arc1 = NULL, *joined_arc2 = NULL;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->head == node || arc->tail == node)
+ {
+ if (joined_arc1 == NULL)
+ {
+ joined_arc1 = arc;
+ }
+ else
+ {
+ joined_arc2 = arc;
+ break;
+ }
+ }
+ }
+
+ RIG_joinArcs(rg, node, joined_arc1, joined_arc2);
+ }
+ }
+}
+
+static void RIG_removeUneededOffsets(RigGraph *rg)
+{
+ RigArc *arc;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ RigEdge *first_edge, *last_edge;
+
+ first_edge = arc->edges.first;
+ last_edge = arc->edges.last;
+
+ if (first_edge->bone == NULL)
+ {
+ if (first_edge->bone == NULL && VecLenf(first_edge->tail, arc->head->p) <= 0.001)
+ {
+ BLI_remlink(&arc->edges, first_edge);
+ MEM_freeN(first_edge);
+ }
+ else if (arc->head->degree == 1)
+ {
+ RigNode *new_node = (RigNode*)BLI_FindNodeByPosition((BGraph*)rg, first_edge->tail, 0.001);
+
+ if (new_node)
+ {
+ BLI_remlink(&arc->edges, first_edge);
+ MEM_freeN(first_edge);
+ BLI_replaceNodeInArc((BGraph*)rg, (BArc*)arc, (BNode*)new_node, (BNode*)arc->head);
+ }
+ else
+ {
+ RigEdge *next_edge = first_edge->next;
+
+ if (next_edge)
+ {
+ BLI_remlink(&arc->edges, first_edge);
+ MEM_freeN(first_edge);
+
+ VECCOPY(arc->head->p, next_edge->head);
+ }
+ }
+ }
+ else
+ {
+ /* check if all arc connected start with a null edge */
+ RigArc *other_arc;
+ for (other_arc = rg->arcs.first; other_arc; other_arc = other_arc->next)
+ {
+ if (other_arc != arc)
+ {
+ RigEdge *test_edge;
+ if (other_arc->head == arc->head)
+ {
+ test_edge = other_arc->edges.first;
+
+ if (test_edge->bone != NULL)
+ {
+ break;
+ }
+ }
+ else if (other_arc->tail == arc->head)
+ {
+ test_edge = other_arc->edges.last;
+
+ if (test_edge->bone != NULL)
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ if (other_arc == NULL)
+ {
+ RigNode *new_node = (RigNode*)BLI_FindNodeByPosition((BGraph*)rg, first_edge->tail, 0.001);
+
+ if (new_node)
+ {
+ /* remove null edge in other arcs too */
+ for (other_arc = rg->arcs.first; other_arc; other_arc = other_arc->next)
+ {
+ if (other_arc != arc)
+ {
+ RigEdge *test_edge;
+ if (other_arc->head == arc->head)
+ {
+ BLI_replaceNodeInArc((BGraph*)rg, (BArc*)other_arc, (BNode*)new_node, (BNode*)other_arc->head);
+ test_edge = other_arc->edges.first;
+ BLI_remlink(&other_arc->edges, test_edge);
+ MEM_freeN(test_edge);
+ }
+ else if (other_arc->tail == arc->head)
+ {
+ BLI_replaceNodeInArc((BGraph*)rg, (BArc*)other_arc, (BNode*)new_node, (BNode*)other_arc->tail);
+ test_edge = other_arc->edges.last;
+ BLI_remlink(&other_arc->edges, test_edge);
+ MEM_freeN(test_edge);
+ }
+ }
+ }
+
+ BLI_remlink(&arc->edges, first_edge);
+ MEM_freeN(first_edge);
+ BLI_replaceNodeInArc((BGraph*)rg, (BArc*)arc, (BNode*)new_node, (BNode*)arc->head);
+ }
+ else
+ {
+ RigEdge *next_edge = first_edge->next;
+
+ if (next_edge)
+ {
+ BLI_remlink(&arc->edges, first_edge);
+ MEM_freeN(first_edge);
+
+ VECCOPY(arc->head->p, next_edge->head);
+
+ /* remove null edge in other arcs too */
+ for (other_arc = rg->arcs.first; other_arc; other_arc = other_arc->next)
+ {
+ if (other_arc != arc)
+ {
+ RigEdge *test_edge;
+ if (other_arc->head == arc->head)
+ {
+ test_edge = other_arc->edges.first;
+ BLI_remlink(&other_arc->edges, test_edge);
+ MEM_freeN(test_edge);
+ }
+ else if (other_arc->tail == arc->head)
+ {
+ test_edge = other_arc->edges.last;
+ BLI_remlink(&other_arc->edges, test_edge);
+ MEM_freeN(test_edge);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (last_edge->bone == NULL)
+ {
+ if (VecLenf(last_edge->head, arc->tail->p) <= 0.001)
+ {
+ BLI_remlink(&arc->edges, last_edge);
+ MEM_freeN(last_edge);
+ }
+ else if (arc->tail->degree == 1)
+ {
+ RigNode *new_node = (RigNode*)BLI_FindNodeByPosition((BGraph*)rg, last_edge->head, 0.001);
+
+ if (new_node)
+ {
+ RigEdge *previous_edge = last_edge->prev;
+
+ BLI_remlink(&arc->edges, last_edge);
+ MEM_freeN(last_edge);
+ BLI_replaceNodeInArc((BGraph*)rg, (BArc*)arc, (BNode*)new_node, (BNode*)arc->tail);
+
+ /* set previous angle to 0, since there's no following edges */
+ if (previous_edge)
+ {
+ previous_edge->angle = 0;
+ }
+ }
+ else
+ {
+ RigEdge *previous_edge = last_edge->prev;
+
+ if (previous_edge)
+ {
+ BLI_remlink(&arc->edges, last_edge);
+ MEM_freeN(last_edge);
+
+ VECCOPY(arc->tail->p, previous_edge->tail);
+ previous_edge->angle = 0;
+ }
+ }
+ }
+ }
+ }
+}
+
+static void RIG_arcFromBoneChain(RigGraph *rg, ListBase *list, EditBone *root_bone, RigNode *starting_node)
+{
+ EditBone *bone, *last_bone = root_bone;
+ RigArc *arc = NULL;
+ int contain_head = 0;
+
+ for(bone = root_bone; bone; bone = nextEditBoneChild(list, bone, 0))
+ {
+ int nb_children;
+
+ if ((bone->flag & BONE_NO_DEFORM) == 0)
+ {
+ BLI_ghash_insert(rg->bones_map, bone->name, bone);
+
+ if (arc == NULL)
+ {
+ arc = newRigArc(rg);
+
+ if (starting_node == NULL)
+ {
+ starting_node = newRigNodeHead(rg, arc, root_bone->head);
+ }
+ else
+ {
+ addRigNodeHead(rg, arc, starting_node);
+ }
+ }
+
+ if (bone->parent && (bone->flag & BONE_CONNECTED) == 0)
+ {
+ RIG_addEdgeToArc(arc, bone->head, NULL);
+ }
+
+ RIG_addEdgeToArc(arc, bone->tail, bone);
+
+ last_bone = bone;
+
+ if (strcmp(bone->name, "head") == 0)
+ {
+ contain_head = 1;
+ }
+ }
+ else if ((bone->flag & BONE_EDITMODE_LOCKED) == 0) /* ignore locked bones */
+ {
+ RIG_addControlBone(rg, bone);
+ }
+
+ nb_children = countEditBoneChildren(list, bone);
+ if (nb_children > 1)
+ {
+ RigNode *end_node = NULL;
+ int i;
+
+ if (arc != NULL)
+ {
+ end_node = newRigNodeTail(rg, arc, bone->tail);
+ }
+ else
+ {
+ end_node = newRigNode(rg, bone->tail);
+ }
+
+ for (i = 0; i < nb_children; i++)
+ {
+ root_bone = nextEditBoneChild(list, bone, i);
+ RIG_arcFromBoneChain(rg, list, root_bone, end_node);
+ }
+
+ /* arc ends here, break */
+ break;
+ }
+ }
+
+ /* If the loop exited without forking */
+ if (arc != NULL && bone == NULL)
+ {
+ newRigNodeTail(rg, arc, last_bone->tail);
+ }
+
+ if (contain_head)
+ {
+ rg->head = arc->tail;
+ }
+}
+
+/*******************************************************************************************************/
+static void RIG_findHead(RigGraph *rg)
+{
+ if (rg->head == NULL)
+ {
+ if (BLI_countlist(&rg->arcs) == 1)
+ {
+ RigArc *arc = rg->arcs.first;
+
+ rg->head = (RigNode*)arc->head;
+ }
+ else
+ {
+ RigArc *arc;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ RigEdge *edge = arc->edges.last;
+
+ if (edge->bone->flag & (BONE_TIPSEL|BONE_SELECTED))
+ {
+ rg->head = arc->tail;
+ break;
+ }
+ }
+ }
+
+ if (rg->head == NULL)
+ {
+ rg->head = rg->nodes.first;
+ }
+ }
+}
+
+/*******************************************************************************************************/
+
+void RIG_printNode(RigNode *node, char name[])
+{
+ printf("%s %p %i <%0.3f, %0.3f, %0.3f>\n", name, node, node->degree, node->p[0], node->p[1], node->p[2]);
+
+ if (node->symmetry_flag & SYM_TOPOLOGICAL)
+ {
+ if (node->symmetry_flag & SYM_AXIAL)
+ printf("Symmetry AXIAL\n");
+ else if (node->symmetry_flag & SYM_RADIAL)
+ printf("Symmetry RADIAL\n");
+
+ printvecf("symmetry axis", node->symmetry_axis);
+ }
+}
+
+void RIG_printArcBones(RigArc *arc)
+{
+ RigEdge *edge;
+
+ for (edge = arc->edges.first; edge; edge = edge->next)
+ {
+ if (edge->bone)
+ printf("%s ", edge->bone->name);
+ else
+ printf("---- ");
+ }
+ printf("\n");
+}
+
+void RIG_printCtrl(RigControl *ctrl, char *indent)
+{
+ char text[128];
+
+ printf("%sBone: %s\n", indent, ctrl->bone->name);
+ printf("%sLink: %s\n", indent, ctrl->link ? ctrl->link->name : "!NONE!");
+
+ sprintf(text, "%soffset", indent);
+ printvecf(text, ctrl->offset);
+
+ printf("%sFlag: %i\n", indent, ctrl->flag);
+}
+
+void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs)
+{
+ RigControl *ctrl;
+ char indent[64];
+ char *s = indent;
+ int i;
+
+ for (i = 0; i < tabs; i++)
+ {
+ s[0] = '\t';
+ s++;
+ }
+ s[0] = 0;
+
+ for (ctrl = rg->controls.first; ctrl; ctrl = ctrl->next)
+ {
+ if (ctrl->link == bone)
+ {
+ RIG_printCtrl(ctrl, indent);
+ RIG_printLinkedCtrl(rg, ctrl->bone, tabs + 1);
+ }
+ }
+}
+
+void RIG_printArc(RigGraph *rg, RigArc *arc)
+{
+ RigEdge *edge;
+
+ RIG_printNode((RigNode*)arc->head, "head");
+
+ for (edge = arc->edges.first; edge; edge = edge->next)
+ {
+ printf("\tinner joints %0.3f %0.3f %0.3f\n", edge->tail[0], edge->tail[1], edge->tail[2]);
+ printf("\t\tlength %f\n", edge->length);
+ printf("\t\tangle %f\n", edge->angle * 180 / M_PI);
+ if (edge->bone)
+ {
+ printf("\t\t%s\n", edge->bone->name);
+ RIG_printLinkedCtrl(rg, edge->bone, 3);
+ }
+ }
+ printf("symmetry level: %i flag: %i group %i\n", arc->symmetry_level, arc->symmetry_flag, arc->symmetry_group);
+
+ RIG_printNode((RigNode*)arc->tail, "tail");
+}
+
+void RIG_printGraph(RigGraph *rg)
+{
+ RigArc *arc;
+
+ printf("---- ARCS ----\n");
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ RIG_printArc(rg, arc);
+ printf("\n");
+ }
+
+ if (rg->head)
+ {
+ RIG_printNode(rg->head, "HEAD NODE:");
+ }
+ else
+ {
+ printf("HEAD NODE: NONE\n");
+ }
+}
+
+/*******************************************************************************************************/
+
+static RigGraph *armatureToGraph(Object *ob, bArmature *arm)
+{
+ EditBone *ebone;
+ RigGraph *rg;
+
+ rg = newRigGraph();
+
+ make_boneList(&rg->editbones, &arm->bonebase, NULL);
+ rg->ob = ob;
+
+ /* Do the rotations */
+ for (ebone = rg->editbones.first; ebone; ebone=ebone->next){
+ if (ebone->parent == NULL)
+ {
+ RIG_arcFromBoneChain(rg, &rg->editbones, ebone, NULL);
+ }
+ }
+
+ BLI_removeDoubleNodes((BGraph*)rg, 0.001);
+
+ RIG_removeNormalNodes(rg);
+
+ RIG_removeUneededOffsets(rg);
+
+ BLI_buildAdjacencyList((BGraph*)rg);
+
+ RIG_findHead(rg);
+
+ BLI_markdownSymmetry((BGraph*)rg, (BNode*)rg->head, G.scene->toolsettings->skgen_symmetry_limit);
+
+ RIG_reconnectControlBones(rg); /* after symmetry, because we use levels to find best match */
+
+ if (BLI_isGraphCyclic((BGraph*)rg))
+ {
+ printf("armature cyclic\n");
+ }
+
+ return rg;
+}
+
+/************************************ GENERATING *****************************************************/
+
+static EditBone *add_editbonetolist(char *name, ListBase *list)
+{
+ EditBone *bone= MEM_callocN(sizeof(EditBone), "eBone");
+
+ BLI_strncpy(bone->name, name, 32);
+ unique_editbone_name(list, bone->name);
+
+ BLI_addtail(list, bone);
+
+ bone->flag |= BONE_TIPSEL;
+ bone->weight= 1.0F;
+ bone->dist= 0.25F;
+ bone->xwidth= 0.1;
+ bone->zwidth= 0.1;
+ bone->ease1= 1.0;
+ bone->ease2= 1.0;
+ bone->rad_head= 0.10;
+ bone->rad_tail= 0.05;
+ bone->segments= 1;
+ bone->layer= 1;//arm->layer;
+
+ return bone;
+}
+
+EditBone * generateBonesForArc(RigGraph *rigg, ReebArc *arc, ReebNode *head, ReebNode *tail)
+{
+ ReebArcIterator iter;
+ float n[3];
+ float ADAPTIVE_THRESHOLD = G.scene->toolsettings->skgen_correlation_limit;
+ EditBone *lastBone = NULL;
+
+ /* init iterator to get start and end from head */
+ initArcIterator(&iter, arc, head);
+
+ /* Calculate overall */
+ VecSubf(n, arc->buckets[iter.end].p, head->p);
+
+ if (1 /* G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION */ )
+ {
+ EmbedBucket *bucket = NULL;
+ EmbedBucket *previous = NULL;
+ EditBone *child = NULL;
+ EditBone *parent = NULL;
+ float normal[3] = {0, 0, 0};
+ float avg_normal[3];
+ int total = 0;
+ int boneStart = iter.start;
+
+ parent = add_editbonetolist("Bone", &rigg->editbones);
+ parent->flag = BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+ VECCOPY(parent->head, head->p);
+
+ for (previous = nextBucket(&iter), bucket = nextBucket(&iter);
+ bucket;
+ previous = bucket, bucket = nextBucket(&iter))
+ {
+ float btail[3];
+ float value = 0;
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_STICK_TO_EMBEDDING)
+ {
+ VECCOPY(btail, bucket->p);
+ }
+ else
+ {
+ float length;
+
+ /* Calculate normal */
+ VecSubf(n, bucket->p, parent->head);
+ length = Normalize(n);
+
+ total += 1;
+ VecAddf(normal, normal, n);
+ VECCOPY(avg_normal, normal);
+ VecMulf(avg_normal, 1.0f / total);
+
+ VECCOPY(btail, avg_normal);
+ VecMulf(btail, length);
+ VecAddf(btail, btail, parent->head);
+ }
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_ADAPTIVE_DISTANCE)
+ {
+ value = calcDistance(arc, boneStart, iter.index, parent->head, btail);
+ }
+ else
+ {
+ float n[3];
+
+ VecSubf(n, btail, parent->head);
+ value = calcVariance(arc, boneStart, iter.index, parent->head, n);
+ }
+
+ if (value > ADAPTIVE_THRESHOLD)
+ {
+ VECCOPY(parent->tail, btail);
+
+ child = add_editbonetolist("Bone", &rigg->editbones);
+ VECCOPY(child->head, parent->tail);
+ child->parent = parent;
+ child->flag |= BONE_CONNECTED|BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+
+ parent = child; // new child is next parent
+ boneStart = iter.index; // start from end
+
+ normal[0] = normal[1] = normal[2] = 0;
+ total = 0;
+ }
+ }
+
+ VECCOPY(parent->tail, tail->p);
+
+ lastBone = parent; /* set last bone in the chain */
+ }
+
+ return lastBone;
+}
+
+void generateMissingArcsFromNode(RigGraph *rigg, ReebNode *node, int multi_level_limit)
+{
+ while (node->multi_level > multi_level_limit && node->link_up)
+ {
+ node = node->link_up;
+ }
+
+ while (node->multi_level < multi_level_limit && node->link_down)
+ {
+ node = node->link_down;
+ }
+
+ if (node->multi_level == multi_level_limit)
+ {
+ int i;
+
+ for (i = 0; i < node->degree; i++)
+ {
+ ReebArc *earc = node->arcs[i];
+
+ if (earc->flag == ARC_FREE && earc->head == node)
+ {
+ ReebNode *other = BIF_otherNodeFromIndex(earc, node);
+
+ earc->flag = ARC_USED;
+
+ generateBonesForArc(rigg, earc, node, other);
+ generateMissingArcsFromNode(rigg, other, multi_level_limit);
+ }
+ }
+ }
+}
+
+void generateMissingArcs(RigGraph *rigg)
+{
+ ReebGraph *reebg = rigg->link_mesh;
+ int multi_level_limit = 5;
+
+ for (reebg = rigg->link_mesh; reebg; reebg = reebg->link_up)
+ {
+ ReebArc *earc;
+
+ for (earc = reebg->arcs.first; earc; earc = earc->next)
+ {
+ if (earc->flag == ARC_USED)
+ {
+ generateMissingArcsFromNode(rigg, earc->head, multi_level_limit);
+ generateMissingArcsFromNode(rigg, earc->tail, multi_level_limit);
+ }
+ }
+ }
+}
+
+/************************************ RETARGETTING *****************************************************/
+
+static void repositionControl(RigGraph *rigg, RigControl *ctrl, float head[3], float tail[3], float qrot[4], float resize)
+{
+ RigControl *ctrl_child;
+ float parent_offset[3], tail_offset[3];
+
+ VecSubf(tail_offset, ctrl->tail, ctrl->head);
+ VecMulf(tail_offset, resize);
+
+ VECCOPY(parent_offset, ctrl->offset);
+ VecMulf(parent_offset, resize);
+
+ QuatMulVecf(qrot, parent_offset);
+ QuatMulVecf(qrot, tail_offset);
+
+ VecAddf(ctrl->bone->head, head, parent_offset);
+ VecAddf(ctrl->bone->tail, ctrl->bone->head, tail_offset);
+ ctrl->bone->roll = getNewBoneRoll(ctrl->bone, ctrl->up_axis, qrot);
+
+ ctrl->flag |= RIG_CTRL_DONE;
+
+ /* Cascade to connected control bones */
+ for (ctrl_child = rigg->controls.first; ctrl_child; ctrl_child = ctrl_child->next)
+ {
+ if (ctrl_child->link == ctrl->bone)
+ {
+ repositionControl(rigg, ctrl_child, ctrl->bone->head, ctrl->bone->tail, qrot, resize);
+ }
+ }
+
+}
+
+static void repositionBone(RigGraph *rigg, RigEdge *edge, float vec0[3], float vec1[3])
+{
+ EditBone *bone;
+ RigControl *ctrl;
+ float qrot[4], resize;
+ float v1[3], v2[3];
+ float l1, l2;
+
+ bone = edge->bone;
+
+ VecSubf(v1, edge->tail, edge->head);
+ VecSubf(v2, vec1, vec0);
+
+ l1 = Normalize(v1);
+ l2 = Normalize(v2);
+
+ resize = l2 / l1;
+
+ RotationBetweenVectorsToQuat(qrot, v1, v2);
+
+ for (ctrl = rigg->controls.first; ctrl; ctrl = ctrl->next)
+ {
+ if (ctrl->link == bone)
+ {
+ repositionControl(rigg, ctrl, vec0, vec1, qrot, resize);
+ }
+ }
+
+ VECCOPY(bone->head, vec0);
+ VECCOPY(bone->tail, vec1);
+ bone->roll = getNewBoneRoll(bone, edge->up_axis, qrot);
+}
+
+static RetargetMode detectArcRetargetMode(RigArc *arc);
+static void retargetArctoArcLength(RigGraph *rigg, RigArc *iarc, RigNode *inode_start);
+
+
+static RetargetMode detectArcRetargetMode(RigArc *iarc)
+{
+ RetargetMode mode = RETARGET_AGGRESSIVE;
+ ReebArc *earc = iarc->link_mesh;
+ RigEdge *edge;
+ int large_angle = 0;
+ float avg_angle = 0;
+ float avg_length = 0;
+ int nb_edges = 0;
+
+
+ for (edge = iarc->edges.first; edge; edge = edge->next)
+ {
+ avg_angle += edge->angle;
+ nb_edges++;
+ }
+
+ avg_angle /= nb_edges - 1; /* -1 because last edge doesn't have an angle */
+
+ avg_length = iarc->length / nb_edges;
+
+
+ if (nb_edges > 2)
+ {
+ for (edge = iarc->edges.first; edge; edge = edge->next)
+ {
+ if (fabs(edge->angle - avg_angle) > M_PI / 6)
+ {
+ large_angle = 1;
+ }
+ }
+ }
+ else if (nb_edges == 2 && avg_angle > 0)
+ {
+ large_angle = 1;
+ }
+
+
+ if (large_angle == 0)
+ {
+ mode = RETARGET_LENGTH;
+ }
+
+ if (earc->bcount <= (iarc->count - 1))
+ {
+ mode = RETARGET_LENGTH;
+ }
+
+ mode = RETARGET_AGGRESSIVE;
+
+ return mode;
+}
+
+#ifndef USE_THREADS
+static void printCostCube(float *cost_cube, int nb_joints)
+{
+ int i;
+
+ for (i = 0; i < nb_joints; i++)
+ {
+ printf("%0.3f ", cost_cube[3 * i]);
+ }
+ printf("\n");
+
+ for (i = 0; i < nb_joints; i++)
+ {
+ printf("%0.3f ", cost_cube[3 * i + 1]);
+ }
+ printf("\n");
+
+ for (i = 0; i < nb_joints; i++)
+ {
+ printf("%0.3f ", cost_cube[3 * i + 2]);
+ }
+ printf("\n");
+}
+
+static void printMovesNeeded(int *positions, int nb_positions)
+{
+ int moves = 0;
+ int i;
+
+ for (i = 0; i < nb_positions; i++)
+ {
+ moves += positions[i] - (i + 1);
+ }
+
+ printf("%i moves needed\n", moves);
+}
+
+static void printPositions(int *positions, int nb_positions)
+{
+ int i;
+
+ for (i = 0; i < nb_positions; i++)
+ {
+ printf("%i ", positions[i]);
+ }
+ printf("\n");
+}
+#endif
+
+#define MAX_COST 100 /* FIX ME */
+
+static float costDistance(ReebArcIterator *iter, float *vec0, float *vec1, int i0, int i1)
+{
+ EmbedBucket *bucket = NULL;
+ float max_dist = 0;
+ float v1[3], v2[3], c[3];
+ float v1_inpf;
+
+ if (G.scene->toolsettings->skgen_retarget_distance_weight > 0)
+ {
+ VecSubf(v1, vec0, vec1);
+
+ v1_inpf = Inpf(v1, v1);
+
+ if (v1_inpf > 0)
+ {
+ int j;
+ for (j = i0 + 1; j < i1 - 1; j++)
+ {
+ float dist;
+
+ bucket = peekBucket(iter, j);
+
+ VecSubf(v2, bucket->p, vec1);
+
+ Crossf(c, v1, v2);
+
+ dist = Inpf(c, c) / v1_inpf;
+
+ max_dist = dist > max_dist ? dist : max_dist;
+ }
+
+ return G.scene->toolsettings->skgen_retarget_distance_weight * max_dist;
+ }
+ else
+ {
+ return MAX_COST;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+static float costAngle(float original_angle, float vec_first[3], float vec_second[3])
+{
+ if (G.scene->toolsettings->skgen_retarget_angle_weight > 0)
+ {
+ float current_angle;
+
+ if (!VecIsNull(vec_first) && !VecIsNull(vec_second))
+ {
+ current_angle = saacos(Inpf(vec_first, vec_second));
+
+ return G.scene->toolsettings->skgen_retarget_angle_weight * fabs(current_angle - original_angle);
+ }
+ else
+ {
+ return G.scene->toolsettings->skgen_retarget_angle_weight * M_PI;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+static float costLength(float original_length, float current_length)
+{
+ if (current_length == 0)
+ {
+ return MAX_COST;
+ }
+ else
+ {
+ float length_ratio = fabs((current_length - original_length) / original_length);
+ return G.scene->toolsettings->skgen_retarget_length_weight * length_ratio * length_ratio;
+ }
+}
+
+static float calcCostLengthDistance(ReebArcIterator *iter, float **vec_cache, RigEdge *edge, float *vec1, float *vec2, int i1, int i2)
+{
+ float vec[3];
+ float length;
+
+ VecSubf(vec, vec2, vec1);
+ length = Normalize(vec);
+
+ return costLength(edge->length, length) + costDistance(iter, vec1, vec2, i1, i2);
+}
+
+static float calcCostAngleLengthDistance(ReebArcIterator *iter, float **vec_cache, RigEdge *edge, float *vec0, float *vec1, float *vec2, int i1, int i2)
+{
+ float vec_second[3], vec_first[3];
+ float length2;
+ float new_cost = 0;
+
+ VecSubf(vec_second, vec2, vec1);
+ length2 = Normalize(vec_second);
+
+
+ /* Angle cost */
+ if (edge->prev)
+ {
+ VecSubf(vec_first, vec1, vec0);
+ Normalize(vec_first);
+
+ new_cost += costAngle(edge->prev->angle, vec_first, vec_second);
+ }
+
+ /* Length cost */
+ new_cost += costLength(edge->length, length2);
+
+ /* Distance cost */
+ new_cost += costDistance(iter, vec1, vec2, i1, i2);
+
+ return new_cost;
+}
+
+static float calcCost(ReebArcIterator *iter, RigEdge *e1, RigEdge *e2, float *vec0, float *vec1, float *vec2, int i0, int i1, int i2)
+{
+ float vec_second[3], vec_first[3];
+ float length1, length2;
+ float new_cost = 0;
+
+ VecSubf(vec_second, vec2, vec1);
+ length2 = Normalize(vec_second);
+
+ VecSubf(vec_first, vec1, vec0);
+ length1 = Normalize(vec_first);
+
+ /* Angle cost */
+ new_cost += costAngle(e1->angle, vec_first, vec_second);
+
+ /* Length cost */
+ new_cost += costLength(e1->length, length1);
+ new_cost += costLength(e2->length, length2);
+
+ /* Distance cost */
+ new_cost += costDistance(iter, vec0, vec1, i0, i1);
+ new_cost += costDistance(iter, vec1, vec2, i1, i2);
+
+ return new_cost;
+}
+
+static void calcGradient(RigEdge *e1, RigEdge *e2, ReebArcIterator *iter, int index, int nb_joints, float *cost_cube, int *positions, float **vec_cache)
+{
+ EmbedBucket *bucket = NULL;
+ float *vec0, *vec1, *vec2;
+ float current_cost;
+ int i0, i1, i2;
+ int next_position;
+
+ vec0 = vec_cache[index];
+ vec1 = vec_cache[index + 1];
+ vec2 = vec_cache[index + 2];
+
+ if (index == 0)
+ {
+ i0 = 0;
+ }
+ else
+ {
+ i0 = positions[index - 1];
+ }
+
+ i1 = positions[index];
+
+ if (index +1 == nb_joints)
+ {
+ i2 = iter->length;
+ }
+ else
+ {
+ i2 = positions[index + 1];
+ }
+
+
+ current_cost = calcCost(iter, e1, e2, vec0, vec1, vec2, i0, i1, i2);
+ cost_cube[index * 3 + 1] = current_cost;
+
+ next_position = positions[index] + 1;
+
+ if (index + 1 < nb_joints && next_position == positions[index + 1])
+ {
+ cost_cube[index * 3 + 2] = MAX_COST;
+ }
+ else if (next_position > iter->length) /* positions are indexed at 1, so length is last */
+ {
+ cost_cube[index * 3 + 2] = MAX_COST;
+ }
+ else
+ {
+ bucket = peekBucket(iter, next_position);
+
+ if (bucket == NULL)
+ {
+ cost_cube[index * 3 + 2] = MAX_COST;
+ }
+ else
+ {
+ vec1 = bucket->p;
+
+ cost_cube[index * 3 + 2] = calcCost(iter, e1, e2, vec0, vec1, vec2, i0, next_position, i2) - current_cost;
+ }
+ }
+
+ next_position = positions[index] - 1;
+
+ if (index - 1 > -1 && next_position == positions[index - 1])
+ {
+ cost_cube[index * 3] = MAX_COST;
+ }
+ else if (next_position < 1) /* positions are indexed at 1, so 1 is first */
+ {
+ cost_cube[index * 3] = MAX_COST;
+ }
+ else
+ {
+ bucket = peekBucket(iter, next_position);
+
+ if (bucket == NULL)
+ {
+ cost_cube[index * 3] = MAX_COST;
+ }
+ else
+ {
+ vec1 = bucket->p;
+
+ cost_cube[index * 3] = calcCost(iter, e1, e2, vec0, vec1, vec2, i0, next_position, i2) - current_cost;
+ }
+ }
+}
+
+static float probability(float delta_cost, float temperature)
+{
+ if (delta_cost < 0)
+ {
+ return 1;
+ }
+ else
+ {
+ return (float)exp(delta_cost / temperature);
+ }
+}
+
+static int neighbour(int nb_joints, float *cost_cube, int *moving_joint, int *moving_direction)
+{
+ int total = 0;
+ int chosen = 0;
+ int i;
+
+ for (i = 0; i < nb_joints; i++)
+ {
+ if (cost_cube[i * 3] < MAX_COST)
+ {
+ total++;
+ }
+
+ if (cost_cube[i * 3 + 2] < MAX_COST)
+ {
+ total++;
+ }
+ }
+
+ if (total == 0)
+ {
+ return 0;
+ }
+
+ chosen = (int)(BLI_drand() * total);
+
+ for (i = 0; i < nb_joints; i++)
+ {
+ if (cost_cube[i * 3] < MAX_COST)
+ {
+ if (chosen == 0)
+ {
+ *moving_joint = i;
+ *moving_direction = -1;
+ break;
+ }
+ chosen--;
+ }
+
+ if (cost_cube[i * 3 + 2] < MAX_COST)
+ {
+ if (chosen == 0)
+ {
+ *moving_joint = i;
+ *moving_direction = 1;
+ break;
+ }
+ chosen--;
+ }
+ }
+
+ return 1;
+}
+
+static int indexMemoNode(int nb_positions, int previous, int current, int joints_left)
+{
+ return joints_left * nb_positions * nb_positions + current * nb_positions + previous;
+}
+
+static void copyMemoPositions(int *positions, MemoNode *table, int nb_positions, int joints_left)
+{
+ int previous = 0, current = 0;
+ int i = 0;
+
+ for (i = 0; joints_left > 0; joints_left--, i++)
+ {
+ MemoNode *node;
+ node = table + indexMemoNode(nb_positions, previous, current, joints_left);
+
+ positions[i] = node->next;
+
+ previous = current;
+ current = node->next;
+ }
+}
+
+static MemoNode * solveJoints(MemoNode *table, ReebArcIterator *iter, float **vec_cache, int nb_joints, int nb_positions, int previous, int current, RigEdge *edge, int joints_left)
+{
+ MemoNode *node;
+ int index = indexMemoNode(nb_positions, previous, current, joints_left);
+
+ node = table + index;
+
+ if (node->weight != 0)
+ {
+ return node;
+ }
+ else if (joints_left == 0)
+ {
+ float *vec1 = vec_cache[current];
+ float *vec2 = vec_cache[nb_positions + 1];
+
+ node->weight = calcCostLengthDistance(iter, vec_cache, edge, vec1, vec2, current, iter->length);
+
+ return node;
+ }
+ else
+ {
+ MemoNode *min_node = NULL;
+ float *vec0 = vec_cache[previous];
+ float *vec1 = vec_cache[current];
+ float min_weight;
+ int min_next;
+ int next;
+
+ for (next = current + 1; next <= nb_positions - (joints_left - 1); next++)
+ {
+ MemoNode *next_node;
+ float *vec2 = vec_cache[next];
+ float weight = 0;
+
+ /* ADD WEIGHT OF PREVIOUS - CURRENT - NEXT triple */
+ weight = calcCostAngleLengthDistance(iter, vec_cache, edge, vec0, vec1, vec2, current, next);
+
+ if (weight >= MAX_COST)
+ {
+ continue;
+ }
+
+ /* add node weight */
+ next_node = solveJoints(table, iter, vec_cache, nb_joints, nb_positions, current, next, edge->next, joints_left - 1);
+ weight += next_node->weight;
+
+ if (min_node == NULL || weight < min_weight)
+ {
+ min_weight = weight;
+ min_node = next_node;
+ min_next = next;
+ }
+ }
+
+ if (min_node)
+ {
+ node->weight = min_weight;
+ node->next = min_next;
+ return node;
+ }
+ else
+ {
+ node->weight = MAX_COST;
+ return node;
+ }
+ }
+
+}
+
+static int testFlipArc(RigArc *iarc, RigNode *inode_start)
+{
+ ReebArc *earc = iarc->link_mesh;
+ ReebNode *enode_start = BIF_NodeFromIndex(earc, inode_start->link_mesh);
+
+ /* no flip needed if both nodes are the same */
+ if ((enode_start == earc->head && inode_start == iarc->head) || (enode_start == earc->tail && inode_start == iarc->tail))
+ {
+ return 0;
+ }
+ else
+ {
+ return 1;
+ }
+}
+
+static void retargetArctoArcAggresive(RigGraph *rigg, RigArc *iarc, RigNode *inode_start)
+{
+ ReebArcIterator iter;
+ RigEdge *edge;
+ EmbedBucket *bucket = NULL;
+ ReebNode *node_start, *node_end;
+ ReebArc *earc = iarc->link_mesh;
+ float min_cost = FLT_MAX;
+ float *vec0, *vec1, *vec2;
+ float **vec_cache;
+ float *cost_cache;
+ int *best_positions;
+ int *positions;
+ int nb_edges = BLI_countlist(&iarc->edges);
+ int nb_joints = nb_edges - 1;
+ RetargetMethod method = G.scene->toolsettings->skgen_optimisation_method;
+ int i;
+
+ if (nb_joints > earc->bcount)
+ {
+ printf("NOT ENOUGH BUCKETS!\n");
+ return;
+ }
+
+ positions = MEM_callocN(sizeof(int) * nb_joints, "Aggresive positions");
+ best_positions = MEM_callocN(sizeof(int) * nb_joints, "Best Aggresive positions");
+ cost_cache = MEM_callocN(sizeof(float) * nb_edges, "Cost cache");
+ vec_cache = MEM_callocN(sizeof(float*) * (nb_edges + 1), "Vec cache");
+
+ if (testFlipArc(iarc, inode_start))
+ {
+ node_start = earc->tail;
+ node_end = earc->head;
+ }
+ else
+ {
+ node_start = earc->head;
+ node_end = earc->tail;
+ }
+
+ /* init with first values */
+ for (i = 0; i < nb_joints; i++)
+ {
+ positions[i] = i + 1;
+ //positions[i] = (earc->bcount / nb_edges) * (i + 1);
+ }
+
+ /* init cost cache */
+ for (i = 0; i < nb_edges; i++)
+ {
+ cost_cache[i] = 0;
+ }
+
+ vec_cache[0] = node_start->p;
+ vec_cache[nb_edges] = node_end->p;
+
+ if (method == METHOD_MEMOIZE)
+ {
+ int nb_positions = earc->bcount;
+ int nb_memo_nodes = nb_positions * nb_positions * (nb_joints + 1);
+ MemoNode *table = MEM_callocN(nb_memo_nodes * sizeof(MemoNode), "memoization table");
+ MemoNode *result;
+ float **positions_cache = MEM_callocN(sizeof(float*) * (nb_positions + 2), "positions cache");
+ int i;
+
+ positions_cache[0] = node_start->p;
+ positions_cache[nb_positions + 1] = node_end->p;
+
+ initArcIterator(&iter, earc, node_start);
+
+ for (i = 1; i <= nb_positions; i++)
+ {
+ EmbedBucket *bucket = peekBucket(&iter, i);
+ positions_cache[i] = bucket->p;
+ }
+
+ result = solveJoints(table, &iter, positions_cache, nb_joints, earc->bcount, 0, 0, iarc->edges.first, nb_joints);
+
+ min_cost = result->weight;
+ copyMemoPositions(best_positions, table, earc->bcount, nb_joints);
+
+ MEM_freeN(table);
+ MEM_freeN(positions_cache);
+ }
+ /* BRUTE FORCE */
+ else if (method == METHOD_BRUTE_FORCE)
+ {
+ int last_index = 0;
+ int first_pass = 1;
+ int must_move = nb_joints - 1;
+
+ while(1)
+ {
+ float cost = 0;
+ int need_calc = 0;
+
+ /* increment to next possible solution */
+
+ i = nb_joints - 1;
+
+ if (first_pass)
+ {
+ need_calc = 0;
+ first_pass = 0;
+ }
+ else
+ {
+ /* increment positions, starting from the last one
+ * until a valid increment is found
+ * */
+ for (i = must_move; i >= 0; i--)
+ {
+ int remaining_joints = nb_joints - (i + 1);
+
+ positions[i] += 1;
+ need_calc = i;
+
+ if (positions[i] + remaining_joints <= earc->bcount)
+ {
+ break;
+ }
+ }
+ }
+
+ if (i == -1)
+ {
+ break;
+ }
+
+ /* reset joints following the last increment*/
+ for (i = i + 1; i < nb_joints; i++)
+ {
+ positions[i] = positions[i - 1] + 1;
+ }
+
+ /* calculating cost */
+ initArcIterator(&iter, earc, node_start);
+
+ vec0 = NULL;
+ vec1 = node_start->p;
+ vec2 = NULL;
+
+ for (edge = iarc->edges.first, i = 0, last_index = 0;
+ edge;
+ edge = edge->next, i += 1)
+ {
+
+ if (i >= need_calc)
+ {
+ float vec_first[3], vec_second[3];
+ float length1, length2;
+ float new_cost = 0;
+ int i1, i2;
+
+ if (i < nb_joints)
+ {
+ i2 = positions[i];
+ bucket = peekBucket(&iter, positions[i]);
+ vec2 = bucket->p;
+ vec_cache[i + 1] = vec2; /* update cache for updated position */
+ }
+ else
+ {
+ i2 = iter.length;
+ vec2 = node_end->p;
+ }
+
+ if (i > 0)
+ {
+ i1 = positions[i - 1];
+ }
+ else
+ {
+ i1 = 1;
+ }
+
+ vec1 = vec_cache[i];
+
+
+ VecSubf(vec_second, vec2, vec1);
+ length2 = Normalize(vec_second);
+
+ /* check angle */
+ if (i != 0 && G.scene->toolsettings->skgen_retarget_angle_weight > 0)
+ {
+ RigEdge *previous = edge->prev;
+
+ vec0 = vec_cache[i - 1];
+ VecSubf(vec_first, vec1, vec0);
+ length1 = Normalize(vec_first);
+
+ /* Angle cost */
+ new_cost += costAngle(previous->angle, vec_first, vec_second);
+ }
+
+ /* Length Cost */
+ new_cost += costLength(edge->length, length2);
+
+ /* Distance Cost */
+ new_cost += costDistance(&iter, vec1, vec2, i1, i2);
+
+ cost_cache[i] = new_cost;
+ }
+
+ cost += cost_cache[i];
+
+ if (cost > min_cost)
+ {
+ must_move = i;
+ break;
+ }
+ }
+
+ if (must_move != i || must_move > nb_joints - 1)
+ {
+ must_move = nb_joints - 1;
+ }
+
+ /* cost optimizing */
+ if (cost < min_cost)
+ {
+ min_cost = cost;
+ memcpy(best_positions, positions, sizeof(int) * nb_joints);
+ }
+ }
+ }
+ /* SIMULATED ANNEALING */
+ else if (method == METHOD_ANNEALING)
+ {
+ RigEdge *previous;
+ float *cost_cube;
+ float cost;
+ int k;
+ int kmax;
+
+ kmax = 100000;
+
+ BLI_srand(nb_joints);
+
+ /* [joint: index][position: -1, 0, +1] */
+ cost_cube = MEM_callocN(sizeof(float) * 3 * nb_joints, "Cost Cube");
+
+ initArcIterator(&iter, earc, node_start);
+
+ /* init vec_cache */
+ for (i = 0; i < nb_joints; i++)
+ {
+ bucket = peekBucket(&iter, positions[i]);
+ vec_cache[i + 1] = bucket->p;
+ }
+
+ cost = 0;
+
+ /* init cost cube */
+ for (previous = iarc->edges.first, edge = previous->next, i = 0;
+ edge;
+ previous = edge, edge = edge->next, i += 1)
+ {
+ calcGradient(previous, edge, &iter, i, nb_joints, cost_cube, positions, vec_cache);
+
+ cost += cost_cube[3 * i + 1];
+ }
+
+#ifndef USE_THREADS
+ printf("initial cost: %f\n", cost);
+ printf("kmax: %i\n", kmax);
+#endif
+
+ for (k = 0; k < kmax; k++)
+ {
+ int status;
+ int moving_joint = -1;
+ int move_direction = -1;
+ float delta_cost;
+ float temperature;
+
+ status = neighbour(nb_joints, cost_cube, &moving_joint, &move_direction);
+
+ if (status == 0)
+ {
+ /* if current state is still a minimum, copy it */
+ if (cost < min_cost)
+ {
+ min_cost = cost;
+ memcpy(best_positions, positions, sizeof(int) * nb_joints);
+ }
+ break;
+ }
+
+ delta_cost = cost_cube[moving_joint * 3 + (1 + move_direction)];
+
+ temperature = 1 - (float)k / (float)kmax;
+ if (probability(delta_cost, temperature) > BLI_frand())
+ {
+ /* update position */
+ positions[moving_joint] += move_direction;
+
+ /* update vector cache */
+ bucket = peekBucket(&iter, positions[moving_joint]);
+ vec_cache[moving_joint + 1] = bucket->p;
+
+ cost += delta_cost;
+
+ /* cost optimizing */
+ if (cost < min_cost)
+ {
+ min_cost = cost;
+ memcpy(best_positions, positions, sizeof(int) * nb_joints);
+ }
+
+ /* update cost cube */
+ for (previous = iarc->edges.first, edge = previous->next, i = 0;
+ edge;
+ previous = edge, edge = edge->next, i += 1)
+ {
+ if (i == moving_joint - 1 ||
+ i == moving_joint ||
+ i == moving_joint + 1)
+ {
+ calcGradient(previous, edge, &iter, i, nb_joints, cost_cube, positions, vec_cache);
+ }
+ }
+ }
+ }
+
+ //min_cost = cost;
+ //memcpy(best_positions, positions, sizeof(int) * nb_joints);
+
+// printf("k = %i\n", k);
+
+
+ MEM_freeN(cost_cube);
+ }
+
+
+ vec0 = node_start->p;
+ initArcIterator(&iter, earc, node_start);
+
+#ifndef USE_THREADS
+ printPositions(best_positions, nb_joints);
+ printMovesNeeded(best_positions, nb_joints);
+ printf("min_cost %f\n", min_cost);
+ printf("buckets: %i\n", earc->bcount);
+#endif
+
+ /* set joints to best position */
+ for (edge = iarc->edges.first, i = 0;
+ edge;
+ edge = edge->next, i++)
+ {
+ if (i < nb_joints)
+ {
+ bucket = peekBucket(&iter, best_positions[i]);
+ vec1 = bucket->p;
+ }
+ else
+ {
+ vec1 = node_end->p;
+ }
+
+ if (edge->bone)
+ {
+ repositionBone(rigg, edge, vec0, vec1);
+ }
+
+ vec0 = vec1;
+ }
+
+ MEM_freeN(positions);
+ MEM_freeN(best_positions);
+ MEM_freeN(cost_cache);
+ MEM_freeN(vec_cache);
+}
+
+static void retargetArctoArcLength(RigGraph *rigg, RigArc *iarc, RigNode *inode_start)
+{
+ ReebArcIterator iter;
+ ReebArc *earc = iarc->link_mesh;
+ ReebNode *node_start, *node_end;
+ RigEdge *edge;
+ EmbedBucket *bucket = NULL;
+ float embedding_length = 0;
+ float *vec0 = NULL;
+ float *vec1 = NULL;
+ float *previous_vec = NULL;
+
+
+ if (testFlipArc(iarc, inode_start))
+ {
+ node_start = (ReebNode*)earc->tail;
+ node_end = (ReebNode*)earc->head;
+ }
+ else
+ {
+ node_start = (ReebNode*)earc->head;
+ node_end = (ReebNode*)earc->tail;
+ }
+
+ initArcIterator(&iter, earc, node_start);
+
+ bucket = nextBucket(&iter);
+
+ vec0 = node_start->p;
+
+ while (bucket != NULL)
+ {
+ vec1 = bucket->p;
+
+ embedding_length += VecLenf(vec0, vec1);
+
+ vec0 = vec1;
+ bucket = nextBucket(&iter);
+ }
+
+ embedding_length += VecLenf(node_end->p, vec1);
+
+ /* fit bones */
+ initArcIterator(&iter, earc, node_start);
+
+ bucket = nextBucket(&iter);
+
+ vec0 = node_start->p;
+ previous_vec = vec0;
+ vec1 = bucket->p;
+
+ for (edge = iarc->edges.first; edge; edge = edge->next)
+ {
+ float new_bone_length = edge->length / iarc->length * embedding_length;
+
+ float length = 0;
+
+ while (bucket && new_bone_length > length)
+ {
+ length += VecLenf(previous_vec, vec1);
+ bucket = nextBucket(&iter);
+ previous_vec = vec1;
+ vec1 = bucket->p;
+ }
+
+ if (bucket == NULL)
+ {
+ vec1 = node_end->p;
+ }
+
+ /* no need to move virtual edges (space between unconnected bones) */
+ if (edge->bone)
+ {
+ repositionBone(rigg, edge, vec0, vec1);
+ }
+
+ vec0 = vec1;
+ previous_vec = vec1;
+ }
+}
+
+static void retargetArctoArc(RigGraph *rigg, RigArc *iarc, RigNode *inode_start)
+{
+#ifdef USE_THREADS
+ RetargetParam *p = MEM_callocN(sizeof(RetargetParam), "RetargetParam");
+
+ p->rigg = rigg;
+ p->iarc = iarc;
+ p->inode_start = inode_start;
+
+ BLI_insert_work(rigg->worker, p);
+#else
+ RetargetParam p;
+
+ p.rigg = rigg;
+ p.iarc = iarc;
+ p.inode_start = inode_start;
+
+ exec_retargetArctoArc(&p);
+#endif
+}
+
+void *exec_retargetArctoArc(void *param)
+{
+ RetargetParam *p = (RetargetParam*)param;
+ RigGraph *rigg = p->rigg;
+ RigArc *iarc = p->iarc;
+ RigNode *inode_start = p->inode_start;
+ ReebArc *earc = iarc->link_mesh;
+
+ if (BLI_countlist(&iarc->edges) == 1)
+ {
+ RigEdge *edge = iarc->edges.first;
+
+ if (testFlipArc(iarc, inode_start))
+ {
+ repositionBone(rigg, edge, earc->tail->p, earc->head->p);
+ }
+ else
+ {
+ repositionBone(rigg, edge, earc->head->p, earc->tail->p);
+ }
+ }
+ else
+ {
+ RetargetMode mode = detectArcRetargetMode(iarc);
+
+ if (mode == RETARGET_AGGRESSIVE)
+ {
+ retargetArctoArcAggresive(rigg, iarc, inode_start);
+ }
+ else
+ {
+ retargetArctoArcLength(rigg, iarc, inode_start);
+ }
+ }
+
+#ifdef USE_THREADS
+ MEM_freeN(p);
+#endif
+
+ return NULL;
+}
+
+static void matchMultiResolutionNode(RigGraph *rigg, RigNode *inode, ReebNode *top_node)
+{
+ ReebNode *enode = top_node;
+ ReebGraph *reebg = BIF_graphForMultiNode(rigg->link_mesh, enode);
+ int ishape, eshape;
+
+ ishape = BLI_subtreeShape((BGraph*)rigg, (BNode*)inode, NULL, 0) % SHAPE_LEVELS;
+ eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
+
+ inode->link_mesh = enode;
+
+ while (ishape == eshape && enode->link_down)
+ {
+ inode->link_mesh = enode;
+
+ enode = enode->link_down;
+ reebg = BIF_graphForMultiNode(rigg->link_mesh, enode); /* replace with call to link_down once that exists */
+ eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
+ }
+}
+
+static void markMultiResolutionChildArc(ReebNode *end_enode, ReebNode *enode)
+{
+ int i;
+
+ for(i = 0; i < enode->degree; i++)
+ {
+ ReebArc *earc = (ReebArc*)enode->arcs[i];
+
+ if (earc->flag == ARC_FREE)
+ {
+ earc->flag = ARC_TAKEN;
+
+ if (earc->tail->degree > 1 && earc->tail != end_enode)
+ {
+ markMultiResolutionChildArc(end_enode, earc->tail);
+ }
+ break;
+ }
+ }
+}
+
+static void markMultiResolutionArc(ReebArc *start_earc)
+{
+ if (start_earc->link_up)
+ {
+ ReebArc *earc;
+ for (earc = start_earc->link_up ; earc; earc = earc->link_up)
+ {
+ earc->flag = ARC_TAKEN;
+
+ if (earc->tail->index != start_earc->tail->index)
+ {
+ markMultiResolutionChildArc(earc->tail, earc->tail);
+ }
+ }
+ }
+}
+
+static void matchMultiResolutionArc(RigGraph *rigg, RigNode *start_node, RigArc *next_iarc, ReebArc *next_earc)
+{
+ ReebNode *enode = next_earc->head;
+ ReebGraph *reebg = BIF_graphForMultiNode(rigg->link_mesh, enode);
+ int ishape, eshape;
+
+ ishape = BLI_subtreeShape((BGraph*)rigg, (BNode*)start_node, (BArc*)next_iarc, 1) % SHAPE_LEVELS;
+ eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, (BArc*)next_earc, 1) % SHAPE_LEVELS;
+
+ while (ishape != eshape && next_earc->link_up)
+ {
+ next_earc->flag = ARC_TAKEN; // mark previous as taken, to prevent backtrack on lower levels
+
+ next_earc = next_earc->link_up;
+ reebg = reebg->link_up;
+ enode = next_earc->head;
+ eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, (BArc*)next_earc, 1) % SHAPE_LEVELS;
+ }
+
+ next_earc->flag = ARC_USED;
+ next_iarc->link_mesh = next_earc;
+
+ /* mark all higher levels as taken too */
+ markMultiResolutionArc(next_earc);
+// while (next_earc->link_up)
+// {
+// next_earc = next_earc->link_up;
+// next_earc->flag = ARC_TAKEN;
+// }
+}
+
+static void matchMultiResolutionStartingNode(RigGraph *rigg, ReebGraph *reebg, RigNode *inode)
+{
+ ReebNode *enode;
+ int ishape, eshape;
+
+ enode = reebg->nodes.first;
+
+ ishape = BLI_subtreeShape((BGraph*)rigg, (BNode*)inode, NULL, 0) % SHAPE_LEVELS;
+ eshape = BLI_subtreeShape((BGraph*)rigg->link_mesh, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
+
+ while (ishape != eshape && reebg->link_up)
+ {
+ reebg = reebg->link_up;
+
+ enode = reebg->nodes.first;
+
+ eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
+ }
+
+ inode->link_mesh = enode;
+}
+
+static void findCorrespondingArc(RigGraph *rigg, RigArc *start_arc, RigNode *start_node, RigArc *next_iarc, int root)
+{
+ ReebNode *enode = start_node->link_mesh;
+ ReebArc *next_earc;
+ int symmetry_level = next_iarc->symmetry_level;
+ int symmetry_group = next_iarc->symmetry_group;
+ int symmetry_flag = next_iarc->symmetry_flag;
+ int i;
+
+ next_iarc->link_mesh = NULL;
+
+// if (root)
+// {
+// printf("-----------------------\n");
+// printf("MATCHING LIMB\n");
+// RIG_printArcBones(next_iarc);
+// }
+
+ for(i = 0; i < enode->degree; i++)
+ {
+ next_earc = (ReebArc*)enode->arcs[i];
+
+// if (next_earc->flag == ARC_FREE)
+// {
+// printf("candidate (level %i ?= %i) (flag %i ?= %i) (group %i ?= %i)\n",
+// symmetry_level, next_earc->symmetry_level,
+// symmetry_flag, next_earc->symmetry_flag,
+// symmetry_group, next_earc->symmetry_flag);
+// }
+
+ if (next_earc->flag == ARC_FREE &&
+ next_earc->symmetry_flag == symmetry_flag &&
+ next_earc->symmetry_group == symmetry_group &&
+ next_earc->symmetry_level == symmetry_level)
+ {
+// printf("CORRESPONDING ARC FOUND\n");
+// printf("flag %i -- level %i -- flag %i -- group %i\n", next_earc->flag, next_earc->symmetry_level, next_earc->symmetry_flag, next_earc->symmetry_group);
+
+ matchMultiResolutionArc(rigg, start_node, next_iarc, next_earc);
+ break;
+ }
+ }
+
+ /* not found, try at higher nodes (lower node might have filtered internal arcs, messing shape of tree */
+ if (next_iarc->link_mesh == NULL)
+ {
+// printf("NO CORRESPONDING ARC FOUND - GOING TO HIGHER LEVELS\n");
+
+ if (enode->link_up)
+ {
+ start_node->link_mesh = enode->link_up;
+ findCorrespondingArc(rigg, start_arc, start_node, next_iarc, 0);
+ }
+ }
+
+ /* still not found, print debug info */
+ if (root && next_iarc->link_mesh == NULL)
+ {
+ start_node->link_mesh = enode; /* linking back with root node */
+
+// printf("NO CORRESPONDING ARC FOUND\n");
+// RIG_printArcBones(next_iarc);
+//
+// printf("ON NODE %i, multilevel %i\n", enode->index, enode->multi_level);
+//
+// printf("LOOKING FOR\n");
+// printf("flag %i -- level %i -- flag %i -- group %i\n", ARC_FREE, symmetry_level, symmetry_flag, symmetry_group);
+//
+// printf("CANDIDATES\n");
+// for(i = 0; i < enode->degree; i++)
+// {
+// next_earc = (ReebArc*)enode->arcs[i];
+// printf("flag %i -- level %i -- flag %i -- group %i\n", next_earc->flag, next_earc->symmetry_level, next_earc->symmetry_flag, next_earc->symmetry_group);
+// }
+
+ /* Emergency matching */
+ for(i = 0; i < enode->degree; i++)
+ {
+ next_earc = (ReebArc*)enode->arcs[i];
+
+ if (next_earc->flag == ARC_FREE && next_earc->symmetry_level == symmetry_level)
+ {
+// printf("USING: \n");
+// printf("flag %i -- level %i -- flag %i -- group %i\n", next_earc->flag, next_earc->symmetry_level, next_earc->symmetry_flag, next_earc->symmetry_group);
+ matchMultiResolutionArc(rigg, start_node, next_iarc, next_earc);
+ break;
+ }
+ }
+ }
+
+}
+
+static void retargetSubgraph(RigGraph *rigg, RigArc *start_arc, RigNode *start_node)
+{
+ RigNode *inode = start_node;
+ int i;
+
+ /* no start arc on first node */
+ if (start_arc)
+ {
+ ReebNode *enode = start_node->link_mesh;
+ ReebArc *earc = start_arc->link_mesh;
+
+ retargetArctoArc(rigg, start_arc, start_node);
+
+ enode = BIF_otherNodeFromIndex(earc, enode);
+ inode = (RigNode*)BLI_otherNode((BArc*)start_arc, (BNode*)inode);
+
+ /* match with lowest node with correct shape */
+ matchMultiResolutionNode(rigg, inode, enode);
+ }
+
+ for(i = 0; i < inode->degree; i++)
+ {
+ RigArc *next_iarc = (RigArc*)inode->arcs[i];
+
+ /* no back tracking */
+ if (next_iarc != start_arc)
+ {
+ findCorrespondingArc(rigg, start_arc, inode, next_iarc, 1);
+ if (next_iarc->link_mesh)
+ {
+ retargetSubgraph(rigg, next_iarc, inode);
+ }
+ }
+ }
+}
+
+static void adjustGraphs(RigGraph *rigg)
+{
+ RigArc *arc;
+
+ for (arc = rigg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->link_mesh)
+ {
+ retargetArctoArc(rigg, arc, arc->head);
+ }
+ }
+
+#ifdef USE_THREADS
+ BLI_end_worker(rigg->worker);
+#endif
+
+ /* Turn the list into an armature */
+ editbones_to_armature(&rigg->editbones, rigg->ob);
+
+ BIF_undo_push("Retarget Skeleton");
+}
+
+static void retargetGraphs(RigGraph *rigg)
+{
+ ReebGraph *reebg = rigg->link_mesh;
+ RigNode *inode;
+
+ /* flag all ReebArcs as free */
+ BIF_flagMultiArcs(reebg, ARC_FREE);
+
+ /* return to first level */
+ reebg = rigg->link_mesh;
+
+ inode = rigg->head;
+
+ matchMultiResolutionStartingNode(rigg, reebg, inode);
+
+ retargetSubgraph(rigg, NULL, inode);
+
+ //generateMissingArcs(rigg);
+
+#ifdef USE_THREADS
+ BLI_end_worker(rigg->worker);
+#endif
+
+ /* Turn the list into an armature */
+ editbones_to_armature(&rigg->editbones, rigg->ob);
+}
+
+
+void BIF_retargetArmature()
+{
+ Object *ob;
+ Base *base;
+ ReebGraph *reebg;
+ double start_time, end_time;
+ double gstart_time, gend_time;
+ double reeb_time, rig_time, retarget_time, total_time;
+
+ gstart_time = start_time = PIL_check_seconds_timer();
+
+ reebg = BIF_ReebGraphMultiFromEditMesh();
+
+ end_time = PIL_check_seconds_timer();
+ reeb_time = end_time - start_time;
+
+ printf("Reeb Graph created\n");
+
+ base= FIRSTBASE;
+ for (base = FIRSTBASE; base; base = base->next)
+ {
+ if TESTBASELIB(base) {
+ ob = base->object;
+
+ if (ob->type==OB_ARMATURE)
+ {
+ RigGraph *rigg;
+ bArmature *arm;
+
+ arm = ob->data;
+
+ /* Put the armature into editmode */
+
+
+ start_time = PIL_check_seconds_timer();
+
+ rigg = armatureToGraph(ob, arm);
+
+ end_time = PIL_check_seconds_timer();
+ rig_time = end_time - start_time;
+
+ printf("Armature graph created\n");
+
+ //RIG_printGraph(rigg);
+
+ rigg->link_mesh = reebg;
+
+ printf("retargetting %s\n", ob->id.name);
+
+ start_time = PIL_check_seconds_timer();
+
+ retargetGraphs(rigg);
+
+ end_time = PIL_check_seconds_timer();
+ retarget_time = end_time - start_time;
+
+ BIF_freeRetarget();
+
+ GLOBAL_RIGG = rigg;
+
+ break; /* only one armature at a time */
+ }
+ }
+ }
+
+ gend_time = PIL_check_seconds_timer();
+
+ total_time = gend_time - gstart_time;
+
+ printf("-----------\n");
+ printf("runtime: \t%.3f\n", total_time);
+ printf("reeb: \t\t%.3f (%.1f%%)\n", reeb_time, reeb_time / total_time * 100);
+ printf("rig: \t\t%.3f (%.1f%%)\n", rig_time, rig_time / total_time * 100);
+ printf("retarget: \t%.3f (%.1f%%)\n", retarget_time, retarget_time / total_time * 100);
+ printf("-----------\n");
+
+ BIF_undo_push("Retarget Skeleton");
+
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+void BIF_adjustRetarget()
+{
+ if (GLOBAL_RIGG)
+ {
+ adjustGraphs(GLOBAL_RIGG);
+ }
+}
+
+void BIF_freeRetarget()
+{
+ if (GLOBAL_RIGG)
+ {
+ RIG_freeRigGraph((BGraph*)GLOBAL_RIGG);
+ GLOBAL_RIGG = NULL;
+ }
+}
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index cf4261f43b1..6cbf14d47fb 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -180,6 +180,8 @@
#include "butspace.h" // own module
#include "multires.h"
+#include "reeb.h"
+
static float editbutweight= 1.0;
float editbutvweight= 1;
static int actmcol= 0, acttface= 0, acttface_rnd = 0, actmcol_rnd = 0;
@@ -884,7 +886,7 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me)
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, ME_TWOSIDED, REDRAWVIEW3D, "Double Sided", 10,30,170,19, &me->flag, 0, 0, 0, 0, "Render/display the mesh as double or single sided");
+ uiDefButBitS(block, TOG, ME_TWOSIDED, REDRAWVIEW3D, "Double Sided", 10,30,170,19, &me->flag, 0, 0, 0, 0, "Render/display the mesh with double or single sided lighting");
uiDefButBitS(block, TOG, ME_NOPUNOFLIP, REDRAWVIEW3D, "No V.Normal Flip", 10,10,170,19, &me->flag, 0, 0, 0, 0, "Disables flipping of vertexnormals during render");
uiBlockEndAlign(block);
@@ -1248,6 +1250,7 @@ static void modifiers_convertParticles(void *obv, void *mdv)
ModifierData *md = mdv;
ParticleSystem *psys;
ParticleCacheKey *key, **cache;
+ ParticleSettings *part;
Mesh *me;
MVert *mvert;
MEdge *medge;
@@ -1260,78 +1263,90 @@ static void modifiers_convertParticles(void *obv, void *mdv)
if(G.f & G_PARTICLEEDIT) return;
psys=((ParticleSystemModifierData *)md)->psys;
+ part= psys->part;
- if(psys->part->draw_as != PART_DRAW_PATH || psys->pathcache == 0) return;
+ if(part->draw_as == PART_DRAW_GR || part->draw_as == PART_DRAW_OB) {
+ make_object_duplilist_real(NULL);
+ }
+ else {
+ if(part->draw_as != PART_DRAW_PATH || psys->pathcache == 0)
+ return;
- totpart= psys->totcached;
- totchild= psys->totchildcache;
+ totpart= psys->totcached;
+ totchild= psys->totchildcache;
- if(totchild && (psys->part->draw&PART_DRAW_PARENT)==0)
- totpart= 0;
+ if(totchild && (part->draw&PART_DRAW_PARENT)==0)
+ totpart= 0;
- /* count */
- cache= psys->pathcache;
- for(a=0; a<totpart; a++) {
- key= cache[a];
- totvert+= key->steps+1;
- totedge+= key->steps;
- }
+ /* count */
+ cache= psys->pathcache;
+ for(a=0; a<totpart; a++) {
+ key= cache[a];
+ totvert+= key->steps+1;
+ totedge+= key->steps;
+ }
- cache= psys->childcache;
- for(a=0; a<totchild; a++) {
- key= cache[a];
- totvert+= key->steps+1;
- totedge+= key->steps;
- }
+ cache= psys->childcache;
+ for(a=0; a<totchild; a++) {
+ key= cache[a];
+ totvert+= key->steps+1;
+ totedge+= key->steps;
+ }
- if(totvert==0) return;
-
- /* add new mesh */
- obn= add_object(OB_MESH);
- me= obn->data;
-
- me->totvert= totvert;
- me->totedge= totedge;
-
- me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
- me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
- me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0);
-
- mvert= me->mvert;
- medge= me->medge;
-
- /* copy coordinates */
- cache= psys->pathcache;
- for(a=0; a<totpart; a++) {
- key= cache[a];
- kmax= key->steps;
- for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
- VECCOPY(mvert->co,key->co);
- if(k) {
- medge->v1= cvert-1;
- medge->v2= cvert;
- medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE;
- medge++;
+ if(totvert==0) return;
+
+ /* add new mesh */
+ obn= add_object(OB_MESH);
+ me= obn->data;
+
+ me->totvert= totvert;
+ me->totedge= totedge;
+
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
+ me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0);
+
+ mvert= me->mvert;
+ medge= me->medge;
+
+ /* copy coordinates */
+ cache= psys->pathcache;
+ for(a=0; a<totpart; a++) {
+ key= cache[a];
+ kmax= key->steps;
+ for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
+ VECCOPY(mvert->co,key->co);
+ if(k) {
+ medge->v1= cvert-1;
+ medge->v2= cvert;
+ medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE;
+ medge++;
+ }
}
}
- }
- cache=psys->childcache;
- for(a=0; a<totchild; a++) {
- key=cache[a];
- kmax=key->steps;
- for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
- VECCOPY(mvert->co,key->co);
- if(k) {
- medge->v1=cvert-1;
- medge->v2=cvert;
- medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE;
- medge++;
+ cache=psys->childcache;
+ for(a=0; a<totchild; a++) {
+ key=cache[a];
+ kmax=key->steps;
+ for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
+ VECCOPY(mvert->co,key->co);
+ if(k) {
+ medge->v1=cvert-1;
+ medge->v2=cvert;
+ medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE;
+ medge++;
+ }
}
}
}
DAG_scene_sort(G.scene);
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWOOPS, 0);
+
+ BIF_undo_push("Convert particles to mesh object(s).");
}
static void modifiers_applyModifier(void *obv, void *mdv)
@@ -1870,8 +1885,15 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiBlockBeginAlign(block);
if (md->type==eModifierType_ParticleSystem) {
- but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Convert", lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Convert the current particles to a mesh object");
- uiButSetFunc(but, modifiers_convertParticles, ob, md);
+ ParticleSystem *psys;
+ psys= ((ParticleSystemModifierData *)md)->psys;
+
+ if(!(G.f & G_PARTICLEEDIT)) {
+ if(ELEM3(psys->part->draw_as, PART_DRAW_PATH, PART_DRAW_GR, PART_DRAW_OB) && psys->pathcache) {
+ but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Convert", lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Convert the current particles to a mesh object");
+ uiButSetFunc(but, modifiers_convertParticles, ob, md);
+ }
+ }
}
else{
but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Apply", lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Apply the current modifier and remove from the stack");
@@ -3753,11 +3775,9 @@ static void editing_panel_camera_yafraydof(Object *ob, Camera *cam)
void do_cambuts(unsigned short event)
{
Object *ob;
- Camera *cam;
ob= OBACT;
if (ob==0) return;
- cam= ob->data;
switch(event) {
case 0:
@@ -4617,7 +4637,7 @@ static void editing_panel_pose_bones(Object *ob, bArmature *arm)
uiDefButBitI(block, TOG, BONE_NO_SCALE, B_ARM_RECALCDATA, "S", 70,by-38,20,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit scale from parent Bone");
uiDefButBitI(block, TOGN, BONE_NO_DEFORM, B_ARM_RECALCDATA, "Deform", 90, by-38, 80, 19, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone deforms geometry");
uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Mult", 170,by-38,80,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Multiply Bone Envelope with VertexGroup");
- uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Hide", 250,by-38,80,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Toggles display of this bone in Edit Mode");
+ uiDefButBitI(block, TOG, BONE_HIDDEN_P, B_ARM_RECALCDATA, "Hide", 250,by-38,80,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Toggles display of this bone in Edit Mode");
/* layers */
uiBlockBeginAlign(block);
@@ -4742,7 +4762,7 @@ void do_vgroupbuts(unsigned short event)
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
scrarea_queue_winredraw(curarea);
allqueue(REDRAWOOPS, 0);
-
+ BIF_undo_push("New vertex group");
break;
case B_DELVGROUP:
if ((G.obedit) && (G.obedit == ob)) {
@@ -4758,35 +4778,40 @@ void do_vgroupbuts(unsigned short event)
break;
case B_ASSIGNVGROUP:
assign_verts_defgroup ();
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue (REDRAWVIEW3D, 1);
BIF_undo_push("Assign to vertex group");
break;
case B_REMOVEVGROUP:
remove_verts_defgroup (0);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue (REDRAWVIEW3D, 1);
allqueue(REDRAWOOPS, 0);
BIF_undo_push("Remove from vertex group");
break;
case B_SELVGROUP:
- sel_verts_defgroup(1);
+ sel_verts_defgroup(1); /* runs countall() */
allqueue (REDRAWVIEW3D, 1);
allqueue(REDRAWOOPS, 0);
- countall();
+ BIF_undo_push("Select vertex group");
break;
case B_DESELVGROUP:
- sel_verts_defgroup(0);
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ sel_verts_defgroup(0); /* runs countall() */
allqueue (REDRAWVIEW3D, 1);
allqueue(REDRAWOOPS, 0);
- countall();
+ BIF_undo_push("DeSelect vertex group");
break;
case B_LINKEDVGROUP:
copy_linked_vgroup_channels(ob);
+ allqueue (REDRAWVIEW3D, 1);
+ allqueue(REDRAWOOPS, 0);
+ BIF_undo_push("Copy vertex group to linked obdata");
break;
case B_COPYVGROUP:
duplicate_defgroup (ob);
scrarea_queue_winredraw (curarea);
allqueue (REDRAWOOPS, 0);
+ BIF_undo_push("Copy vertex group");
break;
}
}
@@ -4954,9 +4979,7 @@ void do_meshbuts(unsigned short event)
if( select_area(SPACE_VIEW3D)) spin_mesh(G.scene->toolsettings->step, G.scene->toolsettings->degr, 0, 1);
break;
case B_EXTR:
- G.f |= G_DISABLE_OK;
if( select_area(SPACE_VIEW3D)) extrude_mesh();
- G.f -= G_DISABLE_OK;
break;
case B_SCREW:
if( select_area(SPACE_VIEW3D)) screw_mesh(G.scene->toolsettings->step, G.scene->toolsettings->turn);
@@ -4965,9 +4988,7 @@ void do_meshbuts(unsigned short event)
if( select_area(SPACE_VIEW3D)) extrude_repeat_mesh(G.scene->toolsettings->step, G.scene->toolsettings->extr_offs);
break;
case B_SPLIT:
- G.f |= G_DISABLE_OK;
split_mesh();
- G.f -= G_DISABLE_OK;
break;
case B_REMDOUB:
count= removedoublesflag(1, 0, G.scene->toolsettings->doublimit);
@@ -5033,6 +5054,9 @@ void do_meshbuts(unsigned short event)
case B_GEN_SKELETON:
generateSkeleton();
break;
+ case B_RETARGET_SKELETON:
+ BIF_retargetArmature();
+ break;
}
/* WATCH IT: previous events only in editmode! */
@@ -5131,6 +5155,100 @@ static void skgen_reorder(void *option, void *arg2)
}
}
+static void skgen_graphgen(void *arg1, void *arg2)
+{
+ BIF_GlobalReebGraphFromEditMesh();
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+static void skgen_graphfree(void *arg1, void *arg2)
+{
+ BIF_GlobalReebFree();
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+static void skgen_rigadjust(void *arg1, void *arg2)
+{
+ BIF_adjustRetarget();
+}
+
+static void skgen_rigfree(void *arg1, void *arg2)
+{
+ BIF_freeRetarget();
+}
+
+static void skgen_graph_block(uiBlock *block)
+{
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, B_DIFF, "Resolution:", 1025,150,225,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0, "Specifies the resolution of the graph's embedding");
+ uiDefButBitS(block, TOG, SKGEN_HARMONIC, B_DIFF, "H", 1250,150, 25,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Apply harmonic smoothing to the weighting");
+ uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In", 1025,130, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Filter internal small arcs from graph");
+ uiDefButF(block, NUM, B_DIFF, "", 1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 10.0, 10, 0, "Specify the threshold ratio for filtering internal arcs");
+ uiDefButBitS(block, TOG, SKGEN_FILTER_EXTERNAL, B_DIFF, "Filter Ex", 1025,110, 53,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Filter external small arcs from graph");
+ uiDefButBitS(block, TOG, SKGEN_FILTER_SMART, B_DIFF, "Sm", 1078,110, 30,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Smart Filtering");
+ uiDefButF(block, NUM, B_DIFF, "", 1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 10.0, 10, 0, "Specify the threshold ratio for filtering external arcs");
+
+ uiDefButBitS(block, TOG, SKGEN_SYMMETRY, B_DIFF, "Symmetry", 1025, 90,125,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Restore symmetries based on topology");
+ uiDefButF(block, NUM, B_DIFF, "T:", 1150, 90,125,19, &G.scene->toolsettings->skgen_symmetry_limit,0.0, 1.0, 10, 0, "Specify the threshold distance for considering potential symmetric arcs");
+ uiDefButC(block, NUM, B_DIFF, "P:", 1025, 70, 62,19, &G.scene->toolsettings->skgen_postpro_passes, 0, 10, 10, 0, "Specify the number of processing passes on the embeddings");
+ uiDefButC(block, ROW, B_DIFF, "Smooth", 1087, 70, 63,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_SMOOTH, 0, 0, "Smooth embeddings");
+ uiDefButC(block, ROW, B_DIFF, "Average", 1150, 70, 62,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_AVERAGE, 0, 0, "Average embeddings");
+ uiDefButC(block, ROW, B_DIFF, "Sharpen", 1212, 70, 63,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_SHARPEN, 0, 0, "Sharpen embeddings");
+
+ uiBlockEndAlign(block);
+}
+
+static void editing_panel_mesh_skgen_display(Object *ob, Mesh *me)
+{
+ uiBlock *block;
+ uiBut *but;
+
+ block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_skgen_display", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Mesh Tools More", "Skgen");
+ if(uiNewPanel(curarea, block, "Graph", "Editing", 960, 0, 318, 204)==0) return;
+
+ but = uiDefBut(block, BUT, B_DIFF, "Generate", 1025,170,125,19, 0, 0, 0, 0, 0, "Generate Graph from Mesh");
+ uiButSetFunc(but, skgen_graphgen, NULL, NULL);
+ but = uiDefBut(block, BUT, B_DIFF, "Free", 1150,170,125,19, 0, 0, 0, 0, 0, "Free Graph from Mesh");
+ uiButSetFunc(but, skgen_graphfree, NULL, NULL);
+
+ skgen_graph_block(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, SKGEN_DISP_LENGTH, REDRAWVIEW3D, "Length", 1025, 40, 50,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Show Length");
+ uiDefButBitS(block, TOG, SKGEN_DISP_WEIGHT, REDRAWVIEW3D, "Weight", 1075, 40, 50,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Show Weight");
+ uiDefButBitS(block, TOG, SKGEN_DISP_EMBED, REDRAWVIEW3D, "Embed", 1125, 40, 50,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Show Arc Embedings");
+ uiDefButBitS(block, TOG, SKGEN_DISP_INDEX, REDRAWVIEW3D, "Index", 1175, 40, 50,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Show Arc and Node indexes");
+ uiDefButBitS(block, TOG, SKGEN_DISP_ORIG, REDRAWVIEW3D, "Original", 1225, 40, 50,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Show Original Graph");
+
+ uiBlockEndAlign(block);
+
+ uiDefButC(block, NUM, REDRAWVIEW3D, "Level:", 1025, 20, 125,19, &G.scene->toolsettings->skgen_multi_level, 0, REEB_MAX_MULTI_LEVEL, 1, 0,"Specify the level to draw");
+}
+
+static void editing_panel_mesh_skgen_retarget(Object *ob, Mesh *me)
+{
+ uiBlock *block;
+ uiBut *but;
+
+ block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_skgen_retarget", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Mesh Tools More", "Skgen");
+ if(uiNewPanel(curarea, block, "Retarget", "Editing", 960, 0, 318, 204)==0) return;
+
+ uiDefBut(block, BUT, B_RETARGET_SKELETON, "Retarget Skeleton", 1025,170,100,19, 0, 0, 0, 0, 0, "Retarget Selected Armature to this Mesh");
+ but = uiDefBut(block, BUT, B_DIFF, "Adjust", 1125,170,100,19, 0, 0, 0, 0, 0, "Adjust Retarget using new weights");
+ uiButSetFunc(but, skgen_rigadjust, NULL, NULL);
+ but = uiDefBut(block, BUT, B_DIFF, "Free", 1225,170,50,19, 0, 0, 0, 0, 0, "Free Retarget structure");
+ uiButSetFunc(but, skgen_rigfree, NULL, NULL);
+
+ skgen_graph_block(block);
+
+ uiDefButF(block, NUM, B_DIFF, "Ang:", 1025, 40, 83,19, &G.scene->toolsettings->skgen_retarget_angle_weight, 0, 10, 1, 0, "Angle Weight");
+ uiDefButF(block, NUM, B_DIFF, "Len:", 1108, 40, 83,19, &G.scene->toolsettings->skgen_retarget_length_weight, 0, 10, 1, 0, "Length Weight");
+ uiDefButF(block, NUM, B_DIFF, "Dist:", 1191, 40, 84,19, &G.scene->toolsettings->skgen_retarget_distance_weight, 0, 10, 1, 0, "Distance Weight");
+ uiDefButC(block, NUM, B_DIFF, "Method:", 1025, 20, 125,19, &G.scene->toolsettings->skgen_optimisation_method, 0, 2, 1, 0,"Optimisation Method (0: brute, 1: memoize, 2: annealing max fixed");
+}
+
static void editing_panel_mesh_skgen(Object *ob, Mesh *me)
{
uiBlock *block;
@@ -5138,20 +5256,17 @@ static void editing_panel_mesh_skgen(Object *ob, Mesh *me)
int i;
block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_skgen", UI_EMBOSS, UI_HELV, curarea->win);
- if(uiNewPanel(curarea, block, "Skeleton Generator", "Editing", 960, 0, 318, 204)==0) return;
+ uiNewPanelTabbed("Mesh Tools More", "Skgen");
+ if(uiNewPanel(curarea, block, "Generator", "Editing", 960, 0, 318, 204)==0) return;
- uiDefBut(block, BUT, B_GEN_SKELETON, "Generate Skeleton", 1025,170,250,19, 0, 0, 0, 0, 0, "Generate Skeleton from Mesh");
+ uiDefBut(block, BUT, B_GEN_SKELETON, "Generate", 1025,170,250,19, 0, 0, 0, 0, 0, "Generate Skeleton from Mesh");
- uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_DIFF, "Resolution:", 1025,150,250,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0, "Specifies the resolution of the graph's embedding");
- uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In", 1025,130, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Filter internal small arcs from graph");
- uiDefButF(block, NUM, B_DIFF, "T:", 1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 1.0, 10, 0, "Specify the threshold ratio for filtering internal arcs");
- uiDefButBitS(block, TOG, SKGEN_FILTER_EXTERNAL, B_DIFF, "Filter Ex", 1025,110, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Filter external small arcs from graph");
- uiDefButF(block, NUM, B_DIFF, "T:", 1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 1.0, 10, 0, "Specify the threshold ratio for filtering external arcs");
+ skgen_graph_block(block);
+ uiBlockBeginAlign(block);
for(i = 0; i < SKGEN_SUB_TOTAL; i++)
{
- int y = 90 - 20 * i;
+ int y = 50 - 20 * i;
but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, VICON_MOVE_DOWN, 1025, y, 16, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Change the order the subdivisions algorithm are applied");
uiButSetFunc(but, skgen_reorder, SET_INT_IN_POINTER(i), NULL);
@@ -5168,18 +5283,14 @@ static void editing_panel_mesh_skgen(Object *ob, Mesh *me)
uiDefButF(block, NUM, B_DIFF, "T:", 1111, y,164,19, &G.scene->toolsettings->skgen_angle_limit,0.0, 90.0, 10, 0, "Specify the threshold angle in degrees for subdivision");
break;
case SKGEN_SUB_CORRELATION:
- uiDefButBitS(block, TOG, SKGEN_CUT_CORRELATION, B_DIFF, "Correlation", 1041, y, 67,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Subdivide arcs based on correlation");
- uiDefButF(block, NUM, B_DIFF, "T:", 1111, y,164,19, &G.scene->toolsettings->skgen_correlation_limit,0.0, 1.0, 0.01, 0, "Specify the threshold correlation for subdivision");
+ uiDefButBitS(block, TOG, SKGEN_CUT_CORRELATION, B_DIFF, "Adaptative", 1041, y, 67,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Subdivide arcs adaptatively");
+ uiDefButF(block, NUM, B_DIFF, "T:", 1111, y,114,19, &G.scene->toolsettings->skgen_correlation_limit,0.0, 1.0, 0.01, 0, "Specify the adaptive threshold for subdivision");
+ uiDefButBitS(block, TOG, SKGEN_STICK_TO_EMBEDDING, B_DIFF, "E", 1225, y, 25,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Stick endpoint to embedding");
+ uiDefButBitS(block, TOG, SKGEN_ADAPTIVE_DISTANCE, B_DIFF, "D", 1250, y, 25,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Adaptive distance (on) or variance(off)");
break;
}
}
- uiDefButBitS(block, TOG, SKGEN_SYMMETRY, B_DIFF, "Symmetry", 1025, 30,125,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Restore symmetries based on topology");
- uiDefButF(block, NUM, B_DIFF, "T:", 1150, 30,125,19, &G.scene->toolsettings->skgen_symmetry_limit,0.0, 1.0, 10, 0, "Specify the threshold distance for considering potential symmetric arcs");
- uiDefButC(block, NUM, B_DIFF, "P:", 1025, 10, 62,19, &G.scene->toolsettings->skgen_postpro_passes, 0, 10, 10, 0, "Specify the number of processing passes on the embeddings");
- uiDefButC(block, ROW, B_DIFF, "Smooth", 1087, 10, 63,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_SMOOTH, 0, 0, "Smooth embeddings");
- uiDefButC(block, ROW, B_DIFF, "Average", 1150, 10, 62,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_AVERAGE, 0, 0, "Average embeddings");
- uiDefButC(block, ROW, B_DIFF, "Sharpen", 1212, 10, 63,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_SHARPEN, 0, 0, "Sharpen embeddings");
uiBlockEndAlign(block);
}
@@ -5692,7 +5803,7 @@ void sculptmode_draw_interface_brush(uiBlock *block, unsigned short cx, unsigned
if(sd->brush_type == DRAW_BRUSH)
uiDefButC(block,NUM,B_NOP, "View", cx,cy,80,19, &sculptmode_brush()->view, 0,10,20,0,"Pulls brush direction towards view");
cy-= 20;
- uiDefButBitC(block, TOG, SCULPT_BRUSH_ANCHORED, B_NOP, "Anchored", cx,cy,80,19, &sculptmode_brush()->flag, 0,0,0,0, "Keep the brush center anchored to the initial location");
+ uiDefButBitC(block, TOG, SCULPT_BRUSH_ANCHORED, B_NOP, "Anchored", cx,cy,80,19, &sculptmode_brush()->flag, 0,0,0,0, "Keep the brush center anchored to the initial location (Shift A)");
uiBlockEndAlign(block);
/* Draw curve */
@@ -5722,11 +5833,11 @@ void sculptmode_draw_interface_textures(uiBlock *block, unsigned short cx, unsig
for(i=-1; i<8; i++) {
char str[64];
int loos;
- mtex= sd->mtex[i];
if(i==-1)
strcpy(str, "Default");
else {
+ mtex= sd->mtex[i];
if(mtex && mtex->tex) splitIDname(mtex->tex->id.name+2, str, &loos);
else strcpy(str, "");
}
@@ -5737,13 +5848,15 @@ void sculptmode_draw_interface_textures(uiBlock *block, unsigned short cx, unsig
cy= orig_y-20;
cx+= 85;
- mtex= sd->mtex[sd->texact];
if(sd->texact == -1) {
uiBlockBeginAlign(block);
uiDefBut(block,LABEL,B_NOP,"",cx,cy,115,20,0,0,0,0,0,""); /* Padding */
} else {
- ID *id= NULL;
+ ID *id = NULL;
+
+ mtex= sd->mtex[sd->texact];
+
uiBlockBeginAlign(block);
if(mtex && mtex->tex) id= &mtex->tex->id;
@@ -6604,8 +6717,11 @@ void editing_panels()
editing_panel_mesh_tools1(ob, ob->data);
uiNewPanelTabbed("Mesh Tools 1", "Editing");
- if (G.rt == 42) /* hidden for now, no time for docs */
- editing_panel_mesh_skgen(ob, ob->data);
+ #ifdef WITH_BF_REEB
+ editing_panel_mesh_skgen(ob, ob->data);
+ editing_panel_mesh_skgen_retarget(ob, ob->data);
+ editing_panel_mesh_skgen_display(ob, ob->data);
+ #endif
editing_panel_mesh_uvautocalculation();
if (EM_texFaceCheck())
@@ -6631,7 +6747,7 @@ void editing_panels()
editing_panel_links(ob);
editing_panel_curve_type(ob, cu);
editing_panel_modifiers(ob);
-// editing_panel_shapes(ob);
+// editing_panel_shapes(ob); /* there are some backend things that are not ready for this yet */
if(G.obedit) {
editing_panel_curve_tools(ob, cu);
editing_panel_curve_tools1(ob, cu);
diff --git a/source/blender/src/buttons_logic.c b/source/blender/src/buttons_logic.c
index 58fb2d456b9..0dcdc36fdcd 100644
--- a/source/blender/src/buttons_logic.c
+++ b/source/blender/src/buttons_logic.c
@@ -93,9 +93,9 @@
#include "interface.h"
/* internals */
-void buttons_enji(uiBlock *, Object *);
-void buttons_ketsji(uiBlock *, Object *);
-void buttons_bullet(uiBlock *, Object *);
+static void buttons_enji(uiBlock *, Object *);
+static void buttons_ketsji(uiBlock *, Object *);
+static void buttons_bullet(uiBlock *, Object *);
/****/
@@ -1204,42 +1204,44 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short
}
case SENS_KEYBOARD:
{
+ ks= sens->data;
+
/* 5 lines: 120 height */
- ysize= 120;
+ ysize= (ks->type&1) ? 96:120;
glRects(xco, yco-ysize, xco+width, yco);
uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
/* header line */
draw_default_sensor_header(sens, block, xco, yco, width);
- ks= sens->data;
-
- /* line 2: hotkey and allkeys toggle */
- uiDefKeyevtButS(block, B_DIFF, "", xco+40, yco-44, (width)/2, 19, &ks->key, "Key code");
-
- /* line 3: two key modifyers (qual1, qual2) */
- uiDefKeyevtButS(block, B_DIFF, "", xco+40, yco-68, (width-50)/2, 19, &ks->qual, "Modifier key code");
- uiDefKeyevtButS(block, B_DIFF, "", xco+40+(width-50)/2, yco-68, (width-50)/2, 19, &ks->qual2, "Second Modifier key code");
-
- /* labels for line 1 and 2 */
- uiDefBut(block, LABEL, 0, "Key", xco, yco-44, 40, 19, NULL, 0, 0, 0, 0, "");
- uiDefBut(block, LABEL, 0, "Hold", xco, yco-68, 40, 19, NULL, 0, 0, 0, 0, "");
/* part of line 1 */
uiBlockSetCol(block, TH_BUT_SETTING2);
- uiDefButBitS(block, TOG, 1, 0, "All keys", xco+40+(width/2), yco-44, (width/2)-50, 19,
+ uiDefBut(block, LABEL, 0, "Key", xco, yco-44, 40, 19, NULL, 0, 0, 0, 0, "");
+ uiDefButBitS(block, TOG, 1, B_REDR, "All keys", xco+40+(width/2), yco-44, (width/2)-50, 19,
&ks->type, 0, 0, 0, 0, "");
+
+ if ((ks->type&1)==0) { /* is All Keys option off? */
+ /* line 2: hotkey and allkeys toggle */
+ uiDefKeyevtButS(block, B_DIFF, "", xco+40, yco-44, (width)/2, 19, &ks->key, "Key code");
+
+ /* line 3: two key modifyers (qual1, qual2) */
+ uiDefBut(block, LABEL, 0, "Hold", xco, yco-68, 40, 19, NULL, 0, 0, 0, 0, "");
+ uiDefKeyevtButS(block, B_DIFF, "", xco+40, yco-68, (width-50)/2, 19, &ks->qual, "Modifier key code");
+ uiDefKeyevtButS(block, B_DIFF, "", xco+40+(width-50)/2, yco-68, (width-50)/2, 19, &ks->qual2, "Second Modifier key code");
+ }
+
/* line 4: toggle property for string logging mode */
uiDefBut(block, TEX, 1, "LogToggle: ",
- xco+10, yco-92, (width-20), 19,
+ xco+10, yco-((ks->type&1) ? 68:92), (width-20), 19,
ks->toggleName, 0, 31, 0, 0,
"Property that indicates whether to log "
"keystrokes as a string.");
/* line 5: target property for string logging mode */
uiDefBut(block, TEX, 1, "Target: ",
- xco+10, yco-116, (width-20), 19,
+ xco+10, yco-((ks->type&1) ? 92:116), (width-20), 19,
ks->targetName, 0, 31, 0, 0,
"Property that receives the keystrokes in case "
"a string is logged.");
@@ -1314,12 +1316,12 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short
ds = sens->data;
uiDefButS(block, NUM, 0, "Delay",(short)(10+xco),(short)(yco-44),(short)((width-22)*0.4+10), 19,
- &ds->delay, 0.0, 5000.0, 0, 0, "Delay in number of frames before the positive trigger");
+ &ds->delay, 0.0, 5000.0, 0, 0, "Delay in number of logic tics before the positive trigger (default 60 per second)");
uiDefButS(block, NUM, 0, "Dur",(short)(10+xco+(width-22)*0.4+10),(short)(yco-44),(short)((width-22)*0.4-10), 19,
- &ds->duration, 0.0, 5000.0, 0, 0, "If >0, delay in number of frames before the negative trigger following the positive trigger");
+ &ds->duration, 0.0, 5000.0, 0, 0, "If >0, delay in number of logic tics before the negative trigger following the positive trigger");
uiDefButBitS(block, TOG, SENS_DELAY_REPEAT, 0, "REP",(short)(xco + 10 + (width-22)*0.8),(short)(yco - 44),
(short)(0.20 * (width-22)), 19, &ds->flag, 0.0, 0.0, 0, 0,
- "Toggle repeat option. If selected, the sensor restarts after Delay+Dur frames");
+ "Toggle repeat option. If selected, the sensor restarts after Delay+Dur logic tics");
yco-= ysize;
break;
}
@@ -1447,50 +1449,72 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short
joy= sens->data;
- uiDefButS(block, NUM, 1, "Index:", xco+10, yco-44, 0.6 * (width-120), 19,
+ uiDefButC(block, NUM, 1, "Index:", xco+10, yco-44, 0.33 * (width-20), 19,
&joy->joyindex, 0, SENS_JOY_MAXINDEX-1, 100, 0,
"Specify which joystick to use");
str= "Type %t|Button %x0|Axis %x1|Hat%x2";
- uiDefButS(block, MENU, B_REDR, str, xco+87, yco-44, 0.6 * (width-150), 19,
+ uiDefButC(block, MENU, B_REDR, str, xco+87, yco-44, 0.26 * (width-20), 19,
&joy->type, 0, 31, 0, 0,
"The type of event this joystick sensor is triggered on.");
+ if (joy->flag & SENS_JOY_ANY_EVENT) {
+ switch (joy->type) {
+ case SENS_JOY_AXIS:
+ str = "All Axis Events";
+ break;
+ case SENS_JOY_BUTTON:
+ str = "All Button Events";
+ break;
+ default:
+ str = "All Hat Events";
+ break;
+ }
+ } else {
+ str = "All";
+ }
+
+ uiDefButBitS(block, TOG, SENS_JOY_ANY_EVENT, B_REDR, str,
+ xco+10 + 0.475 * (width-20), yco-68, ((joy->flag & SENS_JOY_ANY_EVENT) ? 0.525 : 0.12) * (width-20), 19,
+ &joy->flag, 0, 0, 0, 0,
+ "Triggered by all events on this joysticks current type (axis/button/hat)");
+
if(joy->type == SENS_JOY_BUTTON)
{
- uiDefButI(block, NUM, 1, "Number:", xco+10, yco-68, 0.6 * (width-20), 19,
- &joy->button, 0, 18, 100, 0,
- "Specify which button to use");
-
- str = "Type %t|Pressed %x0|Released %x1";
- uiDefButI(block, MENU, B_REDR, str, xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
- &joy->buttonf, 2.0, 31, 0, 0,
- "Button pressed or released.");
+ if ((joy->flag & SENS_JOY_ANY_EVENT)==0) {
+ uiDefButI(block, NUM, 1, "Number:", xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
+ &joy->button, 0, 18, 100, 0,
+ "Specify which button to use");
+ }
}
else if(joy->type == SENS_JOY_AXIS)
{
- uiDefButI(block, NUM, 1, "Number:", xco+10, yco-68, 0.6 * (width-20), 19,
+ uiDefButI(block, NUM, 1, "Number:", xco+10, yco-68, 0.46 * (width-20), 19,
&joy->axis, 1, 2.0, 100, 0,
- "Specify which axis to use");
+ "Specify which axis pair to use, 1 is useually the main direction input.");
uiDefButI(block, NUM, 1, "Threshold:", xco+10 + 0.6 * (width-20),yco-44, 0.4 * (width-20), 19,
&joy->precision, 0, 32768.0, 100, 0,
"Specify the precision of the axis");
- str = "Type %t|Up Axis %x1 |Down Axis %x3|Left Axis %x2|Right Axis %x0";
- uiDefButI(block, MENU, B_REDR, str, xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
- &joy->axisf, 2.0, 31, 0, 0,
- "The direction of the axis");
+ if ((joy->flag & SENS_JOY_ANY_EVENT)==0) {
+ str = "Type %t|Up Axis %x1 |Down Axis %x3|Left Axis %x2|Right Axis %x0";
+ uiDefButI(block, MENU, B_REDR, str, xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
+ &joy->axisf, 2.0, 31, 0, 0,
+ "The direction of the axis, use 'All Events' to recieve events on any direction");
+ }
}
else
{
- uiDefButI(block, NUM, 1, "Number:", xco+10, yco-68, 0.6 * (width-20), 19,
+ uiDefButI(block, NUM, 1, "Number:", xco+10, yco-68, 0.46 * (width-20), 19,
&joy->hat, 1, 2.0, 100, 0,
"Specify which hat to use");
- uiDefButI(block, NUM, 1, "Direction:", xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
- &joy->hatf, 0, 12, 100, 0,
- "Specify hat direction");
+ if ((joy->flag & SENS_JOY_ANY_EVENT)==0) {
+ uiDefButI(block, NUM, 1, "Direction:", xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
+ &joy->hatf, 0, 12, 100, 0,
+ "Specify hat direction");
+ }
}
yco-= ysize;
break;
@@ -1866,7 +1890,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
{
ia= act->data;
- ysize= 52;
+ ysize= 72;
glRects(xco, yco-ysize, xco+width, yco);
uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
@@ -1915,6 +1939,10 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
"Child", xco+10+(width-80), yco-44, 60, 19,
&ia->flag, 0, 0, 0, 0,
"Update IPO on all children Objects as well");
+ uiDefBut(block, TEX, 0,
+ "FrameProp: ", xco+10, yco-64, width-20, 19,
+ ia->frameProp, 0.0, 31.0, 0, 0,
+ "Assign this property this action current frame number");
yco-= ysize;
break;
@@ -2214,8 +2242,46 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
uiDefButS(block, NUM, 0, "time", xco+10, yco-84, 70, 19, &(coa->time), 0.0, 1000.0, 0, 0, "Maximum activation time in frame, 0 for unlimited");
uiDefButF(block, NUM, 0, "min", xco+80, yco-84, (width-115)/2, 19, &(coa->minloc[0]), 0.0, 180.0, 10, 1, "Minimum angle (in degree) to maintain with target direction. No correction is done if angle with target direction is between min and max");
uiDefButF(block, NUM, 0, "max", xco+80+(width-115)/2, yco-84, (width-115)/2, 19, &(coa->maxloc[0]), 0.0, 180.0, 10, 1, "Maximum angle (in degree) allowed with target direction. No correction is done if angle with target direction is between min and max");
+ } else if (coa->type == ACT_CONST_TYPE_FH) {
+ ysize= 106;
+
+ glRects(xco, yco-ysize, xco+width, yco);
+ uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
+
+ str= "Direction %t|None %x0|X axis %x1|Y axis %x2|Z axis %x4|-X axis %x8|-Y axis %x16|-Z axis %x32";
+ uiDefButS(block, MENU, B_REDR, str, xco+10, yco-65, 70, 19, &coa->mode, 0.0, 0.0, 0, 0, "Set the direction of the ray (in world coordinate)");
+
+ if(coa->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= coa->minloc;
+ else if(coa->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= coa->minloc+1;
+ else fp= coa->minloc+2;
+
+ uiDefButF(block, NUM, 0, "damp", xco+10, yco-45, (width-70)/2, 19, &coa->maxrot[0], 0.0, 1.0, 1, 0, "Damping factor of the Fh spring force");
+ uiDefButF(block, NUM, 0, "dist", xco+10+(width-70)/2, yco-45, (width-70)/2, 19, fp, 0.010, 2000.0, 10, 0, "Height of the Fh area");
+ uiDefButBitS(block, TOG, ACT_CONST_DOROTFH, 0, "Rot Fh", xco+10+(width-70), yco-45, 50, 19, &coa->flag, 0.0, 0.0, 0, 0, "Keep object axis parallel to normal");
+
+ uiDefButF(block, NUMSLI, 0, "Fh ", xco+80, yco-65, (width-115), 19, fp+3, 0.0, 1.0, 0, 0, "Spring force within the Fh area");
+ uiDefButBitS(block, TOG, ACT_CONST_NORMAL, 0, "N", xco+80+(width-115), yco-65, 25, 19,
+ &coa->flag, 0.0, 0.0, 0, 0, "Add a horizontal spring force on slopes");
+ uiDefButBitS(block, TOG, ACT_CONST_MATERIAL, B_REDR, "M/P", xco+10, yco-84, 40, 19,
+ &coa->flag, 0.0, 0.0, 0, 0, "Detect material instead of property");
+ if (coa->flag & ACT_CONST_MATERIAL)
+ {
+ uiDefBut(block, TEX, 1, "Material:", xco + 50, yco-84, (width-60), 19,
+ coa->matprop, 0, 31, 0, 0,
+ "Ray detects only Objects with this material");
+ }
+ else
+ {
+ uiDefBut(block, TEX, 1, "Property:", xco + 50, yco-84, (width-60), 19,
+ coa->matprop, 0, 31, 0, 0,
+ "Ray detect only Objects with this property");
+ }
+ uiDefButBitS(block, TOG, ACT_CONST_PERMANENT, 0, "PER", xco+10, yco-103, 40, 19,
+ &coa->flag, 0.0, 0.0, 0, 0, "Persistent actuator: stays active even if ray does not reach target");
+ uiDefButS(block, NUM, 0, "time", xco+50, yco-103, 90, 19, &(coa->time), 0.0, 1000.0, 0, 0, "Maximum activation time in frame, 0 for unlimited");
+ uiDefButF(block, NUM, 0, "rotDamp", xco+140, yco-103, (width-150), 19, &coa->maxrot[1], 0.0, 1.0, 1, 0, "Use a different damping for rotation");
}
- str= "Constraint Type %t|Location %x0|Distance %x1|Orientation %x2";
+ str= "Constraint Type %t|Location %x0|Distance %x1|Orientation %x2|Force field %x3";
but = uiDefButS(block, MENU, B_REDR, str, xco+40, yco-23, (width-80), 19, &coa->type, 0.0, 0.0, 0, 0, "");
yco-= ysize;
break;
@@ -2523,29 +2589,19 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
case ACT_MESSAGE:
ma = act->data;
-#define MESSAGE_SENSOR_TO_FIELD_WORKS /* Really? Not really. Don't remove this ifdef yet */
-
-#ifdef MESSAGE_SENSOR_TO_FIELD_WORKS
ysize = 4 + (3 * 24); /* footer + number of lines * 24 pixels/line */
-#else
- ysize = 4 + (2 * 24); /* footer + number of lines * 24 pixels/line */
-#endif
+
glRects(xco, yco-ysize, xco+width, yco);
uiEmboss((float)xco, (float)yco-ysize,
(float)xco+width, (float)yco, 1);
myline=1;
-
-#ifdef MESSAGE_SENSOR_TO_FIELD_WORKS
/* line 1: To */
uiDefBut(block, TEX, 1, "To: ",
(xco+10), (yco-(myline++*24)), (width-20), 19,
&ma->toPropName, 0, 31, 0, 0,
- "Optional send message to objects with this name only (Prefix name with OB)"
- ", or empty to broadcast");
-
-#endif
+ "Optional send message to objects with this name only, or empty to broadcast");
/* line 2: Message Subject */
uiDefBut(block, TEX, 1, "Subject: ",
@@ -2812,7 +2868,7 @@ static uiBlock *actuator_menu(void *arg_unused)
}
-void buttons_enji(uiBlock *block, Object *ob)
+static void buttons_enji(uiBlock *block, Object *ob)
{
uiDefButBitI(block, TOG, OB_SECTOR, B_SETSECTOR, "Sector",
10,205,65,19, &ob->gameflag, 0, 0, 0, 0,
@@ -2857,7 +2913,7 @@ void buttons_enji(uiBlock *block, Object *ob)
}
-void buttons_ketsji(uiBlock *block, Object *ob)
+static void buttons_ketsji(uiBlock *block, Object *ob)
{
uiDefButBitI(block, TOG, OB_COLLISION, B_REDR, "Physics",
10,205,70,19, &ob->gameflag, 0, 0, 0, 0,
@@ -2932,6 +2988,10 @@ void buttons_ketsji(uiBlock *block, Object *ob)
&ob->gameflag, 0, 0,0, 0,
"Specify a collision shape bounds type");
if (ob->gameflag & OB_BOUNDS) {
+ /* assume triangle mesh, if no bounds chosen for soft body */
+
+
+
uiDefButS(block, MENU, REDRAWVIEW3D, "Collision Type%t|Box%x0|Sphere%x1|Cylinder%x2|Cone%x3|Convex Hull%x5|Concave TriangleMesh %x4",
85, 105, 160, 19, &ob->boundtype, 0, 0, 0, 0, "Selects the collision type");
uiDefButBitI(block, TOG, OB_CHILD, B_REDR, "Compound", 250,105,100,19,
@@ -2940,6 +3000,7 @@ void buttons_ketsji(uiBlock *block, Object *ob)
}
uiBlockEndAlign(block);
}
+ uiBlockEndAlign(block);
}
}
@@ -2967,9 +3028,12 @@ static void check_body_type(void *arg1_but, void *arg2_object)
case OB_BODY_TYPE_SOFT:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR;
ob->gameflag &= ~(OB_RIGID_BODY);
- ob->gameflag |= OB_BOUNDS;
- if (ob->boundtype<OB_BOUND_POLYH)
+
+ /* assume triangle mesh, if no bounds chosen for soft body */
+ if ((ob->gameflag & OB_BOUNDS) && (ob->boundtype<OB_BOUND_POLYH))
+ {
ob->boundtype=OB_BOUND_POLYH;
+ }
/* create a BulletSoftBody structure if not already existing */
if (!ob->bsoft)
ob->bsoft = bsbNew();
@@ -2981,47 +3045,44 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
{
uiBlock *block;
Object *ob = arg_ob;
- short yco = 105, xco = 0;
-
- /* create a BulletSoftBody structure if not already existing */
- if ((ob->body_type & OB_BODY_TYPE_SOFT) && !ob->bsoft)
- ob->bsoft = bsbNew();
+ short yco = 20, xco = 0;
block= uiNewBlock(&curarea->uiblocks, "advanced_bullet_options", UI_EMBOSS, UI_HELV, curarea->win);
/* use this for a fake extra empy space around the buttons */
- uiDefBut(block, LABEL, 0, "", -5, -10, 255, 140, NULL, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "", -10, -10, 380, 60, NULL, 0, 0, 0, 0, "");
- if (ob->gameflag & OB_SOFT_BODY) {
+ if (ob->gameflag & OB_SOFT_BODY) {
if (ob->bsoft)
{
- xco = 0;
- uiDefButF(block, NUMSLI, 0, "LinStiff ", xco, yco, 238, 19,
- &ob->bsoft->linStiff, 0.0, 1.0, 1, 0,
- "Linear stiffness of the soft body vertex spring");
- yco -= 25;
- xco = 0;
-
- uiDefButBitI(block, TOG, OB_BSB_SHAPE_MATCHING, 0, "Shape matching",
- xco, yco, 118, 19, &ob->bsoft->flag, 0, 0, 0, 0,
- "Enable soft body shape matching goal");
-
- uiDefButBitI(block, TOG, OB_BSB_BENDING_CONSTRAINTS, 0, "Bending Constraints",
- xco+=120, yco, 118, 19, &ob->bsoft->flag, 0, 0, 0, 0,
- "Enable bending constraints");
- yco -= 25;
- xco = 0;
- uiDefButBitI(block, TOG, OB_BSB_COL_CL_RS, 0, "Cluster Col. RS",
- xco, yco, 118, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0,
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, OB_BSB_COL_CL_RS, 0, "Cluster Collision RS",
+ xco, yco, 180, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0,
"Enable cluster collision between soft and rigid body");
- uiDefButBitI(block, TOG, OB_BSB_COL_CL_SS, 0, "Cluster Col. SS",
- xco+=120, yco, 118, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0,
+ uiDefButBitI(block, TOG, OB_BSB_COL_CL_SS, 0, "Cluster Collision SS",
+ xco+=180, yco, 180, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0,
"Enable cluster collision between soft and soft body");
- yco -= 25;
+ yco -= 20;
+ xco = 0;
+ uiDefButI(block, NUM, 0, "Cluster Iter.",
+ xco, yco, 180, 19, &ob->bsoft->numclusteriterations, 1.0, 128.,
+ 0, 0, "Specify the number of cluster iterations");
+ uiDefButI(block, NUM, 0, "Position Iter.",
+ xco+=180, yco, 180, 19, &ob->bsoft->piterations, 0, 10,
+ 0, 0, "Position solver iterations");
+ uiBlockEndAlign(block);
+
+ /*
+ //too complex tweaking, disable for now
+ uiDefButF(block, NUMSLI, REDRAWVIEW3D, "kVC",
+ xco+=80, yco, 80, 19, &ob->bsoft->kVC, 0, 100,
+ 0, 0, "Volume coefficient");
+ */
xco = 0;
/*
+//would be a cool option, like leaves in the wind, need complex tweaking
uiDefButBitI(block, TOG, OB_BSB_AERO_VTWOSIDE, 0, "Aero model",
xco, yco, 118, 19, &ob->bsoft->flag, 0, 0, 0, 0,
"Enable aero model, vertex normals are flipped to match velocity");
@@ -3029,18 +3090,6 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
yco -= 25;
*/
-
-
- /*
- uiDefButF(block, NUMSLI, 0, "AngStiff ", xco, yco, 238, 19,
- &ob->bsoft->angStiff, 0.0, 1.0, 1, 0,
- "Angular stiffness of the soft body vertex spring");
- yco -= 25;
- uiDefButF(block, NUMSLI, 0, "Volume ", xco, yco, 238, 19,
- &ob->bsoft->volume, 0.0, 1.0, 1, 0,
- "Factor of soft body volume preservation");
- */
-
}
} else
@@ -3049,29 +3098,21 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
xco = 0;
- uiDefButBitI(block, TOG, OB_ACTOR, 0, "Sensor actor",
- xco, yco, 118, 19, &ob->gameflag, 0, 0, 0, 0,
- "Objects that are detected by the Near and Radar sensor");
-
- if (ob->gameflag & OB_DYNAMIC) {
- uiDefButBitI(block, TOG, OB_COLLISION_RESPONSE, 0, "No sleeping",
- xco+=120, yco, 118, 19, &ob->gameflag, 0, 0, 0, 0,
- "Disable auto (de)activation");
- }
-
- yco -= 25;
- xco = 0;
if (ob->gameflag & OB_DYNAMIC) {
if (ob->margin < 0.001f)
ob->margin = 0.06f;
uiDefButF(block, NUM, 0, "Margin",
- xco, yco, 118, 19, &ob->margin, 0.001, 1.0, 1, 0,
+ xco, yco, 170, 19, &ob->margin, 0.001, 1.0, 1, 0,
"Collision margin");
} else {
uiDefButF(block, NUM, 0, "Margin",
- xco, yco, 118, 19, &ob->margin, 0.0, 1.0, 1, 0,
+ xco, yco, 170, 19, &ob->margin, 0.0, 1.0, 1, 0,
"Collision margin");
}
+ yco -= 20;
+ xco = 0;
+
+
}
uiBlockSetDirection(block, UI_TOP);
@@ -3079,7 +3120,7 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
return block;
}
-void buttons_bullet(uiBlock *block, Object *ob)
+static void buttons_bullet(uiBlock *block, Object *ob)
{
uiBut *but;
@@ -3092,52 +3133,153 @@ void buttons_bullet(uiBlock *block, Object *ob)
ob->body_type = OB_BODY_TYPE_DYNAMIC;
else if (ob->gameflag & OB_RIGID_BODY)
ob->body_type = OB_BODY_TYPE_RIGID;
- else
+ else {
ob->body_type = OB_BODY_TYPE_SOFT;
+ /* create the structure here because we display soft body buttons in the main panel */
+ if (!ob->bsoft)
+ ob->bsoft = bsbNew();
+ }
+
+ uiBlockBeginAlign(block);
//only enable game soft body if Blender Soft Body exists
but = uiDefButS(block, MENU, REDRAWVIEW3D,
"Object type%t|No collision%x0|Static%x1|Dynamic%x2|Rigid body%x3|Soft body%x4",
- 10, 205, 120, 19, &ob->body_type, 0, 0, 0, 0, "Selects the type of physical representation");
+ 10, 205, 100, 19, &ob->body_type, 0, 0, 0, 0, "Selects the type of physical representation");
uiButSetFunc(but, check_body_type, but, ob);
if (ob->gameflag & OB_COLLISION) {
- uiBlockSetCol(block, TH_BUT_SETTING1);
+ uiDefButBitI(block, TOG, OB_ACTOR, 0, "Actor",
+ 110, 205, 50, 19, &ob->gameflag, 0, 0, 0, 0,
+ "Objects that are detected by the Near and Radar sensor");
+
+
+
+ uiDefButBitI(block, TOG, OB_GHOST, B_REDR, "Ghost",
+ 160,205,50,19,
+ &ob->gameflag, 0, 0, 0, 0,
+ "Objects that don't restitute collisions (like a ghost)");
+
+ //uiBlockSetCol(block, TH_BUT_SETTING1);
uiDefBlockBut(block, advanced_bullet_menu, ob,
"Advanced Settings",
- 200, 205, 150, 20, "Display collision advanced settings");
- uiBlockSetCol(block, TH_BUT_SETTING2);
+ 210, 205, 140, 19, "Display collision advanced settings");
+ //uiBlockSetCol(block, TH_BUT_SETTING2);
+
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, OB_GHOST, 0, "Ghost", 10, 182, 60, 19,
- &ob->gameflag, 0, 0, 0, 0,
- "Objects that don't restitute collisions (like a ghost)");
- if ((ob->gameflag & OB_DYNAMIC) || ((ob->gameflag & OB_BOUNDS) && (ob->boundtype == OB_BOUND_SPHERE))) {
- uiDefButF(block, NUM, REDRAWVIEW3D, "Radius:", 70, 182, 140, 19,
- &ob->inertia, 0.01, 10.0, 10, 2,
- "Bounding sphere radius, not used for other bounding shapes");
- }
if(ob->gameflag & OB_DYNAMIC) {
- uiDefButF(block, NUM, B_DIFF, "Mass:", 210, 182, 140, 19,
- &ob->mass, 0.01, 10000.0, 10, 2,
- "The mass of the Object");
- uiDefButF(block, NUMSLI, B_DIFF, "Damp ", 10, 162, 150, 19,
- &ob->damping, 0.0, 1.0, 10, 0,
- "General movement damping");
- uiDefButF(block, NUMSLI, B_DIFF, "RotDamp ", 160, 162, 190, 19,
- &ob->rdamping, 0.0, 1.0, 10, 0,
- "General rotation damping");
+ if (!(ob->gameflag & OB_SOFT_BODY))
+ {
+
+ uiDefButF(block, NUM, B_DIFF, "Mass:", 10, 185, 130, 19,
+ &ob->mass, 0.01, 10000.0, 10, 2,
+ "The mass of the Object");
+
+ uiDefButF(block, NUM, REDRAWVIEW3D, "Radius:", 140, 185, 130, 19,
+ &ob->inertia, 0.01, 10.0, 10, 2,
+ "Radius for Bounding sphere and Fh/Fh Rot");
+
+ uiDefButBitI(block, TOG, OB_COLLISION_RESPONSE, B_REDR, "No sleeping", 270,185,80,19,
+ &ob->gameflag, 0, 0, 0, 0,
+ "Disable auto (de)activation");
+
+ uiDefButF(block, NUMSLI, B_DIFF, "Damp ", 10, 165, 150, 19,
+ &ob->damping, 0.0, 1.0, 10, 0,
+ "General movement damping");
+ uiDefButF(block, NUMSLI, B_DIFF, "RotDamp ", 160, 165, 190, 19,
+ &ob->rdamping, 0.0, 1.0, 10, 0,
+ "General rotation damping");
+
+ uiDefButBitI(block, TOG, OB_DO_FH, B_DIFF, "Do Fh", 10,145,50,19,
+ &ob->gameflag, 0, 0, 0, 0,
+ "Use Fh settings in Materials");
+ uiDefButBitI(block, TOG, OB_ROT_FH, B_DIFF, "Rot Fh", 60,145,50,19,
+ &ob->gameflag, 0, 0, 0, 0,
+ "Use face normal to rotate Object");
+ /* Form factor is hooked up in Bullet, to scale inertia tensor */
+
+ uiDefButF(block, NUM, B_DIFF, "Form:", 110, 145, 120, 19,
+ &ob->formfactor, 0.01, 100.0, 10, 0,
+ "Form factor scales the inertia tensor");
+ } else {
+ uiDefButF(block, NUM, B_DIFF, "Mass:", 10, 185, 110, 19,
+ &ob->mass, 0.01, 10000.0, 10, 2,
+ "The mass of the Object");
+
+ if (ob->bsoft) {
+ uiDefButBitI(block, TOG, OB_BSB_SHAPE_MATCHING, B_REDR, "Shape Match",
+ 120, 185, 110, 19, &ob->bsoft->flag, 0, 0, 0, 0,
+ "Enable soft body shape matching goal");
+
+ uiDefButBitI(block, TOG, OB_BSB_BENDING_CONSTRAINTS, 0, "Bending Const.",
+ 230, 185, 120, 19, &ob->bsoft->flag, 0, 0, 0, 0,
+ "Enable bending constraints");
+
+ uiDefButF(block, NUMSLI, 0, "LinStiff ", 10, 165, 170, 19,
+ &ob->bsoft->linStiff, 0.0, 1.0, 1, 0,
+ "Linear stiffness of the soft body links");
+
+ uiDefButF(block, NUMSLI, 0, "Friction ",
+ 180, 165, 170, 19, &ob->bsoft->kDF, 0.0, 1.,
+ 0, 0, "Dynamic Friction");
+
+ if (ob->bsoft->flag & OB_BSB_SHAPE_MATCHING) {
+ uiDefButF(block, NUMSLI, 0, "kMT ",
+ 10, 145, 170, 19, &ob->bsoft->kMT, 0, 1,
+ 0, 0, "Shape matching threshold");
+ }
+ }
+ }
+
+ } else {
+ /* static object can also have a sphere bound shape, radius is used */
+ if ((ob->gameflag & OB_BOUNDS) && (ob->boundtype == OB_BOUND_SPHERE)) {
+ uiDefButF(block, NUM, REDRAWVIEW3D, "Radius:", 10, 185, 130, 19,
+ &ob->inertia, 0.01, 10.0, 10, 2,
+ "Radius for Bounding sphere");
+ }
}
+
uiBlockEndAlign(block);
+ /* In Bullet, anisotripic friction can be applied to static objects as well, just not soft bodies */
+
+ if (!(ob->gameflag & OB_SOFT_BODY))
+ {
+ uiDefButBitI(block, TOG, OB_ANISOTROPIC_FRICTION, B_REDR, "Anisotropic",
+ 230, 145, 120, 19,
+ &ob->gameflag, 0.0, 1.0, 10, 0,
+ "Enable anisotropic friction");
+
+ if (ob->gameflag & OB_ANISOTROPIC_FRICTION) {
+ uiDefButF(block, NUM, B_DIFF, "x friction:", 10, 125, 114, 19,
+ &ob->anisotropicFriction[0], 0.0, 1.0, 10, 0,
+ "Relative friction coefficient in the x-direction.");
+ uiDefButF(block, NUM, B_DIFF, "y friction:", 124, 125, 113, 19,
+ &ob->anisotropicFriction[1], 0.0, 1.0, 10, 0,
+ "Relative friction coefficient in the y-direction.");
+ uiDefButF(block, NUM, B_DIFF, "z friction:", 237, 125, 113, 19,
+ &ob->anisotropicFriction[2], 0.0, 1.0, 10, 0,
+ "Relative friction coefficient in the z-direction.");
+ }
+
+
+ }
+
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, OB_BOUNDS, B_REDR, "Bounds", 10, 105, 80, 19,
&ob->gameflag, 0, 0, 0, 0,
"Specify a collision bounds type");
if (ob->gameflag & OB_BOUNDS) {
//only allow convex hull/triangle mesh for soft bodies
+
+ if ((ob->body_type==OB_BODY_TYPE_SOFT) && (ob->gameflag & OB_BOUNDS) && (ob->boundtype<OB_BOUND_POLYH))
+ {
+ ob->boundtype=OB_BOUND_POLYH;
+ }
+
if (ob->body_type==OB_BODY_TYPE_SOFT)
{
uiDefButS(block, MENU, REDRAWVIEW3D, "Collision Bounds%t|Convex Hull%x5|Triangle Mesh%x4",
@@ -3147,12 +3289,19 @@ void buttons_bullet(uiBlock *block, Object *ob)
uiDefButS(block, MENU, REDRAWVIEW3D, "Collision Bounds%t|Box%x0|Sphere%x1|Cylinder%x2|Cone%x3|Convex Hull%x5|Triangle Mesh%x4",
90, 105, 150, 19, &ob->boundtype, 0, 0, 0, 0, "Selects the collision type");
}
- uiDefButBitI(block, TOG, OB_CHILD, B_REDR, "Compound", 240,105,110,19,
- &ob->gameflag, 0, 0, 0, 0,
- "Add Children");
+ if (ob->body_type!=OB_BODY_TYPE_SOFT)
+ {
+ uiDefButBitI(block, TOG, OB_CHILD, B_REDR, "Compound", 240,105,110,19,
+ &ob->gameflag, 0, 0, 0, 0,
+ "Add Children");
+ }
}
+ uiBlockEndAlign(block);
}
+
uiBlockEndAlign(block);
+
+
}
static void check_controller_state_mask(void *arg1_but, void *arg2_mask)
diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c
index 92b0a673c24..6162a12d06d 100644
--- a/source/blender/src/buttons_object.c
+++ b/source/blender/src/buttons_object.c
@@ -152,7 +152,10 @@
#include "BSE_edit.h"
#include "BDR_editobject.h"
+
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "butspace.h" // own module
@@ -643,6 +646,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
}
else {
switch (con->type) {
+#ifndef DISABLE_PYTHON
case CONSTRAINT_TYPE_PYTHON:
{
bPythonConstraint *data = con->data;
@@ -724,6 +728,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
draw_constraint_spaceselect(block, con, *xco, *yco-(73+theight), is_armature_owner(ob), -1);
}
break;
+#endif /* DISABLE_PYTHON */
case CONSTRAINT_TYPE_ACTION:
{
bActionConstraint *data = con->data;
@@ -1497,16 +1502,20 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
int offsetY = 150;
int textButWidth = ((width/2)-togButWidth);
- uiDefButI(block, MENU, B_CONSTRAINT_TEST, "Joint Types%t|Ball%x1|Hinge%x2|Cone Twist%x4|Generic (experimental)%x12",//|Extra Force%x6",
- *xco, *yco-25, 150, 18, &data->type, 0, 0, 0, 0, "Choose the joint type");
height = 140;
if (data->type==CONSTRAINT_RB_GENERIC6DOF)
height = 270;
if (data->type==CONSTRAINT_RB_CONETWIST)
height = 200;
- uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
-
+ uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
+
+ uiDefButI(block, MENU, B_CONSTRAINT_TEST, "Joint Types%t|Ball%x1|Hinge%x2|Cone Twist%x4|Generic (experimental)%x12",//|Extra Force%x6",
+ *xco, *yco-25, 150, 18, &data->type, 0, 0, 0, 0, "Choose the joint type");
+
+ uiDefButBitS(block, TOG, CONSTRAINT_DISABLE_LINKED_COLLISION, B_CONSTRAINT_TEST, "No Col.", *xco+155, *yco-25, 111, 18, &data->flag, 0, 24, 0, 0, "Disable Collision Between Linked Bodies");
+
+
uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "toObject:", *xco, *yco-50, 130, 18, &data->tar, "Child Object");
uiDefButBitS(block, TOG, CONSTRAINT_DRAW_PIVOT, B_CONSTRAINT_TEST, "ShowPivot", *xco+135, *yco-50, 130, 18, &data->flag, 0, 24, 0, 0, "Show pivot position and rotation");
@@ -1586,6 +1595,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[5]), -extremeAngZ, extremeAngZ, 0.1,0.5,"max z limit");
uiBlockEndAlign(block);
}
+
}
break;
case CONSTRAINT_TYPE_CLAMPTO:
@@ -1842,6 +1852,7 @@ void do_constraintbuts(unsigned short event)
case B_CONSTRAINT_TEST:
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
break; // no handling
case B_CONSTRAINT_INF:
/* influence; do not execute actions for 1 dag_flush */
@@ -2050,8 +2061,9 @@ void do_constraintbuts(unsigned short event)
if(ob->type==OB_ARMATURE) DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA|OB_RECALC_OB);
else DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
- allqueue (REDRAWVIEW3D, 0);
- allqueue (REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
}
void pointcache_bake(PTCacheID *pid, int startframe)
@@ -5017,7 +5029,8 @@ static void object_panel_fluidsim(Object *ob)
const int separateHeight = 2;
const int objHeight = 20;
FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim);
- int libdata = 0, val = 0;
+ int libdata = 0;
+ static int val = 0;
uiBut *but=NULL;
block= uiNewBlock(&curarea->uiblocks, "object_fluidsim", UI_EMBOSS, UI_HELV, curarea->win);
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index d430ef0b970..fec7818cdeb 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -1877,7 +1877,12 @@ static char* ffmpeg_format_pup(void)
}
return string;
#endif
- strcpy(formatstring, "FFMpeg format: %%t|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d");
+ strcpy(formatstring, "FFMpeg format: %%t|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d"
+#if 0
+/* ifdef WITH_OGG, disabled, since broken within ffmpeg bundled with blender */
+ "|%s %%x%d"
+#endif
+ "|%s %%x%d");
sprintf(string, formatstring,
"MPEG-1", FFMPEG_MPEG1,
"MPEG-2", FFMPEG_MPEG2,
@@ -1887,6 +1892,10 @@ static char* ffmpeg_format_pup(void)
"DV", FFMPEG_DV,
"H264", FFMPEG_H264,
"XVid", FFMPEG_XVID,
+#if 0
+/* ifdef WITH_OGG, disabled, since broken within ffmpeg bundled with blender */
+ "OGG", FFMPEG_OGG,
+#endif
"FLV", FFMPEG_FLV);
return string;
}
@@ -1911,7 +1920,13 @@ static char* ffmpeg_preset_pup(void)
static char* ffmpeg_codec_pup(void) {
static char string[2048];
char formatstring[2048];
- strcpy(formatstring, "FFMpeg format: %%t|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d");
+ strcpy(formatstring,
+ "FFMpeg format: %%t"
+ "|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d"
+#ifdef WITH_OGG
+ "|%s %%x%d"
+#endif
+ "|%s %%x%d");
sprintf(string, formatstring,
"MPEG1", CODEC_ID_MPEG1VIDEO,
"MPEG2", CODEC_ID_MPEG2VIDEO,
@@ -1920,7 +1935,10 @@ static char* ffmpeg_codec_pup(void) {
"DV", CODEC_ID_DVVIDEO,
"H264", CODEC_ID_H264,
"XVid", CODEC_ID_XVID,
- "FlashVideo1", CODEC_ID_FLV1 );
+#ifdef WITH_OGG
+ "Theora", CODEC_ID_THEORA,
+#endif
+ "FlashVideo1", CODEC_ID_FLV1);
return string;
}
@@ -1928,12 +1946,20 @@ static char* ffmpeg_codec_pup(void) {
static char* ffmpeg_audio_codec_pup(void) {
static char string[2048];
char formatstring[2048];
- strcpy(formatstring, "FFMpeg format: %%t|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d");
+ strcpy(formatstring,
+ "FFMpeg format: %%t|%s %%x%d|%s %%x%d|%s %%x%d"
+#ifdef WITH_OGG
+ "|%s %%x%d"
+#endif
+ "|%s %%x%d");
sprintf(string, formatstring,
"MP2", CODEC_ID_MP2,
"MP3", CODEC_ID_MP3,
"AC3", CODEC_ID_AC3,
"AAC", CODEC_ID_AAC,
+#ifdef WITH_OGG
+ "Vorbis", CODEC_ID_VORBIS,
+#endif
"PCM", CODEC_ID_PCM_S16LE);
return string;
@@ -2929,8 +2955,8 @@ static void render_panel_ffmpeg_video(void)
0, 1, 0,0, "Autosplit output at 2GB boundary.");
- if (ELEM3(G.scene->r.ffcodecdata.type, FFMPEG_AVI,
- FFMPEG_MOV, FFMPEG_MKV)) {
+ if (ELEM4(G.scene->r.ffcodecdata.type, FFMPEG_AVI,
+ FFMPEG_MOV, FFMPEG_MKV, FFMPEG_OGG)) {
uiDefBut(block, LABEL, 0, "Codec",
xcol1, yofs-44, 110, 20, 0, 0, 0, 0, 0, "");
uiDefButI(block, MENU,B_REDR, ffmpeg_codec_pup(),
diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c
index 2fdd1ba2f50..5687651a6c5 100644
--- a/source/blender/src/buttons_shading.c
+++ b/source/blender/src/buttons_shading.c
@@ -862,7 +862,9 @@ static void image_unlink_cb(void *ima_pp_v, void *unused)
if(ima_pp && *ima_pp) {
Image *ima= *ima_pp;
- ima->id.us--;
+ /* (for time being, texturefaces are no users, conflict in design...) */
+ if(ima->id.us>1)
+ ima->id.us--;
*ima_pp= NULL;
}
}
@@ -2428,6 +2430,7 @@ void do_lampbuts(unsigned short event)
case B_SHADBUF:
la= G.buts->lockpoin;
la->mode &= ~LA_SHAD_RAY;
+ BIF_preview_changed(ID_LA);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWVIEW3D, 0);
break;
@@ -2437,6 +2440,7 @@ void do_lampbuts(unsigned short event)
/* yafray: 'softlight' uses it's own shadbuf. flag.
Must be cleared here too when switching from ray shadow */
la->mode &= ~LA_YF_SOFT;
+ BIF_preview_changed(ID_LA);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWVIEW3D, 0);
break;
@@ -2722,47 +2726,50 @@ static void lamp_panel_spot(Object *ob, Lamp *la)
}
}
- if(ELEM4(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL) && (la->mode & LA_SHAD_RAY)) {
-
- if (ELEM3(la->type, LA_SPOT, LA_SUN, LA_LOCAL)) {
- if (la->ray_samp_method == LA_SAMP_CONSTANT) la->ray_samp_method = LA_SAMP_HALTON;
-
- uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2",
- 100,110,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower");
+ if(ELEM4(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL)) {
- uiDefButF(block, NUM,B_LAMPREDRAW,"Soft Size", 100,80,200,19, &la->area_size, 0.01, 100.0, 10, 0, "Area light size, doesn't affect energy amount");
+ if(la->mode & LA_SHAD_RAY) {
+ if (ELEM3(la->type, LA_SPOT, LA_SUN, LA_LOCAL)) {
+ if (la->ray_samp_method == LA_SAMP_CONSTANT) la->ray_samp_method = LA_SAMP_HALTON;
- uiDefButS(block, NUM,0,"Samples:", 100,60,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
- if (la->ray_samp_method == LA_SAMP_HALTON)
- uiDefButF(block, NUM,0,"Threshold:", 100,40,200,19, &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
+ uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2",
+ 100,110,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower");
+
+ uiDefButF(block, NUM,B_LAMPREDRAW,"Soft Size", 100,80,200,19, &la->area_size, 0.01, 100.0, 10, 0, "Area light size, doesn't affect energy amount");
+
+ uiDefButS(block, NUM,0,"Samples:", 100,60,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
+ if (la->ray_samp_method == LA_SAMP_HALTON)
+ uiDefButF(block, NUM,0,"Threshold:", 100,40,200,19, &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
+ }
+ else if (la->type == LA_AREA) {
+ uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2|Constant Jittered %x0",
+ 100,180,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest");
+
+ if (la->ray_samp_method == LA_SAMP_CONSTANT) {
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, LA_SAMP_UMBRA, 0,"Umbra", 100,90,200,19,&la->ray_samp_type, 0, 0, 0, 0, "Emphasis parts that are fully shadowed");
+ uiDefButBitS(block, TOG, LA_SAMP_DITHER, 0,"Dither", 100,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use 2x2 dithering for sampling");
+ uiDefButBitS(block, TOG, LA_SAMP_JITTER, 0,"Noise", 200,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use noise for sampling");
+ uiBlockEndAlign(block);
+ } else if (la->ray_samp_method == LA_SAMP_HALTON) {
+ uiDefButF(block, NUM,0,"Threshold:", 100,90,200,19, &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
+ }
+ }
}
- else if (la->type == LA_AREA) {
- uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2|Constant Jittered %x0",
- 100,180,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest");
-
+ /* also for non-shadow case, it's using light samples */
+ if(la->type == LA_AREA) {
if(la->area_shape==LA_AREA_SQUARE)
uiDefButS(block, NUM,0,"Samples:", 100,150,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
else if(la->area_shape==LA_AREA_CUBE)
uiDefButS(block, NUM,0,"Samples:", 100,130,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp x samp)");
-
+
if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_BOX)) {
uiDefButS(block, NUM,0,"SamplesX:", 100,150,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of X samples taken extra");
uiDefButS(block, NUM,0,"SamplesY:", 100,130,200,19, &la->ray_sampy, 1.0, 16.0, 100, 0, "Sets the amount of Y samples taken extra");
if(la->area_shape==LA_AREA_BOX)
uiDefButS(block, NUM,0,"SamplesZ:", 100,110,200,19, &la->ray_sampz, 1.0, 8.0, 100, 0, "Sets the amount of Z samples taken extra");
}
-
- if (la->ray_samp_method == LA_SAMP_CONSTANT) {
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LA_SAMP_UMBRA, 0,"Umbra", 100,90,200,19,&la->ray_samp_type, 0, 0, 0, 0, "Emphasis parts that are fully shadowed");
- uiDefButBitS(block, TOG, LA_SAMP_DITHER, 0,"Dither", 100,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use 2x2 dithering for sampling");
- uiDefButBitS(block, TOG, LA_SAMP_JITTER, 0,"Noise", 200,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use noise for sampling");
- } else if (la->ray_samp_method == LA_SAMP_HALTON) {
- uiDefButF(block, NUM,0,"Threshold:", 100,90,200,19, &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
- }
- }
-
-
+ }
}
else uiDefBut(block, LABEL,0," ", 100,180,200,19,NULL, 0, 0, 0, 0, "");
@@ -2890,23 +2897,29 @@ static void lamp_panel_atmosphere(Object *ob, Lamp *la)
uiDefButS(block, MENU, B_LAMPPRV, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Overlay %x9|Divide %x5|Difference %x6|Darken %x7|Lighten %x8|Dodge %x10|Burn %x11|Color %x15|Value %x14|Saturation %x13|Hue %x12",
10,y-25,BUTW2/2,19,
&la->skyblendtype, 0.0f, 0.0f, 0, 0, "Blend type for how it gets combined with sky");
- uiDefButF(block, NUM, B_LAMPPRV, "",10+BUTW2/2,y-25,BUTW2/2,19, &(la->skyblendfac), 0.0f, 1.0f, 10, 0, "Sets blending factor with sky color");
- uiBlockEndAlign(block);
+ uiDefButF(block, NUM, B_LAMPPRV, "",10+BUTW2/2,y-25,BUTW2/2,19, &(la->skyblendfac), 0.0f, 2.0f, 10, 0, "Sets blending factor with sky color");
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, MENU, B_LAMPPRV, "SMPTE %x0|REC709 %x1|CIE %x2",
+ 10,126,60,22, &la->sky_colorspace, 0.0f, 0.0f, 0, 0, "Color space");
- y -= 25;
- uiDefButF(block, NUM, B_LAMPPRV, "Hor.Bright:",10,y-25,BUTW2,19, &(la->horizon_brightness), 0.00f, 20.00f, 10, 0, "Sets horizon brightness.");
- uiDefButF(block, NUM, B_LAMPPRV, "Hor.Spread:",10,y-50,BUTW2,19, &(la->spread), 0.00f, 10.00f, 10, 0, "Sets horizon spread.");
- uiDefButF(block, NUM, B_LAMPPRV, "Sun Bright:",10,y-75,BUTW2,19, &(la->sun_brightness), 0.00f, 10.0f, 10, 0, "Sets sun brightness.");
- uiDefButF(block, NUM, B_LAMPPRV, "Sun Size:",10,y-100,BUTW2,19, &(la->sun_size), 0.00f, 10.00f, 10, 0, "Sets sun size.");
- uiDefButF(block, NUM, B_LAMPPRV, "Back Light:",10,y-125,BUTW2,19, &(la->backscattered_light), -1.00f, 1.00f, 10, 0, "Sets backscatter light.");
+ uiDefButF(block, NUM, B_LAMPPRV, "Exp:",70,126,BUTW2-60,22, &(la->sky_exposure), 0.00f, 20.00f, 10, 0, "Exposure correction, zero is no correction.");
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_LAMPPRV, "Hor.Bright:",10,98,BUTW2,22, &(la->horizon_brightness), 0.00f, 20.00f, 10, 0, "Sets horizon brightness.");
+ uiDefButF(block, NUM, B_LAMPPRV, "Hor.Spread:",10,76,BUTW2,22, &(la->spread), 0.00f, 10.00f, 10, 0, "Sets horizon spread.");
+ uiDefButF(block, NUM, B_LAMPPRV, "Sun Bright:",10,54,BUTW2,22, &(la->sun_brightness), 0.00f, 10.0f, 10, 0, "Sets sun brightness.");
+ uiDefButF(block, NUM, B_LAMPPRV, "Sun Size:",10,32,BUTW2,22, &(la->sun_size), 0.00f, 10.00f, 10, 0, "Sets sun size.");
+ uiDefButF(block, NUM, B_LAMPPRV, "Back Light:",10,10,BUTW2,22, &(la->backscattered_light), -1.00f, 1.00f, 10, 0, "Sets backscatter light.");
}
if(la->sun_effect_type & LA_SUN_EFFECT_AP)
{
- uiDefButF(block, NUM, B_LAMPREDRAW, "Sun Intens.:",20+BUTW2,y-25,BUTW2,19, &(la->sun_intensity), 0.00f, 10.00f, 10, 0, "Sets sun intensity.");
- uiDefButF(block, NUM, B_LAMPREDRAW, "Inscattering:",20+BUTW2,y-50,BUTW2,19, &(la->atm_inscattering_factor), 0.00f, 1.00f, 10, 0, "In Scattering Contribution Factor.");
- uiDefButF(block, NUM, B_LAMPREDRAW, "Extinction:",20+BUTW2,y-75,BUTW2,19, &(la->atm_extinction_factor), 0.00f, 1.00f, 10, 0, "Extinction Scattering Contribution Factor.");
- uiDefButF(block, NUM, B_LAMPREDRAW, "Distance:",20+BUTW2,y-100,BUTW2,19, &(la->atm_distance_factor), 0.000f, 500.0f, 10, 0, "Scale blender distance to real distance.");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_LAMPREDRAW, "Sun Intens.:",20+BUTW2,76,BUTW2,22, &(la->sun_intensity), 0.00f, 10.00f, 10, 0, "Sets sun intensity.");
+ uiDefButF(block, NUM, B_LAMPREDRAW, "Inscattering:",20+BUTW2,54,BUTW2,22, &(la->atm_inscattering_factor), 0.00f, 1.00f, 10, 0, "In Scattering Contribution Factor.");
+ uiDefButF(block, NUM, B_LAMPREDRAW, "Extinction:",20+BUTW2,32,BUTW2,22, &(la->atm_extinction_factor), 0.00f, 1.00f, 10, 0, "Extinction Scattering Contribution Factor.");
+ uiDefButF(block, NUM, B_LAMPREDRAW, "Distance:",20+BUTW2,10,BUTW2,22, &(la->atm_distance_factor), 0.000f, 500.0f, 10, 0, "Scale blender distance to real distance.");
}
}
diff --git a/source/blender/src/drawaction.c b/source/blender/src/drawaction.c
index 64e85bfcd4e..0d7a720dd1e 100644
--- a/source/blender/src/drawaction.c
+++ b/source/blender/src/drawaction.c
@@ -122,7 +122,7 @@ static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
* correctly *grumble*
*/
mywinset(curarea->win);
- myortho2(-0.375, curarea->winx-0.375, G.v2d->cur.ymin, G.v2d->cur.ymax);
+ myortho2(-0.375f, curarea->winx-0.375f, G.v2d->cur.ymin, G.v2d->cur.ymax);
sprintf(str, "actionbuttonswin %d", curarea->win);
block= uiNewBlock (&curarea->uiblocks, str, UI_EMBOSS, UI_HELV, curarea->win);
@@ -133,7 +133,7 @@ static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
/* make the little 'open the sliders' widget */
// should eventually be removed
BIF_ThemeColor(TH_FACE); // this slot was open... (???... Aligorith)
- glRects(2, y + 2*CHANNELHEIGHT - 2, ACTWIDTH - 2, y + CHANNELHEIGHT + 2);
+ glRects(2, (short)y + 2*CHANNELHEIGHT - 2, ACTWIDTH - 2, (short)y + CHANNELHEIGHT + 2);
glColor3ub(0, 0, 0);
glRasterPos2f(4, y + CHANNELHEIGHT + 6);
BMF_DrawString(G.font, "Sliders");
@@ -144,7 +144,7 @@ static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
ACTWIDTH = NAMEWIDTH;
but=uiDefIconButBitS(block, TOG, SACTION_SLIDERS, B_REDR,
ICON_DISCLOSURE_TRI_RIGHT,
- NAMEWIDTH - XIC - 5, y + CHANNELHEIGHT,
+ NAMEWIDTH - XIC - 5, (short)y + CHANNELHEIGHT,
XIC,YIC-2,
&(G.saction->flag), 0, 0, 0, 0,
"Show action window sliders");
@@ -155,28 +155,28 @@ static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
else {
but= uiDefIconButBitS(block, TOG, SACTION_SLIDERS, B_REDR,
ICON_DISCLOSURE_TRI_DOWN,
- NAMEWIDTH - XIC - 5, y + CHANNELHEIGHT,
+ NAMEWIDTH - XIC - 5, (short)y + CHANNELHEIGHT,
XIC,YIC-2,
&(G.saction->flag), 0, 0, 0, 0,
"Hide action window sliders");
/* no hilite, the winmatrix is not correct later on... */
uiButSetFlag(but, UI_NO_HILITE);
-
+
ACTWIDTH = NAMEWIDTH + SLIDERWIDTH;
-
+
/* sliders are open so draw them */
BIF_ThemeColor(TH_FACE);
-
+
glRects(NAMEWIDTH, 0, NAMEWIDTH+SLIDERWIDTH, curarea->winy);
uiBlockSetEmboss(block, UI_EMBOSS);
for (i=1; i < key->totkey; i++) {
make_rvk_slider(block, ob, i,
- x, y, SLIDERWIDTH-2, CHANNELHEIGHT-1, "Slider to control Shape Keys");
+ (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-1, "Slider to control Shape Keys");
y-=CHANNELHEIGHT+CHANNELSKIP;
/* see sliderval array in editkey.c */
- if(i >= 255) break;
+ if (i >= 255) break;
}
}
uiDrawBlock(block);
@@ -294,7 +294,7 @@ static void action_icu_buts(SpaceAction *saction)
* correctly *grumble*
*/
mywinset(curarea->win);
- myortho2(-0.375, curarea->winx-0.375, G.v2d->cur.ymin, G.v2d->cur.ymax);
+ myortho2(-0.375f, curarea->winx-0.375f, G.v2d->cur.ymin, G.v2d->cur.ymax);
sprintf(str, "actionbuttonswin %d", curarea->win);
block= uiNewBlock (&curarea->uiblocks, str,
@@ -318,7 +318,7 @@ static void action_icu_buts(SpaceAction *saction)
/* draw backdrop first */
BIF_ThemeColor(TH_FACE); // change this color... it's ugly
- glRects(NAMEWIDTH, G.v2d->cur.ymin, NAMEWIDTH+SLIDERWIDTH, G.v2d->cur.ymax);
+ glRects(NAMEWIDTH, (short)G.v2d->cur.ymin, NAMEWIDTH+SLIDERWIDTH, (short)G.v2d->cur.ymax);
uiBlockSetEmboss(block, UI_EMBOSS);
for (ale= act_data.first; ale; ale= ale->next) {
@@ -339,7 +339,7 @@ static void action_icu_buts(SpaceAction *saction)
/* only show if action channel is selected */
if (SEL_ACHAN(achan)) {
make_icu_slider(block, icu,
- x, y, SLIDERWIDTH-2, CHANNELHEIGHT-2,
+ (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-2,
"Slider to control current value of Constraint Influence");
}
}
@@ -352,7 +352,7 @@ static void action_icu_buts(SpaceAction *saction)
/* only show if action channel is selected */
if (SEL_ACHAN(achan)) {
make_icu_slider(block, icu,
- x, y, SLIDERWIDTH-2, CHANNELHEIGHT-2,
+ (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-2,
"Slider to control current value of IPO-Curve");
}
}
@@ -383,7 +383,7 @@ void draw_cfra_action (void)
float vec[2];
/* Draw a light green line to indicate current frame */
- vec[0]= (G.scene->r.cfra);
+ vec[0]= (float)(G.scene->r.cfra);
vec[0]*= G.scene->r.framelen;
vec[1]= G.v2d->cur.ymin;
@@ -647,7 +647,7 @@ static void draw_channel_names(void)
case SPACE_VIEW3D:
{
/* this shouldn't cause any overflow... */
- sprintf(name, "3DView: %s", view3d_get_name(sa->spacedata.first));
+ sprintf(name, "3DView[%02d]:%s", sa->win, view3d_get_name(sa->spacedata.first));
special= ICON_VIEW3D;
}
break;
@@ -660,7 +660,7 @@ static void draw_channel_names(void)
sprintf(treetype, "Composite");
else
sprintf(treetype, "Material");
- sprintf(name, "Nodes: %s", treetype);
+ sprintf(name, "Nodes[%02d]:%s", sa->win, treetype);
special= ICON_NODE;
}
@@ -678,7 +678,7 @@ static void draw_channel_names(void)
default: sprintf(imgpreview, "Sequence"); break;
}
- sprintf(name, "Sequencer: %s", imgpreview);
+ sprintf(name, "Sequencer[%02d]:%s", sa->win, imgpreview);
special= ICON_SEQUENCE;
}
@@ -688,9 +688,9 @@ static void draw_channel_names(void)
SpaceImage *sima= sa->spacedata.first;
if (sima->image)
- sprintf(name, "Image: %s", sima->image->id.name+2);
+ sprintf(name, "Image[%02d]:%s", sa->win, sima->image->id.name+2);
else
- sprintf(name, "Image: <None>");
+ sprintf(name, "Image[%02d]:<None>", sa->win);
special= ICON_IMAGE_COL;
}
@@ -698,7 +698,7 @@ static void draw_channel_names(void)
default:
{
- sprintf(name, "<Unknown GP-Data Source>");
+ sprintf(name, "[%02d]<Unknown GP-Data Source>", sa->win);
special= -1;
}
break;
@@ -820,13 +820,13 @@ static void draw_channel_names(void)
/* draw protect 'lock' */
if (protect > -1) {
offset = 16;
- BIF_icon_draw(NAMEWIDTH-offset, yminc, protect);
+ BIF_icon_draw((float)NAMEWIDTH-offset, yminc, protect);
}
/* draw mute 'eye' */
if (mute > -1) {
offset += 16;
- BIF_icon_draw(NAMEWIDTH-offset, yminc, mute);
+ BIF_icon_draw((float)(NAMEWIDTH-offset), yminc, mute);
}
}
@@ -838,7 +838,7 @@ static void draw_channel_names(void)
BLI_freelistN(&act_data);
/* re-adjust view matrices for correct scaling */
- myortho2(0, NAMEWIDTH, 0, (ofsy+G.v2d->mask.ymax) - (ofsy+G.v2d->mask.ymin)); // Scaling
+ myortho2(0, NAMEWIDTH, 0, (float)(ofsy+G.v2d->mask.ymax) - (ofsy+G.v2d->mask.ymin)); // Scaling
}
/* sets or clears hidden flags */
@@ -969,7 +969,7 @@ static void draw_channel_strips(void)
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
}
- glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
+ glRectf((float)frame1_x, (float)channel_y-CHANNELHEIGHT/2, (float)G.v2d->hor.xmax, (float)channel_y+CHANNELHEIGHT/2);
if (ale->datatype == ALE_GROUP) {
if (sel) glColor4ub(col1a[0], col1a[1], col1a[2], 0x22);
@@ -979,7 +979,7 @@ static void draw_channel_strips(void)
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
}
- glRectf(act_start, channel_y-CHANNELHEIGHT/2, act_end, channel_y+CHANNELHEIGHT/2);
+ glRectf((float)act_start, (float)channel_y-CHANNELHEIGHT/2, (float)act_end, (float)channel_y+CHANNELHEIGHT/2);
}
else if (datatype == ACTCONT_SHAPEKEY) {
gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
@@ -988,11 +988,11 @@ static void draw_channel_strips(void)
* get a desaturated orange background
*/
glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(0, channel_y-CHANNELHEIGHT/2, frame1_x, channel_y+CHANNELHEIGHT/2);
+ glRectf(0.0f, (float)channel_y-CHANNELHEIGHT/2, (float)frame1_x, (float)channel_y+CHANNELHEIGHT/2);
/* frames one and higher get a saturated orange background */
glColor4ub(col2[0], col2[1], col2[2], 0x44);
- glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
+ glRectf((float)frame1_x, (float)channel_y-CHANNELHEIGHT/2, (float)G.v2d->hor.xmax, (float)channel_y+CHANNELHEIGHT/2.0f);
}
else if (datatype == ACTCONT_GPENCIL) {
gla2DDrawTranslatePt(di, G.v2d->cur.xmin, y, &frame1_x, &channel_y);
@@ -1000,12 +1000,12 @@ static void draw_channel_strips(void)
/* frames less than one get less saturated background */
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(0, channel_y-CHANNELHEIGHT/2, frame1_x, channel_y+CHANNELHEIGHT/2);
+ glRectf(0.0f, (float)channel_y-CHANNELHEIGHT/2, (float)frame1_x, (float)channel_y+CHANNELHEIGHT/2);
/* frames one and higher get a saturated background */
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x44);
else glColor4ub(col2[0], col2[1], col2[2], 0x44);
- glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
+ glRectf((float)frame1_x, (float)channel_y-CHANNELHEIGHT/2, (float)G.v2d->hor.xmax, (float)channel_y+CHANNELHEIGHT/2);
}
}
@@ -1061,8 +1061,8 @@ static void draw_channel_strips(void)
cpack(0x0);
glBegin(GL_LINES);
- glVertex2f(frame1_x, G.v2d->mask.ymin - 100);
- glVertex2f(frame1_x, G.v2d->mask.ymax);
+ glVertex2f((float)frame1_x, (float)G.v2d->mask.ymin - 100);
+ glVertex2f((float)frame1_x, (float)G.v2d->mask.ymax);
glEnd();
}
@@ -1220,7 +1220,6 @@ void drawactionspace(ScrArea *sa, void *spacedata)
{
bAction *act = NULL;
Key *key = NULL;
- bGPdata *gpd = NULL;
void *data;
short datatype;
@@ -1259,7 +1258,7 @@ void drawactionspace(ScrArea *sa, void *spacedata)
key = data;
break;
case ACTCONT_GPENCIL:
- gpd = data;
+ /* currently, 'data' value for grease-pencil is G.curscreen! */
break;
}
@@ -1336,7 +1335,7 @@ void drawactionspace(ScrArea *sa, void *spacedata)
/* Draw scroll */
mywinset(curarea->win); // reset scissor too
if (curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
- myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
+ myortho2(-0.375f, curarea->winx-0.375f, -0.375f, curarea->winy-0.375f);
if (G.v2d->scroll) drawscroll(0);
}
@@ -1362,7 +1361,7 @@ void drawactionspace(ScrArea *sa, void *spacedata)
}
mywinset(curarea->win); // reset scissor too
- myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
+ myortho2(-0.375f, curarea->winx-0.375f, -0.375f, curarea->winy-0.375f);
draw_area_emboss(sa);
/* it is important to end a view in a transform compatible with buttons */
@@ -1585,7 +1584,7 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
BIF_ThemeColor4(TH_STRIP_SELECT);
else
BIF_ThemeColor4(TH_STRIP);
- glRectf(sc_xa, sc_ya-3, sc_xb, sc_yb+5);
+ glRectf((float)sc_xa, (float)sc_ya-3, (float)sc_xb, (float)sc_yb+5);
}
}
}
@@ -1599,8 +1598,8 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
gla2DDrawTranslatePt(di, ak->cfra, ypos, &sc_x, &sc_y);
/* draw using icons - old way which is slower but more proven */
- if(ak->sel & SELECT) BIF_icon_draw_aspect(sc_x-7, sc_y-6, ICON_SPACE2, 1.0f);
- else BIF_icon_draw_aspect(sc_x-7, sc_y-6, ICON_SPACE3, 1.0f);
+ if (ak->sel & SELECT) BIF_icon_draw_aspect((float)sc_x-7, (float)sc_y-6, ICON_SPACE2, 1.0f);
+ else BIF_icon_draw_aspect((float)sc_x-7, (float)sc_y-6, ICON_SPACE3, 1.0f);
/* draw using OpenGL - slightly uglier but faster */
// NOTE: disabled for now, as some intel cards seem to have problems with this
@@ -1869,7 +1868,7 @@ void gpl_to_keylist(bGPDlayer *gpl, ListBase *keys, ListBase *blocks, ActKeysInc
ak= MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumn");
BLI_addtail(keys, ak);
- ak->cfra= gpf->framenum;
+ ak->cfra= (float)gpf->framenum;
ak->modified = 1;
ak->handle_type= 0;
diff --git a/source/blender/src/drawarmature.c b/source/blender/src/drawarmature.c
index c37eaf7986c..2d41e01f7e4 100644
--- a/source/blender/src/drawarmature.c
+++ b/source/blender/src/drawarmature.c
@@ -1301,7 +1301,7 @@ static void pchan_draw_IK_root_lines(bPoseChannel *pchan, short only_temp)
bPoseChannel *parchan;
for (con= pchan->constraints.first; con; con= con->next) {
- if (con->type == CONSTRAINT_TYPE_KINEMATIC) {
+ if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0)) {
bKinematicConstraint *data = (bKinematicConstraint*)con->data;
int segcount= 0;
@@ -2506,7 +2506,7 @@ int draw_armature(Base *base, int dt, int flag)
bArmature *arm= ob->data;
int retval= 0;
- if(G.f & G_SIMULATION)
+ if(G.f & G_RENDER_SHADOW)
return 1;
if(dt>OB_WIRE && arm->drawtype!=ARM_LINE) {
@@ -2573,3 +2573,4 @@ int draw_armature(Base *base, int dt, int flag)
/* *************** END Armature drawing ******************* */
+
diff --git a/source/blender/src/drawgpencil.c b/source/blender/src/drawgpencil.c
index fb21d94f39a..1b3d869b2f8 100644
--- a/source/blender/src/drawgpencil.c
+++ b/source/blender/src/drawgpencil.c
@@ -1,5 +1,5 @@
/**
- * $Id: drawgpencil.c 14881 2008-05-18 10:41:42Z aligorith $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -80,7 +80,7 @@
#include "blendef.h"
#include "butspace.h"
-#include "PIL_time.h" /* sleep */
+#include "PIL_time.h"
#include "mydevice.h"
/* ************************************************** */
@@ -187,7 +187,7 @@ static void gp_drawui_layer (uiBlock *block, bGPdata *gpd, bGPDlayer *gpl, short
/* rounded header */
if (active) uiBlockSetCol(block, TH_BUT_ACTION);
rb_col= (active)?-20:20;
- uiDefBut(block, ROUNDBOX, B_REDR, "", *xco-8, *yco-2, width, 24, NULL, 5.0, 0.0, 15 , rb_col-20, "");
+ uiDefBut(block, ROUNDBOX, B_REDR, "", *xco-8, *yco-2, width, 24, NULL, 5.0, 0.0, 15.0, (float)(rb_col-20), "");
if (active) uiBlockSetCol(block, TH_AUTO);
/* lock toggle */
@@ -243,7 +243,7 @@ static void gp_drawui_layer (uiBlock *block, bGPdata *gpd, bGPDlayer *gpl, short
/* draw backdrop */
if (active) uiBlockSetCol(block, TH_BUT_ACTION);
- uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-8, *yco-height, width, height-1, NULL, 5.0, 0.0, 12, rb_col, "");
+ uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-8, *yco-height, width, height-1, NULL, 5.0, 0.0, 12.0, (float)rb_col, "");
if (active) uiBlockSetCol(block, TH_AUTO);
/* draw settings */
@@ -251,7 +251,7 @@ static void gp_drawui_layer (uiBlock *block, bGPdata *gpd, bGPDlayer *gpl, short
/* color */
uiBlockBeginAlign(block);
uiDefButF(block, COL, B_REDR, "", *xco, *yco-26, 150, 19, gpl->color, 0, 0, 0, 0, "Color to use for all strokes on this Grease Pencil Layer");
- uiDefButF(block, NUMSLI, B_REDR, "Opacity: ", *xco,*yco-45,150,19, &gpl->color[3], 0.3, 1.0, 0, 0, "Visibility of stroke (0.3 to 1.0)");
+ uiDefButF(block, NUMSLI, B_REDR, "Opacity: ", *xco,*yco-45,150,19, &gpl->color[3], 0.3f, 1.0f, 0, 0, "Visibility of stroke (0.3 to 1.0)");
uiBlockEndAlign(block);
/* stroke thickness */
@@ -433,13 +433,18 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
co[1]= (points->y / 1000 * winy);
}
- /* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, simple opengl point will do */
- if (thickness < GP_DRAWTHICKNESS_SPECIAL) {
+ /* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, simple dot looks ok
+ * - also mandatory in if Image Editor 'image-based' dot
+ */
+ if ( (thickness < GP_DRAWTHICKNESS_SPECIAL) ||
+ ((curarea->spacetype==SPACE_IMAGE) && (sflag & GP_STROKE_2DSPACE)) )
+ {
glBegin(GL_POINTS);
glVertex2fv(co);
glEnd();
}
- else {
+ else
+ {
/* draw filled circle as is done in circf (but without the matrix push/pops which screwed things up) */
GLUquadricObj *qobj = gluNewQuadric();
@@ -447,7 +452,7 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
/* need to translate drawing position, but must reset after too! */
glTranslatef(co[0], co[1], 0.);
- gluDisk( qobj, 0.0, thickness, 32, 1);
+ gluDisk(qobj, 0.0, thickness, 32, 1);
glTranslatef(-co[0], -co[1], 0.);
gluDeleteQuadric(qobj);
@@ -495,7 +500,7 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
short debug, int offsx, int offsy, int winx, int winy)
{
/* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, 'smooth' opengl lines look better
- * - but NOT if Image Editor 'image-based' stroke
+ * - 'smooth' opengl lines are also required if Image Editor 'image-based' stroke
*/
if ( (thickness < GP_DRAWTHICKNESS_SPECIAL) ||
((curarea->spacetype==SPACE_IMAGE) && (dflag & GP_DRAWDATA_ONLYV2D)) )
@@ -524,7 +529,9 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
glEnd();
}
- /* tesselation code: currently only enabled with rt != 0 */
+ /* tesselation code - draw stroke as series of connected quads with connection
+ * edges rotated to minimise shrinking artifacts, and rounded endcaps
+ */
else
{
bGPDspoint *pt1, *pt2;
@@ -574,10 +581,10 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
/* draw start cap first
* - make points slightly closer to center (about halfway across)
*/
- mt[0]= m2[0] * pthick * 0.5;
- mt[1]= m2[1] * pthick * 0.5;
- sc[0]= s0[0] - (m1[0] * pthick * 0.75);
- sc[1]= s0[1] - (m1[1] * pthick * 0.75);
+ mt[0]= m2[0] * pthick * 0.5f;
+ mt[1]= m2[1] * pthick * 0.5f;
+ sc[0]= s0[0] - (m1[0] * pthick * 0.75f);
+ sc[1]= s0[1] - (m1[1] * pthick * 0.75f);
t0[0]= sc[0] - mt[0];
t0[1]= sc[1] - mt[1];
@@ -663,10 +670,10 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
/* draw end cap as last step
* - make points slightly closer to center (about halfway across)
*/
- mt[0]= m2[0] * pthick * 0.5;
- mt[1]= m2[1] * pthick * 0.5;
- sc[0]= s1[0] + (m1[0] * pthick * 0.75);
- sc[1]= s1[1] + (m1[1] * pthick * 0.75);
+ mt[0]= m2[0] * pthick * 0.5f;
+ mt[1]= m2[1] * pthick * 0.5f;
+ sc[0]= s1[0] + (m1[0] * pthick * 0.75f);
+ sc[1]= s1[1] + (m1[1] * pthick * 0.75f);
t0[0]= sc[0] - mt[0];
t0[1]= sc[1] - mt[1];
@@ -695,14 +702,14 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
glVertex2f(pt->x, pt->y);
}
else if (sflag & GP_STROKE_2DIMAGE) {
- const float x= (pt->x * winx) + offsx;
- const float y= (pt->y * winy) + offsy;
+ const float x= (float)((pt->x * winx) + offsx);
+ const float y= (float)((pt->y * winy) + offsy);
glVertex2f(x, y);
}
else {
- const float x= (pt->x / 1000 * winx);
- const float y= (pt->y / 1000 * winy);
+ const float x= (float)(pt->x / 1000 * winx);
+ const float y= (float)(pt->y / 1000 * winy);
glVertex2f(x, y);
}
@@ -723,7 +730,7 @@ static void gp_draw_strokes (bGPDframe *gpf, int offsx, int offsy, int winx, int
glColor4f(color[0], color[1], color[2], color[3]);
for (gps= gpf->strokes.first; gps; gps= gps->next) {
- /* check if stroke can be drawn */
+ /* check if stroke can be drawn - checks here generally fall into pairs */
if ((dflag & GP_DRAWDATA_ONLY3D) && !(gps->flag & GP_STROKE_3DSPACE))
continue;
if (!(dflag & GP_DRAWDATA_ONLY3D) && (gps->flag & GP_STROKE_3DSPACE))
@@ -787,21 +794,22 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
QUATCOPY(color, gpl->color); // just for copying 4 array elements
QUATCOPY(tcolor, gpl->color); // additional copy of color (for ghosting)
glColor4f(color[0], color[1], color[2], color[3]);
- glPointSize(gpl->thickness + 2);
+ glPointSize((float)(gpl->thickness + 2));
/* draw 'onionskins' (frame left + right) */
if (gpl->flag & GP_LAYER_ONIONSKIN) {
/* drawing method - only immediately surrounding (gstep = 0), or within a frame range on either side (gstep > 0)*/
if (gpl->gstep) {
bGPDframe *gf;
- short i;
+ float fac;
/* draw previous frames first */
- for (gf=gpf->prev, i=0; gf; gf=gf->prev, i++) {
+ for (gf=gpf->prev; gf; gf=gf->prev) {
/* check if frame is drawable */
if ((gpf->framenum - gf->framenum) <= gpl->gstep) {
/* alpha decreases with distance from curframe index */
- tcolor[3] = color[3] - (i/gpl->gstep);
+ fac= (float)(gpf->framenum - gf->framenum) / (float)gpl->gstep;
+ tcolor[3] = color[3] - fac;
gp_draw_strokes(gf, offsx, offsy, winx, winy, dflag, debug, lthick, tcolor);
}
else
@@ -809,11 +817,12 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
}
/* now draw next frames */
- for (gf= gpf->next, i=0; gf; gf=gf->next, i++) {
+ for (gf= gpf->next; gf; gf=gf->next) {
/* check if frame is drawable */
if ((gf->framenum - gpf->framenum) <= gpl->gstep) {
/* alpha decreases with distance from curframe index */
- tcolor[3] = color[3] - (i/gpl->gstep);
+ fac= (float)(gf->framenum - gpf->framenum) / (float)gpl->gstep;
+ tcolor[3] = color[3] - fac;
gp_draw_strokes(gf, offsx, offsy, winx, winy, dflag, debug, lthick, tcolor);
}
else
@@ -876,13 +885,13 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
BIF_ThemeColor(TH_TEXT_HI);
if (actlay->actframe) {
- sprintf(printable, "GPencil: Layer ('%s'), Frame (%d) %s",
+ sprintf(printable, "GPencil: Layer ('%s'), Frame (%d)%s",
actlay->info, actlay->actframe->framenum,
- ((gpd->flag & GP_DATA_EDITPAINT)?", Draw Mode On":"") );
+ ((gpd->flag & GP_DATA_EDITPAINT)?" , Draw Mode On":"") );
}
else {
- sprintf(printable, "GPencil: Layer ('%s'), Frame <None> %s",
- actlay->info, ((gpd->flag & GP_DATA_EDITPAINT)?", Draw Mode On":"") );
+ sprintf(printable, "GPencil: Layer ('%s'), Frame <None>%s",
+ actlay->info, ((gpd->flag & GP_DATA_EDITPAINT)?" , Draw Mode On":"") );
}
}
else {
@@ -943,7 +952,7 @@ void draw_gpencil_2dimage (ScrArea *sa, ImBuf *ibuf)
float zoom, zoomx, zoomy;
/* calculate accessory values */
- zoom= SEQ_ZOOM_FAC(sseq->zoom);
+ zoom= (float)(SEQ_ZOOM_FAC(sseq->zoom));
if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp);
zoomy = zoom;
@@ -951,10 +960,11 @@ void draw_gpencil_2dimage (ScrArea *sa, ImBuf *ibuf)
else
zoomx = zoomy = zoom;
- sizex= zoomx * ibuf->x;
- sizey= zoomy * ibuf->y;
- offsx= (sa->winx-sizex)/2 + sseq->xof;
- offsy= (sa->winy-sizey)/2 + sseq->yof;
+ /* calculate transforms (Note: we use ibuf here, as we have it) */
+ sizex= (int)(zoomx * ibuf->x);
+ sizey= (int)(zoomy * ibuf->y);
+ offsx= (int)( (sa->winx-sizex)/2 + sseq->xof );
+ offsy= (int)( (sa->winy-sizey)/2 + sseq->yof );
dflag |= GP_DRAWDATA_ONLYI2D;
}
@@ -1025,7 +1035,7 @@ void draw_gpencil_oglrender (View3D *v3d, int winx, int winy)
/* pass 2: draw 2d-strokes ------------ > */
/* adjust view matrices */
- myortho2(-0.375, (float)(winx)-0.375, -0.375, (float)(winy)-0.375);
+ myortho2(-0.375f, (float)(winx)-0.375f, -0.375f, (float)(winy)-0.375f);
glLoadIdentity();
/* draw it! */
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index 97765690ceb..84236a0701a 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -1465,7 +1465,7 @@ static void image_panel_view_properties(short cntrl) // IMAGE_HANDLER_VIEW_PROPE
uiDefButBitI(block, TOG, G_DRAWFACES, B_REDR, "Faces", 10,30,60,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades in the 3d view and UV editor");
- uiDefButBitI(block, TOG, G_DRAWEDGES, B_REDR, "Edges", 70, 30,60,19, &G.f, 0, 0, 0, 0, "Displays selected edges using hilights and UV editor");
+ uiDefButBitI(block, TOG, G_DRAWEDGES, B_REDR, "Edges", 70, 30,60,19, &G.f, 0, 0, 0, 0, "Displays selected edges using hilights in the 3d view and UV editor");
uiDefButBitI(block, TOG, SI_DRAWSHADOW, B_REDR, "Final Shadow", 130, 30,110,19, &G.sima->flag, 0, 0, 0, 0, "Draw the final result from the objects modifiers");
@@ -1616,19 +1616,21 @@ static void image_panel_curves(short cntrl) // IMAGE_HANDLER_CURVES
rect.ymin= 10; rect.ymax= 200;
curvemap_buttons(block, G.sima->cumap, 'c', B_SIMACURVES, B_REDR, &rect);
- bt=uiDefBut(block, BUT, B_SIMARANGE, "Reset", 10, 160, 90, 19, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves");
- uiButSetFunc(bt, image_panel_curves_reset, G.sima->cumap, ibuf);
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_SIMARANGE, "Min R:", 10, 120, 90, 19, G.sima->cumap->black, -1000.0f, 1000.0f, 10, 2, "Black level");
- uiDefButF(block, NUM, B_SIMARANGE, "Min G:", 10, 100, 90, 19, G.sima->cumap->black+1, -1000.0f, 1000.0f, 10, 2, "Black level");
- uiDefButF(block, NUM, B_SIMARANGE, "Min B:", 10, 80, 90, 19, G.sima->cumap->black+2, -1000.0f, 1000.0f, 10, 2, "Black level");
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_SIMARANGE, "Max R:", 10, 50, 90, 19, G.sima->cumap->white, -1000.0f, 1000.0f, 10, 2, "White level");
- uiDefButF(block, NUM, B_SIMARANGE, "Max G:", 10, 30, 90, 19, G.sima->cumap->white+1, -1000.0f, 1000.0f, 10, 2, "White level");
- uiDefButF(block, NUM, B_SIMARANGE, "Max B:", 10, 10, 90, 19, G.sima->cumap->white+2, -1000.0f, 1000.0f, 10, 2, "White level");
+ /* curvemap min/max only works for RGBA */
+ if(ibuf->channels==4) {
+ bt=uiDefBut(block, BUT, B_SIMARANGE, "Reset", 10, 160, 90, 19, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves");
+ uiButSetFunc(bt, image_panel_curves_reset, G.sima->cumap, ibuf);
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_SIMARANGE, "Min R:", 10, 120, 90, 19, G.sima->cumap->black, -1000.0f, 1000.0f, 10, 2, "Black level");
+ uiDefButF(block, NUM, B_SIMARANGE, "Min G:", 10, 100, 90, 19, G.sima->cumap->black+1, -1000.0f, 1000.0f, 10, 2, "Black level");
+ uiDefButF(block, NUM, B_SIMARANGE, "Min B:", 10, 80, 90, 19, G.sima->cumap->black+2, -1000.0f, 1000.0f, 10, 2, "Black level");
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_SIMARANGE, "Max R:", 10, 50, 90, 19, G.sima->cumap->white, -1000.0f, 1000.0f, 10, 2, "White level");
+ uiDefButF(block, NUM, B_SIMARANGE, "Max G:", 10, 30, 90, 19, G.sima->cumap->white+1, -1000.0f, 1000.0f, 10, 2, "White level");
+ uiDefButF(block, NUM, B_SIMARANGE, "Max B:", 10, 10, 90, 19, G.sima->cumap->white+2, -1000.0f, 1000.0f, 10, 2, "White level");
+ }
}
}
@@ -2455,12 +2457,12 @@ static void image_zoom_set_factor(float zoomfac)
void image_viewmove(int mode)
{
- short mval[2], mvalo[2], zoom0;
+ short mval[2], mvalo[2];
int oldcursor;
Window *win;
getmouseco_sc(mvalo);
- zoom0= G.sima->zoom;
+
oldcursor=get_cursor();
win=winlay_get_active_window();
diff --git a/source/blender/src/drawipo.c b/source/blender/src/drawipo.c
index aee00baef8e..973782d7463 100644
--- a/source/blender/src/drawipo.c
+++ b/source/blender/src/drawipo.c
@@ -86,7 +86,9 @@
#include "BSE_editnla_types.h"
#include "BSE_time.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "mydevice.h"
#include "blendef.h"
@@ -1925,6 +1927,7 @@ void do_ipobuts(unsigned short event)
ei= get_active_editipo();
if(ei) {
if(ei->icu->driver) {
+#ifndef DISABLE_PYTHON
if (ei->icu->driver->type == IPO_DRIVER_TYPE_PYTHON) {
/* first del pydriver's global dict, just in case
* an available pydrivers.py module needs to be reloaded */
@@ -1933,7 +1936,9 @@ void do_ipobuts(unsigned short event)
BPY_pydriver_eval(ei->icu->driver);
DAG_scene_sort(G.scene);
}
- else if(G.sipo->blocktype==ID_KE || G.sipo->blocktype==ID_AC)
+ else
+#endif
+ if(G.sipo->blocktype==ID_KE || G.sipo->blocktype==ID_AC)
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
else
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c
index d2586c9b781..618eca15ac6 100644
--- a/source/blender/src/drawnode.c
+++ b/source/blender/src/drawnode.c
@@ -3363,12 +3363,14 @@ static void nodes_blockhandlers(ScrArea *sa)
short a;
for(a=0; a<SPACE_MAXHANDLER; a+=2) {
- /* clear action value for event */
switch(snode->blockhandler[a]) {
case NODES_HANDLER_GREASEPENCIL:
nodes_panel_gpencil(snode->blockhandler[a+1]);
break;
}
+
+ /* clear action value for event */
+ snode->blockhandler[a+1]= 0;
}
uiDrawBlocksPanels(sa, 0);
}
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index b9bcf4063a3..551ce874db8 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -281,7 +281,7 @@ void drawaxes(float size, int flag, char drawtype)
float v2[3]= {0.0, 0.0, 0.0};
float v3[3]= {0.0, 0.0, 0.0};
- if(G.f & G_SIMULATION)
+ if(G.f & G_RENDER_SHADOW)
return;
switch(drawtype) {
@@ -666,7 +666,7 @@ static void drawlamp(Object *ob)
float imat[4][4], curcol[4];
char col[4];
- if(G.f & G_SIMULATION)
+ if(G.f & G_RENDER_SHADOW)
return;
la= ob->data;
@@ -958,7 +958,7 @@ static void drawcamera(Object *ob, int flag)
float vec[8][4], tmat[4][4], fac, facx, facy, depth;
int i;
- if(G.f & G_SIMULATION)
+ if(G.f & G_RENDER_SHADOW)
return;
cam= ob->data;
@@ -1768,7 +1768,7 @@ static void draw_verse_debug(Object *ob, EditMesh *em)
float v1[3], v2[3], v3[3], v4[3], fvec[3], col[3];
char val[32];
- if(G.f & G_SIMULATION)
+ if(G.f & G_RENDER_SHADOW)
return;
if(G.vd->zbuf && (G.vd->flag & V3D_ZBUF_SELECT)==0)
@@ -1834,7 +1834,7 @@ static void draw_em_measure_stats(Object *ob, EditMesh *em)
char conv_float[5]; /* Use a float conversion matching the grid size */
float area, col[3]; /* area of the face, color of the text to draw */
- if(G.f & G_SIMULATION)
+ if(G.f & (G_RENDER_OGL|G_RENDER_SHADOW))
return;
/* make the precission of the pronted value proportionate to the gridsize */
@@ -3400,7 +3400,7 @@ static void draw_new_particle_system(Base *base, ParticleSystem *psys, int dt)
}
if(next_pa)
continue;
- if(part->draw&PART_DRAW_NUM){
+ if(part->draw&PART_DRAW_NUM && !(G.f & G_RENDER_SHADOW)){
/* in path drawing state.co is the end point */
glRasterPos3f(state.co[0], state.co[1], state.co[2]);
sprintf(val," %i",a);
@@ -3709,7 +3709,7 @@ static void draw_particle_edit(Object *ob, ParticleSystem *psys, int dt)
}
cd += (timed?4:3) * pa->totkey;
- if(pset->flag&PE_SHOW_TIME && (pa->flag&PARS_HIDE)==0){
+ if((pset->flag&PE_SHOW_TIME) && (pa->flag&PARS_HIDE)==0 && !(G.f & G_RENDER_SHADOW)){
for(k=0, key=edit->keys[i]+k; k<pa->totkey; k++, key++){
if(key->flag & PEK_HIDE) continue;
@@ -3736,7 +3736,7 @@ static void draw_particle_edit(Object *ob, ParticleSystem *psys, int dt)
glVertex3fv(key->world_co);
glEnd();
- if(pset->flag & PE_SHOW_TIME){
+ if((pset->flag & PE_SHOW_TIME) && !(G.f & G_RENDER_SHADOW)){
glRasterPos3fv(key->world_co);
sprintf(val," %.1f",*key->time);
BMF_DrawString(G.font, val);
@@ -4001,16 +4001,17 @@ static void drawnurb(Base *base, Nurb *nurb, int dt)
int skip= nu->resolu/16;
while (nr-->0) { /* accounts for empty bevel lists */
+ float fac= bevp->radius * G.scene->editbutsize;
float ox,oy,oz; // Offset perpendicular to the curve
float dx,dy,dz; // Delta along the curve
- ox = bevp->radius*bevp->mat[0][0];
- oy = bevp->radius*bevp->mat[0][1];
- oz = bevp->radius*bevp->mat[0][2];
+ ox = fac*bevp->mat[0][0];
+ oy = fac*bevp->mat[0][1];
+ oz = fac*bevp->mat[0][2];
- dx = bevp->radius*bevp->mat[2][0];
- dy = bevp->radius*bevp->mat[2][1];
- dz = bevp->radius*bevp->mat[2][2];
+ dx = fac*bevp->mat[2][0];
+ dy = fac*bevp->mat[2][1];
+ dz = fac*bevp->mat[2][2];
glBegin(GL_LINE_STRIP);
glVertex3f(bevp->x - ox - dx, bevp->y - oy - dy, bevp->z - oz - dz);
@@ -4325,6 +4326,9 @@ static void draw_forcefield(Object *ob)
float vec[3]= {0.0, 0.0, 0.0};
int curcol;
float size;
+
+ if(G.f & G_RENDER_SHADOW)
+ return;
if(ob!=G.obedit && (ob->flag & SELECT)) {
if(ob==OBACT) curcol= TH_ACTIVE;
@@ -4731,17 +4735,18 @@ static void draw_hooks(Object *ob)
}
}
-
//<rcruiz>
-void drawRBpivot(bRigidBodyJointConstraint *data){
+void drawRBpivot(bRigidBodyJointConstraint *data)
+{
float radsPerDeg = 6.283185307179586232f / 360.f;
int axis;
float v1[3]= {data->pivX, data->pivY, data->pivZ};
float eu[3]= {radsPerDeg*data->axX, radsPerDeg*data->axY, radsPerDeg*data->axZ};
-
+ float mat[4][4];
+ if(G.f & G_RENDER_SHADOW)
+ return;
- float mat[4][4];
EulToMat4(eu,mat);
glLineWidth (4.0f);
setlinestyle(2);
@@ -4816,7 +4821,8 @@ void draw_object(Base *base, int flag)
warning_recursive= 1;
elems.first= elems.last= 0;
- make_cfra_list(ob->ipo, &elems);
+ // warning: no longer checks for certain ob-keys only... (so does this need to use the proper ipokeys then?)
+ make_cfra_list(ob->ipo, &elems);
cfraont= (G.scene->r.cfra);
drawtype= G.vd->drawtype;
@@ -5163,7 +5169,7 @@ void draw_object(Base *base, int flag)
}
/* draw extra: after normal draw because of makeDispList */
- if(dtx && !(G.f & G_SIMULATION)) {
+ if(dtx && !(G.f & (G_RENDER_OGL|G_RENDER_SHADOW))) {
if(dtx & OB_AXIS) {
drawaxes(1.0f, flag, OB_ARROWS);
}
@@ -5173,10 +5179,12 @@ void draw_object(Base *base, int flag)
/* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
/* but, we also dont draw names for sets or duplicators */
if(flag == 0) {
+ if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
glRasterPos3f(0.0, 0.0, 0.0);
BMF_DrawString(G.font, " ");
BMF_DrawString(G.font, ob->id.name+2);
+ if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
}
}
/*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
@@ -5184,7 +5192,8 @@ void draw_object(Base *base, int flag)
}
if(dt<OB_SHADED) {
- if(/*(ob->gameflag & OB_ACTOR) &&*/ (ob->gameflag & OB_DYNAMIC)) {
+ if((ob->gameflag & OB_DYNAMIC) ||
+ ((ob->gameflag & OB_BOUNDS) && (ob->boundtype == OB_BOUND_SPHERE))) {
float tmat[4][4], imat[4][4], vec[3];
vec[0]= vec[1]= vec[2]= 0.0;
@@ -5203,7 +5212,7 @@ void draw_object(Base *base, int flag)
if(warning_recursive) return;
if(base->flag & (OB_FROMDUPLI|OB_RADIO)) return;
- if(G.f & G_SIMULATION) return;
+ if(G.f & G_RENDER_SHADOW) return;
/* object centers, need to be drawn in viewmat space for speed, but OK for picking select */
if(ob!=OBACT || (G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))==0) {
diff --git a/source/blender/src/drawscript.c b/source/blender/src/drawscript.c
index c744449d1db..f9e2d138a78 100644
--- a/source/blender/src/drawscript.c
+++ b/source/blender/src/drawscript.c
@@ -55,7 +55,9 @@
#include "BKE_global.h"
#include "BKE_main.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "BIF_gl.h"
#include "BIF_keyval.h"
@@ -87,6 +89,9 @@ void drawscriptspace(ScrArea *sa, void *spacedata)
glClear(GL_COLOR_BUFFER_BIT);
myortho2(-0.5, curarea->winrct.xmax-curarea->winrct.xmin-0.5, -0.5, curarea->winrct.ymax-curarea->winrct.ymin-0.5);
+#ifdef DISABLE_PYTHON
+ return;
+#else
if (!sc->script) return;
script = sc->script;
@@ -115,10 +120,12 @@ void drawscriptspace(ScrArea *sa, void *spacedata)
addqueue(curarea->win, MOUSEX, 0);
}
}
+#endif /* DISABLE_PYTHON */
}
void winqreadscriptspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt)
{
+#ifndef DISABLE_PYTHON
unsigned short event = evt->event;
short val = evt->val;
char ascii = evt->ascii;
@@ -163,19 +170,21 @@ void winqreadscriptspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *
if (event == QKEY)
if (val && (G.qual & LR_CTRLKEY) && okee("Quit Blender")) exit_usiblender();
}
-
+#endif
return;
+
}
void free_scriptspace (SpaceScript *sc)
{
if (!sc) return;
-
+#ifndef DISABLE_PYTHON
/*free buttons references*/
if (sc->but_refs) {
BPy_Set_DrawButtonsList(sc->but_refs);
BPy_Free_DrawButtonsList();
sc->but_refs = NULL;
}
+#endif
sc->script = NULL;
}
diff --git a/source/blender/src/drawseq.c b/source/blender/src/drawseq.c
index d7346a1ed21..f54ac186a21 100644
--- a/source/blender/src/drawseq.c
+++ b/source/blender/src/drawseq.c
@@ -113,7 +113,7 @@ static void seq_panel_gpencil(short cntrl) // SEQ_HANDLER_GREASEPENCIL
block= uiNewBlock(&curarea->uiblocks, "seq_panel_gpencil", UI_EMBOSS, UI_HELV, curarea->win);
uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
uiSetPanelHandler(SEQ_HANDLER_GREASEPENCIL); // for close and esc
- if (uiNewPanel(curarea, block, "Grease Pencil", "SpaceSeq", 100, 30, 318, 204)==0) return;
+ if (uiNewPanel(curarea, block, "Grease Pencil", "Seq", 100, 30, 318, 204)==0) return;
/* only draw settings if right mode */
if (sseq->mainb == 0)
@@ -160,6 +160,8 @@ static void seq_blockhandlers(ScrArea *sa)
seq_panel_gpencil(sseq->blockhandler[a+1]);
break;
}
+ /* clear action value for event */
+ sseq->blockhandler[a+1]= 0;
}
uiDrawBlocksPanels(sa, 0);
@@ -348,7 +350,7 @@ static void drawseqwave(Sequence *seq, float x1, float y1, float x2, float y2, i
signed short* s;
bSound *sound;
- Uint8 *stream;
+ uint8_t *stream;
audio_makestream(seq->sound);
if(seq->sound==NULL || seq->sound->stream==NULL) return;
diff --git a/source/blender/src/drawtext.c b/source/blender/src/drawtext.c
index 7f913eb5d49..1c8380c7a7d 100644
--- a/source/blender/src/drawtext.c
+++ b/source/blender/src/drawtext.c
@@ -71,13 +71,16 @@
#include "BSE_filesel.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
#include "mydevice.h"
#include "blendef.h"
#include "winlay.h"
-
+#include "PIL_time.h"
+#include <ctype.h> /* ispunct */
#include <sys/stat.h>
/***********************/ /*
@@ -123,10 +126,10 @@ def wrap(line, view_width, wrap_chars):
void drawtextspace(ScrArea *sa, void *spacedata);
void winqreadtextspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
-void txt_copy_selectbuffer (Text *text);
-void draw_brackets(SpaceText *st);
void redraw_alltext(void);
+static void txt_copy_selectbuffer(Text *text);
+static void draw_brackets(SpaceText *st);
static void get_selection_buffer(Text *text);
static int check_bracket(char ch);
static int check_delim(char ch);
@@ -135,7 +138,6 @@ static int check_identifier(char ch);
static int check_whitespace(char ch);
static int get_wrap_width(SpaceText *st);
-//static int get_wrap_points(SpaceText *st, char *line);
static void get_suggest_prefix(Text *text, int offset);
static void confirm_suggestion(Text *text, int skipleft);
@@ -148,7 +150,8 @@ static int doc_scroll= 0;
static int jump_to= 0;
static double last_jump= 0;
-static BMF_Font *spacetext_get_font(SpaceText *st) {
+static BMF_Font *spacetext_get_font(SpaceText *st)
+{
static BMF_Font *scr12= NULL;
static BMF_Font *scr15= NULL;
@@ -165,7 +168,8 @@ static BMF_Font *spacetext_get_font(SpaceText *st) {
}
}
-static int spacetext_get_fontwidth(SpaceText *st) {
+static int spacetext_get_fontwidth(SpaceText *st)
+{
return BMF_GetCharacterWidth(spacetext_get_font(st), ' ');
}
@@ -174,7 +178,8 @@ static int *temp_char_accum= NULL;
static int temp_char_len= 0;
static int temp_char_pos= 0;
-static void temp_char_write(char c, int accum) {
+static void temp_char_write(char c, int accum)
+{
if (temp_char_len==0 || temp_char_pos>=temp_char_len) {
char *nbuf; int *naccum;
int olen= temp_char_len;
@@ -204,7 +209,8 @@ static void temp_char_write(char c, int accum) {
else temp_char_pos++;
}
-void free_txt_data(void) {
+void free_txt_data(void)
+{
txt_free_cut_buffer();
if (g_find_str) MEM_freeN(g_find_str);
@@ -213,7 +219,8 @@ void free_txt_data(void) {
if (temp_char_accum) MEM_freeN(temp_char_accum);
}
-static int render_string (SpaceText *st, char *in) {
+static int render_string (SpaceText *st, char *in)
+{
int r = 0, i = 0;
while(*in) {
@@ -232,6 +239,13 @@ static int render_string (SpaceText *st, char *in) {
return r;
}
+/* Checks the specified source string for a Python built-in function name. This
+ name must start at the beginning of the source string and must be followed by
+ a non-identifier (see check_identifier(char)) or null character.
+
+ If a built-in function is found, the length of the matching name is returned.
+ Otherwise, -1 is returned.
+ */
static int find_builtinfunc(char *string)
{
int a, i;
@@ -243,52 +257,52 @@ static int find_builtinfunc(char *string)
for (a=0; a<30; a++) {
i = 0;
while (1) {
+ /* If we hit the end of a keyword... (eg. "def") */
if (builtinfuncs[a][i]=='\0') {
+ /* If we still have identifier chars in the source (eg. "definate") */
if (check_identifier(string[i]))
- i = -1;
- break;
+ i = -1; /* No match */
+ break; /* Next keyword if no match, otherwise we're done */
+
+ /* If chars mismatch, move on to next keyword */
} else if (string[i]!=builtinfuncs[a][i]) {
i = -1;
- break;
+ break; /* Break inner loop, start next keyword */
}
i++;
}
- if (i>0) break;
+ if (i>0) break; /* If we have a match, we're done */
}
return i;
}
+/* Checks the specified source string for a Python special name. This name must
+ start at the beginning of the source string and must be followed by a non-
+ identifier (see check_identifier(char)) or null character.
+
+ If a special name is found, the length of the matching name is returned.
+ Otherwise, -1 is returned.
+ */
static int find_specialvar(char *string)
{
int i = 0;
+ /* Check for "def" */
if (string[0]=='d' && string[1]=='e' && string[2]=='f')
i = 3;
+ /* Check for "class" */
else if (string[0]=='c' && string[1]=='l' && string[2]=='a' && string[3]=='s' && string[4]=='s')
i = 5;
+ /* If next source char is an identifier (eg. 'i' in "definate") no match */
if (i==0 || check_identifier(string[i]))
return -1;
return i;
}
-#if 0 // not used
-static void print_format(SpaceText *st, TextLine *line) {
- int i, a;
- char *s, *f;
- s = line->line;
- f = line->format;
- for (a=0; *s; s++) {
- if (*s == '\t') {
- for (i=st->tabnumber-(a%st->tabnumber); i>0; i--)
- printf(" "), f++, a++;
- } else
- printf("%c", *s), f++, a++;
- }
- printf("\n%s [%#x]\n", line->format, (int) (f[strlen(f)+1]));
-}
-#endif // not used
-
-/* Ensures the format string for the given line is long enough, reallocating as needed */
-static int check_format_len(TextLine *line, unsigned int len) {
+/* Ensures the format string for the given line is long enough, reallocating
+ as needed. Allocation is done here, alone, to ensure consitency.
+ */
+static int check_format_len(TextLine *line, unsigned int len)
+{
if (line->format) {
if (strlen(line->format) < len) {
MEM_freeN(line->format);
@@ -302,20 +316,22 @@ static int check_format_len(TextLine *line, unsigned int len) {
return 1;
}
-/* Formats the specified line and if allowed and needed will move on to the
- * next line. The format string contains the following characters:
- * '_' Whitespace
- * '#' Comment text
- * '!' Punctuation and other symbols
- * 'n' Numerals
- * 'l' String letters
- * 'v' Special variables (class, def)
- * 'b' Built-in names (print, for, etc.)
- * 'q' Other text (identifiers, etc.)
- * It is terminated with a null-terminator '\0' followed by a continuation
- * flag indicating whether the line is part of a multi-line string.
+/* Formats the specified line. If do_next is set, the process will move on to
+ the succeeding line if it is affected (eg. multiline strings). Format strings
+ may contain any of the following characters:
+ '_' Whitespace
+ '#' Comment text
+ '!' Punctuation and other symbols
+ 'n' Numerals
+ 'l' String letters
+ 'v' Special variables (class, def)
+ 'b' Built-in names (print, for, etc.)
+ 'q' Other text (identifiers, etc.)
+ It is terminated with a null-terminator '\0' followed by a continuation
+ flag indicating whether the line is part of a multi-line string.
*/
-void txt_format_line(SpaceText *st, TextLine *line, int do_next) {
+void txt_format_line(SpaceText *st, TextLine *line, int do_next)
+{
char *str, *fmt, orig, cont, find, prev = ' ';
int len, i;
@@ -425,6 +441,7 @@ void txt_format_line(SpaceText *st, TextLine *line, int do_next) {
}
}
+/* Formats every line of the current text */
void txt_format_text(SpaceText *st)
{
TextLine *linep;
@@ -435,7 +452,9 @@ void txt_format_text(SpaceText *st)
txt_format_line(st, linep, 0);
}
-static void format_draw_color(char formatchar) {
+/* Sets the current drawing color based on the format character specified */
+static void format_draw_color(char formatchar)
+{
switch (formatchar) {
case '_': /* Whitespace */
break;
@@ -508,8 +527,8 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int draw, int x, int y, char *format)
{
int r=0, w= 0;
- char *in;
int *acc;
+ char *in;
w= render_string(st, str);
if(w<cshift ) return 0; /* String is shorter than shift */
@@ -671,41 +690,18 @@ static void set_cursor_to_pos (SpaceText *st, int x, int y, int sel)
if(!sel) txt_pop_sel(text);
}
-static int get_wrap_width(SpaceText *st) {
+static int get_wrap_width(SpaceText *st)
+{
int x, max;
+
x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
max= (curarea->winx-x)/spacetext_get_fontwidth(st);
return max>8 ? max : 8;
}
-#if 0 // not used
-/* Returns the number of wrap points (or additional lines) in the given string */
-static int get_wrap_points(SpaceText *st, char *line) {
- int start, end, taboffs, i, max, count;
-
- if (!st->wordwrap) return 0;
-
- end= max= get_wrap_width(st);
- count= taboffs= start= 0;
-
- for (i=0; line[i]!='\0'; i++) {
- if (i-start+taboffs>=max) {
- count++;
- start= end;
- end += max;
- taboffs= 0;
- } else if (line[i]==' ' || line[i]=='\t' || line[i]=='-') {
- end = i+1;
- if (line[i]=='\t')
- taboffs += st->tabnumber-(i-start)%st->tabnumber;
- }
- }
- return count;
-}
-#endif // not used
-
/* Sets (offl, offc) for transforming (line, curs) to its wrapped position */
-static void wrap_offset(SpaceText *st, TextLine *linein, int cursin, int *offl, int *offc) {
+static void wrap_offset(SpaceText *st, TextLine *linein, int cursin, int *offl, int *offc)
+{
Text *text;
TextLine *linep;
int i, j, start, end, chars, max, chop;
@@ -769,8 +765,10 @@ static void wrap_offset(SpaceText *st, TextLine *linein, int cursin, int *offl,
}
}
-static int get_char_pos(SpaceText *st, char *line, int cur) {
+static int get_char_pos(SpaceText *st, char *line, int cur)
+{
int a=0, i;
+
for (i=0; i<cur && line[i]; i++) {
if (line[i]=='\t')
a += st->tabnumber-a%st->tabnumber;
@@ -780,7 +778,8 @@ static int get_char_pos(SpaceText *st, char *line, int cur) {
return a;
}
-static void draw_markers(SpaceText *st) {
+static void draw_markers(SpaceText *st)
+{
Text *text= st->text;
TextMarker *marker, *next;
TextLine *top, *bottom, *line;
@@ -851,7 +850,8 @@ static void draw_markers(SpaceText *st) {
}
}
-static void draw_cursor(SpaceText *st) {
+static void draw_cursor(SpaceText *st)
+{
Text *text= st->text;
int vcurl, vcurc, vsell, vselc, hidden=0;
int offl, offc, x, y, w, i;
@@ -1044,6 +1044,7 @@ static void draw_textscroll(SpaceText *st)
uiEmboss(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax, st->flags & ST_SCROLL_SELECT);
}
+/* Moves the view vertically by the specified number of lines */
static void screen_skip(SpaceText *st, int lines)
{
int last;
@@ -1061,6 +1062,12 @@ static void screen_skip(SpaceText *st, int lines)
if (st->top<0) st->top= 0;
}
+/* Moves the cursor vertically by the specified number of lines.
+ If the destination line is shorter than the current cursor position, the
+ cursor will be positioned at the end of this line.
+
+ This is to replace screen_skip for PageUp/Down operations.
+ */
static void cursor_skip(SpaceText *st, int lines, int sel)
{
Text *text;
@@ -1093,9 +1100,8 @@ static void cursor_skip(SpaceText *st, int lines, int sel)
txt_undo_add_toop(st->text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, txt_get_span(text->lines.first, *linep), *charp);
}
-/*
- * mode 1 == view scroll
- * mode 2 == scrollbar
+/* Handles text scrolling via grabbing the view (MMB, mode 1) or with the
+ scrollbar (mode 2)
*/
static void do_textscroll(SpaceText *st, int mode)
{
@@ -1153,10 +1159,10 @@ static void do_textscroll(SpaceText *st, int mode)
static void do_selection(SpaceText *st, int selecting)
{
- short mval[2], old[2];
int sell, selc;
int linep2, charp2;
int first= 1;
+ short mval[2], old[2];
getmouseco_areawin(mval);
old[0]= mval[0];
@@ -1190,7 +1196,8 @@ static void do_selection(SpaceText *st, int selecting)
scrarea_do_windraw(curarea);
screen_swapbuffers();
- } else if (!st->wordwrap && (mval[0]<0 || mval[0]>curarea->winx)) {
+ }
+ else if (!st->wordwrap && (mval[0]<0 || mval[0]>curarea->winx)) {
if (mval[0]>curarea->winx) st->left++;
else if (mval[0]<0 && st->left>0) st->left--;
@@ -1200,7 +1207,8 @@ static void do_selection(SpaceText *st, int selecting)
screen_swapbuffers();
PIL_sleep_ms(10);
- } else if (first || old[0]!=mval[0] || old[1]!=mval[1]) {
+ }
+ else if (first || old[0]!=mval[0] || old[1]!=mval[1]) {
set_cursor_to_pos(st, mval[0], mval[1], 1);
scrarea_do_windraw(curarea);
@@ -1209,7 +1217,8 @@ static void do_selection(SpaceText *st, int selecting)
old[0]= mval[0];
old[1]= mval[1];
first= 1;
- } else {
+ }
+ else {
BIF_wait_for_statechange();
}
}
@@ -1226,10 +1235,10 @@ static void do_selection(SpaceText *st, int selecting)
static int do_suggest_select(SpaceText *st)
{
SuggItem *item, *first, *last, *sel;
- short mval[2];
TextLine *tmp;
int l, x, y, w, h, i;
int tgti, *top;
+ short mval[2];
if (!st || !st->text) return 0;
if (!texttool_text_is_active(st->text)) return 0;
@@ -1275,7 +1284,8 @@ static int do_suggest_select(SpaceText *st)
return 1;
}
-static void pop_suggest_list() {
+static void pop_suggest_list()
+{
SuggItem *item, *sel;
int *top, i;
@@ -1451,17 +1461,21 @@ void draw_suggestion_list(SpaceText *st)
}
}
-static short check_blockhandler(SpaceText *st, short handler) {
+static short check_blockhandler(SpaceText *st, short handler)
+{
short a;
+
for(a=0; a<SPACE_MAXHANDLER; a+=2)
if (st->blockhandler[a]==handler) return 1;
return 0;
}
+/* Find and replace GUI panel */
static void text_panel_find(short cntrl) // TEXT_HANDLER_FIND
{
uiBlock *block;
+ /* Ensure that find and replace buffers have been allocated */
if (!g_find_str || !g_replace_str) {
g_find_str= MEM_mallocN(TXT_MAXFINDSTR+1, "find_string");
g_replace_str= MEM_mallocN(TXT_MAXFINDSTR+1, "replace_string");
@@ -1487,10 +1501,11 @@ static void text_panel_find(short cntrl) // TEXT_HANDLER_FIND
}
/* mode: 0 find only, 1 replace/find, 2 mark all occurrences */
-void find_and_replace(SpaceText *st, short mode) {
- char *tmp;
+void find_and_replace(SpaceText *st, short mode)
+{
Text *start= NULL, *text= st->text;
int flags, first= 1;
+ char *tmp;
if (!check_blockhandler(st, TEXT_HANDLER_FIND)) {
toggle_blockhandler(st->area, TEXT_HANDLER_FIND, UI_PNL_TO_MOUSE);
@@ -1548,10 +1563,10 @@ void find_and_replace(SpaceText *st, short mode) {
} while (mode==2);
}
-static void do_find_buttons(val) {
+static void do_find_buttons(val)
+{
Text *text;
SpaceText *st;
- int do_draw= 0;
char *tmp;
st= curarea->spacedata.first;
@@ -1565,26 +1580,21 @@ static void do_find_buttons(val) {
tmp= txt_sel_to_buf(text);
strncpy(g_find_str, tmp, TXT_MAXFINDSTR);
MEM_freeN(tmp);
- do_draw= 1;
break;
case B_PASTEREPLACE:
if (!g_replace_str) break;
tmp= txt_sel_to_buf(text);
strncpy(g_replace_str, tmp, TXT_MAXFINDSTR);
MEM_freeN(tmp);
- do_draw= 1;
break;
case B_TEXTFIND:
find_and_replace(st, 0);
- do_draw= 1;
break;
case B_TEXTREPLACE:
find_and_replace(st, 1);
- do_draw= 1;
break;
case B_TEXTMARKALL:
find_and_replace(st, 2);
- do_draw= 1;
break;
}
}
@@ -1612,11 +1622,11 @@ void drawtextspace(ScrArea *sa, void *spacedata)
{
SpaceText *st= curarea->spacedata.first;
Text *text;
- int i, x, y;
TextLine *tmp;
- char linenr[12];
float col[3];
+ int i, x, y;
int linecount = 0;
+ char linenr[12];
if (st==NULL || st->spacetype != SPACE_TEXT) return;
@@ -1781,8 +1791,8 @@ void txt_write_file(Text *text)
{
FILE *fp;
TextLine *tmp;
- int res;
struct stat st;
+ int res;
char file[FILE_MAXDIR+FILE_MAXFILE];
/* Do we need to get a filename? */
@@ -1833,7 +1843,8 @@ void unlink_text(Text *text)
bScreen *scr;
ScrArea *area;
SpaceLink *sl;
-
+
+#ifndef DISABLE_PYTHON
/* check if this text was used as script link:
* this check function unsets the pointers and returns how many
* script links used this Text */
@@ -1844,7 +1855,8 @@ void unlink_text(Text *text)
if (nodeDynamicUnlinkText ((ID*)text)) {
allqueue(REDRAWNODE, 0);
}
-
+#endif
+
for (scr= G.main->screen.first; scr; scr= scr->id.next) {
for (area= scr->areabase.first; area; area= area->next) {
for (sl= area->spacedata.first; sl; sl= sl->next) {
@@ -1865,7 +1877,8 @@ void unlink_text(Text *text)
}
}
-int jumptoline_interactive(SpaceText *st) {
+int jumptoline_interactive(SpaceText *st)
+{
short nlines= txt_get_span(st->text->lines.first, st->text->lines.last)+1;
short tmp= txt_get_span(st->text->lines.first, st->text->curl)+1;
@@ -1882,7 +1895,7 @@ int jumptoline_interactive(SpaceText *st) {
int bufferlength;
static char *copybuffer = NULL;
-void txt_copy_selectbuffer (Text *text)
+static void txt_copy_selectbuffer (Text *text)
{
int length=0;
TextLine *tmp, *linef, *linel;
@@ -1998,8 +2011,8 @@ static char *winNewLine(char *buffer)
return(output);
}
-void txt_paste_clipboard(Text *text) {
-
+void txt_paste_clipboard(Text *text)
+{
char * buff;
char *temp_buff;
@@ -2016,10 +2029,12 @@ void txt_paste_clipboard(Text *text) {
void get_selection_buffer(Text *text)
{
char *buff = getClipboard(1);
+
txt_insert_buf(text, buff);
}
-void txt_copy_clipboard(Text *text) {
+void txt_copy_clipboard(Text *text)
+{
char *temp;
txt_copy_selectbuffer(text);
@@ -2037,9 +2052,11 @@ void txt_copy_clipboard(Text *text) {
void run_python_script(SpaceText *st)
{
- char *py_filename;
Text *text=st->text;
-
+ char *py_filename;
+#ifdef DISABLE_PYTHON
+ error("python disabled in this build");
+#else
if (!BPY_txt_do_python_Text(text)) {
int lineno = BPY_Err_getLinenumber();
// jump to error if happened in current text:
@@ -2061,17 +2078,20 @@ void run_python_script(SpaceText *st)
"check console");
}
}
+#endif
}
static void set_tabs(Text *text)
{
SpaceText *st = curarea->spacedata.first;
+
st->currtab_set = setcurr_tab(text);
}
-static void wrap_move_bol(SpaceText *st, short sel) {
- int offl, offc, lin;
+static void wrap_move_bol(SpaceText *st, short sel)
+{
Text *text= st->text;
+ int offl, offc, lin;
lin= txt_get_span(text->lines.first, text->sell);
wrap_offset(st, text->sell, text->selc, &offl, &offc);
@@ -2086,9 +2106,10 @@ static void wrap_move_bol(SpaceText *st, short sel) {
}
}
-static void wrap_move_eol(SpaceText *st, short sel) {
- int offl, offc, lin, startl, c;
+static void wrap_move_eol(SpaceText *st, short sel)
+{
Text *text= st->text;
+ int offl, offc, lin, startl, c;
lin= txt_get_span(text->lines.first, text->sell);
wrap_offset(st, text->sell, text->selc, &offl, &offc);
@@ -2109,9 +2130,10 @@ static void wrap_move_eol(SpaceText *st, short sel) {
}
}
-static void wrap_move_up(SpaceText *st, short sel) {
- int offl, offl_1, offc, fromline, toline, c, target;
+static void wrap_move_up(SpaceText *st, short sel)
+{
Text *text= st->text;
+ int offl, offl_1, offc, fromline, toline, c, target;
wrap_offset(st, text->sell, 0, &offl_1, &offc);
wrap_offset(st, text->sell, text->selc, &offl, &offc);
@@ -2137,20 +2159,26 @@ static void wrap_move_up(SpaceText *st, short sel) {
if (sel) {
txt_undo_add_toop(text, UNDO_STO, fromline, text->selc, toline, c);
if (toline<fromline) text->sell= text->sell->prev;
- if (c>text->sell->len) c= text->sell->len;
- text->selc= c;
- } else {
+ if(text->sell) {
+ if (c>text->sell->len) c= text->sell->len;
+ text->selc= c;
+ }
+ }
+ else if(text->curl) {
txt_undo_add_toop(text, UNDO_CTO, fromline, text->curc, toline, c);
if (toline<fromline) text->curl= text->curl->prev;
- if (c>text->curl->len) c= text->curl->len;
- text->curc= c;
- txt_pop_sel(text);
+ if(text->curl) {
+ if (c>text->curl->len) c= text->curl->len;
+ text->curc= c;
+ txt_pop_sel(text);
+ }
}
}
-static void wrap_move_down(SpaceText *st, short sel) {
- int offl, startoff, offc, fromline, toline, c, target;
+static void wrap_move_down(SpaceText *st, short sel)
+{
Text *text= st->text;
+ int offl, startoff, offc, fromline, toline, c, target;
wrap_offset(st, text->sell, text->selc, &offl, &offc);
fromline= toline= txt_get_span(text->lines.first, text->sell);
@@ -2178,18 +2206,24 @@ static void wrap_move_down(SpaceText *st, short sel) {
if (sel) {
txt_undo_add_toop(text, UNDO_STO, fromline, text->selc, toline, c);
if (toline>fromline) text->sell= text->sell->next;
- if (c>text->sell->len) c= text->sell->len;
- text->selc= c;
- } else {
+ if(text->sell) {
+ if (c>text->sell->len) c= text->sell->len;
+ text->selc= c;
+ }
+ }
+ else if(text->curl) {
txt_undo_add_toop(text, UNDO_CTO, fromline, text->curc, toline, c);
if (toline>fromline) text->curl= text->curl->next;
- if (c>text->curl->len) c= text->curl->len;
- text->curc= c;
- txt_pop_sel(text);
+ if(text->curl) {
+ if (c > text->curl->len) c= text->curl->len;
+ text->curc= c;
+ txt_pop_sel(text);
+ }
}
}
-static void get_suggest_prefix(Text *text, int offset) {
+static void get_suggest_prefix(Text *text, int offset)
+{
int i, len;
char *line, tmp[256];
@@ -2211,10 +2245,11 @@ static void get_suggest_prefix(Text *text, int offset) {
texttool_suggest_prefix(tmp);
}
-static void confirm_suggestion(Text *text, int skipleft) {
+static void confirm_suggestion(Text *text, int skipleft)
+{
+ SuggItem *sel;
int i, over=0;
char *line;
- SuggItem *sel;
if (!text) return;
if (!texttool_text_is_active(text)) return;
@@ -2244,7 +2279,8 @@ static void confirm_suggestion(Text *text, int skipleft) {
texttool_text_clear();
}
-static short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val) {
+static short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
+{
int draw=0, tools=0, swallow=0, scroll=1;
if (!texttool_text_is_active(st->text)) return 0;
if (!st->text || st->text->id.lib) return 0;
@@ -2403,7 +2439,8 @@ static short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short
return swallow;
}
-static short do_markers(SpaceText *st, char ascii, unsigned short evnt, short val) {
+static short do_markers(SpaceText *st, char ascii, unsigned short evnt, short val)
+{
Text *text;
TextMarker *marker, *mrk, *nxt;
int c, s, draw=0, swallow=0;
@@ -2570,12 +2607,12 @@ static short do_markers(SpaceText *st, char ascii, unsigned short evnt, short va
void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
- unsigned short event= evt->event;
- short val= evt->val;
- char ascii= evt->ascii;
SpaceText *st= curarea->spacedata.first;
Text *text;
int do_draw=0, p;
+ unsigned short event= evt->event;
+ short val= evt->val;
+ char ascii= evt->ascii;
if (st==NULL || st->spacetype != SPACE_TEXT) return;
@@ -2899,8 +2936,10 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break; /* BREAK Q */
case RKEY:
if (G.qual == LR_ALTKEY) {
+#ifndef DISABLE_PYTHON
if (text->compiled) BPY_free_compiled_text(text);
text->compiled = NULL;
+#endif
if (okee("Reopen text")) {
if (!reopen_text(text))
error("Could not reopen file");
@@ -3169,24 +3208,25 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}
+#ifndef DISABLE_PYTHON
/* Run text plugin scripts if enabled */
if (st->doplugins && event && val) {
if (BPY_menu_do_shortcut(PYMENU_TEXTPLUGIN, event, G.qual)) {
do_draw= 1;
}
}
-
+#endif
if (do_draw)
redraw_alltext();
}
-void draw_brackets(SpaceText *st)
+static void draw_brackets(SpaceText *st)
{
- char ch;
- int b, c, startc, endc, find, stack;
- int viewc, viewl, offl, offc, x, y;
TextLine *startl, *endl, *linep;
Text *text = st->text;
+ int b, c, startc, endc, find, stack;
+ int viewc, viewl, offl, offc, x, y;
+ char ch;
if (!text || !text->curl) return;
@@ -3305,13 +3345,15 @@ static int check_delim(char ch)
return 0;
}
-static int check_digit(char ch) {
+static int check_digit(char ch)
+{
if (ch < '0') return 0;
if (ch <= '9') return 1;
return 0;
}
-static int check_identifier(char ch) {
+static int check_identifier(char ch)
+{
if (ch < '0') return 0;
if (ch <= '9') return 1;
if (ch < 'A') return 0;
@@ -3321,7 +3363,8 @@ static int check_identifier(char ch) {
return 0;
}
-static int check_whitespace(char ch) {
+static int check_whitespace(char ch)
+{
if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n')
return 1;
return 0;
@@ -3331,9 +3374,9 @@ void convert_tabs (struct SpaceText *st, int tab)
{
Text *text = st->text;
TextLine *tmp;
+ size_t a, j;
char *check_line, *new_line;
int extra, number; //unknown for now
- size_t a, j;
if (!text) return;
diff --git a/source/blender/src/drawtime.c b/source/blender/src/drawtime.c
index 039184a0e43..14e6336c6a9 100644
--- a/source/blender/src/drawtime.c
+++ b/source/blender/src/drawtime.c
@@ -437,21 +437,27 @@ static void draw_ob_keys()
}
/* Materials (only relevant for geometry objects) - some filtering might occur */
+ // err... is this ok?
filter= (stime->flag & TIME_ONLYACTSEL);
- for (a=0; a<ob->totcol; a++) {
- Material *ma= give_current_material(ob, a+1);
+ if (filter) {
+ Material *ma= give_current_material(ob, (ob->actcol + 1));
- /* the only filter we apply right now is only showing the active material */
- if (filter) {
- ok= (ob->actcol==a)? 1 : 0;
- }
- else ok= 1;
-
- if (ma && ma->ipo && ok) {
+ /* we only retrieve the active material... */
+ if (ma && ma->ipo) {
col[0] = 0xDD; col[1] = 0xA7; col[2] = 0x00;
draw_ipo_keys(ma->ipo, col);
}
}
+ else {
+ for (a=0; a<ob->totcol; a++) {
+ Material *ma= give_current_material(ob, a+1);
+
+ if (ma && ma->ipo) {
+ col[0] = 0xDD; col[1] = 0xA7; col[2] = 0x00;
+ draw_ipo_keys(ma->ipo, col);
+ }
+ }
+ }
}
}
diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c
index 60d7ab599ab..de3e464060d 100644
--- a/source/blender/src/drawview.c
+++ b/source/blender/src/drawview.c
@@ -122,6 +122,7 @@
#include "BIF_glutil.h"
#include "BIF_interface.h"
#include "BIF_interface_icons.h"
+#include "BIF_keyframing.h"
#include "BIF_mywindow.h"
#include "BIF_poseobject.h"
#include "BIF_previewrender.h"
@@ -152,7 +153,9 @@
#include "BSE_time.h"
#include "BSE_view.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "RE_render_ext.h"
@@ -164,6 +167,8 @@
#include "RE_pipeline.h" // make_stars
+#include "reeb.h"
+
#include "GPU_draw.h"
#include "GPU_material.h"
@@ -181,7 +186,7 @@
#include "radio.h"
/* locals */
-void drawname(Object *ob);
+//static void drawname(Object *ob);
static void star_stuff_init_func(void)
{
@@ -1199,7 +1204,8 @@ exit:
return index;
}
-void drawname(Object *ob)
+#if 0
+static void drawname(Object *ob)
{
cpack(0x404040);
glRasterPos3f(0.0, 0.0, 0.0);
@@ -1207,6 +1213,7 @@ void drawname(Object *ob)
BMF_DrawString(G.font, " ");
BMF_DrawString(G.font, ob->id.name+2);
}
+#endif
static char *get_cfra_marker_name()
{
@@ -1217,93 +1224,15 @@ static char *get_cfra_marker_name()
for (m1=markers->first, m2=markers->last; m1 && m2; m1=m1->next, m2=m2->prev) {
if (m1->frame==CFRA)
return m1->name;
- if (m2->frame==CFRA)
- return m2->name;
if (m1 == m2)
- break;
- }
-
- return NULL;
-}
-
-// TODO: move this func into some keyframing API
-short ob_cfra_has_keyframe (Object *ob)
-{
- // fixme... this is slow!
- if (ob) {
- ListBase keys = {NULL, NULL};
- ActKeyColumn *ak, *akn;
- Key *key= ob_get_key(ob);
- int cfra, found= 0;
-
- /* check active action */
- if (ob->action) {
- /* get keyframes of action */
- action_to_keylist(ob->action, &keys, NULL, NULL);
-
- cfra= frame_to_float(CFRA);
- cfra= get_action_frame(ob, cfra);
-
- /* check if a keyframe occurs on current frame */
- for (ak=keys.first, akn=keys.last; ak && akn; ak=ak->next, akn=akn->prev) {
- if (cfra == ak->cfra) {
- found= 1;
- break;
- }
- else if (cfra == akn->cfra) {
- found= 1;
- break;
- }
-
- if (ak == akn)
- break;
- }
-
- /* free temp list */
- BLI_freelistN(&keys);
- keys.first= keys.last= NULL;
-
- /* return if found */
- if (found) return 1;
- }
+ break;
- /* accumulate keyframes for available ipo's */
- if (ob->ipo)
- ipo_to_keylist(ob->ipo, &keys, NULL, NULL);
- if (key)
- ipo_to_keylist(key->ipo, &keys, NULL, NULL);
-
- if (keys.first) {
- cfra= frame_to_float(CFRA);
- found= 0;
-
- /* check if a keyframe occurs on current frame */
- for (ak=keys.first, akn=keys.last; ak && akn; ak=ak->next, akn=akn->prev) {
- if (IS_EQ(cfra, ak->cfra)) {
- found= 1;
- break;
- }
- else if (IS_EQ(cfra, akn->cfra)) {
- found= 1;
- break;
- }
-
- if (ak == akn)
- break;
- }
-
- /* free temp list */
- BLI_freelistN(&keys);
- keys.first= keys.last= NULL;
-
- /* return if found */
- if (found) return 1;
- }
+ if (m2->frame==CFRA)
+ return m2->name;
}
- /* couldn't find a keyframe */
- return 0;
+ return NULL;
}
/* draw info beside axes in bottom left-corner:
@@ -1382,7 +1311,7 @@ static void draw_selected_name(Object *ob)
}
/* colour depends on whether there is a keyframe */
- if (ob_cfra_has_keyframe(ob))
+ if (id_frame_has_keyframe((ID *)ob, frame_to_float(CFRA), G.vd->keyflags))
BIF_ThemeColor(TH_VERTEX_SELECT);
else
BIF_ThemeColor(TH_TEXT_HI);
@@ -2609,7 +2538,6 @@ static void view3d_panel_properties(short cntrl) // VIEW3D_HANDLER_SETTINGS
uiBlockEndAlign(block);
uiDefBut(block, LABEL, 1, "Display:", 10, 50, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
-
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, V3D_SELECT_OUTLINE, REDRAWVIEW3D, "Outline Selected", 10, 30, 140, 19, &vd->flag, 0, 0, 0, 0, "Highlight selected objects with an outline, in Solid, Shaded or Textured viewport shading modes");
uiDefButBitS(block, TOG, V3D_DRAW_CENTERS, REDRAWVIEW3D, "All Object Centers", 10, 10, 140, 19, &vd->flag, 0, 0, 0, 0, "Draw the center points on all objects");
@@ -2617,11 +2545,21 @@ static void view3d_panel_properties(short cntrl) // VIEW3D_HANDLER_SETTINGS
uiDefButBitS(block, TOG, V3D_SOLID_TEX, REDRAWVIEW3D, "Solid Tex", 10, -30, 140, 19, &vd->flag2, 0, 0, 0, 0, "Display textures in Solid draw type (Shift T)");
uiBlockEndAlign(block);
- uiDefBut(block, LABEL, 1, "View Locking:", 160, 50, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, LABEL, 1, "View Locking:", 160, 60, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, REDRAWVIEW3D, "Object:", 160, 30, 140, 19, &vd->ob_centre, "Lock view to center to this Object");
- uiDefBut(block, TEX, REDRAWVIEW3D, "Bone:", 160, 10, 140, 19, vd->ob_centre_bone, 1, 31, 0, 0, "If view locked to Object, use this Bone to lock to view to");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, REDRAWVIEW3D, "Object:", 160, 40, 140, 19, &vd->ob_centre, "Lock view to center to this Object");
+ uiDefBut(block, TEX, REDRAWVIEW3D, "Bone:", 160, 20, 140, 19, vd->ob_centre_bone, 1, 31, 0, 0, "If view locked to Object, use this Bone to lock to view to");
+ uiDefBut(block, LABEL, 1, "Keyframe Display:", 160, -2, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, ANIMFILTER_ACTIVE, REDRAWVIEW3D, "Active",160, -22, 50, 19, &vd->keyflags, 0, 0, 0, 0, "Show keyframes for active element only (i.e. active bone or active material)");
+ uiDefButBitS(block, TOG, ANIMFILTER_MUTED, REDRAWVIEW3D, "Muted",210, -22, 50, 19, &vd->keyflags, 0, 0, 0, 0, "Show keyframes in muted channels");
+ uiDefButBitS(block, TOG, ANIMFILTER_LOCAL, REDRAWVIEW3D, "Local",260, -22, 50, 19, &vd->keyflags, 0, 0, 0, 0, "Show keyframes directly connected to datablock");
+ if ((vd->keyflags & ANIMFILTER_LOCAL)==0) {
+ uiDefButBitS(block, TOGN, ANIMFILTER_NOMAT, REDRAWVIEW3D, "Material",160, -42, 75, 19, &vd->keyflags, 0, 0, 0, 0, "Show keyframes for any available Materials");
+ uiDefButBitS(block, TOGN, ANIMFILTER_NOSKEY, REDRAWVIEW3D, "ShapeKey",235, -42, 75, 19, &vd->keyflags, 0, 0, 0, 0, "Show keyframes for any available Shape Keys");
+ }
+ uiBlockEndAlign(block);
}
static void view3d_panel_preview(ScrArea *sa, short cntrl) // VIEW3D_HANDLER_PREVIEW
@@ -3195,13 +3133,9 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
}
if(v3d->drawtype > OB_WIRE) {
- if(G.f & G_SIMULATION)
- glClearColor(0.0, 0.0, 0.0, 0.0);
- else {
- float col[3];
- BIF_GetThemeColor3fv(TH_BACK, col);
- glClearColor(col[0], col[1], col[2], 0.0);
- }
+ float col[3];
+ BIF_GetThemeColor3fv(TH_BACK, col);
+ glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
@@ -3308,6 +3242,8 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
BIF_drawPropCircle(); // only editmode and particles have proportional edit
BIF_drawSnap();
}
+
+ REEB_draw();
if(G.scene->radio) RAD_drawall(v3d->drawtype>=OB_SOLID);
@@ -3420,6 +3356,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
}
}
+#ifndef DISABLE_PYTHON
/* run any view3d draw handler script links */
if (sa->scriptlink.totscript)
BPY_do_spacehandlers(sa, 0, 0, SPACEHANDLER_VIEW3D_DRAW);
@@ -3429,7 +3366,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
!during_script()) {
BPY_do_pyscript((ID *)G.scene, SCRIPT_REDRAW);
}
-
+#endif
}
void drawview3d_render(struct View3D *v3d, float viewmat[][4], int winx, int winy, float winmat[][4], int shadow)
@@ -3489,8 +3426,9 @@ void drawview3d_render(struct View3D *v3d, float viewmat[][4], int winx, int win
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- /* abuse! to make sure it doesnt draw the helpstuff */
- G.f |= G_SIMULATION;
+ G.f |= G_RENDER_OGL;
+ if(shadow)
+ G.f |= G_RENDER_SHADOW;
/* first draw set */
if(G.scene->set) {
@@ -3559,14 +3497,14 @@ void drawview3d_render(struct View3D *v3d, float viewmat[][4], int winx, int win
glDisable(GL_DEPTH_TEST);
}
- if(v3d->gpd) {
- /* draw grease-pencil overlays
+ if((v3d->gpd) && (v3d->flag2 & V3D_DISPGP)) {
+ /* draw grease-pencil overlays (only if enabled)
* WARNING: view matrices are altered here!
*/
draw_gpencil_oglrender(v3d, winx, winy);
}
- G.f &= ~G_SIMULATION;
+ G.f &= ~(G_RENDER_OGL|G_RENDER_SHADOW);
if(!shadow) {
glFlush();
diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c
index a44bbc3af0f..a80e7b6c360 100644
--- a/source/blender/src/edit.c
+++ b/source/blender/src/edit.c
@@ -136,10 +136,8 @@ extern void obedit_selectionCB(short selecting, Object *editobj,
extern void uvedit_selectionCB(short selecting, Object *editobj,
short *mval, float rad);
-void circle_selectCB(select_CBfunc func);
+static void circle_selectCB(select_CBfunc func);
-/* local protos ---------------*/
-void snap_curs_to_firstsel(void);
/* flag==2 only border, flag==3 cross+border
flag==5 cross + border + start&end frame
@@ -478,7 +476,7 @@ void draw_sel_circle(short *mval, short *mvalo, float rad, float rado, int selec
* it (hopefully) reusable for other windows than the 3D view.
*/
-void circle_selectCB(select_CBfunc callback)
+static void circle_selectCB(select_CBfunc callback)
{
static float rad= 40.0;
float rado= rad;
@@ -1548,72 +1546,6 @@ void snap_curs_to_active()
allqueue(REDRAWVIEW3D, 0);
}
-void snap_curs_to_firstsel()
-{
- TransVert *tv;
- Base *base;
- float *curs, bmat[3][3], vec[3], min[3], max[3], centroid[3];
- int count;
-
- curs= give_cursor();
-
- count= 0;
- INIT_MINMAX(min, max);
- centroid[0]= centroid[1]= centroid[2]= 0.0;
-
- if(G.obedit) {
- tottrans=0;
-
- if ELEM6(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
- make_trans_verts(bmat[0], bmat[1], 0);
- if(tottrans==0) return;
-
- Mat3CpyMat4(bmat, G.obedit->obmat);
-
- tv= transvmain;
- VECCOPY(vec, tv->loc);
- /*Mat3MulVecfl(bmat, vec);
- VecAddf(vec, vec, G.obedit->obmat[3]);
- VecAddf(centroid, centroid, vec);
- DO_MINMAX(vec, min, max);*/
-
- if(G.vd->around==V3D_CENTROID) {
- VecMulf(vec, 1.0/(float)tottrans);
- VECCOPY(curs, vec);
- }
- else {
- curs[0]= vec[0];
- curs[1]= vec[1];
- curs[2]= vec[2];
- }
- MEM_freeN(transvmain);
- transvmain= 0;
- }
- else {
- base= (G.scene->base.first);
- while(base) {
- if(((base)->flag & SELECT) && ((base)->lay & G.vd->lay) ) {
- VECCOPY(vec, base->object->obmat[3]);
- VecAddf(centroid, centroid, vec);
- DO_MINMAX(vec, min, max);
- count++;
- }
- base= base->next;
- }
- if(count) {
- if(G.vd->around==V3D_CENTROID) {
- VecMulf(centroid, 1.0/(float)count);
- VECCOPY(curs, centroid);
- }
- else {
- curs[0]= (min[0]+max[0])/2;
- curs[1]= (min[1]+max[1])/2;
- curs[2]= (min[2]+max[2])/2;
- }
- }
- }
- allqueue(REDRAWVIEW3D, 0);
-}
void snap_to_center()
{
diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c
index 220265fcbaf..e230c97f010 100644
--- a/source/blender/src/editaction.c
+++ b/source/blender/src/editaction.c
@@ -436,7 +436,7 @@ static void actdata_filter_action (ListBase *act_data, bAction *act, int filter_
*/
if ( (!(filter_mode & ACTFILTER_VISIBLE) || EXPANDED_AGRP(agrp)) ||
( ((filter_mode & ACTFILTER_IPOKEYS) || (filter_mode & ACTFILTER_ONLYICU)) &&
- !(filter_mode & ACTFILTER_SEL) ) )
+ (!(filter_mode & ACTFILTER_SEL) || (SEL_AGRP(agrp))) ) )
{
if (!(filter_mode & ACTFILTER_FOREDIT) || EDITABLE_AGRP(agrp)) {
for (achan= agrp->channels.first; achan && achan->grp==agrp; achan= achan->next) {
@@ -529,6 +529,14 @@ static void actdata_filter_gpencil (ListBase *act_data, bScreen *sc, int filter_
/* check if filtering types are appropriate */
if ( !(filter_mode & (ACTFILTER_IPOKEYS|ACTFILTER_ONLYICU|ACTFILTER_ACTGROUPED)) )
{
+ /* special hack for fullscreen area (which must be this one then):
+ * - we use the curarea->full as screen to get spaces from, since the
+ * old (pre-fullscreen) screen was stored there...
+ * - this is needed as all data would otherwise disappear
+ */
+ if ((curarea->full) && (curarea->spacetype==SPACE_ACTION))
+ sc= curarea->full;
+
/* loop over spaces in current screen, finding gpd blocks (could be slow!) */
for (sa= sc->areabase.first; sa; sa= sa->next) {
/* try to get gp data */
@@ -803,6 +811,14 @@ static void *get_nearest_action_key (float *selx, short *sel, short *ret_type, b
bActionGroup *agrp= (bActionGroup *)ale->data;
agroup_to_keylist(agrp, &act_keys, NULL, NULL);
}
+ else if (ale->type == ACTTYPE_GPDATABLOCK) {
+ /* cleanup */
+ BLI_freelistN(&act_data);
+
+ /* this channel currently doens't have any keyframes... must ignore! */
+ *ret_type= ACTTYPE_NONE;
+ return NULL;
+ }
else if (ale->type == ACTTYPE_GPLAYER) {
bGPDlayer *gpl= (bGPDlayer *)ale->data;
gpl_to_keylist(gpl, &act_keys, NULL, NULL);
@@ -919,8 +935,8 @@ void action_previewrange_set (bAction *act)
}
/* set preview range */
- G.scene->r.psfra= start;
- G.scene->r.pefra= end;
+ G.scene->r.psfra= (int)start;
+ G.scene->r.pefra= (int)end;
BIF_undo_push("Set anim-preview range");
allqueue(REDRAWTIME, 0);
@@ -1814,7 +1830,7 @@ void clean_action (void)
/* don't proceed any further if nothing to work on or user refuses */
data= get_action_context(&datatype);
ok= fbutton(&G.scene->toolsettings->clean_thresh,
- 0.0000001f, 1.0, 0.001, 0.1,
+ 0.0000001f, 1.0f, 0.001f, 0.1f,
"Clean Threshold");
if (!ok) return;
if (datatype == ACTCONT_GPENCIL) return;
@@ -2079,9 +2095,9 @@ void paste_actdata ()
short datatype;
Object *ob= OBACT;
- short no_name= 0;
- float offset = CFRA - actcopy_firstframe;
+ const float offset = (float)(CFRA - actcopy_firstframe);
char *actname = NULL, *conname = NULL;
+ short no_name= 0;
/* check if buffer is empty */
if (ELEM(NULL, actcopybuf.first, actcopybuf.last)) {
@@ -2102,13 +2118,13 @@ void paste_actdata ()
/* from selected channels */
for (ale= act_data.first; ale; ale= ale->next) {
- Ipo *ipo_src=NULL;
+ Ipo *ipo_src = NULL;
bActionChannel *achan;
IpoCurve *ico, *icu;
BezTriple *bezt;
int i;
- /* find matching ipo-block */
+ /* find suitable IPO-block from buffer to paste from */
for (achan= actcopybuf.first; achan; achan= achan->next) {
/* try to match data */
if (ale->ownertype == ACTTYPE_ACHAN) {
@@ -2116,7 +2132,7 @@ void paste_actdata ()
/* check if we have a corresponding action channel */
if ((no_name) || (strcmp(achan->name, achant->name)==0)) {
- actname= achan->name;
+ actname= achant->name;
/* check if this is a constraint channel */
if (ale->type == ACTTYPE_CONCHAN) {
@@ -2125,7 +2141,7 @@ void paste_actdata ()
for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
if (strcmp(conchan->name, conchant->name)==0) {
- conname= conchan->name;
+ conname= conchant->name;
ipo_src= conchan->ipo;
break;
}
@@ -2141,7 +2157,7 @@ void paste_actdata ()
else if (ale->ownertype == ACTTYPE_SHAPEKEY) {
/* check if this action channel is "#ACP_ShapeKey" */
if ((no_name) || (strcmp(achan->name, "#ACP_ShapeKey")==0)) {
- actname= achan->name;
+ actname= NULL;
ipo_src= achan->ipo;
break;
}
@@ -2154,7 +2170,8 @@ void paste_actdata ()
/* loop over curves, pasting keyframes */
for (ico= ipo_src->curve.first; ico; ico= ico->next) {
- icu= verify_ipocurve((ID*)ob, ico->blocktype, actname, conname, NULL, ico->adrcode, 1);
+ /* get IPO-curve to paste to (IPO-curve might not exist for destination, so gets created) */
+ icu= verify_ipocurve((ID *)ob, ico->blocktype, actname, conname, NULL, ico->adrcode, 1);
if (icu) {
/* just start pasting, with the the first keyframe on the current frame, and so on */
@@ -3187,8 +3204,8 @@ void selectall_action_keys (short mval[], short mode, short select_mode)
rectf.xmax= rectf.xmin;
rectf.ymax= rectf.ymin;
- rectf.xmin = rectf.xmin - 0.5;
- rectf.xmax = rectf.xmax + 0.5;
+ rectf.xmin = rectf.xmin - 0.5f;
+ rectf.xmax = rectf.xmax + 0.5f;
/* filter data */
if (datatype == ACTCONT_GPENCIL)
@@ -3371,11 +3388,11 @@ void nextprev_action_keyframe (short dir)
short changed= 0;
if ((dir > 0) && (nearest->next)) {
- CFRA= nearest->next->cfra;
+ CFRA= (int)nearest->next->cfra;
changed= 1;
}
else if ((dir < 0) && (nearest->prev)) {
- CFRA= nearest->prev->cfra;
+ CFRA= (int)nearest->prev->cfra;
changed= 1;
}
@@ -3465,9 +3482,9 @@ void column_select_action_keys (int mode)
/* apply scaled action correction if needed */
if (NLA_ACTION_SCALED && datatype==ACTCONT_ACTION)
- ce->cfra= get_action_frame(OBACT, CFRA);
+ ce->cfra= (float)get_action_frame(OBACT, (float)CFRA);
else
- ce->cfra= CFRA;
+ ce->cfra= (float)CFRA;
}
/* loop through all of the keys and select additional keyframes
@@ -3944,7 +3961,7 @@ static void mouse_action (int selectmode)
}
}
else if (gpl)
- select_gpencil_frame(gpl, selx, selectmode);
+ select_gpencil_frame(gpl, (int)selx, selectmode);
std_rmouse_transform(transform_action_keys);
@@ -5155,21 +5172,28 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case DELKEY:
case XKEY:
- if (okee("Erase selected")) {
- if (mval[0] < NAMEWIDTH) {
- if (datatype == ACTCONT_ACTION)
- delete_action_channels();
- else if (datatype == ACTCONT_GPENCIL)
- delete_gpencil_layers();
+ /* markers are incorported under shift-modifier (it does go against conventions, but oh well :/) */
+ if (G.qual == LR_SHIFTKEY) {
+ if (okee("Erase selected marker(s)?")) {
+ if (mval[0] >= NAMEWIDTH)
+ remove_marker();
}
- else
- delete_action_keys();
-
- if (mval[0] >= NAMEWIDTH)
- remove_marker();
-
- allqueue(REDRAWMARKER, 0);
}
+ else {
+ if (okee("Erase selected?")) {
+ if (mval[0] < NAMEWIDTH) {
+ if (datatype == ACTCONT_ACTION)
+ delete_action_channels();
+ else if (datatype == ACTCONT_GPENCIL)
+ delete_gpencil_layers();
+ }
+ else
+ delete_action_keys();
+ }
+ }
+
+ allqueue(REDRAWMARKER, 0);
+
break;
case ACCENTGRAVEKEY:
@@ -5187,7 +5211,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
openclose_level_action(1);
}
else {
- view2d_zoom(G.v2d, 0.1154, sa->winx, sa->winy);
+ view2d_zoom(G.v2d, 0.1154f, sa->winx, sa->winy);
test_view2d(G.v2d, sa->winx, sa->winy);
view2d_do_locks(curarea, V2D_LOCK_COPY);
@@ -5200,7 +5224,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
openclose_level_action(-1);
}
else {
- view2d_zoom(G.v2d, -0.15, sa->winx, sa->winy);
+ view2d_zoom(G.v2d, -0.15f, sa->winx, sa->winy);
test_view2d(G.v2d, sa->winx, sa->winy);
view2d_do_locks(curarea, V2D_LOCK_COPY);
diff --git a/source/blender/src/editaction_gpencil.c b/source/blender/src/editaction_gpencil.c
index 14269080b1f..fb070624e8f 100644
--- a/source/blender/src/editaction_gpencil.c
+++ b/source/blender/src/editaction_gpencil.c
@@ -1,5 +1,5 @@
/**
- * $Id: editaction_gpencil.c 14881 2008-05-18 10:41:42Z aligorith $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -83,7 +83,7 @@
#include "blendef.h"
#include "butspace.h"
-#include "PIL_time.h" /* sleep */
+#include "PIL_time.h"
#include "mydevice.h"
/* ***************************************** */
@@ -133,7 +133,7 @@ void gplayer_make_cfra_list (bGPDlayer *gpl, ListBase *elems, short onlysel)
if ((onlysel == 0) || (gpf->flag & GP_FRAME_SELECT)) {
ce= MEM_callocN(sizeof(CfraElem), "CfraElem");
- ce->cfra= gpf->framenum;
+ ce->cfra= (float)gpf->framenum;
ce->sel= (gpf->flag & GP_FRAME_SELECT) ? 1 : 0;
BLI_addtail(elems, ce);
@@ -220,17 +220,22 @@ void set_gplayer_frame_selection (bGPDlayer *gpl, short mode)
select_gpencil_frames (gpl, mode);
}
+/* select the frame in this layer that occurs on this frame (there should only be one at most) */
void select_gpencil_frame (bGPDlayer *gpl, int selx, short select_mode)
{
bGPDframe *gpf;
/* search through frames for a match */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- if (gpf->framenum == selx)
+ /* there should only be one frame with this frame-number */
+ if (gpf->framenum == selx) {
gpframe_select(gpf, select_mode);
+ break;
+ }
}
}
+/* select the frames in this layer that occur within the bounds specified */
void borderselect_gplayer_frames (bGPDlayer *gpl, float min, float max, short select_mode)
{
bGPDframe *gpf;
@@ -290,6 +295,7 @@ void deselect_gpencil_layers (void *data, short mode)
/* ***************************************** */
/* Frame Editing Tools */
+/* Delete selected grease-pencil layers */
void delete_gpencil_layers (void)
{
ListBase act_data = {NULL, NULL};
@@ -362,23 +368,224 @@ void duplicate_gplayer_frames (bGPDlayer *gpl)
/* duplicate this frame */
if (gpf->flag & GP_FRAME_SELECT) {
bGPDframe *gpfd;
- bGPDstroke *gps;
/* duplicate frame, and deselect self */
- gpfd= MEM_dupallocN(gpf);
+ gpfd= gpencil_frame_duplicate(gpf);
gpf->flag &= ~GP_FRAME_SELECT;
- /* duplicate list of strokes too */
- duplicatelist(&gpfd->strokes, &gpf->strokes);
+ BLI_insertlinkafter(&gpl->frames, gpf, gpfd);
+ }
+ }
+}
+
+/* -------------------------------------- */
+/* Copy and Paste Tools */
+/* - The copy/paste buffer currently stores a set of GP_Layers, with temporary
+ * GP_Frames with the necessary strokes
+ * - Unless there is only one element in the buffer, names are also tested to check for compatability.
+ * - All pasted frames are offset by the same amount. This is calculated as the difference in the times of
+ * the current frame and the 'first keyframe' (i.e. the earliest one in all channels).
+ * - The earliest frame is calculated per copy operation.
+ */
+
+/* globals for copy/paste data (like for other copy/paste buffers) */
+ListBase gpcopybuf = {NULL, NULL};
+static int gpcopy_firstframe= 999999999;
+
+/* This function frees any MEM_calloc'ed copy/paste buffer data */
+void free_gpcopybuf ()
+{
+ free_gpencil_layers(&gpcopybuf);
+
+ gpcopybuf.first= gpcopybuf.last= NULL;
+ gpcopy_firstframe= 999999999;
+}
+
+/* This function adds data to the copy/paste buffer, freeing existing data first
+ * Only the selected GP-layers get their selected keyframes copied.
+ */
+void copy_gpdata ()
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+
+ /* clear buffer first */
+ free_gpcopybuf();
+
+ /* get data */
+ data= get_action_context(&datatype);
+ if (data == NULL) return;
+ if (datatype != ACTCONT_GPENCIL) return;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* assume that each of these is an ipo-block */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ bGPDlayer *gpls, *gpln;
+ bGPDframe *gpf, *gpfn;
+
+ /* get new layer to put into buffer */
+ gpls= (bGPDlayer *)ale->data;
+ gpln= MEM_callocN(sizeof(bGPDlayer), "GPCopyPasteLayer");
+
+ gpln->frames.first= gpln->frames.last= NULL;
+ strcpy(gpln->info, gpls->info);
+
+ BLI_addtail(&gpcopybuf, gpln);
+
+ /* loop over frames, and copy only selected frames */
+ for (gpf= gpls->frames.first; gpf; gpf= gpf->next) {
+ /* if frame is selected, make duplicate it and its strokes */
+ if (gpf->flag & GP_FRAME_SELECT) {
+ /* add frame to buffer */
+ gpfn= gpencil_frame_duplicate(gpf);
+ BLI_addtail(&gpln->frames, gpfn);
+
+ /* check if this is the earliest frame encountered so far */
+ if (gpf->framenum < gpcopy_firstframe)
+ gpcopy_firstframe= gpf->framenum;
+ }
+ }
+ }
+
+ /* check if anything ended up in the buffer */
+ if (ELEM(NULL, gpcopybuf.first, gpcopybuf.last))
+ error("Nothing copied to buffer");
+
+ /* free temp memory */
+ BLI_freelistN(&act_data);
+}
+
+void paste_gpdata ()
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+
+ const int offset = (CFRA - gpcopy_firstframe);
+ short no_name= 0;
+
+ /* check if buffer is empty */
+ if (ELEM(NULL, gpcopybuf.first, gpcopybuf.last)) {
+ error("No data in buffer to paste");
+ return;
+ }
+ /* check if single channel in buffer (disregard names if so) */
+ if (gpcopybuf.first == gpcopybuf.last)
+ no_name= 1;
+
+ /* get data */
+ data= get_action_context(&datatype);
+ if (data == NULL) return;
+ if (datatype != ACTCONT_GPENCIL) return;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_FOREDIT);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* from selected channels */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ bGPDlayer *gpld= (bGPDlayer *)ale->data;
+ bGPDlayer *gpls= NULL;
+ bGPDframe *gpfs, *gpf;
+
+ /* find suitable layer from buffer to use to paste from */
+ for (gpls= gpcopybuf.first; gpls; gpls= gpls->next) {
+ /* check if layer name matches */
+ if ((no_name) || (strcmp(gpls->info, gpld->info)==0))
+ break;
+ }
+
+ /* this situation might occur! */
+ if (gpls == NULL)
+ continue;
+
+ /* add frames from buffer */
+ for (gpfs= gpls->frames.first; gpfs; gpfs= gpfs->next) {
+ /* temporarily apply offset to buffer-frame while copying */
+ gpfs->framenum += offset;
- /* dupalloc only makes another copy of mem, but doesn't adjust pointers */
- for (gps= gpfd->strokes.first; gps; gps= gps->next) {
- gps->points= MEM_dupallocN(gps->points);
+ /* get frame to copy data into (if no frame returned, then just ignore) */
+ gpf= gpencil_layer_getframe(gpld, gpfs->framenum, 1);
+ if (gpf) {
+ bGPDstroke *gps, *gpsn;
+ ScrArea *sa;
+
+ /* get area that gp-data comes from */
+ sa= gpencil_data_findowner((bGPdata *)ale->owner);
+
+ /* this should be the right frame... as it may be a pre-existing frame,
+ * must make sure that only compatible stroke types get copied over
+ * - we cannot just add a duplicate frame, as that would cause errors
+ * - need to check for compatible types to minimise memory usage (copying 'junk' over)
+ */
+ for (gps= gpfs->strokes.first; gps; gps= gps->next) {
+ short stroke_ok;
+
+ /* if there's an area, check that it supports this type of stroke */
+ if (sa) {
+ stroke_ok= 0;
+
+ /* check if spacetype supports this type of stroke
+ * - NOTE: must sync this with gp_paint_initstroke() in gpencil.c
+ */
+ switch (sa->spacetype) {
+ case SPACE_VIEW3D: /* 3D-View: either screen-aligned or 3d-space */
+ if ((gps->flag == 0) || (gps->flag & GP_STROKE_3DSPACE))
+ stroke_ok= 1;
+ break;
+
+ case SPACE_NODE: /* Nodes Editor: either screen-aligned or view-aligned */
+ case SPACE_IMAGE: /* Image Editor: either screen-aligned or view\image-aligned */
+ if ((gps->flag == 0) || (gps->flag & GP_STROKE_2DSPACE))
+ stroke_ok= 1;
+ break;
+
+ case SPACE_SEQ: /* Sequence Editor: either screen-aligned or view-aligned */
+ if ((gps->flag == 0) || (gps->flag & GP_STROKE_2DIMAGE))
+ stroke_ok= 1;
+ break;
+ }
+ }
+ else
+ stroke_ok= 1;
+
+ /* if stroke is ok, we make a copy of this stroke and add to frame */
+ if (stroke_ok) {
+ /* make a copy of stroke, then of its points array */
+ gpsn= MEM_dupallocN(gps);
+ gpsn->points= MEM_dupallocN(gps->points);
+
+ /* append stroke to frame */
+ BLI_addtail(&gpf->strokes, gpsn);
+ }
+ }
+
+ /* if no strokes (i.e. new frame) added, free gpf */
+ if (gpf->strokes.first == NULL)
+ gpencil_layer_delframe(gpld, gpf);
}
- BLI_insertlinkafter(&gpl->frames, gpf, gpfd);
+ /* unapply offset from buffer-frame */
+ gpfs->framenum -= offset;
}
}
+
+ /* free temp memory */
+ BLI_freelistN(&act_data);
+
+ /* undo and redraw stuff */
+ allqueue(REDRAWVIEW3D, 0);
+ //allqueue(REDRAWNODES, 0);
+ allqueue(REDRAWACTION, 0);
+ BIF_undo_push("Paste Grease Pencil Frames");
}
/* -------------------------------------- */
@@ -393,7 +600,7 @@ static short snap_gpf_nearest (bGPDframe *gpf)
static short snap_gpf_nearestsec (bGPDframe *gpf)
{
- float secf = FPS;
+ float secf = (float)FPS;
if (gpf->flag & GP_FRAME_SELECT)
gpf->framenum= (int)(floor(gpf->framenum/secf + 0.5f) * secf);
return 0;
@@ -409,7 +616,7 @@ static short snap_gpf_cframe (bGPDframe *gpf)
static short snap_gpf_nearmarker (bGPDframe *gpf)
{
if (gpf->flag & GP_FRAME_SELECT)
- gpf->framenum= (int)find_nearest_marker_time(gpf->framenum);
+ gpf->framenum= (int)find_nearest_marker_time((float)gpf->framenum);
return 0;
}
@@ -441,11 +648,11 @@ void snap_gplayer_frames (bGPDlayer *gpl, short mode)
static short mirror_gpf_cframe (bGPDframe *gpf)
{
- float diff;
+ int diff;
if (gpf->flag & GP_FRAME_SELECT) {
- diff= ((float)CFRA - gpf->framenum);
- gpf->framenum= ((float)CFRA + diff);
+ diff= CFRA - gpf->framenum;
+ gpf->framenum= CFRA;
}
return 0;
@@ -453,11 +660,11 @@ static short mirror_gpf_cframe (bGPDframe *gpf)
static short mirror_gpf_yaxis (bGPDframe *gpf)
{
- float diff;
+ int diff;
if (gpf->flag & GP_FRAME_SELECT) {
- diff= (0.0f - gpf->framenum);
- gpf->framenum= (0.0f + diff);
+ diff= -gpf->framenum;
+ gpf->framenum= diff;
}
return 0;
@@ -465,11 +672,11 @@ static short mirror_gpf_yaxis (bGPDframe *gpf)
static short mirror_gpf_xaxis (bGPDframe *gpf)
{
- float diff;
+ int diff;
if (gpf->flag & GP_FRAME_SELECT) {
- diff= (0.0f - gpf->framenum);
- gpf->framenum= (0.0f + diff);
+ diff= -gpf->framenum;
+ gpf->framenum= diff;
}
return 0;
@@ -479,7 +686,7 @@ static short mirror_gpf_marker (bGPDframe *gpf)
{
static TimeMarker *marker;
static short initialised = 0;
- float diff;
+ int diff;
/* In order for this mirror function to work without
* any extra arguments being added, we use the case
diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c
index d5e5b5a1c4a..5ddf522e4a8 100644
--- a/source/blender/src/editarmature.c
+++ b/source/blender/src/editarmature.c
@@ -2278,7 +2278,7 @@ void adduplicate_armature(void)
bPoseChannel *chanold, *channew;
ListBase *listold, *listnew;
- chanold = verify_pose_channel (OBACT->pose, curBone->name);
+ chanold = verify_pose_channel(OBACT->pose, curBone->name);
if (chanold) {
listold = &chanold->constraints;
if (listold) {
@@ -2291,6 +2291,9 @@ void adduplicate_armature(void)
/* copy transform locks */
channew->protectflag = chanold->protectflag;
+ /* copy bone group */
+ channew->agrp_index= chanold->agrp_index;
+
/* ik (dof) settings */
channew->ikflag = chanold->ikflag;
VECCOPY(channew->limitmin, chanold->limitmin);
@@ -2300,7 +2303,10 @@ void adduplicate_armature(void)
/* constraints */
listnew = &channew->constraints;
- copy_constraints (listnew, listold);
+ copy_constraints(listnew, listold);
+
+ /* custom shape */
+ channew->custom= chanold->custom;
}
}
}
@@ -3277,7 +3283,11 @@ void switch_direction_armature (void)
EditBone *ebo, *child=NULL, *parent=NULL;
/* loop over bones in chain */
- for (ebo= chain->data; ebo; child= ebo, ebo=parent) {
+ for (ebo= chain->data; ebo; ebo= parent) {
+ /* parent is this bone's original parent
+ * - we store this, as the next bone that is checked is this one
+ * but the value of ebo->parent may change here...
+ */
parent= ebo->parent;
/* only if selected and editable */
@@ -3297,9 +3307,25 @@ void switch_direction_armature (void)
else
ebo->flag &= ~BONE_CONNECTED;
- /* FIXME: other things that need fixing?
- * i.e. roll?
+ /* get next bones
+ * - child will become the new parent of next bone
+ */
+ child= ebo;
+ }
+ else {
+ /* not swapping this bone, however, if its 'parent' got swapped, unparent us from it
+ * as it will be facing in opposite direction
+ */
+ if ((parent) && (EBONE_VISIBLE(arm, parent) && EBONE_EDITABLE(parent))) {
+ ebo->parent= NULL;
+ ebo->flag &= ~BONE_CONNECTED;
+ }
+
+ /* get next bones
+ * - child will become new parent of next bone (not swapping occurred,
+ * so set to NULL to prevent infinite-loop)
*/
+ child= NULL;
}
}
}
@@ -4488,542 +4514,7 @@ void transform_armature_mirror_update(void)
/*************************************** SKELETON GENERATOR ******************************************/
/*****************************************************************************************************/
-/**************************************** SYMMETRY HANDLING ******************************************/
-
-void markdownSymmetryArc(ReebArc *arc, ReebNode *node, int level);
-
-void mirrorAlongAxis(float v[3], float center[3], float axis[3])
-{
- float dv[3], pv[3];
-
- VecSubf(dv, v, center);
- Projf(pv, dv, axis);
- VecMulf(pv, -2);
- VecAddf(v, v, pv);
-}
-
-/* Helper structure for radial symmetry */
-typedef struct RadialArc
-{
- ReebArc *arc;
- float n[3]; /* normalized vector joining the nodes of the arc */
-} RadialArc;
-
-void reestablishRadialSymmetry(ReebNode *node, int depth, float axis[3])
-{
- RadialArc *ring = NULL;
- RadialArc *unit;
- float limit = G.scene->toolsettings->skgen_symmetry_limit;
- int symmetric = 1;
- int count = 0;
- int i;
-
- /* count the number of arcs in the symmetry ring */
- for (i = 0; node->arcs[i] != NULL; i++)
- {
- ReebArc *connectedArc = node->arcs[i];
-
- /* depth is store as a negative in flag. symmetry level is positive */
- if (connectedArc->flags == -depth)
- {
- count++;
- }
- }
-
- ring = MEM_callocN(sizeof(RadialArc) * count, "radial symmetry ring");
- unit = ring;
-
- /* fill in the ring */
- for (unit = ring, i = 0; node->arcs[i] != NULL; i++)
- {
- ReebArc *connectedArc = node->arcs[i];
-
- /* depth is store as a negative in flag. symmetry level is positive */
- if (connectedArc->flags == -depth)
- {
- ReebNode *otherNode = OTHER_NODE(connectedArc, node);
- float vec[3];
-
- unit->arc = connectedArc;
-
- /* project the node to node vector on the symmetry plane */
- VecSubf(unit->n, otherNode->p, node->p);
- Projf(vec, unit->n, axis);
- VecSubf(unit->n, unit->n, vec);
-
- Normalize(unit->n);
-
- unit++;
- }
- }
-
- /* sort ring */
- for (i = 0; i < count - 1; i++)
- {
- float minAngle = 3; /* arbitrary high value, higher than 2, at least */
- int minIndex = -1;
- int j;
-
- for (j = i + 1; j < count; j++)
- {
- float angle = Inpf(ring[i].n, ring[j].n);
-
- /* map negative values to 1..2 */
- if (angle < 0)
- {
- angle = 1 - angle;
- }
-
- if (angle < minAngle)
- {
- minIndex = j;
- minAngle = angle;
- }
- }
-
- /* swap if needed */
- if (minIndex != i + 1)
- {
- RadialArc tmp;
- tmp = ring[i + 1];
- ring[i + 1] = ring[minIndex];
- ring[minIndex] = tmp;
- }
- }
-
- for (i = 0; i < count && symmetric; i++)
- {
- ReebNode *node1, *node2;
- float tangent[3];
- float normal[3];
- float p[3];
- int j = (i + 1) % count; /* next arc in the circular list */
-
- VecAddf(tangent, ring[i].n, ring[j].n);
- Crossf(normal, tangent, axis);
-
- node1 = OTHER_NODE(ring[i].arc, node);
- node2 = OTHER_NODE(ring[j].arc, node);
-
- VECCOPY(p, node2->p);
- mirrorAlongAxis(p, node->p, normal);
-
- /* check if it's within limit before continuing */
- if (VecLenf(node1->p, p) > limit)
- {
- symmetric = 0;
- }
-
- }
-
- if (symmetric)
- {
- /* first pass, merge incrementally */
- for (i = 0; i < count - 1; i++)
- {
- ReebNode *node1, *node2;
- float tangent[3];
- float normal[3];
- int j = i + 1;
-
- VecAddf(tangent, ring[i].n, ring[j].n);
- Crossf(normal, tangent, axis);
-
- node1 = OTHER_NODE(ring[i].arc, node);
- node2 = OTHER_NODE(ring[j].arc, node);
-
- /* mirror first node and mix with the second */
- mirrorAlongAxis(node1->p, node->p, normal);
- VecLerpf(node2->p, node2->p, node1->p, 1.0f / (j + 1));
-
- /* Merge buckets
- * there shouldn't be any null arcs here, but just to be safe
- * */
- if (ring[i].arc->bcount > 0 && ring[j].arc->bcount > 0)
- {
- ReebArcIterator iter1, iter2;
- EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
-
- initArcIterator(&iter1, ring[i].arc, node);
- initArcIterator(&iter2, ring[j].arc, node);
-
- bucket1 = nextBucket(&iter1);
- bucket2 = nextBucket(&iter2);
-
- /* Make sure they both start at the same value */
- while(bucket1 && bucket1->val < bucket2->val)
- {
- bucket1 = nextBucket(&iter1);
- }
-
- while(bucket2 && bucket2->val < bucket1->val)
- {
- bucket2 = nextBucket(&iter2);
- }
-
-
- for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
- {
- bucket2->nv += bucket1->nv; /* add counts */
-
- /* mirror on axis */
- mirrorAlongAxis(bucket1->p, node->p, normal);
- /* add bucket2 in bucket1 */
- VecLerpf(bucket2->p, bucket2->p, bucket1->p, (float)bucket1->nv / (float)(bucket2->nv));
- }
- }
- }
-
- /* second pass, mirror back on previous arcs */
- for (i = count - 1; i > 0; i--)
- {
- ReebNode *node1, *node2;
- float tangent[3];
- float normal[3];
- int j = i - 1;
-
- VecAddf(tangent, ring[i].n, ring[j].n);
- Crossf(normal, tangent, axis);
-
- node1 = OTHER_NODE(ring[i].arc, node);
- node2 = OTHER_NODE(ring[j].arc, node);
-
- /* copy first node than mirror */
- VECCOPY(node2->p, node1->p);
- mirrorAlongAxis(node2->p, node->p, normal);
-
- /* Copy buckets
- * there shouldn't be any null arcs here, but just to be safe
- * */
- if (ring[i].arc->bcount > 0 && ring[j].arc->bcount > 0)
- {
- ReebArcIterator iter1, iter2;
- EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
-
- initArcIterator(&iter1, ring[i].arc, node);
- initArcIterator(&iter2, ring[j].arc, node);
-
- bucket1 = nextBucket(&iter1);
- bucket2 = nextBucket(&iter2);
-
- /* Make sure they both start at the same value */
- while(bucket1 && bucket1->val < bucket2->val)
- {
- bucket1 = nextBucket(&iter1);
- }
-
- while(bucket2 && bucket2->val < bucket1->val)
- {
- bucket2 = nextBucket(&iter2);
- }
-
-
- for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
- {
- /* copy and mirror back to bucket2 */
- bucket2->nv = bucket1->nv;
- VECCOPY(bucket2->p, bucket1->p);
- mirrorAlongAxis(bucket2->p, node->p, normal);
- }
- }
- }
- }
-
- MEM_freeN(ring);
-}
-void reestablishAxialSymmetry(ReebNode *node, int depth, float axis[3])
-{
- ReebArc *arc1 = NULL;
- ReebArc *arc2 = NULL;
- ReebNode *node1 = NULL, *node2 = NULL;
- float limit = G.scene->toolsettings->skgen_symmetry_limit;
- float nor[3], vec[3], p[3];
- int i;
-
- for (i = 0; node->arcs[i] != NULL; i++)
- {
- ReebArc *connectedArc = node->arcs[i];
-
- /* depth is store as a negative in flag. symmetry level is positive */
- if (connectedArc->flags == -depth)
- {
- if (arc1 == NULL)
- {
- arc1 = connectedArc;
- node1 = OTHER_NODE(arc1, node);
- }
- else
- {
- arc2 = connectedArc;
- node2 = OTHER_NODE(arc2, node);
- break; /* Can stop now, the two arcs have been found */
- }
- }
- }
-
- /* shouldn't happen, but just to be sure */
- if (node1 == NULL || node2 == NULL)
- {
- return;
- }
-
- VecSubf(p, node1->p, node->p);
- Crossf(vec, p, axis);
- Crossf(nor, vec, axis);
-
- /* mirror node2 along axis */
- VECCOPY(p, node2->p);
- mirrorAlongAxis(p, node->p, nor);
-
- /* check if it's within limit before continuing */
- if (VecLenf(node1->p, p) <= limit)
- {
-
- /* average with node1 */
- VecAddf(node1->p, node1->p, p);
- VecMulf(node1->p, 0.5f);
-
- /* mirror back on node2 */
- VECCOPY(node2->p, node1->p);
- mirrorAlongAxis(node2->p, node->p, nor);
-
- /* Merge buckets
- * there shouldn't be any null arcs here, but just to be safe
- * */
- if (arc1->bcount > 0 && arc2->bcount > 0)
- {
- ReebArcIterator iter1, iter2;
- EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
-
- initArcIterator(&iter1, arc1, node);
- initArcIterator(&iter2, arc2, node);
-
- bucket1 = nextBucket(&iter1);
- bucket2 = nextBucket(&iter2);
-
- /* Make sure they both start at the same value */
- while(bucket1 && bucket1->val < bucket2->val)
- {
- bucket1 = nextBucket(&iter1);
- }
-
- while(bucket2 && bucket2->val < bucket1->val)
- {
- bucket2 = nextBucket(&iter2);
- }
-
-
- for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
- {
- bucket1->nv += bucket2->nv; /* add counts */
-
- /* mirror on axis */
- mirrorAlongAxis(bucket2->p, node->p, nor);
- /* add bucket2 in bucket1 */
- VecLerpf(bucket1->p, bucket1->p, bucket2->p, (float)bucket2->nv / (float)(bucket1->nv));
-
- /* copy and mirror back to bucket2 */
- bucket2->nv = bucket1->nv;
- VECCOPY(bucket2->p, bucket1->p);
- mirrorAlongAxis(bucket2->p, node->p, nor);
- }
- }
- }
-}
-
-void markdownSecondarySymmetry(ReebNode *node, int depth, int level)
-{
- float axis[3] = {0, 0, 0};
- int count = 0;
- int i;
-
- /* Only reestablish spatial symmetry if needed */
- if (G.scene->toolsettings->skgen_options & SKGEN_SYMMETRY)
- {
- /* count the number of branches in this symmetry group
- * and determinte the axis of symmetry
- * */
- for (i = 0; node->arcs[i] != NULL; i++)
- {
- ReebArc *connectedArc = node->arcs[i];
-
- /* depth is store as a negative in flag. symmetry level is positive */
- if (connectedArc->flags == -depth)
- {
- count++;
- }
- /* If arc is on the axis */
- else if (connectedArc->flags == level)
- {
- VecAddf(axis, axis, connectedArc->v1->p);
- VecSubf(axis, axis, connectedArc->v2->p);
- }
- }
-
- Normalize(axis);
-
- /* Split between axial and radial symmetry */
- if (count == 2)
- {
- reestablishAxialSymmetry(node, depth, axis);
- }
- else
- {
- reestablishRadialSymmetry(node, depth, axis);
- }
- }
-
- /* markdown secondary symetries */
- for (i = 0; node->arcs[i] != NULL; i++)
- {
- ReebArc *connectedArc = node->arcs[i];
-
- if (connectedArc->flags == -depth)
- {
- /* markdown symmetry for branches corresponding to the depth */
- markdownSymmetryArc(connectedArc, node, level + 1);
- }
- }
-}
-
-void markdownSymmetryArc(ReebArc *arc, ReebNode *node, int level)
-{
- int i;
- arc->flags = level;
-
- node = OTHER_NODE(arc, node);
-
- for (i = 0; node->arcs[i] != NULL; i++)
- {
- ReebArc *connectedArc = node->arcs[i];
-
- if (connectedArc != arc)
- {
- ReebNode *connectedNode = OTHER_NODE(connectedArc, node);
-
- /* symmetry level is positive value, negative values is subtree depth */
- connectedArc->flags = -subtreeDepth(connectedNode, connectedArc);
- }
- }
-
- arc = NULL;
-
- for (i = 0; node->arcs[i] != NULL; i++)
- {
- int issymmetryAxis = 0;
- ReebArc *connectedArc = node->arcs[i];
-
- /* only arcs not already marked as symetric */
- if (connectedArc->flags < 0)
- {
- int j;
-
- /* true by default */
- issymmetryAxis = 1;
-
- for (j = 0; node->arcs[j] != NULL && issymmetryAxis == 1; j++)
- {
- ReebArc *otherArc = node->arcs[j];
-
- /* different arc, same depth */
- if (otherArc != connectedArc && otherArc->flags == connectedArc->flags)
- {
- /* not on the symmetry axis */
- issymmetryAxis = 0;
- }
- }
- }
-
- /* arc could be on the symmetry axis */
- if (issymmetryAxis == 1)
- {
- /* no arc as been marked previously, keep this one */
- if (arc == NULL)
- {
- arc = connectedArc;
- }
- else
- {
- /* there can't be more than one symmetry arc */
- arc = NULL;
- break;
- }
- }
- }
-
- /* go down the arc continuing the symmetry axis */
- if (arc)
- {
- markdownSymmetryArc(arc, node, level);
- }
-
-
- /* secondary symmetry */
- for (i = 0; node->arcs[i] != NULL; i++)
- {
- ReebArc *connectedArc = node->arcs[i];
-
- /* only arcs not already marked as symetric and is not the next arc on the symmetry axis */
- if (connectedArc->flags < 0)
- {
- /* subtree depth is store as a negative value in the flag */
- markdownSecondarySymmetry(node, -connectedArc->flags, level);
- }
- }
-}
-
-void markdownSymmetry(ReebGraph *rg)
-{
- ReebNode *node;
- ReebArc *arc;
- /* only for Acyclic graphs */
- int cyclic = isGraphCyclic(rg);
-
- /* mark down all arcs as non-symetric */
- for (arc = rg->arcs.first; arc; arc = arc->next)
- {
- arc->flags = 0;
- }
-
- /* mark down all nodes as not on the symmetry axis */
- for (node = rg->nodes.first; node; node = node->next)
- {
- node->flags = 0;
- }
-
- /* node list is sorted, so lowest node is always the head (by design) */
- node = rg->nodes.first;
-
- /* only work on acyclic graphs and if only one arc is incident on the first node */
- if (cyclic == 0 && countConnectedArcs(rg, node) == 1)
- {
- arc = node->arcs[0];
-
- markdownSymmetryArc(arc, node, 1);
-
- /* mark down non-symetric arcs */
- for (arc = rg->arcs.first; arc; arc = arc->next)
- {
- if (arc->flags < 0)
- {
- arc->flags = 0;
- }
- else
- {
- /* mark down nodes with the lowest level symmetry axis */
- if (arc->v1->flags == 0 || arc->v1->flags > arc->flags)
- {
- arc->v1->flags = arc->flags;
- }
- if (arc->v2->flags == 0 || arc->v2->flags > arc->flags)
- {
- arc->v2->flags = arc->flags;
- }
- }
- }
- }
-}
/**************************************** SUBDIVISION ALGOS ******************************************/
@@ -5088,7 +4579,7 @@ EditBone * subdivideByAngle(ReebArc *arc, ReebNode *head, ReebNode *tail)
return lastBone;
}
-float calcCorrelation(ReebArc *arc, int start, int end, float v0[3], float n[3])
+float calcVariance(ReebArc *arc, int start, int end, float v0[3], float n[3])
{
int len = 2 + abs(end - start);
@@ -5136,19 +4627,47 @@ float calcCorrelation(ReebArc *arc, int start, int end, float v0[3], float n[3])
/* adding start(0) and end(1) values to s_t */
s_t += (avg_t * avg_t) + (1 - avg_t) * (1 - avg_t);
- return 1.0f - s_xyz / s_t;
+ return s_xyz / s_t;
}
else
{
- return 1.0f;
+ return 0;
+ }
+}
+
+float calcDistance(ReebArc *arc, int start, int end, float head[3], float tail[3])
+{
+ ReebArcIterator iter;
+ EmbedBucket *bucket = NULL;
+ float max_dist = 0;
+
+ /* calculate maximum distance */
+ for (initArcIterator2(&iter, arc, start, end), bucket = nextBucket(&iter);
+ bucket;
+ bucket = nextBucket(&iter))
+ {
+ float v1[3], v2[3], c[3];
+ float dist;
+
+ VecSubf(v1, head, tail);
+ VecSubf(v2, bucket->p, tail);
+
+ Crossf(c, v1, v2);
+
+ dist = Inpf(c, c) / Inpf(v1, v1);
+
+ max_dist = dist > max_dist ? dist : max_dist;
}
+
+
+ return max_dist;
}
EditBone * subdivideByCorrelation(ReebArc *arc, ReebNode *head, ReebNode *tail)
{
ReebArcIterator iter;
float n[3];
- float CORRELATION_THRESHOLD = G.scene->toolsettings->skgen_correlation_limit;
+ float ADAPTIVE_THRESHOLD = G.scene->toolsettings->skgen_correlation_limit;
EditBone *lastBone = NULL;
/* init iterator to get start and end from head */
@@ -5157,15 +4676,17 @@ EditBone * subdivideByCorrelation(ReebArc *arc, ReebNode *head, ReebNode *tail)
/* Calculate overall */
VecSubf(n, arc->buckets[iter.end].p, head->p);
- if (G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION &&
- calcCorrelation(arc, iter.start, iter.end, head->p, n) < CORRELATION_THRESHOLD)
+ if (G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
{
EmbedBucket *bucket = NULL;
EmbedBucket *previous = NULL;
EditBone *child = NULL;
EditBone *parent = NULL;
+ float normal[3] = {0, 0, 0};
+ float avg_normal[3];
+ int total = 0;
int boneStart = iter.start;
-
+
parent = add_editbone("Bone");
parent->flag = BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
VECCOPY(parent->head, head->p);
@@ -5174,12 +4695,46 @@ EditBone * subdivideByCorrelation(ReebArc *arc, ReebNode *head, ReebNode *tail)
bucket;
previous = bucket, bucket = nextBucket(&iter))
{
- /* Calculate normal */
- VecSubf(n, bucket->p, parent->head);
+ float btail[3];
+ float value = 0;
- if (calcCorrelation(arc, boneStart, iter.index, parent->head, n) < CORRELATION_THRESHOLD)
+ if (G.scene->toolsettings->skgen_options & SKGEN_STICK_TO_EMBEDDING)
{
- VECCOPY(parent->tail, previous->p);
+ VECCOPY(btail, bucket->p);
+ }
+ else
+ {
+ float length;
+
+ /* Calculate normal */
+ VecSubf(n, bucket->p, parent->head);
+ length = Normalize(n);
+
+ total += 1;
+ VecAddf(normal, normal, n);
+ VECCOPY(avg_normal, normal);
+ VecMulf(avg_normal, 1.0f / total);
+
+ VECCOPY(btail, avg_normal);
+ VecMulf(btail, length);
+ VecAddf(btail, btail, parent->head);
+ }
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_ADAPTIVE_DISTANCE)
+ {
+ value = calcDistance(arc, boneStart, iter.index, parent->head, btail);
+ }
+ else
+ {
+ float n[3];
+
+ VecSubf(n, btail, parent->head);
+ value = calcVariance(arc, boneStart, iter.index, parent->head, n);
+ }
+
+ if (value > ADAPTIVE_THRESHOLD)
+ {
+ VECCOPY(parent->tail, btail);
child = add_editbone("Bone");
VECCOPY(child->head, parent->tail);
@@ -5188,6 +4743,9 @@ EditBone * subdivideByCorrelation(ReebArc *arc, ReebNode *head, ReebNode *tail)
parent = child; // new child is next parent
boneStart = iter.index; // start from end
+
+ normal[0] = normal[1] = normal[2] = 0;
+ total = 0;
}
}
@@ -5205,7 +4763,7 @@ float arcLengthRatio(ReebArc *arc)
float embedLength = 0.0f;
int i;
- arcLength = VecLenf(arc->v1->p, arc->v2->p);
+ arcLength = VecLenf(arc->head->p, arc->tail->p);
if (arc->bcount > 0)
{
@@ -5215,8 +4773,8 @@ float arcLengthRatio(ReebArc *arc)
embedLength += VecLenf(arc->buckets[i - 1].p, arc->buckets[i].p);
}
/* Add head and tail -> embedding vectors */
- embedLength += VecLenf(arc->v1->p, arc->buckets[0].p);
- embedLength += VecLenf(arc->v2->p, arc->buckets[arc->bcount - 1].p);
+ embedLength += VecLenf(arc->head->p, arc->buckets[0].p);
+ embedLength += VecLenf(arc->tail->p, arc->buckets[arc->bcount - 1].p);
}
else
{
@@ -5348,8 +4906,6 @@ void generateSkeletonFromReebGraph(ReebGraph *rg)
{
exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); // freedata, and undo
}
-
- setcursor_space(SPACE_VIEW3D, CURSOR_WAIT);
dst = add_object(OB_ARMATURE);
base_init_from_view3d(BASACT, G.vd);
@@ -5366,7 +4922,7 @@ void generateSkeletonFromReebGraph(ReebGraph *rg)
arcBoneMap = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
- markdownSymmetry(rg);
+ BLI_markdownSymmetry((BGraph*)rg, rg->nodes.first, G.scene->toolsettings->skgen_symmetry_limit);
for (arc = rg->arcs.first; arc; arc = arc->next)
{
@@ -5376,43 +4932,43 @@ void generateSkeletonFromReebGraph(ReebGraph *rg)
/* Find out the direction of the arc through simple heuristics (in order of priority) :
*
- * 1- Arcs on primary symmetry axis (flags == 1) point up (head: high weight -> tail: low weight)
+ * 1- Arcs on primary symmetry axis (symmetry == 1) point up (head: high weight -> tail: low weight)
* 2- Arcs starting on a primary axis point away from it (head: node on primary axis)
* 3- Arcs point down (head: low weight -> tail: high weight)
*
- * Finally, the arc direction is stored in its flags: 1 (low -> high), -1 (high -> low)
+ * Finally, the arc direction is stored in its flag: 1 (low -> high), -1 (high -> low)
*/
/* if arc is a symmetry axis, internal bones go up the tree */
- if (arc->flags == 1 && arc->v2->degree != 1)
+ if (arc->symmetry_level == 1 && arc->tail->degree != 1)
{
- head = arc->v2;
- tail = arc->v1;
+ head = arc->tail;
+ tail = arc->head;
- arc->flags = -1; /* mark arc direction */
+ arc->flag = -1; /* mark arc direction */
}
/* Bones point AWAY from the symmetry axis */
- else if (arc->v1->flags == 1)
+ else if (arc->head->symmetry_level == 1)
{
- head = arc->v1;
- tail = arc->v2;
+ head = arc->head;
+ tail = arc->tail;
- arc->flags = 1; /* mark arc direction */
+ arc->flag = 1; /* mark arc direction */
}
- else if (arc->v2->flags == 1)
+ else if (arc->tail->symmetry_level == 1)
{
- head = arc->v2;
- tail = arc->v1;
+ head = arc->tail;
+ tail = arc->head;
- arc->flags = -1; /* mark arc direction */
+ arc->flag = -1; /* mark arc direction */
}
/* otherwise, always go from low weight to high weight */
else
{
- head = arc->v1;
- tail = arc->v2;
+ head = arc->head;
+ tail = arc->tail;
- arc->flags = 1; /* mark arc direction */
+ arc->flag = 1; /* mark arc direction */
}
/* Loop over subdivision methods */
@@ -5454,12 +5010,12 @@ void generateSkeletonFromReebGraph(ReebGraph *rg)
ReebArc *incomingArc = NULL;
int i;
- for (i = 0; node->arcs[i] != NULL; i++)
+ for (i = 0; i < node->degree; i++)
{
- arc = node->arcs[i];
+ arc = (ReebArc*)node->arcs[i];
/* if arc is incoming into the node */
- if ((arc->v1 == node && arc->flags == -1) || (arc->v2 == node && arc->flags == 1))
+ if ((arc->head == node && arc->flag == -1) || (arc->tail == node && arc->flag == 1))
{
if (incomingArc == NULL)
{
@@ -5480,12 +5036,12 @@ void generateSkeletonFromReebGraph(ReebGraph *rg)
EditBone *parentBone = BLI_ghash_lookup(arcBoneMap, incomingArc);
/* Look for outgoing arcs and parent their bones */
- for (i = 0; node->arcs[i] != NULL; i++)
+ for (i = 0; i < node->degree; i++)
{
arc = node->arcs[i];
/* if arc is outgoing from the node */
- if ((arc->v1 == node && arc->flags == 1) || (arc->v2 == node && arc->flags == -1))
+ if ((arc->head == node && arc->flag == 1) || (arc->tail == node && arc->flag == -1))
{
EditBone *childBone = BLI_ghash_lookup(arcBoneMap, arc);
@@ -5503,89 +5059,21 @@ void generateSkeletonFromReebGraph(ReebGraph *rg)
}
BLI_ghash_free(arcBoneMap, NULL, NULL);
-
- setcursor_space(SPACE_VIEW3D, CURSOR_EDIT);
BIF_undo_push("Generate Skeleton");
}
void generateSkeleton(void)
{
- EditMesh *em = G.editMesh;
- ReebGraph *rg = NULL;
- int i;
+ ReebGraph *reebg;
- if (em == NULL)
- return;
-
setcursor_space(SPACE_VIEW3D, CURSOR_WAIT);
-
- if (weightFromDistance(em) == 0)
- {
- error("No selected vertex\n");
- return;
- }
-
- renormalizeWeight(em, 1.0f);
-
- weightToHarmonic(em);
-
-#ifdef DEBUG_REEB
- weightToVCol(em);
-#endif
-
- rg = generateReebGraph(em, G.scene->toolsettings->skgen_resolution);
-
- verifyBuckets(rg);
-
- /* Remove arcs without embedding */
- filterNullReebGraph(rg);
-
- verifyBuckets(rg);
-
-
- i = 1;
- /* filter until there's nothing more to do */
- while (i == 1)
- {
- i = 0; /* no work done yet */
-
- if (G.scene->toolsettings->skgen_options & SKGEN_FILTER_EXTERNAL)
- {
- i |= filterExternalReebGraph(rg, G.scene->toolsettings->skgen_threshold_external * G.scene->toolsettings->skgen_resolution);
- }
-
- verifyBuckets(rg);
-
- if (G.scene->toolsettings->skgen_options & SKGEN_FILTER_INTERNAL)
- {
- i |= filterInternalReebGraph(rg, G.scene->toolsettings->skgen_threshold_internal * G.scene->toolsettings->skgen_resolution);
- }
- }
-
- verifyBuckets(rg);
-
- repositionNodes(rg);
- verifyBuckets(rg);
+ reebg = BIF_ReebGraphFromEditMesh();
- /* Filtering might have created degree 2 nodes, so remove them */
- removeNormalNodes(rg);
-
- verifyBuckets(rg);
-
- for(i = 0; i < G.scene->toolsettings->skgen_postpro_passes; i++)
- {
- postprocessGraph(rg, G.scene->toolsettings->skgen_postpro);
- }
+ generateSkeletonFromReebGraph(reebg);
- buildAdjacencyList(rg);
-
- sortNodes(rg);
-
- sortArcs(rg);
-
- generateSkeletonFromReebGraph(rg);
+ REEB_freeGraph(reebg);
- freeGraph(rg);
+ setcursor_space(SPACE_VIEW3D, CURSOR_EDIT);
}
diff --git a/source/blender/src/editconstraint.c b/source/blender/src/editconstraint.c
index 0ad58a5ce4b..42972e4aa5d 100644
--- a/source/blender/src/editconstraint.c
+++ b/source/blender/src/editconstraint.c
@@ -65,7 +65,9 @@
#include "BIF_space.h"
#include "BIF_toolbox.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "blendef.h"
#include "nla.h"
@@ -444,7 +446,7 @@ void add_constraint (short only_IK)
else if (nr==18) {
char *menustr;
int scriptint= 0;
-
+#ifndef DISABLE_PYTHON
/* popup a list of usable scripts */
menustr = buildmenu_pyconstraints(NULL, &scriptint);
scriptint = pupmenu(menustr);
@@ -459,6 +461,7 @@ void add_constraint (short only_IK)
/* make sure target allowance is set correctly */
BPY_pyconstraint_update(ob, con);
}
+#endif
}
else if (nr==19) {
con = add_new_constraint(CONSTRAINT_TYPE_CHILDOF);
@@ -541,6 +544,7 @@ void add_constraint (short only_IK)
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWOOPS, 0);
if (only_IK)
@@ -699,7 +703,8 @@ static void test_constraints (Object *owner, const char substring[])
/* clear disabled-flag first */
curcon->flag &= ~CONSTRAINT_DISABLE;
-
+
+#ifndef DISABLE_PYTHON
/* Check specialised data (settings) for constraints that need this */
if (curcon->type == CONSTRAINT_TYPE_PYTHON) {
bPythonConstraint *data = curcon->data;
@@ -710,16 +715,16 @@ static void test_constraints (Object *owner, const char substring[])
}
else if (BPY_is_pyconstraint(data->text)==0) {
curcon->flag |= CONSTRAINT_DISABLE;
- }
- else {
+ } else {
/* does the constraint require target input... also validates targets */
BPY_pyconstraint_update(owner, curcon);
}
-
/* targets have already been checked for this */
continue;
}
- else if (curcon->type == CONSTRAINT_TYPE_KINEMATIC) {
+ else
+#endif
+ if (curcon->type == CONSTRAINT_TYPE_KINEMATIC) {
bKinematicConstraint *data = curcon->data;
/* bad: we need a separate set of checks here as poletarget is
@@ -868,6 +873,7 @@ void validate_pyconstraint_cb (void *arg1, void *arg2)
data->text = text;
}
+#ifndef DISABLE_PYTHON
/* this returns a string for the list of usable pyconstraint script names */
char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
{
@@ -908,15 +914,17 @@ char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
return str;
}
+#endif /* DISABLE_PYTHON */
/* this callback gets called when the 'refresh' button of a pyconstraint gets pressed */
void update_pyconstraint_cb (void *arg1, void *arg2)
{
Object *owner= (Object *)arg1;
bConstraint *con= (bConstraint *)arg2;
-
+#ifndef DISABLE_PYTHON
if (owner && con)
BPY_pyconstraint_update(owner, con);
+#endif
}
/* ------------- Child-Of Constraint ------------------ */
diff --git a/source/blender/src/editcurve.c b/source/blender/src/editcurve.c
index 76a4e1028f0..c26c44103c0 100644
--- a/source/blender/src/editcurve.c
+++ b/source/blender/src/editcurve.c
@@ -4111,7 +4111,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
Mat3One(imat);
cent[0]= cent[1]= cent[2]= 0.0;
}
-
+
if ELEM5(stype, 0, 1, 2, 4, 6) {
nu = (Nurb*)MEM_callocN(sizeof(Nurb), "addNurbprim");
nu->type= type;
@@ -4121,6 +4121,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
switch(stype) {
case 0: /* curve */
+ nu->resolu= 12; /* set as 4 above */
if(newname) {
rename_id((ID *)G.obedit, "Curve");
rename_id((ID *)G.obedit->data, "Curve");
@@ -4228,6 +4229,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
break;
case 1: /* circle */
+ nu->resolu= 12; /* set as 4 above */
if(newname) {
rename_id((ID *)G.obedit, "CurveCircle");
rename_id((ID *)G.obedit->data, "CurveCircle");
diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c
index 3f178e1ea2b..8a07a4fddff 100644
--- a/source/blender/src/editdeform.c
+++ b/source/blender/src/editdeform.c
@@ -439,6 +439,32 @@ void del_defgroup (Object *ob)
}
}
+void del_all_defgroups (Object *ob)
+{
+ /* Sanity check */
+ if (ob == NULL)
+ return;
+
+ /* Remove all DVerts */
+ if (ob->type==OB_MESH) {
+ Mesh *me= ob->data;
+ CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
+ me->dvert= NULL;
+ }
+ else {
+ if (editLatt->dvert) {
+ MEM_freeN(editLatt->dvert);
+ editLatt->dvert= NULL;
+ }
+ }
+
+ /* Remove all DefGroups */
+ BLI_freelistN(&ob->defbase);
+
+ /* Fix counters/indices */
+ ob->actdef= 0;
+}
+
void create_dverts(ID *id)
{
/* create deform verts
@@ -1008,9 +1034,9 @@ void vgroup_operation_with_menu(void)
/* give user choices of adding to current/new or removing from current */
if (ob->actdef)
- mode = pupmenu("Vertex Groups %t|Change Active Group%x1|Delete Active Group%x2");
+ mode = pupmenu("Vertex Groups %t|Change Active Group%x1|Delete Active Group%x2|Delete All Groups%x3");
else
- mode= pupmenu("Vertex Groups %t|Change Active Group%x1");
+ mode= pupmenu("Vertex Groups %t|Change Active Group%x1|Delete All Groups%x3");
/* handle choices */
switch (mode) {
@@ -1033,11 +1059,20 @@ void vgroup_operation_with_menu(void)
case 2: /* delete active group */
{
del_defgroup(ob);
- allqueue (REDRAWVIEW3D, 1);
+ allqueue(REDRAWVIEW3D, 1);
allqueue(REDRAWOOPS, 0);
BIF_undo_push("Delete vertex group");
}
break;
+ case 3: /* delete all groups */
+ {
+ del_all_defgroups(ob);
+ allqueue(REDRAWVIEW3D, 1);
+ allqueue(REDRAWOOPS, 0);
+ allqueue(REDRAWBUTSEDIT, 1);
+ BIF_undo_push("Delete all vertex groups");
+ }
+ break;
}
}
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index 008ddf3b5f0..53fb6dbffb1 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -99,8 +99,10 @@
#include "BDR_unwrapper.h"
#include "BDR_editobject.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
/* Pupmenu codes: */
#define UV_CUBE_MAPPING 2
@@ -312,7 +314,7 @@ static void uv_calc_shift_project(float *target, float *shift, float rotmat[][4]
}
}
-void correct_uv_aspect( void )
+static void correct_uv_aspect( void )
{
float aspx=1, aspy=1;
EditMesh *em = G.editMesh;
@@ -1050,7 +1052,7 @@ int edgetag_shortest_path(EditEdge *source, EditEdge *target)
return 1;
}
-void seam_edgehash_insert_face(EdgeHash *ehash, MFace *mf)
+static void seam_edgehash_insert_face(EdgeHash *ehash, MFace *mf)
{
BLI_edgehash_insert(ehash, mf->v1, mf->v2, NULL);
BLI_edgehash_insert(ehash, mf->v2, mf->v3, NULL);
@@ -1238,7 +1240,9 @@ void face_borderselect()
void uv_autocalc_tface()
{
short mode, i=0, has_pymenu=0; /* pymenu must be bigger then UV_*_MAPPING */
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
char menu_number[3];
/* uvmenu, will add python items */
@@ -1253,7 +1257,7 @@ void uv_autocalc_tface()
MENUSTRING("Project from View (Bounds)",UV_BOUNDS_MAPPING) "|%l|"
MENUSTRING("Reset", UV_RESET_MAPPING);
-
+#ifndef DISABLE_PYTHON
/* note that we account for the 10 previous entries with i+10: */
for (pym = BPyMenuTable[PYMENU_UVCALCULATION]; pym; pym = pym->next, i++) {
@@ -1268,14 +1272,15 @@ void uv_autocalc_tface()
sprintf(menu_number, "%d", i+10);
strcat(uvmenu, menu_number);
}
+#endif
mode= pupmenu(uvmenu);
-
+#ifndef DISABLE_PYTHON
if (mode >= 10) {
BPY_menu_do_python(PYMENU_UVCALCULATION, mode - 10);
return;
}
-
+#endif
switch(mode) {
case UV_CUBE_MAPPING:
calculate_uv_map(B_UVAUTO_CUBE); break;
diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c
index 9a7f8e652a7..6293e669aa1 100644
--- a/source/blender/src/editipo.c
+++ b/source/blender/src/editipo.c
@@ -285,14 +285,14 @@ void editipo_changed(SpaceIpo *si, int doredraw)
/* is there no curve? */
if(first) {
- v2d->tot.xmin= 0.0;
- v2d->tot.xmax= EFRA;
+ v2d->tot.xmin= (float)0.0;
+ v2d->tot.xmax= (float)EFRA;
v2d->tot.ymin= (float)-0.1;
v2d->tot.ymax= (float)1.1;
if(si->blocktype==ID_SEQ) {
- v2d->tot.xmin= -5.0;
- v2d->tot.xmax= 105.0;
+ v2d->tot.xmin= (float)-5.0;
+ v2d->tot.xmax= (float)105.0;
v2d->tot.ymin= (float)-0.1;
v2d->tot.ymax= (float)1.1;
}
@@ -2022,12 +2022,9 @@ IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constn
/* creates ipo too (if add) */
ipo= verify_ipo(from, blocktype, actname, constname, bonename, add);
- if (ipo && ipo->id.lib==NULL && from->lib==NULL) {
+ if ((ipo) && (ipo->id.lib==NULL) && (from->lib==NULL)) {
/* try to find matching curve */
- for (icu= ipo->curve.first; icu; icu= icu->next) {
- if (icu->adrcode==adrcode)
- break;
- }
+ icu= find_ipocurve(ipo, adrcode);
/* make a new one if none found (and can add) */
if ((icu==NULL) && (add)) {
@@ -2411,7 +2408,7 @@ void clean_ipo(void)
int b;
ok= fbutton(&G.scene->toolsettings->clean_thresh,
- 0.0000001f, 1.0, 0.001, 0.1,
+ 0.0000001f, 1.0f, 0.001f, 0.1f,
"Threshold");
if (!ok) return;
@@ -3770,7 +3767,7 @@ void movekey_obipo(int dir) /* only call external from view3d queue */
ListBase elems;
IpoKey *ik;
int a;
- float toframe= CFRA;
+ float toframe= (float)CFRA;
if (!G.vd)
return;
@@ -3796,7 +3793,7 @@ void movekey_obipo(int dir) /* only call external from view3d queue */
}
if (ik) toframe= ik->val;
}
-
+
free_ipokey(&elems);
}
}
diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c
index 4c5afe0e6bc..a573ea85ca8 100644
--- a/source/blender/src/editmesh.c
+++ b/source/blender/src/editmesh.c
@@ -633,6 +633,7 @@ void free_editMesh(EditMesh *em)
if(em->retopo_paint_data) retopo_free_paint_data(em->retopo_paint_data);
em->retopo_paint_data= NULL;
+ em->act_face = NULL;
}
/* on G.editMesh */
@@ -892,7 +893,7 @@ void make_editMesh()
return;
}
#endif
-
+
/* because of reload */
free_editMesh(em);
@@ -914,8 +915,11 @@ void make_editMesh()
strcpy(G.editModeTitleExtra, "(Key) ");
key_to_mesh(actkey, me);
tot= actkey->totelem;
+ /* undo-ing in past for previous editmode sessions gives corrupt 'keyindex' values */
+ undo_editmode_clear();
}
+
/* make editverts */
CustomData_copy(&me->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
mvert= me->mvert;
@@ -1342,7 +1346,7 @@ void load_editMesh(void)
{
Object *ob;
ModifierData *md;
- EditVert *eve, **vertMap = NULL;
+ EditVert **vertMap = NULL;
int i,j;
for (ob=G.main->object.first; ob; ob=ob->id.next) {
diff --git a/source/blender/src/editmesh_add.c b/source/blender/src/editmesh_add.c
index 71e04541643..16a5b049da2 100644
--- a/source/blender/src/editmesh_add.c
+++ b/source/blender/src/editmesh_add.c
@@ -90,8 +90,10 @@
#include "editmesh.h"
/* bpymenu */
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
static float icovert[12][3] = {
{0,0,-200},
@@ -598,7 +600,7 @@ static void fix_new_face(EditFace *eface)
}
}
-void addfaces_from_edgenet()
+void addfaces_from_edgenet(void)
{
EditVert *eve1, *eve2, *eve3, *eve4;
EditMesh *em= G.editMesh;
@@ -686,14 +688,17 @@ void addedgeface_mesh(void)
}
else if(amount > 4) {
+#ifndef DISABLE_PYTHON
/* Python Menu */
BPyMenu *pym;
+#endif
char menu_number[3];
int i=0, has_pymenu=0, ret;
/* facemenu, will add python items */
char facemenu[4096]= "Make Faces%t|Auto%x1|Make FGon%x2|Clear FGon%x3";
+#ifndef DISABLE_PYTHON
/* note that we account for the 10 previous entries with i+4: */
for (pym = BPyMenuTable[PYMENU_MESHFACEKEY]; pym; pym = pym->next, i++) {
@@ -708,16 +713,18 @@ void addedgeface_mesh(void)
sprintf(menu_number, "%d", i+4);
strcat(facemenu, menu_number);
}
-
+#endif
ret= pupmenu(facemenu);
if(ret==1) addfaces_from_edgenet();
else if(ret==2) make_fgon(1);
else if(ret==3) make_fgon(0);
+#ifndef DISABLE_PYTHON
else if (ret >= 4) {
BPY_menu_do_python(PYMENU_MESHFACEKEY, ret - 4);
return;
}
+#endif
return;
}
else if(amount<2) {
@@ -1172,7 +1179,6 @@ void make_prim(int type, float imat[3][3], int tot, int seg,
//extern signed char monkeyf[][4];
//extern signed char monkeyv[][3];
EditVert **tv= MEM_mallocN(sizeof(*tv)*monkeynv*2, "tv");
- EditFace *efa;
int i;
for (i=0; i<monkeynv; i++) {
@@ -1184,8 +1190,8 @@ void make_prim(int type, float imat[3][3], int tot, int seg,
tv[monkeynv+i]->f |= SELECT;
}
for (i=0; i<monkeynf; i++) {
- efa= addfacelist(tv[monkeyf[i][0]+i-monkeyo], tv[monkeyf[i][1]+i-monkeyo], tv[monkeyf[i][2]+i-monkeyo], (monkeyf[i][3]!=monkeyf[i][2])?tv[monkeyf[i][3]+i-monkeyo]:NULL, NULL, NULL);
- efa= addfacelist(tv[monkeynv+monkeyf[i][2]+i-monkeyo], tv[monkeynv+monkeyf[i][1]+i-monkeyo], tv[monkeynv+monkeyf[i][0]+i-monkeyo], (monkeyf[i][3]!=monkeyf[i][2])?tv[monkeynv+monkeyf[i][3]+i-monkeyo]:NULL, NULL, NULL);
+ addfacelist(tv[monkeyf[i][0]+i-monkeyo], tv[monkeyf[i][1]+i-monkeyo], tv[monkeyf[i][2]+i-monkeyo], (monkeyf[i][3]!=monkeyf[i][2])?tv[monkeyf[i][3]+i-monkeyo]:NULL, NULL, NULL);
+ addfacelist(tv[monkeynv+monkeyf[i][2]+i-monkeyo], tv[monkeynv+monkeyf[i][1]+i-monkeyo], tv[monkeynv+monkeyf[i][0]+i-monkeyo], (monkeyf[i][3]!=monkeyf[i][2])?tv[monkeynv+monkeyf[i][3]+i-monkeyo]:NULL, NULL, NULL);
}
MEM_freeN(tv);
diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c
index bafc9dda7d6..cace0d350b0 100644
--- a/source/blender/src/editmesh_lib.c
+++ b/source/blender/src/editmesh_lib.c
@@ -650,7 +650,9 @@ void EM_selectmode_flush(void)
if(efa->f & SELECT) EM_select_face(efa, 1);
}
}
- check_fgons_selection();
+
+ if(!(G.scene->selectmode & SCE_SELECT_FACE))
+ check_fgons_selection();
}
diff --git a/source/blender/src/editmesh_loop.c b/source/blender/src/editmesh_loop.c
index 138dd93e490..dfd18e208fb 100644
--- a/source/blender/src/editmesh_loop.c
+++ b/source/blender/src/editmesh_loop.c
@@ -538,7 +538,6 @@ static CutCurve *get_mouse_trail(int *len, char mode, char cutmode, struct GHash
bglFlush();
glDrawBuffer(GL_BACK);
return(NULL);
- break;
}
if (rubberband) { /* rubberband mode, undraw last rubberband */
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index ae4bc056964..76f1443616f 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -2433,7 +2433,11 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
//Set faces f1 to 0 cause we need it later
for(ef=em->faces.first;ef;ef = ef->next) ef->f1 = 0;
- for(eve=em->verts.first; eve; eve=eve->next) eve->f1 = eve->f2 = 0;
+ for(eve=em->verts.first; eve; eve=eve->next) {
+ if(!(beauty & B_KNIFE)) /* knife sets this flag for vertex cuts */
+ eve->f1 = 0;
+ eve->f2 = 0;
+ }
for (; md; md=md->next) {
if (md->type==eModifierType_Mirror) {
@@ -4486,7 +4490,7 @@ static void bevel_mesh_recurs(float bsize, short recurs, int allfaces)
}
}
-void bevel_menu() {
+void bevel_menu(void) {
BME_Mesh *bm;
BME_TransData_Head *td;
TransInfo *t;
diff --git a/source/blender/src/editnla.c b/source/blender/src/editnla.c
index dbc0deecb2c..179ea41d5ad 100644
--- a/source/blender/src/editnla.c
+++ b/source/blender/src/editnla.c
@@ -442,8 +442,8 @@ void snap_action_strips(int snap_mode)
if (strip->flag & ACTSTRIP_SELECT) {
if (snap_mode==1) {
/* nearest frame */
- strip->start= floor(strip->start+0.5);
- strip->end= floor(strip->end+0.5);
+ strip->start= (float)floor(strip->start+0.5);
+ strip->end= (float)floor(strip->end+0.5);
}
else if (snap_mode==2) {
/* current frame */
@@ -461,7 +461,7 @@ void snap_action_strips(int snap_mode)
}
else if (snap_mode==3) {
/* nearest second */
- float secf = FPS;
+ float secf = (float)FPS;
strip->start= (float)(floor(strip->start/secf + 0.5f) * secf);
strip->end= (float)(floor(strip->end/secf + 0.5f) * secf);
}
@@ -602,8 +602,8 @@ static void add_nla_block(short event)
strip->act = act;
id_us_plus(&act->id);
calc_action_range(strip->act, &strip->actstart, &strip->actend, 1);
- strip->start = G.scene->r.cfra; /* could be mval[0] another time... */
- strip->end = strip->start + (strip->actend-strip->actstart);
+ strip->start = (float)G.scene->r.cfra; /* could be mval[0] another time... */
+ strip->end = (float)strip->start + (strip->actend-strip->actstart);
/* simple prevention of zero strips */
if(strip->start>strip->end-2)
strip->end= strip->start+100;
@@ -653,8 +653,8 @@ static void add_nla_block_by_name(char name[32], Object *ob, short hold, short a
/* Link the action to the strip */
strip->act = act;
calc_action_range(strip->act, &strip->actstart, &strip->actend, 1);
- strip->start = G.scene->r.cfra; /* could be mval[0] another time... */
- strip->end = strip->start + (strip->actend-strip->actstart);
+ strip->start = (float)G.scene->r.cfra; /* could be mval[0] another time... */
+ strip->end = (float)strip->start + (strip->actend-strip->actstart);
/* simple prevention of zero strips */
if(strip->start>strip->end-2)
strip->end= strip->start+100;
@@ -751,20 +751,20 @@ void add_empty_nlablock(void)
if ((EFRA-CFRA) < 100) {
strip->flag |= ACTSTRIP_AUTO_BLENDS;
strip->flag &= ~ACTSTRIP_LOCK_ACTION;
- strip->actstart = CFRA;
- strip->actend = CFRA + 100;
+ strip->actstart = (float)CFRA;
+ strip->actend = (float)(CFRA + 100);
- strip->start = CFRA;
- strip->end = CFRA + 100;
+ strip->start = (float)CFRA;
+ strip->end = (float)(CFRA + 100);
}
else {
strip->flag |= ACTSTRIP_AUTO_BLENDS;
strip->flag &= ~ACTSTRIP_LOCK_ACTION;
- strip->actstart = CFRA;
- strip->actend = EFRA;
+ strip->actstart = (float)CFRA;
+ strip->actend = (float)EFRA;
- strip->start = CFRA;
- strip->end = EFRA;
+ strip->start = (float)CFRA;
+ strip->end = (float)EFRA;
}
BIF_undo_push("Add NLA strip");
@@ -1196,9 +1196,9 @@ void borderselect_nla(void)
mval[1]= rect.ymax-2;
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
- ymax = count_nla_levels();
- ymax*= (NLACHANNELHEIGHT+NLACHANNELSKIP);
- ymax+= (NLACHANNELHEIGHT+NLACHANNELSKIP)/2;
+ ymax = (float)count_nla_levels();
+ ymax *= (float)(NLACHANNELHEIGHT+NLACHANNELSKIP);
+ ymax += (float)(NLACHANNELHEIGHT+NLACHANNELSKIP)/2;
for (base=G.scene->base.first; base; base=base->next){
if (nla_filter(base)) {
@@ -1392,9 +1392,9 @@ static Base *get_nearest_nlastrip (bActionStrip **rstrip, short *sel)
mval[0]+=14;
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
- ymax = count_nla_levels();
- ymax*=(NLACHANNELHEIGHT + NLACHANNELSKIP);
- ymax+= NLACHANNELHEIGHT/2;
+ ymax = (float)count_nla_levels();
+ ymax *= (float)(NLACHANNELHEIGHT + NLACHANNELSKIP);
+ ymax += (float)(NLACHANNELHEIGHT / 2);
for (base = G.scene->base.first; base; base=base->next){
if (nla_filter(base)) {
@@ -1467,17 +1467,15 @@ static Base *get_nearest_nlachannel_ob_key (float *index, short *sel)
mval[0]+=14;
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
- ymax = count_nla_levels();
-
- ymax*= (NLACHANNELHEIGHT + NLACHANNELSKIP);
- ymax+= NLACHANNELHEIGHT/2;
+ ymax = (float)count_nla_levels();
+ ymax *= (float)(NLACHANNELHEIGHT + NLACHANNELSKIP);
+ ymax += (float)(NLACHANNELHEIGHT / 2);
*sel=0;
- for (base=G.scene->base.first; base; base=base->next){
+ for (base=G.scene->base.first; base; base=base->next) {
if (nla_filter(base)) {
-
- ymin=ymax-(NLACHANNELHEIGHT+NLACHANNELSKIP);
+ ymin= ymax - (NLACHANNELHEIGHT + NLACHANNELSKIP);
/* Handle object ipo selection */
if (base->object->ipo){
@@ -1579,10 +1577,9 @@ static bAction *get_nearest_nlachannel_ac_key (float *index, short *sel)
mval[0]+=14;
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
- ymax = count_nla_levels();
-
- ymax*= (NLACHANNELHEIGHT + NLACHANNELSKIP);
- ymax+= NLACHANNELHEIGHT/2;
+ ymax = (float)count_nla_levels();
+ ymax *= (float)(NLACHANNELHEIGHT + NLACHANNELSKIP);
+ ymax += (float)(NLACHANNELHEIGHT / 2);
*sel=0;
@@ -1940,15 +1937,20 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case DELKEY:
case XKEY:
- if (mval[0]>=NLAWIDTH) {
- if (okee("Erase selected?")) {
- delete_nlachannel_keys();
- update_for_newframe_muted();
-
- remove_marker();
-
- allqueue(REDRAWMARKER, 0);
+ if (mval[0] >= NLAWIDTH) {
+ /* markers are incorported under shift-modifier (it does go against conventions, but oh well :/) */
+ if (G.qual == LR_SHIFTKEY) {
+ if (okee("Erase selected marker(s)?"))
+ remove_marker();
+ }
+ else {
+ if (okee("Erase selected?")) {
+ delete_nlachannel_keys();
+ update_for_newframe_muted();
+ }
}
+
+ allqueue(REDRAWMARKER, 0);
}
break;
@@ -1990,13 +1992,13 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case PADPLUSKEY:
- view2d_zoom(G.v2d, 0.1154, sa->winx, sa->winy);
+ view2d_zoom(G.v2d, 0.1154f, sa->winx, sa->winy);
test_view2d(G.v2d, sa->winx, sa->winy);
view2d_do_locks(curarea, V2D_LOCK_COPY);
doredraw= 1;
break;
case PADMINUS:
- view2d_zoom(G.v2d, -0.15, sa->winx, sa->winy);
+ view2d_zoom(G.v2d, -0.15f, sa->winx, sa->winy);
test_view2d(G.v2d, sa->winx, sa->winy);
view2d_do_locks(curarea, V2D_LOCK_COPY);
doredraw= 1;
diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c
index d3ba153e600..23387673f95 100644
--- a/source/blender/src/editnode.c
+++ b/source/blender/src/editnode.c
@@ -2395,7 +2395,12 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
short val= evt->val, doredraw=0, fromlib= 0;
if(sa->win==0) return;
- if(snode->nodetree==NULL) return;
+
+ if(snode->nodetree==NULL) {
+ /* no other events should be handled, but floating panels still should get handled */
+ uiDoBlocks(&curarea->uiblocks, event, 1);
+ return;
+ }
if(val) {
if( node_uiDoBlocks(sa, event)!=UI_NOTHING ) event= 0;
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 370f116d318..4a70e89dd07 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -3938,7 +3938,7 @@ void make_links(short event)
BIF_undo_push("Create links");
}
-void apply_objects_locrot( void )
+static void apply_objects_internal( int apply_scale, int apply_rot )
{
Base *base, *basact;
Object *ob;
@@ -3952,7 +3952,11 @@ void apply_objects_locrot( void )
float mat[3][3];
int a, change = 0;
-
+ if (!apply_scale && !apply_rot) {
+ /* do nothing? */
+ error("Nothing to do!");
+ return;
+ }
/* first check if we can execute */
for (base= FIRSTBASE; base; base= base->next) {
if TESTBASELIB(base) {
@@ -4000,7 +4004,13 @@ void apply_objects_locrot( void )
ob= base->object;
if(ob->type==OB_MESH) {
- object_to_mat3(ob, mat);
+ if (apply_scale && apply_rot)
+ object_to_mat3(ob, mat);
+ else if (apply_scale)
+ object_scale_to_mat3(ob, mat);
+ else
+ object_rot_to_mat3(ob, mat);
+
me= ob->data;
/* see checks above */
@@ -4009,8 +4019,10 @@ void apply_objects_locrot( void )
for(a=0; a<me->totvert; a++, mvert++) {
Mat3MulVecfl(mat, mvert->co);
}
- ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
+ if (apply_scale)
+ ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
+ if (apply_rot)
+ ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
/*QuatOne(ob->quat);*/ /* Quats arnt used yet */
where_is_object(ob);
@@ -4025,15 +4037,22 @@ void apply_objects_locrot( void )
change = 1;
}
else if (ob->type==OB_ARMATURE) {
- object_to_mat3(ob, mat);
+ if (apply_scale && apply_rot)
+ object_to_mat3(ob, mat);
+ else if (apply_scale)
+ object_scale_to_mat3(ob, mat);
+ else
+ object_rot_to_mat3(ob, mat);
arm= ob->data;
/* see checks above */
apply_rot_armature(ob, mat);
/* Reset the object's transforms */
- ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
+ if (apply_scale)
+ ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
+ if (apply_rot)
+ ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
/*QuatOne(ob->quat); (not used anymore)*/
where_is_object(ob);
@@ -4042,7 +4061,12 @@ void apply_objects_locrot( void )
}
else if ELEM(ob->type, OB_CURVE, OB_SURF) {
float scale;
- object_to_mat3(ob, mat);
+ if (apply_scale && apply_rot)
+ object_to_mat3(ob, mat);
+ else if (apply_scale)
+ object_scale_to_mat3(ob, mat);
+ else
+ object_rot_to_mat3(ob, mat);
scale = Mat3ToScalef(mat);
cu= ob->data;
@@ -4071,9 +4095,10 @@ void apply_objects_locrot( void )
}
nu= nu->next;
}
-
- ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
+ if (apply_scale)
+ ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
+ if (apply_rot)
+ ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
/*QuatOne(ob->quat); (quats arnt used anymore)*/
where_is_object(ob);
@@ -4095,10 +4120,30 @@ void apply_objects_locrot( void )
}
if (change) {
allqueue(REDRAWVIEW3D, 0);
- BIF_undo_push("Apply Objects Scale & Rotation");
+ if (apply_scale && apply_rot)
+ BIF_undo_push("Apply Objects Scale & Rotation");
+ else if (apply_scale)
+ BIF_undo_push("Apply Objects Scale");
+ else
+ BIF_undo_push("Apply Objects Rotation");
}
}
+void apply_objects_locrot(void)
+{
+ apply_objects_internal(1, 1);
+}
+
+void apply_objects_scale(void)
+{
+ apply_objects_internal(1, 0);
+}
+
+void apply_objects_rot(void)
+{
+ apply_objects_internal(0, 1);
+}
+
void apply_objects_visual_tx( void )
{
Base *base;
@@ -4154,7 +4199,7 @@ void apply_object( void )
if ((ob->pose) && (ob->flag & OB_POSEMODE))
evt = pupmenu("Apply Object%t|Current Pose as RestPose%x3");
else
- evt = pupmenu("Apply Object%t|Scale and Rotation to ObData%x1|Visual Transform to Objects Loc/Scale/Rot%x2");
+ evt = pupmenu("Apply Object%t|Scale and Rotation to ObData%x1|Visual Transform to Objects Loc/Scale/Rot%x2|Scale to ObData%x4|Rotation to ObData%x5");
if (evt==-1) return;
switch (evt) {
@@ -4167,6 +4212,12 @@ void apply_object( void )
case 3:
apply_armature_pose2bones();
break;
+ case 4:
+ apply_objects_scale();
+ break;
+ case 5:
+ apply_objects_rot();
+ break;
}
}
}
@@ -5353,10 +5404,51 @@ void adduplicate(int mode, int dupflag)
}
}
-void make_duplilist_real()
+void make_object_duplilist_real(Base *base)
{
- Base *base, *basen;
+ Base *basen;
Object *ob;
+ ListBase *lb;
+ DupliObject *dob;
+
+ if(!base && !(base = BASACT))
+ return;
+
+ if(!(base->object->transflag & OB_DUPLI))
+ return;
+
+ lb= object_duplilist(G.scene, base->object);
+
+ for(dob= lb->first; dob; dob= dob->next) {
+ ob= copy_object(dob->ob);
+ /* font duplis can have a totcol without material, we get them from parent
+ * should be implemented better...
+ */
+ if(ob->mat==NULL) ob->totcol= 0;
+
+ basen= MEM_dupallocN(base);
+ basen->flag &= ~OB_FROMDUPLI;
+ BLI_addhead(&G.scene->base, basen); /* addhead: othwise eternal loop */
+ basen->object= ob;
+ ob->ipo= NULL; /* make sure apply works */
+ ob->parent= ob->track= NULL;
+ ob->disp.first= ob->disp.last= NULL;
+ ob->transflag &= ~OB_DUPLI;
+
+ Mat4CpyMat4(ob->obmat, dob->mat);
+ apply_obmat(ob);
+ }
+
+ copy_object_set_idnew(0);
+
+ free_object_duplilist(lb);
+
+ base->object->transflag &= ~OB_DUPLI;
+}
+
+void make_duplilist_real()
+{
+ Base *base;
/* extern ListBase duplilist; */
if(okee("Make dupli objects real")==0) return;
@@ -5366,37 +5458,7 @@ void make_duplilist_real()
base= FIRSTBASE;
while(base) {
if TESTBASE(base) {
-
- if(base->object->transflag & OB_DUPLI) {
- ListBase *lb= object_duplilist(G.scene, base->object);
- DupliObject *dob;
-
- for(dob= lb->first; dob; dob= dob->next) {
- ob= copy_object(dob->ob);
- /* font duplis can have a totcol without material, we get them from parent
- * should be implemented better...
- */
- if(ob->mat==NULL) ob->totcol= 0;
-
- basen= MEM_dupallocN(base);
- basen->flag &= ~OB_FROMDUPLI;
- BLI_addhead(&G.scene->base, basen); /* addhead: othwise eternal loop */
- basen->object= ob;
- ob->ipo= NULL; /* make sure apply works */
- ob->parent= ob->track= NULL;
- ob->disp.first= ob->disp.last= NULL;
- ob->transflag &= ~OB_DUPLI;
-
- Mat4CpyMat4(ob->obmat, dob->mat);
- apply_obmat(ob);
- }
-
- copy_object_set_idnew(0);
-
- free_object_duplilist(lb);
-
- base->object->transflag &= ~OB_DUPLI;
- }
+ make_object_duplilist_real(base);
}
base= base->next;
}
diff --git a/source/blender/src/editparticle.c b/source/blender/src/editparticle.c
index f420d46c827..21192d50333 100644
--- a/source/blender/src/editparticle.c
+++ b/source/blender/src/editparticle.c
@@ -2022,7 +2022,7 @@ static void PE_radialcontrol_callback(const int mode, const int val)
(*PE_radialcontrol()) = NULL;
}
-RadialControl **PE_radialcontrol()
+RadialControl **PE_radialcontrol(void)
{
static RadialControl *rc = NULL;
return &rc;
@@ -2408,7 +2408,7 @@ static void brush_add(Object *ob, ParticleSystem *psys, short *mval, short numbe
tree=BLI_kdtree_new(psys->totpart);
for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
- psys_particle_on_dm(ob,psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,cur_co,0,0,0,0,0);
+ psys_particle_on_dm(psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,cur_co,0,0,0,0,0);
BLI_kdtree_insert(tree, i, cur_co, NULL);
}
@@ -2448,7 +2448,7 @@ static void brush_add(Object *ob, ParticleSystem *psys, short *mval, short numbe
int w, maxw;
float maxd, mind, dd, totw=0.0, weight[3];
- psys_particle_on_dm(ob,psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,0,0);
+ psys_particle_on_dm(psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,0,0);
maxw = BLI_kdtree_find_n_nearest(tree,3,co1,NULL,ptn);
maxd = ptn[maxw-1].dist;
diff --git a/source/blender/src/editscreen.c b/source/blender/src/editscreen.c
index 2557894d0e0..3cc306c8ea9 100644
--- a/source/blender/src/editscreen.c
+++ b/source/blender/src/editscreen.c
@@ -104,7 +104,10 @@
#include "BSE_seqaudio.h"
#include "BSE_view.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
+
#include "mydevice.h"
#include "blendef.h"
@@ -1378,11 +1381,13 @@ void screenmain(void)
BIF_read_file(ext_load_str);
sound_initialize_sounds();
}
+#ifndef DISABLE_PYTHON
else if ((event==ONLOAD_SCRIPT) && BPY_has_onload_script()) {
/* event queued in setup_app_data() in blender.c, where G.f is checked */
onload_script = 1;
firsttime = 1; /* see last 'if' in this function */
}
+#endif
else {
towin= 1;
}
@@ -1518,13 +1523,14 @@ void screenmain(void)
}
/* Bizar hack. The event queue has mutated... */
if ( (firsttime) && (event == 0) ) {
-
+#ifndef DISABLE_PYTHON
if (onload_script) {
/* OnLoad scriptlink */
BPY_do_pyscript(&G.scene->id, SCRIPT_ONLOAD);
onload_script = 0;
- }
- else if (G.fileflags & G_FILE_AUTOPLAY) {
+ } else
+#endif
+ if (G.fileflags & G_FILE_AUTOPLAY) {
// SET AUTOPLAY in G.flags for
// other fileloads
@@ -1887,9 +1893,9 @@ static void del_area(ScrArea *sa)
uiFreeBlocks(&sa->uiblocks);
uiFreePanels(&sa->panels);
-
+#ifndef DISABLE_PYTHON
BPY_free_scriptlink(&sa->scriptlink);
-
+#endif
if(sa==curarea) curarea= NULL;
if(sa==g_activearea) g_activearea= NULL;
}
diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c
index 1762e49a2a2..7fc76dd5202 100644
--- a/source/blender/src/editsima.c
+++ b/source/blender/src/editsima.c
@@ -110,7 +110,7 @@
#include "editmesh.h"
/* local prototypes */
-void sel_uvco_inside_radius(short , EditFace *efa, MTFace *, int , float *, float *, short);
+static void sel_uvco_inside_radius(short , EditFace *efa, MTFace *, int , float *, float *, short);
void uvedit_selectionCB(short , Object *, short *, float ); /* used in edit.c*/
void object_uvs_changed(Object *ob)
@@ -1264,7 +1264,7 @@ void snap_menu_sima(void)
* Just for readability...
*/
-void sel_uvco_inside_radius(short sel, EditFace *efa, MTFace *tface, int index, float *offset, float *ell, short select_index)
+static void sel_uvco_inside_radius(short sel, EditFace *efa, MTFace *tface, int index, float *offset, float *ell, short select_index)
{
// normalized ellipse: ell[0] = scaleX,
// [1] = scaleY
@@ -1730,7 +1730,7 @@ void uvface_setsel__internal(short select)
} else if ((G.sima->flag & SI_SYNC_UVSEL)==0 && G.sima->sticky == SI_STICKY_LOC) {
EditFace *efa_vlist;
MTFace *tf_vlist;
- UvMapVert *vlist, *start_vlist=NULL, *vlist_iter;
+ UvMapVert *start_vlist=NULL, *vlist_iter;
struct UvVertMap *vmap;
float limit[2];
int efa_index;
@@ -1760,7 +1760,7 @@ void uvface_setsel__internal(short select)
simaUVSel_UnSet(efa, tf, i);
}
- vlist= vlist_iter= get_uv_map_vert_EM(vmap, (*(&efa->v1 + i))->tmp.l);
+ vlist_iter= get_uv_map_vert_EM(vmap, (*(&efa->v1 + i))->tmp.l);
while (vlist_iter) {
if (vlist_iter->separate)
diff --git a/source/blender/src/editsound.c b/source/blender/src/editsound.c
index 2d70525f971..95b3a3d3021 100644
--- a/source/blender/src/editsound.c
+++ b/source/blender/src/editsound.c
@@ -91,15 +91,12 @@
/* this might move to the external header */
-void* sound_get_libraryinterface(void);
-
static SND_SceneHandle ghSoundScene=NULL;
static SND_AudioDeviceInterfaceHandle ghAudioDeviceInterface=NULL;
/* que? why only here? because of the type define? */
-bSound *sound_find_sound(char *id_name);
-void sound_read_wav_data(bSound * sound, PackedFile * pf);
-void sound_stop_sound(void *object, bSound *sound);
+//static bSound *sound_find_sound(char *id_name);
+static void sound_read_wav_data(bSound * sound, PackedFile * pf);
void winqreadsoundspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
/* void sound_stop_all_sounds(void); already in BIF_editsound.h */
@@ -358,7 +355,7 @@ void sound_initialize_sample(bSound *sound)
}
-void sound_read_wav_data(bSound *sound, PackedFile *pf)
+static void sound_read_wav_data(bSound *sound, PackedFile *pf)
{
int i, temp;
short shortbuf, *temps;
@@ -1025,8 +1022,8 @@ void sound_play_sound(bSound *sound)
}
-
-bSound *sound_find_sound(char *id_name)
+#if 0
+static bSound *sound_find_sound(char *id_name)
{
bSound *sound;
@@ -1042,6 +1039,7 @@ bSound *sound_find_sound(char *id_name)
return sound;
}
+#endif
void sound_init_audio(void)
{
diff --git a/source/blender/src/fluidsim.c b/source/blender/src/fluidsim.c
index 31cc4b81d7a..9c3116e53db 100644
--- a/source/blender/src/fluidsim.c
+++ b/source/blender/src/fluidsim.c
@@ -284,7 +284,7 @@ static volatile int globalBakeFrame = 0;
static volatile int g_break= 0;
// run simulation in seperate thread
-static int fluidsimSimulateThread(void *unused) { // *ptr) {
+static void *fluidsimSimulateThread(void *unused) { // *ptr) {
//char* fnameCfgPath = (char*)(ptr);
int ret=0;
diff --git a/source/blender/src/ghostwinlay.c b/source/blender/src/ghostwinlay.c
index 7179f2fae57..9388ac93543 100644
--- a/source/blender/src/ghostwinlay.c
+++ b/source/blender/src/ghostwinlay.c
@@ -478,6 +478,18 @@ void window_make_active(Window *win) {
}
void window_swap_buffers(Window *win) {
+#ifdef _WIN32
+ // adding a glFinish() here is to prevent Geforce in 'full scene antialias' mode
+ // from antialising the Blender window. Officially a swapbuffers does a glFinish
+ // itself, so this feels really like a hack... but it won't harm. (ton)
+ //
+ // moved it here from ghost because it is a performance killer for the game engine,
+ // glFinish forces synchronization with the graphics card and calling it is strongly
+ // discouraged for good performance. (brecht)
+ //
+ glFinish();
+#endif
+
GHOST_SwapWindowBuffers(win->ghostwin);
}
diff --git a/source/blender/src/gpencil.c b/source/blender/src/gpencil.c
index 9245d2f95f3..497443edffd 100644
--- a/source/blender/src/gpencil.c
+++ b/source/blender/src/gpencil.c
@@ -1,5 +1,5 @@
/**
- * $Id: gpencil.c 14881 2008-05-18 10:41:42Z aligorith $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -63,6 +63,7 @@
#include "BKE_armature.h"
#include "BKE_curve.h"
#include "BKE_image.h"
+#include "BKE_library.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -111,7 +112,7 @@ void free_gpencil_strokes (bGPDframe *gpf)
gpsn= gps->next;
/* free stroke memory arrays, then stroke itself */
- MEM_freeN(gps->points);
+ if (gps->points) MEM_freeN(gps->points);
BLI_freelinkN(&gpf->strokes, gps);
}
}
@@ -134,7 +135,7 @@ void free_gpencil_frames (bGPDlayer *gpl)
}
}
-/* Free all of the gp-layers for a viewport (list should be &G.vd->gpd or so) */
+/* Free all of the gp-layers for a viewport (list should be &gpd->layers or so) */
void free_gpencil_layers (ListBase *list)
{
bGPDlayer *gpl, *gpln;
@@ -254,13 +255,63 @@ bGPdata *gpencil_data_addnew (void)
/* -------- Data Duplication ---------- */
+/* make a copy of a given gpencil frame */
+bGPDframe *gpencil_frame_duplicate (bGPDframe *src)
+{
+ bGPDstroke *gps, *gpsd;
+ bGPDframe *dst;
+
+ /* error checking */
+ if (src == NULL)
+ return NULL;
+
+ /* make a copy of the source frame */
+ dst= MEM_dupallocN(src);
+
+ /* copy strokes */
+ dst->strokes.first = dst->strokes.last= NULL;
+ for (gps= src->strokes.first; gps; gps= gps->next) {
+ /* make copy of source stroke, then adjust pointer to points too */
+ gpsd= MEM_dupallocN(gps);
+ gpsd->points= MEM_dupallocN(gps->points);
+
+ BLI_addtail(&dst->strokes, gpsd);
+ }
+
+ /* return new frame */
+ return dst;
+}
+
+/* make a copy of a given gpencil layer */
+bGPDlayer *gpencil_layer_duplicate (bGPDlayer *src)
+{
+ bGPDframe *gpf, *gpfd;
+ bGPDlayer *dst;
+
+ /* error checking */
+ if (src == NULL)
+ return NULL;
+
+ /* make a copy of source layer */
+ dst= MEM_dupallocN(src);
+
+ /* copy frames */
+ dst->frames.first= dst->frames.last= NULL;
+ for (gpf= src->frames.first; gpf; gpf= gpf->next) {
+ /* make a copy of source stroke */
+ gpfd= gpencil_frame_duplicate(gpf);
+ BLI_addtail(&dst->frames, gpfd);
+ }
+
+ /* return new layer */
+ return dst;
+}
+
/* make a copy of a given gpencil datablock */
bGPdata *gpencil_data_duplicate (bGPdata *src)
{
+ bGPDlayer *gpl, *gpld;
bGPdata *dst;
- bGPDlayer *gpld, *gpls;
- bGPDframe *gpfd, *gpfs;
- bGPDstroke *gps;
/* error checking */
if (src == NULL)
@@ -270,25 +321,11 @@ bGPdata *gpencil_data_duplicate (bGPdata *src)
dst= MEM_dupallocN(src);
/* copy layers */
- duplicatelist(&dst->layers, &src->layers);
-
- for (gpld=dst->layers.first, gpls=src->layers.first; gpld && gpls;
- gpld=gpld->next, gpls=gpls->next)
- {
- /* copy frames */
- duplicatelist(&gpld->frames, &gpls->frames);
-
- for (gpfd=gpld->frames.first, gpfs=gpls->frames.first; gpfd && gpfs;
- gpfd=gpfd->next, gpfs=gpfs->next)
- {
- /* copy strokes */
- duplicatelist(&gpfd->strokes, &gpfs->strokes);
-
- for (gps= gpfd->strokes.first; gps; gps= gps->next)
- {
- gps->points= MEM_dupallocN(gps->points);
- }
- }
+ dst->layers.first= dst->layers.last= NULL;
+ for (gpl= src->layers.first; gpl; gpl= gpl->next) {
+ /* make a copy of source layer and its data */
+ gpld= gpencil_layer_duplicate(gpl);
+ BLI_addtail(&dst->layers, gpld);
}
/* return new */
@@ -414,6 +451,30 @@ short gpencil_data_setactive (ScrArea *sa, bGPdata *gpd)
return 0;
}
+/* return the ScrArea that has the given GP-datablock
+ * - assumes that only searching in current screen
+ * - is based on GP-datablocks only being able to
+ * exist for one area at a time (i.e. not multiuser)
+ */
+ScrArea *gpencil_data_findowner (bGPdata *gpd)
+{
+ ScrArea *sa;
+
+ /* error checking */
+ if (gpd == NULL)
+ return NULL;
+
+ /* loop over all scrareas for current screen, and check if that area has this gpd */
+ for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
+ /* use get-active func to see if match */
+ if (gpencil_data_getactive(sa) == gpd)
+ return sa;
+ }
+
+ /* not found */
+ return NULL;
+}
+
/* -------- GP-Frame API ---------- */
/* delete the last stroke of the given frame */
@@ -538,6 +599,7 @@ bGPDframe *gpencil_layer_getframe (bGPDlayer *gpl, int cframe, short addnew)
else {
/* unresolved errogenous situation! */
printf("Error: cannot find appropriate gp-frame \n");
+ /* gpl->actframe should still be NULL */
}
}
else {
@@ -546,6 +608,7 @@ bGPDframe *gpencil_layer_getframe (bGPDlayer *gpl, int cframe, short addnew)
gpl->actframe= gpencil_frame_addnew(gpl, cframe);
else {
/* don't do anything... this may be when no frames yet! */
+ /* gpl->actframe should still be NULL */
}
}
@@ -614,7 +677,6 @@ void gpencil_layer_delactive (bGPdata *gpd)
/* free layer */
free_gpencil_frames(gpl);
BLI_freelinkN(&gpd->layers, gpl);
-
}
/* ************************************************** */
@@ -707,8 +769,8 @@ static void gp_strokepoint_convertcoords (bGPDstroke *gps, bGPDspoint *pt, float
ipoco_to_areaco_noclip(v2d, &pt->x, mval);
}
else {
- mval[0]= (pt->x / 1000 * curarea->winx);
- mval[1]= (pt->y / 1000 * curarea->winy);
+ mval[0]= (short)(pt->x / 1000 * curarea->winx);
+ mval[1]= (short)(pt->y / 1000 * curarea->winy);
}
mx= mval[0];
my= mval[1];
@@ -792,7 +854,7 @@ static void gp_stroke_to_bezier (bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
/* set settings */
bezt->h1= bezt->h2= HD_FREE;
bezt->f1= bezt->f2= bezt->f3= SELECT;
- bezt->radius = bezt->weight = pt->pressure * gpl->thickness;
+ bezt->radius = bezt->weight = pt->pressure * gpl->thickness * 0.1f;
}
/* must calculate handles or else we crash */
@@ -817,17 +879,20 @@ static void gp_layer_to_curve (bGPdata *gpd, bGPDlayer *gpl, short mode)
/* only convert if there are any strokes on this layer's frame to convert */
if (gpf->strokes.first == NULL)
return;
-
- /* initialise the curve */
- cu= add_curve(gpl->info, 1);
- cu->flag |= CU_3D;
- /* init the curve object (remove rotation and assign curve data to it) */
+ /* init the curve object (remove rotation and get curve data from it)
+ * - must clear transforms set on object, as those skew our results
+ */
add_object_draw(OB_CURVE);
ob= OBACT;
ob->loc[0]= ob->loc[1]= ob->loc[2]= 0;
ob->rot[0]= ob->rot[1]= ob->rot[2]= 0;
- ob->data= cu;
+ cu= ob->data;
+ cu->flag |= CU_3D;
+
+ /* rename object and curve to layer name */
+ rename_id((ID *)ob, gpl->info);
+ rename_id((ID *)cu, gpl->info);
/* add points to curve */
for (gps= gpf->strokes.first; gps; gps= gps->next) {
@@ -866,25 +931,29 @@ static void gp_stroke_to_bonechain (bGPDlayer *gpl, bGPDstroke *gps, bArmature *
VecCopyf(ebo->tail, p3db);
/* add new bone - note: sync with editarmature.c::add_editbone() */
- BLI_strncpy(ebo->name, "Stroke", 32);
- unique_editbone_name(bones, ebo->name);
-
- BLI_addtail(bones, ebo);
-
- ebo->flag |= BONE_CONNECTED;
- ebo->weight= 1.0F;
- ebo->dist= 0.25F;
- ebo->xwidth= 0.1;
- ebo->zwidth= 0.1;
- ebo->ease1= 1.0;
- ebo->ease2= 1.0;
- ebo->rad_head= pt->pressure * gpl->thickness * 0.1;
- ebo->rad_tail= ptn->pressure * gpl->thickness * 0.1;
- ebo->segments= 1;
- ebo->layer= arm->layer;
+ {
+ BLI_strncpy(ebo->name, "Stroke", 32);
+ unique_editbone_name(bones, ebo->name);
+
+ BLI_addtail(bones, ebo);
+
+ if (i > 0)
+ {
+ ebo->flag |= BONE_CONNECTED;
+ }
+ ebo->weight= 1.0f;
+ ebo->dist= 0.25f;
+ ebo->xwidth= 0.1f;
+ ebo->zwidth= 0.1f;
+ ebo->ease1= 1.0f;
+ ebo->ease2= 1.0f;
+ ebo->rad_head= pt->pressure * gpl->thickness * 0.1f;
+ ebo->rad_tail= ptn->pressure * gpl->thickness * 0.1f;
+ ebo->segments= 1;
+ ebo->layer= arm->layer;
+ }
/* set parenting */
- // TODO: also adjust roll....
ebo->parent= prev;
}
}
@@ -905,22 +974,43 @@ static void gp_layer_to_armature (bGPdata *gpd, bGPDlayer *gpl, short mode)
/* only convert if there are any strokes on this layer's frame to convert */
if (gpf->strokes.first == NULL)
return;
-
- /* initialise the armature */
- arm= add_armature(gpl->info);
- /* init the armature object (remove rotation and assign armature data to it) */
+ /* init the armature object (remove rotation and assign armature data to it)
+ * - must clear transforms set on object, as those skew our results
+ */
add_object_draw(OB_ARMATURE);
ob= OBACT;
ob->loc[0]= ob->loc[1]= ob->loc[2]= 0;
ob->rot[0]= ob->rot[1]= ob->rot[2]= 0;
- ob->data= arm;
+ arm= ob->data;
+
+ /* rename object and armature to layer name */
+ rename_id((ID *)ob, gpl->info);
+ rename_id((ID *)arm, gpl->info);
/* convert segments to bones, strokes to bone chains */
for (gps= gpf->strokes.first; gps; gps= gps->next) {
gp_stroke_to_bonechain(gpl, gps, arm, &bones);
}
+ /* adjust roll of bones
+ * - set object as EditMode object, but need to clear afterwards!
+ * - use 'align to world z-up' option
+ */
+ {
+ /* set our data as if we're in editmode to fool auto_align_armature() */
+ G.obedit= ob;
+ G.edbo.first = bones.first;
+ G.edbo.last = bones.last;
+
+ /* WARNING: need to make sure this magic number doesn't change */
+ auto_align_armature(2);
+
+ /* clear editbones (not needed anymore) */
+ G.edbo.first= G.edbo.last= NULL;
+ G.obedit= NULL;
+ }
+
/* flush editbones to armature */
editbones_to_armature(&bones, ob);
if (bones.first) BLI_freelistN(&bones);
@@ -991,19 +1081,27 @@ void gpencil_convert_menu (void)
/* maximum sizes of gp-session buffer */
#define GP_STROKE_BUFFER_MAX 5000
-/* Hardcoded sensitivity thresholds... */
+/* Macros for accessing sensitivity thresholds... */
/* minimum number of pixels mouse should move before new point created */
-#define MIN_MANHATTEN_PX U.gp_manhattendist
+#define MIN_MANHATTEN_PX (U.gp_manhattendist)
/* minimum length of new segment before new point can be added */
-#define MIN_EUCLIDEAN_PX U.gp_euclideandist
+#define MIN_EUCLIDEAN_PX (U.gp_euclideandist)
+/* macro to test if only converting endpoints - only for use when converting! */
+#define GP_BUFFER2STROKE_ENDPOINTS ((gpd->flag & GP_DATA_EDITPAINT) && (G.qual & LR_CTRLKEY))
+
/* ------ */
/* Temporary 'Stroke' Operation data */
typedef struct tGPsdata {
ScrArea *sa; /* area where painting originated */
View2D *v2d; /* needed for GP_STROKE_2DSPACE */
+
ImBuf *ibuf; /* needed for GP_STROKE_2DIMAGE */
+ struct IBufViewSettings {
+ int offsx, offsy; /* offsets */
+ int sizex, sizey; /* dimensions to use as scale-factor */
+ } im2d_settings; /* needed for GP_STROKE_2DIMAGE */
bGPdata *gpd; /* gp-datablock layer comes from */
bGPDlayer *gpl; /* layer we're working on */
@@ -1014,6 +1112,10 @@ typedef struct tGPsdata {
short mval[2]; /* current mouse-position */
short mvalo[2]; /* previous recorded mouse-position */
+
+ float pressure; /* current stylus pressure */
+ float opressure; /* previous stylus pressure */
+
short radius; /* radius of influence for eraser */
} tGPsdata;
@@ -1058,145 +1160,6 @@ static void gp_session_validatebuffer (tGPsdata *p)
gpd->sbuffer_sflag= 0;
}
-/* init new painting session */
-static void gp_session_initpaint (tGPsdata *p)
-{
- /* clear previous data (note: is on stack) */
- memset(p, 0, sizeof(tGPsdata));
-
- /* make sure the active view (at the starting time) is a 3d-view */
- if (curarea == NULL) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: No active view for painting \n");
- return;
- }
- switch (curarea->spacetype) {
- /* supported views first */
- case SPACE_VIEW3D:
- {
- View3D *v3d= curarea->spacedata.first;
-
- /* set current area */
- p->sa= curarea;
-
- /* check that gpencil data is allowed to be drawn */
- if ((v3d->flag2 & V3D_DISPGP)==0) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view, Grease Pencil not shown \n");
- return;
- }
- }
- break;
- case SPACE_NODE:
- {
- SpaceNode *snode= curarea->spacedata.first;
-
- /* set current area */
- p->sa= curarea;
- p->v2d= &snode->v2d;
-
- /* check that gpencil data is allowed to be drawn */
- if ((snode->flag & SNODE_DISPGP)==0) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view, Grease Pencil not shown \n");
- return;
- }
- }
- break;
- case SPACE_SEQ:
- {
- SpaceSeq *sseq= curarea->spacedata.first;
-
- /* set current area */
- p->sa= curarea;
- p->v2d= &sseq->v2d;
-
- /* check that gpencil data is allowed to be drawn */
- if (sseq->mainb == 0) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view (sequencer), active mode doesn't support Grease Pencil \n");
- return;
- }
- if ((sseq->flag & SEQ_DRAW_GPENCIL)==0) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view, Grease Pencil not shown \n");
- return;
- }
- }
- break;
- case SPACE_IMAGE:
- {
- SpaceImage *sima= curarea->spacedata.first;
-
- /* set the current area */
- p->sa= curarea;
- p->v2d= &sima->v2d;
- p->ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser);
- }
- break;
- /* unsupported views */
- default:
- {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: Active view not appropriate for Grease Pencil drawing \n");
- return;
- }
- break;
- }
-
- /* get gp-data */
- p->gpd= gpencil_data_getactive(p->sa);
- if (p->gpd == NULL) {
- short ok;
-
- p->gpd= gpencil_data_addnew();
- ok= gpencil_data_setactive(p->sa, p->gpd);
-
- /* most of the time, the following check isn't needed */
- if (ok == 0) {
- /* free gpencil data as it can't be used */
- free_gpencil_data(p->gpd);
- p->gpd= NULL;
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: Could not assign newly created Grease Pencil data to active area \n");
- return;
- }
- }
-
- /* set edit flags */
- G.f |= G_GREASEPENCIL;
-
- /* clear out buffer (stored in gp-data) in case something contaminated it */
- gp_session_validatebuffer(p);
-}
-
-/* cleanup after a painting session */
-static void gp_session_cleanup (tGPsdata *p)
-{
- bGPdata *gpd= p->gpd;
-
- /* error checking */
- if (gpd == NULL)
- return;
-
- /* free stroke buffer */
- if (gpd->sbuffer) {
- MEM_freeN(gpd->sbuffer);
- gpd->sbuffer= NULL;
- }
-
- /* clear flags */
- gpd->sbuffer_size= 0;
- gpd->sbuffer_sflag= 0;
-}
-
/* check if the current mouse position is suitable for adding a new point */
static short gp_stroke_filtermval (tGPsdata *p, short mval[2], short pmval[2])
{
@@ -1228,6 +1191,16 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
float *fp= give_cursor();
float dvec[3];
+ /* Current method just converts each point in screen-coordinates to
+ * 3D-coordinates using the 3D-cursor as reference. In general, this
+ * works OK, but it could of course be improved.
+ *
+ * TODO:
+ * - investigate using nearest point(s) on a previous stroke as
+ * reference point instead or as offset, for easier stroke matching
+ * - investigate projection onto geometry (ala retopo)
+ */
+
/* method taken from editview.c - mouse_cursor() */
project_short_noclip(fp, mval);
window_to_3d(dvec, mval[0]-mx, mval[1]-my);
@@ -1245,44 +1218,20 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
}
/* 2d - on image 'canvas' (assume that p->v2d is set) */
- else if ( (gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) && (p->v2d) )
- {
- /* for now - space specific */
- switch (p->sa->spacetype) {
- case SPACE_SEQ: /* sequencer */
- {
- SpaceSeq *sseq= (SpaceSeq *)p->sa->spacedata.first;
- int sizex, sizey, offsx, offsy, rectx, recty;
- float zoom, zoomx, zoomy;
-
- /* calculate zoom factor */
- zoom= SEQ_ZOOM_FAC(sseq->zoom);
- if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
- zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp);
- zoomy = zoom;
- }
- else
- zoomx = zoomy = zoom;
-
- /* calculate rect size */
- rectx= (G.scene->r.size*G.scene->r.xsch)/100;
- recty= (G.scene->r.size*G.scene->r.ysch)/100;
- sizex= zoomx * rectx;
- sizey= zoomy * recty;
- offsx= (p->sa->winx-sizex)/2 + sseq->xof;
- offsy= (p->sa->winy-sizey)/2 + sseq->yof;
-
- /* calculate new points */
- out[0]= (float)(mval[0] - offsx) / (float)sizex;
- out[1]= (float)(mval[1] - offsy) / (float)sizey;
- }
- break;
-
- default: /* just use raw mouse coordinates - BAD! */
- out[0]= mval[0];
- out[1]= mval[1];
- break;
- }
+ else if (gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) {
+ int sizex, sizey, offsx, offsy;
+
+ /* get stored settings
+ * - assume that these have been set already (there are checks that set sane 'defaults' just in case)
+ */
+ sizex= p->im2d_settings.sizex;
+ sizey= p->im2d_settings.sizey;
+ offsx= p->im2d_settings.offsx;
+ offsy= p->im2d_settings.offsy;
+
+ /* calculate new points */
+ out[0]= (float)(mval[0] - offsx) / (float)sizex;
+ out[1]= (float)(mval[1] - offsy) / (float)sizey;
}
/* 2d - relative to screen (viewport area) */
@@ -1320,6 +1269,105 @@ static short gp_stroke_addpoint (tGPsdata *p, short mval[2], float pressure)
return GP_STROKEADD_NORMAL;
}
+/* smooth a stroke (in buffer) before storing it */
+static void gp_stroke_smooth (tGPsdata *p)
+{
+ bGPdata *gpd= p->gpd;
+ int i=0, cmx=gpd->sbuffer_size;
+
+ /* only smooth if smoothing is enabled, and we're not doing a straight line */
+ if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || GP_BUFFER2STROKE_ENDPOINTS)
+ return;
+
+ /* don't try if less than 2 points in buffer */
+ if ((cmx <= 2) || (gpd->sbuffer == NULL))
+ return;
+
+ /* apply weighting-average (note doing this along path sequentially does introduce slight error) */
+ for (i=0; i < gpd->sbuffer_size; i++) {
+ tGPspoint *pc= (((tGPspoint *)gpd->sbuffer) + i);
+ tGPspoint *pb= (i-1 > 0)?(pc-1):(pc);
+ tGPspoint *pa= (i-2 > 0)?(pc-2):(pb);
+ tGPspoint *pd= (i+1 < cmx)?(pc+1):(pc);
+ tGPspoint *pe= (i+2 < cmx)?(pc+2):(pd);
+
+ pc->x= (short)(0.1*pa->x + 0.2*pb->x + 0.4*pc->x + 0.2*pd->x + 0.1*pe->x);
+ pc->y= (short)(0.1*pa->y + 0.2*pb->y + 0.4*pc->y + 0.2*pd->y + 0.1*pe->y);
+ }
+}
+
+/* simplify a stroke (in buffer) before storing it
+ * - applies a reverse Chaikin filter
+ * - code adapted from etch-a-ton branch (editarmature_sketch.c)
+ */
+static void gp_stroke_simplify (tGPsdata *p)
+{
+ bGPdata *gpd= p->gpd;
+ tGPspoint *old_points= (tGPspoint *)gpd->sbuffer;
+ short num_points= gpd->sbuffer_size;
+ short flag= gpd->sbuffer_sflag;
+ short i, j;
+
+ /* only simplify if simlification is enabled, and we're not doing a straight line */
+ if (!(U.gp_settings & GP_PAINT_DOSIMPLIFY) || GP_BUFFER2STROKE_ENDPOINTS)
+ return;
+
+ /* don't simplify if less than 4 points in buffer */
+ if ((num_points <= 2) || (old_points == NULL))
+ return;
+
+ /* clear buffer (but don't free mem yet) so that we can write to it
+ * - firstly set sbuffer to NULL, so a new one is allocated
+ * - secondly, reset flag after, as it gets cleared auto
+ */
+ gpd->sbuffer= NULL;
+ gp_session_validatebuffer(p);
+ gpd->sbuffer_sflag = flag;
+
+/* macro used in loop to get position of new point
+ * - used due to the mixture of datatypes in use here
+ */
+#define GP_SIMPLIFY_AVPOINT(offs, sfac) \
+ { \
+ co[0] += (float)(old_points[offs].x * sfac); \
+ co[1] += (float)(old_points[offs].y * sfac); \
+ pressure += old_points[offs].pressure * sfac; \
+ }
+
+ for (i = 0, j = 0; i < num_points; i++)
+ {
+ if (i - j == 3)
+ {
+ float co[2], pressure;
+ short mco[2];
+
+ /* initialise values */
+ co[0]= 0;
+ co[1]= 0;
+ pressure = 0;
+
+ /* using macro, calculate new point */
+ GP_SIMPLIFY_AVPOINT(j, -0.25f);
+ GP_SIMPLIFY_AVPOINT(j+1, 0.75f);
+ GP_SIMPLIFY_AVPOINT(j+2, 0.75f);
+ GP_SIMPLIFY_AVPOINT(j+3, -0.25f);
+
+ /* set values for adding */
+ mco[0]= (short)co[0];
+ mco[1]= (short)co[1];
+
+ /* ignore return values on this... assume to be ok for now */
+ gp_stroke_addpoint(p, mco, pressure);
+
+ j += 2;
+ }
+ }
+
+ /* free old buffer */
+ MEM_freeN(old_points);
+}
+
+
/* make a new stroke from the buffer data */
static void gp_stroke_newfrombuffer (tGPsdata *p)
{
@@ -1328,9 +1376,6 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
bGPDspoint *pt;
tGPspoint *ptc;
int i, totelem;
-
- /* macro to test if only converting endpoints */
- #define GP_BUFFER2STROKE_ENDPOINTS ((gpd->flag & GP_DATA_EDITPAINT) && (G.qual & LR_CTRLKEY))
/* get total number of points to allocate space for:
* - in 'Draw Mode', holding the Ctrl-Modifier will only take endpoints
@@ -1401,9 +1446,6 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
/* add stroke to frame */
BLI_addtail(&p->gpf->strokes, gps);
-
- /* undefine macro to test if only converting endpoints */
- #undef GP_BUFFER2STROKE_ENDPOINTS
}
/* --- 'Eraser' for 'Paint' Tool ------ */
@@ -1514,13 +1556,21 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[],
y0= xyval[1];
}
else if (gps->flag & GP_STROKE_2DIMAGE) {
- ipoco_to_areaco_noclip(p->v2d, &gps->points->x, xyval);
- x0= xyval[0];
- y0= xyval[1];
+ int offsx, offsy, sizex, sizey;
+
+ /* get stored settings */
+ sizex= p->im2d_settings.sizex;
+ sizey= p->im2d_settings.sizey;
+ offsx= p->im2d_settings.offsx;
+ offsy= p->im2d_settings.offsy;
+
+ /* calculate new points */
+ x0= (short)((gps->points->x * sizex) + offsx);
+ y0= (short)((gps->points->y * sizey) + offsy);
}
else {
- x0= (gps->points->x / 1000 * p->sa->winx);
- y0= (gps->points->y / 1000 * p->sa->winy);
+ x0= (short)(gps->points->x / 1000 * p->sa->winx);
+ y0= (short)(gps->points->y / 1000 * p->sa->winy);
}
/* do boundbox check first */
@@ -1562,19 +1612,26 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[],
y1= xyval[1];
}
else if (gps->flag & GP_STROKE_2DIMAGE) {
- ipoco_to_areaco_noclip(p->v2d, &pt1->x, xyval);
- x0= xyval[0];
- y0= xyval[1];
+ int offsx, offsy, sizex, sizey;
- ipoco_to_areaco_noclip(p->v2d, &pt2->x, xyval);
- x1= xyval[0];
- y1= xyval[1];
+ /* get stored settings */
+ sizex= p->im2d_settings.sizex;
+ sizey= p->im2d_settings.sizey;
+ offsx= p->im2d_settings.offsx;
+ offsy= p->im2d_settings.offsy;
+
+ /* calculate new points */
+ x0= (short)((pt1->x * sizex) + offsx);
+ y0= (short)((pt1->y * sizey) + offsy);
+
+ x1= (short)((pt2->x * sizex) + offsx);
+ y1= (short)((pt2->y * sizey) + offsy);
}
else {
- x0= (pt1->x / 1000 * p->sa->winx);
- y0= (pt1->y / 1000 * p->sa->winy);
- x1= (pt2->x / 1000 * p->sa->winx);
- y1= (pt2->y / 1000 * p->sa->winy);
+ x0= (short)(pt1->x / 1000 * p->sa->winx);
+ y0= (short)(pt1->y / 1000 * p->sa->winy);
+ x1= (short)(pt2->x / 1000 * p->sa->winx);
+ y1= (short)(pt2->y / 1000 * p->sa->winy);
}
/* check that point segment of the boundbox of the eraser stroke */
@@ -1615,6 +1672,157 @@ static void gp_stroke_doeraser (tGPsdata *p)
/* ---------- 'Paint' Tool ------------ */
+/* init new painting session */
+static void gp_session_initpaint (tGPsdata *p)
+{
+ /* clear previous data (note: is on stack) */
+ memset(p, 0, sizeof(tGPsdata));
+
+ /* make sure the active view (at the starting time) is a 3d-view */
+ if (curarea == NULL) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: No active view for painting \n");
+ return;
+ }
+ switch (curarea->spacetype) {
+ /* supported views first */
+ case SPACE_VIEW3D:
+ {
+ View3D *v3d= curarea->spacedata.first;
+
+ /* set current area */
+ p->sa= curarea;
+
+ /* check that gpencil data is allowed to be drawn */
+ if ((v3d->flag2 & V3D_DISPGP)==0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view, Grease Pencil not shown \n");
+ return;
+ }
+ }
+ break;
+ case SPACE_NODE:
+ {
+ SpaceNode *snode= curarea->spacedata.first;
+
+ /* set current area */
+ p->sa= curarea;
+ p->v2d= &snode->v2d;
+
+ /* check that gpencil data is allowed to be drawn */
+ if ((snode->flag & SNODE_DISPGP)==0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view, Grease Pencil not shown \n");
+ return;
+ }
+ }
+ break;
+ case SPACE_SEQ:
+ {
+ SpaceSeq *sseq= curarea->spacedata.first;
+
+ /* set current area */
+ p->sa= curarea;
+ p->v2d= &sseq->v2d;
+
+ /* check that gpencil data is allowed to be drawn */
+ if (sseq->mainb == 0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view (sequencer), active mode doesn't support Grease Pencil \n");
+ return;
+ }
+ if ((sseq->flag & SEQ_DRAW_GPENCIL)==0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view, Grease Pencil not shown \n");
+ return;
+ }
+ }
+ break;
+ case SPACE_IMAGE:
+ {
+ SpaceImage *sima= curarea->spacedata.first;
+
+ /* set the current area */
+ p->sa= curarea;
+ p->v2d= &sima->v2d;
+ p->ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser);
+
+ /* check that gpencil data is allowed to be drawn */
+ if ((sima->flag & SI_DISPGP)==0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view, Grease Pencil not shown \n");
+ return;
+ }
+ }
+ break;
+ /* unsupported views */
+ default:
+ {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: Active view not appropriate for Grease Pencil drawing \n");
+ return;
+ }
+ break;
+ }
+
+ /* get gp-data */
+ p->gpd= gpencil_data_getactive(p->sa);
+ if (p->gpd == NULL) {
+ short ok;
+
+ p->gpd= gpencil_data_addnew();
+ ok= gpencil_data_setactive(p->sa, p->gpd);
+
+ /* most of the time, the following check isn't needed */
+ if (ok == 0) {
+ /* free gpencil data as it can't be used */
+ free_gpencil_data(p->gpd);
+ p->gpd= NULL;
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: Could not assign newly created Grease Pencil data to active area \n");
+ return;
+ }
+ }
+
+ /* set edit flags */
+ G.f |= G_GREASEPENCIL;
+
+ /* clear out buffer (stored in gp-data) in case something contaminated it */
+ gp_session_validatebuffer(p);
+
+ /* set 'default' im2d_settings just in case something that uses this doesn't set it */
+ p->im2d_settings.sizex= 1;
+ p->im2d_settings.sizey= 1;
+}
+
+/* cleanup after a painting session */
+static void gp_session_cleanup (tGPsdata *p)
+{
+ bGPdata *gpd= p->gpd;
+
+ /* error checking */
+ if (gpd == NULL)
+ return;
+
+ /* free stroke buffer */
+ if (gpd->sbuffer) {
+ MEM_freeN(gpd->sbuffer);
+ gpd->sbuffer= NULL;
+ }
+
+ /* clear flags */
+ gpd->sbuffer_size= 0;
+ gpd->sbuffer_sflag= 0;
+}
+
/* init new stroke */
static void gp_paint_initstroke (tGPsdata *p, short paintmode)
{
@@ -1663,8 +1871,35 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode)
break;
case SPACE_SEQ:
{
- /* for now, this is not applicable here... */
+ SpaceSeq *sseq= (SpaceSeq *)p->sa->spacedata.first;
+ int rectx, recty;
+ float zoom, zoomx, zoomy;
+
+ /* set draw 2d-stroke flag */
p->gpd->sbuffer_sflag |= GP_STROKE_2DIMAGE;
+
+ /* calculate zoom factor */
+ zoom= (float)(SEQ_ZOOM_FAC(sseq->zoom));
+ if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
+ zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp);
+ zoomy = zoom;
+ }
+ else
+ zoomx = zoomy = zoom;
+
+ /* calculate rect size to use to calculate the size of the drawing area
+ * - We use the size of the output image not the size of the ibuf being shown
+ * as it is too messy getting the ibuf (and could be too slow). This should be
+ * a reasonable for most cases anyway.
+ */
+ rectx= (G.scene->r.size * G.scene->r.xsch) / 100;
+ recty= (G.scene->r.size * G.scene->r.ysch) / 100;
+
+ /* set offset and scale values for opertations to use */
+ p->im2d_settings.sizex= (int)(zoomx * rectx);
+ p->im2d_settings.sizey= (int)(zoomy * recty);
+ p->im2d_settings.offsx= (int)((p->sa->winx-p->im2d_settings.sizex)/2 + sseq->xof);
+ p->im2d_settings.offsy= (int)((p->sa->winy-p->im2d_settings.sizey)/2 + sseq->yof);
}
break;
case SPACE_IMAGE:
@@ -1683,6 +1918,12 @@ static void gp_paint_strokeend (tGPsdata *p)
{
/* check if doing eraser or not */
if ((p->gpd->sbuffer_sflag & GP_STROKE_ERASER) == 0) {
+ /* smooth stroke before transferring? */
+ gp_stroke_smooth(p);
+
+ /* simplify stroke before transferring? */
+ gp_stroke_simplify(p);
+
/* transfer stroke to frame */
gp_stroke_newfrombuffer(p);
}
@@ -1716,7 +1957,6 @@ static void gp_paint_cleanup (tGPsdata *p)
short gpencil_paint (short mousebutton, short paintmode)
{
tGPsdata p;
- float opressure, pressure;
short ok = GP_STROKEADD_NORMAL;
/* init paint-data */
@@ -1736,14 +1976,15 @@ short gpencil_paint (short mousebutton, short paintmode)
/* init drawing-device settings */
getmouseco_areawin(p.mval);
- pressure = get_pressure();
+ p.pressure = get_pressure();
p.mvalo[0]= p.mval[0];
p.mvalo[1]= p.mval[1];
- opressure= pressure;
+ p.opressure= p.pressure;
- /* radius for eraser circle is thickness^2 */
- p.radius= p.gpl->thickness * p.gpl->thickness;
+ /* radius for eraser circle is defined in userprefs now */
+ // TODO: make this more easily tweaked...
+ p.radius= U.gp_eraser;
/* start drawing eraser-circle (if applicable) */
if (paintmode == GP_PAINTMODE_ERASER)
@@ -1755,8 +1996,8 @@ short gpencil_paint (short mousebutton, short paintmode)
* - not erasing
*/
if (paintmode != GP_PAINTMODE_ERASER) {
- if (!(pressure >= 0.99f) || (p.gpd->flag & GP_DATA_EDITPAINT)) {
- gp_stroke_addpoint(&p, p.mval, pressure);
+ if (!(p.pressure >= 0.99f) || (p.gpd->flag & GP_DATA_EDITPAINT)) {
+ gp_stroke_addpoint(&p, p.mval, p.pressure);
}
}
@@ -1764,7 +2005,7 @@ short gpencil_paint (short mousebutton, short paintmode)
do {
/* get current user input */
getmouseco_areawin(p.mval);
- pressure = get_pressure();
+ p.pressure = get_pressure();
/* only add current point to buffer if mouse moved (otherwise wait until it does) */
if (paintmode == GP_PAINTMODE_ERASER) {
@@ -1776,10 +2017,11 @@ short gpencil_paint (short mousebutton, short paintmode)
p.mvalo[0]= p.mval[0];
p.mvalo[1]= p.mval[1];
+ p.opressure= p.pressure;
}
else if (gp_stroke_filtermval(&p, p.mval, p.mvalo)) {
/* try to add point */
- ok= gp_stroke_addpoint(&p, p.mval, pressure);
+ ok= gp_stroke_addpoint(&p, p.mval, p.pressure);
/* handle errors while adding point */
if ((ok == GP_STROKEADD_FULL) || (ok == GP_STROKEADD_OVERFLOW)) {
@@ -1787,8 +2029,8 @@ short gpencil_paint (short mousebutton, short paintmode)
gp_paint_strokeend(&p);
/* start a new stroke, starting from previous point */
- gp_stroke_addpoint(&p, p.mvalo, opressure);
- ok= gp_stroke_addpoint(&p, p.mval, pressure);
+ gp_stroke_addpoint(&p, p.mvalo, p.opressure);
+ ok= gp_stroke_addpoint(&p, p.mval, p.pressure);
}
else if (ok == GP_STROKEADD_INVALID) {
/* the painting operation cannot continue... */
@@ -1803,7 +2045,7 @@ short gpencil_paint (short mousebutton, short paintmode)
p.mvalo[0]= p.mval[0];
p.mvalo[1]= p.mval[1];
- opressure= pressure;
+ p.opressure= p.pressure;
}
else
BIF_wait_for_statechange();
@@ -1821,7 +2063,7 @@ short gpencil_paint (short mousebutton, short paintmode)
/* check size of buffer before cleanup, to determine if anything happened here */
if (paintmode == GP_PAINTMODE_ERASER) {
- ok= 1; // fixme
+ ok= 1; /* assume that we did something... */
draw_sel_circle(NULL, p.mvalo, 0, p.radius, 0);
}
else
diff --git a/source/blender/src/hddaudio.c b/source/blender/src/hddaudio.c
index 506a9b1b8aa..7e6b314f296 100644
--- a/source/blender/src/hddaudio.c
+++ b/source/blender/src/hddaudio.c
@@ -150,6 +150,15 @@ struct hdaudio * sound_open_hdaudio(char * filename)
return 0;
}
+ if (pCodecCtx->channels > 2) {
+ fprintf(stderr, "Sorry, audio file has too many channels."
+ " Will fix in future, but resampler doesn't support "
+ "this.\n");
+ avcodec_close(pCodecCtx);
+ av_close_input_file(pFormatCtx);
+ return 0;
+ }
+
rval = (struct hdaudio *)MEM_mallocN(sizeof(struct hdaudio),
"hdaudio struct");
diff --git a/source/blender/src/header_action.c b/source/blender/src/header_action.c
index 4bb7bb9677e..0cd5fcba271 100644
--- a/source/blender/src/header_action.c
+++ b/source/blender/src/header_action.c
@@ -285,10 +285,16 @@ void do_action_buttons(unsigned short event)
/* copy/paste buttons in Action Editor header */
case B_ACTCOPYKEYS:
- copy_actdata();
+ if (G.saction->mode == SACTCONT_GPENCIL)
+ copy_gpdata();
+ else
+ copy_actdata();
break;
case B_ACTPASTEKEYS:
- paste_actdata();
+ if (G.saction->mode == SACTCONT_GPENCIL)
+ paste_gpdata();
+ else
+ paste_actdata();
break;
case B_ACTPIN: /* __PINFAKE */
@@ -1568,7 +1574,7 @@ static uiBlock *action_markermenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_ADD, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_DUPLICATE, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|X", 0, yco-=20,
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|Shift X", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_DELETE, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -1735,20 +1741,24 @@ void action_buttons(void)
uiClearButLock();
xco += 8;
-
- /* COPY PASTE */
- uiBlockBeginAlign(block);
- if (curarea->headertype==HEADERTOP) {
- uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYUP, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
- uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
- }
- else {
- uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYDOWN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
- uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
- }
- uiBlockEndAlign(block);
- xco += (XIC + 8);
-
+ }
+
+
+ /* COPY PASTE */
+ uiBlockBeginAlign(block);
+ if (curarea->headertype==HEADERTOP) {
+ uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYUP, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
+ uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
+ }
+ else {
+ uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYDOWN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
+ uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
+ }
+ uiBlockEndAlign(block);
+ xco += (XIC + 8);
+
+
+ if (G.saction->mode != SACTCONT_GPENCIL) {
/* draw AUTOSNAP */
if (G.saction->flag & SACTION_DRAWTIME) {
uiDefButC(block, MENU, B_REDR,
diff --git a/source/blender/src/header_image.c b/source/blender/src/header_image.c
index 4ca287d81c5..cf8f3c5c99d 100644
--- a/source/blender/src/header_image.c
+++ b/source/blender/src/header_image.c
@@ -82,8 +82,10 @@
#include "BSE_trans_types.h"
#include "BSE_edit.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
#include "IMB_imbuf_types.h"
@@ -658,8 +660,9 @@ static uiBlock *image_image_rtmappingmenu(void *arg_unused)
static void do_image_imagemenu(void *arg, int event)
{
/* events >=20 are registered bpython scripts */
+#ifndef DISABLE_PYTHON
if (event >= 20) BPY_menu_do_python(PYMENU_IMAGE, event - 20);
-
+#endif
switch(event)
{
case 0:
@@ -704,7 +707,9 @@ static uiBlock *image_imagemenu(void *arg_unused)
ImBuf *ibuf= BKE_image_get_ibuf(G.sima->image, &G.sima->iuser);
uiBlock *block;
short yco= 0, menuwidth=150;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i = 0;
block= uiNewBlock(&curarea->uiblocks, "image_imagemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
@@ -749,7 +754,7 @@ static uiBlock *image_imagemenu(void *arg_unused)
uiDefIconTextBlockBut(block, image_image_rtmappingmenu, NULL, ICON_RIGHTARROW_THIN, "Realtime Texture Mapping", 0, yco-=20, 120, 19, "");
// uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Realtime Texture Animation|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
}
-
+#ifndef DISABLE_PYTHON
/* note that we acount for the N previous entries with i+20: */
for (pym = BPyMenuTable[PYMENU_IMAGE]; pym; pym = pym->next, i++) {
@@ -757,7 +762,7 @@ static uiBlock *image_imagemenu(void *arg_unused)
NULL, 0.0, 0.0, 1, i+20,
pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
@@ -948,6 +953,7 @@ static uiBlock *image_uvs_weldalignmenu(void *arg_unused)
return block;
}
+#ifndef DISABLE_PYTHON
static void do_image_uvs_scriptsmenu(void *arg, int event)
{
BPY_menu_do_python(PYMENU_UV, event);
@@ -978,6 +984,7 @@ static uiBlock *image_uvs_scriptsmenu (void *args_unused)
return block;
}
+#endif /* DISABLE_PYTHON */
static void do_image_uvsmenu(void *arg, int event)
{
@@ -1088,10 +1095,12 @@ static uiBlock *image_uvsmenu(void *arg_unused)
uiDefIconTextBlockBut(block, image_uvs_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Faces", 0, yco-=20, menuwidth, 19, "");
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, image_uvs_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
-
+#endif
+
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c
index 9bacc2b6351..b6bd00d2ad6 100644
--- a/source/blender/src/header_info.c
+++ b/source/blender/src/header_info.c
@@ -115,8 +115,10 @@
#include "MEM_guardedalloc.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
#include "GPU_extensions.h"
#include "GPU_material.h"
@@ -332,8 +334,9 @@ Scene *copy_scene(Scene *sce, int level)
obase= obase->next;
base= base->next;
}
+#ifndef DISABLE_PYTHON
BPY_copy_scriptlink(&sce->scriptlink);
-
+#endif
/* sculpt data */
sce->sculptdata.session = NULL;
if (sce->sculptdata.cumap) {
@@ -650,12 +653,14 @@ static void do_info_file_importmenu(void *arg, int event)
areawinset(sa->win);
}
+#ifndef DISABLE_PYTHON
/* events >=3 are registered bpython scripts */
if (event >= 3) {
BPY_menu_do_python(PYMENU_IMPORT, event - 3);
BIF_undo_push("Import file");
- }
- else {
+ } else
+#endif
+ {
switch(event) {
case 0: /* DXF */
@@ -677,7 +682,9 @@ static uiBlock *info_file_importmenu(void *arg_unused)
{
uiBlock *block;
short yco = 20, menuwidth = 120;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i = 0;
block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
@@ -690,13 +697,13 @@ static uiBlock *info_file_importmenu(void *arg_unused)
0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
-
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
for (pym = BPyMenuTable[PYMENU_IMPORT]; pym; pym = pym->next, i++) {
uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+3, pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
@@ -712,11 +719,12 @@ static void do_info_file_exportmenu(void *arg, int event)
if (!sa) sa= closest_bigger_area();
areawinset(sa->win);
}
-
+#ifndef DISABLE_PYTHON
/* events >=3 are registered bpython scripts */
if (event >= 3) BPY_menu_do_python(PYMENU_EXPORT, event - 3);
-
- else switch(event) {
+ else
+#endif
+ switch(event) {
case 0:
write_vrml_fs();
@@ -735,7 +743,9 @@ static uiBlock *info_file_exportmenu(void *arg_unused)
{
uiBlock *block;
short yco = 20, menuwidth = 120;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i = 0;
block= uiNewBlock(&curarea->uiblocks, "exportmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
@@ -749,6 +759,7 @@ static uiBlock *info_file_exportmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
/* note that we acount for the 3 previous entries with i+3: */
@@ -757,7 +768,7 @@ static uiBlock *info_file_exportmenu(void *arg_unused)
NULL, 0.0, 0.0, 1, i+3,
pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
@@ -1020,7 +1031,7 @@ static void do_info_externalfiles(void *arg, int event)
pupmenu("Can't set relative paths with an unsaved blend file");
}
break;
- case 11: /* make all paths relative */
+ case 11: /* make all paths absolute */
{
int tot,changed,failed,linked;
char str[512];
@@ -1160,9 +1171,12 @@ static uiBlock *info_filemenu(void *arg_unused)
void do_info_add_meshmenu(void *arg, int event)
{
+#ifndef DISABLE_PYTHON
if (event>=20) {
BPY_menu_do_python(PYMENU_ADDMESH, event - 20);
- } else {
+ } else
+#endif
+ {
switch(event) {
case 0:
/* Plane */
@@ -1214,7 +1228,9 @@ static uiBlock *info_add_meshmenu(void *arg_unused)
short yco= 0;
/* Python Menu */
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i=0;
block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
@@ -1231,7 +1247,7 @@ static uiBlock *info_add_meshmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grid|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Monkey|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "");
-
+#ifndef DISABLE_PYTHON
pym = BPyMenuTable[PYMENU_ADDMESH];
if (pym) {
uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -1240,7 +1256,8 @@ static uiBlock *info_add_meshmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, i+20, pym->tooltip?pym->tooltip:pym->filename);
}
}
-
+#endif
+
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 50);
@@ -1496,9 +1513,12 @@ static uiBlock *info_add_groupmenu(void *arg_unused)
void do_info_addmenu(void *arg, int event)
{
+#ifndef DISABLE_PYTHON
if (event>=20) {
BPY_menu_do_python(PYMENU_ADD, event - 20);
- } else {
+ } else
+#endif
+ {
switch(event) {
case 0:
/* Mesh */
@@ -1547,7 +1567,9 @@ static uiBlock *info_addmenu(void *arg_unused)
{
/* static short tog=0; */
uiBlock *block;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i=0;
short yco= 0;
@@ -1575,6 +1597,7 @@ static uiBlock *info_addmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "");
+#ifndef DISABLE_PYTHON
pym = BPyMenuTable[PYMENU_ADD];
if (pym) {
uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 1620, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -1583,7 +1606,8 @@ static uiBlock *info_addmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, i+20, pym->tooltip?pym->tooltip:pym->filename);
}
}
-
+#endif
+
uiBlockSetDirection(block, UI_DOWN);
uiTextBoundsBlock(block, 80);
@@ -1948,9 +1972,10 @@ static void do_info_rendermenu(void *arg, int event)
if (!sa) sa= closest_bigger_area();
areawinset(sa->win);
}
-
+#ifndef DISABLE_PYTHON
BPY_menu_do_python(PYMENU_RENDER, event - 10);
BIF_undo_push("Rendering Script");
+#endif
}
else {
switch(event) {
@@ -1998,7 +2023,9 @@ static void do_info_rendermenu(void *arg, int event)
static uiBlock *info_rendermenu(void *arg_unused)
{
uiBlock *block;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
short yco= 0;
short menuwidth=120;
int i=0;
@@ -2026,12 +2053,14 @@ static uiBlock *info_rendermenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Settings|F10", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
for (pym = BPyMenuTable[PYMENU_RENDER]; pym; pym = pym->next, i++) {
uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
+
uiBlockSetDirection(block, UI_DOWN);
uiTextBoundsBlock(block, 80);
@@ -2042,8 +2071,9 @@ static uiBlock *info_rendermenu(void *arg_unused)
static void do_info_help_websitesmenu(void *arg, int event)
{
+#ifndef DISABLE_PYTHON
BPY_menu_do_python(PYMENU_HELPWEBSITES, event);
-
+#endif
allqueue(REDRAWVIEW3D, 0);
}
@@ -2051,17 +2081,19 @@ static void do_info_help_websitesmenu(void *arg, int event)
static uiBlock *info_help_websitesmenu(void *arg_unused)
{
uiBlock *block;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
short yco = 20, menuwidth = 120;
int i = 0;
block= uiNewBlock(&curarea->uiblocks, "info_help_websitesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_info_help_websitesmenu, NULL);
-
+#ifndef DISABLE_PYTHON
for (pym = BPyMenuTable[PYMENU_HELPWEBSITES]; pym; pym = pym->next, i++) {
uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
@@ -2071,8 +2103,11 @@ static uiBlock *info_help_websitesmenu(void *arg_unused)
static void do_info_help_systemmenu(void *arg, int event)
{
/* events >=10 are registered bpython scripts */
+#ifndef DISABLE_PYTHON
if (event >= 10) BPY_menu_do_python(PYMENU_HELPSYSTEM, event - 10);
- else {
+ else
+#endif
+ {
switch(event) {
case 1: /* Benchmark */
@@ -2102,7 +2137,9 @@ static void do_info_help_systemmenu(void *arg, int event)
static uiBlock *info_help_systemmenu(void *arg_unused)
{
uiBlock *block;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
short yco = 20, menuwidth = 120;
int i = 0;
@@ -2110,11 +2147,11 @@ static uiBlock *info_help_systemmenu(void *arg_unused)
uiBlockSetButmFunc(block, do_info_help_systemmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Benchmark", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
+#ifndef DISABLE_PYTHON
for (pym = BPyMenuTable[PYMENU_HELPSYSTEM]; pym; pym = pym->next, i++) {
uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
@@ -2132,8 +2169,11 @@ static void do_info_helpmenu(void *arg, int event)
}
/* events >=10 are registered bpython scripts */
+#ifndef DISABLE_PYTHON
if (event >= 10) BPY_menu_do_python(PYMENU_HELP, event - 10);
- else {
+ else
+#endif
+ {
switch(event) {
case 0: /* About Blender */
@@ -2150,20 +2190,22 @@ static uiBlock *info_helpmenu(void *arg_unused)
uiBlock *block;
short yco= 0;
short menuwidth=120;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i = 0;
block= uiNewBlock(&curarea->uiblocks, "info_helpmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_info_helpmenu, NULL);
uiDefIconTextBut(block, BUTM, B_SHOWSPLASH, ICON_BLANK1, "About Blender...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
for (pym = BPyMenuTable[PYMENU_HELP]; pym; pym = pym->next, i++) {
uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, info_help_websitesmenu, NULL, ICON_RIGHTARROW_THIN, "Websites", 0, yco-=20, 120, 19, "");
diff --git a/source/blender/src/header_ipo.c b/source/blender/src/header_ipo.c
index c2f84e1c444..27549a5b502 100644
--- a/source/blender/src/header_ipo.c
+++ b/source/blender/src/header_ipo.c
@@ -923,7 +923,7 @@ static uiBlock *ipo_markermenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|X", 0, yco-=20,
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|Shift X", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
diff --git a/source/blender/src/header_nla.c b/source/blender/src/header_nla.c
index 13bbf0a3999..d0031b2db7c 100644
--- a/source/blender/src/header_nla.c
+++ b/source/blender/src/header_nla.c
@@ -441,7 +441,7 @@ static uiBlock *nla_markermenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|X", 0, yco-=20,
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|Shift X", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
diff --git a/source/blender/src/header_oops.c b/source/blender/src/header_oops.c
index 68326c330ad..b839029c139 100644
--- a/source/blender/src/header_oops.c
+++ b/source/blender/src/header_oops.c
@@ -63,8 +63,10 @@
#include "BKE_depsgraph.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
static int viewmovetemp = 0;
diff --git a/source/blender/src/header_script.c b/source/blender/src/header_script.c
index 53c4b9b5953..2bf58fb2873 100644
--- a/source/blender/src/header_script.c
+++ b/source/blender/src/header_script.c
@@ -57,8 +57,10 @@
#include "BKE_sca.h"
#include "BSE_filesel.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
#include "blendef.h"
#include "mydevice.h"
@@ -68,6 +70,7 @@
/* ********************** SCRIPT ****************************** */
/* action executed after clicking in Scripts menu */
+#ifndef DISABLE_PYTHON
static void do_scripts_submenus(void *int_arg, int event)
{
int menutype = (intptr_t)int_arg;
@@ -152,6 +155,7 @@ static uiBlock *script_scriptsmenu(void *arg_unused)
uiTextBoundsBlock(block, 50);
return block;
}
+#endif /* DISABLE_PYTHON */
void do_script_buttons(unsigned short event)
{
@@ -160,6 +164,7 @@ void do_script_buttons(unsigned short event)
int nr= 1;
Script *script = sc->script;
+#ifndef DISABLE_PYTHON
if (!sc) return;
if (sc->spacetype != SPACE_SCRIPT) return;
@@ -200,7 +205,7 @@ void do_script_buttons(unsigned short event)
}
break;
}
-
+#endif
return;
}
@@ -240,6 +245,7 @@ void script_buttons(void)
uiBlockSetEmboss(block, UI_EMBOSS);
xco+=XIC;
+#ifndef DISABLE_PYTHON
/* pull down menus */
if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
uiBlockSetEmboss(block, UI_EMBOSSP);
@@ -248,7 +254,7 @@ void script_buttons(void)
uiDefPulldownBut(block,script_scriptsmenu, NULL, "Scripts", xco, 0, xmax, 20, "");
xco+=xmax;
}
-
+#endif
uiBlockSetEmboss(block, UI_EMBOSS);
uiBlockBeginAlign(block);
diff --git a/source/blender/src/header_seq.c b/source/blender/src/header_seq.c
index e5a63b9fe45..8138918877f 100644
--- a/source/blender/src/header_seq.c
+++ b/source/blender/src/header_seq.c
@@ -600,7 +600,7 @@ static uiBlock *seq_markermenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker", 0, yco-=20,
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|Shift X", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
diff --git a/source/blender/src/header_text.c b/source/blender/src/header_text.c
index 9bb59a81192..9268642db2f 100644
--- a/source/blender/src/header_text.c
+++ b/source/blender/src/header_text.c
@@ -84,8 +84,10 @@
#include "BLI_blenlib.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
#include "blendef.h"
#include "mydevice.h"
@@ -166,11 +168,12 @@ void do_text_buttons(unsigned short event)
st->text = st->text->id.next;
pop_space_text(st);
}
-
+
+#ifndef DISABLE_PYTHON
BPY_clear_bad_scriptlinks(text);
BPY_free_pyconstraint_links(text);
free_text_controllers(text);
-
+#endif
unlink_text(text);
free_libblock(&G.main->text, text);
@@ -231,7 +234,7 @@ void do_text_buttons(unsigned short event)
break;
}
}
-
+#ifndef DISABLE_PYTHON
static void do_text_template_scriptsmenu(void *arg, int event)
{
BPY_menu_do_python(PYMENU_SCRIPTTEMPLATE, event);
@@ -293,6 +296,7 @@ static uiBlock *text_plugin_scriptsmenu (void *args_unused)
return block;
}
+#endif
/* action executed after clicking in File menu */
static void do_text_filemenu(void *arg, int event)
@@ -316,8 +320,10 @@ static void do_text_filemenu(void *arg, int event)
activate_fileselect(FILE_SPECIAL, "Open Text File", G.sce, add_text_fs);
break;
case 3:
+#ifndef DISABLE_PYTHON
if (text->compiled) BPY_free_compiled_text(text);
text->compiled = NULL;
+#endif
if (okee("Reopen Text")) {
if (!reopen_text(text)) {
error("Could not reopen file");
@@ -339,6 +345,7 @@ static void do_text_filemenu(void *arg, int event)
run_python_script(st);
break;
case 8:
+#ifndef DISABLE_PYTHON
{
Object *ob;
bConstraint *con;
@@ -373,6 +380,7 @@ static void do_text_filemenu(void *arg, int event)
}
}
}
+#endif
break;
default:
break;
@@ -820,16 +828,18 @@ static uiBlock *text_filemenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Run Python Script|Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
-
+#ifndef DISABLE_PYTHON
if (BPY_is_pyconstraint(text))
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Refresh All PyConstraints", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
-
+#endif
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
}
-
+
+#ifndef DISABLE_PYTHON
uiDefIconTextBlockBut(block, text_template_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Script Templates", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, text_plugin_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Text Plugins", 0, yco-=20, 120, 19, "");
-
+#endif
+
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
@@ -924,8 +934,10 @@ static short do_modification_check(SpaceText *st_v) {
} else {
switch (pupmenu("File Modified Outside Blender %t|Reload from disk %x0|Make text internal (separate copy) %x1|Ignore %x2")) {
case 0:
+#ifndef DISABLE_PYTHON
if (text->compiled) BPY_free_compiled_text(text);
text->compiled = NULL;
+#endif
reopen_text(text);
if (st->showsyntax) txt_format_text(st);
return 1;
diff --git a/source/blender/src/header_time.c b/source/blender/src/header_time.c
index 5de4d744a0a..574e0b3a9f1 100644
--- a/source/blender/src/header_time.c
+++ b/source/blender/src/header_time.c
@@ -500,7 +500,7 @@ void time_buttons(ScrArea *sa)
&G.scene->r.psfra,MINFRAMEF, MAXFRAMEF, 0, 0,
"The start frame of the animation preview (inclusive)");
- xco += 4.5*XIC;
+ xco += (short)(4.5*XIC);
uiDefButI(block, NUM, REDRAWALL,"End:",
xco,0,4.5*XIC,YIC,
@@ -513,23 +513,23 @@ void time_buttons(ScrArea *sa)
&G.scene->r.sfra,MINFRAMEF, MAXFRAMEF, 0, 0,
"The start frame of the animation (inclusive)");
- xco += 4.5*XIC;
+ xco += (short)(4.5*XIC);
uiDefButI(block, NUM, REDRAWALL,"End:",
xco,0,4.5*XIC,YIC,
- &G.scene->r.efra,SFRA,MAXFRAMEF, 0, 0,
+ &G.scene->r.efra,(float)SFRA,MAXFRAMEF, 0, 0,
"The end frame of the animation (inclusive)");
}
uiBlockEndAlign(block);
- xco += 4.5*XIC+16;
+ xco += (short)(4.5 * XIC + 16);
uiDefButI(block, NUM, B_NEWFRAME, "",
xco,0,3.5*XIC,YIC,
&(G.scene->r.cfra), MINFRAMEF, MAXFRAMEF, 0, 0,
"Displays Current Frame of animation");
- xco += 3.5*XIC+16;
+ xco += (short)(3.5 * XIC + 16);
uiDefIconBut(block, BUT, B_TL_REW, ICON_REW,
xco, 0, XIC, YIC, 0, 0, 0, 0, 0, "Skip to Start frame (Shift DownArrow)");
@@ -559,17 +559,12 @@ void time_buttons(ScrArea *sa)
if (IS_AUTOKEY_ON) {
uiDefButS(block, MENU, REDRAWINFO,
"Auto-Keying Mode %t|Add/Replace Keys%x3|Replace Keys %x5",
- xco, 0, 3*XIC, YIC, &(G.scene->autokey_mode), 0, 1, 0, 0,
+ xco, 0, 3.5*XIC, YIC, &(G.scene->autokey_mode), 0, 1, 0, 0,
"Mode of automatic keyframe insertion for Objects and Bones");
xco+= (4*XIC);
}
xco+= 16;
-
- uiDefIconButBitI(block, TOG, TIME_WITH_SEQ_AUDIO, B_DIFF, ICON_SPEAKER,
- xco, 0, XIC, YIC, &(stime->redraws), 0, 0, 0, 0, "Play back and sync with audio from Sequence Editor");
-
- xco+= XIC+16;
uiDefIconBut(block, BUT, B_TL_INSERTKEY, ICON_KEY_HLT,
xco, 0, XIC, YIC, 0, 0, 0, 0, 0, "Insert Keyframe for the context of the largest area (IKEY)");
@@ -578,6 +573,12 @@ void time_buttons(ScrArea *sa)
xco, 0, XIC, YIC, 0, 0, 0, 0, 0, "Delete Keyframe for the context of the largest area (ALTKEY-IKEY)");
xco+= XIC+4;
+ xco+= 16;
+
+ uiDefIconButBitI(block, TOG, TIME_WITH_SEQ_AUDIO, B_DIFF, ICON_SPEAKER,
+ xco, 0, XIC, YIC, &(stime->redraws), 0, 0, 0, 0, "Play back and sync with audio from Sequence Editor");
+
+
/* always as last */
sa->headbutlen= xco+XIC+80; // +80 because the last button is not an icon
diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c
index 9a2f907fa12..e2caf97df05 100644
--- a/source/blender/src/header_view3d.c
+++ b/source/blender/src/header_view3d.c
@@ -125,8 +125,10 @@
#include "BIF_verse.h"
#endif
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
#include "blendef.h"
#include "multires.h"
@@ -212,6 +214,14 @@ static void do_view3d_view_camerasmenu(void *arg, int event)
persptoetsen(PAD0);
G.qual &= ~LR_CTRLKEY;
} else {
+ /* store settings of current view before allowing overwriting with camera view */
+ /* this is a copy of the code in toets.c */
+ if(G.vd->persp != V3D_CAMOB) {
+ QUATCOPY(G.vd->lviewquat, G.vd->viewquat);
+ G.vd->lview= G.vd->view;
+ G.vd->lpersp= G.vd->persp;
+ }
+
for( base = FIRSTBASE; base; base = base->next ) {
if (base->object->type == OB_CAMERA) {
i++;
@@ -453,6 +463,7 @@ static uiBlock *view3d_view_alignviewmenu(void *arg_unused)
return block;
}
+#ifndef DISABLE_PYTHON
static void do_view3d_view_spacehandlers(void *arg, int event)
{
Text *text = G.main->text.first;
@@ -540,6 +551,7 @@ static uiBlock *view3d_view_spacehandlers(void *arg_unused)
return block;
}
+#endif /* DISABLE_PYTHON */
static void do_view3d_viewmenu(void *arg, int event)
{
@@ -683,8 +695,10 @@ static uiBlock *view3d_viewmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_view_spacehandlers, NULL, ICON_RIGHTARROW_THIN, "Space Handler Scripts", 0, yco-=20, 120, 19, "");
+#endif
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
@@ -1460,8 +1474,10 @@ static uiBlock *view3d_select_pose_armaturemenu(void *arg_unused)
void do_view3d_select_faceselmenu(void *arg, int event)
{
/* events >= 6 are registered bpython scripts */
+#ifndef DISABLE_PYTHON
if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
-
+#endif
+
switch(event) {
case 0: /* border select */
borderselect();
@@ -1483,7 +1499,9 @@ static uiBlock *view3d_select_faceselmenu(void *arg_unused)
{
uiBlock *block;
short yco= 0, menuwidth=120;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i = 0;
block= uiNewBlock(&curarea->uiblocks, "view3d_select_faceselmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
@@ -1499,6 +1517,7 @@ static uiBlock *view3d_select_faceselmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
/* note that we account for the 6 previous entries with i+6: */
@@ -1507,7 +1526,8 @@ static uiBlock *view3d_select_faceselmenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1, i+6,
pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
+
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
@@ -2437,6 +2457,7 @@ static uiBlock *view3d_edit_object_showhidemenu(void *arg_unused)
return block;
}
+#ifndef DISABLE_PYTHON
static void do_view3d_edit_object_scriptsmenu(void *arg, int event)
{
BPY_menu_do_python(PYMENU_OBJECT, event);
@@ -2463,6 +2484,7 @@ static uiBlock *view3d_edit_object_scriptsmenu(void *arg_unused)
return block;
}
+#endif /* DISABLE_PYTHON */
#ifdef WITH_VERSE
extern ListBase session_list;
@@ -2602,9 +2624,10 @@ static uiBlock *view3d_edit_objectmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
uiDefIconTextBlockBut(block, view3d_edit_object_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Objects", 0, yco-=20, 120, 19, "");
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
-
+#endif
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
@@ -3070,6 +3093,7 @@ static uiBlock *view3d_edit_mesh_showhidemenu(void *arg_unused)
return block;
}
+#ifndef DISABLE_PYTHON
static void do_view3d_edit_mesh_scriptsmenu(void *arg, int event)
{
BPY_menu_do_python(PYMENU_MESH, event);
@@ -3096,6 +3120,7 @@ static uiBlock *view3d_edit_mesh_scriptsmenu(void *arg_unused)
return block;
}
+#endif /* DISABLE_PYTHON */
static void do_view3d_edit_meshmenu(void *arg, int event)
{
@@ -3240,9 +3265,11 @@ static uiBlock *view3d_edit_meshmenu(void *arg_unused)
uiDefIconTextBlockBut(block, view3d_edit_mesh_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Vertices", 0, yco-=20, 120, 19, "");
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_edit_mesh_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
-
+#endif
+
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
@@ -3957,7 +3984,7 @@ static void do_view3d_edit_armaturemenu(void *arg, int event)
}
-
+#ifndef DISABLE_PYTHON
static void do_view3d_scripts_armaturemenu(void *arg, int event)
{
BPY_menu_do_python(PYMENU_ARMATURE, event);
@@ -3988,6 +4015,7 @@ static uiBlock *view3d_scripts_armaturemenu(void *args_unused)
return block;
}
+#endif /* DISABLE_PYTHON */
static void do_view3d_armature_settingsmenu(void *arg, int event)
{
@@ -4069,10 +4097,11 @@ static uiBlock *view3d_edit_armaturemenu(void *arg_unused)
uiDefIconTextBlockBut(block, view3d_edit_armature_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_armature_settingsmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Settings", 0, yco-=20, 120, 19, "");
+#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_scripts_armaturemenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
-
+#endif
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
@@ -4478,8 +4507,9 @@ static uiBlock *view3d_pose_armaturemenu(void *arg_unused)
static void do_view3d_vpaintmenu(void *arg, int event)
{
/* events >= 3 are registered bpython scripts */
+#ifndef DISABLE_PYTHON
if (event >= 3) BPY_menu_do_python(PYMENU_VERTEXPAINT, event - 3);
-
+#endif
switch(event) {
case 0: /* undo vertex painting */
BIF_undo();
@@ -4501,7 +4531,9 @@ static uiBlock *view3d_vpaintmenu(void *arg_unused)
{
uiBlock *block;
short yco= 0, menuwidth=120;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i=0;
block= uiNewBlock(&curarea->uiblocks, "view3d_paintmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
@@ -4511,6 +4543,7 @@ static uiBlock *view3d_vpaintmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Vertex Colors|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Shaded Vertex Colors", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+#ifndef DISABLE_PYTHON
/* note that we account for the 3 previous entries with i+3:
even if the last item isnt displayed, it dosent matter */
for (pym = BPyMenuTable[PYMENU_VERTEXPAINT]; pym; pym = pym->next, i++) {
@@ -4518,7 +4551,8 @@ static uiBlock *view3d_vpaintmenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1, i+3,
pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
+
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
@@ -4573,8 +4607,9 @@ static void do_view3d_wpaintmenu(void *arg, int event)
Object *ob= OBACT;
/* events >= 3 are registered bpython scripts */
+#ifndef DISABLE_PYTHON
if (event >= 4) BPY_menu_do_python(PYMENU_WEIGHTPAINT, event - 4);
-
+#endif
switch(event) {
case 0: /* undo weight painting */
BIF_undo();
@@ -4596,7 +4631,9 @@ static uiBlock *view3d_wpaintmenu(void *arg_unused)
{
uiBlock *block;
short yco= 0, menuwidth=120, menunr=1;
+#ifndef DISABLE_PYTHON
BPyMenu *pym;
+#endif
int i=0;
block= uiNewBlock(&curarea->uiblocks, "view3d_paintmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
@@ -4616,7 +4653,8 @@ static uiBlock *view3d_wpaintmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
menunr++;
}
-
+
+#ifndef DISABLE_PYTHON
/* note that we account for the 4 previous entries with i+4:
even if the last item isnt displayed, it dosent matter */
for (pym = BPyMenuTable[PYMENU_WEIGHTPAINT]; pym; pym = pym->next, i++) {
@@ -4624,7 +4662,8 @@ static uiBlock *view3d_wpaintmenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1, i+4,
pym->tooltip?pym->tooltip:pym->filename);
}
-
+#endif
+
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
}
@@ -4740,7 +4779,7 @@ uiBlock *view3d_sculpt_inputmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "view3d_sculpt_inputmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_view3d_sculpt_inputmenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ((sd->flags & SCULPT_INPUT_SMOOTH) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Smooth Stroke", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ((sd->flags & SCULPT_INPUT_SMOOTH) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Smooth Stroke|Shift S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tablet Size Adjust", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tablet Strength Adjust", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
@@ -4896,8 +4935,9 @@ static uiBlock *view3d_faceselmenu(void *arg_unused)
void do_view3d_select_particlemenu(void *arg, int event)
{
/* events >= 6 are registered bpython scripts */
+#ifndef DISABLE_PYTHON
if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
-
+#endif
switch(event) {
case 0:
PE_borderselect();
@@ -5796,6 +5836,7 @@ void view3d_buttons(void)
uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_SMOOTHCURVE, propfalloff_pup(), xco,0,XIC+10,YIC, &(G.scene->prop_mode), 0.0, 0.0, 0, 0, "Proportional Edit Falloff (Hotkey: Shift O) ");
xco+= XIC+10;
}
+ uiBlockEndAlign(block);
xco+= 10;
}
@@ -5835,6 +5876,7 @@ void view3d_buttons(void)
uiDefIconButBitS(block, TOG, V3D_ZBUF_SELECT, B_REDR, ICON_ORTHO, xco,0,XIC,YIC, &G.vd->flag, 1.0, 0.0, 0, 0, "Occlude background geometry");
xco+= XIC;
}
+ uiBlockEndAlign(block);
xco+= 20;
}
else if(G.f & G_PARTICLEEDIT) {
@@ -5850,6 +5892,7 @@ void view3d_buttons(void)
uiDefIconButBitS(block, TOG, V3D_ZBUF_SELECT, B_REDR, ICON_ORTHO, xco,0,XIC,YIC, &G.vd->flag, 1.0, 0.0, 0, 0, "Limit selection to visible (clipped with depth buffer)");
xco+= XIC;
}
+ uiBlockEndAlign(block);
xco+= 20;
}
diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c
index 44044841a99..7c97fa8431d 100644
--- a/source/blender/src/headerbuttons.c
+++ b/source/blender/src/headerbuttons.c
@@ -161,8 +161,10 @@
#include "BDR_editmball.h"
#include "BDR_sculptmode.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
#include "GPU_draw.h"
@@ -535,6 +537,7 @@ static void filesel_u_renderdir(char *name)
allqueue(REDRAWALL, 0);
}
+#ifndef DISABLE_PYTHON
static void filesel_u_pythondir(char *name)
{
char dir[FILE_MAXDIR], file[FILE_MAXFILE];
@@ -550,6 +553,7 @@ static void filesel_u_pythondir(char *name)
error("Invalid scripts dir: check console");
}
}
+#endif
static void filesel_u_sounddir(char *name)
{
@@ -1525,7 +1529,7 @@ void do_global_buttons(unsigned short event)
activate_fileselect(FILE_SPECIAL, "SELECT RENDER PATH", U.renderdir, filesel_u_renderdir);
break;
-
+#ifndef DISABLE_PYTHON
case B_PYMENUEVAL: /* is button from space.c *info* */
waitcursor( 1 ); /* can take some time */
if (BPY_path_update() == 0) { /* re-eval scripts registration in menus */
@@ -1542,7 +1546,7 @@ void do_global_buttons(unsigned short event)
activate_fileselect(FILE_SPECIAL, "SELECT SCRIPT PATH", U.pythondir, filesel_u_pythondir);
break;
-
+#endif
case B_SOUNDDIRFILESEL: /* is button from space.c *info* */
if(curarea->spacetype==SPACE_INFO) {
sa= closest_bigger_area();
diff --git a/source/blender/src/imagepaint.c b/source/blender/src/imagepaint.c
index 164c368b6fa..149dbf1d026 100644
--- a/source/blender/src/imagepaint.c
+++ b/source/blender/src/imagepaint.c
@@ -95,11 +95,10 @@
/* Defines and Structs */
-#define IMAPAINT_FLOAT_TO_CHAR(f) ((char)(f*255))
#define IMAPAINT_CHAR_TO_FLOAT(c) (c/255.0f)
-#define IMAPAINT_FLOAT_RGB_TO_CHAR(c, f) { c[0]=IMAPAINT_FLOAT_TO_CHAR(f[0]); \
- c[1]=IMAPAINT_FLOAT_TO_CHAR(f[1]); c[2]=IMAPAINT_FLOAT_TO_CHAR(f[2]); }
+#define IMAPAINT_FLOAT_RGB_TO_CHAR(c, f) { c[0]=FTOCHAR(f[0]); \
+ c[1]=FTOCHAR(f[1]); c[2]=FTOCHAR(f[2]); }
#define IMAPAINT_CHAR_RGB_TO_FLOAT(f, c) { f[0]=IMAPAINT_CHAR_TO_FLOAT(c[0]); \
f[1]=IMAPAINT_CHAR_TO_FLOAT(c[1]); f[2]=IMAPAINT_CHAR_TO_FLOAT(c[2]); }
#define IMAPAINT_FLOAT_RGB_COPY(a, b) VECCOPY(a, b)
@@ -720,7 +719,9 @@ static void imapaint_paint_stroke(ImagePaintState *s, BrushPainter *painter, sho
if (texpaint) {
/* pick new face and image */
- if (facesel_face_pick(s->me, mval, &newfaceindex, 0)) {
+ if ( facesel_face_pick(s->me, mval, &newfaceindex, 0) &&
+ ((G.f & G_FACESELECT)==0 || (s->me->mface+newfaceindex)->flag & ME_FACE_SEL)
+ ) {
ImBuf *ibuf;
newimage = (Image*)((s->me->mtface+newfaceindex)->tpage);
diff --git a/source/blender/src/interface.c b/source/blender/src/interface.c
index e77b477e6ce..9decbd9a1ce 100644
--- a/source/blender/src/interface.c
+++ b/source/blender/src/interface.c
@@ -96,7 +96,9 @@
#include "BSE_view.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h" /* for BPY_button_eval */
+#endif
#include "GHOST_Types.h" /* for tablet data */
@@ -467,7 +469,7 @@ void ui_block_set_flush(uiBlock *block, uiBut *but)
static int ui_but_copy_paste(uiBut *but, char mode)
{
void *poin;
- char buf[UI_MAX_DRAW_STR+1];
+ char buf[UI_MAX_DRAW_STR+1]= {0};
double val;
float f[3];
@@ -477,12 +479,14 @@ static int ui_but_copy_paste(uiBut *but, char mode)
if(mode=='v') {
/* extract first line from clipboard in case of multi-line copies */
char *p = getClipboard(0);
- int i = 0;
- while (*p && *p!='\r' && *p!='\n' && i<UI_MAX_DRAW_STR) {
- buf[i++]=*p;
- p++;
+ if(p) {
+ int i = 0;
+ while (*p && *p!='\r' && *p!='\n' && i<UI_MAX_DRAW_STR) {
+ buf[i++]=*p;
+ p++;
+ }
+ buf[i]= 0;
}
- buf[i]= 0;
}
/* numeric value */
@@ -1804,48 +1808,51 @@ static int ui_do_but_TEX(uiBut *but)
((G.qual & LR_COMMANDKEY) || (G.qual & LR_CTRLKEY)) &&
((dev==XKEY) || (dev==CKEY) || (dev==VKEY)) ) {
- char buf[UI_MAX_DRAW_STR];
+ char buf[UI_MAX_DRAW_STR+1]={0};
/* paste */
if (dev==VKEY) {
/* extract the first line from the clipboard */
char *p = getClipboard(0);
- int i = 0;
- while (*p && *p!='\r' && *p!='\n' && i<UI_MAX_DRAW_STR) {
- buf[i++]=*p;
- p++;
- }
- buf[i]= 0;
+ if(p) {
+ int i = 0;
+ while (*p && *p!='\r' && *p!='\n' && i<UI_MAX_DRAW_STR) {
+ buf[i++]=*p;
+ p++;
+ }
+ buf[i]= 0;
- /* paste over the current selection */
- if ((but->selend - but->selsta) > 0) {
- len -= ui_delete_selection_edittext(but);
- }
-
- for (y=0; y<strlen(buf); y++)
- {
- /* add contents of buffer */
- if(len < but->max) {
- for(x= but->max; x>but->pos; x--)
- str[x]= str[x-1];
- str[but->pos]= buf[y];
- but->pos++;
- len++;
- str[len]= '\0';
+ /* paste over the current selection */
+ if ((but->selend - but->selsta) > 0) {
+ len -= ui_delete_selection_edittext(but);
}
+
+ for (y=0; y<strlen(buf); y++)
+ {
+ /* add contents of buffer */
+ if(len < but->max) {
+ for(x= but->max; x>but->pos; x--)
+ str[x]= str[x-1];
+ str[but->pos]= buf[y];
+ but->pos++;
+ len++;
+ str[len]= '\0';
+ }
+ }
+ if (strlen(buf) > 0) dodraw= 1;
}
- if (strlen(buf) > 0) dodraw= 1;
}
/* cut & copy */
else if ( (dev==XKEY) || (dev==CKEY) ) {
- /* copy the contents to the copypaste buffer */
+ /* copy the contents to the clipboard */
for(x= but->selsta; x <= but->selend; x++) {
if (x==but->selend)
buf[x] = '\0';
else
buf[(x - but->selsta)] = str[x];
}
+ putClipboard(buf, 0);
/* for cut only, delete the selection afterwards */
if (dev==XKEY) {
@@ -2139,6 +2146,7 @@ static int ui_act_as_text_but(uiBut *but)
but->max= max;
if(textleft==0) but->flag &= ~UI_TEXT_LEFT;
+#ifndef DISABLE_PYTHON
if(BPY_button_eval(str, &value)) {
/* Uncomment this if you want to see an error message (and annoy users) */
/* error("Invalid Python expression, check console");*/
@@ -2147,7 +2155,10 @@ static int ui_act_as_text_but(uiBut *but)
if(str[0])
retval = 0; /* invalidate return value if eval failed, except when string was null */
}
-
+#else
+ value=atof(str);
+#endif
+
if(but->pointype!=FLO) value= (int)value;
if(but->type==NUMABS) value= fabs(value);
diff --git a/source/blender/src/keyframing.c b/source/blender/src/keyframing.c
index 3c8a06786ac..d9c729e7df6 100644
--- a/source/blender/src/keyframing.c
+++ b/source/blender/src/keyframing.c
@@ -1,5 +1,5 @@
/**
- * $Id: keyframing.c 14881 2008-05-18 10:41:42Z aligorith $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -49,6 +49,7 @@
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
#include "DNA_ipo_types.h"
+#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
#include "DNA_object_types.h"
#include "DNA_material_types.h"
@@ -71,7 +72,9 @@
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_ipo.h"
+#include "BKE_key.h"
#include "BKE_object.h"
+#include "BKE_material.h"
#include "BIF_keyframing.h"
#include "BIF_butspace.h"
@@ -157,11 +160,10 @@ typedef struct bCommonKeySrc {
/* Binary search algorithm for finding where to insert BezTriple. (for use by insert_bezt_icu)
* Returns the index to insert at (data already at that index will be offset if replace is 0)
*/
-static int binarysearch_bezt_index (BezTriple array[], BezTriple *item, int arraylen, short *replace)
+static int binarysearch_bezt_index (BezTriple array[], float frame, int arraylen, short *replace)
{
int start=0, end=arraylen;
int loopbreaker= 0, maxloop= arraylen * 2;
- const float frame= (item)? item->vec[1][0] : 0.0f;
/* initialise replace-flag first */
*replace= 0;
@@ -170,7 +172,7 @@ static int binarysearch_bezt_index (BezTriple array[], BezTriple *item, int arra
* - keyframe to be added is to be added out of current bounds
* - keyframe to be added would replace one of the existing ones on bounds
*/
- if ((arraylen <= 0) || ELEM(NULL, array, item)) {
+ if ((arraylen <= 0) || (array == NULL)) {
printf("Warning: binarysearch_bezt_index encountered invalid array \n");
return 0;
}
@@ -250,7 +252,7 @@ int insert_bezt_icu (IpoCurve *icu, BezTriple *bezt)
}
else {
short replace = -1;
- i = binarysearch_bezt_index(icu->bezt, bezt, icu->totvert, &replace);
+ i = binarysearch_bezt_index(icu->bezt, bezt->vec[1][0], icu->totvert, &replace);
if (replace) {
/* sanity check: 'i' may in rare cases exceed arraylen */
@@ -334,7 +336,7 @@ void insert_vert_icu (IpoCurve *icu, float x, float y, short fast)
/* Get pointer to use to get values from */
// FIXME: this should not be possible with Data-API
-static void *get_context_ipo_poin(ID *id, int blocktype, char *actname, char *constname, IpoCurve *icu, int *vartype)
+static void *get_context_ipo_poin (ID *id, int blocktype, char *actname, char *constname, IpoCurve *icu, int *vartype)
{
switch (blocktype) {
case ID_PO: /* posechannel */
@@ -588,6 +590,8 @@ static short visualkey_can_use (ID *id, int blocktype, char *actname, char *cons
return 1;
case CONSTRAINT_TYPE_FOLLOWPATH:
return 1;
+ case CONSTRAINT_TYPE_KINEMATIC:
+ return 1;
/* single-transform constraits */
case CONSTRAINT_TYPE_TRACKTO:
@@ -662,7 +666,7 @@ static float visualkey_get_value (ID *id, int blocktype, char *actname, char *co
index= adrcode - OB_ROT_X;
Mat4ToEul(ob->obmat, eul);
- return eul[index]*(5.72958);
+ return eul[index]*(5.72958f);
}
}
}
@@ -735,8 +739,6 @@ short insertkey (ID *id, int blocktype, char *actname, char *constname, int adrc
if (icu) {
float cfra = frame_to_float(CFRA);
float curval= 0.0f;
- void *poin = NULL;
- int vartype;
/* apply special time tweaking */
if (GS(id->name) == ID_OB) {
@@ -753,10 +755,6 @@ short insertkey (ID *id, int blocktype, char *actname, char *constname, int adrc
}
}
- /* get pointer to data to read from */
- poin= get_context_ipo_poin(id, blocktype, actname, constname, icu, &vartype);
- if (poin == NULL) return 0;
-
/* obtain value to give keyframe */
if ( (flag & INSERTKEY_MATRIX) &&
(visualkey_can_use(id, blocktype, actname, constname, adrcode)) )
@@ -768,6 +766,16 @@ short insertkey (ID *id, int blocktype, char *actname, char *constname, int adrc
curval= visualkey_get_value(id, blocktype, actname, constname, adrcode, icu);
}
else {
+ void *poin;
+ int vartype;
+
+ /* get pointer to data to read from */
+ poin = get_context_ipo_poin(id, blocktype, actname, constname, icu, &vartype);
+ if (poin == NULL) {
+ printf("Insert Key: No pointer to variable obtained \n");
+ return 0;
+ }
+
/* use kt's read_poin function to extract value (kt->read_poin should
* exist in all cases, but it never hurts to check)
*/
@@ -782,7 +790,7 @@ short insertkey (ID *id, int blocktype, char *actname, char *constname, int adrc
insert_mode= new_key_needed(icu, cfra, curval);
/* insert new keyframe at current frame */
- if (insert_mode)
+ if (insert_mode)
insert_vert_icu(icu, cfra, curval, (flag & INSERTKEY_FAST));
/* delete keyframe immediately before/after newly added */
@@ -794,14 +802,18 @@ short insertkey (ID *id, int blocktype, char *actname, char *constname, int adrc
delete_icu_key(icu, 1, 1);
break;
}
+
+ /* only return success if keyframe added */
+ if (insert_mode)
+ return 1;
}
else {
/* just insert keyframe */
insert_vert_icu(icu, cfra, curval, (flag & INSERTKEY_FAST));
+
+ /* return success */
+ return 1;
}
-
- /* return success */
- return 1;
}
/* return failure */
@@ -833,7 +845,6 @@ short deletekey (ID *id, int blocktype, char *actname, char *constname, int adrc
/* only continue if we have an ipo-curve to remove keyframes from */
if (icu) {
- BezTriple bezt;
float cfra = frame_to_float(CFRA);
short found = -1;
int i;
@@ -853,12 +864,8 @@ short deletekey (ID *id, int blocktype, char *actname, char *constname, int adrc
}
}
- /* only need to set bezt->vec[1][0], as that's all binarysearch uses */
- memset(&bezt, 0, sizeof(BezTriple));
- bezt.vec[1][0]= cfra;
-
/* try to find index of beztriple to get rid of */
- i = binarysearch_bezt_index(icu->bezt, &bezt, icu->totvert, &found);
+ i = binarysearch_bezt_index(icu->bezt, cfra, icu->totvert, &found);
if (found) {
/* delete the key at the index (will sanity check + do recalc afterwards ) */
delete_icu_key(icu, i, 1);
@@ -881,6 +888,11 @@ short deletekey (ID *id, int blocktype, char *actname, char *constname, int adrc
/* ************************************************** */
/* COMMON KEYFRAME MANAGEMENT (common_insertkey/deletekey) */
+/* mode for common_modifykey */
+enum {
+ COMMONKEY_MODE_INSERT = 0,
+ COMMONKEY_MODE_DELETE,
+} eCommonModifyKey_Modes;
/* ------------- KeyingSet Defines ------------ */
/* Note: these must all be named with the defks_* prefix, otherwise the template macro will not work! */
@@ -911,6 +923,9 @@ static short incl_v3d_ob_shapekey (bKeyingSet *ks, const char mode[])
Object *ob= (G.obedit)? (G.obedit) : (OBACT);
char *newname= NULL;
+ if(ob==NULL)
+ return 0;
+
/* not available for delete mode */
if (strcmp(mode, "Delete")==0)
return 0;
@@ -1049,10 +1064,10 @@ bKeyingSet defks_buts_shading_mat[] =
{NULL, "%l", 0, -1, 0, {0}}, // separator
- {NULL, "Ofs", ID_MA, 0, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
- {NULL, "Size", ID_MA, 0, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
+ {NULL, "Ofs", ID_MA, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
+ {NULL, "Size", ID_MA, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
- {NULL, "All Mapping", ID_MA, 0, 14,
+ {NULL, "All Mapping", ID_MA, COMMONKEY_ADDMAP, 14,
{MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z,
MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z,
MAP_R,MAP_G,MAP_B,MAP_DVAR,
@@ -1080,10 +1095,10 @@ bKeyingSet defks_buts_shading_wo[] =
{NULL, "%l", 0, -1, 0, {0}}, // separator
- {NULL, "Ofs", ID_WO, 0, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
- {NULL, "Size", ID_WO, 0, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
+ {NULL, "Ofs", ID_WO, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
+ {NULL, "Size", ID_WO, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
- {NULL, "All Mapping", ID_WO, 0, 14,
+ {NULL, "All Mapping", ID_WO, COMMONKEY_ADDMAP, 14,
{MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z,
MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z,
MAP_R,MAP_G,MAP_B,MAP_DVAR,
@@ -1106,10 +1121,10 @@ bKeyingSet defks_buts_shading_la[] =
{NULL, "%l", 0, -1, 0, {0}}, // separator
- {NULL, "Ofs", ID_LA, 0, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
- {NULL, "Size", ID_LA, 0, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
+ {NULL, "Ofs", ID_LA, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}},
+ {NULL, "Size", ID_LA, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}},
- {NULL, "All Mapping", ID_LA, 0, 14,
+ {NULL, "All Mapping", ID_LA, COMMONKEY_ADDMAP, 14,
{MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z,
MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z,
MAP_R,MAP_G,MAP_B,MAP_DVAR,
@@ -1173,6 +1188,8 @@ static short incl_buts_ob (bKeyingSet *ks, const char mode[])
{
Object *ob= OBACT;
/* only if object is mesh type */
+
+ if(ob==NULL) return 0;
return (ob->type == OB_MESH);
}
@@ -1337,10 +1354,12 @@ static void commonkey_context_getv3d (ListBase *sources, bKeyingContext **ksc)
if (achan && achan->ipo)
cks->ipo= achan->ipo;
}
-
- /* deselect all ipo-curves */
- for (icu= cks->ipo->curve.first; icu; icu= icu->next) {
- icu->flag &= ~IPO_SELECT;
+ /* cks->ipo can be NULL while editing */
+ if(cks->ipo) {
+ /* deselect all ipo-curves */
+ for (icu= cks->ipo->curve.first; icu; icu= icu->next) {
+ icu->flag &= ~IPO_SELECT;
+ }
}
}
}
@@ -1362,71 +1381,79 @@ static void commonkey_context_getsbuts (ListBase *sources, bKeyingContext **ksc)
{
Material *ma= editnode_get_active_material(G.buts->lockpoin);
- /* add new keyframing destination */
- cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
- BLI_addtail(sources, cks);
-
- /* set data */
- cks->id= (ID *)ma;
- cks->ipo= ma->ipo;
- cks->map= texchannel_to_adrcode(ma->texact);
-
- /* set keyingsets */
- *ksc= &ks_contexts[KSC_BUTS_MAT];
- return;
+ if (ma) {
+ /* add new keyframing destination */
+ cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
+ BLI_addtail(sources, cks);
+
+ /* set data */
+ cks->id= (ID *)ma;
+ cks->ipo= ma->ipo;
+ cks->map= texchannel_to_adrcode(ma->texact);
+
+ /* set keyingsets */
+ *ksc= &ks_contexts[KSC_BUTS_MAT];
+ return;
+ }
}
break;
case TAB_SHADING_WORLD: /* >------------- World Tab -------------< */
{
World *wo= G.buts->lockpoin;
- /* add new keyframing destination */
- cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
- BLI_addtail(sources, cks);
-
- /* set data */
- cks->id= (ID *)wo;
- cks->ipo= wo->ipo;
- cks->map= texchannel_to_adrcode(wo->texact);
-
- /* set keyingsets */
- *ksc= &ks_contexts[KSC_BUTS_WO];
- return;
+ if (wo) {
+ /* add new keyframing destination */
+ cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
+ BLI_addtail(sources, cks);
+
+ /* set data */
+ cks->id= (ID *)wo;
+ cks->ipo= wo->ipo;
+ cks->map= texchannel_to_adrcode(wo->texact);
+
+ /* set keyingsets */
+ *ksc= &ks_contexts[KSC_BUTS_WO];
+ return;
+ }
}
break;
case TAB_SHADING_LAMP: /* >------------- Lamp Tab -------------< */
{
Lamp *la= G.buts->lockpoin;
- /* add new keyframing destination */
- cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
- BLI_addtail(sources, cks);
-
- /* set data */
- cks->id= (ID *)la;
- cks->ipo= la->ipo;
- cks->map= texchannel_to_adrcode(la->texact);
-
- /* set keyingsets */
- *ksc= &ks_contexts[KSC_BUTS_LA];
- return;
+ if (la) {
+ /* add new keyframing destination */
+ cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
+ BLI_addtail(sources, cks);
+
+ /* set data */
+ cks->id= (ID *)la;
+ cks->ipo= la->ipo;
+ cks->map= texchannel_to_adrcode(la->texact);
+
+ /* set keyingsets */
+ *ksc= &ks_contexts[KSC_BUTS_LA];
+ return;
+ }
}
break;
case TAB_SHADING_TEX: /* >------------- Texture Tab -------------< */
{
Tex *tex= G.buts->lockpoin;
- /* add new keyframing destination */
- cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
- BLI_addtail(sources, cks);
-
- /* set data */
- cks->id= (ID *)tex;
- cks->ipo= tex->ipo;
-
- /* set keyingsets */
- *ksc= &ks_contexts[KSC_BUTS_TEX];
- return;
+ if (tex) {
+ /* add new keyframing destination */
+ cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc");
+ BLI_addtail(sources, cks);
+
+ /* set data */
+ cks->id= (ID *)tex;
+ cks->ipo= tex->ipo;
+
+ /* set keyingsets */
+ *ksc= &ks_contexts[KSC_BUTS_TEX];
+ return;
+ }
}
break;
}
@@ -1481,7 +1508,7 @@ static void commonkey_context_getsbuts (ListBase *sources, bKeyingContext **ksc)
/* get keyingsets for appropriate context */
-static void commonkey_context_get (ScrArea *sa, ListBase *sources, bKeyingContext **ksc)
+static void commonkey_context_get (ScrArea *sa, short mode, ListBase *sources, bKeyingContext **ksc)
{
/* check view type */
switch (sa->spacetype) {
@@ -1499,10 +1526,21 @@ static void commonkey_context_get (ScrArea *sa, ListBase *sources, bKeyingContex
}
break;
+ /* spaces with their own methods */
+ case SPACE_IPO:
+ if (mode == COMMONKEY_MODE_INSERT)
+ insertkey_editipo();
+ return;
+ case SPACE_ACTION:
+ if (mode == COMMONKEY_MODE_INSERT)
+ insertkey_action();
+ return;
+
/* timeline view - keyframe buttons */
case SPACE_TIME:
{
ScrArea *sab;
+ int bigarea= 0;
/* try to find largest 3d-view available
* (mostly of the time, this is what when user will want this,
@@ -1514,12 +1552,21 @@ static void commonkey_context_get (ScrArea *sa, ListBase *sources, bKeyingContex
return;
}
- /* otherwise, try to find the biggest area
- * WARNING: must check if that area is another timeline, as that would cause infinite loop
- */
- sab= closest_bigger_area();
- if ((sab) && (sab->spacetype != SPACE_TIME))
- commonkey_context_get(sab, sources, ksc);
+ /* if not found, sab is now NULL, so perform own biggest area test */
+ for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
+ int area= sa->winx * sa->winy;
+
+ if (sa->spacetype != SPACE_TIME) {
+ if ( (!sab) || (area > bigarea) ) {
+ sab= sa;
+ bigarea= area;
+ }
+ }
+ }
+
+ /* use whichever largest area was found (it shouldn't be a time window) */
+ if (sab)
+ commonkey_context_get(sab, mode, sources, ksc);
}
break;
}
@@ -1578,6 +1625,15 @@ static void commonkey_context_refresh (void)
allqueue(REDRAWMARKER, 0);
}
break;
+
+ /* buttons window */
+ case SPACE_BUTS:
+ {
+ allspace(REMAKEIPO, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWMARKER, 0);
+ }
+ break;
}
}
@@ -1649,12 +1705,6 @@ static bKeyingSet *get_keyingset_fromcontext (bKeyingContext *ksc, short index)
/* ---------------- Keyframe Management API -------------------- */
-/* mode for common_modifykey */
-enum {
- COMMONKEY_MODE_INSERT = 0,
- COMMONKEY_MODE_DELETE,
-} eCommonModifyKey_Modes;
-
/* Display a menu for handling the insertion of keyframes based on the active view */
// TODO: add back an option for repeating last keytype
void common_modifykey (short mode)
@@ -1670,26 +1720,10 @@ void common_modifykey (short mode)
if (ELEM(mode, COMMONKEY_MODE_INSERT, COMMONKEY_MODE_DELETE)==0)
return;
- /* delegate to other functions or get keyingsets to use */
- switch (curarea->spacetype) {
- /* spaces with their own methods */
- case SPACE_IPO:
- if (mode == COMMONKEY_MODE_INSERT)
- insertkey_editipo();
- return;
- case SPACE_ACTION:
- if (mode == COMMONKEY_MODE_INSERT)
- insertkey_action();
- return;
-
- /* TODO: based on UI elements? will that even be handled here??? */
-
- /* default - check per view */
- default:
- /* get the keyingsets and the data to add keyframes to */
- commonkey_context_get(curarea, &dsources, &ksc);
- break;
- }
+ /* delegate to other functions or get keyingsets to use
+ * - if the current area doesn't have its own handling, there will be data returned...
+ */
+ commonkey_context_get(curarea, mode, &dsources, &ksc);
/* check that there is data to operate on */
if (ELEM(NULL, dsources.first, ksc)) {
@@ -1785,7 +1819,7 @@ void common_modifykey (short mode)
* - certain adrcodes (for MTEX channels need special offsets) // BAD CRUFT!!!
*/
adrcode= ks->adrcodes[i];
- if (ELEM3(ks->blocktype, ID_MA, ID_LA, ID_WO)) {
+ if (ELEM3(ks->blocktype, ID_MA, ID_LA, ID_WO) && (ks->flag & COMMONKEY_ADDMAP)) {
switch (adrcode) {
case MAP_OFS_X: case MAP_OFS_Y: case MAP_OFS_Z:
case MAP_SIZE_X: case MAP_SIZE_Y: case MAP_SIZE_Z:
@@ -1800,6 +1834,7 @@ void common_modifykey (short mode)
if (mode == COMMONKEY_MODE_DELETE) {
/* local flags only add on to global flags */
flag = 0;
+ //flag &= ~COMMONKEY_ADDMAP;
/* delete keyframe */
success += deletekey(cks->id, ks->blocktype, cks->actname, cks->constname, adrcode, flag);
@@ -1810,6 +1845,7 @@ void common_modifykey (short mode)
if (IS_AUTOKEY_FLAG(AUTOMATKEY)) flag |= INSERTKEY_MATRIX;
if (IS_AUTOKEY_FLAG(INSERTNEEDED)) flag |= INSERTKEY_NEEDED;
// if (IS_AUTOKEY_MODE(EDITKEYS)) flag |= INSERTKEY_REPLACE;
+ flag &= ~COMMONKEY_ADDMAP;
/* insert keyframe */
success += insertkey(cks->id, ks->blocktype, cks->actname, cks->constname, adrcode, flag);
@@ -1868,3 +1904,201 @@ void common_deletekey (void)
}
/* ************************************************** */
+/* KEYFRAME DETECTION */
+
+/* --------------- API/Per-Datablock Handling ------------------- */
+
+/* Checks whether an IPO-block has a keyframe for a given frame
+ * Since we're only concerned whether a keyframe exists, we can simply loop until a match is found...
+ */
+short ipo_frame_has_keyframe (Ipo *ipo, float frame, short filter)
+{
+ IpoCurve *icu;
+
+ /* can only find if there is data */
+ if (ipo == NULL)
+ return 0;
+
+ /* if only check non-muted, check if muted */
+ if ((filter & ANIMFILTER_MUTED) || (ipo->muteipo))
+ return 0;
+
+ /* loop over IPO-curves, using binary-search to try to find matches
+ * - this assumes that keyframes are only beztriples
+ */
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ /* only check if there are keyframes (currently only of type BezTriple) */
+ if (icu->bezt) {
+ /* we either include all regardless of muting, or only non-muted */
+ if ((filter & ANIMFILTER_MUTED) || (icu->flag & IPO_MUTE)==0) {
+ short replace = -1;
+ int i = binarysearch_bezt_index(icu->bezt, frame, icu->totvert, &replace);
+
+ /* binarysearch_bezt_index will set replace to be 0 or 1
+ * - obviously, 1 represents a match
+ */
+ if (replace) {
+ /* sanity check: 'i' may in rare cases exceed arraylen */
+ if ((i >= 0) && (i < icu->totvert))
+ return 1;
+ }
+ }
+ }
+ }
+
+ /* nothing found */
+ return 0;
+}
+
+/* Checks whether an action-block has a keyframe for a given frame
+ * Since we're only concerned whether a keyframe exists, we can simply loop until a match is found...
+ */
+short action_frame_has_keyframe (bAction *act, float frame, short filter)
+{
+ bActionChannel *achan;
+
+ /* error checking */
+ if (act == NULL)
+ return 0;
+
+ /* check thorugh action-channels for match */
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ /* we either include all regardless of muting, or only non-muted
+ * - here we include 'hidden' channels in the muted definition
+ */
+ if ((filter & ANIMFILTER_MUTED) || (achan->flag & ACHAN_HIDDEN)==0) {
+ if (ipo_frame_has_keyframe(achan->ipo, frame, filter))
+ return 1;
+ }
+ }
+
+ /* nothing found */
+ return 0;
+}
+
+/* Checks whether an Object has a keyframe for a given frame */
+short object_frame_has_keyframe (Object *ob, float frame, short filter)
+{
+ /* error checking */
+ if (ob == NULL)
+ return 0;
+
+ /* check for an action - actions take priority over normal IPO's */
+ if (ob->action) {
+ float aframe;
+
+ /* apply nla-action scaling if needed */
+ if ((ob->nlaflag & OB_NLA_OVERRIDE) && (ob->nlastrips.first))
+ aframe= get_action_frame(ob, frame);
+ else
+ aframe= frame;
+
+ /* priority check here goes to pose-channel checks (for armatures) */
+ if ((ob->pose) && (ob->flag & OB_POSEMODE)) {
+ /* only relevant check here is to only show active... */
+ if (filter & ANIMFILTER_ACTIVE) {
+ bPoseChannel *pchan= get_active_posechannel(ob);
+ bActionChannel *achan= (pchan) ? get_action_channel(ob->action, pchan->name) : NULL;
+
+ /* since we're only interested in whether the selected one has any keyframes... */
+ return (achan && ipo_frame_has_keyframe(achan->ipo, aframe, filter));
+ }
+ }
+
+ /* for everything else, just use the standard test (only return if success) */
+ if (action_frame_has_keyframe(ob->action, aframe, filter))
+ return 1;
+ }
+ else if (ob->ipo) {
+ /* only return if success */
+ if (ipo_frame_has_keyframe(ob->ipo, frame, filter))
+ return 1;
+ }
+
+ /* try shapekey keyframes (if available, and allowed by filter) */
+ if ( !(filter & ANIMFILTER_LOCAL) && !(filter & ANIMFILTER_NOSKEY) ) {
+ Key *key= ob_get_key(ob);
+
+ /* shapekeys can have keyframes ('Relative Shape Keys')
+ * or depend on time (old 'Absolute Shape Keys')
+ */
+
+ /* 1. test for relative (with keyframes) */
+ if (id_frame_has_keyframe((ID *)key, frame, filter))
+ return 1;
+
+ /* 2. test for time */
+ // TODO... yet to be implemented (this feature may evolve before then anyway)
+ }
+
+ /* try materials */
+ if ( !(filter & ANIMFILTER_LOCAL) && !(filter & ANIMFILTER_NOMAT) ) {
+ /* if only active, then we can skip a lot of looping */
+ if (filter & ANIMFILTER_ACTIVE) {
+ Material *ma= give_current_material(ob, (ob->actcol + 1));
+
+ /* we only retrieve the active material... */
+ if (id_frame_has_keyframe((ID *)ma, frame, filter))
+ return 1;
+ }
+ else {
+ int a;
+
+ /* loop over materials */
+ for (a=0; a<ob->totcol; a++) {
+ Material *ma= give_current_material(ob, a+1);
+
+ if (id_frame_has_keyframe((ID *)ma, frame, filter))
+ return 1;
+ }
+ }
+ }
+
+ /* nothing found */
+ return 0;
+}
+
+/* --------------- API ------------------- */
+
+/* Checks whether a keyframe exists for the given ID-block one the given frame */
+short id_frame_has_keyframe (ID *id, float frame, short filter)
+{
+ /* error checking */
+ if (id == NULL)
+ return 0;
+
+ /* check for a valid id-type */
+ switch (GS(id->name)) {
+ /* animation data-types */
+ case ID_IP: /* ipo */
+ return ipo_frame_has_keyframe((Ipo *)id, frame, filter);
+ case ID_AC: /* action */
+ return action_frame_has_keyframe((bAction *)id, frame, filter);
+
+ case ID_OB: /* object */
+ return object_frame_has_keyframe((Object *)id, frame, filter);
+
+ case ID_MA: /* material */
+ {
+ Material *ma= (Material *)id;
+
+ /* currently, material's only have an ipo-block */
+ return ipo_frame_has_keyframe(ma->ipo, frame, filter);
+ }
+ break;
+
+ case ID_KE: /* shapekey */
+ {
+ Key *key= (Key *)id;
+
+ /* currently, shapekey's only have an ipo-block */
+ return ipo_frame_has_keyframe(key->ipo, frame, filter);
+ }
+ break;
+ }
+
+ /* no keyframe found */
+ return 0;
+}
+
+/* ************************************************** */
diff --git a/source/blender/src/meshtools.c b/source/blender/src/meshtools.c
index eed7737c26d..66a484eb903 100644
--- a/source/blender/src/meshtools.c
+++ b/source/blender/src/meshtools.c
@@ -771,15 +771,15 @@ intptr_t mesh_octree_table(Object *ob, float *co, char mode)
}
else {
MVert *mvert;
- float *co;
+ float *vco;
int a, totvert;
MeshOctree.orco= mesh_getRefKeyCos(me, &totvert);
mesh_get_texspace(me, MeshOctree.orcoloc, NULL, NULL);
for(a=0, mvert= me->mvert; a<me->totvert; a++, mvert++) {
- co= (MeshOctree.orco)? MeshOctree.orco[a]: mvert->co;
- DO_MINMAX(co, min, max);
+ vco= (MeshOctree.orco)? MeshOctree.orco[a]: mvert->co;
+ DO_MINMAX(vco, min, max);
}
}
@@ -813,12 +813,12 @@ intptr_t mesh_octree_table(Object *ob, float *co, char mode)
}
else {
MVert *mvert;
- float *co;
+ float *vco;
int a;
for(a=0, mvert= me->mvert; a<me->totvert; a++, mvert++) {
- co= (MeshOctree.orco)? MeshOctree.orco[a]: mvert->co;
- mesh_octree_add_nodes(MeshOctree.table, co, MeshOctree.offs, MeshOctree.div, a+1);
+ vco= (MeshOctree.orco)? MeshOctree.orco[a]: mvert->co;
+ mesh_octree_add_nodes(MeshOctree.table, vco, MeshOctree.offs, MeshOctree.div, a+1);
}
}
}
diff --git a/source/blender/src/outliner.c b/source/blender/src/outliner.c
index 8d33496f068..8e3e44c06de 100644
--- a/source/blender/src/outliner.c
+++ b/source/blender/src/outliner.c
@@ -1579,6 +1579,7 @@ static void tree_element_active_object(SpaceOops *soops, TreeElement *te)
}
if(ob!=G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
+ else countall(); /* exit_editmode calls countall() */
}
static int tree_element_active_material(SpaceOops *soops, TreeElement *te, int set)
@@ -1687,7 +1688,7 @@ static int tree_element_active_texture(SpaceOops *soops, TreeElement *te, int se
sbuts->texfrom= 0;
}
extern_set_butspace(F6KEY, 0); // force shading buttons texture
- ma->texact= te->index;
+ ma->texact= (char)te->index;
/* also set active material */
ob->actcol= tep->index+1;
@@ -1737,6 +1738,7 @@ static int tree_element_active_world(SpaceOops *soops, TreeElement *te, int set)
if(sce && G.scene != sce) {
if(G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
set_scene(sce);
+ countall();
}
}
@@ -2250,6 +2252,7 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
if(G.scene!=(Scene *)tselem->id) {
if(G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
set_scene((Scene *)tselem->id);
+ countall();
}
}
else if(ELEM5(te->idcode, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR)) {
@@ -2326,8 +2329,8 @@ static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te,
TreeStoreElem *tselem= TREESTORE(te);
/* store coord and continue, we need coordinates for elements outside view too */
- te->xs= startx;
- te->ys= *starty;
+ te->xs= (float)startx;
+ te->ys= (float)(*starty);
*starty-= OL_H;
if((tselem->flag & TSE_CLOSED)==0) {
@@ -2343,7 +2346,7 @@ static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te,
static void outliner_set_coordinates(SpaceOops *soops)
{
TreeElement *te;
- int starty= soops->v2d.tot.ymax-OL_H;
+ int starty= (int)(soops->v2d.tot.ymax)-OL_H;
int startx= 0;
for(te= soops->tree.first; te; te= te->next) {
@@ -2381,13 +2384,13 @@ void outliner_show_active(struct ScrArea *sa)
te= outliner_find_id(so, &so->tree, (ID *)OBACT);
if(te) {
/* make te->ys center of view */
- ytop= te->ys + (so->v2d.mask.ymax-so->v2d.mask.ymin)/2;
+ ytop= (int)(te->ys + (so->v2d.mask.ymax-so->v2d.mask.ymin)/2);
if(ytop>0) ytop= 0;
- so->v2d.cur.ymax= ytop;
- so->v2d.cur.ymin= ytop-(so->v2d.mask.ymax-so->v2d.mask.ymin);
+ so->v2d.cur.ymax= (float)ytop;
+ so->v2d.cur.ymin= (float)(ytop-(so->v2d.mask.ymax-so->v2d.mask.ymin));
/* make te->xs ==> te->xend center of view */
- xdelta = te->xs - so->v2d.cur.xmin;
+ xdelta = (int)(te->xs - so->v2d.cur.xmin);
so->v2d.cur.xmin += xdelta;
so->v2d.cur.xmax += xdelta;
@@ -2405,13 +2408,13 @@ void outliner_show_selected(struct ScrArea *sa)
te= outliner_find_id(so, &so->tree, (ID *)OBACT);
if(te) {
/* make te->ys center of view */
- ytop= te->ys + (so->v2d.mask.ymax-so->v2d.mask.ymin)/2;
+ ytop= (int)(te->ys + (so->v2d.mask.ymax-so->v2d.mask.ymin)/2);
if(ytop>0) ytop= 0;
- so->v2d.cur.ymax= ytop;
- so->v2d.cur.ymin= ytop-(so->v2d.mask.ymax-so->v2d.mask.ymin);
+ so->v2d.cur.ymax= (float)ytop;
+ so->v2d.cur.ymin= (float)(ytop-(so->v2d.mask.ymax-so->v2d.mask.ymin));
/* make te->xs ==> te->xend center of view */
- xdelta = te->xs - so->v2d.cur.xmin;
+ xdelta = (int)(te->xs - so->v2d.cur.xmin);
so->v2d.cur.xmin += xdelta;
so->v2d.cur.xmax += xdelta;
@@ -2535,13 +2538,13 @@ void outliner_find_panel(struct ScrArea *sa, int again, int flags)
tselem->flag |= TSE_SELECTED;
/* make te->ys center of view */
- ytop= te->ys + (soops->v2d.mask.ymax-soops->v2d.mask.ymin)/2;
+ ytop= (int)(te->ys + (soops->v2d.mask.ymax-soops->v2d.mask.ymin)/2);
if(ytop>0) ytop= 0;
- soops->v2d.cur.ymax= ytop;
- soops->v2d.cur.ymin= ytop-(soops->v2d.mask.ymax-soops->v2d.mask.ymin);
+ soops->v2d.cur.ymax= (float)ytop;
+ soops->v2d.cur.ymin= (float)(ytop-(soops->v2d.mask.ymax-soops->v2d.mask.ymin));
/* make te->xs ==> te->xend center of view */
- xdelta = te->xs - soops->v2d.cur.xmin;
+ xdelta = (int)(te->xs - soops->v2d.cur.xmin);
soops->v2d.cur.xmin += xdelta;
soops->v2d.cur.xmax += xdelta;
@@ -2917,7 +2920,10 @@ static void outliner_do_object_operation(SpaceOops *soops, ListBase *lb,
if(tselem->type==0 && te->idcode==ID_OB) {
// when objects selected in other scenes... dunno if that should be allowed
Scene *sce= (Scene *)outliner_search_back(soops, te, ID_SCE);
- if(sce && G.scene != sce) set_scene(sce);
+ if(sce && G.scene != sce) {
+ set_scene(sce);
+ countall();
+ }
operation_cb(te, NULL, tselem);
}
@@ -3049,7 +3055,10 @@ void outliner_operation_menu(ScrArea *sa)
if(event==1) {
Scene *sce= G.scene; // to be able to delete, scenes are set...
outliner_do_object_operation(soops, &soops->tree, object_select_cb);
- if(G.scene != sce) set_scene(sce);
+ if(G.scene != sce) {
+ set_scene(sce);
+ countall();
+ }
str= "Select Objects";
}
@@ -3348,14 +3357,14 @@ static void outliner_draw_iconrow(SpaceOops *soops, ListBase *lb, int level, int
if(active) {
uiSetRoundBox(15);
glColor4ub(255, 255, 255, 100);
- uiRoundBox( (float)*offsx-0.5, (float)ys-1.0, (float)*offsx+OL_H-3.0, (float)ys+OL_H-3.0, OL_H/2.0-2.0);
+ uiRoundBox( (float)*offsx-0.5f, (float)ys-1.0f, (float)*offsx+OL_H-3.0f, (float)ys+OL_H-3.0f, OL_H/2.0f-2.0f);
glEnable(GL_BLEND);
}
- tselem_draw_icon(*offsx, ys, tselem, te);
- te->xs= *offsx;
- te->ys= ys;
- te->xend= *offsx+OL_X;
+ tselem_draw_icon((float)*offsx, (float)ys, tselem, te);
+ te->xs= (float)*offsx;
+ te->ys= (float)ys;
+ te->xend= (short)*offsx+OL_X;
te->flag |= TE_ICONROW; // for click
(*offsx) += OL_X;
@@ -3469,7 +3478,7 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
/* active circle */
if(active) {
uiSetRoundBox(15);
- uiRoundBox( (float)startx+OL_H-1.5, (float)*starty+2.0, (float)startx+2*OL_H-4.0, (float)*starty+OL_H-1.0, OL_H/2.0-2.0);
+ uiRoundBox( (float)startx+OL_H-1.5f, (float)*starty+2.0f, (float)startx+2.0f*OL_H-4.0f, (float)*starty+OL_H-1.0f, OL_H/2.0f-2.0f);
glEnable(GL_BLEND); /* roundbox disables it */
te->flag |= TE_ACTIVE; // for lookup in display hierarchies
@@ -3485,25 +3494,25 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
// icons a bit higher
if(tselem->flag & TSE_CLOSED)
- BIF_icon_draw(icon_x, *starty+2, ICON_TRIA_RIGHT);
+ BIF_icon_draw((float)icon_x, (float)*starty+2, ICON_TRIA_RIGHT);
else
- BIF_icon_draw(icon_x, *starty+2, ICON_TRIA_DOWN);
+ BIF_icon_draw((float)icon_x, (float)*starty+2, ICON_TRIA_DOWN);
}
offsx+= OL_X;
/* datatype icon */
// icons a bit higher
- tselem_draw_icon(startx+offsx, *starty+2, tselem, te);
+ tselem_draw_icon((float)startx+offsx, (float)*starty+2, tselem, te);
offsx+= OL_X;
if(tselem->type==0 && tselem->id->lib) {
- glPixelTransferf(GL_ALPHA_SCALE, 0.5);
+ glPixelTransferf(GL_ALPHA_SCALE, 0.5f);
if(tselem->id->flag & LIB_INDIRECT)
- BIF_icon_draw(startx+offsx, *starty+2, ICON_DATALIB);
+ BIF_icon_draw((float)startx+offsx, (float)*starty+2, ICON_DATALIB);
else
- BIF_icon_draw(startx+offsx, *starty+2, ICON_PARLIB);
- glPixelTransferf(GL_ALPHA_SCALE, 1.0);
+ BIF_icon_draw((float)startx+offsx, (float)*starty+2, ICON_PARLIB);
+ glPixelTransferf(GL_ALPHA_SCALE, 1.0f);
offsx+= OL_X;
}
glDisable(GL_BLEND);
@@ -3512,12 +3521,12 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
if(active==1) BIF_ThemeColor(TH_TEXT_HI);
else BIF_ThemeColor(TH_TEXT);
glRasterPos2i(startx+offsx, *starty+5);
- BIF_RasterPos(startx+offsx, *starty+5);
+ BIF_RasterPos((float)startx+offsx, (float)*starty+5);
#ifdef WITH_VERSE
if(te->name) {
#endif
BIF_DrawString(G.font, te->name, 0);
- offsx+= OL_X + BIF_GetStringWidth(G.font, te->name, 0);
+ offsx+= (int)(OL_X + BIF_GetStringWidth(G.font, te->name, 0));
#ifdef WITH_VERSE
}
#endif
@@ -3560,8 +3569,8 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
}
}
/* store coord and continue, we need coordinates for elements outside view too */
- te->xs= startx;
- te->ys= *starty;
+ te->xs= (float)startx;
+ te->ys= (float)*starty;
te->xend= startx+offsx;
*starty-= OL_H;
@@ -3641,17 +3650,17 @@ static void outliner_draw_tree(SpaceOops *soops)
// selection first
BIF_GetThemeColor3fv(TH_BACK, col);
glColor3f(col[0]+0.06f, col[1]+0.08f, col[2]+0.10f);
- starty= soops->v2d.tot.ymax-OL_H;
+ starty= (int)soops->v2d.tot.ymax-OL_H;
outliner_draw_selection(soops, &soops->tree, &starty);
// grey hierarchy lines
- BIF_ThemeColorBlend(TH_BACK, TH_TEXT, 0.2);
- starty= soops->v2d.tot.ymax-OL_H/2;
+ BIF_ThemeColorBlend(TH_BACK, TH_TEXT, 0.2f);
+ starty= (int)soops->v2d.tot.ymax-OL_H/2;
startx= 6;
outliner_draw_hierarchy(soops, &soops->tree, startx, &starty);
// items themselves
- starty= soops->v2d.tot.ymax-OL_H;
+ starty= (int)soops->v2d.tot.ymax-OL_H;
startx= 0;
for(te= soops->tree.first; te; te= te->next) {
outliner_draw_tree_element(soops, te, startx, &starty);
@@ -3664,7 +3673,7 @@ static void outliner_back(SpaceOops *soops)
int ystart;
BIF_ThemeColorShade(TH_BACK, 6);
- ystart= soops->v2d.tot.ymax;
+ ystart= (int)soops->v2d.tot.ymax;
ystart= OL_H*(ystart/(OL_H));
while(ystart > soops->v2d.cur.ymin) {
@@ -3679,10 +3688,10 @@ static void outliner_draw_restrictcols(SpaceOops *soops)
/* background underneath */
BIF_ThemeColor(TH_BACK);
- glRecti((int)soops->v2d.cur.xmax-OL_TOGW, soops->v2d.cur.ymin, (int)soops->v2d.cur.xmax, soops->v2d.cur.ymax);
+ glRecti((int)soops->v2d.cur.xmax-OL_TOGW, (int)soops->v2d.cur.ymin, (int)soops->v2d.cur.xmax, (int)soops->v2d.cur.ymax);
BIF_ThemeColorShade(TH_BACK, 6);
- ystart= soops->v2d.tot.ymax;
+ ystart= (int)soops->v2d.tot.ymax;
ystart= OL_H*(ystart/(OL_H));
while(ystart > soops->v2d.cur.ymin) {
@@ -3908,17 +3917,17 @@ static void outliner_draw_restrictbuts(uiBlock *block, SpaceOops *soops, ListBas
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_VIEW, REDRAWALL, ICON_RESTRICT_VIEW_OFF,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_view_cb, ob, NULL);
uiButSetFlag(bt, UI_NO_HILITE);
bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_SELECT, REDRAWALL, ICON_RESTRICT_SELECT_OFF,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
uiButSetFunc(bt, restrictbutton_sel_cb, ob, NULL);
uiButSetFlag(bt, UI_NO_HILITE);
bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_RENDER, REDRAWALL, ICON_RESTRICT_RENDER_OFF,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow renderability");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow renderability");
uiButSetFunc(bt, restrictbutton_rend_cb, NULL, NULL);
uiButSetFlag(bt, UI_NO_HILITE);
@@ -3929,7 +3938,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, SpaceOops *soops, ListBas
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOGN, SCE_LAY_DISABLE, REDRAWBUTSSCENE, ICON_CHECKBOX_HLT-1,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -3940,13 +3949,13 @@ static void outliner_draw_restrictbuts(uiBlock *block, SpaceOops *soops, ListBas
/* NOTE: tselem->nr is short! */
bt= uiDefIconButBitI(block, ICONTOG, tselem->nr, REDRAWBUTSSCENE, ICON_CHECKBOX_HLT-1,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
layflag++; /* is lay_xor */
if(ELEM6(tselem->nr, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_RADIO))
bt= uiDefIconButBitI(block, TOG, tselem->nr, REDRAWBUTSSCENE, (*layflag & tselem->nr)?ICON_DOT:ICON_BLANK1,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -3957,12 +3966,12 @@ static void outliner_draw_restrictbuts(uiBlock *block, SpaceOops *soops, ListBas
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOGN, eModifierMode_Realtime, REDRAWALL, ICON_RESTRICT_VIEW_OFF,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_modifier_cb, ob, NULL);
uiButSetFlag(bt, UI_NO_HILITE);
bt= uiDefIconButBitI(block, ICONTOGN, eModifierMode_Render, REDRAWALL, ICON_RESTRICT_RENDER_OFF,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow renderability");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow renderability");
uiButSetFunc(bt, restrictbutton_modifier_cb, ob, NULL);
uiButSetFlag(bt, UI_NO_HILITE);
}
@@ -3972,7 +3981,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, SpaceOops *soops, ListBas
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_P, REDRAWALL, ICON_RESTRICT_VIEW_OFF,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_bone_cb, NULL, NULL);
uiButSetFlag(bt, UI_NO_HILITE);
}
@@ -3981,7 +3990,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, SpaceOops *soops, ListBas
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_A, REDRAWALL, ICON_RESTRICT_VIEW_OFF,
- (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_bone_cb, NULL, NULL);
uiButSetFlag(bt, UI_NO_HILITE);
}
@@ -4013,10 +4022,10 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
else if(tselem->id && GS(tselem->id->name)==ID_LI) len = sizeof(((Library*) 0)->name);
else len= sizeof(((ID*) 0)->name)-2;
- dx= BIF_GetStringWidth(G.font, te->name, 0);
+ dx= (int)BIF_GetStringWidth(G.font, te->name, 0);
if(dx<50) dx= 50;
- bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", te->xs+2*OL_X-4, te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, "");
+ bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", (short)te->xs+2*OL_X-4, (short)te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, "");
uiButSetFunc(bt, namebutton_cb, te, NULL);
// signal for button to open
@@ -4061,27 +4070,27 @@ void draw_outliner(ScrArea *sa, SpaceOops *soops)
outliner_width(soops, &soops->tree, &sizex);
/* we init all tot rect vars, only really needed on window size change though */
- G.v2d->tot.xmin= 0.0;
- G.v2d->tot.xmax= (G.v2d->mask.xmax-G.v2d->mask.xmin);
+ G.v2d->tot.xmin= 0.0f;
+ G.v2d->tot.xmax= (float)(G.v2d->mask.xmax-G.v2d->mask.xmin);
if(soops->flag & SO_HIDE_RESTRICTCOLS) {
if(G.v2d->tot.xmax <= sizex)
- G.v2d->tot.xmax= 2*sizex;
+ G.v2d->tot.xmax= (float)2*sizex;
}
else {
if(G.v2d->tot.xmax-OL_TOGW <= sizex)
- G.v2d->tot.xmax= 2*sizex;
+ G.v2d->tot.xmax= (float)2*sizex;
}
- G.v2d->tot.ymax= 0.0;
- G.v2d->tot.ymin= -sizey*OL_H;
+ G.v2d->tot.ymax= 0.0f;
+ G.v2d->tot.ymin= (float)-sizey*OL_H;
test_view2d(G.v2d, sa->winx, sa->winy);
// align on top window if cur bigger than tot
if(G.v2d->cur.ymax-G.v2d->cur.ymin > sizey*OL_H) {
- G.v2d->cur.ymax= 0.0;
- G.v2d->cur.ymin= -(G.v2d->mask.ymax-G.v2d->mask.ymin);
+ G.v2d->cur.ymax= 0.0f;
+ G.v2d->cur.ymin= (float)-(G.v2d->mask.ymax-G.v2d->mask.ymin);
}
- myortho2(G.v2d->cur.xmin-0.375, G.v2d->cur.xmax-0.375, G.v2d->cur.ymin-0.375, G.v2d->cur.ymax-0.375);
+ myortho2(G.v2d->cur.xmin-0.375f, G.v2d->cur.xmax-0.375f, G.v2d->cur.ymin-0.375f, G.v2d->cur.ymax-0.375f);
/* draw outliner stuff (background and hierachy lines) */
outliner_back(soops);
@@ -4091,7 +4100,7 @@ void draw_outliner(ScrArea *sa, SpaceOops *soops)
mywinset(sa->win);
/* ortho corrected - 'pixel space' */
- myortho2(G.v2d->cur.xmin-SCROLLB-0.375, G.v2d->cur.xmax-0.375, G.v2d->cur.ymin-SCROLLH-0.375, G.v2d->cur.ymax-0.375);
+ myortho2(G.v2d->cur.xmin-SCROLLB-0.375f, G.v2d->cur.xmax-0.375f, G.v2d->cur.ymin-SCROLLH-0.375f, G.v2d->cur.ymax-0.375f);
/* draw icons and names */
block= uiNewBlock(&sa->uiblocks, "outliner buttons", UI_EMBOSS, UI_HELV, sa->win);
diff --git a/source/blender/src/parametrizer.c b/source/blender/src/parametrizer.c
index 7aa27f99d77..1cf796d86bc 100644
--- a/source/blender/src/parametrizer.c
+++ b/source/blender/src/parametrizer.c
@@ -998,7 +998,7 @@ static float p_edge_boundary_angle(PEdge *e)
static void p_chart_fill_boundary(PChart *chart, PEdge *be, int nedges)
{
PEdge *e, *e1, *e2;
- PHashKey vkeys[3];
+
PFace *f;
struct Heap *heap = BLI_heap_new();
float angle;
@@ -1036,9 +1036,9 @@ static void p_chart_fill_boundary(PChart *chart, PEdge *be, int nedges)
e->flag |= PEDGE_FILLED;
e1->flag |= PEDGE_FILLED;
- vkeys[0] = e->vert->u.key;
- vkeys[1] = e1->vert->u.key;
- vkeys[2] = e2->vert->u.key;
+
+
+
f = p_face_add_fill(chart, e->vert, e1->vert, e2->vert);
f->flag |= PFACE_FILLED;
@@ -1078,11 +1078,11 @@ static void p_chart_fill_boundary(PChart *chart, PEdge *be, int nedges)
static void p_chart_fill_boundaries(PChart *chart, PEdge *outer)
{
- PEdge *e, *enext, *be;
+ PEdge *e, *be; /* *enext - as yet unused */
int nedges;
for (e=chart->edges; e; e=e->nextlink) {
- enext = e->nextlink;
+ /* enext = e->nextlink; - as yet unused */
if (e->pair || (e->flag & PEDGE_FILLED))
continue;
@@ -3199,7 +3199,7 @@ static PBool p_chart_convex_hull(PChart *chart, PVert ***verts, int *nverts, int
return P_TRUE;
}
-float p_rectangle_area(float *p1, float *dir, float *p2, float *p3, float *p4)
+static float p_rectangle_area(float *p1, float *dir, float *p2, float *p3, float *p4)
{
/* given 4 points on the rectangle edges and the direction of on edge,
compute the area of the rectangle */
@@ -3342,7 +3342,7 @@ static float p_chart_minimum_area_angle(PChart *chart)
return minangle;
}
-void p_chart_rotate_minimum_area(PChart *chart)
+static void p_chart_rotate_minimum_area(PChart *chart)
{
float angle = p_chart_minimum_area_angle(chart);
float sine = sin(angle);
@@ -3541,7 +3541,7 @@ static float p_smooth_distortion(PEdge *e, float avg2d, float avg3d)
return (len3d == 0.0f)? 0.0f: len2d/len3d;
}
-void p_smooth(PChart *chart)
+static void p_smooth(PChart *chart)
{
PEdge *e;
PVert *v;
@@ -3964,7 +3964,7 @@ void param_construct_end(ParamHandle *handle, ParamBool fill, ParamBool impl)
for (i = j = 0; i < phandle->ncharts; i++) {
PVert *v;
- PChart *chart = phandle->charts[i];
+ chart = phandle->charts[i];
p_chart_boundaries(chart, &nboundaries, &outer);
diff --git a/source/blender/src/playanim.c b/source/blender/src/playanim.c
index 8421101f66c..8880380700d 100644
--- a/source/blender/src/playanim.c
+++ b/source/blender/src/playanim.c
@@ -191,6 +191,12 @@ static void toscreen(Pict *picture, struct ImBuf *ibuf)
printf("no ibuf !\n");
return;
}
+ if (ibuf->rect==NULL && ibuf->rect_float) {
+ IMB_rect_from_float(ibuf);
+ imb_freerectfloatImBuf(ibuf);
+ }
+ if (ibuf->rect==NULL)
+ return;
glRasterPos2f(0.0f, 0.0f);
diff --git a/source/blender/src/poselib.c b/source/blender/src/poselib.c
index ff54ad31e22..b819dd2a865 100644
--- a/source/blender/src/poselib.c
+++ b/source/blender/src/poselib.c
@@ -388,7 +388,7 @@ void poselib_add_current_pose (Object *ob, int val)
/* add missing ipo-curves and insert keys */
#define INSERT_KEY_ICU(adrcode, data) {\
icu= poselib_verify_icu(achan->ipo, adrcode); \
- insert_vert_icu(icu, frame, data, 1); \
+ insert_vert_icu(icu, (float)frame, data, 1); \
}
INSERT_KEY_ICU(AC_LOC_X, pchan->loc[0])
@@ -685,7 +685,7 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
if (ok) {
/* Evaluates and sets the internal ipo values */
- calc_ipo(achan->ipo, frame);
+ calc_ipo(achan->ipo, (float)frame);
/* This call also sets the pchan flags */
execute_action_ipo(achan, pchan);
}
diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c
index 19fb8dc2ecd..c2a2be80e89 100644
--- a/source/blender/src/poseobject.c
+++ b/source/blender/src/poseobject.c
@@ -213,6 +213,8 @@ int pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
bConstraint *con;
Bone *bone;
+ /* No need to check if constraint is active (has influence),
+ * since all constraints with CONSTRAINT_IK_AUTO are active */
for(con= pchan->constraints.first; con; con= con->next) {
if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
bKinematicConstraint *data= con->data;
@@ -1063,10 +1065,15 @@ void pose_remove_posegroup ()
/* get group to remove */
grp= BLI_findlink(&pose->agroups, pose->active_group-1);
if (grp) {
- /* firstly, make sure nothing references it */
+ /* adjust group references (the trouble of using indices!):
+ * - firstly, make sure nothing references it
+ * - also, make sure that those after this item get corrected
+ */
for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
if (pchan->agrp_index == pose->active_group)
pchan->agrp_index= 0;
+ else if (pchan->agrp_index > pose->active_group)
+ pchan->agrp_index--;
}
/* now, remove it from the pose */
@@ -1733,3 +1740,4 @@ void pose_flipquats(void)
autokeyframe_pose_cb_func(ob, TFM_ROTATION, 0);
}
+
diff --git a/source/blender/src/reeb.c b/source/blender/src/reeb.c
index 85fb5815c3e..5f80a2c7227 100644
--- a/source/blender/src/reeb.c
+++ b/source/blender/src/reeb.c
@@ -30,10 +30,13 @@
#include <stdio.h>
#include <stdlib.h> // for qsort
+#include "PIL_time.h"
+
#include "DNA_listBase.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_armature_types.h"
#include "MEM_guardedalloc.h"
@@ -41,14 +44,20 @@
#include "BLI_arithb.h"
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
+#include "BLI_ghash.h"
+#include "BLI_heap.h"
#include "BDR_editobject.h"
+#include "BMF_Api.h"
+
#include "BIF_editmesh.h"
#include "BIF_editarmature.h"
#include "BIF_interface.h"
#include "BIF_toolbox.h"
#include "BIF_graphics.h"
+#include "BIF_gl.h"
+#include "BIF_resources.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
@@ -60,6 +69,12 @@
#include "reeb.h"
+/* REPLACE WITH NEW ONE IN UTILDEFINES ONCE PATCH IS APPLIED */
+#define FTOCHAR(val) (val<=0.0f)? 0 : ((val>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*val)+0.5f))
+
+ReebGraph *GLOBAL_RG = NULL;
+ReebGraph *FILTERED_RG = NULL;
+
/*
* Skeleton generation algorithm based on:
* "Harmonic Skeleton for Realistic Character Animation"
@@ -72,11 +87,548 @@
* SIGGRAPH 2007
*
* */
+
+#define DEBUG_REEB
+#define DEBUG_REEB_NODE
+
+typedef struct VertexData
+{
+ float w; /* weight */
+ int i; /* index */
+ ReebNode *n;
+} VertexData;
+
+typedef struct EdgeIndex
+{
+ EditEdge **edges;
+ int *offset;
+} EdgeIndex;
+
+typedef enum {
+ MERGE_LOWER,
+ MERGE_HIGHER,
+ MERGE_APPEND
+} MergeDirection;
int mergeArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1);
+void mergeArcEdges(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc, MergeDirection direction);
int mergeConnectedArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1);
-EditEdge * NextEdgeForVert(EditMesh *em, EditVert *v);
+EditEdge * NextEdgeForVert(EdgeIndex *indexed_edges, int index);
+void mergeArcFaces(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc);
+void addFacetoArc(ReebArc *arc, EditFace *efa);
+
+void REEB_RadialSymmetry(BNode* root_node, RadialArc* ring, int count);
+void REEB_AxialSymmetry(BNode* root_node, BNode* node1, BNode* node2, struct BArc* barc1, BArc* barc2);
+
+void flipArcBuckets(ReebArc *arc);
+
+
+/***************************************** UTILS **********************************************/
+
+VertexData *allocVertexData(EditMesh *em)
+{
+ VertexData *data;
+ EditVert *eve;
+ int totvert, index;
+
+ totvert = BLI_countlist(&em->verts);
+
+ data = MEM_callocN(sizeof(VertexData) * totvert, "VertexData");
+
+ for(index = 0, eve = em->verts.first; eve; index++, eve = eve->next)
+ {
+ data[index].i = index;
+ data[index].w = 0;
+ eve->tmp.p = data + index;
+ }
+
+ return data;
+}
+
+int indexData(EditVert *eve)
+{
+ return ((VertexData*)eve->tmp.p)->i;
+}
+
+float weightData(EditVert *eve)
+{
+ return ((VertexData*)eve->tmp.p)->w;
+}
+
+void weightSetData(EditVert *eve, float w)
+{
+ ((VertexData*)eve->tmp.p)->w = w;
+}
+
+ReebNode* nodeData(EditVert *eve)
+{
+ return ((VertexData*)eve->tmp.p)->n;
+}
+
+void nodeSetData(EditVert *eve, ReebNode *n)
+{
+ ((VertexData*)eve->tmp.p)->n = n;
+}
+
+void REEB_freeArc(BArc *barc)
+{
+ ReebArc *arc = (ReebArc*)barc;
+ BLI_freelistN(&arc->edges);
+
+ if (arc->buckets)
+ MEM_freeN(arc->buckets);
+
+ if (arc->faces)
+ BLI_ghash_free(arc->faces, NULL, NULL);
+
+ MEM_freeN(arc);
+}
+
+void REEB_freeGraph(ReebGraph *rg)
+{
+ ReebArc *arc;
+ ReebNode *node;
+
+ // free nodes
+ for( node = rg->nodes.first; node; node = node->next )
+ {
+ BLI_freeNode((BGraph*)rg, (BNode*)node);
+ }
+ BLI_freelistN(&rg->nodes);
+
+ // free arcs
+ arc = rg->arcs.first;
+ while( arc )
+ {
+ ReebArc *next = arc->next;
+ REEB_freeArc((BArc*)arc);
+ arc = next;
+ }
+
+ // free edge map
+ BLI_edgehash_free(rg->emap, NULL);
+
+ /* free linked graph */
+ if (rg->link_up)
+ {
+ REEB_freeGraph(rg->link_up);
+ }
+
+ MEM_freeN(rg);
+}
+
+ReebGraph * newReebGraph()
+{
+ ReebGraph *rg;
+ rg = MEM_callocN(sizeof(ReebGraph), "reeb graph");
+
+ rg->totnodes = 0;
+ rg->emap = BLI_edgehash_new();
+
+
+ rg->free_arc = REEB_freeArc;
+ rg->free_node = NULL;
+ rg->radial_symmetry = REEB_RadialSymmetry;
+ rg->axial_symmetry = REEB_AxialSymmetry;
+
+ return rg;
+}
+
+void BIF_flagMultiArcs(ReebGraph *rg, int flag)
+{
+ for ( ; rg; rg = rg->link_up)
+ {
+ BLI_flagArcs((BGraph*)rg, flag);
+ }
+}
+
+ReebNode * addNode(ReebGraph *rg, EditVert *eve)
+{
+ float weight;
+ ReebNode *node = NULL;
+
+ weight = weightData(eve);
+
+ node = MEM_callocN(sizeof(ReebNode), "reeb node");
+
+ node->flag = 0; // clear flag on init
+ node->symmetry_level = 0;
+ node->arcs = NULL;
+ node->degree = 0;
+ node->weight = weight;
+ node->index = rg->totnodes;
+ VECCOPY(node->p, eve->co);
+
+ BLI_addtail(&rg->nodes, node);
+ rg->totnodes++;
+
+ nodeSetData(eve, node);
+
+ return node;
+}
+
+ReebNode * copyNode(ReebGraph *rg, ReebNode *node)
+{
+ ReebNode *cp_node = NULL;
+
+ cp_node = MEM_callocN(sizeof(ReebNode), "reeb node copy");
+
+ memcpy(cp_node, node, sizeof(ReebNode));
+
+ cp_node->prev = NULL;
+ cp_node->next = NULL;
+ cp_node->arcs = NULL;
+
+ cp_node->link_up = NULL;
+ cp_node->link_down = NULL;
+
+ BLI_addtail(&rg->nodes, cp_node);
+ rg->totnodes++;
+
+ return cp_node;
+}
+
+void relinkNodes(ReebGraph *low_rg, ReebGraph *high_rg)
+{
+ ReebNode *low_node, *high_node;
+
+ if (low_rg == NULL || high_rg == NULL)
+ {
+ return;
+ }
+
+ for (low_node = low_rg->nodes.first; low_node; low_node = low_node->next)
+ {
+ for (high_node = high_rg->nodes.first; high_node; high_node = high_node->next)
+ {
+ if (low_node->index == high_node->index)
+ {
+ high_node->link_down = low_node;
+ low_node->link_up = high_node;
+ break;
+ }
+ }
+ }
+}
+
+ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node)
+{
+ return (arc->head->index == node->index) ? arc->tail : arc->head;
+}
+
+ReebNode *BIF_NodeFromIndex(ReebArc *arc, ReebNode *node)
+{
+ return (arc->head->index == node->index) ? arc->head : arc->tail;
+}
+
+ReebNode *BIF_lowestLevelNode(ReebNode *node)
+{
+ while (node->link_down)
+ {
+ node = node->link_down;
+ }
+
+ return node;
+}
+
+ReebArc * copyArc(ReebGraph *rg, ReebArc *arc)
+{
+ ReebArc *cp_arc;
+ ReebNode *node;
+
+ cp_arc = MEM_callocN(sizeof(ReebArc), "reeb arc copy");
+
+ memcpy(cp_arc, arc, sizeof(ReebArc));
+
+ cp_arc->link_up = arc;
+
+ cp_arc->head = NULL;
+ cp_arc->tail = NULL;
+
+ cp_arc->prev = NULL;
+ cp_arc->next = NULL;
+
+ cp_arc->edges.first = NULL;
+ cp_arc->edges.last = NULL;
+
+ /* copy buckets */
+ cp_arc->buckets = MEM_callocN(sizeof(EmbedBucket) * cp_arc->bcount, "embed bucket");
+ memcpy(cp_arc->buckets, arc->buckets, sizeof(EmbedBucket) * cp_arc->bcount);
+
+ /* copy faces map */
+ cp_arc->faces = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ mergeArcFaces(rg, cp_arc, arc);
+
+ /* find corresponding head and tail */
+ for (node = rg->nodes.first; node && (cp_arc->head == NULL || cp_arc->tail == NULL); node = node->next)
+ {
+ if (node->index == arc->head->index)
+ {
+ cp_arc->head = node;
+ }
+ else if (node->index == arc->tail->index)
+ {
+ cp_arc->tail = node;
+ }
+ }
+
+ BLI_addtail(&rg->arcs, cp_arc);
+
+ return cp_arc;
+}
+
+ReebGraph * copyReebGraph(ReebGraph *rg, int level)
+{
+ ReebNode *node;
+ ReebArc *arc;
+ ReebGraph *cp_rg = newReebGraph();
+
+ cp_rg->resolution = rg->resolution;
+ cp_rg->length = rg->length;
+ cp_rg->link_up = rg;
+ cp_rg->multi_level = level;
+
+ /* Copy nodes */
+ for (node = rg->nodes.first; node; node = node->next)
+ {
+ ReebNode *cp_node = copyNode(cp_rg, node);
+ cp_node->multi_level = level;
+ }
+
+ /* Copy arcs */
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ copyArc(cp_rg, arc);
+ }
+
+ BLI_buildAdjacencyList((BGraph*)cp_rg);
+
+ return cp_rg;
+}
+
+ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node)
+{
+ ReebGraph *multi_rg = rg;
+
+ while(multi_rg && multi_rg->multi_level != node->multi_level)
+ {
+ multi_rg = multi_rg->link_up;
+ }
+
+ return multi_rg;
+}
+
+ReebEdge * copyEdge(ReebEdge *edge)
+{
+ ReebEdge *newEdge = NULL;
+
+ newEdge = MEM_callocN(sizeof(ReebEdge), "reeb edge");
+ memcpy(newEdge, edge, sizeof(ReebEdge));
+
+ newEdge->next = NULL;
+ newEdge->prev = NULL;
+
+ return newEdge;
+}
+
+void printArc(ReebArc *arc)
+{
+ ReebEdge *edge;
+ ReebNode *head = (ReebNode*)arc->head;
+ ReebNode *tail = (ReebNode*)arc->tail;
+ printf("arc: (%i) %f -> (%i) %f\n", head->index, head->weight, tail->index, tail->weight);
+
+ for(edge = arc->edges.first; edge ; edge = edge->next)
+ {
+ printf("\tedge (%i, %i)\n", edge->v1->index, edge->v2->index);
+ }
+}
+
+void flipArc(ReebArc *arc)
+{
+ ReebNode *tmp;
+ tmp = arc->head;
+ arc->head = arc->tail;
+ arc->tail = tmp;
+
+ flipArcBuckets(arc);
+}
+
+#ifdef DEBUG_REEB_NODE
+void NodeDegreeDecrement(ReebGraph *rg, ReebNode *node)
+{
+ node->degree--;
+
+// if (node->degree == 0)
+// {
+// printf("would remove node %i\n", node->index);
+// }
+}
+
+void NodeDegreeIncrement(ReebGraph *rg, ReebNode *node)
+{
+// if (node->degree == 0)
+// {
+// printf("first connect node %i\n", node->index);
+// }
+
+ node->degree++;
+}
+
+#else
+#define NodeDegreeDecrement(rg, node) {node->degree--;}
+#define NodeDegreeIncrement(rg, node) {node->degree++;}
+#endif
+void repositionNodes(ReebGraph *rg)
+{
+ BArc *arc = NULL;
+ BNode *node = NULL;
+
+ // Reset node positions
+ for(node = rg->nodes.first; node; node = node->next)
+ {
+ node->p[0] = node->p[1] = node->p[2] = 0;
+ }
+
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (((ReebArc*)arc)->bcount > 0)
+ {
+ float p[3];
+
+ VECCOPY(p, ((ReebArc*)arc)->buckets[0].p);
+ VecMulf(p, 1.0f / arc->head->degree);
+ VecAddf(arc->head->p, arc->head->p, p);
+
+ VECCOPY(p, ((ReebArc*)arc)->buckets[((ReebArc*)arc)->bcount - 1].p);
+ VecMulf(p, 1.0f / arc->tail->degree);
+ VecAddf(arc->tail->p, arc->tail->p, p);
+ }
+ }
+}
+
+void verifyNodeDegree(ReebGraph *rg)
+{
+#ifdef DEBUG_REEB
+ ReebNode *node = NULL;
+ ReebArc *arc = NULL;
+
+ for(node = rg->nodes.first; node; node = node->next)
+ {
+ int count = 0;
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->head == node || arc->tail == node)
+ {
+ count++;
+ }
+ }
+ if (count != node->degree)
+ {
+ printf("degree error in node %i: expected %i got %i\n", node->index, count, node->degree);
+ }
+ if (node->degree == 0)
+ {
+ printf("zero degree node %i with weight %f\n", node->index, node->weight);
+ }
+ }
+#endif
+}
+
+void verifyBucketsArc(ReebGraph *rg, ReebArc *arc)
+{
+ ReebNode *head = (ReebNode*)arc->head;
+ ReebNode *tail = (ReebNode*)arc->tail;
+
+ if (arc->bcount > 0)
+ {
+ int i;
+ for(i = 0; i < arc->bcount; i++)
+ {
+ if (arc->buckets[i].nv == 0)
+ {
+ printArc(arc);
+ printf("count error in bucket %i/%i\n", i+1, arc->bcount);
+ }
+ }
+
+ if (ceil(head->weight) != arc->buckets[0].val)
+ {
+ printArc(arc);
+ printf("alloc error in first bucket: %f should be %f \n", arc->buckets[0].val, ceil(head->weight));
+ }
+ if (floor(tail->weight) != arc->buckets[arc->bcount - 1].val)
+ {
+ printArc(arc);
+ printf("alloc error in last bucket: %f should be %f \n", arc->buckets[arc->bcount - 1].val, floor(tail->weight));
+ }
+ }
+}
+
+void verifyBuckets(ReebGraph *rg)
+{
+#ifdef DEBUG_REEB
+ ReebArc *arc = NULL;
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ verifyBucketsArc(rg, arc);
+ }
+#endif
+}
+
+void verifyFaces(ReebGraph *rg)
+{
+#ifdef DEBUG_REEB
+ int total = 0;
+ ReebArc *arc = NULL;
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ total += BLI_ghash_size(arc->faces);
+ }
+
+#endif
+}
+
+void verifyArcs(ReebGraph *rg)
+{
+ ReebArc *arc;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->head->weight > arc->tail->weight)
+ {
+ printf("FLIPPED ARC!\n");
+ }
+ }
+}
+
+void verifyMultiResolutionLinks(ReebGraph *rg, int level)
+{
+#ifdef DEBUG_REEB
+ ReebGraph *lower_rg = rg->link_up;
+
+ if (lower_rg)
+ {
+ ReebArc *arc;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (BLI_findindex(&lower_rg->arcs, arc->link_up) == -1)
+ {
+ printf("missing arc %p for level %i\n", arc->link_up, level);
+ printf("Source arc was ---\n");
+ printArc(arc);
+
+ arc->link_up = NULL;
+ }
+ }
+
+
+ verifyMultiResolutionLinks(lower_rg, level + 1);
+ }
+#endif
+}
/***************************************** BUCKET UTILS **********************************************/
void addVertToBucket(EmbedBucket *b, float co[3])
@@ -137,11 +689,30 @@ void mergeArcBuckets(ReebArc *aDst, ReebArc *aSrc, float start, float end)
}
}
+void flipArcBuckets(ReebArc *arc)
+{
+ int i, j;
+
+ for (i = 0, j = arc->bcount - 1; i < j; i++, j--)
+ {
+ EmbedBucket tmp;
+
+ tmp = arc->buckets[i];
+ arc->buckets[i] = arc->buckets[j];
+ arc->buckets[j] = tmp;
+ }
+}
+
+int countArcBuckets(ReebArc *arc)
+{
+ return (int)(floor(arc->tail->weight) - ceil(arc->head->weight)) + 1;
+}
+
void allocArcBuckets(ReebArc *arc)
{
int i;
- float start = ceil(arc->v1->weight);
- arc->bcount = (int)(floor(arc->v2->weight) - start) + 1;
+ float start = ceil(arc->head->weight);
+ arc->bcount = countArcBuckets(arc);
if (arc->bcount > 0)
{
@@ -164,6 +735,11 @@ void resizeArcBuckets(ReebArc *arc)
EmbedBucket *oldBuckets = arc->buckets;
int oldBCount = arc->bcount;
+ if (countArcBuckets(arc) == oldBCount)
+ {
+ return;
+ }
+
allocArcBuckets(arc);
if (oldBCount != 0 && arc->bcount != 0)
@@ -195,234 +771,394 @@ void resizeArcBuckets(ReebArc *arc)
MEM_freeN(oldBuckets);
}
}
-/***************************************** UTILS **********************************************/
-ReebEdge * copyEdge(ReebEdge *edge)
+void reweightBuckets(ReebArc *arc)
{
- ReebEdge *newEdge = NULL;
-
- newEdge = MEM_callocN(sizeof(ReebEdge), "reeb edge");
- memcpy(newEdge, edge, sizeof(ReebEdge));
-
- newEdge->next = NULL;
- newEdge->prev = NULL;
+ int i;
+ float start = ceil((arc->head)->weight);
- return newEdge;
+ if (arc->bcount > 0)
+ {
+ for(i = 0; i < arc->bcount; i++)
+ {
+ arc->buckets[i].val = start + i;
+ }
+ }
}
-void printArc(ReebArc *arc)
+static void interpolateBuckets(ReebArc *arc, float *start_p, float *end_p, int start_index, int end_index)
{
- ReebEdge *edge;
- printf("arc: (%i)%f -> (%i)%f\n", arc->v1->index, arc->v1->weight, arc->v2->index, arc->v2->weight);
+ int total;
+ int j;
- for(edge = arc->edges.first; edge ; edge = edge->next)
+ total = end_index - start_index + 2;
+
+ for (j = start_index; j <= end_index; j++)
{
- printf("\tedge (%i, %i)\n", edge->v1->index, edge->v2->index);
+ EmbedBucket *empty = arc->buckets + j;
+ empty->nv = 1;
+ VecLerpf(empty->p, start_p, end_p, (float)(j - start_index + 1) / total);
}
}
-void freeArc(ReebArc *arc)
+void fillArcEmptyBuckets(ReebArc *arc)
{
- BLI_freelistN(&arc->edges);
+ float *start_p, *end_p;
+ int start_index = 0, end_index = 0;
+ int missing = 0;
+ int i;
- if (arc->buckets)
- MEM_freeN(arc->buckets);
+ start_p = arc->head->p;
- MEM_freeN(arc);
+ for(i = 0; i < arc->bcount; i++)
+ {
+ EmbedBucket *bucket = arc->buckets + i;
+
+ if (missing)
+ {
+ if (bucket->nv > 0)
+ {
+ missing = 0;
+
+ end_p = bucket->p;
+ end_index = i - 1;
+
+ interpolateBuckets(arc, start_p, end_p, start_index, end_index);
+ }
+ }
+ else
+ {
+ if (bucket->nv == 0)
+ {
+ missing = 1;
+
+ if (i > 0)
+ {
+ start_p = arc->buckets[i - 1].p;
+ }
+ start_index = i;
+ }
+ }
+ }
+
+ if (missing)
+ {
+ end_p = arc->tail->p;
+ end_index = arc->bcount - 1;
+
+ interpolateBuckets(arc, start_p, end_p, start_index, end_index);
+ }
}
-void freeGraph(ReebGraph *rg)
+static void ExtendArcBuckets(ReebArc *arc)
{
- ReebArc *arc;
- ReebNode *node;
+ ReebArcIterator iter;
+ EmbedBucket *previous, *bucket, *last_bucket, *first_bucket;
+ float average_length = 0, length;
+ int padding_head = 0, padding_tail = 0;
- // free nodes
- for( node = rg->nodes.first; node; node = node->next )
+ if (arc->bcount == 0)
{
- // Free adjacency lists
- if (node->arcs != NULL)
- {
- MEM_freeN(node->arcs);
- }
+ return; /* failsafe, shouldn't happen */
}
- BLI_freelistN(&rg->nodes);
- // free arcs
- arc = rg->arcs.first;
- while( arc )
+ initArcIterator(&iter, arc, arc->head);
+
+ for ( previous = nextBucket(&iter), bucket = nextBucket(&iter);
+ bucket;
+ previous = bucket, bucket = nextBucket(&iter)
+ )
{
- ReebArc *next = arc->next;
- freeArc(arc);
- arc = next;
+ average_length += VecLenf(previous->p, bucket->p);
}
+ average_length /= (arc->bcount - 1);
- // free edge map
- BLI_edgehash_free(rg->emap, NULL);
+ first_bucket = arc->buckets;
+ last_bucket = arc->buckets + (arc->bcount - 1);
- MEM_freeN(rg);
-}
+ length = VecLenf(first_bucket->p, arc->head->p);
+ if (length > 2 * average_length)
+ {
+ padding_head = (int)floor(length / average_length);
+ }
-void repositionNodes(ReebGraph *rg)
-{
- ReebArc *arc = NULL;
- ReebNode *node = NULL;
+ length = VecLenf(last_bucket->p, arc->tail->p);
+ if (length > 2 * average_length)
+ {
+ padding_tail = (int)floor(length / average_length);
+ }
- // Reset node positions
- for(node = rg->nodes.first; node; node = node->next)
+ if (padding_head + padding_tail > 0)
{
- node->p[0] = node->p[1] = node->p[2] = 0;
+ EmbedBucket *old_buckets = arc->buckets;
+
+ arc->buckets = MEM_callocN(sizeof(EmbedBucket) * (padding_head + arc->bcount + padding_tail), "embed bucket");
+ memcpy(arc->buckets + padding_head, old_buckets, arc->bcount * sizeof(EmbedBucket));
+
+ arc->bcount = padding_head + arc->bcount + padding_tail;
+
+ MEM_freeN(old_buckets);
}
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ if (padding_head > 0)
{
- if (arc->bcount > 0)
- {
- float p[3];
-
- VECCOPY(p, arc->buckets[0].p);
- VecMulf(p, 1.0f / arc->v1->degree);
- VecAddf(arc->v1->p, arc->v1->p, p);
-
- VECCOPY(p, arc->buckets[arc->bcount - 1].p);
- VecMulf(p, 1.0f / arc->v2->degree);
- VecAddf(arc->v2->p, arc->v2->p, p);
- }
+ interpolateBuckets(arc, arc->head->p, first_bucket->p, 0, padding_head);
}
-}
-
-void verifyNodeDegree(ReebGraph *rg)
-{
- ReebNode *node = NULL;
- ReebArc *arc = NULL;
-
- for(node = rg->nodes.first; node; node = node->next)
+
+ if (padding_tail > 0)
{
- int count = 0;
- for(arc = rg->arcs.first; arc; arc = arc->next)
- {
- if (arc->v1 == node || arc->v2 == node)
- {
- count++;
- }
- }
- if (count != node->degree)
- {
- printf("degree error in node %i: expected %i got %i\n", node->index, count, node->degree);
- }
+ interpolateBuckets(arc, last_bucket->p, arc->tail->p, arc->bcount - padding_tail, arc->bcount - 1);
}
}
-void verifyBuckets(ReebGraph *rg)
+/* CALL THIS ONLY AFTER FILTERING, SINCE IT MESSES UP WEIGHT DISTRIBUTION */
+void extendGraphBuckets(ReebGraph *rg)
{
-#ifdef DEBUG_REEB
- ReebArc *arc = NULL;
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ ReebArc *arc;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
{
- if (arc->bcount > 0)
- {
- int i;
- for(i = 0; i < arc->bcount; i++)
- {
- if (arc->buckets[i].nv == 0)
- {
- printArc(arc);
- printf("count error in bucket %i/%i\n", i+1, arc->bcount);
- }
- }
-
- if (ceil(arc->v1->weight) < arc->buckets[0].val)
- {
- printArc(arc);
- printf("alloc error in first bucket: %f should be %f \n", arc->buckets[0].val, ceil(arc->v1->weight));
- }
- if (floor(arc->v2->weight) < arc->buckets[arc->bcount - 1].val)
- {
- printArc(arc);
- printf("alloc error in last bucket: %f should be %f \n", arc->buckets[arc->bcount - 1].val, floor(arc->v2->weight));
- }
- }
+ ExtendArcBuckets(arc);
}
-#endif
}
-/************************************** ADJACENCY LIST *************************************************/
+/**************************************** LENGTH CALCULATIONS ****************************************/
-void addArcToNodeAdjacencyList(ReebNode *node, ReebArc *arc)
+void calculateArcLength(ReebArc *arc)
{
- ReebArc **arclist;
+ ReebArcIterator iter;
+ EmbedBucket *bucket = NULL;
+ float *vec0, *vec1;
- for(arclist = node->arcs; *arclist; arclist++)
- { }
+ arc->length = 0;
- *arclist = arc;
-}
-
-void buildAdjacencyList(ReebGraph *rg)
-{
- ReebNode *node = NULL;
- ReebArc *arc = NULL;
+ initArcIterator(&iter, arc, arc->head);
- for(node = rg->nodes.first; node; node = node->next)
+ bucket = nextBucket(&iter);
+
+ vec0 = arc->head->p;
+ vec1 = arc->head->p; /* in case there's no embedding */
+
+ while (bucket != NULL)
{
- if (node->arcs != NULL)
- {
- MEM_freeN(node->arcs);
- }
+ vec1 = bucket->p;
+
+ arc->length += VecLenf(vec0, vec1);
- node->arcs = MEM_callocN((node->degree + 1) * sizeof(ReebArc*), "adjacency list");
+ vec0 = vec1;
+ bucket = nextBucket(&iter);
}
+
+ arc->length += VecLenf(arc->tail->p, vec1);
+}
- for(arc = rg->arcs.first; arc; arc= arc->next)
+void calculateGraphLength(ReebGraph *rg)
+{
+ ReebArc *arc;
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
{
- addArcToNodeAdjacencyList(arc->v1, arc);
- addArcToNodeAdjacencyList(arc->v2, arc);
+ calculateArcLength(arc);
}
}
-int hasAdjacencyList(ReebGraph *rg)
+/**************************************** SYMMETRY HANDLING ******************************************/
+
+void REEB_RadialSymmetry(BNode* root_node, RadialArc* ring, int count)
{
- ReebNode *node;
+ ReebNode *node = (ReebNode*)root_node;
+ float axis[3];
+ int i;
- for(node = rg->nodes.first; node; node = node->next)
+ VECCOPY(axis, root_node->symmetry_axis);
+
+ /* first pass, merge incrementally */
+ for (i = 0; i < count - 1; i++)
{
- if (node->arcs == NULL)
+ ReebNode *node1, *node2;
+ ReebArc *arc1, *arc2;
+ float tangent[3];
+ float normal[3];
+ int j = i + 1;
+
+ VecAddf(tangent, ring[i].n, ring[j].n);
+ Crossf(normal, tangent, axis);
+
+ node1 = (ReebNode*)BLI_otherNode(ring[i].arc, root_node);
+ node2 = (ReebNode*)BLI_otherNode(ring[j].arc, root_node);
+
+ arc1 = (ReebArc*)ring[i].arc;
+ arc2 = (ReebArc*)ring[j].arc;
+
+ /* mirror first node and mix with the second */
+ BLI_mirrorAlongAxis(node1->p, root_node->p, normal);
+ VecLerpf(node2->p, node2->p, node1->p, 1.0f / (j + 1));
+
+ /* Merge buckets
+ * there shouldn't be any null arcs here, but just to be safe
+ * */
+ if (arc1->bcount > 0 && arc2->bcount > 0)
{
- return 0;
+ ReebArcIterator iter1, iter2;
+ EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
+
+ initArcIterator(&iter1, arc1, (ReebNode*)root_node);
+ initArcIterator(&iter2, arc2, (ReebNode*)root_node);
+
+ bucket1 = nextBucket(&iter1);
+ bucket2 = nextBucket(&iter2);
+
+ /* Make sure they both start at the same value */
+ while(bucket1 && bucket1->val < bucket2->val)
+ {
+ bucket1 = nextBucket(&iter1);
+ }
+
+ while(bucket2 && bucket2->val < bucket1->val)
+ {
+ bucket2 = nextBucket(&iter2);
+ }
+
+
+ for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
+ {
+ bucket2->nv += bucket1->nv; /* add counts */
+
+ /* mirror on axis */
+ BLI_mirrorAlongAxis(bucket1->p, root_node->p, normal);
+ /* add bucket2 in bucket1 */
+ VecLerpf(bucket2->p, bucket2->p, bucket1->p, (float)bucket1->nv / (float)(bucket2->nv));
+ }
}
}
- return 1;
+ /* second pass, mirror back on previous arcs */
+ for (i = count - 1; i > 0; i--)
+ {
+ ReebNode *node1, *node2;
+ ReebArc *arc1, *arc2;
+ float tangent[3];
+ float normal[3];
+ int j = i - 1;
+
+ VecAddf(tangent, ring[i].n, ring[j].n);
+ Crossf(normal, tangent, axis);
+
+ node1 = (ReebNode*)BLI_otherNode(ring[i].arc, root_node);
+ node2 = (ReebNode*)BLI_otherNode(ring[j].arc, root_node);
+
+ arc1 = (ReebArc*)ring[i].arc;
+ arc2 = (ReebArc*)ring[j].arc;
+
+ /* copy first node than mirror */
+ VECCOPY(node2->p, node1->p);
+ BLI_mirrorAlongAxis(node2->p, root_node->p, normal);
+
+ /* Copy buckets
+ * there shouldn't be any null arcs here, but just to be safe
+ * */
+ if (arc1->bcount > 0 && arc2->bcount > 0)
+ {
+ ReebArcIterator iter1, iter2;
+ EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
+
+ initArcIterator(&iter1, arc1, node);
+ initArcIterator(&iter2, arc2, node);
+
+ bucket1 = nextBucket(&iter1);
+ bucket2 = nextBucket(&iter2);
+
+ /* Make sure they both start at the same value */
+ while(bucket1 && bucket1->val < bucket2->val)
+ {
+ bucket1 = nextBucket(&iter1);
+ }
+
+ while(bucket2 && bucket2->val < bucket1->val)
+ {
+ bucket2 = nextBucket(&iter2);
+ }
+
+
+ for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
+ {
+ /* copy and mirror back to bucket2 */
+ bucket2->nv = bucket1->nv;
+ VECCOPY(bucket2->p, bucket1->p);
+ BLI_mirrorAlongAxis(bucket2->p, node->p, normal);
+ }
+ }
+ }
}
-int countConnectedArcs(ReebGraph *rg, ReebNode *node)
+void REEB_AxialSymmetry(BNode* root_node, BNode* node1, BNode* node2, struct BArc* barc1, BArc* barc2)
{
- int count = 0;
+ ReebArc *arc1, *arc2;
+ float nor[3], p[3];
+
+ arc1 = (ReebArc*)barc1;
+ arc2 = (ReebArc*)barc2;
+
+ VECCOPY(nor, root_node->symmetry_axis);
- /* use adjacency list if present */
- if (node->arcs)
+ /* mirror node2 along axis */
+ VECCOPY(p, node2->p);
+ BLI_mirrorAlongAxis(p, root_node->p, nor);
+
+ /* average with node1 */
+ VecAddf(node1->p, node1->p, p);
+ VecMulf(node1->p, 0.5f);
+
+ /* mirror back on node2 */
+ VECCOPY(node2->p, node1->p);
+ BLI_mirrorAlongAxis(node2->p, root_node->p, nor);
+
+ /* Merge buckets
+ * there shouldn't be any null arcs here, but just to be safe
+ * */
+ if (arc1->bcount > 0 && arc2->bcount > 0)
{
- ReebArc **arcs;
+ ReebArcIterator iter1, iter2;
+ EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
+
+ initArcIterator(&iter1, arc1, (ReebNode*)root_node);
+ initArcIterator(&iter2, arc2, (ReebNode*)root_node);
+
+ bucket1 = nextBucket(&iter1);
+ bucket2 = nextBucket(&iter2);
- for(arcs = node->arcs; *arcs; arcs++)
+ /* Make sure they both start at the same value */
+ while(bucket1 && bucket1->val < bucket2->val)
{
- count++;
+ bucket1 = nextBucket(&iter1);
}
- }
- else
- {
- ReebArc *arc;
- for(arc = rg->arcs.first; arc; arc = arc->next)
+
+ while(bucket2 && bucket2->val < bucket1->val)
{
- if (arc->v1 == node || arc->v2 == node)
- {
- count++;
- }
+ bucket2 = nextBucket(&iter2);
+ }
+
+
+ for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
+ {
+ bucket1->nv += bucket2->nv; /* add counts */
+
+ /* mirror on axis */
+ BLI_mirrorAlongAxis(bucket2->p, root_node->p, nor);
+ /* add bucket2 in bucket1 */
+ VecLerpf(bucket1->p, bucket1->p, bucket2->p, (float)bucket2->nv / (float)(bucket1->nv));
+
+ /* copy and mirror back to bucket2 */
+ bucket2->nv = bucket1->nv;
+ VECCOPY(bucket2->p, bucket1->p);
+ BLI_mirrorAlongAxis(bucket2->p, root_node->p, nor);
}
}
-
- return count;
}
+/************************************** ADJACENCY LIST *************************************************/
+
+
/****************************************** SMOOTHING **************************************************/
void postprocessGraph(ReebGraph *rg, char mode)
@@ -492,12 +1228,14 @@ int compareArcsWeight(void *varc1, void *varc2)
{
ReebArc *arc1 = (ReebArc*)varc1;
ReebArc *arc2 = (ReebArc*)varc2;
+ ReebNode *node1 = (ReebNode*)arc1->head;
+ ReebNode *node2 = (ReebNode*)arc2->head;
- if (arc1->v1->weight < arc2->v1->weight)
+ if (node1->weight < node2->weight)
{
return -1;
}
- if (arc1->v1->weight > arc2->v1->weight)
+ if (node1->weight > node2->weight)
{
return 1;
}
@@ -511,15 +1249,235 @@ void sortArcs(ReebGraph *rg)
{
BLI_sortlist(&rg->arcs, compareArcsWeight);
}
+/******************************************* JOINING ***************************************************/
+
+void reweightArc(ReebGraph *rg, ReebArc *arc, ReebNode *start_node, float start_weight)
+{
+ ReebNode *node;
+ float old_weight;
+ float end_weight = start_weight + ABS(arc->tail->weight - arc->head->weight);
+ int i;
+
+ node = (ReebNode*)BLI_otherNode((BArc*)arc, (BNode*)start_node);
+
+ /* prevent backtracking */
+ if (node->flag == 1)
+ {
+ return;
+ }
+
+ if (arc->tail == start_node)
+ {
+ flipArc(arc);
+ }
+
+ start_node->flag = 1;
+
+ for (i = 0; i < node->degree; i++)
+ {
+ ReebArc *next_arc = node->arcs[i];
+
+ reweightArc(rg, next_arc, node, end_weight);
+ }
+
+ /* update only if needed */
+ if (arc->head->weight != start_weight || arc->tail->weight != end_weight)
+ {
+ old_weight = arc->head->weight; /* backup head weight, other arcs need it intact, it will be fixed by the source arc */
+
+ arc->head->weight = start_weight;
+ arc->tail->weight = end_weight;
+
+ reweightBuckets(arc);
+ resizeArcBuckets(arc);
+ fillArcEmptyBuckets(arc);
+
+ arc->head->weight = old_weight;
+ }
+}
+
+void reweightSubgraph(ReebGraph *rg, ReebNode *start_node, float start_weight)
+{
+ int i;
+
+ BLI_flagNodes((BGraph*)rg, 0);
+
+ for (i = 0; i < start_node->degree; i++)
+ {
+ ReebArc *next_arc = start_node->arcs[i];
+
+ reweightArc(rg, next_arc, start_node, start_weight);
+ }
+ start_node->weight = start_weight;
+}
+
+int joinSubgraphsEnds(ReebGraph *rg, float threshold, int nb_subgraphs)
+{
+ int joined = 0;
+ int subgraph;
+
+ for (subgraph = 1; subgraph <= nb_subgraphs; subgraph++)
+ {
+ ReebNode *start_node, *end_node;
+ ReebNode *min_node_start = NULL, *min_node_end = NULL;
+ float min_distance = FLT_MAX;
+
+ for (start_node = rg->nodes.first; start_node; start_node = start_node->next)
+ {
+ if (start_node->subgraph_index == subgraph && start_node->degree == 1)
+ {
+
+ for (end_node = rg->nodes.first; end_node; end_node = end_node->next)
+ {
+ if (end_node->subgraph_index != subgraph)
+ {
+ float distance = VecLenf(start_node->p, end_node->p);
+
+ if (distance < threshold && distance < min_distance)
+ {
+ min_distance = distance;
+ min_node_end = end_node;
+ min_node_start = start_node;
+ }
+ }
+ }
+ }
+ }
+
+ end_node = min_node_end;
+ start_node = min_node_start;
+
+ if (end_node && start_node)
+ {
+ ReebArc *start_arc, *end_arc;
+ int merging = 0;
+
+ start_arc = start_node->arcs[0];
+ end_arc = end_node->arcs[0];
+
+ if (start_arc->tail == start_node)
+ {
+ reweightSubgraph(rg, end_node, start_node->weight);
+
+ start_arc->tail = end_node;
+
+ merging = 1;
+ }
+ else if (start_arc->head == start_node)
+ {
+ reweightSubgraph(rg, start_node, end_node->weight);
+
+ start_arc->head = end_node;
+
+ merging = 2;
+ }
+
+ if (merging)
+ {
+ BLI_ReflagSubgraph((BGraph*)rg, end_node->flag, subgraph);
+
+ resizeArcBuckets(start_arc);
+ fillArcEmptyBuckets(start_arc);
+
+ NodeDegreeIncrement(rg, end_node);
+ BLI_rebuildAdjacencyListForNode((BGraph*)rg, (BNode*)end_node);
+
+ BLI_removeNode((BGraph*)rg, (BNode*)start_node);
+ }
+
+ joined = 1;
+ }
+ }
+
+ return joined;
+}
+
+/* Reweight graph from smallest node, fix fliped arcs */
+void fixSubgraphsOrientation(ReebGraph *rg, int nb_subgraphs)
+{
+ int subgraph;
+
+ for (subgraph = 1; subgraph <= nb_subgraphs; subgraph++)
+ {
+ ReebNode *node;
+ ReebNode *start_node = NULL;
+
+ for (node = rg->nodes.first; node; node = node->next)
+ {
+ if (node->subgraph_index == subgraph)
+ {
+ if (start_node == NULL || node->weight < start_node->weight)
+ {
+ start_node = node;
+ }
+ }
+ }
+
+ if (start_node)
+ {
+ reweightSubgraph(rg, start_node, start_node->weight);
+ }
+ }
+}
+
+int joinSubgraphs(ReebGraph *rg, float threshold)
+{
+ int nb_subgraphs;
+ int joined = 0;
+
+ BLI_buildAdjacencyList((BGraph*)rg);
+
+ if (BLI_isGraphCyclic((BGraph*)rg))
+ {
+ /* don't deal with cyclic graphs YET */
+ return 0;
+ }
+
+ /* sort nodes before flagging subgraphs to make sure root node is subgraph 0 */
+ sortNodes(rg);
+
+ nb_subgraphs = BLI_FlagSubgraphs((BGraph*)rg);
+
+ /* Harmonic function can create flipped arcs, take the occasion to fix them */
+ if (G.scene->toolsettings->skgen_options & SKGEN_HARMONIC)
+ {
+ fixSubgraphsOrientation(rg, nb_subgraphs);
+ }
+
+ if (nb_subgraphs > 1)
+ {
+ joined |= joinSubgraphsEnds(rg, threshold, nb_subgraphs);
+
+ if (joined)
+ {
+ removeNormalNodes(rg);
+ BLI_buildAdjacencyList((BGraph*)rg);
+ }
+ }
+
+ return joined;
+}
/****************************************** FILTERING **************************************************/
+float lengthArc(ReebArc *arc)
+{
+#if 0
+ ReebNode *head = (ReebNode*)arc->head;
+ ReebNode *tail = (ReebNode*)arc->tail;
+
+ return tail->weight - head->weight;
+#else
+ return arc->length;
+#endif
+}
+
int compareArcs(void *varc1, void *varc2)
{
ReebArc *arc1 = (ReebArc*)varc1;
ReebArc *arc2 = (ReebArc*)varc2;
- float len1 = arc1->v2->weight - arc1->v1->weight;
- float len2 = arc2->v2->weight - arc2->v1->weight;
+ float len1 = lengthArc(arc1);
+ float len2 = lengthArc(arc2);
if (len1 < len2)
{
@@ -539,12 +1497,17 @@ void filterArc(ReebGraph *rg, ReebNode *newNode, ReebNode *removedNode, ReebArc
{
ReebArc *arc = NULL, *nextArc = NULL;
- /* first pass, merge buckets for arcs that spawned the two nodes into the source arc*/
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ if (merging)
{
- if (arc->v1 == srcArc->v1 && arc->v2 == srcArc->v2 && arc != srcArc)
+ /* first pass, merge buckets for arcs that spawned the two nodes into the source arc*/
+ for(arc = rg->arcs.first; arc; arc = arc->next)
{
- mergeArcBuckets(srcArc, arc, srcArc->v1->weight, srcArc->v2->weight);
+ if (arc->head == srcArc->head && arc->tail == srcArc->tail && arc != srcArc)
+ {
+ ReebNode *head = srcArc->head;
+ ReebNode *tail = srcArc->tail;
+ mergeArcBuckets(srcArc, arc, head->weight, tail->weight);
+ }
}
}
@@ -554,48 +1517,52 @@ void filterArc(ReebGraph *rg, ReebNode *newNode, ReebNode *removedNode, ReebArc
{
nextArc = arc->next;
- if (arc->v1 == removedNode || arc->v2 == removedNode)
+ if (arc->head == removedNode || arc->tail == removedNode)
{
- if (arc->v1 == removedNode)
+ if (arc->head == removedNode)
{
- arc->v1 = newNode;
+ arc->head = newNode;
}
else
{
- arc->v2 = newNode;
+ arc->tail = newNode;
}
// Remove looped arcs
- if (arc->v1 == arc->v2)
+ if (arc->head == arc->tail)
{
// v1 or v2 was already newNode, since we're removing an arc, decrement degree
- newNode->degree--;
+ NodeDegreeDecrement(rg, newNode);
- // If it's safeArc, it'll be removed later, so keep it for now
+ // If it's srcArc, it'll be removed later, so keep it for now
if (arc != srcArc)
{
BLI_remlink(&rg->arcs, arc);
- freeArc(arc);
+ REEB_freeArc((BArc*)arc);
}
}
- // Remove flipped arcs
- else if (arc->v1->weight > arc->v2->weight)
- {
- // Decrement degree from the other node
- OTHER_NODE(arc, newNode)->degree--;
-
- BLI_remlink(&rg->arcs, arc);
- freeArc(arc);
- }
else
{
- newNode->degree++; // incrementing degree since we're adding an arc
+ /* flip arcs that flipped, can happen on diamond shapes, mostly on null arcs */
+ if (arc->head->weight > arc->tail->weight)
+ {
+ flipArc(arc);
+ }
+ //newNode->degree++; // incrementing degree since we're adding an arc
+ NodeDegreeIncrement(rg, newNode);
+ mergeArcFaces(rg, arc, srcArc);
if (merging)
{
+ ReebNode *head = arc->head;
+ ReebNode *tail = arc->tail;
+
// resize bucket list
resizeArcBuckets(arc);
- mergeArcBuckets(arc, srcArc, arc->v1->weight, arc->v2->weight);
+ mergeArcBuckets(arc, srcArc, head->weight, tail->weight);
+
+ /* update length */
+ arc->length += srcArc->length;
}
}
}
@@ -615,14 +1582,13 @@ void filterNullReebGraph(ReebGraph *rg)
// Only collapse arcs too short to have any embed bucket
if (arc->bcount == 0)
{
- ReebNode *newNode = arc->v1;
- ReebNode *removedNode = arc->v2;
+ ReebNode *newNode = (ReebNode*)arc->head;
+ ReebNode *removedNode = (ReebNode*)arc->tail;
float blend;
blend = (float)newNode->degree / (float)(newNode->degree + removedNode->degree); // blending factors
- //newNode->weight = FloatLerpf(newNode->weight, removedNode->weight, blend);
- VecLerpf(newNode->p, newNode->p, removedNode->p, blend);
+ VecLerpf(newNode->p, removedNode->p, newNode->p, blend);
filterArc(rg, newNode, removedNode, arc, 0);
@@ -630,130 +1596,300 @@ void filterNullReebGraph(ReebGraph *rg)
nextArc = arc->next;
BLI_remlink(&rg->arcs, arc);
- freeArc(arc);
+ REEB_freeArc((BArc*)arc);
- BLI_freelinkN(&rg->nodes, removedNode);
+ BLI_removeNode((BGraph*)rg, (BNode*)removedNode);
}
arc = nextArc;
}
}
-int filterInternalReebGraph(ReebGraph *rg, float threshold)
+int filterInternalExternalReebGraph(ReebGraph *rg, float threshold_internal, float threshold_external)
{
ReebArc *arc = NULL, *nextArc = NULL;
int value = 0;
BLI_sortlist(&rg->arcs, compareArcs);
-
- arc = rg->arcs.first;
- while(arc)
+
+ for (arc = rg->arcs.first; arc; arc = nextArc)
{
nextArc = arc->next;
// Only collapse non-terminal arcs that are shorter than threshold
- if ((arc->v1->degree > 1 && arc->v2->degree > 1 && arc->v2->weight - arc->v1->weight < threshold))
+ if (threshold_internal > 0 && arc->head->degree > 1 && arc->tail->degree > 1 && (lengthArc(arc) < threshold_internal))
{
ReebNode *newNode = NULL;
ReebNode *removedNode = NULL;
- /* Keep the node with the highestn number of connected arcs */
- if (arc->v1->degree >= arc->v2->degree)
+ /* Always remove lower node, so arcs don't flip */
+ newNode = arc->head;
+ removedNode = arc->tail;
+
+ filterArc(rg, newNode, removedNode, arc, 1);
+
+ // Reset nextArc, it might have changed
+ nextArc = arc->next;
+
+ BLI_remlink(&rg->arcs, arc);
+ REEB_freeArc((BArc*)arc);
+
+ BLI_removeNode((BGraph*)rg, (BNode*)removedNode);
+ value = 1;
+ }
+
+ // Only collapse terminal arcs that are shorter than threshold
+ else if (threshold_external > 0 && (arc->head->degree == 1 || arc->tail->degree == 1) && (lengthArc(arc) < threshold_external))
+ {
+ ReebNode *terminalNode = NULL;
+ ReebNode *middleNode = NULL;
+ ReebNode *removedNode = NULL;
+
+ // Assign terminal and middle nodes
+ if (arc->head->degree == 1)
{
- newNode = arc->v1;
- removedNode = arc->v2;
+ terminalNode = arc->head;
+ middleNode = arc->tail;
}
else
{
- newNode = arc->v2;
- removedNode = arc->v1;
+ terminalNode = arc->tail;
+ middleNode = arc->head;
}
- filterArc(rg, newNode, removedNode, arc, 1);
+ if (middleNode->degree == 2)
+ {
+#if 1
+ // If middle node is a normal node, it will be removed later
+ /* USE THIS IF YOU WANT TO PROLONG ARCS TO THEIR TERMINAL NODES
+ * FOR HANDS, THIS IS NOT THE BEST RESULT
+ * */
+ continue;
+#else
+ removedNode = terminalNode;
+
+ // removing arc, so we need to decrease the degree of the remaining node
+ NodeDegreeDecrement(rg, middleNode);
+#endif
+ }
+ // Otherwise, just plain remove of the arc
+ else
+ {
+ removedNode = terminalNode;
+
+ // removing arc, so we need to decrease the degree of the remaining node
+ NodeDegreeDecrement(rg, middleNode);
+ }
// Reset nextArc, it might have changed
nextArc = arc->next;
BLI_remlink(&rg->arcs, arc);
- freeArc(arc);
+ REEB_freeArc((BArc*)arc);
- BLI_freelinkN(&rg->nodes, removedNode);
+ BLI_removeNode((BGraph*)rg, (BNode*)removedNode);
value = 1;
}
-
- arc = nextArc;
}
return value;
}
-int filterExternalReebGraph(ReebGraph *rg, float threshold)
+int filterCyclesReebGraph(ReebGraph *rg, float distance_threshold)
+{
+ ReebArc *arc1, *arc2;
+ ReebArc *next2;
+ int filtered = 0;
+
+ for (arc1 = rg->arcs.first; arc1; arc1 = arc1->next)
+ {
+ for (arc2 = arc1->next; arc2; arc2 = next2)
+ {
+ next2 = arc2->next;
+ if (arc1 != arc2 && arc1->head == arc2->head && arc1->tail == arc2->tail)
+ {
+ mergeArcEdges(rg, arc1, arc2, MERGE_APPEND);
+ mergeArcFaces(rg, arc1, arc2);
+ mergeArcBuckets(arc1, arc2, arc1->head->weight, arc1->tail->weight);
+
+ NodeDegreeDecrement(rg, arc1->head);
+ NodeDegreeDecrement(rg, arc1->tail);
+
+ BLI_remlink(&rg->arcs, arc2);
+ REEB_freeArc((BArc*)arc2);
+
+ filtered = 1;
+ }
+ }
+ }
+
+ return filtered;
+}
+
+int filterSmartReebGraph(ReebGraph *rg, float threshold)
{
ReebArc *arc = NULL, *nextArc = NULL;
int value = 0;
BLI_sortlist(&rg->arcs, compareArcs);
+#ifdef DEBUG_REEB
+ {
+ EditFace *efa;
+ for(efa=G.editMesh->faces.first; efa; efa=efa->next) {
+ efa->tmp.fp = -1;
+ }
+ }
+#endif
+
arc = rg->arcs.first;
while(arc)
{
nextArc = arc->next;
+
+ /* need correct normals and center */
+ recalc_editnormals();
- // Only collapse terminal arcs that are shorter than threshold
- if ((arc->v1->degree == 1 || arc->v2->degree == 1) && arc->v2->weight - arc->v1->weight < threshold)
+ // Only test terminal arcs
+ if (arc->head->degree == 1 || arc->tail->degree == 1)
{
- ReebNode *terminalNode = NULL;
- ReebNode *middleNode = NULL;
- ReebNode *newNode = NULL;
- ReebNode *removedNode = NULL;
+ GHashIterator ghi;
int merging = 0;
+ int total = BLI_ghash_size(arc->faces);
+ float avg_angle = 0;
+ float avg_vec[3] = {0,0,0};
- // Assign terminal and middle nodes
- if (arc->v1->degree == 1)
- {
- terminalNode = arc->v1;
- middleNode = arc->v2;
- }
- else
+ for(BLI_ghashIterator_init(&ghi, arc->faces);
+ !BLI_ghashIterator_isDone(&ghi);
+ BLI_ghashIterator_step(&ghi))
{
- terminalNode = arc->v2;
- middleNode = arc->v1;
+ EditFace *efa = BLI_ghashIterator_getValue(&ghi);
+
+#if 0
+ ReebArcIterator iter;
+ EmbedBucket *bucket = NULL;
+ EmbedBucket *previous = NULL;
+ float min_distance = -1;
+ float angle = 0;
+
+ initArcIterator(&iter, arc, arc->head);
+
+ bucket = nextBucket(&iter);
+
+ while (bucket != NULL)
+ {
+ float *vec0 = NULL;
+ float *vec1 = bucket->p;
+ float midpoint[3], tangent[3];
+ float distance;
+
+ /* first bucket. Previous is head */
+ if (previous == NULL)
+ {
+ vec0 = arc->head->p;
+ }
+ /* Previous is a valid bucket */
+ else
+ {
+ vec0 = previous->p;
+ }
+
+ VECCOPY(midpoint, vec1);
+
+ distance = VecLenf(midpoint, efa->cent);
+
+ if (min_distance == -1 || distance < min_distance)
+ {
+ min_distance = distance;
+
+ VecSubf(tangent, vec1, vec0);
+ Normalize(tangent);
+
+ angle = Inpf(tangent, efa->n);
+ }
+
+ previous = bucket;
+ bucket = nextBucket(&iter);
+ }
+
+ avg_angle += saacos(fabs(angle));
+#ifdef DEBUG_REEB
+ efa->tmp.fp = saacos(fabs(angle));
+#endif
+#else
+ VecAddf(avg_vec, avg_vec, efa->n);
+#endif
}
+
+
+#if 0
+ avg_angle /= total;
+#else
+ VecMulf(avg_vec, 1.0 / total);
+ avg_angle = Inpf(avg_vec, avg_vec);
+#endif
- // If middle node is a normal node, merge to terminal node
- if (middleNode->degree == 2)
- {
+ arc->angle = avg_angle;
+
+ if (avg_angle > threshold)
merging = 1;
- newNode = terminalNode;
- removedNode = middleNode;
- }
- // Otherwise, just plain remove of the arc
- else
- {
- merging = 0;
- newNode = middleNode;
- removedNode = terminalNode;
- }
- // Merging arc
if (merging)
{
- filterArc(rg, newNode, removedNode, arc, 1);
- }
- else
- {
- // removing arc, so we need to decrease the degree of the remaining node
- newNode->degree--;
+ ReebNode *terminalNode = NULL;
+ ReebNode *middleNode = NULL;
+ ReebNode *newNode = NULL;
+ ReebNode *removedNode = NULL;
+ int merging = 0;
+
+ // Assign terminal and middle nodes
+ if (arc->head->degree == 1)
+ {
+ terminalNode = arc->head;
+ middleNode = arc->tail;
+ }
+ else
+ {
+ terminalNode = arc->tail;
+ middleNode = arc->head;
+ }
+
+ // If middle node is a normal node, merge to terminal node
+ if (middleNode->degree == 2)
+ {
+ merging = 1;
+ newNode = terminalNode;
+ removedNode = middleNode;
+ }
+ // Otherwise, just plain remove of the arc
+ else
+ {
+ merging = 0;
+ newNode = middleNode;
+ removedNode = terminalNode;
+ }
+
+ // Merging arc
+ if (merging)
+ {
+ filterArc(rg, newNode, removedNode, arc, 1);
+ }
+ else
+ {
+ // removing arc, so we need to decrease the degree of the remaining node
+ //newNode->degree--;
+ NodeDegreeDecrement(rg, newNode);
+ }
+
+ // Reset nextArc, it might have changed
+ nextArc = arc->next;
+
+ BLI_remlink(&rg->arcs, arc);
+ REEB_freeArc((BArc*)arc);
+
+ BLI_freelinkN(&rg->nodes, removedNode);
+ value = 1;
}
-
- // Reset nextArc, it might have changed
- nextArc = arc->next;
-
- BLI_remlink(&rg->arcs, arc);
- freeArc(arc);
-
- BLI_freelinkN(&rg->nodes, removedNode);
- value = 1;
}
arc = nextArc;
@@ -762,6 +1898,63 @@ int filterExternalReebGraph(ReebGraph *rg, float threshold)
return value;
}
+void filterGraph(ReebGraph *rg, short options, float threshold_internal, float threshold_external)
+{
+ int done = 1;
+
+ calculateGraphLength(rg);
+
+ if ((options & SKGEN_FILTER_EXTERNAL) == 0)
+ {
+ threshold_external = 0;
+ }
+
+ if ((options & SKGEN_FILTER_INTERNAL) == 0)
+ {
+ threshold_internal = 0;
+ }
+
+ if (threshold_internal > 0 || threshold_external > 0)
+ {
+ /* filter until there's nothing more to do */
+ while (done == 1)
+ {
+ done = 0; /* no work done yet */
+
+ done = filterInternalExternalReebGraph(rg, threshold_internal, threshold_external);
+ }
+ }
+
+ if (options & SKGEN_FILTER_SMART)
+ {
+ filterSmartReebGraph(rg, 0.5);
+ filterCyclesReebGraph(rg, 0.5);
+ }
+
+ repositionNodes(rg);
+
+ /* Filtering might have created degree 2 nodes, so remove them */
+ removeNormalNodes(rg);
+}
+
+void finalizeGraph(ReebGraph *rg, char passes, char method)
+{
+ int i;
+
+ BLI_buildAdjacencyList((BGraph*)rg);
+
+ sortNodes(rg);
+
+ sortArcs(rg);
+
+ for(i = 0; i < passes; i++)
+ {
+ postprocessGraph(rg, method);
+ }
+
+ extendGraphBuckets(rg);
+}
+
/************************************** WEIGHT SPREADING ***********************************************/
int compareVerts( const void* a, const void* b )
@@ -770,11 +1963,11 @@ int compareVerts( const void* a, const void* b )
EditVert *vb = *(EditVert**)b;
int value = 0;
- if (va->tmp.fp < vb->tmp.fp)
+ if (weightData(va) < weightData(vb))
{
value = -1;
}
- else if (va->tmp.fp > vb->tmp.fp)
+ else if (weightData(va) > weightData(vb))
{
value = 1;
}
@@ -806,109 +1999,21 @@ void spreadWeight(EditMesh *em)
{
eve = verts[i];
- if (i == 0 || (eve->tmp.fp - lastWeight) > FLT_EPSILON)
+ if (i == 0 || (weightData(eve) - lastWeight) > FLT_EPSILON)
{
- lastWeight = eve->tmp.fp;
+ lastWeight = weightData(eve);
}
else
{
work_needed = 1;
- eve->tmp.fp = lastWeight + FLT_EPSILON * 2;
- lastWeight = eve->tmp.fp;
+ weightSetData(eve, lastWeight + FLT_EPSILON * 2);
+ lastWeight = weightData(eve);
}
}
}
MEM_freeN(verts);
}
-/*********************************** GRAPH AS TREE FUNCTIONS *******************************************/
-
-int subtreeDepth(ReebNode *node, ReebArc *rootArc)
-{
- int depth = 0;
-
- /* Base case, no arcs leading away */
- if (node->arcs == NULL || *(node->arcs) == NULL)
- {
- return 0;
- }
- else
- {
- ReebArc ** pArc;
-
- for(pArc = node->arcs; *pArc; pArc++)
- {
- ReebArc *arc = *pArc;
-
- /* only arcs that go down the tree */
- if (arc != rootArc)
- {
- ReebNode *newNode = OTHER_NODE(arc, node);
- depth = MAX2(depth, subtreeDepth(newNode, arc));
- }
- }
- }
-
- return depth + 1;
-}
-
-/*************************************** CYCLE DETECTION ***********************************************/
-
-int detectCycle(ReebNode *node, ReebArc *srcArc)
-{
- int value = 0;
-
- if (node->flags == 0)
- {
- ReebArc ** pArc;
-
- /* mark node as visited */
- node->flags = 1;
-
- for(pArc = node->arcs; *pArc && value == 0; pArc++)
- {
- ReebArc *arc = *pArc;
-
- /* don't go back on the source arc */
- if (arc != srcArc)
- {
- value = detectCycle(OTHER_NODE(arc, node), arc);
- }
- }
- }
- else
- {
- value = 1;
- }
-
- return value;
-}
-
-int isGraphCyclic(ReebGraph *rg)
-{
- ReebNode *node;
- int value = 0;
-
- /* NEED TO CHECK IF ADJACENCY LIST EXIST */
-
- /* Mark all nodes as not visited */
- for(node = rg->nodes.first; node; node = node->next)
- {
- node->flags = 0;
- }
-
- /* detectCycles in subgraphs */
- for(node = rg->nodes.first; node && value == 0; node = node->next)
- {
- /* only for nodes in subgraphs that haven't been visited yet */
- if (node->flags == 0)
- {
- value = value || detectCycle(node, NULL);
- }
- }
-
- return value;
-}
/******************************************** EXPORT ***************************************************/
@@ -917,9 +2022,8 @@ void exportNode(FILE *f, char *text, ReebNode *node)
fprintf(f, "%s i:%i w:%f d:%i %f %f %f\n", text, node->index, node->weight, node->degree, node->p[0], node->p[1], node->p[2]);
}
-void exportGraph(ReebGraph *rg, int count)
+void REEB_exportGraph(ReebGraph *rg, int count)
{
-#ifdef DEBUG_REEB
ReebArc *arc;
char filename[128];
FILE *f;
@@ -937,78 +2041,107 @@ void exportGraph(ReebGraph *rg, int count)
for(arc = rg->arcs.first; arc; arc = arc->next)
{
int i;
+ float p[3];
- exportNode(f, "v1", arc->v1);
+ exportNode(f, "v1", arc->head);
for(i = 0; i < arc->bcount; i++)
{
fprintf(f, "b nv:%i %f %f %f\n", arc->buckets[i].nv, arc->buckets[i].p[0], arc->buckets[i].p[1], arc->buckets[i].p[2]);
}
- exportNode(f, "v2", arc->v2);
+ VecAddf(p, arc->tail->p, arc->head->p);
+ VecMulf(p, 0.5f);
+
+ fprintf(f, "angle %0.3f %0.3f %0.3f %0.3f %i\n", p[0], p[1], p[2], arc->angle, BLI_ghash_size(arc->faces));
+ exportNode(f, "v2", arc->tail);
}
fclose(f);
-#endif
}
/***************************************** MAIN ALGORITHM **********************************************/
-ReebArc * findConnectedArc(ReebGraph *rg, ReebArc *arc, ReebNode *v)
+/* edges alone will create zero degree nodes, use this function to remove them */
+void removeZeroNodes(ReebGraph *rg)
{
- ReebArc *nextArc = arc->next;
+ ReebNode *node, *next_node;
- for(nextArc = rg->arcs.first; nextArc; nextArc = nextArc->next)
+ for (node = rg->nodes.first; node; node = next_node)
{
- if (arc != nextArc && (nextArc->v1 == v || nextArc->v2 == v))
+ next_node = node->next;
+
+ if (node->degree == 0)
{
- break;
+ BLI_removeNode((BGraph*)rg, (BNode*)node);
}
}
-
- return nextArc;
}
void removeNormalNodes(ReebGraph *rg)
{
- ReebArc *arc;
+ ReebArc *arc, *nextArc;
// Merge degree 2 nodes
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ for(arc = rg->arcs.first; arc; arc = nextArc)
{
- while (arc->v1->degree == 2 || arc->v2->degree == 2)
+ nextArc = arc->next;
+
+ while (arc->head->degree == 2 || arc->tail->degree == 2)
{
// merge at v1
- if (arc->v1->degree == 2)
+ if (arc->head->degree == 2)
{
- ReebArc *nextArc = findConnectedArc(rg, arc, arc->v1);
+ ReebArc *connectedArc = (ReebArc*)BLI_findConnectedArc((BGraph*)rg, (BArc*)arc, (BNode*)arc->head);
- // Merge arc only if needed
- if (arc->v1 == nextArc->v2)
- {
- mergeConnectedArcs(rg, arc, nextArc);
+ /* If arcs are one after the other */
+ if (arc->head == connectedArc->tail)
+ {
+ /* remove furthest arc */
+ if (arc->tail->weight < connectedArc->head->weight)
+ {
+ mergeConnectedArcs(rg, arc, connectedArc);
+ nextArc = arc->next;
+ }
+ else
+ {
+ mergeConnectedArcs(rg, connectedArc, arc);
+ break; /* arc was removed, move to next */
+ }
}
- // Otherwise, mark down vert
+ /* Otherwise, arcs are side by side */
else
{
- arc->v1->degree = 3;
+ /* Don't do anything, we need to keep the lowest node, even if degree 2 */
+ break;
}
}
// merge at v2
- if (arc->v2->degree == 2)
+ if (arc->tail->degree == 2)
{
- ReebArc *nextArc = findConnectedArc(rg, arc, arc->v2);
+ ReebArc *connectedArc = (ReebArc*)BLI_findConnectedArc((BGraph*)rg, (BArc*)arc, (BNode*)arc->tail);
- // Merge arc only if needed
- if (arc->v2 == nextArc->v1)
+ /* If arcs are one after the other */
+ if (arc->tail == connectedArc->head)
{
- mergeConnectedArcs(rg, arc, nextArc);
+ /* remove furthest arc */
+ if (arc->head->weight < connectedArc->tail->weight)
+ {
+ mergeConnectedArcs(rg, arc, connectedArc);
+ nextArc = arc->next;
+ }
+ else
+ {
+ mergeConnectedArcs(rg, connectedArc, arc);
+ break; /* arc was removed, move to next */
+ }
}
- // Otherwise, mark down vert
+ /* Otherwise, arcs are side by side */
else
{
- arc->v2->degree = 3;
+ /* Don't do anything, we need to keep the lowest node, even if degree 2 */
+ break;
}
}
}
@@ -1041,11 +2174,23 @@ ReebArc *nextArcMappedToEdge(ReebArc *arc, ReebEdge *e)
return result;
}
-typedef enum {
- MERGE_LOWER,
- MERGE_HIGHER,
- MERGE_APPEND
-} MergeDirection;
+void addFacetoArc(ReebArc *arc, EditFace *efa)
+{
+ BLI_ghash_insert(arc->faces, efa, efa);
+}
+
+void mergeArcFaces(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc)
+{
+ GHashIterator ghi;
+
+ for(BLI_ghashIterator_init(&ghi, aSrc->faces);
+ !BLI_ghashIterator_isDone(&ghi);
+ BLI_ghashIterator_step(&ghi))
+ {
+ EditFace *efa = BLI_ghashIterator_getValue(&ghi);
+ BLI_ghash_insert(aDst->faces, efa, efa);
+ }
+}
void mergeArcEdges(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc, MergeDirection direction)
{
@@ -1109,29 +2254,32 @@ int mergeConnectedArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1)
int result = 0;
ReebNode *removedNode = NULL;
+ a0->length += a1->length;
+
mergeArcEdges(rg, a0, a1, MERGE_APPEND);
+ mergeArcFaces(rg, a0, a1);
// Bring a0 to the combine length of both arcs
- if (a0->v2 == a1->v1)
+ if (a0->tail == a1->head)
{
- removedNode = a0->v2;
- a0->v2 = a1->v2;
+ removedNode = a0->tail;
+ a0->tail = a1->tail;
}
- else if (a0->v1 == a1->v2)
+ else if (a0->head == a1->tail)
{
- removedNode = a0->v1;
- a0->v1 = a1->v1;
+ removedNode = a0->head;
+ a0->head = a1->head;
}
resizeArcBuckets(a0);
// Merge a1 in a0
- mergeArcBuckets(a0, a1, a0->v1->weight, a0->v2->weight);
+ mergeArcBuckets(a0, a1, a0->head->weight, a0->tail->weight);
// remove a1 from graph
BLI_remlink(&rg->arcs, a1);
- freeArc(a1);
+ REEB_freeArc((BArc*)a1);
- BLI_freelinkN(&rg->nodes, removedNode);
+ BLI_removeNode((BGraph*)rg, (BNode*)removedNode);
result = 1;
return result;
@@ -1141,74 +2289,89 @@ int mergeArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1)
{
int result = 0;
// TRIANGLE POINTS DOWN
- if (a0->v1->weight == a1->v1->weight) // heads are the same
+ if (a0->head->weight == a1->head->weight) // heads are the same
{
- if (a0->v2->weight == a1->v2->weight) // tails also the same, arcs can be totally merge together
+ if (a0->tail->weight == a1->tail->weight) // tails also the same, arcs can be totally merge together
{
mergeArcEdges(rg, a0, a1, MERGE_APPEND);
+ mergeArcFaces(rg, a0, a1);
- mergeArcBuckets(a0, a1, a0->v1->weight, a0->v2->weight);
+ mergeArcBuckets(a0, a1, a0->head->weight, a0->tail->weight);
// Adjust node degree
- a1->v1->degree--;
- a1->v2->degree--;
+ //a1->head->degree--;
+ NodeDegreeDecrement(rg, a1->head);
+ //a1->tail->degree--;
+ NodeDegreeDecrement(rg, a1->tail);
// remove a1 from graph
BLI_remlink(&rg->arcs, a1);
- freeArc(a1);
+ REEB_freeArc((BArc*)a1);
result = 1;
}
- else if (a0->v2->weight > a1->v2->weight) // a1->v2->weight is in the middle
+ else if (a0->tail->weight > a1->tail->weight) // a1->tail->weight is in the middle
{
mergeArcEdges(rg, a1, a0, MERGE_LOWER);
+ mergeArcFaces(rg, a1, a0);
// Adjust node degree
- a0->v1->degree--;
- a1->v2->degree++;
+ //a0->head->degree--;
+ NodeDegreeDecrement(rg, a0->head);
+ //a1->tail->degree++;
+ NodeDegreeIncrement(rg, a1->tail);
- mergeArcBuckets(a1, a0, a1->v1->weight, a1->v2->weight);
- a0->v1 = a1->v2;
+ mergeArcBuckets(a1, a0, a1->head->weight, a1->tail->weight);
+ a0->head = a1->tail;
resizeArcBuckets(a0);
}
else // a0>n2 is in the middle
{
mergeArcEdges(rg, a0, a1, MERGE_LOWER);
+ mergeArcFaces(rg, a0, a1);
// Adjust node degree
- a1->v1->degree--;
- a0->v2->degree++;
+ //a1->head->degree--;
+ NodeDegreeDecrement(rg, a1->head);
+ //a0->tail->degree++;
+ NodeDegreeIncrement(rg, a0->tail);
- mergeArcBuckets(a0, a1, a0->v1->weight, a0->v2->weight);
- a1->v1 = a0->v2;
+ mergeArcBuckets(a0, a1, a0->head->weight, a0->tail->weight);
+ a1->head = a0->tail;
resizeArcBuckets(a1);
}
}
// TRIANGLE POINTS UP
- else if (a0->v2->weight == a1->v2->weight) // tails are the same
+ else if (a0->tail->weight == a1->tail->weight) // tails are the same
{
- if (a0->v1->weight > a1->v1->weight) // a0->v1->weight is in the middle
+ if (a0->head->weight > a1->head->weight) // a0->head->weight is in the middle
{
mergeArcEdges(rg, a0, a1, MERGE_HIGHER);
+ mergeArcFaces(rg, a0, a1);
// Adjust node degree
- a1->v2->degree--;
- a0->v1->degree++;
+ //a1->tail->degree--;
+ NodeDegreeDecrement(rg, a1->tail);
+ //a0->head->degree++;
+ NodeDegreeIncrement(rg, a0->head);
- mergeArcBuckets(a0, a1, a0->v1->weight, a0->v2->weight);
- a1->v2 = a0->v1;
+ mergeArcBuckets(a0, a1, a0->head->weight, a0->tail->weight);
+ a1->tail = a0->head;
resizeArcBuckets(a1);
}
- else // a1->v1->weight is in the middle
+ else // a1->head->weight is in the middle
{
mergeArcEdges(rg, a1, a0, MERGE_HIGHER);
+ mergeArcFaces(rg, a1, a0);
// Adjust node degree
- a0->v2->degree--;
- a1->v1->degree++;
+ //a0->tail->degree--;
+ NodeDegreeDecrement(rg, a0->tail);
+ //a1->head->degree++;
+ NodeDegreeIncrement(rg, a1->head);
- mergeArcBuckets(a1, a0, a1->v1->weight, a1->v2->weight);
- a0->v2 = a1->v1;
+ mergeArcBuckets(a1, a0, a1->head->weight, a1->tail->weight);
+ a0->tail = a1->head;
resizeArcBuckets(a0);
}
}
@@ -1229,7 +2392,7 @@ void glueByMergeSort(ReebGraph *rg, ReebArc *a0, ReebArc *a1, ReebEdge *e0, Reeb
if (total == 0) // if it wasn't a total merge, go forward
{
- if (a0->v2->weight < a1->v2->weight)
+ if (a0->tail->weight < a1->tail->weight)
{
a0 = nextArcMappedToEdge(a0, e0);
}
@@ -1252,25 +2415,6 @@ void mergePaths(ReebGraph *rg, ReebEdge *e0, ReebEdge *e1, ReebEdge *e2)
glueByMergeSort(rg, a0, a2, e0, e2);
}
-ReebNode * addNode(ReebGraph *rg, EditVert *eve, float weight)
-{
- ReebNode *node = NULL;
-
- node = MEM_callocN(sizeof(ReebNode), "reeb node");
-
- node->flags = 0; // clear flags on init
- node->arcs = NULL;
- node->degree = 0;
- node->weight = weight;
- node->index = rg->totnodes;
- VECCOPY(node->p, eve->co);
-
- BLI_addtail(&rg->nodes, node);
- rg->totnodes++;
-
- return node;
-}
-
ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
{
ReebEdge *edge;
@@ -1288,7 +2432,9 @@ ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
arc = MEM_callocN(sizeof(ReebArc), "reeb arc");
edge = MEM_callocN(sizeof(ReebEdge), "reeb edge");
- arc->flags = 0; // clear flags on init
+ arc->flag = 0; // clear flag on init
+ arc->symmetry_level = 0;
+ arc->faces = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
if (node1->weight <= node2->weight)
{
@@ -1301,12 +2447,14 @@ ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
v2 = node1;
}
- arc->v1 = v1;
- arc->v2 = v2;
+ arc->head = v1;
+ arc->tail = v2;
// increase node degree
- v1->degree++;
- v2->degree++;
+ //v1->degree++;
+ NodeDegreeIncrement(rg, v1);
+ //v2->degree++;
+ NodeDegreeIncrement(rg, v2);
BLI_edgehash_insert(rg->emap, node1->index, node2->index, edge);
@@ -1321,8 +2469,8 @@ ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
/* adding buckets for embedding */
allocArcBuckets(arc);
- offset = arc->v1->weight;
- len = arc->v2->weight - arc->v1->weight;
+ offset = arc->head->weight;
+ len = arc->tail->weight - arc->head->weight;
#if 0
/* This is the actual embedding filling described in the paper
@@ -1330,8 +2478,8 @@ ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
*/
if (arc->bcount > 0)
{
- addVertToBucket(&(arc->buckets[0]), arc->v1->co);
- addVertToBucket(&(arc->buckets[arc->bcount - 1]), arc->v2->co);
+ addVertToBucket(&(arc->buckets[0]), arc->head->co);
+ addVertToBucket(&(arc->buckets[arc->bcount - 1]), arc->tail->co);
}
#else
for(i = 0; i < arc->bcount; i++)
@@ -1349,7 +2497,7 @@ ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
return edge;
}
-void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode * n3)
+void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode * n3, EditFace *efa)
{
ReebEdge *re1, *re2, *re3;
ReebEdge *e1, *e2, *e3;
@@ -1359,6 +2507,10 @@ void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode *
re2 = createArc(rg, n2, n3);
re3 = createArc(rg, n3, n1);
+ addFacetoArc(re1->arc, efa);
+ addFacetoArc(re2->arc, efa);
+ addFacetoArc(re3->arc, efa);
+
len1 = (float)fabs(n1->weight - n2->weight);
len2 = (float)fabs(n2->weight - n3->weight);
len3 = (float)fabs(n3->weight - n1->weight);
@@ -1401,7 +2553,6 @@ void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode *
ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
{
ReebGraph *rg;
- struct DynamicList * dlist;
EditVert *eve;
EditFace *efa;
int index;
@@ -1412,10 +2563,9 @@ ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
int countfaces = 0;
#endif
- rg = MEM_callocN(sizeof(ReebGraph), "reeb graph");
+ rg = newReebGraph();
- rg->totnodes = 0;
- rg->emap = BLI_edgehash_new();
+ rg->resolution = subdivisions;
totvert = BLI_countlist(&em->verts);
totfaces = BLI_countlist(&em->faces);
@@ -1425,47 +2575,50 @@ ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
/* Spread weight to minimize errors */
spreadWeight(em);
- renormalizeWeight(em, (float)subdivisions);
+ renormalizeWeight(em, (float)rg->resolution);
/* Adding vertice */
- for(index = 0, eve = em->verts.first; eve; index++, eve = eve->next)
+ for(index = 0, eve = em->verts.first; eve; eve = eve->next)
{
- eve->hash = index;
- eve->f2 = 0;
- eve->tmp.p = addNode(rg, eve, eve->tmp.fp);
+ if (eve->h == 0)
+ {
+ addNode(rg, eve);
+ eve->f2 = 0;
+ index++;
+ }
}
- /* Temporarely convert node list to dynamic list, for indexed access */
- dlist = BLI_dlist_from_listbase(&rg->nodes);
-
/* Adding face, edge per edge */
for(efa = em->faces.first; efa; efa = efa->next)
{
- ReebNode *n1, *n2, *n3;
-
- n1 = (ReebNode*)BLI_dlist_find_link(dlist, efa->v1->hash);
- n2 = (ReebNode*)BLI_dlist_find_link(dlist, efa->v2->hash);
- n3 = (ReebNode*)BLI_dlist_find_link(dlist, efa->v3->hash);
-
- addTriangleToGraph(rg, n1, n2, n3);
-
- if (efa->v4)
+ if (efa->h == 0)
{
- ReebNode *n4 = (ReebNode*)efa->v4->tmp.p;
- addTriangleToGraph(rg, n1, n3, n4);
- }
-
+ ReebNode *n1, *n2, *n3;
+
+ n1 = nodeData(efa->v1);
+ n2 = nodeData(efa->v2);
+ n3 = nodeData(efa->v3);
+
+ addTriangleToGraph(rg, n1, n2, n3, efa);
+
+ if (efa->v4)
+ {
+ ReebNode *n4 = nodeData(efa->v4);
+ addTriangleToGraph(rg, n1, n3, n4, efa);
+ }
#ifdef DEBUG_REEB
- countfaces++;
- if (countfaces % 100 == 0)
- {
- printf("face %i of %i\n", countfaces, totfaces);
- }
+ countfaces++;
+ if (countfaces % 100 == 0)
+ {
+ printf("\rface %i of %i", countfaces, totfaces);
+ }
#endif
-
-
+ }
}
- BLI_listbase_from_dlist(dlist, &rg->nodes);
+
+ printf("\n");
+
+ removeZeroNodes(rg);
removeNormalNodes(rg);
@@ -1484,12 +2637,12 @@ void renormalizeWeight(EditMesh *em, float newmax)
/* First pass, determine maximum and minimum */
eve = em->verts.first;
- minimum = eve->tmp.fp;
- maximum = eve->tmp.fp;
+ minimum = weightData(eve);
+ maximum = minimum;
for(eve = em->verts.first; eve; eve = eve->next)
{
- maximum = MAX2(maximum, eve->tmp.fp);
- minimum = MIN2(minimum, eve->tmp.fp);
+ maximum = MAX2(maximum, weightData(eve));
+ minimum = MIN2(minimum, weightData(eve));
}
range = maximum - minimum;
@@ -1497,7 +2650,8 @@ void renormalizeWeight(EditMesh *em, float newmax)
/* Normalize weights */
for(eve = em->verts.first; eve; eve = eve->next)
{
- eve->tmp.fp = (eve->tmp.fp - minimum) / range * newmax;
+ float weight = (weightData(eve) - minimum) / range * newmax;
+ weightSetData(eve, weight);
}
}
@@ -1512,7 +2666,7 @@ int weightFromLoc(EditMesh *em, int axis)
/* Copy coordinate in weight */
for(eve = em->verts.first; eve; eve = eve->next)
{
- eve->tmp.fp = eve->co[axis];
+ weightSetData(eve, eve->co[axis]);
}
return 1;
@@ -1534,7 +2688,36 @@ static float cotan_weight(float *v1, float *v2, float *v3)
return Inpf(a, b)/clen;
}
-int weightToHarmonic(EditMesh *em)
+void addTriangle(EditVert *v1, EditVert *v2, EditVert *v3, long e1, long e2, long e3)
+{
+ /* Angle opposite e1 */
+ float t1= cotan_weight(v1->co, v2->co, v3->co) / e2;
+
+ /* Angle opposite e2 */
+ float t2 = cotan_weight(v2->co, v3->co, v1->co) / e3;
+
+ /* Angle opposite e3 */
+ float t3 = cotan_weight(v3->co, v1->co, v2->co) / e1;
+
+ int i1 = indexData(v1);
+ int i2 = indexData(v2);
+ int i3 = indexData(v3);
+
+ nlMatrixAdd(i1, i1, t2+t3);
+ nlMatrixAdd(i2, i2, t1+t3);
+ nlMatrixAdd(i3, i3, t1+t2);
+
+ nlMatrixAdd(i1, i2, -t3);
+ nlMatrixAdd(i2, i1, -t3);
+
+ nlMatrixAdd(i2, i3, -t1);
+ nlMatrixAdd(i3, i2, -t1);
+
+ nlMatrixAdd(i3, i1, -t2);
+ nlMatrixAdd(i1, i3, -t2);
+}
+
+int weightToHarmonic(EditMesh *em, EdgeIndex *indexed_edges)
{
NLboolean success;
EditVert *eve;
@@ -1561,49 +2744,53 @@ int weightToHarmonic(EditMesh *em)
/* Find local extrema */
for(index = 0, eve = em->verts.first; eve; index++, eve = eve->next)
{
- EditEdge *eed;
- int maximum = 1;
- int minimum = 1;
-
- eve->hash = index; /* Assign index to vertex */
-
- NextEdgeForVert(NULL, NULL); /* Reset next edge */
- for(eed = NextEdgeForVert(em, eve); eed && (maximum || minimum); eed = NextEdgeForVert(em, eve))
+ if (eve->h == 0)
{
- EditVert *eve2;
+ EditEdge *eed;
+ int maximum = 1;
+ int minimum = 1;
- if (eed->v1 == eve)
+ NextEdgeForVert(indexed_edges, -1); /* Reset next edge */
+ for(eed = NextEdgeForVert(indexed_edges, index); eed && (maximum || minimum); eed = NextEdgeForVert(indexed_edges, index))
{
- eve2 = eed->v2;
- }
- else
- {
- eve2 = eed->v1;
+ EditVert *eve2;
+
+ if (eed->v1 == eve)
+ {
+ eve2 = eed->v2;
+ }
+ else
+ {
+ eve2 = eed->v1;
+ }
+
+ if (eve2->h == 0)
+ {
+ /* Adjacent vertex is bigger, not a local maximum */
+ if (weightData(eve2) > weightData(eve))
+ {
+ maximum = 0;
+ }
+ /* Adjacent vertex is smaller, not a local minimum */
+ else if (weightData(eve2) < weightData(eve))
+ {
+ minimum = 0;
+ }
+ }
}
- /* Adjacent vertex is bigger, not a local maximum */
- if (eve2->tmp.fp > eve->tmp.fp)
+ if (maximum || minimum)
{
- maximum = 0;
+ float w = weightData(eve);
+ eve->f1 = 0;
+ nlSetVariable(0, index, w);
+ nlLockVariable(index);
}
- /* Adjacent vertex is smaller, not a local minimum */
- else if (eve2->tmp.fp < eve->tmp.fp)
+ else
{
- minimum = 0;
+ eve->f1 = 1;
}
}
-
- if (maximum || minimum)
- {
- float w = eve->tmp.fp;
- eve->f1 = 0;
- nlSetVariable(0, index, w);
- nlLockVariable(index);
- }
- else
- {
- eve->f1 = 1;
- }
}
nlBegin(NL_MATRIX);
@@ -1617,39 +2804,34 @@ int weightToHarmonic(EditMesh *em)
/* Add faces count to the edge weight */
for(efa = em->faces.first; efa; efa = efa->next)
{
- efa->e1->tmp.l++;
- efa->e2->tmp.l++;
- efa->e3->tmp.l++;
+ if (efa->h == 0)
+ {
+ efa->e1->tmp.l++;
+ efa->e2->tmp.l++;
+ efa->e3->tmp.l++;
+
+ if (efa->e4)
+ {
+ efa->e4->tmp.l++;
+ }
+ }
}
/* Add faces angle to the edge weight */
for(efa = em->faces.first; efa; efa = efa->next)
{
- /* Angle opposite e1 */
- float t1= cotan_weight(efa->v1->co, efa->v2->co, efa->v3->co) / efa->e2->tmp.l;
-
- /* Angle opposite e2 */
- float t2 = cotan_weight(efa->v2->co, efa->v3->co, efa->v1->co) / efa->e3->tmp.l;
-
- /* Angle opposite e3 */
- float t3 = cotan_weight(efa->v3->co, efa->v1->co, efa->v2->co) / efa->e1->tmp.l;
-
- int i1 = efa->v1->hash;
- int i2 = efa->v2->hash;
- int i3 = efa->v3->hash;
-
- nlMatrixAdd(i1, i1, t2+t3);
- nlMatrixAdd(i2, i2, t1+t3);
- nlMatrixAdd(i3, i3, t1+t2);
-
- nlMatrixAdd(i1, i2, -t3);
- nlMatrixAdd(i2, i1, -t3);
-
- nlMatrixAdd(i2, i3, -t1);
- nlMatrixAdd(i3, i2, -t1);
-
- nlMatrixAdd(i3, i1, -t2);
- nlMatrixAdd(i1, i3, -t2);
+ if (efa->h == 0)
+ {
+ if (efa->v4 == NULL)
+ {
+ addTriangle(efa->v1, efa->v2, efa->v3, efa->e1->tmp.l, efa->e2->tmp.l, efa->e3->tmp.l);
+ }
+ else
+ {
+ addTriangle(efa->v1, efa->v2, efa->v3, efa->e1->tmp.l, efa->e2->tmp.l, 2);
+ addTriangle(efa->v3, efa->v4, efa->v1, efa->e3->tmp.l, efa->e4->tmp.l, 2);
+ }
+ }
}
nlEnd(NL_MATRIX);
@@ -1663,7 +2845,7 @@ int weightToHarmonic(EditMesh *em)
rval = 1;
for(index = 0, eve = em->verts.first; eve; index++, eve = eve->next)
{
- eve->tmp.fp = nlGetVariable(0, index);
+ weightSetData(eve, nlGetVariable(0, index));
}
}
else
@@ -1677,46 +2859,175 @@ int weightToHarmonic(EditMesh *em)
}
-EditEdge * NextEdgeForVert(EditMesh *em, EditVert *v)
+EditEdge * NextEdgeForVert(EdgeIndex *indexed_edges, int index)
{
- static EditEdge *e = NULL;
+ static int offset = -1;
/* Reset method, call with NULL mesh pointer */
- if (em == NULL)
+ if (index == -1)
{
- e = NULL;
+ offset = -1;
return NULL;
}
/* first pass, start at the head of the list */
- if (e == NULL)
+ if (offset == -1)
{
- e = em->edges.first;
+ offset = indexed_edges->offset[index];
}
/* subsequent passes, start on the next edge */
else
{
- e = e->next;
+ offset++;
+ }
+
+ return indexed_edges->edges[offset];
+}
+
+void shortestPathsFromVert(EditMesh *em, EditVert *starting_vert, EdgeIndex *indexed_edges)
+{
+ Heap *edge_heap;
+ EditVert *current_eve = NULL;
+ EditEdge *eed = NULL;
+ EditEdge *select_eed = NULL;
+
+ edge_heap = BLI_heap_new();
+
+ current_eve = starting_vert;
+
+ /* insert guard in heap, when that is returned, no more edges */
+ BLI_heap_insert(edge_heap, FLT_MAX, NULL);
+
+ /* Initialize edge flag */
+ for(eed= em->edges.first; eed; eed= eed->next)
+ {
+ eed->f1 = 0;
+ }
+
+ while (BLI_heap_size(edge_heap) > 0)
+ {
+ float current_weight;
+
+ current_eve->f1 = 1; /* mark vertex as selected */
+
+ /* Add all new edges connected to current_eve to the list */
+ NextEdgeForVert(indexed_edges, -1); // Reset next edge
+ for(eed = NextEdgeForVert(indexed_edges, indexData(current_eve)); eed; eed = NextEdgeForVert(indexed_edges, indexData(current_eve)))
+ {
+ if (eed->f1 == 0)
+ {
+ BLI_heap_insert(edge_heap, weightData(current_eve) + eed->tmp.fp, eed);
+ eed->f1 = 1;
+ }
+ }
+
+ /* Find next shortest edge with unselected verts */
+ do
+ {
+ current_weight = BLI_heap_node_value(BLI_heap_top(edge_heap));
+ select_eed = BLI_heap_popmin(edge_heap);
+ } while (select_eed != NULL && select_eed->v1->f1 != 0 && select_eed->v2->f1);
+
+ if (select_eed != NULL)
+ {
+ select_eed->f1 = 2;
+
+ if (select_eed->v1->f1 == 0) /* v1 is the new vertex */
+ {
+ current_eve = select_eed->v1;
+ }
+ else /* otherwise, it's v2 */
+ {
+ current_eve = select_eed->v2;
+ }
+
+ weightSetData(current_eve, current_weight);
+ }
}
+
+ BLI_heap_free(edge_heap, NULL);
+}
+
+void freeEdgeIndex(EdgeIndex *indexed_edges)
+{
+ MEM_freeN(indexed_edges->offset);
+ MEM_freeN(indexed_edges->edges);
+}
- for( ; e ; e = e->next)
+void buildIndexedEdges(EditMesh *em, EdgeIndex *indexed_edges)
+{
+ EditVert *eve;
+ EditEdge *eed;
+ int totvert = 0;
+ int tot_indexed = 0;
+ int offset = 0;
+
+ totvert = BLI_countlist(&em->verts);
+
+ indexed_edges->offset = MEM_callocN(totvert * sizeof(int), "EdgeIndex offset");
+
+ for(eed = em->edges.first; eed; eed = eed->next)
{
- if (e->v1 == v || e->v2 == v)
+ if (eed->v1->h == 0 && eed->v2->h == 0)
{
- break;
+ tot_indexed += 2;
+ indexed_edges->offset[indexData(eed->v1)]++;
+ indexed_edges->offset[indexData(eed->v2)]++;
}
- }
+ }
- return e;
+ tot_indexed += totvert;
+
+ indexed_edges->edges = MEM_callocN(tot_indexed * sizeof(EditEdge*), "EdgeIndex edges");
+
+ /* setting vert offsets */
+ for(eve = em->verts.first; eve; eve = eve->next)
+ {
+ if (eve->h == 0)
+ {
+ int d = indexed_edges->offset[indexData(eve)];
+ indexed_edges->offset[indexData(eve)] = offset;
+ offset += d + 1;
+ }
+ }
+
+ /* adding edges in array */
+ for(eed = em->edges.first; eed; eed= eed->next)
+ {
+ if (eed->v1->h == 0 && eed->v2->h == 0)
+ {
+ int i;
+ for (i = indexed_edges->offset[indexData(eed->v1)]; i < tot_indexed; i++)
+ {
+ if (indexed_edges->edges[i] == NULL)
+ {
+ indexed_edges->edges[i] = eed;
+ break;
+ }
+ }
+
+ for (i = indexed_edges->offset[indexData(eed->v2)]; i < tot_indexed; i++)
+ {
+ if (indexed_edges->edges[i] == NULL)
+ {
+ indexed_edges->edges[i] = eed;
+ break;
+ }
+ }
+ }
+ }
}
-int weightFromDistance(EditMesh *em)
+int weightFromDistance(EditMesh *em, EdgeIndex *indexed_edges)
{
EditVert *eve;
int totedge = 0;
+ int totvert = 0;
int vCount = 0;
- if (em == NULL || BLI_countlist(&em->verts) == 0)
+ totvert = BLI_countlist(&em->verts);
+
+ if (em == NULL || totvert == 0)
{
return 0;
}
@@ -1727,9 +3038,9 @@ int weightFromDistance(EditMesh *em)
{
return 0;
}
-
- /* Initialize vertice flags and find at least one selected vertex */
- for(eve = em->verts.first; eve && vCount == 0; eve = eve->next)
+
+ /* Initialize vertice flag and find at least one selected vertex */
+ for(eve = em->verts.first; eve; eve = eve->next)
{
eve->f1 = 0;
if (eve->f & SELECT)
@@ -1744,110 +3055,94 @@ int weightFromDistance(EditMesh *em)
}
else
{
- EditVert *eve, *current_eve = NULL;
+ EditEdge *eed;
+ int allDone = 0;
+
+ /* Calculate edge weight */
+ for(eed = em->edges.first; eed; eed= eed->next)
+ {
+ if (eed->v1->h == 0 && eed->v2->h == 0)
+ {
+ eed->tmp.fp = VecLenf(eed->v1->co, eed->v2->co);
+ }
+ }
+
/* Apply dijkstra spf for each selected vert */
for(eve = em->verts.first; eve; eve = eve->next)
{
if (eve->f & SELECT)
{
- current_eve = eve;
- eve->f1 = 1;
-
+ shortestPathsFromVert(em, eve, indexed_edges);
+ }
+ }
+
+ /* connect unselected islands */
+ while (allDone == 0)
+ {
+ EditVert *selected_eve = NULL;
+ float selected_weight = 0;
+ float min_distance = FLT_MAX;
+
+ allDone = 1;
+
+ for (eve = em->verts.first; eve; eve = eve->next)
+ {
+ /* for every vertex visible that hasn't been processed yet */
+ if (eve->h == 0 && eve->f1 != 1)
{
- EditEdge *eed = NULL;
- EditEdge *select_eed = NULL;
- EditEdge **edges = NULL;
- float currentWeight = 0;
- int eIndex = 0;
-
- edges = MEM_callocN(totedge * sizeof(EditEdge*), "Edges");
+ EditVert *closest_eve;
- /* Calculate edge weight and initialize edge flags */
- for(eed= em->edges.first; eed; eed= eed->next)
+ /* find the closest processed vertex */
+ for (closest_eve = em->verts.first; closest_eve; closest_eve = closest_eve->next)
{
- eed->tmp.fp = VecLenf(eed->v1->co, eed->v2->co);
- eed->f1 = 0;
- }
-
- do {
- int i;
-
- current_eve->f1 = 1; /* mark vertex as selected */
-
- /* Add all new edges connected to current_eve to the list */
- NextEdgeForVert(NULL, NULL); // Reset next edge
- for(eed = NextEdgeForVert(em, current_eve); eed; eed = NextEdgeForVert(em, current_eve))
- {
- if (eed->f1 == 0)
- {
- edges[eIndex] = eed;
- eed->f1 = 1;
- eIndex++;
- }
- }
-
- /* Find next shortest edge */
- select_eed = NULL;
- for(i = 0; i < eIndex; i++)
- {
- eed = edges[i];
-
- if (eed->f1 != 2 && (eed->v1->f1 == 0 || eed->v2->f1 == 0)) /* eed is not selected yet and leads to a new node */
- {
- float newWeight = 0;
- if (eed->v1->f1 == 1)
- {
- newWeight = eed->v1->tmp.fp + eed->tmp.fp;
- }
- else
- {
- newWeight = eed->v2->tmp.fp + eed->tmp.fp;
- }
-
- if (select_eed == NULL || newWeight < currentWeight) /* no selected edge or current smaller than selected */
- {
- currentWeight = newWeight;
- select_eed = eed;
- }
- }
- }
-
- if (select_eed != NULL)
+ /* vertex is already processed and distance is smaller than current minimum */
+ if (closest_eve->f1 == 1)
{
- select_eed->f1 = 2;
-
- if (select_eed->v1->f1 == 0) /* v1 is the new vertex */
+ float distance = VecLenf(closest_eve->co, eve->co);
+ if (distance < min_distance)
{
- current_eve = select_eed->v1;
+ min_distance = distance;
+ selected_eve = eve;
+ selected_weight = weightData(closest_eve);
}
- else /* otherwise, it's v2 */
- {
- current_eve = select_eed->v2;
- }
- current_eve->tmp.fp = currentWeight;
}
- } while (select_eed != NULL);
-
- MEM_freeN(edges);
+ }
}
}
+
+ if (selected_eve)
+ {
+ allDone = 0;
+
+ weightSetData(selected_eve, selected_weight + min_distance);
+ shortestPathsFromVert(em, selected_eve, indexed_edges);
+ }
}
}
+ for(eve = em->verts.first; eve && vCount == 0; eve = eve->next)
+ {
+ if (eve->f1 == 0)
+ {
+ printf("vertex not reached\n");
+ break;
+ }
+ }
+
return 1;
}
-MCol MColFromWeight(EditVert *eve)
+MCol MColFromVal(float val)
{
MCol col;
col.a = 255;
- col.b = (char)(eve->tmp.fp * 255);
+ col.b = (char)(val * 255);
col.g = 0;
- col.r = (char)((1.0f - eve->tmp.fp) * 255);
+ col.r = (char)((1.0f - val) * 255);
return col;
}
-void weightToVCol(EditMesh *em)
+void weightToVCol(EditMesh *em, int index)
{
EditFace *efa;
MCol *mcol;
@@ -1856,14 +3151,148 @@ void weightToVCol(EditMesh *em)
}
for(efa=em->faces.first; efa; efa=efa->next) {
+ mcol = CustomData_em_get_n(&em->fdata, efa->data, CD_MCOL, index);
+
+ if (mcol)
+ {
+ mcol[0] = MColFromVal(weightData(efa->v1));
+ mcol[1] = MColFromVal(weightData(efa->v2));
+ mcol[2] = MColFromVal(weightData(efa->v3));
+
+ if(efa->v4) {
+ mcol[3] = MColFromVal(weightData(efa->v4));
+ }
+ }
+ }
+}
+
+void angleToVCol(EditMesh *em, int index)
+{
+ EditFace *efa;
+ MCol *mcol;
+
+ if (!EM_vertColorCheck()) {
+ return;
+ }
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ MCol col;
+ if (efa->tmp.fp > 0)
+ {
+ col = MColFromVal(efa->tmp.fp / (M_PI / 2 + 0.1));
+ }
+ else
+ {
+ col.a = 255;
+ col.r = 0;
+ col.g = 255;
+ col.b = 0;
+ }
+
+ mcol = CustomData_em_get_n(&em->fdata, efa->data, CD_MCOL, index);
+
+ if (mcol)
+ {
+ mcol[0] = col;
+ mcol[1] = col;
+ mcol[2] = col;
+
+ if(efa->v4) {
+ mcol[3] = col;
+ }
+ }
+ }
+}
+
+void blendColor(MCol *dst, MCol *src)
+{
+#if 1
+ float blend_src = (float)src->a / (float)(src->a + dst->a);
+ float blend_dst = (float)dst->a / (float)(src->a + dst->a);
+ dst->a += src->a;
+ dst->r = (char)(dst->r * blend_dst + src->r * blend_src);
+ dst->g = (char)(dst->g * blend_dst + src->g * blend_src);
+ dst->b = (char)(dst->b * blend_dst + src->b * blend_src);
+#else
+ dst->r = src->r;
+ dst->g = src->g;
+ dst->b = src->b;
+#endif
+}
+
+void arcToVCol(ReebGraph *rg, EditMesh *em, int index)
+{
+ GHashIterator ghi;
+ EditFace *efa;
+ ReebArc *arc;
+ MCol *mcol;
+ MCol col;
+ int total = BLI_countlist(&rg->arcs);
+ int i = 0;
+
+ if (!EM_vertColorCheck()) {
+ return;
+ }
+
+ col.a = 0;
+
+ col.r = 0;
+ col.g = 0;
+ col.b = 0;
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ mcol = CustomData_em_get_n(&em->fdata, efa->data, CD_MCOL, index);
+
+ if (mcol)
+ {
+ mcol[0] = col;
+ mcol[1] = col;
+ mcol[2] = col;
+
+ if(efa->v4) {
+ mcol[3] = col;
+ }
+ }
+ }
+
+ for (arc = rg->arcs.first; arc; arc = arc->next, i++)
+ {
+ float r,g,b;
+ col.a = 1;
+
+ hsv_to_rgb((float)i / (float)total, 1, 1, &r, &g, &b);
+
+ col.r = FTOCHAR(r);
+ col.g = FTOCHAR(g);
+ col.b = FTOCHAR(b);
+
+ for(BLI_ghashIterator_init(&ghi, arc->faces);
+ !BLI_ghashIterator_isDone(&ghi);
+ BLI_ghashIterator_step(&ghi))
+ {
+ efa = BLI_ghashIterator_getValue(&ghi);
+
+ mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+
+ blendColor(&mcol[0], &col);
+ blendColor(&mcol[1], &col);
+ blendColor(&mcol[2], &col);
+
+ if(efa->v4) {
+ blendColor(&mcol[3], &col);
+ }
+ }
+ }
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
- mcol[0] = MColFromWeight(efa->v1);
- mcol[1] = MColFromWeight(efa->v2);
- mcol[2] = MColFromWeight(efa->v3);
+ mcol[0].a = 255;
+ mcol[1].a = 255;
+ mcol[2].a = 255;
if(efa->v4) {
- mcol[3] = MColFromWeight(efa->v4);
+ mcol[3].a = 255;
}
}
}
@@ -1874,7 +3303,7 @@ void initArcIterator(ReebArcIterator *iter, ReebArc *arc, ReebNode *head)
{
iter->arc = arc;
- if (head == arc->v1)
+ if (head == arc->head)
{
iter->start = 0;
iter->end = arc->bcount - 1;
@@ -1887,7 +3316,36 @@ void initArcIterator(ReebArcIterator *iter, ReebArc *arc, ReebNode *head)
iter->stride = -1;
}
+ iter->length = arc->bcount;
+
+ iter->index = iter->start - iter->stride;
+}
+
+void initArcIteratorStart(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head, int start)
+{
+ iter->arc = arc;
+
+ if (head == arc->head)
+ {
+ iter->start = start;
+ iter->end = arc->bcount - 1;
+ iter->stride = 1;
+ }
+ else
+ {
+ iter->start = arc->bcount - 1 - start;
+ iter->end = 0;
+ iter->stride = -1;
+ }
+
iter->index = iter->start - iter->stride;
+
+ iter->length = arc->bcount - start;
+
+ if (start >= arc->bcount)
+ {
+ iter->start = iter->end; /* stop iterator since it's past its end */
+ }
}
void initArcIterator2(ReebArcIterator *iter, ReebArc *arc, int start, int end)
@@ -1907,6 +3365,8 @@ void initArcIterator2(ReebArcIterator *iter, ReebArc *arc, int start, int end)
}
iter->index = iter->start - iter->stride;
+
+ iter->length = abs(iter->end - iter->start) + 1;
}
EmbedBucket * nextBucket(ReebArcIterator *iter)
@@ -1921,3 +3381,412 @@ EmbedBucket * nextBucket(ReebArcIterator *iter)
return result;
}
+
+EmbedBucket * nextNBucket(ReebArcIterator *iter, int n)
+{
+ EmbedBucket *result = NULL;
+
+ iter->index += n * iter->stride;
+
+ /* check if passed end */
+ if ((iter->stride == 1 && iter->index <= iter->end) ||
+ (iter->stride == -1 && iter->index >= iter->end))
+ {
+ result = &(iter->arc->buckets[iter->index]);
+ }
+ else
+ {
+ /* stop iterator if passed end */
+ iter->index = iter->end;
+ }
+
+ return result;
+}
+
+EmbedBucket * peekBucket(ReebArcIterator *iter, int n)
+{
+ EmbedBucket *result = NULL;
+ int index = iter->index + n * iter->stride;
+
+ /* check if passed end */
+ if ((iter->stride == 1 && index <= iter->end && index >= iter->start) ||
+ (iter->stride == -1 && index >= iter->end && index <= iter->start))
+ {
+ result = &(iter->arc->buckets[index]);
+ }
+
+ return result;
+}
+
+EmbedBucket * previousBucket(struct ReebArcIterator *iter)
+{
+ EmbedBucket *result = NULL;
+
+ if (iter->index != iter->start)
+ {
+ iter->index -= iter->stride;
+ result = &(iter->arc->buckets[iter->index]);
+ }
+
+ return result;
+}
+
+int iteratorStopped(struct ReebArcIterator *iter)
+{
+ if (iter->index == iter->end)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+struct EmbedBucket * currentBucket(struct ReebArcIterator *iter)
+{
+ EmbedBucket *result = NULL;
+
+ if (iter->index != iter->end)
+ {
+ result = &(iter->arc->buckets[iter->index]);
+ }
+
+ return result;
+}
+
+/************************ PUBLIC FUNCTIONS *********************************************/
+
+ReebGraph *BIF_ReebGraphMultiFromEditMesh(void)
+{
+ EditMesh *em = G.editMesh;
+ EdgeIndex indexed_edges;
+ VertexData *data;
+ ReebGraph *rg = NULL;
+ ReebGraph *rgi, *previous;
+ int i, nb_levels = REEB_MAX_MULTI_LEVEL;
+
+ if (em == NULL)
+ return NULL;
+
+ data = allocVertexData(em);
+
+ buildIndexedEdges(em, &indexed_edges);
+
+ if (weightFromDistance(em, &indexed_edges) == 0)
+ {
+ error("No selected vertex\n");
+ freeEdgeIndex(&indexed_edges);
+ return NULL;
+ }
+
+ renormalizeWeight(em, 1.0f);
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_HARMONIC)
+ {
+ weightToHarmonic(em, &indexed_edges);
+ }
+
+ freeEdgeIndex(&indexed_edges);
+
+#ifdef DEBUG_REEB
+ weightToVCol(em, 0);
+#endif
+
+ rg = generateReebGraph(em, G.scene->toolsettings->skgen_resolution);
+
+ /* Remove arcs without embedding */
+ filterNullReebGraph(rg);
+
+ /* smart filter and loop filter on basic level */
+ filterGraph(rg, SKGEN_FILTER_SMART, 0, 0);
+
+ repositionNodes(rg);
+
+ /* Filtering might have created degree 2 nodes, so remove them */
+ removeNormalNodes(rg);
+
+ joinSubgraphs(rg, 1.0);
+
+ BLI_buildAdjacencyList((BGraph*)rg);
+
+ /* calc length before copy, so we have same length on all levels */
+ BLI_calcGraphLength((BGraph*)rg);
+
+ previous = NULL;
+ for (i = 0; i <= nb_levels; i++)
+ {
+ rgi = rg;
+
+ /* don't filter last level */
+ if (i > 0)
+ {
+ float internal_threshold;
+ float external_threshold;
+
+ /* filter internal progressively in second half only*/
+ if (i > nb_levels / 2)
+ {
+ internal_threshold = rg->length * G.scene->toolsettings->skgen_threshold_internal;
+ }
+ else
+ {
+ internal_threshold = rg->length * G.scene->toolsettings->skgen_threshold_internal * (2 * i / (float)nb_levels);
+ }
+
+ external_threshold = rg->length * G.scene->toolsettings->skgen_threshold_external * (i / (float)nb_levels);
+
+ filterGraph(rgi, G.scene->toolsettings->skgen_options, internal_threshold, external_threshold);
+ }
+
+ if (i < nb_levels)
+ {
+ rg = copyReebGraph(rgi, i + 1);
+ }
+
+ finalizeGraph(rgi, G.scene->toolsettings->skgen_postpro_passes, G.scene->toolsettings->skgen_postpro);
+
+ BLI_markdownSymmetry((BGraph*)rgi, rgi->nodes.first, G.scene->toolsettings->skgen_symmetry_limit);
+
+ if (previous != NULL)
+ {
+ relinkNodes(rgi, previous);
+ }
+ previous = rgi;
+ }
+
+ verifyMultiResolutionLinks(rg, 0);
+
+ MEM_freeN(data);
+
+ return rg;
+}
+
+ReebGraph *BIF_ReebGraphFromEditMesh(void)
+{
+ EditMesh *em = G.editMesh;
+ EdgeIndex indexed_edges;
+ VertexData *data;
+ ReebGraph *rg = NULL;
+
+ if (em == NULL)
+ return NULL;
+
+ data = allocVertexData(em);
+
+ buildIndexedEdges(em, &indexed_edges);
+
+ if (weightFromDistance(em, &indexed_edges) == 0)
+ {
+ error("No selected vertex\n");
+ freeEdgeIndex(&indexed_edges);
+ freeEdgeIndex(&indexed_edges);
+ return NULL;
+ }
+
+ renormalizeWeight(em, 1.0f);
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_HARMONIC)
+ {
+ weightToHarmonic(em, &indexed_edges);
+ }
+
+ freeEdgeIndex(&indexed_edges);
+
+#ifdef DEBUG_REEB
+ weightToVCol(em, 1);
+#endif
+
+ rg = generateReebGraph(em, G.scene->toolsettings->skgen_resolution);
+
+ REEB_exportGraph(rg, -1);
+
+ printf("GENERATED\n");
+ printf("%i subgraphs\n", BLI_FlagSubgraphs((BGraph*)rg));
+
+ /* Remove arcs without embedding */
+ filterNullReebGraph(rg);
+
+ BLI_freeAdjacencyList((BGraph*)rg);
+
+ printf("NULL FILTERED\n");
+ printf("%i subgraphs\n", BLI_FlagSubgraphs((BGraph*)rg));
+
+ filterGraph(rg, G.scene->toolsettings->skgen_options, G.scene->toolsettings->skgen_threshold_internal, G.scene->toolsettings->skgen_threshold_external);
+
+ finalizeGraph(rg, G.scene->toolsettings->skgen_postpro_passes, G.scene->toolsettings->skgen_postpro);
+
+ REEB_exportGraph(rg, -1);
+
+#ifdef DEBUG_REEB
+ arcToVCol(rg, em, 0);
+ //angleToVCol(em, 1);
+#endif
+
+ printf("DONE\n");
+ printf("%i subgraphs\n", BLI_FlagSubgraphs((BGraph*)rg));
+
+ MEM_freeN(data);
+
+ return rg;
+}
+
+void BIF_GlobalReebFree()
+{
+ if (GLOBAL_RG != NULL)
+ {
+ REEB_freeGraph(GLOBAL_RG);
+ GLOBAL_RG = NULL;
+ }
+}
+
+void BIF_GlobalReebGraphFromEditMesh(void)
+{
+ ReebGraph *rg;
+
+ BIF_GlobalReebFree();
+
+ rg = BIF_ReebGraphMultiFromEditMesh();
+
+ GLOBAL_RG = rg;
+}
+
+void REEB_draw()
+{
+ ReebGraph *rg;
+ ReebArc *arc;
+ int i = 0;
+
+ if (GLOBAL_RG == NULL)
+ {
+ return;
+ }
+
+ if (GLOBAL_RG->link_up && G.scene->toolsettings->skgen_options & SKGEN_DISP_ORIG)
+ {
+ for (rg = GLOBAL_RG; rg->link_up; rg = rg->link_up) ;
+ }
+ else
+ {
+ i = G.scene->toolsettings->skgen_multi_level;
+
+ for (rg = GLOBAL_RG; rg->multi_level != i && rg->link_up; rg = rg->link_up) ;
+ }
+
+ glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE));
+
+ glDisable(GL_DEPTH_TEST);
+ for (arc = rg->arcs.first; arc; arc = arc->next, i++)
+ {
+ ReebArcIterator iter;
+ EmbedBucket *bucket;
+ float vec[3];
+ char text[128];
+ char *s = text;
+
+ glLineWidth(BIF_GetThemeValuef(TH_VERTEX_SIZE) + 2);
+ glColor3f(0, 0, 0);
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(arc->head->p);
+
+ if (arc->bcount)
+ {
+ initArcIterator(&iter, arc, arc->head);
+ for (bucket = nextBucket(&iter); bucket; bucket = nextBucket(&iter))
+ {
+ glVertex3fv(bucket->p);
+ }
+ }
+
+ glVertex3fv(arc->tail->p);
+ glEnd();
+
+ glLineWidth(BIF_GetThemeValuef(TH_VERTEX_SIZE));
+
+ if (arc->symmetry_level == 1)
+ {
+ glColor3f(1, 0, 0);
+ }
+ else if (arc->symmetry_flag == SYM_SIDE_POSITIVE || arc->symmetry_flag == SYM_SIDE_NEGATIVE)
+ {
+ glColor3f(1, 0.5f, 0);
+ }
+ else if (arc->symmetry_flag >= SYM_SIDE_RADIAL)
+ {
+ glColor3f(0.5f, 1, 0);
+ }
+ else
+ {
+ glColor3f(1, 1, 0);
+ }
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(arc->head->p);
+
+ if (arc->bcount)
+ {
+ initArcIterator(&iter, arc, arc->head);
+ for (bucket = nextBucket(&iter); bucket; bucket = nextBucket(&iter))
+ {
+ glVertex3fv(bucket->p);
+ }
+ }
+
+ glVertex3fv(arc->tail->p);
+ glEnd();
+
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_DISP_EMBED)
+ {
+ glColor3f(1, 1, 1);
+ glBegin(GL_POINTS);
+ glVertex3fv(arc->head->p);
+ glVertex3fv(arc->tail->p);
+
+ glColor3f(0.5f, 0.5f, 1);
+ if (arc->bcount)
+ {
+ initArcIterator(&iter, arc, arc->head);
+ for (bucket = nextBucket(&iter); bucket; bucket = nextBucket(&iter))
+ {
+ glVertex3fv(bucket->p);
+ }
+ }
+ glEnd();
+ }
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_DISP_INDEX)
+ {
+ VecLerpf(vec, arc->head->p, arc->tail->p, 0.5f);
+ s += sprintf(s, "%i (%i-%i-%i) ", i, arc->symmetry_level, arc->symmetry_flag, arc->symmetry_group);
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_DISP_WEIGHT)
+ {
+ s += sprintf(s, "w:%0.3f ", arc->tail->weight - arc->head->weight);
+ }
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_DISP_LENGTH)
+ {
+ s += sprintf(s, "l:%0.3f", arc->length);
+ }
+
+ glColor3f(0, 1, 0);
+ glRasterPos3fv(vec);
+ BMF_DrawString( G.fonts, text);
+ }
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_DISP_INDEX)
+ {
+ sprintf(text, " %i", arc->head->index);
+ glRasterPos3fv(arc->head->p);
+ BMF_DrawString( G.fonts, text);
+
+ sprintf(text, " %i", arc->tail->index);
+ glRasterPos3fv(arc->tail->p);
+ BMF_DrawString( G.fonts, text);
+ }
+ }
+ glEnable(GL_DEPTH_TEST);
+
+ glLineWidth(1.0);
+ glPointSize(1.0);
+}
diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c
index b4d78b7fa37..bbac70e9e5e 100644
--- a/source/blender/src/renderwin.c
+++ b/source/blender/src/renderwin.c
@@ -88,7 +88,10 @@
#include "BDR_sculptmode.h"
#include "BDR_editobject.h"
+
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h" /* for BPY_do_all_scripts */
+#endif
#include "BSE_view.h"
#include "BSE_drawview.h"
@@ -1273,8 +1276,10 @@ void BIF_store_spare(void)
/* set up display, render an image or scene */
void BIF_do_render(int anim)
{
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS)
BPY_do_all_scripts(SCRIPT_RENDER, anim);
+#endif
BIF_store_spare();
@@ -1286,8 +1291,9 @@ void BIF_do_render(int anim)
}
if(G.scene->r.dither_intensity != 0.0f)
BIF_redraw_render_rect();
-
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_POSTRENDER, anim);
+#endif
}
void do_ogl_view3d_render(Render *re, View3D *v3d, int winx, int winy)
diff --git a/source/blender/src/retopo.c b/source/blender/src/retopo.c
index 47eee872a8a..b6f14b9bb68 100644
--- a/source/blender/src/retopo.c
+++ b/source/blender/src/retopo.c
@@ -85,18 +85,34 @@ typedef struct RetopoPaintHit {
float where;
} RetopoPaintHit;
-void retopo_do_2d(View3D *v3d, double proj[2], float *v, char adj);
-void retopo_paint_debug_print(RetopoPaintData *rpd);
+static void retopo_do_2d(View3D *v3d, double proj[2], float *v, char adj);
+
+#if 0
+static void retopo_paint_debug_print(RetopoPaintData *rpd)
+{
+ RetopoPaintLine *l;
+ RetopoPaintPoint *p;
+
+ for(l= rpd->lines.first; l; l= l->next) {
+ printf("Line:\n");
+ for(p= l->points.first; p; p= p->next) {
+ printf(" Point(%d: %d,%d)\n",p->index,p->loc.x,p->loc.y);
+ }
+ }
+
+ fflush(stdout);
+}
+#endif
/* Painting */
-RetopoPaintData *get_retopo_paint_data()
+RetopoPaintData *get_retopo_paint_data(void)
{
if(!retopo_mesh_paint_check()) return NULL;
if(!G.editMesh) return NULL;
return G.editMesh->retopo_paint_data;
}
-char retopo_mesh_paint_check()
+char retopo_mesh_paint_check(void)
{
return retopo_mesh_check() && G.scene->toolsettings->retopo_mode & RETOPO_PAINT;
}
@@ -117,7 +133,7 @@ void retopo_free_paint_data(RetopoPaintData *rpd)
}
}
-void retopo_free_paint()
+void retopo_free_paint(void)
{
retopo_free_paint_data(G.editMesh->retopo_paint_data);
G.editMesh->retopo_paint_data= NULL;
@@ -251,7 +267,7 @@ EditFace *addfaceif(EditMesh *em, EditVert *v1, EditVert *v2, EditVert *v3, Edit
return addfacelist(v1,v2,v3,v4,NULL,NULL);
}
-void retopo_paint_apply()
+void retopo_paint_apply(void)
{
RetopoPaintData *rpd= G.editMesh->retopo_paint_data;
EditVert *eve;
@@ -392,7 +408,7 @@ void retopo_paint_add_ellipse(RetopoPaintData *rpd, short mouse[2])
allqueue(REDRAWVIEW3D,0);
}
-void retopo_end_okee()
+void retopo_end_okee(void)
{
if(okee("Apply retopo paint?"))
retopo_paint_apply();
@@ -442,7 +458,7 @@ void retopo_paint_view_update(struct View3D *v3d)
}
}
-void retopo_force_update()
+void retopo_force_update(void)
{
RetopoPaintData *rpd= get_retopo_paint_data();
@@ -708,17 +724,22 @@ RetopoPaintData *retopo_paint_data_copy(RetopoPaintData *rpd)
memcpy(copy,rpd,sizeof(RetopoPaintData));
copy->lines.first= copy->lines.last= NULL;
+ copy->nearest.next= copy->nearest.prev= NULL;
+ copy->nearest.line= NULL;
+ copy->nearest.first= 0;
+
for(l= rpd->lines.first; l; l= l->next) {
- lcp= MEM_mallocN(sizeof(RetopoPaintLine),"RetopoPaintLineCopy");
- memcpy(lcp,l,sizeof(RetopoPaintLine));
- BLI_addtail(&copy->lines,lcp);
+ lcp= MEM_dupallocN(l);
+ BLI_addtail(&copy->lines, lcp);
lcp->hitlist.first= lcp->hitlist.last= NULL;
lcp->points.first= lcp->points.last= NULL;
+ lcp->cyclic= NULL;
+
for(p= l->points.first; p; p= p->next) {
- pcp= MEM_mallocN(sizeof(RetopoPaintPoint),"RetopoPaintPointCopy");
- memcpy(pcp,p,sizeof(RetopoPaintPoint));
- BLI_addtail(&lcp->points,pcp);
+ pcp= MEM_dupallocN(p);
+ BLI_addtail(&lcp->points, pcp);
+ pcp->eve= NULL;
}
}
@@ -727,11 +748,11 @@ RetopoPaintData *retopo_paint_data_copy(RetopoPaintData *rpd)
return copy;
}
-char retopo_mesh_check()
+char retopo_mesh_check(void)
{
return G.obedit && G.obedit->type==OB_MESH && (G.scene->toolsettings->retopo_mode & RETOPO);
}
-char retopo_curve_check()
+char retopo_curve_check(void)
{
return G.obedit && (G.obedit->type==OB_CURVE ||
G.obedit->type==OB_SURF) && (((Curve*)G.obedit->data)->flag & CU_RETOPO);
@@ -751,7 +772,7 @@ void retopo_toggle(void *j1,void *j2)
allqueue(REDRAWVIEW3D, 0);
}
-void retopo_do_2d(View3D *v3d, double proj[2], float *v, char adj)
+static void retopo_do_2d(View3D *v3d, double proj[2], float *v, char adj)
{
/* Check to make sure vert is visible in window */
if(proj[0]>0 && proj[1]>0 && proj[0] < v3d->depths->w && proj[1] < v3d->depths->h) {
@@ -792,7 +813,7 @@ void retopo_do_vert(View3D *v3d, float *v)
retopo_do_2d(v3d,proj,v,0);
}
-void retopo_do_all()
+void retopo_do_all(void)
{
RetopoViewData *rvd= G.vd->retopo_view_data;
if(retopo_mesh_check()) {
@@ -904,18 +925,3 @@ void retopo_free_view_data(View3D *v3d)
v3d->retopo_view_data= NULL;
}
}
-
-void retopo_paint_debug_print(RetopoPaintData *rpd)
-{
- RetopoPaintLine *l;
- RetopoPaintPoint *p;
-
- for(l= rpd->lines.first; l; l= l->next) {
- printf("Line:\n");
- for(p= l->points.first; p; p= p->next) {
- printf(" Point(%d: %d,%d)\n",p->index,p->loc.x,p->loc.y);
- }
- }
-
- fflush(stdout);
-}
diff --git a/source/blender/src/sculptmode.c b/source/blender/src/sculptmode.c
index 31d5ae4610d..c534a8b3cab 100644
--- a/source/blender/src/sculptmode.c
+++ b/source/blender/src/sculptmode.c
@@ -192,9 +192,9 @@ SculptData *sculpt_data(void)
return &G.scene->sculptdata;
}
-void sculpt_init_session(void);
-void init_brushaction(BrushAction *a, short *, short *);
-void sculpt_undo_push(const short);
+static void sculpt_init_session(void);
+static void init_brushaction(BrushAction *a, short *, short *);
+static void sculpt_undo_push(const short);
SculptSession *sculpt_session(void)
{
@@ -208,7 +208,7 @@ SculptSession *sculpt_session(void)
* Allocate/initialize/free data
*/
-void sculpt_init_session(void)
+static void sculpt_init_session(void)
{
if(sculpt_data()->session)
sculptsession_free(G.scene);
@@ -217,7 +217,7 @@ void sculpt_init_session(void)
/* vertex_users is an array of Lists that store all the faces that use a
particular vertex. vertex_users is in the same order as mesh.mvert */
-void calc_vertex_users()
+static void calc_vertex_users()
{
SculptSession *ss= sculpt_session();
int i,j;
@@ -865,14 +865,14 @@ float tex_strength(BrushAction *a, float *point, const float len,const unsigned
float fy= point_2d[1];
float angle= atan2(fy, fx) - rot;
- float len= sqrtf(fx*fx + fy*fy);
+ float flen= sqrtf(fx*fx + fy*fy);
if(rot<0.001 && rot>-0.001) {
px= point_2d[0];
py= point_2d[1];
} else {
- px= len * cos(angle) + 2000;
- py= len * sin(angle) + 2000;
+ px= flen * cos(angle) + 2000;
+ py= flen * sin(angle) + 2000;
}
if(sx != 1)
px %= sx-1;
@@ -884,10 +884,10 @@ float tex_strength(BrushAction *a, float *point, const float len,const unsigned
float fy= (point_2d[1] - a->mouse[1]) / bsize;
float angle= atan2(fy, fx) - rot;
- float len= sqrtf(fx*fx + fy*fy);
+ float flen= sqrtf(fx*fx + fy*fy);
- fx = len * cos(angle) + 0.5;
- fy = len * sin(angle) + 0.5;
+ fx = flen * cos(angle) + 0.5;
+ fy = flen * sin(angle) + 0.5;
avg= get_texcache_pixel_bilinear(ss, fx * TC_SIZE, fy * TC_SIZE);
}
@@ -1223,7 +1223,7 @@ void sculptmode_update_tex()
}
/* pr_mouse is only used for the grab brush, can be NULL otherwise */
-void init_brushaction(BrushAction *a, short *mouse, short *pr_mouse)
+static void init_brushaction(BrushAction *a, short *mouse, short *pr_mouse)
{
SculptData *sd = sculpt_data();
const float mouse_depth = get_depth(mouse[0], mouse[1]);
@@ -1809,7 +1809,7 @@ void sculpt(void)
allqueue(REDRAWVIEW3D, 0);
}
-void sculpt_undo_push(const short brush_type)
+static void sculpt_undo_push(const short brush_type)
{
switch(brush_type) {
case DRAW_BRUSH:
diff --git a/source/blender/src/seqaudio.c b/source/blender/src/seqaudio.c
index 2c86ac92c7f..9b4e3361625 100644
--- a/source/blender/src/seqaudio.c
+++ b/source/blender/src/seqaudio.c
@@ -86,7 +86,7 @@
#include "blendef.h"
-void audio_fill(void *mixdown, Uint8 *sstream, int len);
+static void audio_fill(void *mixdown, uint8_t *sstream, int len);
/* ************ GLOBALS ************* */
static int audio_pos;
@@ -208,7 +208,7 @@ void audio_mixdown()
#endif
}
-void audiostream_fill(Uint8 *mixdown, int len)
+void audiostream_fill(uint8_t *mixdown, int len)
{
int oldcfra = CFRA;
int i;
@@ -229,7 +229,7 @@ void audiostream_fill(Uint8 *mixdown, int len)
}
-static void audio_levels(Uint8 *buf, int len, float db, float facf, float pan)
+static void audio_levels(uint8_t *buf, int len, float db, float facf, float pan)
{
int i;
float facl, facr, fac;
@@ -294,9 +294,9 @@ void audio_makestream(bSound *sound)
#ifndef DISABLE_SDL
static void audio_fill_ram_sound(Sequence *seq, void * mixdown,
- Uint8 * sstream, int len)
+ uint8_t * sstream, int len)
{
- Uint8* cvtbuf;
+ uint8_t* cvtbuf;
bSound* sound;
float facf;
@@ -312,12 +312,12 @@ static void audio_fill_ram_sound(Sequence *seq, void * mixdown,
facf = 1.0;
}
cvtbuf = malloc(len);
- memcpy(cvtbuf, ((Uint8*)sound->stream)+(seq->curpos & (~3)), len);
+ memcpy(cvtbuf, ((uint8_t*)sound->stream)+(seq->curpos & (~3)), len);
audio_levels(cvtbuf, len, seq->level, facf, seq->pan);
if (!mixdown) {
SDL_MixAudio(sstream, cvtbuf, len, SDL_MIX_MAXVOLUME);
} else {
- SDL_MixAudio((Uint8*)mixdown, cvtbuf, len, SDL_MIX_MAXVOLUME);
+ SDL_MixAudio((uint8_t*)mixdown, cvtbuf, len, SDL_MIX_MAXVOLUME);
}
free(cvtbuf);
}
@@ -327,10 +327,10 @@ static void audio_fill_ram_sound(Sequence *seq, void * mixdown,
#ifndef DISABLE_SDL
static void audio_fill_hd_sound(Sequence *seq,
- void * mixdown, Uint8 * sstream,
+ void * mixdown, uint8_t * sstream,
int len)
{
- Uint8* cvtbuf;
+ uint8_t* cvtbuf;
float facf;
if ((seq->curpos >= 0) &&
@@ -354,7 +354,7 @@ static void audio_fill_hd_sound(Sequence *seq,
SDL_MixAudio(sstream,
cvtbuf, len, SDL_MIX_MAXVOLUME);
} else {
- SDL_MixAudio((Uint8*)mixdown,
+ SDL_MixAudio((uint8_t*)mixdown,
cvtbuf, len, SDL_MIX_MAXVOLUME);
}
free(cvtbuf);
@@ -365,7 +365,7 @@ static void audio_fill_hd_sound(Sequence *seq,
#ifndef DISABLE_SDL
static void audio_fill_seq(Sequence * seq, void * mixdown,
- Uint8 *sstream, int len, int advance_only)
+ uint8_t *sstream, int len, int advance_only)
{
while(seq) {
if (seq->type == SEQ_META &&
@@ -419,7 +419,7 @@ static void audio_fill_seq(Sequence * seq, void * mixdown,
#endif
#ifndef DISABLE_SDL
-void audio_fill(void *mixdown, Uint8 *sstream, int len)
+static void audio_fill(void *mixdown, uint8_t *sstream, int len)
{
Editing *ed;
Sequence *seq;
@@ -467,7 +467,7 @@ static int audio_init(SDL_AudioSpec *desired)
}
#endif
-static int audiostream_play_seq(Sequence * seq, Uint32 startframe)
+static int audiostream_play_seq(Sequence * seq, uint32_t startframe)
{
char name[FILE_MAXDIR+FILE_MAXFILE];
int have_sound = 0;
@@ -510,7 +510,7 @@ static int audiostream_play_seq(Sequence * seq, Uint32 startframe)
return have_sound;
}
-void audiostream_play(Uint32 startframe, Uint32 duration, int mixdown)
+void audiostream_play(uint32_t startframe, uint32_t duration, int mixdown)
{
#ifndef DISABLE_SDL
static SDL_AudioSpec desired;
@@ -557,12 +557,12 @@ void audiostream_play(Uint32 startframe, Uint32 duration, int mixdown)
#endif
}
-void audiostream_start(Uint32 frame)
+void audiostream_start(uint32_t frame)
{
audiostream_play(frame, 0, 0);
}
-void audiostream_scrub(Uint32 frame)
+void audiostream_scrub(uint32_t frame)
{
if (U.mixbufsize) audiostream_play(frame, 4096/U.mixbufsize, 0);
}
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index 5be11a724f1..219768b2776 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -803,13 +803,19 @@ static void do_effect(int cfra, Sequence *seq, TStripElem * se)
if (!se2->ibuf->rect_float && se->ibuf->rect_float) {
IMB_float_from_rect(se2->ibuf);
}
-
+ if (!se3->ibuf->rect_float && se->ibuf->rect_float) {
+ IMB_float_from_rect(se3->ibuf);
+ }
+
if (!se1->ibuf->rect && !se->ibuf->rect_float) {
IMB_rect_from_float(se1->ibuf);
}
if (!se2->ibuf->rect && !se->ibuf->rect_float) {
IMB_rect_from_float(se2->ibuf);
}
+ if (!se3->ibuf->rect && !se->ibuf->rect_float) {
+ IMB_rect_from_float(se3->ibuf);
+ }
sh.execute(seq, cfra, fac, facf, x, y, se1->ibuf, se2->ibuf, se3->ibuf,
se->ibuf);
@@ -1731,9 +1737,10 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
}
if(se->ibuf == 0) {
- /* if one of two first inputs are rectfloat, output is float too */
+ /* if any inputs are rectfloat, output is float too */
if((se->se1 && se->se1->ibuf && se->se1->ibuf->rect_float) ||
- (se->se2 && se->se2->ibuf && se->se2->ibuf->rect_float))
+ (se->se2 && se->se2->ibuf && se->se2->ibuf->rect_float) ||
+ (se->se3 && se->se3->ibuf && se->se3->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
else
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index bc5541f1bcf..b6221c2f84b 100644
--- a/source/blender/src/space.c
+++ b/source/blender/src/space.c
@@ -168,7 +168,9 @@
#include "PIL_time.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "butspace.h"
#include "mydevice.h"
@@ -197,9 +199,9 @@ extern void StartKetsjiShellSimulation(ScrArea *area, char* startscenename, stru
* When the mipmap setting changes, we want to redraw the view right
* away to reflect this setting.
*/
-void space_mipmap_button_function(int event);
+//static void space_mipmap_button_function(int event);
-void free_soundspace(SpaceSound *ssound);
+static void free_soundspace(SpaceSound *ssound);
/* *************************************** */
@@ -224,7 +226,7 @@ void add_blockhandler(ScrArea *sa, short eventcode, short val)
}
}
if(a==SPACE_MAXHANDLER) {
- error("Only %i floating panels allowed", SPACE_MAXHANDLER-1);
+ error("Only %i floating panels allowed", SPACE_MAXHANDLER/2);
}
}
@@ -893,7 +895,7 @@ static short select_same_color(Object *ob)
Base *base = FIRSTBASE;
while(base) {
- if (BASE_SELECTABLE(base) && !(base->flag & SELECT) && (FloatCompare(base->object->col, ob->col, 0.005))) {
+ if (BASE_SELECTABLE(base) && !(base->flag & SELECT) && (FloatCompare(base->object->col, ob->col, 0.005f))) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
@@ -1079,7 +1081,9 @@ void BIF_undo(void)
else {
/* now also in faceselect mode */
if(U.uiflag & USER_GLOBALUNDO) {
+#ifndef DISABLE_PYTHON
BPY_scripts_clear_pyobjects();
+#endif
BKE_undo_step(1);
sound_initialize_sounds();
}
@@ -1248,12 +1252,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
* - grease-pencil also defaults to leftmouse
*/
if(event==LEFTMOUSE) {
+#ifndef DISABLE_PYTHON
/* run any view3d event handler script links */
if (sa->scriptlink.totscript) {
if (BPY_do_spacehandlers(sa, event, val, SPACEHANDLER_VIEW3D_EVENT))
return; /* return if event was processed (swallowed) by handler(s) */
}
-
+#endif
if(gpencil_do_paint(sa, L_MOUSE)) return;
if(BIF_do_manipulator(sa)) return;
}
@@ -1309,10 +1314,12 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}
+#ifndef DISABLE_PYTHON
/* run any view3d event handler script links */
if (event && sa->scriptlink.totscript)
if (BPY_do_spacehandlers(sa, event, val, SPACEHANDLER_VIEW3D_EVENT))
return; /* return if event was processed (swallowed) by handler(s) */
+#endif
/* TEXTEDITING?? */
if((G.obedit) && G.obedit->type==OB_FONT) {
@@ -1523,7 +1530,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
/* Brush properties */
case AKEY:
- br->flag ^= SCULPT_BRUSH_AIRBRUSH;
+ if(G.qual==LR_SHIFTKEY)
+ br->flag ^= SCULPT_BRUSH_ANCHORED;
+ else
+ br->flag ^= SCULPT_BRUSH_AIRBRUSH;
update_prop= 1; break;
case FKEY:
if(ss) {
@@ -1541,8 +1551,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
sd->brush_type= DRAW_BRUSH;
update_prop= 1; break;
case SKEY:
- sd->brush_type= SMOOTH_BRUSH;
- update_prop= 1; break;
+ if(G.qual==LR_SHIFTKEY)
+ sd->flags ^= SCULPT_INPUT_SMOOTH;
+ else {
+ sd->brush_type= SMOOTH_BRUSH;
+ update_prop= 1;
+ }
+ break;
case PKEY:
sd->brush_type= PINCH_BRUSH;
update_prop= 1; break;
@@ -3255,16 +3270,21 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case XKEY:
case DELKEY:
- if (okee("Erase selected")) {
- remove_marker();
- del_ipo(0);
-
- /* note: don't update the other spaces (in particular ipo)
- * or else curves disappear.
- */
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWSOUND, 0);
+ /* markers are incorported under shift-modifier (it does go against conventions, but oh well :/) */
+ if (G.qual == LR_SHIFTKEY) {
+ if (okee("Erase selected marker(s)?"))
+ remove_marker();
}
+ else {
+ if (okee("Erase selected?"))
+ del_ipo(0);
+ }
+
+ /* note: don't update the other spaces (in particular ipo)
+ * or else curves disappear.
+ */
+ allqueue(REDRAWTIME, 0);
+ allqueue(REDRAWSOUND, 0);
break;
case ACCENTGRAVEKEY:
if((G.qual==0)) {
@@ -3290,10 +3310,10 @@ void initipo(ScrArea *sa)
sipo->blockscale= 0.7f;
/* sipo space loopt van (0,-?) tot (??,?) */
- sipo->v2d.tot.xmin= 0.0;
- sipo->v2d.tot.ymin= -10.0;
- sipo->v2d.tot.xmax= G.scene->r.efra;
- sipo->v2d.tot.ymax= 10.0;
+ sipo->v2d.tot.xmin= 0.0f;
+ sipo->v2d.tot.ymin= -10.0f;
+ sipo->v2d.tot.xmax= (float)G.scene->r.efra;
+ sipo->v2d.tot.ymax= 10.0f;
sipo->v2d.cur= sipo->v2d.tot;
@@ -3311,13 +3331,14 @@ void initipo(ScrArea *sa)
/* ******************** SPACE: INFO ********************** */
-void space_mipmap_button_function(int event) {
+#if 0
+static void space_mipmap_button_function(int event) {
GPU_set_mipmap(!(U.gameflags & USER_DISABLE_MIPMAP));
allqueue(REDRAWVIEW3D, 0);
}
-#if 0
+
static void space_sound_button_function(int event)
{
int a;
@@ -4105,15 +4126,31 @@ void drawinfospace(ScrArea *sa, void *spacedata)
uiDefBut(block, LABEL,0,"Grease Pencil:",
(xpos+(2*edgsp)+(3*midsp)+(3*mpref)+spref),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
-
+
uiBlockBeginAlign(block);
uiDefButS(block, NUM, 0, "Manhatten Dist:",
- (xpos+(4*midsp)+(3*mpref)+mpref),y5,mpref,buth,
+ (xpos+(4*midsp)+(3*mpref)+spref),y5,(spref*1.5),buth,
&(U.gp_manhattendist), 0, 100, 0, 0, "Pixels moved by mouse per axis when drawing stroke");
uiDefButS(block, NUM, 0, "Euclidean Dist:",
- (xpos+(5*midsp)+(3*mpref)+(2*mpref)),y5,mpref,buth,
+ (xpos+(5*midsp)+(3*mpref)+(spref*2.5)),y5,(spref*1.5),buth,
&(U.gp_euclideandist), 0, 100, 0, 0, "Distance moved by mouse when drawing stroke (in pixels) to include");
+
+ uiDefButBitS(block, TOG, GP_PAINT_DOSMOOTH, 0,"Smooth Stroke",
+ (xpos+(4*midsp)+(3*mpref)+spref),y4,(spref*1.5),buth,
+ &(U.gp_settings), 0, 100, 0, 0, "Smooth the final stroke");
+
+ // currently hidden behind G.rt, as it is not that useful yet
+ if (G.rt) {
+ uiDefButBitS(block, TOG, GP_PAINT_DOSIMPLIFY, 0,"Simplify Stroke",
+ (xpos+(5*midsp)+(3*mpref)+(spref*2.5)),y4,(spref*1.5),buth,
+ &(U.gp_settings), 0, 100, 0, 0, "Simplify the final stroke");
+ }
uiBlockEndAlign(block);
+
+ uiDefButS(block, NUM, 0, "Eraser Radius:",
+ (xpos+(7*midsp)+(3*mpref)+(4*spref)),y5,mpref,buth,
+ &(U.gp_eraser), 0, 100, 0, 0, "Radius of eraser 'brush'");
+
} else if(U.userpref == 2) { /* language & colors */
@@ -4294,7 +4331,8 @@ void drawinfospace(ScrArea *sa, void *spacedata)
(xpos+edgsp+(1*mpref)+(1*midsp)),y2,mpref,buth,
&(U.uiflag), 0, 0, 0, 0, "Allows all codecs for rendering (not guaranteed)");
#endif
-
+
+#ifndef DISABLE_PYTHON
uiDefBut(block, LABEL,0,"Auto Run Python Scripts",
(xpos+edgsp+(1*midsp)+(1*mpref)),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
@@ -4302,7 +4340,8 @@ void drawinfospace(ScrArea *sa, void *spacedata)
uiDefButBitI(block, TOGN, USER_DONT_DOSCRIPTLINKS, REDRAWBUTSSCRIPT, "Enabled by Default",
(xpos+edgsp+(1*mpref)+(1*midsp)),y5,mpref,buth,
&(U.flag), 0, 0, 0, 0, "Allow any .blend file to run scripts automatically (unsafe with blend files from an untrusted source)");
-
+#endif
+
uiDefBut(block, LABEL,0,"Keyboard:",
(xpos+edgsp+(3*midsp)+(3*mpref)),y2label,mpref,buth,
0, 0, 0, 0, 0, "");
@@ -4481,6 +4520,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
0, 0, 0, 0, 0, "Select the default render output location");
uiBlockEndAlign(block);
+#ifndef DISABLE_PYTHON
uiBlockBeginAlign(block);
uiDefBut(block, TEX, B_PYMENUEVAL, "Python Scripts: ",
(xpos+edgsp+lpref+midsp),y1,(lpref-2*smfileselbut),buth,
@@ -4492,7 +4532,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
(xpos+edgsp+(2*lpref)+midsp-smfileselbut),y1,smfileselbut,buth,
0, 0, 0, 0, 0, "Select the default Python script location");
uiBlockEndAlign(block);
-
+#endif
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Sounds: ",
@@ -4990,12 +5030,12 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case WHEELUPMOUSE:
if(sseq->mainb) {
if (G.qual == LR_SHIFTKEY) {
- sseq->zoom += 0.10;
+ sseq->zoom += 0.10f;
} else {
sseq->zoom++;
}
if(sseq->zoom >= -1 && sseq->zoom < 1) {
- sseq->zoom += 2;
+ sseq->zoom += 2.0f;
}
if(sseq->zoom>8) sseq->zoom= 8;
} else {
@@ -5018,12 +5058,12 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case WHEELDOWNMOUSE:
if(sseq->mainb) {
if (G.qual == LR_SHIFTKEY) {
- sseq->zoom -= 0.10;
+ sseq->zoom -= 0.10f;
} else {
sseq->zoom--;
}
if(sseq->zoom >= -1 && sseq->zoom < 1) {
- sseq->zoom -= 2;
+ sseq->zoom -= 2.0f;
}
if(sseq->zoom<-8) sseq->zoom= -8;
} else {
@@ -5206,6 +5246,10 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(sseq->mainb)
gpencil_delete_menu();
}
+ else if(G.qual==LR_SHIFTKEY) {
+ /* markers are incorported under shift-modifier (it does go against conventions, but oh well :/) */
+ remove_marker();
+ }
break;
case PAD1: case PAD2: case PAD4: case PAD8:
seq_viewzoom(event, (G.qual & LR_SHIFTKEY)==0);
@@ -5230,26 +5274,26 @@ static void init_seqspace(ScrArea *sa)
sseq->spacetype= SPACE_SEQ;
sseq->zoom= 4;
- sseq->blockscale= 0.7;
+ sseq->blockscale= 0.7f;
sseq->chanshown = 0;
/* seq space goes from (0,8) to (250, 0) */
- sseq->v2d.tot.xmin= 0.0;
- sseq->v2d.tot.ymin= 0.0;
- sseq->v2d.tot.xmax= 250.0;
- sseq->v2d.tot.ymax= 8.0;
+ sseq->v2d.tot.xmin= 0.0f;
+ sseq->v2d.tot.ymin= 0.0f;
+ sseq->v2d.tot.xmax= 250.0f;
+ sseq->v2d.tot.ymax= 8.0f;
sseq->v2d.cur= sseq->v2d.tot;
- sseq->v2d.min[0]= 10.0;
- sseq->v2d.min[1]= 4.0;
+ sseq->v2d.min[0]= 10.0f;
+ sseq->v2d.min[1]= 4.0f;
sseq->v2d.max[0]= MAXFRAMEF;
sseq->v2d.max[1]= MAXSEQ;
sseq->v2d.minzoom= 0.01f;
- sseq->v2d.maxzoom= 100.0;
+ sseq->v2d.maxzoom= 100.0f;
sseq->v2d.scroll= L_SCROLL+B_SCROLL;
sseq->v2d.keepaspect= 0;
@@ -5281,25 +5325,25 @@ static void init_actionspace(ScrArea *sa)
BLI_addhead(&sa->spacedata, saction);
saction->spacetype= SPACE_ACTION;
- saction->blockscale= 0.7;
+ saction->blockscale= 0.7f;
- saction->v2d.tot.xmin= 1.0;
- saction->v2d.tot.ymin= -1000.0;
- saction->v2d.tot.xmax= 1000.0;
- saction->v2d.tot.ymax= 0.0;
+ saction->v2d.tot.xmin= 1.0f;
+ saction->v2d.tot.ymin= -1000.0f;
+ saction->v2d.tot.xmax= 1000.0f;
+ saction->v2d.tot.ymax= 0.0f;
- saction->v2d.cur.xmin= -5.0;
- saction->v2d.cur.ymin= -75.0;
- saction->v2d.cur.xmax= 65.0;
- saction->v2d.cur.ymax= 5.0;
+ saction->v2d.cur.xmin= -5.0f;
+ saction->v2d.cur.ymin= -75.0f;
+ saction->v2d.cur.xmax= 65.0f;
+ saction->v2d.cur.ymax= 5.0f;
- saction->v2d.min[0]= 0.0;
- saction->v2d.min[1]= 0.0;
+ saction->v2d.min[0]= 0.0f;
+ saction->v2d.min[1]= 0.0f;
saction->v2d.max[0]= MAXFRAMEF;
- saction->v2d.max[1]= 1000.0;
+ saction->v2d.max[1]= 1000.0f;
- saction->v2d.minzoom= 0.01;
+ saction->v2d.minzoom= 0.01f;
saction->v2d.maxzoom= 50;
saction->v2d.scroll= R_SCROLL+B_SCROLL;
@@ -5334,7 +5378,7 @@ static void init_filespace(ScrArea *sa)
sfile->dir[0]= '/';
sfile->type= FILE_UNIX;
- sfile->blockscale= 0.7;
+ sfile->blockscale= 0.7f;
sfile->spacetype= SPACE_FILE;
}
@@ -5352,27 +5396,27 @@ static void init_soundspace(ScrArea *sa)
BLI_addhead(&sa->spacedata, ssound);
ssound->spacetype= SPACE_SOUND;
- ssound->blockscale= 0.7;
+ ssound->blockscale= 0.7f;
/* sound space goes from (0,8) to (250, 0) */
- ssound->v2d.tot.xmin= -4.0;
- ssound->v2d.tot.ymin= -4.0;
- ssound->v2d.tot.xmax= 250.0;
- ssound->v2d.tot.ymax= 255.0;
+ ssound->v2d.tot.xmin= -4.0f;
+ ssound->v2d.tot.ymin= -4.0f;
+ ssound->v2d.tot.xmax= 250.0f;
+ ssound->v2d.tot.ymax= 255.0f;
- ssound->v2d.cur.xmin= -4.0;
- ssound->v2d.cur.ymin= -4.0;
- ssound->v2d.cur.xmax= 50.0;
- ssound->v2d.cur.ymax= 255.0;
+ ssound->v2d.cur.xmin= -4.0f;
+ ssound->v2d.cur.ymin= -4.0f;
+ ssound->v2d.cur.xmax= 50.0f;
+ ssound->v2d.cur.ymax= 255.0f;
- ssound->v2d.min[0]= 1.0;
- ssound->v2d.min[1]= 259.0;
+ ssound->v2d.min[0]= 1.0f;
+ ssound->v2d.min[1]= 259.0f;
ssound->v2d.max[0]= MAXFRAMEF;
- ssound->v2d.max[1]= 259;
+ ssound->v2d.max[1]= 259.0f;
ssound->v2d.minzoom= 0.1f;
- ssound->v2d.maxzoom= 10.0;
+ ssound->v2d.maxzoom= 10.0f;
ssound->v2d.scroll= B_SCROLL;
ssound->v2d.keepaspect= 0;
@@ -5381,7 +5425,7 @@ static void init_soundspace(ScrArea *sa)
}
-void free_soundspace(SpaceSound *ssound)
+static void free_soundspace(SpaceSound *ssound)
{
/* don't free ssound itself */
@@ -5711,7 +5755,7 @@ static void init_imagespace(ScrArea *sa)
sima->spacetype= SPACE_IMAGE;
sima->zoom= 1;
- sima->blockscale= 0.7;
+ sima->blockscale= 0.7f;
sima->iuser.ok= 1;
sima->iuser.fie_ima= 2;
@@ -5743,18 +5787,18 @@ static void init_imaselspace(ScrArea *sa)
simasel->blockscale= 0.7;
/* view 2D */
- simasel->v2d.tot.xmin= -10.0;
- simasel->v2d.tot.ymin= -10.0;
+ simasel->v2d.tot.xmin= -10.0f;
+ simasel->v2d.tot.ymin= -10.0f;
simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
- simasel->v2d.cur.xmin= 0.0;
- simasel->v2d.cur.ymin= 0.0;
+ simasel->v2d.cur.xmin= 0.0f;
+ simasel->v2d.cur.ymin= 0.0f;
simasel->v2d.cur.xmax= (float)sa->winx;
simasel->v2d.cur.ymax= (float)sa->winy;
- simasel->v2d.min[0]= 1.0;
- simasel->v2d.min[1]= 1.0;
+ simasel->v2d.min[0]= 1.0f;
+ simasel->v2d.min[1]= 1.0f;
simasel->v2d.max[0]= 32000.0f;
simasel->v2d.max[1]= 32000.0f;
@@ -5898,8 +5942,8 @@ static void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case PADPLUSKEY:
- dx= 0.1154*(v2d->cur.xmax-v2d->cur.xmin);
- dy= 0.1154*(v2d->cur.ymax-v2d->cur.ymin);
+ dx= 0.1154f*(v2d->cur.xmax-v2d->cur.xmin);
+ dy= 0.1154f*(v2d->cur.ymax-v2d->cur.ymin);
v2d->cur.xmin+= dx;
v2d->cur.xmax-= dx;
v2d->cur.ymin+= dy;
@@ -5910,8 +5954,8 @@ static void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case PADMINUS:
- dx= 0.15*(v2d->cur.xmax-v2d->cur.xmin);
- dy= 0.15*(v2d->cur.ymax-v2d->cur.ymin);
+ dx= 0.15f*(v2d->cur.xmax-v2d->cur.xmin);
+ dy= 0.15f*(v2d->cur.ymax-v2d->cur.ymin);
v2d->cur.xmin-= dx;
v2d->cur.xmax+= dx;
v2d->cur.ymin-= dy;
@@ -6011,10 +6055,10 @@ void init_v2d_oops(ScrArea *sa, SpaceOops *soops)
/* outliner space is window size */
calc_scrollrcts(sa, v2d, sa->winx, sa->winy);
- v2d->tot.xmax= (v2d->mask.xmax-v2d->mask.xmin);
- v2d->tot.ymax= (v2d->mask.ymax-v2d->mask.ymin);
- v2d->tot.xmin= 0.0;
- v2d->tot.ymin= 0.0;
+ v2d->tot.xmax= (float)(v2d->mask.xmax-v2d->mask.xmin);
+ v2d->tot.ymax= (float)(v2d->mask.ymax-v2d->mask.ymin);
+ v2d->tot.xmin= 0.0f;
+ v2d->tot.ymin= 0.0f;
v2d->cur= v2d->tot;
@@ -6024,8 +6068,8 @@ void init_v2d_oops(ScrArea *sa, SpaceOops *soops)
v2d->max[0]= v2d->tot.xmax;
v2d->max[1]= v2d->tot.ymax;
- v2d->minzoom= 1.0;
- v2d->maxzoom= 1.0;
+ v2d->minzoom= 1.0f;
+ v2d->maxzoom= 1.0f;
/* B_SCROLLO used here instead of B_SCROLL, to stop old blender's hanging on
* loading a file from a version with horizontal scrolling due to an old bug
@@ -6041,21 +6085,21 @@ void init_v2d_oops(ScrArea *sa, SpaceOops *soops)
v2d->keeptot= 2;
}
else {
- v2d->tot.xmin= -28.0;
- v2d->tot.xmax= 28.0;
- v2d->tot.ymin= -28.0;
- v2d->tot.ymax= 28.0;
+ v2d->tot.xmin= -28.0f;
+ v2d->tot.xmax= 28.0f;
+ v2d->tot.ymin= -28.0f;
+ v2d->tot.ymax= 28.0f;
v2d->cur= v2d->tot;
- v2d->min[0]= 10.0;
- v2d->min[1]= 4.0;
+ v2d->min[0]= 10.0f;
+ v2d->min[1]= 4.0f;
- v2d->max[0]= 320.0;
- v2d->max[1]= 320.0;
+ v2d->max[0]= 320.0f;
+ v2d->max[1]= 320.0f;
v2d->minzoom= 0.01f;
- v2d->maxzoom= 2.0;
+ v2d->maxzoom= 2.0f;
/* v2d->scroll= L_SCROLL+B_SCROLL; */
v2d->scroll= 0;
@@ -6077,7 +6121,7 @@ static void init_oopsspace(ScrArea *sa)
soops->type= SO_OUTLINER;
soops->spacetype= SPACE_OOPS;
- soops->blockscale= 0.7;
+ soops->blockscale= 0.7f;
init_v2d_oops(sa, soops);
}
@@ -6091,26 +6135,26 @@ static void init_nlaspace(ScrArea *sa)
BLI_addhead(&sa->spacedata, snla);
snla->spacetype= SPACE_NLA;
- snla->blockscale= 0.7;
+ snla->blockscale= 0.7f;
- snla->v2d.tot.xmin= 1.0;
- snla->v2d.tot.ymin= 0.0;
- snla->v2d.tot.xmax= 1000.0;
- snla->v2d.tot.ymax= 1000.0;
+ snla->v2d.tot.xmin= 1.0f;
+ snla->v2d.tot.ymin= 0.0f;
+ snla->v2d.tot.xmax= 1000.0f;
+ snla->v2d.tot.ymax= 1000.0f;
- snla->v2d.cur.xmin= -5.0;
- snla->v2d.cur.ymin= 0.0;
- snla->v2d.cur.xmax= 65.0;
- snla->v2d.cur.ymax= 1000.0;
+ snla->v2d.cur.xmin= -5.0f;
+ snla->v2d.cur.ymin= 0.0f;
+ snla->v2d.cur.xmax= 65.0f;
+ snla->v2d.cur.ymax= 1000.0f;
- snla->v2d.min[0]= 0.0;
- snla->v2d.min[1]= 0.0;
+ snla->v2d.min[0]= 0.0f;
+ snla->v2d.min[1]= 0.0f;
snla->v2d.max[0]= MAXFRAMEF;
- snla->v2d.max[1]= 1000.0;
+ snla->v2d.max[1]= 1000.0f;
- snla->v2d.minzoom= 0.1F;
- snla->v2d.maxzoom= 50;
+ snla->v2d.minzoom= 0.1f;
+ snla->v2d.maxzoom= 50.0f;
snla->v2d.scroll= R_SCROLL+B_SCROLL;
snla->v2d.keepaspect= 0;
@@ -6135,7 +6179,7 @@ static void init_textspace(ScrArea *sa)
BLI_addhead(&sa->spacedata, st);
st->spacetype= SPACE_TEXT;
- st->blockscale= 0.7;
+ st->blockscale= 0.7f;
st->text= NULL;
st->flags= 0;
@@ -6166,7 +6210,7 @@ static void init_scriptspace(ScrArea *sa)
BLI_addhead(&sa->spacedata, sc);
sc->spacetype = SPACE_SCRIPT;
- sc->blockscale= 0.7;
+ sc->blockscale= 0.7f;
sc->script = NULL;
sc->flags = 0;
}
@@ -6185,24 +6229,24 @@ static void init_timespace(ScrArea *sa)
BLI_addhead(&sa->spacedata, stime);
stime->spacetype= SPACE_TIME;
- stime->blockscale= 0.7;
+ stime->blockscale= 0.7f;
stime->redraws= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
- stime->v2d.tot.xmin= -4.0;
- stime->v2d.tot.ymin= 0.0;
+ stime->v2d.tot.xmin= -4.0f;
+ stime->v2d.tot.ymin= 0.0f;
stime->v2d.tot.xmax= (float)EFRA + 4.0;
stime->v2d.tot.ymax= (float)sa->winy;
stime->v2d.cur= stime->v2d.tot;
- stime->v2d.min[0]= 1.0;
+ stime->v2d.min[0]= 1.0f;
stime->v2d.min[1]= (float)sa->winy;
stime->v2d.max[0]= MAXFRAMEF;
stime->v2d.max[1]= (float)sa->winy;
stime->v2d.minzoom= 0.1f;
- stime->v2d.maxzoom= 10.0;
+ stime->v2d.maxzoom= 10.0f;
stime->v2d.scroll= 0;
stime->v2d.keepaspect= 0;
@@ -6226,20 +6270,20 @@ static void init_nodespace(ScrArea *sa)
BLI_addhead(&sa->spacedata, snode);
snode->spacetype= SPACE_NODE;
- snode->blockscale= 0.7;
+ snode->blockscale= 0.7f;
- snode->v2d.tot.xmin= -10.0;
- snode->v2d.tot.ymin= -10.0;
+ snode->v2d.tot.xmin= -10.0f;
+ snode->v2d.tot.ymin= -10.0f;
snode->v2d.tot.xmax= (float)sa->winx + 10.0f;
snode->v2d.tot.ymax= (float)sa->winy + 10.0f;
- snode->v2d.cur.xmin= 0.0;
- snode->v2d.cur.ymin= 0.0;
+ snode->v2d.cur.xmin= 0.0f;
+ snode->v2d.cur.ymin= 0.0f;
snode->v2d.cur.xmax= (float)sa->winx;
snode->v2d.cur.ymax= (float)sa->winy;
- snode->v2d.min[0]= 1.0;
- snode->v2d.min[1]= 1.0;
+ snode->v2d.min[0]= 1.0f;
+ snode->v2d.min[1]= 1.0f;
snode->v2d.max[0]= 32000.0f;
snode->v2d.max[1]= 32000.0f;
@@ -7047,6 +7091,7 @@ SpaceType *spacetext_get_type(void)
static void spacescript_change(ScrArea *sa, void *spacedata)
{
+#ifndef DISABLE_PYTHON
SpaceScript *sc = (SpaceScript*) spacedata;
/*clear all temp button references*/
@@ -7055,6 +7100,7 @@ static void spacescript_change(ScrArea *sa, void *spacedata)
BPy_Free_DrawButtonsList();
sc->but_refs = NULL;
}
+#endif
}
SpaceType *spacescript_get_type(void)
diff --git a/source/blender/src/splash.jpg.c b/source/blender/src/splash.jpg.c
index ecd63166792..d6999563d8a 100644
--- a/source/blender/src/splash.jpg.c
+++ b/source/blender/src/splash.jpg.c
@@ -1,1590 +1,9036 @@
/* DataToC output of file <splash_jpg> */
-int datatoc_splash_jpg_size= 50665;
+int datatoc_splash_jpg_size= 288981;
char datatoc_splash_jpg[]= {
-255,216,255,224, 0, 16, 74, 70, 73,
- 70, 0, 1, 1, 1, 0, 72, 0, 72, 0, 0,255,225, 0, 22, 69,120,105,102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 0, 0,
- 0, 0, 0,255,219, 0, 67, 0, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 4, 3, 2, 2, 2, 2, 5, 4, 4,
- 3, 4, 6, 5, 6, 6, 6, 5, 6, 6, 6, 7, 9, 8, 6, 7, 9, 7, 6, 6, 8, 11, 8, 9, 10, 10, 10, 10, 10, 6, 8, 11,
- 12, 11, 10, 12, 9, 10, 10, 10,255,219, 0, 67, 1, 2, 2, 2, 2, 2, 2, 5, 3, 3, 5, 10, 7, 6, 7, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,255,192, 0, 17, 8, 1, 26, 1,245, 3, 1, 34, 0, 2, 17, 1, 3, 17, 1,
-255,196, 0, 30, 0, 0, 1, 4, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 6, 7, 2, 3, 8, 1, 9, 10,
-255,196, 0, 86, 16, 0, 1, 3, 2, 5, 1, 5, 4, 6, 6, 5, 8, 7, 6, 7, 1, 1, 2, 3, 4, 5, 17, 0, 6, 7, 18, 33,
- 49, 8, 19, 34, 65, 81, 20, 97,113,129, 9, 21, 35, 50,145,161, 22, 66, 82, 98,177,211,130,148,193,209,240, 23, 24, 36, 51, 85,
-146,147,225, 67, 69, 83,114,162,178,241, 10, 52, 53, 99,115,131, 37, 68,100,116,132,163,210,194,255,196, 0, 28, 1, 0, 1, 5,
- 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 2, 4, 5, 6, 7, 8,255,196, 0, 63, 17, 0, 1, 3, 2, 4,
- 3, 5, 6, 5, 4, 1, 4, 1, 5, 0, 0, 1, 2, 3, 17, 0, 4, 5, 18, 33, 49, 6, 65, 81, 19, 34, 97,113,145, 20,129,161,
-177,193,240, 7, 22, 50,209,225, 21, 35, 66,241, 82, 51, 67, 98,114,162, 37,130,146,178,194,255,218, 0, 12, 3, 1, 0, 2, 17,
- 3, 17, 0, 63, 0,251,249,133,133,142,108,237, 57, 79,237,181, 43, 82, 28,115, 72,106,197,156,189,220, 32, 66, 76, 7,154, 66,
-130,172, 55,247,155,249, 42,221,123,117, 22,182, 50,177,140, 77,120, 77,167,108,150, 22,241,144, 50,182, 51, 43, 94,113, 35, 79,
-226,181,112,124, 49, 24,181,223, 96,167,219,100, 65, 57,156, 86, 84,242,210, 96,235,175,206,186, 34,174,170,144,165,201, 85, 21,
- 13, 42, 88, 97,102, 42, 95, 36, 32,185, 99,180, 42,220,218,246,189,188,177,201,249, 7,183, 22,169,105,126,162,203,200, 61,169,
-232,202, 66, 61,160,129, 50, 60, 36,161,113, 1, 60, 89, 40, 0, 58,213,186, 40, 93, 95, 28, 85, 25,255, 0, 94,251, 94,105,157,
- 96,229,236,221,171, 51, 25,156,145,119, 34,181, 49,151, 86,215,166,240,144,118,147,232,124,190, 88,102,246, 84,237, 87,218, 94,
- 4,106,149, 90, 12,250,211, 13, 93, 81, 37, 77, 67,109,155, 30,187, 84, 64, 36, 30, 61, 69,241,228,152,207, 29, 95, 98, 87,136,
- 70, 18,203,232,185,100,153,111, 40, 82, 84, 12, 72,113, 32,200,142, 71,151,153,145,235,184, 39, 1,216, 97,150, 75, 94, 46,245,
-186,237,158, 2, 28,206, 82,164,157, 96,182,162, 0, 51,204,115,242, 16,126,135,101,236,199, 66,205,116,120,249,131, 45, 85,152,
-157, 10, 82, 2,216,147, 25,192,164, 45, 39,204, 17,130, 24,249,229,167, 90,137,218, 19,177,110, 98,105,156,197,151, 37,183, 72,
-150,245,228, 82,230, 27,177, 34,221, 75,107, 23, 9, 93,188,199, 94, 46, 15, 24,237, 28,159,218, 11, 33,231,125, 30,153,173, 20,
- 23, 94,122, 5, 58,156,252,169,241, 16,145,223,178,166, 91, 46, 56,209, 4,129,190,195,142,108,110, 57,177,190, 61, 7,133,248,
-177,142, 32, 38,217,214,203, 55, 73,253, 77,168, 16,124,196,193, 35,226, 61, 9,243,206, 41,225, 27,142, 29, 2,233,167, 3,214,
-170,253, 46,164,130, 60,149, 18, 1,248, 30, 92,192,158, 97, 98,159,236,109,219,107, 67,123,117,105,171,218,165,161, 85, 26,131,
-144,162,205, 49, 39,197,170, 64, 84,119,227, 62, 16,149,148, 40, 92,165, 92, 45, 60,164,169, 60,245,227, 19, 61,108,214,141, 57,
-236,243,166, 21,109, 99,213,170,233,166,101,234, 35, 41,118,167, 56, 71,113,238,233, 42, 90, 80, 14,198,193, 82,188, 74, 72,224,
-121,252,113,219, 46,218,229,187,159,103, 82, 8, 92,198, 88,214,122, 71, 90,225,219,188,181,118,219,218, 80,176, 91,137,205, 58,
- 71, 89,233, 82,220, 44, 67,116, 43, 93,116,195,180,150,151, 83, 53,147, 71,115, 25,171,101,234,186, 92, 85, 62,113,142,227, 37,
-192,135, 20,218,188, 14, 37, 42, 77,148,133, 14, 64,189,189, 49, 50,192,150,133,180,178,133,136, 35, 66, 14,224,142, 70,140,219,
-141,186,216, 90, 12,164,137, 4,106, 8, 60,197, 44, 44, 44, 44, 70,167, 75, 11, 11, 20,142,134,118,251,236,253,218, 51, 95,243,
-175,103, 61, 46,155, 84,149, 91,200, 46,169,156,193, 38, 77, 60,179, 25, 47,161,245,178,182,155, 82,142,229,148,173, 10,185,218,
- 18, 69,172, 77,240,102,237,223,117, 10, 90, 18, 72, 72,146,121, 1, 49,175,190,128,237,203, 12,184,134,214,160, 20,179, 9, 28,
-201, 2,116,247, 85,221,133,133,133,128,209,233, 97, 96, 46,126,207, 57, 87, 76, 50, 69, 99, 82, 51,213, 93,186,125, 22,131, 75,
-126,161, 86,156,234, 73, 75, 17,217,109, 78, 56,178, 18, 9, 54, 74, 73,176, 4,155,112, 13,241,243,173, 95, 79, 78,183,234,149,
- 66,117,119,178,119,209,187,156,179,174, 80,167, 73, 83,106,174,185, 37,244,185, 35,109,137, 27, 35,198,121, 13,174,220,237, 11,
-113, 67,112,184, 29, 14,141,134, 19,127,137, 37, 74, 97, 50, 19,185, 36, 36, 9,216, 74,136, 19,225, 89,120,134, 51,135, 97,106,
- 74,110, 23, 10, 84,192, 1, 74, 36, 13,204, 36, 19, 30, 53,244,187, 11, 28,193,244,122,125, 40,154, 57,244,129, 83,234,148, 90,
- 30, 92,159,149,115,133, 2,198,187,148,170,238, 5,184,210, 9,219,222,180,224, 3,189,108, 47,192, 73, 74, 86,149, 11, 41, 2,
-233, 42,233,252, 86,187,180,185,177,124,178,250, 74, 84, 55, 6,173, 89,222,218,226, 22,233,126,221, 97, 72, 59, 17,247,167,145,
-214,150, 22, 22, 40, 14,217, 95, 72, 78,143,246, 54,204,217, 31, 78,243, 51, 14, 86, 51, 78,125,204, 81, 41,212,154, 12, 41, 41,
- 67,140,199,122, 66, 89, 92,215,137, 7, 99, 72, 42,176,224,151, 20, 54,167,128,165, 33,173,237,159,187,116, 52,202,115, 40,242,
- 30, 26,154,149,213,213,189,147, 37,215,212, 18,145,204,248,232, 61, 77, 95,248, 88,228,190,222,159, 73,158,109,236, 95,168,121,
-119, 36,101,126,199,249,207, 81,152,174,208,221,168, 59, 83,203, 72, 89,110, 34,146,239,118, 25, 94,214,151,226, 35,197,212,113,
-138, 50, 71,211,249,169, 16,226,187, 54,111,209,131,170,113,216,142,209,114, 68,135,251,196, 54,210, 0,185, 90,148,168,192, 37,
- 32,117, 36,219, 26,150,188, 59,140, 94, 48,151,153,108, 20,171,110,242, 7,134,197, 64,214, 77,223, 19, 96,182, 47,169,151,220,
- 33, 73,223,186,179,241, 9, 34,190,147,225, 99,152,254,141, 79,164, 82,111,210, 41,148,243, 62,123,133,160,245, 28,161, 71,160,
- 85, 26,129, 14,124,234,171,114, 83, 81,120,183,189,208,141,136, 77,187,187,160, 30,191,124, 99,167, 49,155,121,103,113, 97,114,
-166, 31, 16,180,238, 36, 24,231,202, 69,106, 89, 94,219, 98, 54,169,185,183, 86,100, 43, 99, 4, 79, 46, 96, 26, 88, 88, 88, 88,
-173, 86,169, 97, 97, 97, 97, 82,165,133,133,133,133, 74,150, 22, 22, 22, 21, 42, 88, 88, 88, 88, 84,169, 97, 97, 97, 97, 82,165,
-133,133,133,133, 74,150, 22, 22, 22, 21, 42, 88, 88, 88, 88, 84,169, 97, 97, 97,149, 79, 48,208,104,138, 66,107, 21,168,113, 11,
-151, 45,137, 82, 82,222,224, 58,219,113, 23,194, 0,147,165, 42,123,133,129,145,115,118, 85,157,152, 36,101, 40, 89,154,158,245,
- 86, 44,116, 63, 42,152,212,214,213, 33,150,149,247, 92, 83, 96,238, 74, 85,228,162, 44,124,176, 79, 10, 8,222,148,205, 44, 44,
- 13,204,153,175, 43,228,248, 40,170,102,236,199, 79,165,198,114, 66, 24,110, 69, 70, 98, 24,109, 78,172,217, 13,133, 44,128, 84,
-163,192, 79, 83,130, 88, 80, 98,105, 82,194,195, 9,185,143, 47, 83, 37,166,159, 81,175, 66,143, 33, 64, 20, 48,252,164, 33,106,
-191, 2,192,155,158,111,135,248, 80,105, 82,194,194,195, 53,214,232,205, 86, 27,203,174, 85,163, 10,131,209, 87, 37,168, 42,125,
- 61,242,217, 66,146,149,184, 16, 78,226,132,169,104, 5, 64, 88, 21,164, 30,163, 11, 90, 84,243, 11, 26,165, 74,141, 6, 58,229,
-205,144,134,154,109, 59,156,113,213, 4,165, 32,117, 36,158,152,219,133, 74,150, 22, 22, 22, 21, 42, 88, 88,136,234, 14,175,101,
- 92,131, 72,147, 85,168, 84, 26,109,136,107, 40,157, 80,145,185, 17, 33, 88, 93, 74,121,219,109, 72, 72, 23, 35,175, 78,151,199,
- 29,235, 55,210,169, 75, 85,106, 70, 72,208, 44,133,152,179,165, 84, 47,185, 98,187, 38,115,212,202,127,120, 78,213, 56,219, 44,
-148,186,227, 73, 55, 35,113, 4,132,253,238, 65, 39, 98,217,251,146, 67, 98, 98,160,183, 16,216,239, 26,239, 44, 44,112,195,191,
- 73, 3, 52,218, 36, 74, 87,232,124,234,244,198, 33,182, 38, 85,217,206,143,180,195,238,236, 27,214,223,114,132,238, 69,250, 43,
-128,122,243,123,226,252,236,107,218,150,155,218,106,129, 90,145, 14,159, 46, 59,180, 89,141, 52,234, 36, 45, 46,160, 5,162,246,
- 75,201, 0, 57,101, 37,105,228, 5, 13,188,222,247,193,158,195,239, 45,218,237, 22,152, 30, 98,160,139,134,150,172,169, 58,213,
-215,133,133,133,138, 84,106,211, 34, 75, 17, 24, 92,137, 79,161,182,219, 73, 82,220, 90,128, 74, 64,228,146, 79, 0, 99,148, 59,
- 80,246,248, 13,187, 35, 78,116, 14, 79,125, 33, 69, 76,203,204, 13,167,112, 4,241,182, 56,231,113,253,254,159,179,251, 88,159,
-246,238,201, 90,211,158,244,246,159, 67,210,128,227,177, 23, 45, 98,187, 10, 59,193, 14, 62,139, 39,187,228,145,116, 2, 21,185,
- 62,165, 62,152,142,118, 87,236, 67, 78,200,161,156,235,168,204,162, 85, 86,193, 76,180, 69,209, 31,220,155,245, 62,255, 0,195,
-223,231,252, 66,247, 20,226,216,153,194, 48,212, 22, 90,128, 86,249,232,121, 35,169,229,161,153,255, 0,136,212,250, 15, 14, 49,
-194,184, 70, 22, 49,140, 77, 97,231,100,132, 48, 15, 49,205,206,131,158,162, 35,254, 71, 65,201,218, 81,151,198,120,214,122, 69,
- 3, 54,173,199, 76,218,176, 76,255, 0,105, 81, 43, 90,174, 74,130,137,230,228,139, 31,142, 56,255, 0,233,156,237,117,218, 45,
-222,217,121,159, 65,105,217,194,179,150, 50,158, 72,121,152, 20, 74, 13, 46, 99,145, 90,117, 29,203,107,246,165,132, 20,247,138,
-112,171,112, 81,224, 39,104, 22,177, 39,189,123, 89,233, 78, 99,208, 13,119,123, 49, 80,210,235, 16,170, 19,149, 82,161,206, 66,
- 60, 40, 89, 86,245, 54, 15, 75,161, 71,167,236,145,235,129,218,219, 69,250, 63, 59,117,166, 6,100,237,127,164,213, 24, 89,186,
-159, 13, 17,149,152,242,243,171,109, 82, 91, 79, 68,168,182,160, 84, 46, 77,130,146,173,183, 32, 30,113,159,248, 49,197, 60, 57,
-248,119,142, 94,217, 99,201,202,230, 99, 10, 80, 27,105, 26,157, 58,145, 36, 72, 84,138,189,248,221,194, 92, 75,248,145,128, 89,
- 94,240,250,179, 55,148, 18,132,147,227, 34, 4,158,128,192, 48, 81,173, 81,255, 0, 66,103,104,125, 96,237, 59,166, 26,159,217,
-167, 93,243, 29, 71, 50,229,218, 22, 94, 77, 87, 47,214, 42,239,169,247,105, 50, 70,240, 26, 75,203,186,182,171,110,240,146,120,
- 8, 93,184, 81,199, 64,246, 85,207, 85, 42, 61, 3, 80,242, 87,126,179, 10,167,145, 42, 78,150,175,225, 14,183, 29, 96, 42,222,
- 92, 40,252,108, 7,144,192, 24, 57,143,179,135,103,125, 40,168,104, 95, 99, 45, 51,122,131, 75,171,171,255, 0,198,235, 83,148,
- 76,169,201,181,138, 73, 42, 82,136, 35,195,117, 30, 19,112, 0,185, 56,180,251, 17,246,120,172,231, 60,169,153,243, 28,227,236,
-109, 86,168, 82,169,116,231,221,104,157,161,214,212,130,237,184,184,185, 22, 23,231, 97,245, 24, 39, 16,113, 46, 17,198, 95,139,
-214,151,152, 18, 97,182,181, 90,192,128, 83, 16,102, 61,250,237, 42,210,135,195,124, 47,140,240, 79,224,221,221,150, 62,185,113,
-221, 16,130,100,133, 78,145, 58,244,208,234, 2,117,138,224, 15,161,235,177, 63,104,254,215,250, 57,152,153,200,253,175,115, 30,
-156,101, 90, 93,117, 65,186,126, 88,113, 72,114, 84,229, 50,217, 83,174,148, 56,217, 41, 74, 3, 96, 2, 77,252, 86,219,205,219,
-103,238,214, 93,170,180,243, 78,187, 69,253, 26, 93,165,245, 73,252,244,214, 95,162, 58,105, 25,130,107,138,117,246, 93,141, 50,
- 49, 35,188, 85,214, 91,113,181, 95,106,201, 40, 80, 0, 30, 78, 58,103, 66,254,133,175,164, 15,177,221, 30,162,158,202,157,188,
-226,209, 36, 85,221,181, 86, 35,148, 43, 69,125, 41, 22, 67,129, 43, 46,237,112, 93, 67,117,175, 98, 57,227, 7,116,243,232, 18,
-204, 81,244,167, 83,164,106,158,189, 26,246,166,106, 76, 18,196,172,219, 58, 26,221, 68, 93,242, 27,144,242,182,169,123,220, 91,
-139, 64,220,178,160,120, 28, 14, 65,250,133,236,115, 7, 93,243,143,188,250, 22,217, 82, 74, 18, 16, 66,146, 66,129, 42, 39, 40,
- 58,106, 78,164,158,156,171,229, 54, 56,127, 27, 70, 28,211, 12,176,182,221, 9, 88,113, 69,192, 82,164,148,144, 18, 6,114, 53,
-210, 52, 1, 61,121,215, 5, 39,183, 54,182,229,206,207, 90, 39,216,227, 35,231,236,203,149,114,154,233, 11,168,102,137,185, 45,
- 10, 53, 90,129,122,165, 48, 22,219,218,164,149, 37, 13,160,109, 64, 32, 21,168,149, 95,106,109, 54,166,118,172,213,110,203, 90,
-205,148,117, 27,177,126,122,215,234,245, 37, 50, 66, 51,158, 92,212,202, 59,207, 70,148,214,228,220, 32, 2,164,157,200, 43,231,
-106, 84,130,148,144, 77,200, 29,131, 94,250, 3,107, 3, 69,180,221,122,125,174,168,203,218,171,166,173,186,212, 28,219, 22,158,
-174,226,123, 38, 91,210, 90, 74,218,222, 74, 20,218,158, 85,148, 9,184, 82,129, 4, 16, 5,131,160,125,130,254,145,182, 53,242,
-133,171,157,166,123,114,170,167, 78,160,180, 90, 25,115, 45, 82,219,141, 22,123, 68,130, 80,250, 10, 18,133, 2, 82,155,157,133,
-118, 72,218,164,245, 17,127, 30,192, 75,106, 83, 89, 72,254,230,100,171, 48,206, 73, 48, 99, 33,153,220, 18,161,150,167,111,195,
-188, 68, 29, 66, 93,206, 21,253,188,171, 78, 83,144, 36, 38, 68,151, 19, 25,117, 4, 4,144,174,186,215, 55,233, 94,170,125, 32,
-159, 72,135,109,157,102,236,177, 72,237,139, 91,202, 25, 18,129,153,106, 4,154, 92, 22, 27,154,196, 68, 78,117,166, 34,178,234,
- 18,135, 16, 54,240,165, 21,155,132, 11,222,248,139,228, 14,210,157,170, 62,138,190,219, 58,165,217,235, 52,107,165,103, 82,168,
- 20, 44,131, 46,175, 5,140,203, 49,215,146,167,211, 13, 18, 99, 47,106,214,162,217, 10, 86,197,236, 80, 10, 77,207, 22, 22,238,
-158,199, 31, 70,206,101,236,179,219, 63, 86, 59, 77,206,212,136,149,104, 90,145, 85,149, 50, 61, 49,138,114,153, 84, 16,244,199,
- 36, 4, 21, 21,168, 46,193,123,110, 0,185, 23,247, 96, 22,175,253, 18,163, 88,190,144,170,215,107,172,227,158, 98, 76,202,217,
-143, 43,174,139, 86,202,102, 10,210,234,153, 92, 1, 17,100, 60, 23,199, 23, 80,240,220,113,233,140,177,141, 97, 30,210,235, 10,
- 9,246,126,200, 64, 8, 2, 86, 2,103, 92,160,206,226, 73,138,214, 56, 22, 53,236,172,190,130,175,105, 14,153, 37,100,195,100,
-170, 52,204, 70, 88,202, 96, 9,174, 79,236, 51,217,199,183,247,210,107,144,170, 61,174, 51,127,210, 21,156,178,180,201,117,103,
-219,161, 64,162, 74,113, 49,153, 91, 74,181,212,211,110,161, 13,160, 43,194, 27, 74,111,180, 92,158,109,142,110,209, 30,211,253,
-160, 59, 20,213, 59, 77,234, 34,179, 11, 47,234, 91,149,198,168, 51,171,236,180,219,136,106,164,244,249, 66, 76,196,141,187, 15,
- 45, 58, 83,225, 9,220,180,155,113,108,119, 14,157,125, 15,223, 72, 87,101, 41,117,124,129,216,239,183,218,168, 57, 22,175, 53,
-111, 46, 36,202, 86,249, 44, 5,120, 74,146, 44,164, 7,118,128, 55,160,162,251, 71, 75, 12, 57,208, 15,253,159,152,121, 39, 46,
-234,118,159,235, 62,179,171, 49,210,117, 6,158,210, 35, 78, 98, 7,117, 54, 4,166,158, 83,205, 74, 42, 90,214, 22,176,162, 47,
-192, 4, 21, 15,214, 56,211,254,183,131, 32,189,218,188,133,178,162,140,136, 74, 8, 33, 33, 96,144,123,160,108, 54, 36,204,114,
-172,163,128,227,142, 37,142,197,149,161,228, 5,231,113, 78, 2, 10,138, 8, 10, 29,226,119, 59,128, 34,121,242,225, 76,179,170,
-245,186,254,134,171, 82,229,118,132,237, 58,254,175, 63, 29,115, 32, 79,167,199,144,237, 33,111,110, 42,109,189,225,221,229, 4,
- 88, 21,143, 82,118,216, 88,217,154,167,244,176,253, 35,245,253, 57,209, 26, 6, 88,212,122,158, 82,205,181,119,166,209, 43,170,
-149, 70,101,191,173,100, 34, 76,118,227,202, 90, 94,100,216,148, 60,144,173,160, 2, 66,143,184,116,133, 27,232,173,250, 74,180,
-127, 76,147,160,249, 83,233, 19,129, 69,211,170,122,193,102,107, 84,175,103,157, 17,158,243,126,196,190, 78,246,211,127, 32,232,
- 22, 54,232,109,139, 63,181,135,209, 31,168,189,164, 51,134,139,103,151,245,253, 15, 78,210,230,154, 77, 82, 93, 94,150, 28,147,
- 90, 90, 36,180,241,117, 74,109, 72, 74, 20,123,187,125,211,212,122, 97, 59,141, 96, 10,186, 73,119, 34,211, 43, 32,193, 48, 50,
-156,162, 11, 96, 65, 36,119,117,130, 1,158,116,153,192,120,137, 54,139, 12,246,141,175, 42, 1, 18,148,230, 57,129, 81, 4, 56,
-162, 72, 0,247,160,102, 4,136,229, 87,119,209,249,217,103, 83, 59, 53,104,213, 87, 41,107, 54,185,213,117, 22,167,153,107, 46,
- 85,234, 21, 74,233, 82,148,133,189, 29,134,150,202, 66,214,179,221, 2,201, 80, 23, 3,198,120, 24,183, 50, 62,149,233,166,147,
-229, 86,114,182, 72,202,148,218, 37, 26,158,202,132,120, 80,163, 33,136,241,155,185, 81,218,148,128, 18, 57, 36,252, 79,174, 36,
- 20,246, 23, 26, 11, 49,215,109,205,182, 18,109,235,143,159,223, 78, 7,109,188,209,149,242,221, 51,176, 7,103, 21, 57, 63, 81,
-117, 68, 34, 37, 73,170,122,238,236, 10,107,202,238,251,171,143,184,185, 7,114, 46,126,235, 73,113, 71,110,228, 43, 28, 21,163,
- 23,152,230, 35,217,206,171, 50,163,176, 0,110,162, 4, 0, 0,159,149,122, 37,235,246, 92, 63,134,118,185,116, 64,132,141,212,
- 73,217, 32,153, 36,168,199, 94,188,170,148,250, 40,163,183,175, 95, 75,174,184,118,166,211, 8,221,214, 75, 76,154,148,104,146,
-227, 39,107, 83, 12,169,168, 83, 42,244, 61,226, 35, 45,226, 58,130,164, 95,168,191,215, 76,115,207,209,191,216,187, 43,246, 40,
-236,229, 72,211, 42, 82, 16,245, 73, 72,246,170,253, 73, 40,177,155, 57,196,142,245,207, 80,145, 96,132,143, 36, 33, 62,119, 39,
-161, 20,118,221, 74,232, 48, 76,126,253,172, 67, 17, 43,103,244, 36, 4, 39,169, 74, 68, 2,124,247,161,240,230, 28,246, 27,133,
-165, 15,127,212, 81, 43, 84,108, 20,163, 36, 15, 45,170,154,237,207,219, 83, 75,123, 8,232, 60,253,101,212,121, 29,252,130, 76,
-108,187, 66,105,203, 61, 86,156, 82, 74, 25, 71, 93,169,224,169,107, 34,200, 74, 73,228,237, 73,248,183,173,186,119,218,114,169,
-218, 83, 67, 59, 98,246,176,171, 56, 51, 62,177,106, 27,115, 35, 80,150,201, 64,165, 64,141, 46,157,236,205, 37, 37, 68,182,157,
-146,108,150,143,137, 9, 74,119, 18,181, 44, 11, 23, 83,117,175,181,190,191,246,229,103,181, 55,105,223,163,151, 88, 51, 46, 94,
-203, 11, 82,114, 6,159, 55,150, 42, 17,226,211, 0, 88, 45,184,246,248,171, 14,185,225, 11, 93,146, 55,184, 19,127, 2, 18,222,
- 7,253, 37, 29,186, 53, 79,180, 6,175,104, 54,101,205, 29,134,243,214,158,191,145,243, 44,137, 84,170, 78, 97,142,250, 94,204,
- 46, 46, 77, 57,101,152,193,113,155, 37,105, 49,208,147,180, 47,153, 9,227,155, 30,235, 1,194,223,194,221, 67, 77,165, 42, 82,
-210,174,209,121,144, 99,184,114,161, 34,103,120, 42, 32,106, 99,144,175, 62,226, 44, 90,223, 23,101,199,157, 82,146,150,212,144,
-218, 50,172, 79,125, 57,156, 81,136,213, 50, 18,146,116, 19,166, 99, 95,114,104,236,184,138, 92,112, 92, 41,179, 73,184,183,187,
- 28, 51,244,237,246,163,205,217, 7, 68,104, 93,142,244, 82,107,235,207,250,207, 83, 77, 34, 35, 80,213,103, 90,167,169,105, 67,
-199,129,113,222, 41, 73,106,255, 0,178, 92,244,199, 94,104, 22,166,213,117, 91, 67,178,246,168,230,220,139, 63, 40, 74,170, 82,
- 91,151, 58,131, 90,186, 31,166,155, 93, 77,187,185, 40, 32,139,115,116,143,134, 62,117,246, 23, 47,253, 36,223, 75,142,127,237,
-209, 92,139,237, 25, 35, 74, 83,245, 46, 68, 75,151, 40, 91,254, 38,218,113, 60,218,251, 67,175,155,116, 83,168,199, 33,128,218,
-161,139,167,111, 46, 4,162,220,102, 35,145, 92,194, 19,167, 85,124, 1,174,215,136,174,214,253,163, 86, 86,198, 23,114,114,131,
-177, 8,137, 90,181,232,157, 58,201,174,244,236, 91,217,155, 44,118, 63,236,211,148,187, 62,101,134,208, 69, 10,152,145, 81,148,
-132,128,101,205, 88,222,251,198,221,119, 44,170,222,235, 15, 44, 90,248,199,104, 9,232, 46,122,156,101,140, 7,222,118,225,229,
- 58,225,149, 40,146, 79,137,222,186, 59,118, 26,181, 97, 44,180, 33, 41, 0, 1,208, 13, 5, 44, 44, 44, 44, 10,141, 75, 11, 11,
- 11, 10,149, 44, 44, 44, 44, 42, 84,176,176,176,176,169, 82,194,194,194,194,165, 75, 11, 11, 11, 10,149, 44, 44, 44, 44, 42, 84,
-176,176,176,176,169, 82,194,194,194,194,165, 75, 31, 60, 62,153,205, 43,175,234, 54,185,233, 99,173,229,138,172,138, 51, 25,107,
- 50, 51, 81,170, 65,200,210, 43,205,196,113,216,201, 75, 1, 81,217,183,141, 78,109, 8, 89, 35,187, 81, 14,243,221,216,253, 15,
-194,197,220, 62,245, 88,125,208,121, 34, 72, 4,122,130, 60,122,244,161,186,216,117, 25,107,227,238, 78,161,246,247,211,124,150,
-154,230,157,105, 14,118,203, 85,100,233,246, 85,165,230, 85, 64,166, 72, 93, 65,154, 75, 50,102, 37,213,176, 75, 74, 90, 95, 40,
- 76,103, 20,132, 37, 78, 50,151, 84, 45,225, 54,155,105,189, 79,233, 3,212,234,149, 95, 38, 86,245,227, 87, 97,209,105, 25, 18,
-191, 84,161, 86,160, 80,166, 65,122,116,152,229, 14, 68,142,227,179, 34, 33,201, 4,173,110, 32,168, 37, 11,112, 35,106,109,183,
- 31, 83, 49, 92,246,132,237, 31,148,251, 55,210,233, 85,220,237, 69,168,200,131, 84,122,107, 9,147, 5, 9, 88,105,230, 41,242,
-103, 37,181, 2, 65, 42,117, 49, 92,109,176,144,110,226,146,158, 55, 99,100, 99,139,185, 89, 74, 88, 73, 81,219,159, 47, 16,118,
-141, 53,245,170,222,204, 16, 39, 49,138,249,181,157,243, 23,107,157,104,166,209, 97,107,212, 93, 95,151, 91,110,169,145,165, 80,
-168,145,242,180,132, 81, 29,138, 25,142,185,243, 36,236, 99,111,180, 9, 61,230,226,178,146,149, 18, 0, 32, 16,150,249,131, 87,
-254,149, 90, 51, 89,138,169, 84,205, 90,155, 19, 54, 20,212,145, 91,203,209,242,172,249, 17, 89,218,230,232,239, 66, 90, 98,251,
- 51, 13,141,168, 66, 84,135, 23,222, 5,145, 97,186,231,181,167,253, 41,154, 25, 79,162, 73,204,174,100,252,204,228, 6, 41,162,
- 75, 15, 51, 9, 11, 92,151, 67, 84,119, 93,138,134,194,247,151,155, 77,101,157,232, 34,233, 49,228,126,199, 47,164,125, 37,186,
- 51, 79,174, 55, 77,169,229,122,243, 81, 38, 87, 91,167, 82, 42,168,105,167, 24,168, 55,245,156,234,123,210,219, 41, 89, 61,203,
- 38,158,243,235, 85,174, 25, 82, 87,110,160, 91, 23,151, 97, 34,108,196,116,211,195, 65,167,188,141,231, 89,210,135,217,183, 63,
-245, 53,170,175, 47,246, 90,215, 23,117,139, 62,102, 71,115, 60,124,223, 92,129,167,121,126,101, 50,177,169, 25, 14, 45, 65,233,
-243,138,234,239,123, 44,103,143,114,212, 82,218,251,164, 29,169, 86,208,182,138,135,132,110,211,167,154,193,174, 57, 27, 87,178,
- 46, 99, 21,173, 97,171,105,227, 77, 67, 78,164, 57,153,114,157, 69,247,216,173, 57, 76,171, 7, 88, 67, 62,204, 31, 45, 9, 34,
- 14,224,202, 20,195,110,119, 65, 36,110, 80, 55, 70,102,237,115,156, 43, 20, 93, 25,206,218, 61,167, 47, 84,161,234,101,106, 91,
- 95, 82,205,121,150,100,189, 17, 52,185,210,153,117, 14,169,192,219,119, 49,218,116,146, 85,118,201, 0, 21, 16, 49, 86, 80,126,
-151, 26, 15,214,153,137,117,205, 60,154,180,166,168,180,208,233, 14,191, 30, 27,177, 89,139, 74,167, 63, 57,151,158,117,222,237,
-233, 9,151, 48,180,218, 27,251,224,131,192, 27,141, 68, 27,251,148,168, 41,160,173, 34, 59,160,136,238,158, 90, 25, 4,142, 67,
-198, 34,136,123, 36, 17, 10,143,185,160,153, 63, 48,118,183,205, 57, 26,110,124,173,102,221, 70,137, 83,203,217,111, 38,205,163,
-192, 12,188,202, 37,203,147, 88,154,220,240,251, 37,191,244,130, 35, 54,200, 91,106,184, 66, 84, 9, 2,233, 86, 33,170,205, 26,
-234,156,213, 70,207,213,106, 94,168,212, 51,132,141, 59,157, 76,212, 9,242, 96,213,226,199,203,211, 94,204, 52,110,248, 69, 83,
- 17,148,123,148, 52,211,138, 40,134, 10,150,202, 66,247, 39,113,115, 23,243,127, 73,246, 75, 94, 95,107, 61, 59,162, 89,169,188,
-185, 81,159, 87,166,229,250,138,223,136, 30,169, 79,130,231,119,220, 8,253,238,246,131,170,186, 80,183, 54,217, 73, 33, 65, 34,
-202, 32, 43,159, 73,205,107, 74,181, 23, 58,228,125,100,210, 7,163,207,163, 84,212,186,125, 18, 29, 94, 24,113,136, 45, 82,233,
-178, 93, 73,121,110,132, 74,146,227,147,174,211, 77,129,116,146,146, 65, 69,212, 70,205,238,117, 69,184,235, 18, 6,130, 18, 71,
-184,234,118,131,191, 67, 19,217,192,239,253,239, 84, 70,102,166,235,182,102,202, 89,151, 52,231,181,106, 13,114,106,180,203, 55,
- 81, 50,154,228,101, 58,129,102,166,166,167,165,232,172, 73, 98, 67, 43,112,133, 50,181, 45, 41,148,119, 56, 24, 72, 81, 89, 73,
- 6,192,207,153,195,181,187,136,117,140,171,153,245, 81,140,218,245,110,166,206,160,196,250,162, 66,105,212,168, 70,174,218, 32,
- 46,156,181,178, 88,220, 88, 40,216,166, 20,230,246,187,229, 59,114,146, 69,251, 77,237,219, 69,174,233,229,103, 83,168, 90, 55,
-153, 94,164,195,205,127,163, 52, 7,156,145, 13,179, 94,170, 42,168, 41,173,178,202, 59,226,182,144,167,148,146, 86,242, 91,218,
-157,220,120,121,143,203,250, 74,104,176, 42,249,159, 44,202,236,247,155,149, 84,201, 49, 91,115, 53,198,143, 50,158,166,225, 60,
-236,199,225,176,194, 86,169, 9, 47, 41,215, 90,108,161, 72, 78,221,175,130,178,141,170, 2, 62,209,118,225,255, 0,160, 14, 82,
-121,167,195, 72,233,168,255, 0,238,143, 42,124,168, 3,245,111,231,247,252, 85,129,217, 86, 54,123,163, 61,168,217, 55, 56,214,
-107,245, 8, 84, 45, 69,122, 38, 88,155,152,223,113,231,221,167,170,155, 79,124, 89,231, 6,231,144, 31,122, 72, 11,185,182,210,
-155,248, 56,156,106,142,102,153,149,242,139,243, 41,144,102, 74,146,226,210,219, 81,233,205,119,146, 22,146,110,225,109, 36,139,
-168, 54, 22,161,115,107,129,240,192, 29, 16,214,249,154,181, 83,205, 89,102,189,167,211, 50,221,107, 39, 86, 24,167, 86, 41,242,
-167, 51, 37, 61,227,176,216,152,218,155,113,146, 82,164,150,164, 55,126,132, 27,143, 43,225,167,105, 44,224,238, 74,163,194,170,
- 37,110,198, 68,132,189, 25,117, 36,169, 65, 17,183, 22,143, 36,112,146,160,146, 2,141,172, 46, 47,226,231, 1,228,173,203,152,
- 80,130, 99,228, 53,211,174,245,109, 36, 37, 18, 40, 94,157,101,183, 53,119, 50,205,204,153,190,140,152,244, 74, 12,199,233,180,
- 60,178,250, 2,210,215,131,107,175,188, 46, 82,227,174, 37,106, 23,241, 0,218,200, 4,151, 28, 56,152, 53,148,180,219, 72,178,
-218,160,100,172,131, 73,128, 36, 14,226, 52, 10,124, 6,218,246,149,145, 96,131, 96, 46, 58, 94,255, 0,158, 57,247, 74,117,173,
-188,173, 68,159,154,115, 21, 98,180,213, 62,189, 48,191, 66,167,210,139, 73, 91,236, 37, 59, 12,151, 84,232, 42, 72,112,164, 20,
-237,183, 30,166,248,213,159,123, 65, 26,237, 30, 67, 57, 8,212,104,245, 95,102, 90, 97,213,234,213,133, 73,241,145,109,182, 80,
- 33, 27,134,228, 93, 36,125,242,126,240, 73, 5, 54,151, 38, 66, 71,119,225,231, 80,237, 27,220,239, 84, 79,104, 61, 18,236,203,
- 74,213,106,139,116,156,169, 54,161, 37,183, 1,169, 53, 26,168, 26,167, 53, 51,146,234, 88,100, 54,124, 1, 70,220,109,228, 31,
- 92, 93,127, 71, 86,163,228,220,173,154,166,232, 94, 89,202,113, 41, 12, 84, 24,114,164,203, 81, 22,226,128,117, 1, 41, 55,222,
- 77,138,146, 20, 64, 22, 79,217, 40,128, 9, 81, 52, 29, 55, 78,245,143, 48,102,103,178,133, 23, 74,170,166,165, 21,206,238,115,
- 47, 35,113, 97, 99,168,251, 61,215,231,205, 69, 34,222,124,227,174,251, 16,118, 92,173,232,204, 41,249,239, 81,152, 72,204,117,
- 66, 91, 75, 94, 19,236,204, 3,211,194, 72, 23,176, 22,185,176, 72,185, 37, 74,198,197,249,183, 69,143,102,165, 73,129, 26,235,
- 61,106,163, 33,106,123, 48, 17, 93, 9,133,133,133,142,102,180,107, 29,164,240,163,113,140,177, 65,255, 0,157, 46,162,255, 0,
-177,168,191,213,221,254,110, 49, 87,106, 77, 69,255, 0, 99,209,191,171, 59,252,220,116, 95,149,241, 94,131,214,176,127, 49,225,
-189, 79,165, 91,218,141,166,121, 47, 85,178,219,185, 83, 61, 80,218,155, 17,209,192, 88,241, 54,175,218, 66,135, 41, 87,188, 27,
-227,154,115,111,209,127, 76,126,114,158,201,154,140,252,104,234, 55, 75, 51, 98, 7, 74,125,219,130,147,253,184,155,158,212,186,
-141,215,234,122, 55,245,119,191,155,133,254,116,218,141,254,197,163,127, 87,123,249,184,194,197,255, 0, 12, 45,177,229, 5, 95,
- 91,161,100,115,146, 12,116,148,144, 99,194,107,123, 7,252, 76,189,192, 18, 83, 97,112,180, 3,184,128, 83, 61, 97, 64,137,241,
-138,142,233,191,209,179,147,242,237, 69,186,150,119,204, 46, 85,187,165, 5, 6, 54,119,109,170,222,169, 4,147,240, 38,216,233,
- 26, 14, 94,164,229,154, 91,116,138, 52, 36, 49, 29,164, 4,161, 13,166,195,143,134, 41, 17,218,155, 81,143,253, 77, 70,254,172,
-239,243,112,191,206,147, 81,127,216,180,111,234,206,255, 0, 55, 7,194,191, 14,134, 6,209,110,197,132, 54, 14,240,117, 62,100,
-201, 62,243, 85,241,111,196, 23,113,215,131,151,239,173,194, 54,145,160,242, 2, 0,247, 10,191,176,177, 64,255, 0,157, 38,163,
-255, 0,177,168,223,213,157,254,110, 23,249,210,234, 48,235, 71,163,127, 86,123,249,184,214,252,175,138,244, 79,173,100,254,100,
-195, 58,159, 74,191,176,177, 64, 30,212,218,143,254,199,163,127, 86,119,249,184, 95,231, 77,168,255, 0,236,106, 55,245,103,127,
-155,135,252,173,139,116, 30,180,191, 50, 97,157, 79,165, 95,248, 88,160,127,206,155, 81,191,216,212,111,234,206,255, 0, 55, 30,
- 30,212,218,138, 63,234,106, 55,245,119,191,155,133,249, 91, 22,232, 61,105,126,100,195, 58,159, 74,243,181,166,153,246,161,205,
- 90,145,148, 42, 26, 9,168, 83,169,153,126,172,177, 73,212, 22, 89,170, 22, 85, 2, 10, 36,181, 48, 78,136, 47,116,200, 90, 25,
-126, 9, 82, 46,171, 79,109,118,179, 23, 28,231, 63, 71,126,149, 26,173, 87, 57, 49, 83,212,156,222,203,179,107,177,144,217,166,
- 84,162, 51, 18, 92, 37,230, 40, 78,151,160, 63,245,137,114, 33,102,150,137, 45,169,179, 18, 63,120,149,169, 39,190, 88, 10, 87,
- 70,142,212,186,140,121, 52,106, 47,245,103,127,155,140,219,237, 57,168,142, 29,198,135, 69,248,251, 51,191,205,198,157,190, 25,
-142, 90,182, 16,150,219, 49, 27,193, 59,206,191, 1,228, 4,107,173,100, 92,221,224,215,110,169,106,113,193, 51,177, 32,106, 35,
- 65,234,124,201,153, 6, 42,140,215, 77, 16,237,165, 83,204, 26,143,167,249, 10, 30,120,173,229,170,142, 82,136,214, 89,168,230,
- 12,230,192, 67, 82,216,114,158,164, 51, 25, 38,106,203,225,125,212,133, 56,236,166, 88,116, 18,226, 75,178, 16,234, 82,141,218,
-193,145,190,146, 89,185,219, 63,175, 78,231,230,148, 59, 54,153,153,197, 22,160,214,105,134,213, 41,232,142,209,220,110,141, 18,
- 12,114,234, 92,139, 61,169,229,133,174, 67,141,182,159, 11,135,190, 90, 86, 18,155,217,142,209,218,130,242,173,245, 37, 24,159,
-116,103,127,153,130,112,117,159, 84, 39,145,221,101,234, 79,196,199,119,249,152,129, 99, 22,183, 72,206,134,244, 17,175,144, 19,
-190,253,209,239,215,122,151,255, 0, 75,125, 71, 35,142,234,103, 79, 50, 96,105,183,120,248,198,147, 21, 12,236,247, 76,237, 91,
-163, 25, 83, 84, 25,205,116,140,193,157,125,134, 67, 51, 52,226,159, 92,204,145,222,151, 82, 38,143, 17, 79, 70,246,151, 92,251,
- 36, 26,143,181, 32, 23,138,118,142, 83,224,217,127,153,153, 59,178,239,211, 93,146,123, 88,214,251,101, 74,236,177, 72,174,231,
-154,203,207,173,114,243, 5,118,151, 33,168,101,219, 38,204, 33, 51,211,176, 37,161,220,167,146, 18,221,210, 58,227,235,228, 13,
- 65,213, 87,166, 33,153, 84, 74, 75,109,171,239, 45, 44, 56,109,255, 0,246, 96,219,217,174,190,202, 44,166, 32, 21, 91,254,193,
- 86,255, 0,207,138,172, 98,215, 56, 82,156,254,219, 74, 46,128, 12,201,208, 8, 35, 69, 13,247, 87, 83, 86, 46,112, 43,108, 96,
- 53,253,215, 81,217, 18, 83, 5, 35, 82,102,117, 73,253, 59, 39,160,174, 1,200, 90,245,255, 0,180, 41, 93,205, 48, 50,254,111,
-236,235,145, 40,148,169, 78, 22,101, 85,210,168, 43,246, 20,169, 36, 7,182,162,160,226,149,180,144,162, 3,106, 60, 31, 10,186,
- 98,101,244, 60,228,127,164,243, 34,230,172,244,158,221,153,158,187, 54,147, 42, 67,102,142,198,100,175, 34,162,248,146, 22,178,
-235,140, 45, 43, 95,117, 28,167,104, 8, 4, 34,246,216,145,101, 19,212,245,237, 85,212, 74, 94,247, 34, 81,233, 14,161, 28,220,
-197,114,255, 0,147,152,143, 47,180,158,127, 96,146, 40,116,116,159,255, 0,108,239,243, 49,119, 45,246, 33,102,182,153,183,101,
- 33,113, 37, 32,130, 32,206,132,147, 30, 62, 21, 85, 44, 89,225,247,173,186,245,203,234, 82, 38, 2,136, 32,200,141, 64, 2, 64,
-220,120,213,175, 63, 48,100,216,181,132,208,230, 76,130, 42, 14, 39,120,134,228,134,210,241, 71,237, 4, 41, 64,148,222,226,226,
-253, 14, 56,123,233,118,236,171,173,125,163,117,231,179,182,109,209, 13, 61, 21, 90,126, 72,205,146,165,230,169, 2,161, 26, 48,
-134,194,229, 83, 22,133, 89,247, 16, 93,186, 99,188,108,216, 81,240,244,241, 11,205,187, 71,178,199,104,186,116, 54,179,174, 86,
-166, 23,169,235, 38, 60,184,141,173,183,144, 15, 91, 44,172,216, 94,198,222,239,198,131,172, 84,117,235,179, 60,230,231,105,150,
-165, 84,157,136, 21,117,209,171,143,170,100, 55,147,251, 5, 46, 18, 82, 15,170, 10, 78, 49,187, 59,206, 28,189, 67,198, 51, 65,
-137, 4,164,200, 41, 58,131,208,252,171,169,102,194,203,139,172, 23,110,149,145,170,102, 32, 30,234,130,134,224,238, 71,206,187,
- 59,183,140,126,208, 50,187, 21,102,204,165,217,135, 40,174,173,157,107,116,129, 75,165,199, 68,148, 51,236,232,127,236,221,123,
-114,184,240,182, 86, 71,190,216,140,253, 17,253,143, 43, 29,139, 59, 21,229,253, 49,207, 20,150, 98,102,170,140,135,234,185,173,
-182,150, 23,182, 83,170,176,111,120,251,219, 27, 75,105,248,131,136, 62,134,253, 36,211,115,212,117,101,201,240,163,210,115, 37,
-129, 85, 38,168,226,158,143, 32,139,220,198,123,114, 72, 38,227,236,220,189,172, 2, 72, 23, 38,204,167,246,182,207, 53, 56,254,
-213, 10,145, 71, 32, 40,165,105, 84,103,130,144,160,108, 82, 71,123,193, 24, 38, 30,221,253,254, 28,171, 6, 2, 64,204, 22,100,
-194,140, 8, 30, 5, 35,195,158,245, 75, 21,179, 99, 9,197,147,125,118, 21,152, 39, 32,210, 82, 36,201, 62, 10, 61,122,109, 93,
- 16,163,199, 30, 88,247, 28,248,123, 84,234, 56,233, 70,162,255, 0, 87,123,249,184,201, 61,170,117, 29, 95,245, 45, 23,250,187,
-223,205,196,255, 0, 42, 98,253, 19,235, 85,255, 0, 51,225,115,185,244,174,129,194,197, 4,142,212, 90,140,175,189, 70,163,127,
- 87,123,249,184, 59,150, 53,159, 85, 51, 27,110,212,220,129, 64,129, 76,138,146,169,181, 89,205,186,220,118, 18, 57, 36,168,187,
-107,129,229,128,191,195,184,133,179,101,110,148,128, 57,149, 81,152,199,172,110, 92, 13,180, 20, 73,228, 5, 92, 24, 88,229,236,
-247,244,181,246, 40,201, 21,165,101,101,234,115,217,146,160,209, 41,123,244, 86,150,185, 45, 21,143, 32,160, 74,127,241, 28, 54,
-163,253, 35,244,237, 70,157, 14, 30,147,233,157,113,182, 30,144, 16,236,188,195, 25, 40, 64, 4, 19,225, 75,110, 19,208, 18,110,
- 69,135, 54, 61, 49,146,213,179,175, 56, 16,145,169, 48, 43,117,230,222, 97,146,235,137, 33, 32, 77,117, 86, 22, 40, 85,118,158,
-212, 52,159,254, 15, 71,255, 0,128,247,243,113,137,237, 69,168,160,243, 71,163, 31,255, 0,142,247,243,113,181,249, 91, 21,232,
- 61,107,156, 60, 77,133,142,103,210,175,204, 44, 80,137,237, 67,168,157, 62,167,163,255, 0, 86,119,249,184,244,118,158,212, 77,
-215,250,154,143,207,255, 0,167,119,249,184, 95,149,241, 94,131,214,155,243, 70, 21,212,250, 85,245,133,138, 31,252,231,117, 15,
-206,145, 71,254,174,239,243,112,143,105,205, 65,255, 0, 99,209,255, 0,171,187,252,220, 47,202,248,175, 68,250,210,252,209,133,
-117, 62,149,124, 97, 98,136, 79,105,173, 67, 87, 31, 83,209,255, 0,171,187,252,204,101,254,114,250,128,122,209,168,255, 0,213,
-221,254,110, 27,242,198, 43,208,122,211,254,103,194,250,159, 74,189,112,177, 70,167,180,182,160, 30,180,138, 71,245,119,127,153,
-143, 71,105, 60,252,127,234,138, 71,252, 7,127,153,134,252,179,138,116, 30,180,191, 51,225,125, 79,165, 94, 56, 88,163,207,105,
- 60,248, 79, 52,138, 79,252, 7,127,153,140,135,105, 12,247,229, 74,164,255, 0, 87,119,249,152,111,203, 88,167, 65,235, 75,243,
- 62, 23,212,250, 85,221,133,138, 77, 61,163,115,201,235, 73,164,127, 87,119,249,152,244,118,140,207,127,236,186, 81,255, 0,236,
- 59,252,204, 55,229,188, 79,160,245,167,252,205,133,245, 62,149,117,225, 98,148,255, 0, 56,140,243,254,202,165,127,192,119,249,
-152,247,252,226, 51,209,233, 76,165,255, 0,192,119,249,152, 95,151, 49, 62,131,214,151,230,108, 47,169,244,171,171, 17,109, 83,
-209,237, 63,214,138, 45, 63, 47,234, 61, 5, 53, 24,148,202,236, 58,188, 70, 86,226,146, 19, 42, 43,161,214, 86,108, 70,225,184,
-114,147,112,160, 72, 55, 7, 16, 17,218, 35, 60,249,210,169, 95,240, 29,254,102, 16,237, 13,158, 15,253, 85, 75,255, 0,128,239,
-243, 48,147,195,248,162, 20, 20,152, 4,120,210, 60, 73,133,168, 65, 39,210,138, 83,251, 27,118,116,166,203,165, 75,143,167,140,
- 19, 70,205, 21, 76,193, 1,183, 94, 90,219, 68,234,130, 28, 68,149, 20, 19,181, 72, 41,116,132,160,141,168,218,141,160,109, 22,
-102,223, 97,206,205, 13,229,170, 30, 83,255, 0, 39,225,112,178,238, 79,168,229,154, 90, 92,154,234,148,221, 58,114, 82,153, 40,
- 82,138,174,165, 40, 39,133,155,169, 59,214, 65, 27,141,245, 39,180, 14,120, 39,197, 76,165,127,192,115,249,152,216,141,125,206,
-134,231,234,202,103,201,151, 63,153,130,255, 0, 74,199, 7,249,255, 0,242,243,253,207,169,164, 49,252, 36,245,244,173,245,238,
-198,250, 49, 93,137, 72,134,149,230, 74,114,114,243,145,151, 65, 93, 27, 54, 77,134,186,111,115, 1, 84,244, 6, 20,203,169, 45,
- 36,199, 82,144,164,164,128,189,196,170,228,155,140,166,118, 0,236,207,151, 22, 38,100,188,183, 88,203,243, 27,112, 22,106,121,
-127, 52,207,133, 49, 9,246, 56,241, 22,142,253,151,146,225, 75,141, 69, 96,172, 40,157,238, 54, 28, 55, 88,223,130, 9,215,124,
-228,174,180,218,105,255, 0,236,185,252,204,108, 78,184,103, 5, 11,154,101, 55,228,203,159,255, 0,188, 55,244,220,109, 2, 2,
-255, 0,249, 83,140,115, 11, 87, 95, 74,209, 43,176,231,102,233,217, 38, 46,158, 78,201,114, 95,164, 67,159, 85,153, 30, 51,245,
-153, 43, 82, 95,168,247,134, 75,157,225,115,188, 42, 37,197, 20,168,170,232, 54, 41, 32,128,112,214, 63, 96,253, 6,135, 83,147,
-152,225,203,206,108, 86,166,200,113,217,185,134, 62,160,213, 91,168,200, 14, 49, 29,135, 91, 92,148,200, 14,169,181, 34, 36,127,
- 1, 85,146, 89, 65, 64, 78,209, 98,200,214,220,220,179,111,171,169,223,240,156,255, 0,253,225,253, 23, 84,115,109, 86, 90, 24,
- 52,248, 1, 37, 86, 81, 75, 78,112, 63,223,192,151,103,140, 50,146,162,228, 13,127,203,222,125,106,195, 56,157,133,195,129, 8,
- 4,147,225, 66,145,216,183, 64,209,149,166,228,145, 67,170,125, 85, 57,233, 50, 28,136, 51, 20,192, 17, 37,234,128,168,153, 40,
- 80,119,114, 31, 68,148,133,161,208,119,162,214, 6,215, 4, 93, 75,176,198,138, 66,201,121,190,137,147,242,234, 77, 79, 55,208,
- 62,174,170, 84, 51, 21, 74,108,225, 49,105,147, 34, 90, 30,144,175,104, 67,203,115,191,146,226,203,137,113, 43, 30, 16,149, 0,
-132,129,105, 43, 49, 76, 66, 65, 91,109,127,186,127,191, 26,142,105,158, 77,144,195, 71,228,175,239,198, 72,190,186, 79,253,195,
-188,239,207,173,109, 11, 34,173,146, 42, 11,217, 75,179,125, 99,179,221, 47, 51, 74,205,121,245,236,197, 91,205,149,241, 84,170,
- 77,113,201, 43, 75,101, 17, 88,140,219,105, 92,167,223,121,118,109,132,146,165,184,121, 81, 9, 8, 72, 74, 69,161, 83,165,211,
-234,241, 21, 2,169, 1,169, 12,175,239, 52,242, 2,129,252,112,201,154,204,229,183,222, 56,134,135,193, 39,251,241,173, 89,146,
- 66, 20, 91, 45,183,127,129,254,252, 9,219,149,188,225,113,103, 83, 78,155,101, 1,148, 87, 63,107,183,100,141, 65,123, 54, 26,
-222,143,174, 52,138,108,148, 11,210,165, 4,255, 0,160,168,117, 13,169, 78, 32,119,100,248,130,121, 32,147,110, 44, 0,157, 47,
-236, 85,168,149,156,216,196,237, 98, 44, 71,166, 68,112, 58,152,177, 84,143,180, 80,232, 60, 46, 44,223,247,137, 27,121,176,189,
-136,233,161, 94,152,161,184,182,221,173,208,164,255, 0,126, 49, 70, 97,154,226,251,180,180,215, 62,227,253,248,180, 49, 27,132,
-181,147,227,206,134,108,137, 84,209, 56,112,161,211,227,162, 36, 24,200,105,164, 32, 37, 8, 66,108, 0, 2,192,126, 0, 99,126,
- 6,138,180,159, 52, 34,255, 0, 3,253,248, 70,170,248,253, 84, 19,240, 63,223,138, 57,197, 19,179, 85, 18,194,192,179, 85,152,
- 15,133, 45,254, 7,251,240,176,179,166,151,100,186,229,193, 7,142,152, 94,195,234, 48,103,216,147,255, 0,103,143,125,132, 14,
-141,254, 88,245,223,105,175, 46,246,111, 10, 11,245,120, 62, 88, 95, 87, 15, 76, 27,246, 31,220,199,134, 8,243, 70, 23,180,210,
-246,111, 10, 10,105,224, 11, 91, 9, 48, 61,216, 48, 96, 36,155,219,242,199,158,194,144,122, 97,253,162,151,179, 80,159, 96,190,
- 49, 84, 18, 60,176,100,195, 4, 90,216,243,216, 69,174, 83,132, 46, 41,123, 53, 6, 48,136,232, 48,132, 37, 19,131, 63, 87,164,
-244, 24,201, 52,212,158,191,195, 15,237, 49, 77,236,212, 29, 48, 21,110, 70, 23,213,202,193,191,171,147,123,243,143, 21, 79,183,
- 79,225,134, 23, 52,189,154,131, 38,159,206, 55,179, 0, 94,214,193, 3, 79, 35, 15, 40,244,119, 38, 77, 67, 40, 70,235,158,152,
-139,151, 65, 40, 42, 39,106,146, 45,138,148, 0, 20, 67, 38,100,211, 61,196,190,227,126, 27,244,182, 44,120,148, 40,241,217, 67,
-105,104, 11, 14,160, 99, 26, 21, 25,186,116, 70,218, 74, 64, 32,114, 6, 10,112, 58,156,121,174, 43,139, 59,118,241,131,160,174,
-247, 13,195, 91,181,104, 72,212,211, 99, 28,180,158, 7, 76, 15,156,226,133,236,112,254,107,202,228, 36,241,129, 50,214,162, 72,
-190, 50,217, 10,113, 82,107, 96,169, 45,167,106, 99, 37,194, 82,164,132,131,127, 92, 66,115,101, 17, 74,120,184,204,123,115,206,
-212,226,106,234, 73, 87, 56,208,235, 40, 88, 33,104, 6,253,110, 49,210, 97,247,107,178,115, 48,212, 86, 21,253,170, 47, 81,148,
-232,106,173,118, 17, 4,164,167,228,113, 15,212,220,143, 7, 48, 81, 76, 39, 91, 64, 82, 46, 88, 36,115,111, 49,253,223, 28, 91,
- 85,220,182,180, 41, 82, 88, 71, 23,228, 12, 71,235, 25, 90, 29,106, 10,233,245, 56,157,227, 46, 14, 69,200, 32,249, 16, 71, 32,
-143, 81,142,154,245, 22,216,221,129, 68,137,220, 30,135,239, 74,193,195,174, 46,240, 28, 68, 58,153,142,126, 34,184, 51, 84,114,
-204,204,165, 93, 53, 24,140, 45,151, 25,115,123, 74, 71, 80,160,110, 8, 62, 88,188, 52,119, 84,127, 72,218,161,231, 69,200, 40,
- 21, 7, 5, 50,186,201,251,162, 70,223,178,118,222, 68,144, 19,127, 59,251,177, 36,213,221, 16,132,237, 57, 94,211,117,139,217,
-137, 75, 3,199,232,133,250, 43,208,244, 87,184,240,106,141, 56,202,210,232,245,154,158,155,173, 74,104, 85,153, 42,167,174,223,
-114, 75,126, 54,200,249,140,113, 12,173,252, 38,249, 57,196, 41, 7,212,115,143, 2, 43,212,111, 31,180,226, 76, 29, 80, 65,144,
-124,199,159,136,222,186,115,217,174,110, 6, 55, 53, 13, 74,253, 92, 51,200, 53,230,179,158, 83,131,152,155, 72, 75,143,178, 4,
-150,129,255, 0, 84,242,124, 46, 32,251,210,176,161,242,193,214,227, 16, 45,108,122,168,184, 75,136, 10, 73,144,107,194, 92,182,
- 83,110,148, 40, 65, 26, 26,125,144, 50,172, 92,195,152,218,135, 82, 37, 49, 26, 66,159,152,161,228,210, 19,185, 95,141,128,249,
-227,231,239,111,190,213, 58,147,218,227, 90,157,208, 93, 62,174, 61, 7, 36, 81,164,152,233,166,211,157, 45,176,250,146,108,165,
-184, 19,247,192, 60, 11,241,197,241,218,221,167,117,113, 61,155,123, 35,230,189, 74, 66,131,117, 90,218, 5, 27, 47,243,101, 23,
- 28, 7,122,199,184, 14,127,161,142, 15,236,167,165,115, 32,211, 14,111,168, 71, 87,180, 79, 81, 86,245, 39,144, 15,191, 30,127,
-196, 55,234,114,240,235,162, 52, 3,150,109,201,247,109, 94,179,192,248,107, 54,214, 70,229,105,239, 43,229,252,212,251, 64,251,
- 54,100,156,152,152,172, 53, 69,109,231,200, 78,247, 86,144, 74,143,153,231, 29, 67,166,116,136,238, 64, 85, 74, 60, 52, 34, 58,
- 20, 90,133,181,187, 93, 35,239, 44,122,220,254, 67,223,138,251, 38,210,102,213, 43,144,178,205, 46,153, 34, 82, 28,121,180,213,
-220,142,146, 19, 26, 61,193, 88, 83,157, 16,165, 38,224, 11,238,230,224, 98,249,106,156,212,118, 83, 30, 51, 41,109,180, 36, 37,
- 13,161, 54, 9, 3,160, 3,211, 15,195, 22,110, 45,227,118,247, 47,211, 61,122,251,170,175, 27, 99, 1,214,197,163, 71,125,252,
- 7, 79,125, 14, 84, 75,240, 83,140, 12, 37, 95,129,130,222,200, 73,231, 25, 8, 32,249, 99,186,237,226,188,180,177, 38,132, 8,
-106,244,252,177,154, 97, 19,250,159,150, 11, 38, 9,243, 24,244,194,255, 0, 22,195, 23,230,155,217,207, 74, 20,152, 74,253,156,
-102, 33,171,211, 4,196, 51,211, 25, 8,132,117, 24,137,126,144, 98,134, 38, 33, 30, 88,247,217, 13,250, 96,159,178,171,254, 88,
-240, 70, 87,248, 56,143,109, 79,216, 26, 26,152,182,234,156,101,236,195,201, 56, 37,236,167, 8, 69,244,195,118,212,187, 3, 67,
-189,152,121, 12, 33, 27,158,152, 36, 34, 31, 76, 47,101, 32,116,194,237,105,187, 10, 96,136,214,235,141,169,140, 15, 4, 97,226,
- 35,144,108, 19,141,137,142,171,223,167,199, 16, 46,212,131, 2,153, 38, 39, 31,119,242,198, 73,137,232,140, 62, 76,110, 47,140,
-132,123, 96,101,218,152, 98,153, 38, 37,197,136,198, 66, 31,157,176,249, 49,239,229,141,137,140, 61, 49, 18,245, 76, 48, 41,130,
- 98, 31, 76,109, 68, 80, 58,140, 62, 68, 96, 79, 9,198,212, 68,244, 78, 4,167,141, 77, 54,244,197, 17,237,209, 63,150, 54,161,
-131,233,135,169,138, 78, 54, 38, 37,240, 34,232,163, 37,131, 77,153,143,199, 3, 18,140,162,134,227,182, 22, 64,190, 3, 55, 22,
-222, 88, 55,151,154,238,219, 41, 29, 73,233,140,156, 81,204,214,138,174,135, 0,111, 45,248,145,200,212,137, 45,185, 37, 64, 2,
-109,231,135, 77,198,101,129,114,158,113,178, 3, 72, 75, 1, 71,169, 29, 49,228,149, 34,246,252, 49,196, 19, 38,187,146,228,156,
-162,181, 72,150, 66,118, 35,140,106, 13,108,251, 85,245, 61, 49,239,118, 74,174,164,254, 88,216,234,217, 45,133,173, 86,183,150,
- 29, 52,243, 26, 10,193, 10,113, 99,109,172, 49,181,178,150,126,237,177,161, 83,163, 33, 62, 19,134, 82, 42,128, 18,111,249,226,
-112, 78,148, 68,160,174,137, 42, 89, 74,174, 85,141,107,171, 54,218,182,149,223, 1,158,171,146, 57, 35, 3,167, 79, 37, 91,146,
-187,123,175,137, 6,232,130,220, 29,234, 88,221, 85,165,139,238, 24, 88,132,166,180,235, 87, 1,207,207, 11, 15,216,154,127,101,
- 21, 20, 16,252,237,143,125,147,221,130, 9,140,146, 63,229,140,189,157, 62,135, 30,133,219, 26,243, 94,192,208,255, 0, 98,255,
- 0, 22,198, 38, 25,244,193, 47,102, 7,221,132, 35,123,206, 23,109, 77,236,230,134, 24,106,242,198, 38, 26,143, 54,193, 79,103,
- 29, 13,207,203, 30, 24,188,252,112,225,243, 75,217,205, 10,246, 83,123,237,199,162, 50,137,228, 96,151,177,159, 92,100,136, 68,
-225,251,106,143, 96,104,123,112, 20,163,194, 48, 66,157,150,101,204,115,104,104,128, 58,220, 96,246, 87,163,182, 85,223,186,128,
-109,210,227, 18, 70,227,182, 60, 73,108, 15,128,198, 29,254, 54, 88, 81, 66, 6,189,107, 82,211, 9, 14,164, 41, 71, 74,140,181,
-145,226,165,171,184,155,155,115,140, 31,201,148,224,215, 1, 65, 95, 28, 74, 95, 72,109,190,152, 31, 33,244, 31, 13,177,207, 43,
- 25,189, 42,144,179, 91,173,225,118,113, 5, 2,162,142,229, 39,138,143,112,171,252,113,157, 38,155, 38,153, 82, 66,220,142,124,
- 39, 18, 36,125,235,131,135, 76,194,110, 66,130,150, 58, 30,184,184,140,125,213, 36,161,209, 32,138, 3,152, 27, 8, 80, 91,102,
- 8,162,112,150,167,153, 14,132,245, 29, 49,146,202,213,193, 24,206, 34, 18,210, 54, 1,211, 25,184,216, 60,131,206, 57,229,168,
- 41, 70, 43, 73, 58,111, 76,221, 74, 84,130, 20,145,238, 56,100,252, 48,179,225, 63, 60, 16,121, 4,117,198,149,160, 1,193,193,
- 90, 89, 72,210,160,179, 38,132, 72,130,160,110, 58,227, 64,130,165, 42,196, 96,171,172,173,106, 38,216, 77,197, 33, 59,173,241,
-197,193,114, 82,157,232, 97,172,198, 98,152, 10, 59,107, 78,215, 16, 13,252,176,210, 76, 10,123,104, 44,174, 34,122,242,109,211,
- 5,165,190, 26, 71,217,158,125,216, 11, 81, 91,160, 21,174,252,226, 77,220,187, 58, 42, 42, 70,221,181,254,161, 65,179, 6, 79,
-162,213,161, 61, 13,230, 80,227, 46,160,165,198,150, 46, 20, 15,145,199, 35,246,170,202,249,219, 66,170, 84,236,241,151, 40, 79,
-212,226,196,169, 33,232,207, 48,217, 90,146,128,161,118,156,253,235, 19,101,121,143,120, 56,236, 61,202,115,194, 13,207,166, 36,
- 19,251, 63,229,252,235,149,196, 60,232,133,149,173, 65,212,180,149, 91,101,135, 0,251,249,190, 15,117,116,167, 45,225,222,241,
- 27,117,245,233, 81,181, 79,176, 92,230,104, 64, 58, 17,200,215, 26,228,141, 80, 86,156,102,186,180,170,142, 94,152,188,189, 93,
-144,153,177,213, 25, 1, 74,135, 33, 73, 1,208, 83,127,186,171, 3,199, 66, 15,174, 47, 76,129, 83,203, 57,237,248,174,211,171,
-140,123, 35,196, 41,231, 74,192, 45,163,204,144,121, 6,223,158, 34,122,255, 0,161,104,211,138, 43,178, 40, 50,162,205, 66,110,
- 83, 21,107, 83,106, 3,208, 27,144, 79,225,136,174,156,118,113,204,181,220,142, 51,213, 87, 57, 59, 65,139, 57, 39,217,155,105,
-238,109,234,127,134, 11,109,196, 87,140, 90,118, 72,136, 26, 9, 6, 71,199,247,172,219,156, 34,214,230,224,186,224, 51,206, 14,
-134,171, 79,164,135, 87,178,167,104, 13,118,162,104,173, 22,164,134,114,150, 72,111,188,155,177, 86, 67,178, 22, 7, 30,251, 36,
-126,103,215, 22, 38,148,232,172,154,237, 30, 42,133, 45,202, 53, 33, 44,164, 52,183, 27,219, 41,244,219,245, 16, 71,217, 15,222,
- 80,221,232,145,194,177, 11,209,205, 38,209,109, 43,215,186,133,119, 61, 85,211, 88,168,206,144,143,170,234, 18,218,251, 22, 29,
-232, 84,160, 77,183,159, 8, 11, 35,143,113,231, 29, 96,212,114,122, 98,254, 23,134,219, 93,164, 62,242,179, 71, 47, 30,166,137,
-138, 99, 79,218,178,155, 91, 81,148, 70,170,235,229,251,208,124,185,148,104,121, 78,148,138, 46, 94,166, 55, 22, 51,100,144,134,
-199, 42, 81,234,165, 19,202,148, 79, 82,121, 56,125,236,135,200, 97,250, 99, 15, 76,101,236,188,241,127,195, 29, 80,112, 36, 64,
-218,184,213, 54,165,153, 59,208,241, 16,223,238,227, 52,196,231,145,135,193,131,210,223,150, 51, 76,101,121,225,139,213, 30,192,
-211, 20,197, 61, 54,227,207, 99,183,234,126, 24, 36, 35,127,129,140,132, 81,136,118,209, 79,236,243, 67, 61,144,126,198, 23,178,
-254,225,252,112, 76,197, 30, 71, 30, 24,163,246,112,187,106,111,103,240,161,190,203,251,167, 11,217, 71,166, 9,123, 55,238, 12,
-120, 99,126,238, 23,109, 77,236,244, 59,217, 71,166, 16,140, 61, 48, 71,217,125,216, 94,203,238,195,246,213, 30,194,135,136,182,
- 60, 12,123,236,215, 28,140, 16,246, 65,233,143, 68, 68,245, 3, 17, 46,138,126,192,208,225, 24,143, 44,100,152,216, 33,236,131,
-246, 78, 61, 17, 71,236,225, 23,169, 6, 13, 50, 76,112, 15, 76,108, 17,248,225, 56,122,152,164,126,166, 50, 76, 99,231,108, 12,
-189, 68, 12, 83, 36,198, 62,152,216,136,164, 30,159,150, 30, 38, 41,233,141,137,141,238,196, 11,181, 48,205, 52, 68,111, 92,109,
- 68, 96, 56,182, 29, 38, 48,242,198,105, 97, 35,203, 2, 83,180, 64,205, 55, 68,113,127,187,248,227, 98, 24,242, 3, 14, 80,192,
-193,106, 61, 21,183, 82, 36, 60, 46, 15,221, 24,172,245,202, 26, 70,101, 26,178,205,170,157, 94, 84,138, 27, 26,139, 49,240, 10,
- 24, 54, 62,120, 51, 77,164,152,137, 79,120,158,125, 45,130,140,180,134,198,208,155, 1,233,143, 36,172, 4,157,163,159, 44,115,
- 87,120,155,143,140,128, 64,174,166,195, 14, 69,178,179,115,172,195,233, 66, 0, 7, 26,156,124,238,220,142, 72,245,195, 55,164,
-169, 42,178,193, 30,152,214,252,228,178,201,230,247, 24,205, 2, 77,108, 6,200,173,242,106,170,104, 16,165,140, 12,147, 91, 82,
-193, 72, 86, 24, 77,158,227,138, 37, 23,192,231,103, 5,248, 9, 32,140, 89,109,177, 86, 82,200, 2,139, 46,162,163,250,223, 44,
-104,151, 80, 74, 17,247,190, 38,248, 14,186,161, 65,178,149,249,225,180,170,182,235,132,156, 88, 75, 69, 70,104,130, 19,161,162,
- 47,213,122,248,176,201,250,157,255, 0, 91,227,206, 6, 59, 49,106,228, 43, 26, 22,241, 61, 85,243,193,195, 2,138,149, 81, 7,
- 39, 93, 87,220,112,176, 52, 60,175,218,194,195,246, 85, 46,209, 21, 37, 75, 2,220,131,143,123,129,251, 56,116,150, 49,233,103,
-212,126, 88,223,237, 43,206,114, 26,107,220, 39,246, 70, 16, 97, 62,105, 24,118, 25, 62, 95,195, 8, 50,112,221,168,165,146,153,
-152,233,242, 24,243,217,199,161,195,222,228,227,223,103, 82,186, 36,225,118,162,156, 34,105,144,142, 47,211,243,198,232,209, 16,
-181,216,167, 27,251,130, 15, 9,198,232,173, 22,150, 20,161,198, 32,227,196, 36,197, 73, 40,214,141, 82, 33,165,168,193, 69, 28,
- 91,211, 14,194,210, 5,128,198,152,142, 21,178, 2, 61, 49,235,132,222,216,226, 46,221, 90,158, 57,171,162, 97, 1, 40, 17, 90,
-166,202, 72, 22,192,153,110,155,149, 3,135, 85, 5,128,111,124, 12,126, 66, 84,163,115,231,138,153,171, 65,164,146, 41,204, 53,
-135, 22, 1,193,136,150, 0, 1,229,136,244,121, 40, 66,184,193,120, 18,148,176, 0, 55,190, 17, 85, 58,208, 98,139,182,177,123,
-222,216,218,165,164, 39,212,225,163,107, 54, 31,217,141,129,195,230, 48,225, 85, 80,163, 90,245,103,212, 97,187,128,168,240,113,
-181,197,169, 34,252, 88,140,107, 14, 36, 3,137, 5, 17, 78, 17, 58,215,168,105, 54,185,198,169,110, 6,208, 82,148,245,198, 97,
-210, 58,156, 53,159, 32,186, 2, 27, 77,213,127, 33,135,206, 73,169,161, 16,104,101, 65,197,182,173,201, 87, 39, 3, 75,115,167,
- 58, 24,105, 11,117, 74,232,132, 38,228,252,177, 35,103, 42,203,154,166,215, 57,228,176,135, 62,232, 60,173, 95, 4,255, 0,126,
- 37,180, 44,187, 76,160,178, 81, 9,146, 22,161,246,142,175,149, 28, 28, 92, 36,104, 53, 52,150,180,160, 84, 66,131,148, 19, 67,
-113, 21,154,248, 5,109, 14,241, 17,135,234,219,155,171,251,177,204,250,175,219,147,180, 20, 13, 68,153,150,242,206,148, 42,101,
- 53,167,212,134,102,185, 52, 50, 28, 60,217,182,209, 98,167, 87,107,240,145,229,114, 70, 59, 62, 84, 56,111, 52,164, 56,216, 55,
-234,125,113, 67,107,206,139, 66,122, 74,179, 46, 86,168,136, 85, 38, 66,204,119,148,144,180, 13,214,220, 20,142, 46, 56, 7,130,
- 15, 31, 44, 87, 93,195,169, 50,161, 63, 74,139, 97,167, 15,126,185,221,125,164,179, 46,172,187, 47, 43, 85,114,196,200, 85,104,
- 46,150,231,211,231, 71, 82, 29, 97, 94, 64,140, 67, 53,203,180,245, 95, 74,178,116, 12,133, 81, 14,182,226, 25,190,208,171,109,
- 10, 36,237, 0,249,243,249, 98,111,216,167,176, 6,190,100, 44,197, 95,212, 60,249,172, 21, 60,200,101,173, 69, 21, 28,196,178,
- 86,190, 74,182, 52,146, 78,198,193, 61, 47,111, 65,142, 66,237,181,156, 53,203, 45,118,134,150,238, 88,209,252,185,155,221, 68,
-180,177, 33, 57,146, 50,164,183, 18, 55,121,227,113,150,199, 69,157,160,119,130,234, 74, 65, 0, 89, 71, 6,105,212, 56,169, 27,
- 84,125,145, 38,227, 34,117, 20,102, 6,187,167, 56, 84,149, 78, 97,185, 77, 73, 42, 10,121, 18, 17, 98, 19,228,160,124,239,238,
- 56,250, 77,147, 87, 50,110, 86,166,204,169, 36,135,221,128,202,223, 4,116, 89, 64, 39,243,190, 62,102,228, 76,187, 76,111, 61,
- 39, 59, 69,160, 57, 22,151,245,138, 20,205, 61,230,202, 44,192, 80, 42, 72, 73, 0,165, 36,238,176,226,193, 93, 7, 76,125, 62,
-203, 21,122,110, 98,162,196,174, 82, 29, 14, 70,150,194, 93, 97,105,243, 73, 23, 31, 15,134, 58, 92, 46,237,155,124,210,119,138,
-200,197,236,212,234,210,148, 13,191,138,122,134, 15,149,134, 54, 8,247,198,246, 26, 66,190,254, 54,119, 9,189,146, 49,178,155,
-230, 92,216,214, 81,176,117, 35,106,107,236,222,241,143, 82,192, 7,203, 15,154,130,226,249, 74, 78, 50, 84, 23,146,109,221,159,
-142, 36, 46, 91, 81,128,170, 26,173, 92, 78,226,153, 38, 62,227,100,167,242,195,184,244, 57,143,240,219, 56, 39, 74,164,167,112,
- 91,169,248,241,131,108,180,195, 72,240, 0, 45,231,140,187,204, 88, 48, 97, 26,154,183,109,134,151,117, 94,130,162,206,101,201,
-141, 38,235, 72,189,176,209,218,123,140,159, 26, 49, 50,125, 76,158, 20,171,224,125, 82, 51, 14, 55,116,129,138,182,248,218,148,
-168,112, 85,183, 48,100,148,202, 13, 70, 76,123,121, 99,194,201,195,231,227,132,158, 6, 53,134,136,232, 49,188,135,130,211, 34,
-177, 93,183, 83,106,130, 41,175,117,238, 56,244, 53,238,195,174,232, 30,163, 30,247, 3,211, 15,218, 80,123, 58,106, 26, 30,236,
-122, 26,227,129,249, 97,208, 99,229,140,131, 9,244,194,207, 75,179,166,189,207,184,227,208,200,244,195,158,224,122, 28,122,150,
- 0,242,196,115,211,246,116,216, 49,230, 49,144, 96,245,218,112,232, 54, 7,150, 50,102, 58,157, 88, 64, 6,215,228,226, 37,200,
-212,212,146,212,152, 20,221, 17, 28, 87,221, 65, 63, 1,140,204, 55, 91, 23, 91, 68, 15, 82, 48,122, 12, 86,216,111,106, 44, 79,
-153,195,149, 24,206,178, 89,144,129, 99,140,135,177,118,219, 92, 1, 34,181, 90,194, 86,180,201, 48,106, 61, 14,156,228,181,109,
- 71,226,113,185,202, 52,166, 86, 0,111,112, 62, 99, 4,102, 76,167, 82,163, 46, 75,175,182,203, 45,166,235,113,106, 9, 74, 71,
-169, 39, 12,169, 89,198,147, 90,134,153,244,122,147, 50,227,169, 68, 37,248,238,133,160,145,214,196,113,138,170,198, 22, 85, 40,
- 78,149,109, 24, 58, 2, 97, 74,214,180,123, 35,233, 94,194,202,175,126,150,196,138, 27, 66, 52, 84, 34,220,237,192, 42,214,118,
-165,208,163,123,100,197, 34,246, 59, 91, 43, 1, 75, 3,147,180, 30,164, 14,109,133,144,117, 63, 34,106,109, 57,117, 76,151,153,
- 99, 79,101,151, 10, 30,238, 28,185, 66,135, 80, 71, 81,138,151,119,238,220,182, 1, 76, 70,244,123,123, 54,109, 93,253, 90,158,
- 85, 34, 46,165, 45,220,250,243,134, 18,229,130, 77,151,140,103,212,208, 9,105, 29, 48, 53,217, 4,146, 65,198,120, 50,107,113,
-150, 76, 73,173,146,101, 88, 18,174,152, 27, 38,164, 64, 41, 81,190, 50,149, 48,164, 16,122,121,224, 68,249, 91, 82, 84,149, 98,
-194, 34, 42,216, 64,175,101,212, 0, 28, 28, 13,126,161,226, 42, 81,182, 52,201,152, 72,228,224,124,169, 91, 70,247, 86, 18,145,
-230, 77,177,105,180,205, 76,173, 8, 21,190, 68,197, 94,225, 88,208,185, 69, 66,247,198,158,241, 42, 73, 88, 88,218, 47,115,126,
- 5,177,228, 89, 49,101,178, 31,136,250, 29, 65,232,180, 40, 40, 31,152,197,196,173, 59, 10, 9,113, 19, 91, 67,164,249,227, 52,
-182,162, 46, 71, 24,241, 40, 28, 27,115,141,173,133, 19,111,126, 38, 28, 20,150,160, 19, 53,175,187, 42,251,163,240, 24, 88,145,
-229,166, 51,137,140,232,203,181, 86, 89,104, 57,101,221,214,134,229, 91,247,249,194,198, 51,248,195,108,188, 81,157,189, 58,185,
- 7,222, 50,152,245,170,189,185,163, 9,108, 90,214,198, 93,213,255, 0, 87, 27,210,221,199, 76,102,212, 98,226,130, 66,113,210,
-169,208,145, 38,185, 48,146, 78,148,216, 51,113,194,113,190, 45, 49,114, 14,227,194,125, 78, 10, 51, 79,101, 8, 0,160, 19,239,
-198, 75, 1,177,100,129,242,198, 61,206, 46, 0, 33,189,234,251, 54, 36,153, 93, 52, 77, 46, 34, 5,148,187,227, 54,227,199, 73,
-176,111,143,134, 61,222, 66,190,237,241,234, 93, 7,128,156, 99,174,250,225,123,170,180,209,110,202, 54, 21,137,137, 29, 74,184,
-111,231,141,201,137, 20, 39,196,145,127, 76,100,148,130,157,196,219, 26,222,113,182,211,125,220,143, 76, 12,221, 60, 79,234, 52,
-253,147,100, 64, 21,180, 56,195, 9,218,142, 62,120,212,185, 13,168, 16, 15,195, 3, 37,207, 82, 84, 72,195, 69,213,148,158,119,
- 96, 10, 89, 81,147, 71, 67, 6, 52,167, 21, 39,109,123,244,192, 73,111,132,172,237, 87, 24,115, 46,165,222,141,164,223, 3, 31,
- 89, 90,190,120,136, 58,213,230,155, 32, 83,168,178, 84, 85,107,224,221, 45,226, 19,215,229,128, 16,129,176, 54,243,227, 6,169,
-106, 9,229, 88,124,212,156, 77, 26,101,219,142, 85,206, 54,247,196, 14, 78, 26, 52,177,110, 49,234,149,230,113, 32,106,161, 69,
-110, 91,230,252,155,227, 5, 72, 4,217, 29,113,130, 82,228,133,165,166,144, 84,162,108, 6, 36, 20,138, 12,122, 82, 68,201,190,
- 55,237,112,157,190, 22,255, 0,188,225,249, 84, 20, 82,129,173, 50,135, 72,117,108,137, 21, 21,150, 16, 71,132, 91,196,175,151,
-150, 4,213,115,125, 58,149, 43,234,250, 28, 61,210, 13,198,240,110,175,141,207, 79,150, 48,212,156,222,170,100, 23, 28, 47,115,
-111, 14,206,167,241,197,109,145,171,238, 87,107,238,200,158,247,114,194, 13,237,123,173,195,233,238, 24,164,235,164,154,100,130,
-173, 77, 93,249, 69,165,185, 17, 51,164,158,241,247, 5,212,165, 18,118,143,119,247,225,245, 74, 90,227, 32,168,174,222,227,134,
- 89, 34, 82,101, 66, 47, 95,195,110, 9, 56, 27,159, 51, 85, 62,154,149,239, 95,221, 28,226,227, 73,134, 65, 21, 85,102, 22,102,
-148,204,225, 30, 40, 82, 92,125, 32,158,156,224, 68, 56,185,107, 57,214, 67, 19,234, 1,101, 10, 23,104, 43,174, 41, 29, 90,215,
-152, 84,247,204,102, 25,117, 75, 42,179, 97,148,220,147,138,162,126,126,237, 79,147, 67,154,165,165,217, 1,252,206,220, 71,210,
-169,217,126, 12,132,137,142,178, 77,138,154, 11,178, 84,180,143, 22,210,161,112, 15, 56,101,129, 29,227,165, 22,221,181,188,168,
- 27,242,174,207,214, 45, 73,139,164, 20, 4,207,157, 75,109,218, 50,155, 68,117,251, 38,229,200,101,229,171, 98, 44,210, 65, 46,
- 37, 68,132,248,124, 64,249, 16, 73, 79,205,253,104, 38,102,185,204,170,207,203, 79, 64, 15, 62,243,109,181, 37, 73, 42, 93,182,
- 18,171, 39,238,139,241, 99,207, 91,129,128, 29,160, 62,147, 29, 64,147,152,232,163, 84,116,203, 48,228,186,115, 85,214,214,235,
- 25,150, 19,172,201,117,212, 40,134,124, 32, 20, 4, 7,123,181,146,149, 43,132,249,114, 48, 63, 36,206,206, 90,137, 93,115, 61,
-230, 30,249,104,117,107, 49,212,240, 32,175,113,185, 95, 62, 71,139,122,129,131,148,144,172,252,163,106,155,141,173,150,123,201,
-131,215,157, 73, 87, 1,167,146, 59,182, 82,148,142,128, 12,117, 71,100, 28,202,205, 75, 77,191, 71,156,118,238,210,228, 41, 9,
- 4,255, 0,209,171,196, 63, 61,195, 28,226,244, 5,177, 13, 46, 6,109,199,138,231, 6,244,195, 83,102,105,148,241,152,154, 87,
-250, 56, 90, 4,182,192,251,205,238,218,109,239,228, 31,150, 44, 54,172,201,129, 85, 25,115, 43,146,107,180,218, 90, 61,127, 44,
-111,105,105, 38,226,223, 44, 70,178,198,110,165,102,154, 52,122,229, 22, 88,122, 60,134,194,144,180,255, 0, 15,142, 10,183, 47,
-204, 28, 21, 37, 93,107, 76,132,198,212,110, 44,158,236,219,139, 28, 63,143, 37, 43,177,176, 62,235, 98, 60,196,195,235,135,176,
-230, 0,174, 15, 92, 58,138,198,179, 66, 83,109,171,113, 71,146,243, 64, 93, 3,229,141,107,157,183,130,191,150, 7,174, 89, 31,
-173,110, 56,195, 89, 83,211,110,191,158, 4,115, 40,235, 80, 13, 4,152, 20, 73,250,162, 80,124, 74, 24,105, 34,164,149,139, 3,
-215, 2,156,152,165, 30, 85,127, 76,105,113,229,168, 90,231, 18, 75,122,213,144, 2, 69, 19, 83,193,195,201,199,137, 3,203, 12,
-163, 56,161,213, 95,142, 28,119,192,114, 14, 54,173, 46,148,202,114,157,171, 22,246,209, 47,156,195,122,114, 18,155,116,194,216,
-159, 76,105,106, 75,107, 36, 37, 96,144,108,108,113,189, 42, 73,231, 27, 8,115,180, 78, 97, 88, 46,180, 91, 86, 83, 72, 36, 95,
-129,143,118,156,100,146, 15,221, 24,220,152,238, 44, 92, 52,109,134, 82,146,157,205, 64, 54, 85,176,166,251, 79,166, 22,213, 94,
-214,195,133, 52, 81,247,145,140, 10, 20,162, 54,167, 8, 45, 36, 77, 46,205, 83, 17, 88,198,142,185, 46,134,210,109,234,112,241,
- 77,199, 76,119, 33, 71,149,246,182,218, 86,130, 46,130,124,254, 56,214, 30,110,149, 13,233,210,142,212,180,217, 90,207,160, 2,
-231, 28,155,173, 29,163, 53, 3, 46,178,254,171,100,166,166,210,104, 82, 28, 49,170, 19,229, 71, 79,112,147,115,103,148,187,110,
- 77,133,172, 64, 62,252,114,248,206, 44,150, 92, 13, 5,104, 72, 3,196,159,231, 74,190,149,219,225,236,135, 94, 4,147,200,111,
- 21,208, 84,188,225, 94,211,172,204,114,142,104,168, 55, 84,132,152,139,117,170,146, 30,239,100,157,160,169, 93,226, 16,144, 18,
- 0,244,235,135,210, 53,195, 79,126,183, 69, 11,235,160,185, 18, 32,251, 92, 85,182, 82, 91, 91,118,191, 38,254, 19,107, 30,113,
-243, 86,177,219,170,143,167,179, 42,121,135, 38, 86,220,145, 46, 69, 73,217, 20,250,181, 65,197,186,212,132,169,189,138,108, 43,
-130, 7,136,155, 31, 63, 76, 80,249,255, 0,180,158,170,102, 7, 42,210, 41,153,177,198, 99,189, 79,238,164,152,207, 17,184, 27,
- 94,231,112,230,252,113,205,184,198, 21,133,190, 55,121,112,174,208, 0,142,233, 4,136, 62, 32,141,127,125,199, 74,195,186,227,
- 36, 90,142,226,119,141,249, 14,158,117,222,253,172,126,146,109, 60,250,130,161,167, 89, 82, 60,197, 76, 15,247, 18,223,113,132,
- 46, 43,204,169, 32,144,149, 19,125,225, 87, 29, 45,239,199, 55,102,158,223, 58,171,167,185, 86, 62, 82,210,201, 38,137, 71,101,
- 14,188,220, 84,200,105, 13,135, 22,224, 87,123,192, 81, 74, 65, 22,218, 79, 67,142, 33,205, 90,179, 10,171, 76,106,133, 34,168,
-228,167,217,117, 37, 73,108, 43,109,137,228, 21, 94,220, 96, 46,110,204,149,136,146, 96,210, 37, 79,122, 60,105, 42,176, 75,175,
-238, 79,119,126, 46, 60,192,228,227,176,181,192, 24,100,140,234, 36,147, 39, 55,132,108, 52,143, 42,225,159,199,241, 23,238, 59,
- 85,186,115, 64, 29, 52, 29, 58, 78,230,187,110, 63,210, 47,171, 57,202,112,133, 92,212,161, 38,160,228,177, 32,178,152, 12,187,
- 30, 58,130, 45,118,183,130, 71, 22,184,189,186,227,110, 69,250, 78, 51,190,153,101, 60,215,151, 50, 74, 88,129, 58,168,165,150,
-106, 29,195,108,165,151, 9,251, 71, 16, 54,242,163,229,233,124,112, 46,123,207,239, 73,152, 24,162,161, 61,204, 7,212,216,155,
- 13, 5,176,240, 61, 20, 71,151, 76, 48,111, 60,202,170,237, 97, 50, 84, 20,142,165,106, 82,247, 31, 79,118, 52,127,161,217,191,
- 14, 56,153,219,126, 80,100,127, 29, 40, 3, 22,187,246,142,213, 75, 37, 94, 38,126, 63, 42,250,249,217,211,233, 81, 98, 70,148,
- 72,164,103,124,217, 25,204,196,203,145,217,164, 74,170,164,247,114,148,162, 2,251,213, 32,168,166,198,231,119, 75, 91,140, 95,
-244,175,164, 35, 67, 88, 68, 72,186,129, 87, 77, 18, 75,201, 9,121,231, 22, 28,142,151,127,101, 43, 79, 36, 30,160,144, 56, 56,
-248,131,166,218,223,152,180,242,166, 12, 40, 12,199,125,212,168, 23, 4, 52, 56,226,144,160, 65, 27, 87,193, 4, 31,150, 38,116,
- 94,208,110, 76,201,135, 43,231, 58,148,215, 41,226, 67,138,132,202,154, 79,250, 58,207,136, 42,224, 2, 65, 36,220, 95, 25,207,
-224,138, 15, 74, 63, 79,199,221,167,195,229,177,233,108,184,219, 20,181,202, 51, 5, 36, 8,131,175,198,102,121, 87,220,220,189,
-172, 90,105,159, 41,255, 0, 91,101, 76,245, 77,153, 28,172,160, 45,185,105,235,243, 56,105,153,179,238, 75,161, 82, 95,174, 86,
-179,141, 58, 44, 40,192, 25, 18,157,150,144,134,193, 54,186,141,248,199,196,218,167,105, 92,193, 43, 47,194,202,249,118,172,245,
- 42, 12, 32, 84,149,190, 82, 82,235,155, 70,237,167,109,211,127, 43, 19,137, 14, 94,237, 18, 51, 4, 21,229, 74, 14, 82,147, 84,
-106,163, 24,125,103, 5,164,240,250, 27, 79,141, 69, 92, 21, 40,168, 92, 88,116,247,226,187,152,107,246,237,231, 87,211, 65,212,
-157, 6,218,252,205,116,237,113,234,214,220,118, 34,127,246,250, 71,194,107,233, 38,180,246,173,167,101,252,244,222, 65,201,213,
-152, 79, 69,105, 74, 21,154,219, 46,182,235,109,180,166,194,155, 91, 4,173, 41,116,146,171, 90,226,220,249,227,156,179,159,105,
-125, 78,204,249, 29,154, 37, 39, 49,202,126, 93, 33,231,227,213,167,191, 49, 40, 70,197, 93, 77, 40, 32,125,229,132,241,226, 81,
- 3,223,142, 54,155,175,175, 10, 29, 71, 44, 12,175,220, 48,128,160,168,147, 29, 40, 49,208, 14,237,137,113,126, 62,156, 14,111,
-137,212,188,253, 47, 43,233,204,125, 86,151,146,225, 83, 40,249,138,148,168,212,104,116,234,154,148,229,218, 33, 37,231, 55, 40,
-253,173,252,237,111,118, 50,110,108,113, 22,138, 75,170,204, 52, 16, 32, 2,122,145,154,117, 4,233, 37, 58, 13,122,229,189,197,
- 47, 93, 21,169, 68,128, 57, 14,159, 31, 10,183,179, 94,112,212, 26,254, 79,167,230, 74, 70,125,155, 18,179,245,114,100,212, 35,
- 74,173, 41, 54, 66, 85,181, 42,109,182,205,150,226,173,114,159, 75, 96,234,251, 97,106,243, 52, 42, 85, 86,101,110,125, 58, 45,
- 62,152,136,209,167,209,105, 97,150, 38, 58,149,130, 3,225, 73,176,122,197, 91,201, 85,185, 6,216,231, 58,110,110, 68, 28,191,
- 68, 53,106, 90,232, 52, 60,201, 86,246,215,235, 5,244,185, 32,161,180,237, 83,125,229,138,146, 73,230,199,175,166, 52,235, 23,
-104, 38,243,198,114,122,133,150, 39,119,116,133,109, 68, 72, 84,214,150,203, 85, 5,164, 4, 37,197, 32,120, 59,203, 1,185, 65,
- 34,231,203, 21,173,172,221, 85,194, 83, 18, 82, 84, 66,186, 9, 0,164, 17, 58,238, 34, 98, 6,189, 69, 54,241,181,165, 5, 89,
-251,219, 1,204,248,252,188,235,189,123, 58,125, 38, 25, 95, 63,206,111, 46,106,109, 7,234,135,151, 39,185,110,170,153, 8, 49,
-182,237,240,169,194, 79,133, 74, 32,244,227, 29, 61, 78,206,217, 66,167,151, 83,155, 41,249,138, 35,244,229, 35,112,154,211,193,
- 77,145,241, 24,248,163, 63, 55, 80,234,181,234,125, 63, 44,228,134,225,138, 20, 62,242,175, 21,201,192,183, 33, 64,139,184, 9,
- 41, 81,235,210,255, 0, 12,117,167, 99,238,212,204,228, 90, 25,211, 58,206, 81, 53,122, 13, 62, 59,107,126,165,151,221, 82,216,
-105,151, 84, 84,227,178,133,174,109,113,101, 91,139, 17,141, 91,251,183, 45, 25, 14,100,130, 99, 67, 2, 53,137, 38, 79, 80, 96,
-114, 58, 77,116, 86, 28, 72,227,131, 35,186,244, 53,209,250,213,155,114, 2,179, 93,217,205,113,102, 37,104,239, 10, 26, 76,196,
-173,133, 30, 10, 85,221,184, 18,122, 92, 16, 58, 97, 99,151,181,230,163,163, 20,236,200,212,156,141,155, 50,173,102,153, 39,122,
-152,114,169, 53, 74,146,201,184, 37, 11, 7,145,107,241,238,248, 97, 99,146,119,134,223,184,117, 78,185,112,185, 81, 39, 64, 99,
- 94,144,168,138,205,126,253,194,242,137, 35,126, 71, 74,250,194,132,244, 55,195,200,113,136, 29,229,240,221,132,248,135,199, 4,
- 16,176, 18, 2, 79,150, 59, 60, 66,225, 77,162, 7, 58,234,237,154,204,169, 52,150,189,157,112,222, 67,252, 95, 25, 58,231, 23,
- 39,140, 51,147, 40, 36,220,114,113,204,169,100,154,217,109,178,107,213,204, 45,158, 45,141, 98,166, 82,163,124, 51,126, 69,239,
-124, 53,113,244,129,193,231, 16, 10,154,180,150, 68, 81,163, 87, 73, 78,210,113,173,115,144,187,133,155, 96, 33,149,180,240,113,
-232,152, 84, 57, 56,121, 53, 32,196, 83,154,131,169,231,106,133,176, 34, 67,206, 95, 14, 37, 74, 66, 82,121,231, 3,221,144, 22,
-110, 14, 28, 77, 90, 66, 0, 21,232,125,203,216,158, 49,152, 9, 81,189,252,241,165, 4, 44,216, 97,195, 97, 32,218,248,148, 19,
- 68, 48, 41,212, 84,132,218,248, 37, 25,212,131,112, 48, 49,178,145,208,252, 48,225,151, 82,146, 2,149,111,137,196,130, 73,160,
- 44,131, 70, 99,190, 15, 55,198,242, 73,248,224, 92,119,145,112,174,240,126, 56, 61,150, 34, 34,116,190,245,205,170,109,171, 21,
-130,122,159, 33,254, 61, 49, 34, 34,170, 44,128, 38,139,229,218, 81,132,208,155, 37,145,222,175,238, 5,113,180,122,252,113,186,
-179, 48, 50, 10,183,254,175, 0,117, 62,252,109,153, 39, 98,142,196,149,145,233,128, 21,151,223, 8,113,197,144, 9, 29, 54,224,
- 43, 81,136,170,154,168,230, 53, 92,106,238, 98, 98, 20, 39,156,113, 59,212, 18,108, 73,251,184,165,178, 14,119,118,163, 91,113,
-142,244, 54,143,105,218, 18,165,242,171,158,113,104,107, 74,216, 52,167, 91, 97,145,189, 73, 55, 54,220, 78, 57,123, 44, 87, 14,
- 79,213, 70,215, 60, 31,103, 83,188,238, 28,130, 79, 23,197,126,200,169, 36,209, 91, 80,218,190,130,229,247,151, 78,203, 12,173,
-147, 96, 88, 4,155,115,211, 21,126,171, 84,164, 20, 59,185,103,113,191, 67,206, 39, 57, 27, 49,181, 89,203,145,154,218, 47,220,
-131,201,247, 98, 59,169,121, 41,250,156,103, 87, 25,126, 37, 32,242, 49,117, 36, 6,196, 85, 39, 37, 74,174, 82,170,179, 90,205,
- 90,146,221, 14, 3,123,201,243,183, 67,126, 49, 47,205,154,103,170, 25, 86,135,178,145, 95,159, 21, 98,202, 75,177, 29,216,160,
-127,187,227,137, 6, 66,200,107,203,217,241, 85, 73, 74,220,182,215,116,139, 98,198,205,217,145,170,205, 45, 81,148,194,119,116,
-196, 20,176,161, 21,105, 50,212, 20,239, 92,135,153, 6,107,204,111,171, 47,234, 68,193, 83, 75, 66,237,251,115, 9,113, 65,119,
-184, 85,200,242,182, 38, 89, 59, 79,168,201,165, 50,211,101, 4, 37, 62, 45,160,117,198,253, 67,203, 43, 69, 84,212,119,129,119,
- 57, 36,112,110,112, 94,131,150, 93,167,195,106,107, 79, 40,165,225,123,142, 44,124,198, 34,149, 32,236, 34,162,249,113,104,149,
- 42,106, 43,155,178,186,162,165,214,144,223, 10, 65, 9,219,231,231,138,139, 53,230, 88,212,158,246,140,235,128,180,248, 45,172,
- 31,222, 4, 3,242, 54, 56,186, 53, 23, 49, 63, 71,140,242, 82,214,226, 18, 65,184,232, 61,113,203,217,162,162,186,174,102, 92,
- 53,155,184,227,183, 40, 39,175, 56,179,106,231,247, 42,146, 82,102,106,230,208,205,109,206,122,111, 5, 84,232,146, 67,209, 92,
- 30, 22,222,241, 37, 10,247,122, 95, 22,107,125,171,243,162,141,219,133, 16,123,138, 14, 40,236,159, 73,117,168,237,177, 33, 23,
- 66,211,224, 82,189,125, 13,176, 90,116, 89, 81, 89, 83,172,166,234,108, 93,105,191, 84,250,143,134, 59,174, 26,123, 11,114,235,
-176,188,109, 36, 43,101, 30, 71,161,240, 63, 3, 88, 56,243,184,144,183,237,173, 28, 32,167,112, 57,143,220,124,170,224,111,181,
-182,118,138,221,149, 2, 35,138,234, 9, 73, 24,124,231,108,236,196, 99, 32, 70,203,113,144,224,255, 0, 88, 84,178,111,142,119,
-147,153, 20,201,220, 79, 24,214,230,106, 74,145,100,117,199,168,126, 82,193,220,130, 88, 31, 26,243,223,205,120,194, 4, 7,141,
- 91,213,206,212,218,157, 50,172,170,147, 53,179, 28, 17,100,176,208,240, 36,124, 48,218,143,218,223, 83,232,175, 19, 34,162,137,
-141,168,220,162, 66, 47,111,158, 41,233, 53,235,164,172,185,206, 7,185,153, 16,226,138, 66,133,241,124,112,214, 22,166,242, 22,
- 19, 30, 66,170,163,136,177, 32,230,126,217, 83,230,107,173,114,175,109, 44,191, 46, 50, 81,153,232, 78,178,231,154,227,170,233,
- 63, 35,131,255, 0,231,127,165, 97, 10, 80, 50,247, 14,137,238,122,227,139,152,204, 14,216, 13,215, 3, 14,227,102, 54,183, 0,
-190,184,200,119,128,176,101,175, 48, 73, 30, 0,233,245,173,182,248,227, 22, 75,121, 74,129,243, 26,215, 92, 77,237,153,147, 90,
- 73,246, 10, 36,151, 21, 99,183,122,128, 23,196,106,163,219, 39, 51,200,109,214, 41,244, 40,237,111,184,109,101, 68,148,140,115,
-155,185,132,149,120, 69,189,248, 77,230,165,180,171, 41, 67,241,197,150, 56, 55, 8,103,102,231,204,147, 84, 31,226,220, 85,223,
-251,145,229, 2,186, 47, 71, 59, 68,191,150,170,179, 31,206,111,200,146,220,197, 5,110, 74,175,177, 94,182,197,235,147, 53,115,
- 36,103, 56,166, 69, 42,180,210, 84,159,188,219,202, 9, 80,252,113,193, 80,179,138,247,237, 82,198, 10,196,206,106,100,133, 37,
-226,159, 93,170,182, 5,127,195, 12, 60,178,180,119, 73,233,183,165, 14,207,137, 46,109,210, 16,190,242, 71, 93,253,107,232, 84,
- 74,229, 25, 77, 7, 81, 81, 97, 66,246, 42, 14,139,127, 28, 18, 98,183, 79,148,128,152, 82,218, 89,181,236,133,131,124,124,250,
-137,159,103, 6, 59,182,106,143, 0,122,164, 58,112, 78,141,171, 57,139, 42,200,250,210,155, 95,122, 58,155, 73,187,157,233,178,
- 71,159, 92,114, 23,156, 16,251,146,160,246,190, 35, 79,157,116,182,220,110,203,121, 82,166, 52,231, 7,248,174,241,113,254,240,
-220,163, 27, 19,220,161, 37,205,215,176,232, 49,198,212,206,216,186,139, 67,152,212, 71,234,226,114,220,104,186,152,203,103,122,
-214,129,114, 84, 2, 69,236, 45,215, 19,252,129,219,155, 43, 84,226, 45,204,249, 13,202, 96, 41, 61,219,157,218,199,139,246, 84,
-146, 46,147,142, 82,251, 1,197,173, 26, 86, 85,165, 97, 34, 72, 74,132,129,214, 55,174,146,211,137,240, 75,181, 12,210,130,127,
-228, 52,245,218,188,215, 94,215,185, 41,188,191,245, 99, 53,186,180, 57,176,171,197, 53, 10,108, 88,189,211,254,206,218,182,169,
-197,110, 7,192, 47,127, 9, 23,252,177,243,231,180,119,106,188,215,158, 21, 84,136,137,177, 95,164,102,106,194,183,179, 45, 65,
-106, 82, 26, 1, 13,148, 36, 4,134,201,183, 36, 36, 95,215, 7,251, 84,235, 58,145,168,146,245, 61,213,119, 80, 30,117, 77, 33,
- 18,166, 5, 60,224, 42,185,111,105, 79, 59,147,250,192,121,115,142, 75,173,106, 46, 70,154,107, 47, 74,137, 37,245,169,228,253,
- 87, 13, 42, 67, 73,105, 5, 87,185, 88, 55, 4, 92,244, 7,229,142, 38,199, 14, 91,215, 10,188,121,174,241,136,208, 18, 53,253,
- 51,202, 12, 25,158, 94, 85,195,227, 56,219,215,107, 34, 99,246,218,136,106, 20,108,230,136, 17,114,107, 49,153,155, 13,185,174,
-251, 29, 41,165,217, 77, 41, 96, 2,178, 65,228,250, 12, 85,249,247,235,154, 53, 81,188,162,169,174,195,144,227,253,219,140,190,
-239,250,145,239, 35,203, 12, 94,212,108,195, 73,175,177, 63, 43, 86, 84,167, 97,184, 22,211,206,166,224,184, 61,198,225, 86,247,
-227, 84,250,181,126, 69, 98,161,155,171, 77, 71,126,120,251, 89, 37,100, 30,242,252,149, 90,254,167,160,233,142,223, 13,106,229,
-133,128,178,152, 35,161, 4,170,122,109,207, 94,100,239, 92, 67,239,184,162, 9,175, 39,253, 89,147,106, 46, 49, 76, 68,137,172,
-173,189,174, 75,104, 92, 18, 71, 3,159, 67,252, 49, 23,175, 78,139, 38,160,203,177, 42,171,146,234,148, 3,203,124, 27, 54,155,
- 14, 49, 38,115, 45,206,166,165,138,142, 96,172, 38, 34,167, 54, 36, 53, 13,135,129, 40,107,201, 86, 7, 21,253, 85,205,181,169,
- 17, 33, 77, 81,105, 75, 61,217, 88,228,143, 95,142, 58, 27, 66, 22,102,100,245,170,169,112, 57, 36, 26, 49, 82,204,241,233,189,
-245, 46,159, 41,110, 50,229,186,144, 18, 85,110,160,127,102, 6,210, 29,169, 83,222, 69, 82, 44,149,199,109, 75,218,227,163,160,
-189,250,250,224, 82,195, 45,190,165,205,120, 92,116,183, 91, 99, 25, 85, 71, 30,100, 67, 68,165,247, 73, 55, 66,124,175,235,139,
-201,108, 37, 57, 69, 60,154,147,102, 28,193, 41, 85, 72,245, 33, 84, 84,158,229, 3,187,251, 95, 18, 64, 61, 61,113,237,127, 62,
-201,175, 6, 27, 33,108,161,176, 74,148,149,220,168,159, 60, 70, 95,154,137, 8, 73,104,142, 19,181,203, 12,102,218,217, 91, 74,
- 13,143, 16, 29, 78, 24, 54,132, 0, 99,106,116,172,136, 39,122,156,229,173, 67,221, 82,129, 2,187, 1,185,241,218, 89, 67, 96,
- 93, 42, 81, 80,218, 7,227,108, 89,116, 71,179, 21, 31, 81, 94,165, 82, 99,179,151,153,161,197,223, 61,185,149, 0,181,168, 20,
-141,197, 4,248,183, 18, 65, 9, 7,140, 80,180, 10,173, 54, 43,203, 69, 74, 27,174, 40, 54, 67, 61,209,177, 74,252,142, 39,115,
- 81, 88,246, 89, 82, 51, 54, 74,117, 18,229,197,109,214,139,151, 71,216,132,255, 0,172, 55, 55, 36,218,247,243,198, 22, 38,209,
- 46,107,160, 32,141, 78,146, 72,212, 9, 0,232, 76,233,252,219,109,245,132,229,250, 81,154,254,166, 85,127, 72,170,217,121,213,
-111,139, 53,194,204,137, 18, 90, 14, 56,164, 5, 92, 40,219,139,222,220,140, 72,245, 37,186, 75,180,156,183, 71,203,154,145, 26,
-100, 88, 12,165,107,134,227, 10,105, 48,214,183, 6,224,178,174, 21,207, 36,129,211, 16,172,255, 0, 80,201,217,178, 37, 6, 86,
-157,229, 9,116, 56, 13, 67, 13, 84,170, 83, 29,220,137, 18,121,185, 7,201, 60, 88, 99, 93, 31, 57, 86, 41,236,211,114,134,161,
-209, 89,168,209, 26,150,169, 8,140,195,137,101,199,201, 77,133,222, 0,170,221, 45,229,140,146,195,138, 13,186,216, 41, 41,153,
- 71,118, 78,132, 79, 49, 58,104, 51, 13,245, 52, 86,238, 86,161, 10,216,233,241,240,253,170,108,214,104,169,101, 12,241, 58, 46,
-105,159, 10,180,220, 39,193,167,211,216, 95,127, 17,194, 69,194,208, 83, 97,110,150,183,204, 97,228,238,208,149,202,236,216, 84,
-188,187, 22,149, 77,133, 70,154,169, 44, 73,106,158,148, 72, 36,128, 86,208,113, 41,185, 3,145,111,126, 33,153,131, 52, 84,227,
- 81,103,102, 60,176,236, 72, 49, 95,117,182, 61,149,201,136,117,244,109, 59,129, 70,225,184,164, 90,215, 30,156,226, 63,150,115,
- 69, 57, 16,101,203,173,255, 0,165, 43,188, 85,163,184,118,239, 42, 28,174,227,161,195,180,211,138,100,168,141, 68, 13, 58,192,
-157, 54, 7,222,124,234, 70,233,198,204, 36,192, 63, 41,235,185,171, 78, 70,100,203,153,194,109, 87, 57, 49,147, 93,105,151, 74,
- 18, 35, 70,124, 32,178, 66, 44,108, 57,222, 9,241, 17,135, 29,158,234,129,157, 64,141, 10, 95,181,184,201, 73,118, 84, 54, 22,
- 91, 68,176, 8,251, 37, 56,146, 10, 69,141,237,207,151, 7, 21,221, 17,232,173,215,125,147, 38,190,244,168,146, 34,131, 41,185,
- 13, 13,237,221, 62, 32, 61,195,246,176, 41,252,207, 85,162,204, 12,208,115, 35,233,109,133,149, 89, 14,148, 16,111,197,185,247,
- 12, 9,118,142, 62,202,217, 73,137, 2, 38,116, 31, 79,129,231, 51, 82, 69,242,144,160, 73,219,165, 93,189,165,181, 7, 38,229,
-108,252,154, 30,155, 72,169, 18,196, 80,154,187, 21,136,129,181, 71,147,114, 84,218, 10,198,245,161, 32,128, 20,176, 14, 22, 42,
-106,173,122,169,152, 39, 43, 58,106,229,102,163, 85,153, 85, 1, 76,205, 50,195,206,172, 35,194,123,194,162, 85,113,192, 23,244,
-194,196,108,173, 25,182,181, 67, 75, 73, 90,146, 32,171,121, 60,245,210, 96,233,183,157, 73,215, 74,220, 42, 26, 3,215,122,253,
- 55,177, 33, 42, 1, 72, 87,192,131,135,168,112,119,124,168,123,206, 41,202, 30,171, 84,104,145, 83, 18, 67,105,125, 9,251,170,
- 82,185, 24,115, 39, 92,234,132,142,226, 35, 41, 77,185, 4,223,156, 94,191,225,252, 65,245,101,108, 2, 58,205,122,189,167, 19,
-225, 73,111, 50,201, 7,164, 85,161, 46, 85,147, 96,175, 60, 13,149, 35,175,139, 21,219,154,215, 82,117,165, 5, 70,103,113, 30,
- 21, 11,241,134, 82,117,142,164,153, 1,192,195,101,189,150, 40, 62,190,184,202,252,169,139, 40,254,145,235, 90, 72,226,236, 21,
- 49,222, 62,149, 99,173,251,242, 78, 27,186,249,190, 43, 25,154,209, 91, 90,137,143, 29,148, 15,133,240, 18,173,170, 89,158,160,
-174,106, 5,161,251, 45,113,139, 12,112,102, 40,225,239,194, 71,156,252,170, 78,241,190, 14,218,123,153,148,124,163,231, 87, 27,
-142, 88,245, 24,192,200, 23,177,116,124, 47,138, 34, 70,160, 86,148,229,157,171,188, 72,255, 0,230, 28,105,119, 54,212, 92, 29,
-231,214, 46,159,131,135, 26, 72,224, 71,249,186, 61, 15,239, 84, 15,226, 5,176,217,147,234, 63,106,189, 37, 79, 97,181, 4, 56,
-250, 1, 61, 1, 86, 7, 75,204,180, 72,193, 69,250,163, 41,219,247,134,254,113, 71,202,205, 82,221, 59,213, 53,194, 71, 75,172,
-225,191,215, 14,173, 91,221, 93,239,234,113,117,158, 4, 72, 50,227,190,131,249,170,206,254, 33, 24,254,219, 32,121,159,226,174,
- 33,170,185, 77,178,173,210,156,240,222,222, 14,184,212,246,182,229,166, 25,220,136,239, 41,103,245, 45,108, 83,206,203,120,168,
- 40,116,198,181,187,179,198,165,223,231,141,102,248, 47, 8, 27,230, 62,255, 0,226,177,157,227,220, 89, 91,101, 30,239,230,173,
- 21,235,236,181,135,147, 26,148,145,127,245, 37, 74,233,241,196,126,126,119,204, 53,153, 94,215, 46,172,232, 62, 73,109, 86, 9,
-252, 49, 12, 76,183, 2,192,108, 90,254,184,122,151,100, 5, 11, 44, 16, 71, 56,214,183,192,240,203, 19, 45, 54, 1,245,249,214,
- 13,223, 17, 98,152,128, 9,117,210, 71, 77,190, 85, 38,107, 50, 87, 16,139, 26,172,130, 47,113,246,167, 29, 41,162, 57,106,163,
-150,178, 67, 47,214,222,113, 83, 39, 17, 33,212, 58,178, 75,105, 35,192,142,124,194,121, 62,245, 91,203, 20,223,103, 13, 34,168,
-231,250,250, 51, 37,102, 53,168,180,215, 2,157, 43, 28, 72,116,114, 27, 30,163,161, 87,187,143, 60, 92, 85,173, 77,166, 67,172,
-191, 74,113,244,165,198,239,100,147,201,199, 9,198, 23,246,225, 66,205,144, 58,168,143,128,250,159,117,118, 92, 35,103,112,164,
-155,183,137,141,146, 15,196,253, 7,190,164,181, 42,220,120, 39,126,240, 13,237,215, 17,220,207, 92, 84,132,150, 99, 58, 54,237,
-228,142, 77,206, 43,188,235,171,112, 89, 73, 83,147,146,147,126,128,244, 23,192,108,149,169,201,205,117, 31,104,102, 86,246, 82,
-178, 10, 47,192,244,199, 12, 65,203, 93,174,105, 52, 91, 57, 82,211, 38, 58,214,249, 82,148,121,235,142, 95,237, 15,145, 38,193,
-123,235, 58,115,138, 67,161,123,129, 79, 91,142, 69,142, 58,238,182,210, 38, 69, 74, 72, 35,120,184, 73,235,138,131, 88,178,114,
-171,116,245,182, 64,189,200, 73,244, 3,173,190,120, 10, 87,217,170,164,146, 66,166,188,236,149,218, 46, 22,105,161,181,150,107,
- 83, 11, 51,225,253,155,232,113, 92,174,214, 0,140, 95,115,115,108, 7,153, 84,114,224, 55, 71, 39,169,199,206,188,219, 72,206,
-122, 81,152,218,206, 25, 85,210,151, 90, 88, 15, 32,126,186,111,200, 30,252, 92, 58, 99,218,250,133,156,224,165,167, 38,150,102,
- 32, 4,201,140,233,241,165, 94,159,227,211, 23, 18,148,169, 50,157,170, 46,182,161,222, 78,213,208, 21, 58, 24,155, 33, 83,169,
-206,164, 27,114,112, 30,163, 2,170,180, 22,209, 98, 74,108,163,211, 1, 50,182,167, 49, 57, 14, 45, 50,197,130,111, 98,172, 57,
-149,168, 44,178, 18,148,188, 63,120,250,146, 73,254, 24,170,226, 32,233, 78,219,240, 53,175, 37,105,252, 41,112,146,186,145,222,
- 66,175,221,143, 35,193,198,185, 45,194,140,216,105,224,148,139, 18,132,164,113,128,117,157, 75, 49, 2,251,217,169, 65, 60,139,
- 43,200,121, 98,170,213,238,210, 52, 28,183, 74,118,108,154,178, 80,224,184, 66, 18,171,146,111,108, 2, 72,208, 84, 22,165, 58,
- 96, 82,237, 27,168, 89,102,133, 77,146, 75,169,239,156, 96,132, 39,247,186, 99,159,180,214,139, 55, 53,215, 27,204, 51, 89, 82,
-119,120,144, 74, 72,184,190, 51,133, 31, 50,107,198,108, 69, 94,180,167, 90,166, 33,203,182,209,224,184, 79,159,195, 29, 3,144,
-244,218, 29, 38, 43, 72, 17,128, 64, 2,230,220, 28, 88,111,251, 73,215,115, 82, 82, 18,210, 35,157, 55,160,229,162,244, 61,174,
-120, 71, 80,160, 1, 3, 25,212,232, 97,182, 59,208,143, 18,122,170,216,158, 65,203,204,196,110,233,111,114, 7, 75, 14,131, 2,
-243, 37, 62, 51,108, 40,163,169,227,194, 57, 7,223,238,197,134, 46,138, 87, 84, 28,111, 74,163, 51,149, 9, 84,151, 83, 61,166,
-255, 0,209, 95, 90,130,118,255, 0,209,172,117, 65,254, 35,212, 98, 62,228,198,211,194, 83,139, 38,171, 30, 29, 69,110, 82, 38,
-168, 8,211, 83,181, 75,181,203, 15, 39,238,172, 15,196, 31, 81,124, 87,117,220,189, 62,137, 84,114,151, 53,177,189,181, 88,148,
-158, 20, 58,133, 3,230, 8,228, 31,126, 62,131,224,254, 33,111, 20,177, 13,186,175,238, 32,107,226, 57, 31,161,241,243,175, 30,
-226,140, 29, 88,125,223,104,216,254,218,246,240, 60,199,237,252, 83, 9,147,129,108,128,139,122,224,114, 29, 88, 89, 40, 23, 39,
- 6,133, 40,173, 22, 40, 22, 35, 9,170, 10, 26,231,129,142,216, 92,182, 5,114, 93,225, 76,162, 51, 42,219,220, 80,177,232, 48,
-245,150, 6,235,168,115,141,141, 83,214,130, 44,120,198, 74, 97,212, 47,194, 46, 61,112,198,225, 39,157, 54,101, 86, 15, 54,178,
-155, 14, 49,173,182,202, 85,117, 27,227,110,201, 10, 59, 45,197,240,155,153, 76, 19, 61,128,205,103,191, 72,186,153,223,226, 2,
-221,109,136, 42,229, 8, 26,154,140,170,182, 29,136,177, 66,108,122,223, 24, 63, 82,110, 3,125,252,167, 10, 16, 60,254, 87,195,
- 81,152,155,141,189,188,193, 29,168,197, 43, 74, 90, 91, 78,239, 75,187,151,181, 54,244,242,189,240,238, 94, 87,203, 57,138, 11,
- 53, 61, 67,172,162, 6, 94, 14,157,201,109, 37,217, 15,184,139, 16,139, 54,163,181, 36,237, 5, 70,246,221,124,114,220, 67,197,
-118, 24, 38, 26,229,202,204,168, 76, 38, 9, 36,232, 32, 13,206,227,106, 51, 9, 46, 58,148, 76, 77, 17,137, 92,101, 25, 98,109,
-113,165, 22,215, 1,145, 37,248,175, 50,176,226,162,220, 2,242, 46, 0, 85,175,123, 92,124,113, 8,175,246,167,163, 81,105,243,
-232,172, 83,123,195, 80, 81,136,100,206,140,149,123, 59, 42,108,221,101, 0,158, 13,193, 10,191, 24,107,154, 39,211,179, 62, 98,
-171, 61,217,234,147, 50, 19,113,166, 9, 81, 62,184,125, 18,223, 41, 62, 29,140, 40, 0, 30, 70,244,216, 34,198,194,215,231, 21,
-180,202,150,113,207,185, 46,187,159,117, 50,155, 75, 93,120, 84,125,154, 75, 51, 35, 22, 30,219, 98,178,226,118,169, 33, 92,133,
- 11,112, 5,177,225,119, 92, 99,137, 98,229, 66,249,194, 26, 86, 89,108, 16,149, 39, 52, 64, 32, 3, 35,172,168,244, 32,131, 90,
-192, 54,196,134,245, 80,231,203,220,126, 59, 84,165, 29,162,179,157, 37,164,211, 36,103, 8,213, 74,125, 45,135, 89,163, 38,147,
-189, 14,177,188, 41, 42, 78,228,237, 82,146,171,220,223,173,176, 83, 50,106,109, 70,110, 69,246,106,189, 18,189, 61, 69, 59,166,
-212,163, 70, 89, 67, 10, 74, 56, 5, 43, 23, 87, 66,110, 15, 56,170, 51, 5,114,153,151,178,100, 28,229, 71,166, 46,152,182,160,
-247,110, 3, 45, 46,183, 53,221,228, 41,208, 57, 41, 72, 30, 18,159, 94,152,101,151,117,111, 85,116,204,210,243,213, 58,171, 93,
- 48, 21, 23,116, 50,243,170, 44,186,146,181, 5, 49,226, 4, 4,216,146, 13,143, 76, 98,151,148,153,118,204,101, 82,165, 36, 19,
-151, 57,214, 82,114,233,169,212,239, 36,201, 18, 42,201,184,116,146,151, 21, 49,175,220,235,211,253, 80, 93, 83,175, 80, 43,148,
-202,100,246,171, 79,170,170, 95,113, 79, 73,147, 35,188, 88,109, 55,219,100, 44, 0,132,250,251,241, 9,118,167,147,100,231,236,
-191, 5,186,100, 72,240,156,167,169,170,172,237,253,232,150,242,129, 55,241, 27, 54,111, 97,113,211, 19, 74,236, 45, 43,204,148,
-243,171,114,115, 12,199,171,213,153, 74, 68,156,166,251, 41, 45,181, 31,175,122,183,146, 2, 72, 85,136,216, 44,160,122,140, 65,
-159,127, 50,101,234, 42,170,121, 61,182,133, 40, 74, 72, 45, 38, 27,111, 6, 10, 93, 4, 5, 18, 9, 63,218, 49,176,211,134,226,
-216, 40,102, 7, 84,247,164, 65, 51, 48, 72,239, 1,174, 83, 25, 76, 72,229, 84,110, 51,165, 65, 70, 57,125,255, 0, 21, 12,206,
-236,192,161,231,167, 30,167,211,239, 1, 47,148,169,168,174,111, 78,192,124, 69, 39,161, 54,243,193, 9, 52,212, 85, 98, 57, 78,
-203,153,114, 91,241,230, 29,237,191, 37, 73,178,135,152, 42,176,231,225,128, 25,174, 85, 66,187,155,101, 53, 22,162,153,174, 76,
-120,237, 33, 1,161,117, 27,170,192, 88, 36, 98, 65, 91,107, 51, 35,234,252,181, 25,180,192,101,136,214, 90,158,116,144,108, 62,
-246,235,241,242,199, 67,108, 22, 16,137, 58,199,143,251,172,155,135, 14, 96,158,181, 8,173,192,168, 64,205, 97,138,221, 65,104,
-238, 89, 66, 10, 20, 73,238,145,183,132,220,121, 14,152, 19, 81,162,180,228,213, 41, 50, 74, 90, 54, 45,186,161,109,222,254,112,
-253,202,133, 77, 83,228, 63, 49, 73,144,165, 44,253,178,145,126,240, 94,220, 95, 4,179,221,101,186,189, 42, 26,234,176, 82,194,
-211, 15,187,105,104,103,104, 36,113,113,239,198,251,101,105, 82, 83,247,233, 78, 74,147, 21, 10,146,197, 53,169, 37, 13,186, 92,
- 64, 28, 43,215, 12,247, 54, 93,224,112, 56, 73, 39, 14,123,174,228,141,200,186,135,204, 28, 35, 0, 74,146,148,199,240, 5,216,
- 88,159, 60, 91,216, 81, 38,177, 97,148, 54,165, 39,119, 10, 28,115,231,140, 35,119,137,116,169,231,108, 45,212,244, 56,112,251,
- 9,142,187, 44, 13,201, 22, 81, 9,190, 60,102, 34, 55, 1,191,105, 42,232,175, 63,199, 17, 42, 4, 26, 64,198,244,119, 79,232,
-121,178,177, 91,139, 31, 40,211, 4,169,137,145,222, 71,107, 98, 84, 20, 71, 60,223,203, 7, 17,154, 51, 54,101,204, 50, 63, 78,
-125,181,249,142,184, 33, 42, 96,117, 68, 52,145,225,238,236, 60, 33, 41,177, 60,122, 98, 57, 18,169, 42,137, 40, 61, 71,125,198,
- 94, 74, 56,121,151, 8, 41,248, 17,211, 18,109, 47,145, 18,136,245, 95, 59,187,156,153,166,200,167, 68, 10,133, 78,168, 70, 83,
-202,158,242,252, 42, 9, 9,225, 36, 3,123,156, 98, 93,153, 74,150, 82, 14,128, 39, 67,154, 73,218, 68,232, 76,114,142,102,138,
-209, 10, 58,214,189, 75,203, 57,103, 45, 84, 24,202,217,103, 63, 46,174,203, 98,234, 40,220,150,219,227,158,166,196,220,158,152,
-209, 55, 53,193,145, 71, 12,213,156,126, 93, 66, 34,144,212, 57, 1, 96, 33, 44,167,245, 72,235,123,224, 83,117, 38,228, 87,100,
- 78,137, 7,218, 84,224, 82,128, 95, 39,158,164,113,199,174, 36, 82,165,229, 37,101,136,217, 85,134, 18,203,179, 89, 75,239,204,
-124, 32,169, 47, 2, 65, 73, 87, 80,139,121,117, 56,174,232, 82, 16,218, 92,149, 30,103, 73,241, 38, 0,244,141,105, 19,222, 58,
-208,248,212,250,166,106,138,149, 83,221, 43, 68, 84, 23, 28,218,139, 4, 14, 73,249, 97,145,125, 18, 59,214,100,192, 67,164, 89,
- 69,192,162, 56, 30,152,243,235,105, 10,101, 81, 98,184, 99, 51,110,237,192,194,136, 74,199, 67,199,166, 20,168, 81,162, 5, 52,
-196,207,104, 73,105, 37, 46, 52,155, 38,231,168,247,219, 4, 0,133, 65,247,127,186,132,211,102,234,221,197, 65, 82,105,189,226,
- 66, 65, 66, 16,165, 27,218,214,228,140, 17,201,149,215,104,149,148,212, 83, 25,135,130,219, 83,110, 55, 36, 2,147,127,225,129,
-208,227,197, 40, 91,100,157,233,191, 32,227,199, 42,204, 55, 72, 77, 61, 20,182,251,192,233, 90,228, 90,235, 80,242, 79,195, 4,
- 91,105,113, 5, 25,100, 29, 41, 3, 38, 41,245, 86, 89, 18, 73,102,123,102,228,221, 3,144,142,122, 15,118, 22, 52, 26, 90, 90,
-136,204,244, 62,202,196,144, 78,197, 40, 93, 22, 54,228,121, 97, 97, 32,164, 38, 5, 54,252,235,244, 4,138,226,212,129,189, 68,
-143,142, 60, 53,164, 95,149,143,134, 0,170, 65, 41, 0,227, 36,184,139, 2, 18,111,240,199, 93,157, 6,181,187, 69, 81,165, 85,
-151,212, 12,105,114,164,181,117,227,231,134, 40,148, 45,208,223, 26, 36, 62,226,142,219, 31,134, 28, 45, 0,210,237, 21, 79,213,
- 81,109, 63,121, 64,159,121,195,103,170, 13, 40,155, 92,252, 48,201,196,168,244, 29,113,136, 66,211,200, 23, 24, 40,117, 2,163,
-218,168,214,215,130, 22, 10,193,231,210,248,212,220,149,182, 8, 83,119, 7, 30,219,127,234,219, 25,182,197,207, 32, 96,130,225,
- 49,173, 64,173, 70,180,148, 23, 15,221,235,132,220,115,188,120, 78, 8,181, 25, 9,111,114,128,233,198, 49, 43,101, 60, 20,243,
-135,246,161, 76,115, 86,149, 37,101, 27, 74,113,225, 97, 42,176, 62, 88,112,151, 89, 80,177,242,194, 5,147,116,132,242,112,141,
-204, 83,101,147, 94,196, 97,165,144, 22,143,158, 37,186,123,167,210, 51,198,102,135,150,233,226,206, 74,116, 37, 75,181,195,104,
- 28,169, 71,220, 5,206, 35,176, 99, 3, 97,183,242,199, 71,246, 84,200,200,203,244, 55,115,213, 73,144, 31,158, 59,168,100,142,
- 82,200, 62, 37,123,183, 40,126, 9,247,227, 7, 26,198, 69,149,170,150, 14,187, 15, 51,247, 53,209, 96, 88, 89,196, 47, 18,212,
-105,185,242, 31,113,239,171, 45, 48,178,246,153,228,182,168,212,166, 80,196,104,108,109,109, 62,103,213, 71,212,147,201, 62,167,
- 28, 17,218,239,180,114,178,222,116,114,161, 68,151,220,186,208, 41, 95, 60, 45, 55,199, 79,246,162,213, 70,168, 20,215, 34, 34,
- 69,174,131,201, 54,191, 24,249,119,218,231, 80, 5, 65,217, 82,139,227,119, 54, 36,244,199,149, 1,237, 78,151, 23, 94,196,202,
- 18,130, 26, 64,208, 81,124,229,219,133,198,225, 42, 68,138,178, 84, 92, 77,138, 66,185, 22,190, 36,189,135,187,104, 10,198,174,
- 71,200, 83,218,113, 81,234, 69, 74,101,197,182,108, 8, 5, 71,159,128, 56,172, 59, 4,118, 33,153,218, 14,106,245, 27, 55, 37,
-102,156, 28, 62,205, 29, 98,232, 85,143,222, 32,245,254, 24,238,173, 58,236,193,166,154,105, 57, 46, 82, 50,187, 6,111, 9,246,
-197, 71, 1, 96,126,202,125, 6, 51,111,111,218, 65, 45, 33, 51,227, 91, 13,177,110,148,144,119,171,190,173, 86, 97, 40, 68,212,
- 32,108, 45,141,188,242, 15,166, 34,249,141,166,102, 70, 11, 13, 2, 20,174,125,195, 27, 39, 10,155,174,166, 59,141,169, 13, 35,
-165,241,141, 81, 14,189, 20, 50,219,106,233,123,218,216,204, 23, 5,102,161,216, 4,138,170,179,222, 71,167, 84,227,184,243,205,
- 5, 1,250,160,117,248, 99,156,245, 67, 66,167, 55, 81,250,251, 44,188, 97,206, 97, 91,146,227, 55,230,254, 71,212,117, 24,236,
-153,153, 82, 98,226,111,117,187, 19,200,184,233,136,126,101,201, 44,169,149, 20, 50, 3,150,176, 39,204,127,139,224,200,184, 90,
- 12,138,100,247, 14,149,197,185,155, 87,123, 70,100, 58, 98, 96, 70,163,135,210, 31, 79,125, 33,181, 16, 74,111,211,242,196,151,
-252,240,107, 41,163, 67,166,185,151,167,174, 90,152, 30,208, 67, 68,128,174, 46, 47,243, 56,188, 51, 62,155, 48,255, 0,136,198,
- 79, 34,234, 5, 63, 60, 86, 85, 76,145, 14, 5, 68,165,112,209,181, 74, 85,136, 79,167, 24,184,151,210,238,138, 20, 23,123, 44,
-191,166,171,250,198,168,235,126,164, 47,217, 40, 20,111, 96,101,107,186,221,148,191, 21,173,199, 3, 25,229,125, 6,172, 85,106,
- 40,168,231,186,155,147,228, 15, 18, 19,127, 0,230,253, 15, 95, 60, 90,244, 44,174,195, 9, 74,216, 66, 74, 77,186, 11, 98, 91,
- 73,164,178, 22,128,166, 64,177, 22, 22,233,137, 74, 83,176,170, 6,229, 64,194, 68, 83,125, 50,211,184,112, 16,218, 19, 28, 55,
-182,214,176,227,225,139, 58, 27,113,154, 72, 96, 53,247, 71, 81,208,251,240, 30,156, 35,176,218, 16,221,129,231,129,135,162,162,
-218, 89, 37,162, 55, 36, 92,223,207, 21,220, 84,212,115,147,169,162, 98, 91, 49,154, 44,128, 45,123,120,191, 86,231,174, 35, 57,
-130, 91,114, 30, 83, 77,139, 42,223,115,204, 17,249, 28, 48,171,231, 72,241, 74,146,137,105, 74,174,119, 37,125, 71,248,254,220,
- 65,234, 26,136,219,210,220,219,177,181, 33, 94, 27,168,157,255, 0, 3,239,235,248,140, 13, 25,137,210,160,165, 72,210,135,214,
- 36, 51, 31, 51, 45,144,176, 89,125, 65, 91, 83,250,170,189,190, 68, 28, 62,206, 25, 53, 85,186, 97,125,182,183, 75,132,201,113,
-178, 7, 46,178, 57, 82,125,229, 63,120,123,183,123,177, 90, 72,206,111,230,125, 85,133, 64,165, 74, 70,254,240,170, 69,141,236,
-142,164,227,162,161, 68,238,163, 49, 46,201,220,201, 10, 70,255, 0, 81,229,243,199, 71,134, 98,175,225, 87,109,190,217,212,111,
-226, 57,143,125,102,226,120,122, 47,173, 11, 46,127,144,244, 60,141, 81, 46, 48,211,104,251,159,150, 27,173, 37, 99,193,198, 36,
-250,131,250, 35,150, 51, 36,186, 75,211, 59,189,170, 11,109,178,147,112,133, 13,201, 31,129, 31,134, 43,204,201,159,154,140,224,
- 69, 10, 23,120, 55,114,167, 56,191,195, 30,255, 0, 97,114,253,243,105, 91, 73, 48,160, 8, 59, 8, 58,138,241,107,171, 53, 48,
-225, 66,134,163, 74, 50,166,157,218, 0, 73,194, 76,119, 15,131,187, 39,229,136, 19,181,172,209, 46, 97,152,229, 77, 77,120,183,
- 37,180,171,129,238,198,117,156,243, 83,141, 5, 18,235,117,116, 50,195,100, 37, 79, 18, 16,155,251,206, 54, 61,149,244,128, 74,
-199,143,133, 80, 45,164, 81,108,241,169, 52,140,153, 29, 17, 2,183, 75,152,178,203, 14,119, 91,144,202,173,247,148,110, 2,109,
-239,227, 20,222,104,207,191, 90,230,183,101, 81, 43,110,251,100,118, 86,185,110, 48,240,101,151, 72, 77,146, 85,180,144, 79, 91,
-249, 98, 83,171,148,232,211, 50, 67, 53, 25,149, 30,230, 29, 65,149, 56,196,150,156, 27, 94, 74, 79,139,197,229,233,108, 80,250,
-134, 36,100, 89,107,147, 22,169, 29,159,173, 90, 75,113, 88,109,226,151, 18,216, 23, 5, 68,113,110, 71,151, 56,243,254, 33,196,
- 2,111, 74, 26,115, 48,210, 4,130, 9, 27,157, 54, 35, 95, 77,106,147,189,229,194,106, 91,157,181,169,186,195, 81,234,185,201,
- 8,126, 93, 61,109,136, 44, 68,126,204, 62,155, 1,247,128, 27,194,108, 56, 81,228,223, 1,171,186,138,251,242,197, 99, 38,195,
-139, 53,118, 73,101, 14, 52,148,119,124,221,104,176, 62, 43, 27,117, 29, 6, 42,204,227,171,213,217, 18, 34,156,217, 57,180, 34,
- 46,198,196, 40, 76,160,178,173,167,196, 8, 28, 92,142,111,231,128, 79,235, 21,118, 38,104,118,175,149, 42,242, 35,133, 56,144,
-195, 4, 13,170, 0,220, 11, 90,223, 44,114, 46, 91,190,240,152,235,164,156,190, 91,124,124,230,157, 13,168, 65, 21,211, 52, 14,
-211,249,213,202,165, 62, 91, 79,184,229, 74, 52,221,242, 35, 52,148, 52,137, 77,109, 2,214, 30, 97, 93,108, 5,240, 7, 87,181,
-134,179,168,217,114,117, 27, 52, 79, 69, 1,216,210,213, 38, 13, 54,151, 5, 45,176, 93,106,225, 8, 34,251,183, 16, 73, 36,245,
- 38,254,236, 83,185, 87, 85, 42, 16,115, 23,233,149, 36,188,156,192,213,214,233,125,180,173,189,196,242, 80, 45,225,235,131, 82,
-171,245, 92,231, 91,101,186, 29, 71,188,152, 86,153, 11,147, 33,178,224,113,194, 46,187,133, 2, 71, 34,194,216,231,157,193,173,
-217,185, 14,150,194, 96,111,211, 89,233, 17,227,189, 17,181,184,209,128,116,160,209,115,115,243,171, 70,175, 85,141, 34,100,197,
- 52, 1,106, 74, 18,150,155,112,171,239, 41, 32,120,147,205,252,177,117,230,246, 42, 85, 76,171, 66,113,170,188, 25,117, 74, 72,
- 65,150,219, 79,160, 33, 76, 43,254,133, 45, 17,185,106, 74,175,207, 75, 30, 49, 42,103, 82,161,229,185, 3, 54, 61,165,244,204,
-199, 58, 69, 48,194,146,163, 8,161, 47,149,182, 54,149, 35,187,178, 84,155, 17,112,160, 73,247, 98, 5,172,153,199, 45,200,250,
-178, 69, 29,138,132, 88,136,111,186, 98,128,169,165,197,197,106,193, 72, 73,115,131,180, 40,168,132,158, 69,173,142,117,203,135,
-241, 27,198,194, 89,200, 19, 58,200, 35,104, 34, 52, 32,116,208, 3,185,212, 69,107,182,180, 54,217, 42, 50, 85,203,235, 63,102,
-174, 28,213,216,210,153,155,114,244,126,208,212,170,107, 52,140,144,136, 66, 85, 78,151, 73,134,250,222,109, 9,103,114,212, 23,
-180,221, 74, 32,155,126,175,158, 57,142,191, 80,131, 5,229, 63,147,158,168, 69,164, 73,220,166, 67,227,196, 20,146, 64, 10, 35,
-195,114, 15, 39, 10,177,171,217,234,185,148,166,101,214, 42,114,227,101,245,202, 71,181,180,196,162,134,156,178, 74,127,213,240,
-147,113,235,207, 95, 92, 88,240, 53,142,145,150, 52, 18,177,151, 98,126,141, 74, 85,110,148,202, 11, 41,162, 44,189, 21, 64,217,
- 73, 73, 36,132, 18, 44, 74,141,129,196,237, 89,198,112,230, 2, 46, 87,219, 12,193, 41, 3, 76,169, 39,252,143,122, 84, 38,100,
-193,129,227, 82,125,198, 46, 18, 50,140,164,111,207,225, 84, 44, 20, 85,235, 21,118,106,180,250, 83,108, 49, 20, 0,167, 89, 98,
-193, 69, 35,169, 87, 36,156, 25,143,153,163, 84,242,197, 82, 14,101,202,211,107, 21, 96,226,141, 49, 77,238, 37,171,141,160, 41,
- 62, 96,117,195,120, 57,129, 89, 78, 42,226,161,245, 77, 74,144,151, 80,216, 77,144,207, 4,216, 15, 60, 11,211,125, 93,171,229,
-156,229, 58,171, 5,113,132,137, 49,214, 90,121,203,168,161, 94, 93, 63,134, 61, 2,221,149, 56,201, 82, 83,182,218,145,241,223,
-206,176, 30, 11, 83,164,129,176,210,163,241,164, 71,165, 58,137,242, 24,118, 91,160,125,213, 35,111,118,160,109,247,124,249,198,
- 85,233,149, 60,208, 75,213, 23, 18,195,169,108, 37, 9, 91, 99,119,185, 33, 35,204,225,235, 21,154,115, 80,229,207,152,195,143,
- 74,125,197,222,235, 0,110, 60,130,124,250,146,112, 1,218,180,212,213,217,205, 8,146,130,184,235, 14, 54,176,143, 14,244,249,
- 88,227, 89, 9, 42, 92,198,163,157, 25, 18,121, 86,154,238, 89,169,211,167, 70,133, 50, 59,137,117,230,130,130, 29, 78,210, 1,
-247,124, 48, 46,124, 87,104,242,148,195,142,165,197, 52,144, 72,108, 95,175,145,247,225,230, 96,205, 85,124,209, 93,127, 48,213,
-230,151, 36,190,177,180,164,216, 39,208, 15, 64, 6, 53,212, 41,114,163, 33,151,152,116,189,223,179,189,224, 7, 32,131,208,226,
-226, 51,165, 35, 62,245, 45, 6,149,141, 26,169, 17, 11, 9,148,194, 8, 31,168,180, 92, 43,240, 55,198,185,168, 83,210,148,234,
-174,110, 60, 42, 95, 0,140, 52,121,185, 44, 52,169,139, 77,130,172, 16,147,140,102,167,189, 90, 7,181, 41, 86, 9,178,119, 92,
- 36,122, 98, 61,152, 14,102, 6,167,148, 17, 68,160,178,167, 92, 75,109, 77, 12, 20, 90,202, 60,130,161,231,111, 76, 77, 50,158,
-107,204,117,106,125, 70, 13, 90,147, 6, 98,149, 21,100,200,126, 56,222,158,121, 82, 79, 2,254,152,129,183, 41,168,219, 86,167,
-210,164,130, 55, 18, 57,196,150,150,191,110, 75,139,118,162,150,132, 54, 2,217, 12, 54,119, 56,162,176,108, 79, 83, 97,126,125,
-216,203,190,104, 45, 48,161,207,120,219,235, 83, 65, 32,105,181, 19,211,122,123,210, 42, 63, 85,192,161, 68,118,106, 17, 33, 64,
-200,112,161, 91,123,191,214, 36,132,217, 61,112, 5, 80, 97, 46,166,204, 58,187,142, 71,109,197, 18,226,208,144,171,115,250,190,
-184,123,154,227,192,138,243, 79, 71,125,215, 36, 58,119,169,237,214, 70,211,211,222, 77,186,225,180,202,178,106, 12,253, 97, 61,
-246, 86,241, 33, 10, 64,107,144, 0,181,197,184,197,102,195,138, 89,112, 29, 20, 61,224,235,231,167,184, 82, 36,101,131, 91,102,
-197,167, 83, 92, 67, 9, 67,142,176,234, 9, 38,195,112,183, 79,134, 7, 41,200,201, 64, 90,183,182, 66, 60, 40, 82,174, 15, 56,
-213,237,136, 67,247,142,141,202,189,146,160, 60, 36, 99, 23, 18,165, 32,182,232, 38,234,244,233,139, 40, 68, 1, 52, 49,214,144,
-146, 25,121,192,211,182,230,226,195,175,187, 30,169, 15, 73, 79,122, 88, 28, 30, 66, 7, 24,214,232, 97,106, 74, 80,141,170, 2,
-202, 54,228,227, 89,144,252,119, 3, 33,106, 69,254,246, 11, 19,181, 32, 58, 83,134,228, 71,108,158,250, 34, 84, 79, 34,202, 32,
- 15,195, 11, 26, 84, 86,159, 8,177, 3,162,135,159,227,133,133,150,165, 95,124, 18, 82, 19, 98,113,155,110,160,248, 65,195,103,
- 92, 80, 79,217,245,195,115, 45,246,205,139,119,248, 99, 72, 61, 90,154,209,134,146,131,239,199,142,150,118,220,218,248, 31, 30,
-107,202, 28, 2, 49,154,222, 90,147, 99,135, 15,107, 79, 91, 84,176, 85,100,140,109, 67, 74,219,113,134,173, 5,169, 64,129,135,
-236,188, 80,139,144, 58, 98, 93,189, 54,245,165, 65, 77,248,146,156, 98,135,148,181,109, 32, 12, 57, 76,134,110,123,192, 57,243,
-182, 52,173, 41,223,189, 39,174, 28, 63,165, 42,113,177,245,180, 2, 20, 45,140, 91,134, 28, 4,175,174, 54, 70, 89, 7, 97, 60,
-123,241,181, 41, 78,238, 21,107,249, 97,195,230,149,107,106, 19, 97, 94, 35,135,208,232,241,220, 55, 42,231, 13, 28,108,245, 75,
-167, 27, 97,214,105,176, 28, 9,149, 57, 0,223,161, 86, 34,167,148,161,165, 21,176, 38,164,249,103, 45, 57, 85,170, 69,163,196,
-108, 41,217, 47,161,166,193,245, 81, 0, 99,175,162, 81,225, 80,168,140,211,162, 54, 18,212, 88,233,109,176, 5,172,148,139, 99,
-157, 59, 44, 66,167,231, 45, 74, 68,182, 30, 11,106,149, 29, 82, 87,111,219, 62, 20, 15,196,223,250, 56,232,220,212,235,140,209,
-222, 90, 20, 5,144,109,127,134, 56,110, 35,121, 75,112, 32,255, 0,136,248,159,227,231, 94,157,194, 86,221,157,186,158,255, 0,
-145,143,112,254,126, 85,193, 95, 72, 22,175,183, 74,204, 78,210,146,224, 66, 91,108,146, 73,243,231, 31, 57,235, 53, 42,142,186,
-107, 4, 13, 57,164,190, 84,153,179, 2, 93, 82,121,178, 47,226,233,238,197,235,244,170,234,101, 82,151,158,157,132,226,246,172,
-173, 86, 32,158, 70, 43,255, 0,162,127, 79,191, 75,117, 93,121,242,174,201,117,109,174,204, 41,126, 66,252,156, 97,169, 65,139,
- 18,191, 10,237,109,209, 29,227, 95, 82,123, 47,233, 13, 55, 78, 52,246,157,148,168,116,224,204,120,241,144,130, 66, 66,111, 97,
-207, 76, 88,163, 43, 70,114,178,151,251,164,142,230,251, 82, 71,159,175,191, 30,229,217, 40,166,211, 99,134, 0,229, 33, 40, 3,
-225,212,224,205, 49,166,101, 21,204,112,149, 39,160,231,169,199, 50, 16, 21,189, 31, 49,154,208,140,165, 30, 82,212,235,236, 2,
- 2,120, 4,117,192, 89,249, 80, 9,214, 67, 62, 0,108, 13,188,177, 45,246,194, 18,160, 20,120, 79,136,250, 99, 38,154,105,230,
-210,167, 5,129, 55, 36,224,201,105, 39,106,137,112,212, 42,171,151, 84,251, 69, 9,111,202,247,247, 98, 25,152,242,219, 33, 91,
-144,130, 44, 69,238, 49,114, 79,134,197,192, 77,185, 24,139,102,106, 67, 15, 36,182,210, 7, 78,184, 75,106, 41, 5,205, 81,185,
-142,130,132,143,190, 73, 4,237,182, 42,140,243,149, 31,106, 74,150,211, 36,165, 87, 36,132,244, 56,233, 26,222, 82,222, 75,138,
-104,139, 90,226,216, 28,206, 70,137, 38,237,203,136,135, 15,150,225,239,192,194,148,131, 73, 64, 26,229,186,124,153,212,164,247,
- 75,108,236, 42,227,118, 15,211,179, 76,107,165,123,188,188, 87,242,197,237,153,116, 46,131, 88,136, 82,136, 40,105,100,125,228,
- 14,190,254, 49, 81,103, 78,207, 53,234, 83,170,145, 76,124, 4,146,109,212,131,243, 24, 50, 95, 10,208,213, 53,180, 38,104, 76,
-188,255, 0, 10,150,164,205,117,207, 5,185,231,166, 34,217,199,180, 54, 87,202,209,213, 58,101, 73, 40, 67,104,186,146, 85,107,
-240,113,167, 49,100, 90,194, 89, 93, 50,176,167,154, 31,180,132, 94,216,175,243,231,102, 12,147,159, 40,174,194,168,230, 10,138,
- 92, 82, 78,199, 18,177,180, 18, 45,202, 72,228,124,240,100,165, 11, 58,154, 9,109, 3,122,168, 53,123,233, 29,200, 82,115, 7,
-213, 84,170,170, 59,192, 44, 86,211,128,139,252,127,199, 76, 4,157,218,226, 10,178,212,138,233,168, 13,193, 35,109,149,231,238,
-197, 11,218, 87,232,240,173,100,137, 18,106, 57, 97,197,119,141,149, 45,167, 24, 55, 75,131,202,227,203, 20, 29, 23, 50,102,104,
-213,182, 50, 77,121,110,180, 34,175,237,144,229,193, 42,191,191, 27, 76,217,219, 45, 18,131, 68, 75,109,146, 2,107,233, 39, 97,
-202,157, 71, 61,103,247,179,117, 90, 74,139,210,212, 44, 9,224, 38,252, 12,125, 14,166,101,216, 83, 40, 73,109,230,183, 2,221,
-186,242, 14, 62,108,118, 17,205, 52,138, 34, 99, 44, 73, 78,241,107,221, 88,250, 65,167,249,149,170,206, 88, 75,241,222, 71, 40,
-227,156, 83,187, 64, 66,166,165,114,137, 85,115,239,105,140,166, 96,203,143, 90, 66, 74,182, 44,197,117, 68,116, 31,121, 31,255,
- 0,223,225,138, 82,169, 83,102, 58,131, 65, 60,164,243,198, 58,163,180, 62, 95, 85, 75, 34, 86, 94, 39,114,208,199,180,182, 71,
-146,155, 59,143,254, 29,195,231,142, 60,171, 73,113, 74, 42, 32,254, 56,246,207,195,220, 80,221, 96,129,181,157, 91, 37, 62,237,
-199,206, 61,213,228,220, 95,109,216,222, 21, 39,101, 9,250, 26,242,181, 95,150,212, 71,156,167, 52,151, 30, 66, 9, 66, 86, 72,
- 73, 62,134,216,172,115,150,166,212,162, 68,151, 84,175, 81, 94,110, 68,196, 37,142,237,230,202,153, 27, 9, 37, 73, 79, 4, 30,
-150, 55,196,240,200,108, 33,196,189, 40, 48,165,167,107, 78,168,139, 5, 30, 1, 55,242,197, 3,173,217,199, 53,185, 85, 93, 55,
- 53,203, 87,176,174,120, 67,107,142,187,157,169, 54, 33, 32, 14,120,243, 54,224,226,231, 22,222, 30,213,150,208,173,119, 35,156,
-120,107, 63, 10,243,181, 41, 69,200,161,217,147, 88,133, 90,165, 22,161, 62, 67, 82, 66,157, 87,181, 37,194,164,161, 32,253,209,
-215,143,144,196, 27, 54,103, 52,212,179, 10, 32,228,254,253, 81, 98,190,146,135,101,184, 28, 40, 81, 54,224,244, 9, 23, 56, 0,
-227,175, 84,234,210, 98, 80, 19,222, 52, 73, 61,242,135,250,180,223,239, 40,227, 84,121,141, 46, 67, 52, 90,105,105,233, 5, 14,
- 50,235,155, 64, 66,145,215,117,250,252,206, 57, 5, 50,216, 94, 97,200,109,203,204,138, 32, 17,189,105,206, 76, 86,105,149,121,
- 16,106, 50, 91,124,153, 1,199, 8, 63,126,227,239, 15,136,195, 33, 80, 74,101, 7,169,112,144,206,199,183, 54,227,203,185, 2,
-221, 44,122,227, 10,173,106,171, 37,210,197, 90,167,223, 45, 36, 14,249, 70,228,132,139, 36, 3,134,238, 60,138,131,237, 56,251,
-235,117,222,236, 39,104, 79, 34,221, 6, 44,161, 10, 8, 25,190, 31,181, 19, 97, 82, 90, 62, 98,118,146,234, 42,237,168,185, 57,
-213, 41, 47, 5,178,149,164, 3,199, 3,167, 79, 60, 78, 52,243, 86, 98,228, 28,215, 25,117,154, 74,102,182, 92,188,202, 89, 81,
-108, 57, 96,118, 89, 96, 18,142, 77,205,177, 87, 55, 30, 85, 61,148,189, 37, 14, 32, 63,101, 52, 28, 28, 56, 1,183, 24,119, 53,
-232,205,253,139,144, 18,195,171, 59,131,197,100,169, 28,117,248, 28, 81,185,179, 98,229, 5, 10, 18, 21,161,143,223,195,195, 95,
-125, 50, 66,115, 2,107,171, 52,255, 0, 56,208,181, 43, 42,230, 35, 42, 27,240, 36,193,166, 38, 67, 34,139, 60,166,239, 38,224,
- 40,169,125, 13,143, 33, 35,155, 98,130,204, 83,164,199,169,119,146, 61,161,228, 62,162, 91, 15,187,117,130,129,107,159, 76, 76,
- 59, 49,103, 28,165,149,232,253,204, 53,207,159,152,171, 51, 87, 13,218,100, 20,173,197,187, 29, 73, 1, 41, 74,109,109,197, 64,
-243,215,156, 70,179,116, 7,224, 87,133, 26,144,219,177, 37, 68, 46, 9, 48,234,119, 75,169, 5,118, 41, 36,142, 77,186,244,199,
- 41,103,108,139, 44, 77,246,146,146, 19,164, 79,128,131,227, 18, 52, 60,234,202,130,202, 1, 53,141, 71, 86,235,245, 13, 51,119,
- 79,229, 80, 34, 72, 92,185,205,201,102,112,140, 59,230, 66, 83,183,186, 73, 3,145,107, 30,122, 99, 86,155,211, 34,215,243, 58,
-242,206,116,206,239, 81, 32,119, 46, 59, 49,231,221, 32, 47,106, 10,146,132,167,204,146, 0,249,227,201, 58,137,153, 32,229,137,
-121, 38,116, 22, 26,129, 6, 75,146,226,176,203,105, 14, 54,234,194, 65, 59,199, 42, 22, 0, 88,241,136,254, 72,143, 64,172, 86,
-157,123, 55,230, 39,152, 74,226, 56,228,101, 50,144,187,189,111, 10, 77,250, 11,227, 89, 22,197, 54,206, 20,167, 40, 36,153, 79,
-120,201,136, 32, 68, 76, 70,145, 30,117, 2,224, 10, 4,235, 20,103, 48,189,151,162, 56,183,232,208,101, 54,210,216, 75, 41, 47,
-202, 82,146, 8, 79,137, 87,176,224,245,182, 33,117, 26,220,202,123,171,102,152, 80,193, 86,221,239, 54,208, 77,254,125,113, 53,
-212,221, 82,250,206,143, 14,139,246,114,166,180,210, 90, 91,169,100, 4,144, 60,207,169,247,224, 70, 85,202, 21,156,226,227, 20,
-184,148,180, 42, 82,157, 50, 95,108,172, 33,146,218,121, 36,147,202, 79,187, 27, 86, 89,154,182, 10,120, 71,190,118,231,173, 82,
-209, 78,102, 35, 66,126,244,167,153,118, 13, 6,165, 78,110,165, 90,106, 66,218, 80, 82,229, 37,166,236, 60, 41,234, 23,215,175,
-150, 34,198,159, 76,153, 86,146,234, 22,182, 41,233,116,169,134, 86,225, 42, 0,249, 15,126, 39, 85,156,221, 26,139, 5,170,108,
-152,205, 41,232,237,173,167,162, 60, 54,128, 73, 62, 99,175, 30,126,150,196, 26, 6,232,147,193,147, 75, 43, 90,212, 20, 90, 43,
- 54,219,212,117,197,150, 84,225,149, 29,170, 72, 38, 14,148, 50,178, 96,247, 63,232,234, 81, 83,103,107, 91, 71, 84,223,207, 13,
- 24,148,243, 55,116,173,101, 70,192, 29,223,150, 12, 76,204,176, 21, 87, 77, 68, 83,118, 36, 44,253,154,146, 10, 71, 63,158, 7,
-165, 44, 86,230,174, 82, 2, 89, 74,150, 73, 64,224,127,203, 23, 18, 76, 65, 21, 48, 97, 18,170,104,245, 65,201, 50, 91,135, 32,
-168,161, 3,129,233,135, 48, 41,205, 79,121,123,165, 37,180, 52,130,165, 95,175,252,241,166, 74, 34,179, 45, 33, 14, 11, 35,130,
- 71, 63,158, 55,144,204,231, 54,197, 65, 66, 71, 0,250,252,113, 56,210, 5, 72,157, 1, 20,215,216, 86, 77,203, 68, 11, 92,110,
-243,193,106, 67,203,109,132, 53,223, 44,247,135,196,216, 62, 86,195, 25, 15, 73,105,105,142,165, 37,192, 63, 88,224,166, 89,130,
-135,106, 42,113, 18, 2, 31, 67,101,109,146, 69,130,188,135, 60, 96, 55, 25,123, 35,152, 84, 65, 82,168,189, 82,135, 71, 98,128,
-205, 65,154,254,233,189,250,154,122, 10,199, 45,128, 1, 11,191, 75, 27,241,134,213, 38,196, 42,108,120, 14,198, 71,122,237,156,
-222, 62,240, 7,248, 99,115,244, 73, 10, 79,183, 73,144,137, 33,165, 5,204,109,147,226, 72, 39,145,126,151,198, 53, 71,161, 73,
-105,153,180,182, 92,108, 51,116,173,185, 11, 11, 80, 87,175, 30, 94,151,198, 48, 10, 4, 2, 73,223,253, 84,212, 58,208,205,136,
-108,142,233,219,146,121, 27,120, 24,245,101,217, 9, 41, 90, 9, 67,100,155,140, 99, 34, 90, 86,164,219,106, 72, 59,137, 2,192,
-227, 36, 47,236,133,150,157,132,216,131,231,131,193,208,212, 34,176,125,108,200,123,116, 82, 85, 96, 62,208,139, 99,214,152,126,
-165, 32, 54,235,130,233, 22, 42, 35,128, 6, 60, 40,142, 92, 0, 46,197, 43,229, 32,240,172,122,118,180,217,117,167, 10, 73,242,
- 39, 14, 34, 52,166,242,172, 95,138,236, 98, 17,183,120,230,196,116,194,199,175,187, 53,253,174, 5, 41, 64,142, 61,216, 88,112,
- 9, 26,211,129, 59,215,222,133,160,116,183,192,227, 7, 88,109,164, 23, 29, 33, 32, 14, 73, 54, 24, 1, 35, 62,197, 65,238,225,
-166,228,126,178,207, 24, 17, 93,206,202,157, 31,186,151, 52, 37, 54,251,169, 56, 51, 77, 58,225,147,165,108, 41,104, 21, 42,118,
-185, 69,142,157,202,158,221,189,199, 26,151,156,178,252,116,243, 43,125,255, 0,100, 19,138,210,110,108,165,199, 77,155, 37,103,
-225,134, 74,207,109,183,254,170, 24, 54,243, 81,197,244, 90,181,204,154, 1,185,108,115,171, 78, 70,160,210, 35, 35,236,153,113,
- 68,244, 1, 56,213,254, 82, 89,232, 32, 47,111,157,200,197, 84,189, 69,125,213,109, 48, 17,199, 78,112,157,206,245, 71, 99,146,
-220, 68,158, 46, 16,130, 46,127, 28, 28, 91,218,164, 73, 31, 31,218,135,237, 41, 39,122,182, 85,168, 84,194,222,229, 68, 88, 62,
-151, 24,103,254, 83,227, 37,106, 2, 26,133,135,135,197,138,121,204,253, 81, 96, 31,104,161, 79, 9, 79, 59,144,218, 23,255, 0,
-149, 68,225,130,181, 70,141, 29,219,212, 38, 59, 20, 19,255, 0,230,163, 56,223,254,100,219, 21, 13,230, 14,209,135, 9, 79,254,
-193, 73, 30,164, 1, 70, 5,213,254,145, 62, 80,126, 85,112, 77,213, 74,177,144, 76,100,165, 40,253, 91,142,113,169,237, 80,204,
- 13,186,151, 28,112, 4,249,157,188, 28, 86,172,230,216, 53, 56,201,149, 76,170, 50,251, 87,251,232,117, 38,223, 27, 30, 48,247,
-235,135, 37,199,238,128, 42,191, 4,223,140,104, 91, 92, 97,151, 8,150, 74, 84, 58,130, 15,202,128,183,150,131, 10, 4,121,233,
- 86, 20,189, 82,168, 84, 91, 12, 53, 37, 45,122,148,117, 56,211, 18,107,210, 93,246,146,249, 81,189,202,148,122,226, 15, 78, 88,
- 74,202, 74,130,138,122, 39, 4, 35,212,100, 70, 89, 13,189,183,220, 85,130,149,180,210, 97,177, 20, 86, 31, 5, 90,215,104,118,
- 23, 90, 40, 57,103, 51,102,231, 85,114,167,163,199, 73,183, 64,148,173, 71,255, 0, 50,127, 12, 93, 84,188,239, 19, 82,154,151,
- 69,166, 76, 5,214,152, 61,227,105, 62, 36,121,115,142,113,250, 63,106,207,102,124,183,154,242,111,127,185,230,203, 50,219, 27,
-248,177, 74,144,120,254,138,121,247,140, 68, 50,127,105, 76,187,160,125,190,104,121, 75, 57,102,182,160,192,204,201,126,145, 43,
-190,115,107, 73,121, 99,115, 4,223,128, 75,168, 66, 1,253,252,121, 78, 56, 22,238, 46,232, 81,233,242, 21,237,156, 52, 59, 76,
- 29,162,216,210, 20, 79,169,174, 43,250,106,114,190,101,201,154,181, 22,155, 83,167,188,148, 78, 22,130,242,191,233, 73, 60,255,
- 0, 28, 90,127, 70, 70, 69,141,146,114,244, 55,222,103,106,157, 66, 74,183,121,252,126,126, 88, 61,244,226,234,134, 66,213, 45,
- 98,200, 26,117,150,100, 49, 50,100, 25,170, 84,162,139, 29,169, 35,147,238,227, 19, 30,204,121, 89,202, 60, 42,122, 91, 99,104,
- 75,105,238,211,253,167, 24, 23,206, 43,217,146,217,241,248, 87, 88, 16, 17,110,146, 57,138,235,250, 82, 36, 79, 97,168,105, 85,
-137, 64, 82,173,250,160,255, 0,105,196,178,154,180, 65,166,247, 41,229, 73, 0,148,143, 35,255, 0,166, 35,121, 46, 9,135, 74,
- 75,238, 40,169,210, 55, 40,129,212,225,231,214,114,153, 75,151,178, 9, 38,254,240, 7,247,155,124,177,148,141, 53,161,196,211,
-242,239,217, 45,197,147,181, 75,218,148,250,171,251,186,124,177,154,107, 46, 46, 64, 66, 82,118,169, 55, 79,160, 31,250, 96, 68,
-117, 41,180,163,189,112,128, 65, 54,247,242, 79,231,252, 48,150,243,137,152, 81,187,192, 81,199, 62,255, 0,241,242, 24, 42, 73,
- 21, 21, 38,164, 11,148,135, 93, 66, 10,186, 42,235, 3,211, 26,100, 64,109,229,149,173,119, 28,222,222,120, 98,204,150,131, 42,
- 82, 85,101,110,181,201,231,211, 27,162,206, 47, 39,126,240, 8, 77,138,125, 71,248, 56, 62,244, 19,165,123, 46,145, 13,240,119,
- 4,220,164, 31,143,150, 2,202,162, 68, 74,238,194,236,177,247,110, 60,198, 11, 84, 36,164, 54, 16,218, 73,219,192, 62,183,192,
-105, 47, 75, 65,178, 1, 38,247, 77,252,199,248, 24, 18,210, 41,130,141,122,105,200, 82,182,223,109,250, 17,208,224, 70, 98,163,
-181, 37,155,150, 47,197,207,195,142,127, 60, 60,118,180,224, 90, 83, 99,110, 6, 48,155, 82, 67,129, 71,146, 59,176,109,233,205,
-184,255, 0, 30,120,174,164,138, 98, 77, 86, 89,195, 79, 41,149, 52, 21,119, 99,113,253,145,249,226,171,205,122,116,220, 69,151,
- 98, 36,236, 60, 41, 39,130, 49,122,212, 81,181,213,150,200, 62, 3, 97,208, 30,132, 15,195, 16,188,201, 79, 76,179,185, 23, 73,
- 43,186,146, 71, 55,194, 74,202,104,106, 73, 21,205, 58,145,167,136,171,196, 91,111,178, 28, 83, 98,224,148,139,145,142, 5,237,
-223,217, 97, 48, 0,212,108,151, 5, 41,148,194,183, 73,105, 8,218, 86,159, 95,126, 62,168,102, 90, 25,246,142,245,230,124, 38,
-233, 38,216,231,222,213, 26,125, 79,149,150, 36,134,216,220,219,141,168,157,162,246, 62,124, 99, 66,210,233, 77,184, 40, 0,148,
- 56, 43,231,135,101,141, 74,206, 7, 53,192,203,212,152,111, 59, 33,249, 9,101, 40, 23,240,171,223,242, 4,227,236, 7,103,154,
- 6,111,143,146, 98,190,165, 45,205,232, 73,115,113, 54, 28, 99,132,187, 57,233,214,159,229,101,202,212,152,112, 91,250,196,202,
- 67, 11,105, 35,194,135,124, 72, 82,199,165,193,231, 31, 78, 52, 86,167, 79, 99, 79,225, 71, 90, 82, 10,217, 77,250,115,141, 92,
- 73, 33, 9, 19,204, 77, 90, 85,218, 46, 26,238,141, 1,143,120,222,133,103,108,143, 55, 48,229,154,133, 53,164,164, 25,112,156,
- 97, 97,195,192,220,130, 1,249, 95, 28, 89, 95,201, 79, 83, 38, 72,164,213, 99, 41,153, 81,158, 83, 78,180,161,202, 22,147, 98,
- 15,204, 99,232, 69,108,173,112,156,114, 42, 82, 8, 73,181,186,142, 49,203,221,164, 50,174,236,228,222, 98, 75, 59, 5, 78, 26,
- 29,119,142, 3,168,187,106, 31, 31, 10, 85,253, 44,110,240, 54, 42,171, 43,183, 45,142,203, 18, 60,199,238, 15,194,184, 94, 47,
-180,237, 45, 82,240,229,161,247,215, 53,215,242,228,165,176,166,225,190,211, 42, 1, 65, 75,121,146,180, 90,199,168, 24,231, 61,
- 75,165, 86,178,188,202,109, 50,107,205,151, 17, 45,247, 30,158,166, 13,137, 88,183, 59,143, 64, 58,116,199,105,185, 69,136,131,
-222, 22, 46, 71,222, 39,207, 20,102,163,232,190, 96,207,122,160,254,100,173,102, 24, 52, 26,124, 36,129, 17,199, 0,219, 45,195,
-205,246,168,216,128, 56, 56,238,113, 21, 46,230,237, 47, 3,202, 62, 62,127,126,117,228, 14,167, 35,132,215, 31,102, 74, 36,156,
-185, 84,117,168, 78,200,246, 85,183,117, 58,131,179,191, 77,249,189,141,173,124, 70,189,161, 13, 2,211, 44,109,113, 64,169, 42,
- 72, 36,252, 49,122,234,146,114,116,248,177,233,180,202,205, 94,125,105,117, 37,178,166,123,166,187,182, 82,147,202,146, 17,112,
- 71,165,177, 89, 87,116,231, 51, 51, 41, 21, 84, 83,228,169, 51, 36, 45,184,138,238,172,167, 20,155, 92, 91,200,220,129,108, 80,
- 73,239,229, 84, 79,133, 32, 73,222,161,142,190,244,167, 18,154,139,197, 62, 45,167,195,200,249, 96,163, 80,169, 44, 5,191, 46,
- 75,173,108, 82,123,151,218, 69,195,128,245,227,215, 5,149,166,121,214, 45,124, 82,235, 25, 86, 75, 18, 86,210,221, 66,100,178,
-164,168,132,125,227,207,150, 6,102, 16,168,211, 59,182, 75,110,134,145, 98,155,147, 98,121,183, 56,117,171,191,217,141, 13, 74,
- 53,167,117,153,205,183, 78,142,218,165, 53, 35, 99, 87,104,164, 2, 81,126,108,125, 14, 26,211, 87, 18, 83,241,154,170,201, 10,
- 27, 73, 66,130,249, 4,115,180,131,208, 96, 76,185, 33,243,100, 32, 33, 55,184, 9, 77,185,195,116,133, 23,118,145,201,251,202,
- 35, 14,150, 97, 17, 76, 0,169, 94, 94,212, 90,198, 71,206,148,253, 69,200, 18,157,164,213,105,146, 68,136,210, 26, 0,247, 46,
-164,248, 84,159, 95,158, 10,215,243,146,243, 93, 97,252,201, 93,175, 72,169, 84,234, 14, 45,249,210,221,241, 5,188,165, 92,145,
-233,114,121,242,196, 93, 8,250,213,164,164, 72,101,164, 52,217, 13,128, 45,127, 91,251,206, 8, 80, 87, 10,147, 14,124,248,181,
-178,196,164,178, 26,138,193,104, 47,190, 10, 62, 62,122, 38,195,155,226,155,214,236, 21,118,153,123,241, 19, 26,196,232, 9,130,
- 98, 76,244,169,133, 40,140,147,166,241, 69, 43,148,135, 41,200,122,167, 62, 4,148, 68,125, 33, 13, 56,187, 0,181,128, 55, 15,
-126, 6, 64,147, 34,178,228, 74, 20, 42,115, 97,132, 57,119, 20,148,128,181,124, 84,113, 44,152,186,141,107, 35, 50,128,200,126,
- 59, 33, 43,222,183,145,126,241, 66,220, 39,175,145,190, 35, 48,209, 62,159, 57,168,174,159,101,113,247, 64,113,125,209, 61,218,
- 79,159,248,244,197, 75, 87, 2,129, 74,247, 7,236,199, 88,168,168, 40,123,233,246,113,203,244,230,150,167,163, 59, 29,178,174,
- 27, 75, 46,216,182,125, 0, 29,109,235,124, 22,127, 32, 79,211, 76,143, 75,207,159,167, 48,220,145, 85, 74,156,106, 27, 51, 20,
-167, 22,216, 54, 37, 86,233,200,192,106,174, 88,168, 68,188,134,148,212,158, 77,223,125, 86, 7,211,143,236,195, 42, 84, 90,203,
- 85, 52,178,150,151, 44, 52,217, 82, 80,163, 96, 7, 82, 7,160,185,232, 49,120, 5, 20, 36, 37,122, 13,199, 81, 27,107,181, 85,
- 74,199, 51, 52, 90,129, 84,163, 84,107, 42,174, 86, 98,185, 61,106,142,160, 33,184, 47,117,219,142,189,121, 3,156,110,205,175,
-201,162, 67, 92,106,221, 25,136,239,203, 9, 89,104,248,150,150,252,128, 61, 83,133, 46,148,213, 78, 68,156,216,167, 18,195,251,
- 82, 91,110, 51,170, 42, 10, 64, 0,248,109,243,198,221, 64,166,211, 95,153, 26,213,223,107, 15,193, 75,178, 31, 82,247, 20,168,
-139,169, 55,247, 98, 0,161, 79, 36,107,254,185,116,169,133, 2, 65, 53, 14,147, 72,159, 83, 97,152,204, 48,211, 45, 62,225,238,
-155, 39,197,111, 83,129, 18, 97, 75,129, 37,232,137, 28, 50,238,197,173, 61, 47,141,239,212, 89,106, 74, 95,109,107, 10, 71, 9,
-178,188,177,140,228,203,106, 34,101,186,224,216,242,238,132,222,231,226, 78, 53, 83, 41, 0, 26, 40, 6,105,155,173,169, 82, 59,
-215, 5,211,182,201,240,245,198,106,146,210,135,119,221,148,219,165,188,241,140,137,110,188,208, 42,176,183, 66, 6, 28,195,167,
-206,159, 24,187, 26, 22,244,180, 46,183, 18,159,227,130, 72, 9,214,156,137,222,180, 70,142, 92,187,129, 28, 36,254,177,196,129,
-182, 24,131, 26, 43,143, 76,142,181, 60,218,183,178, 21,114, 44,122, 31, 75,249, 96,101, 62, 89,100, 41, 47, 71, 75,137, 64,181,
-239,107, 99, 20, 70,113,217, 65,104, 41,228,240, 48, 23, 91, 14, 1, 38, 34,155,157, 29,149, 82,159, 1, 70, 51,108,134, 91,113,
- 32, 41,144,139,113,234,125,113,167,184,168, 46, 83,197,148,149,221, 55, 83,205,167,129,111, 92, 74,178, 59,143,214,159,114, 21,
- 94,156,218,155,109,176, 27,113, 45,220, 36,142,130,248, 47,155,227,198,161,229, 89,146, 91,117, 8,121, 77,132,161, 8, 29,111,
-199, 54,198,113, 25, 87,144,243,171, 9,100, 45, 19, 58, 85, 80,219,193,234,139,155,200, 45,129,194,136,234,172,123, 21,165, 56,
-234,164,164, 42,200, 54, 0, 14, 62, 56,117, 68,160,206,173, 84, 5, 42, 21,183,184,119,169, 71,162, 0, 29, 78, 44,225,146,242,
-181, 50,145, 14, 19, 81, 18,234,146,208,246,130,127, 89, 64,245, 54,197,171,149,165,158,232,220,252,133, 76, 50, 84, 12, 85,117,
-236, 14,161, 77,161, 13,133,184,234,119,162,223,171,140,156,165, 78,105,210,135,226, 56, 10,147,100,133, 39,239,122,226,197,110,
- 5, 50, 34,201,131, 5,182,193, 60,109, 78, 54,132,180,124, 75,108, 18, 58, 92, 98,158,106,113,102, 72,212,213,109, 31, 47, 86,
-228,183,185, 20,167,200, 73,176, 41, 73,182, 22, 45, 86,234,157,218, 2, 26,109, 40, 0, 90,216, 88, 89,141, 55,178, 87,120, 74,
-205,245, 7,220, 42, 18, 73,255, 0,186,113,168,102, 74,155,128, 36,185,193,243, 87, 39, 1, 90,153, 21, 0, 4,188, 15,173,177,
-227,213, 20, 35,150, 8, 87,187, 20,198, 42,122,208,202, 84, 78,180,117,202,155,202, 3,188,108, 47,225,143, 10,150,225,222,109,
-107,116,190, 34,210, 43,147,158,119,186, 15,108, 3,211, 27,169,245, 69,135,131,110, 73, 61,122,238,195,255, 0, 85, 81,231, 76,
- 90,169, 35,106,108, 14, 16, 65, 62,252, 63,140,195,201, 72,115,189, 0, 31, 34, 48, 9,117,136,233, 64, 6, 66, 2,190, 56,115,
- 22,190,157,157,216,150,149, 31, 44, 72, 98,167,173, 67,178, 85, 61,157, 46, 83,107, 44, 54, 81,201,228,225,187,178, 93,238,130,
- 93,109,178, 45,201, 24,208,228,182,220, 89, 90,228,139,249,219, 26, 93,155, 21,209,221,170, 82, 82, 60,201,243,194,254,168,122,
-212,131, 74,161, 18,242,172, 55,220,222,205, 85, 37,245, 3,117, 46,158,208, 81,254,147, 97, 7,243,192,153,185, 75, 62, 80,214,
-101,229,188,222,219, 4, 31, 11, 0,184,132, 31,136, 81, 93,240,126,106, 91, 72, 11,140,232,189,248, 82,112,218, 84,151, 35,160,
-185, 33, 69, 64, 12, 99,220, 49, 97,114,231,104,160, 66,191,228, 20,160,125, 65,173, 6,238,174, 91, 25,100, 17,208,128, 71,202,
-163,208,245, 83, 86,242,164,133,126,152,100,197,205,140, 15,138,109, 25,192,234,237,234, 81,193,249, 1,137,142, 71,212,204,187,
-158, 35,125,107, 66,172,123, 82, 18, 74, 94,106,246,117,149, 14,169, 90, 15,137, 4,122, 16, 49, 17,151,154,107, 81,147,186,117,
- 1,192,215,253,172, 69,119,192, 15,120,176, 87,224,147,138,179, 90,105, 75,101,214,181,179, 78, 29, 68,153,148,213, 3, 90,131,
- 29,194, 61,173,129,215,112, 22, 41, 90, 71,159, 6,223, 12, 48,196, 46,236,209, 13,186, 86, 7, 37,239, 30, 6, 36,251,230,175,
- 91, 50,197,211,161, 43, 72, 65, 59, 20,237, 61, 8,157, 39,204, 87,210,207,163, 79, 81, 90,164,246,137,107, 47, 45,219, 53, 92,
-165, 72,140, 82,163,213, 73, 1,224,127, 6,213,248,227,147,191,246,131,178, 84,236,155,218, 46,157, 92,131, 47,187,102,124,112,
-182,123,187,164,165, 96,142, 65, 30,125, 57,192,158,206,125,160,235, 57, 82,169,150,245,223, 79,234, 79, 86, 32, 65,148,220,165,
-193,121, 64,201, 66, 82,126,213,180,175,245,141,183, 36,165,119, 39,201, 94,189, 19,244,175,234,127,102,126,213, 61,140,227,235,
-118, 94,170, 70,126, 99, 45,247,108, 9, 22, 76,168,210, 44,146, 90, 82,111,112,121, 4, 90,224,130, 8, 36, 27,227, 62,238,239,
-182,188, 75,132, 65, 35,215,148,131,233,227,225, 94,169,193, 47, 54,219, 10,181, 90,181, 4,253, 57,121,131,235, 92, 69,217, 6,
-177, 35, 84, 43, 52,199,115,101, 69,201,213,120, 85, 5,162, 93, 74, 99,170,117,231,208,162, 11,119, 82,142,226, 5,202, 64,253,
-209,143,171, 58, 67,148, 35,195,163, 68,120, 55,100,132,166,192,117, 60, 99,228,119, 96,198, 51, 34,243, 58,115, 57,165, 41,186,
- 96,144,129,237, 36,125,247, 18,187, 41, 35,224, 47,248,227,236,206,146, 71, 46,229, 88,178,100, 55,117,184,128,160, 1,232, 63,
-199,246, 99, 3, 19, 90,149,113,173,118,174,165,164,136, 65,145, 39,215,152,251,218,173,186, 27, 40,137, 73,109,231, 0, 46, 41,
- 60,143, 33,128, 85,137,143,174, 73, 74, 65, 9, 11,220, 5,250,129,198, 11,135,123,154, 32,104, 95,114,128,221,207, 75,249, 98,
-136,237, 99,219, 63, 74,123, 45, 51, 24,102,197,189, 54,171, 53,189,208,168,144, 10,123,231, 91,185, 29,226,137,225,180, 94,227,
-113,228,155,216, 27, 27, 80, 89, 9, 76,157,170,186,119,171,122, 60,197, 4,134,158,112,130, 60, 74,191,190,220,127,143, 92, 60,
-155, 37,144,165,168, 44, 88, 40,238,248, 94,223,192,226,171,236,255, 0,218, 2,141,218, 15, 77, 98,106, 93, 23, 44,212,233,113,
-229, 60,164,180,221, 77, 8, 29,226,145,194,138, 10, 84,119,160, 16, 70,238, 57, 7,142, 49, 42,118,169, 32,151,157,144,191, 9,
-225, 34,255, 0,158, 36,217, 4, 72,169, 17, 52,112,214,246, 18,202, 5,238,120, 56, 33, 18, 91,109,181,202,252, 69, 94,103,204,
-226,191,126,182, 98,200, 8,239,137, 34,219,121,242,191,252,176,110,145,152, 91,148,195, 78,184,176, 9, 80,243,255, 0, 30, 95,
-199, 22, 6,212, 23, 4, 84,183,218,146,225, 1, 32,237,185, 10, 31, 44,104,144,250, 67,104,104,172,110,185,177,243,245,192,216,
-245, 87, 18,210,214,165, 88,155,113,124,107,122,115, 74, 90, 93,109,193,193,228,124, 78, 25, 91, 80, 57,214, 82,210,203,129, 86,
- 90, 66,135, 33, 94,184, 17, 84,144,228,111,181, 74,128, 3,238,223,204, 28,108,149, 37,198, 31, 89,255, 0,229,128,111,234, 48,
- 2,173, 92, 82,201, 97,103,128, 15,248,255, 0, 30,184,170,179, 72, 26,206, 92,230,221, 66,143, 4, 3, 96, 61, 48, 10,175, 25,
- 9, 33, 65, 87,241,121,244,198, 78,213,152,103,113,121,206, 58,159,199, 2,167,215, 88,101,183, 8,115,117,206,228,243,239,192,
- 53,154,138,148, 34,133,102, 38, 26,121, 5, 37,177,117, 19,108, 83,250,187,150,153,168,210, 92,100,253,224,146, 64,183, 10,227,
-159,203, 22,173, 78,165,223, 21, 54, 69,192, 30, 19,242, 54,196, 11, 50,151,157, 75,141, 74,177,178,141,137, 28,115,130,182, 72,
- 53, 77,106,138,227, 93, 37,160, 75,168,235, 75,250, 77, 75, 59, 88,145, 84, 19, 31,111,205, 41, 72,182,223,129, 81, 39,250, 56,
-232, 30,219, 29,162,115, 23,101,122, 38, 77,202,116, 40,174,162, 85, 90, 80,239,100,148, 43,186,142,202, 64,251,202,232, 20,162,
-108, 1, 60,217, 71,203, 20,134, 92,149,156,116,223,182, 27,217,251, 41,229,132,213, 32, 21,161,153,241,195,201, 66,227,216,159,
- 16,220, 69,211,240,231, 23,174,175, 84,226,235,187,245, 23,115,197, 49,167,227,212, 35,123, 57,136,180,133, 37,166,194,108, 0,
-191, 66, 58,223,200,243,142,137, 44, 61,122,180,102,253, 33, 59,252,133, 83,190,199,112,236, 41,230,130,128, 84,153, 82, 65,215,
- 93,201,250,117,171,239,178,206,168,197,213,156,148,203,210, 42, 40,126, 91,204,248,182,171,146,109,233,128, 61,168,114,203,176,
-242,245, 41,109, 51,226, 98,161, 37,181,241,208, 41, 45,145,249,164,254,120,128,253, 17,154, 59, 92,201,121,138,177, 67,172,214,
- 76,193, 76, 15, 54, 29,113, 68,221, 33, 68,161, 66,253, 60, 5, 60,122,223, 23, 31,108, 88,210, 41, 50,105, 49,100, 63,102, 36,
-165, 78, 1,110,170, 79,159,224,230, 3, 96,165,218,226,237,248, 79,200,210,226,212,219, 12, 49,197, 50,101, 42, 9, 35,222, 68,
- 87, 51, 74,163,188,160, 67,111,160, 19,201, 4, 96, 62, 98,200, 20,236,207, 79, 52,250,253, 33,185, 13, 41, 36, 37, 93, 10,110,
- 44, 74, 79,145,196,162,172, 89, 84,165, 6, 85, 97,141, 10, 83,138,218, 16,191, 43, 91, 30,130,222, 33,152,107, 94, 17,116, 59,
-213, 88,193,236,171,165,176, 43, 84,170,205, 27, 43, 8,142,210,221, 43, 71,118, 77,158, 37, 36, 13,228,245,235,124, 77, 27,210,
-138, 43,219, 86,237, 18, 25, 45,187,222,183,102,147,116,175,246,135,161,196,161,128,226,130, 80,129,186,227,158, 49,181,101,198,
-149,189, 73,218,145,202,142, 12,155,224, 12,138,167, 19, 92,187,219,127, 66, 51, 37, 98, 55,249, 83,133, 88,125,165, 83, 41,222,
-203, 2, 20, 88,203, 94,245,169, 68,172,175,109,252, 37, 55,247, 99,136,230,229,121,173,184,224,220, 29, 81, 81,222,168,227,120,
- 71, 23, 35,142, 71,246, 99,232, 54,190,246,177, 68,118,165,228, 44,153, 76,239, 93,121, 70, 58,229,173, 93, 60,137, 72,254,252,
-115,123, 77, 83, 98,251, 75,206,209,162,153, 14, 47,237, 94, 66,172,224, 6,247, 31, 3,135,246,210,163, 49, 81,237,178,232, 43,
-155, 42,116,154,132, 64,137, 37, 46, 37, 15, 92,176,165,121,128,108,127, 60, 51,125,249, 8,148,215,116,164,173,194,161,116,108,
-189,199,166, 44,189,115,171, 53, 80,122,149, 76,129, 77,102, 52, 74, 92, 2,204,116,180, 57, 93,214,165, 21, 43,222, 73,196, 27,
- 41, 66,113,218,236,121,225, 23, 72,154,219, 74,226,246,189,241,170,133, 36,177,156,138,209,101, 25,208, 12, 81,170, 13, 46, 84,
-246, 94,126,159, 2,206,161, 33, 68, 16, 8, 3,206,192,227, 57,217,110,117,107,125,102, 27,171,122, 91,206, 4,186,207,116, 1,
-191, 65,180, 14,184,176,152,203,180,202, 60, 34,235, 77,182, 94,120,169, 42,109, 66,231,111, 91,156, 18,161,191,245,117, 65,154,
-140, 40, 41, 74,153, 59,155,216,155, 4,155,117, 24,231, 29,191, 82, 74,150,216,208, 78,167,109, 57, 73,249,212,147,102,174,102,
-171,234, 30, 84,204,148,245,152,115,233,171,140,224, 35,114,151,193, 65,183,152,196,223, 40,101,182,105, 32,213, 43,243, 74,203,
-188, 48,203, 45,141,203, 30,132,158,128,156,123, 82,154,253, 66,107,147,100,184, 84,227,138, 42, 82,148,110, 73,193, 40,142,229,
-250, 46, 90,122,183, 83, 90,164, 77, 28, 65,134,131,192,253,229, 31, 47,112,196, 93, 90,222, 97, 14, 70,166, 54,241, 28,188, 60,
-104,119,140,182,221,185, 6, 73,216, 70,255, 0,126, 60,170,180,212, 28,199, 76,118,189, 37, 81, 88,216,234, 92,179, 45, 54, 15,
- 43,233,127,144,192,104, 19, 43,212, 73, 46,201,102,112,246,132,160, 41,208,160,124, 35,246,112,106, 6, 90,170, 87,234,143,214,
- 24,167,149,200,117, 95, 97,114, 54,162,254,100,156, 57,212, 42,125, 82,133,236,209, 93,166,182,169,101,190,234, 83,236,120,144,
-213,207, 79,143,169,198,139,110, 33, 11, 12,141, 79,223,223,157, 99,162, 80,160,216, 18, 99,229,244,167, 57, 51, 58,100,172,187,
- 20, 86,107,161,201,253,226,200, 92, 55, 91,176,113, 91,120,220,120,226,246, 63, 44, 71, 51, 70,104,163,212,234, 13, 73,139, 31,
-185,107,104, 46,161,165, 15,180, 81,235,240, 24,114,252,106, 45,110,139, 6,135, 17,196,161,246,218, 91,179,159, 82,188,197,248,
-196,114,163,149,230, 67,133,237, 78, 48,164, 36,163,114, 10,211,109,201, 61, 8,197,150, 26,104,172,172,200, 39,175, 74,176,201,
- 18, 73,153,241,173, 53, 54,163, 41, 74, 67, 16,202, 11,139, 1,178, 23,126, 62, 56,215, 45,217,132, 55, 26, 84, 91, 6, 83, 97,
- 97,193,247,227,101, 43, 46,102, 9,145,151, 54, 37, 41,215, 88,108,128,181, 91,128, 79,166, 39, 25, 58,128,253, 93,182,105, 21,
- 90, 58,202, 22,173,169,113, 77,155, 36, 17,230,109,131, 63,112,213,184,213, 64,199,141, 92, 67, 75, 81, 2, 55, 53, 92, 75,146,
-136,241,200, 75,128,149,240,145,111,207, 4,225, 57, 54,130,234, 92,134,251,130,195,197,207,133, 70,220,241,134,218,143,148, 93,
-202, 85,199,161, 54,178, 88, 39,115, 55, 55,176, 62, 88,184,244,231, 43,209, 51,174,151, 67,144,186,107, 10,125,214, 9, 91,197,
- 60,133,131, 99,207,203, 25,216,182, 51,109,132,218,161,247, 18, 84,149, 24,211,202,126,149,104,217, 40,171, 40, 48, 69, 84,146,
-208,100, 61,222, 40,221, 78, 39,197,180, 90,227, 15,178,237, 6,165, 81,113, 45, 83,227, 23, 28,221, 96, 7,166, 47,252,157,163,
- 84, 76,207, 90, 97,164, 83,216, 65, 97, 9,246,135, 54, 3,225, 29,109,239, 61, 49, 55,143,164,185, 70,133, 50, 66, 96,209,154,
-105,246,208, 67, 37,164,109, 42, 73,243,198, 62, 33,197,246, 22, 23, 6,221, 64,230, 9, 10,242,159,219, 73,161, 11, 55, 20,137,
-157, 42,147,202, 52, 25,116,154, 74, 24,117,237,207,190,162, 84, 47,247,121,181,189,227,223,141,185,242,150,165, 80, 30,132,183,
-208,225, 75, 69, 94, 17,200, 35,156, 75,179, 14, 65,172,210,228,251, 98,130, 75, 71,113,104, 19,205,147,212, 91, 1, 37,209,170,
-146, 97, 73, 97,136,228, 36,176,119,133,117,177, 30,252, 30,223, 19,180,125,105, 90, 28, 7,223,207,248,171,104,107, 34, 34,171,
-173, 38, 33,220,216,236, 46, 47, 34, 55,134,253,120, 55,196,246, 74, 2, 29, 87,116,210,138, 45,107,168,249,226,173,202, 51, 92,
-162,230,232, 50, 16,238,207,181, 45, 44,250, 5,113,139, 97,166, 47,114,218, 75,201,191, 32, 3,108,107, 95,119, 30,204,118, 34,
-147, 83,150,152,148,139,216, 99,106, 88,113,180,133, 45,179, 98, 56, 56,242, 90, 23, 14, 43,181, 7, 89, 80,101,167, 82,218,212,
- 7,235, 30,108, 61, 77,177,174, 52,198,102, 41, 45,198,116,169, 74,108, 44, 32,117,177,192, 32,148,230,229, 78, 29,109, 74,202,
- 14,181,180, 69, 83,156,182,229,253,111,197,142, 22, 54,162,149, 84,113, 33,104,167, 72, 80, 61, 8,101, 68, 31,203, 11, 16,237,
- 17,255, 0, 33, 69,131, 93,119, 38, 85, 33, 69, 37,185,232, 23, 54, 0, 28,107,146, 98, 33, 64, 38, 85,253, 8, 56,207, 50,229,
- 28,165, 15, 44, 78,204,202,124,194, 98,156,219,203,125,111,133,236,105,166,208, 84, 84, 15, 60, 93, 10, 23,228,248, 78, 42,218,
- 70,124,162,234, 46, 95, 70,104,211, 60,214,197, 90, 11,178, 77,221,136,230,238,229, 95,176,164,158, 80,127,116,128,122, 99,193,
- 44,248,218,241,242,165,148,119,118,233, 7,206,186,149,240,194,123, 44,233,152, 27,152,211,202,172,223,101,220,161,107,147,132,
-170, 90,221, 90, 80,133, 20,173, 95,119,212,226, 2, 51, 54,127,166,146,203, 65,213,169, 42, 36, 41, 76,222,227,158, 61,221, 48,
-123, 45,106, 54,100, 46,165,250,150, 94,117, 76, 54,132,247,171, 8,186,145,187,175, 31, 11, 99, 97,142, 47,108,173, 41,117, 49,
-212,131,181, 81,115, 1,113, 32,148, 42,106, 86,197, 14, 69,193,118,231, 4,227,229,230, 54,248,214,160,163,230, 48, 18,159,170,
-153, 91,218,195, 43,110, 64,114, 83,129, 73, 66,147,123, 13,163,240,196,145, 85,244, 48, 75,206, 83, 84, 27, 10, 0,146,174,109,
-127, 65,141, 71,184,163, 8, 97, 50,167,125, 38,106,138, 48,123,215, 21, 1, 52, 62, 69, 34,116, 71, 54,161,229, 41, 7,167, 56,
- 97, 42, 35,205,168,221, 4,223,208,226, 67, 76,206,116,185, 81,159,121,108, 4,247,105, 37, 40, 87, 85,115,229,135,146,106, 89,
- 94, 62, 80,151,156,171, 49,214,204,120,109,130,166, 90, 70,231, 95,113, 95,113,166,211,230,165,114,111,209, 41, 73, 39,165,140,
-236,120,138,195, 17,115,179,105,103, 55, 66, 35,210,172,127, 67,196, 2,194, 82,137, 39, 77, 42, 7, 49,115, 16,120,117, 64, 14,
-128, 99, 19, 46,170,228,109,142,130, 83,228, 78, 5, 71,237,205,217,189, 25,118,161,144,233, 58, 55, 89,169,231,186,138, 91,102,
- 35,242,102,149,177, 73, 80, 90, 92, 90,253,157, 45,161, 78,146,218, 86,139,238, 80, 27,183, 0, 45,130,113, 53, 18,135, 95,165,
- 8,230, 11, 17,101,165, 9, 43,186, 84,210,156, 38,225, 94, 5, 45, 64,216,129,202,108, 57,231, 26, 15, 95, 34,217, 37,110,152,
- 0,198,189,126,158,250,189,119,195, 24,133,157,183,106,230, 95, 32,100,249,104, 34,125,244,210,163, 62,106,155, 13, 7, 72, 72,
-244,192, 90,134, 93,139, 85,120,206,135, 37,200,117, 4,166,201,152,200, 6,227,246, 92, 73,225,196,126,233,249, 17,215, 18, 72,
-173, 71,144,224, 74,246,168,168, 92, 0,111,112, 49, 11,214,106,236, 61, 63,136, 51,245, 13,194,151, 41,111, 32,213,162,148,148,
-137, 49, 73, 9,112, 11,128, 20,164, 3,188, 17,114, 54,159, 34,113, 31,111, 97,196,254,160, 71,157, 97,178,195,253,168, 74, 65,
- 7,239,122,172, 50, 78,164, 84,251, 50,235,147,217, 43, 52, 68,246, 12,189,153,157,222,203,141, 40,247, 17,223, 38,219,218, 81,
-232,130,120, 32,242,144, 69,250, 92,186,237,103,155,107,186, 99, 85,136, 98, 70,139, 62,141, 91,109,101,166, 95,105, 42, 44, 60,
-144, 1, 40, 54,225, 86, 85,194,185,235,238,196,187,181,118,156, 82,245, 27, 64, 42,181, 68,182,133,191, 6, 15,214, 84,185, 41,
- 28,164,164, 5,220, 31, 69, 34,255, 0,150, 57,123, 63,107, 72,213, 14,206,217, 85,202,172,189,213,154, 13,101,200, 51,183, 43,
-196,180, 22,129,109,207,152, 77,143,189, 39, 21,213,217,131, 35,126, 71,159,148,244,174,195, 5,125,215,174, 91,185, 70,132, 28,
-171,244,209, 95, 67, 93,229,216,198,155,148,209,167,121,102, 46, 91,109,207,103,144,199,124,174,248,130,181, 60,181,149, 44,168,
-143, 61,215,249, 1,143,169,154,109,177, 52, 8,155, 64,176,101, 36,219,208, 1,255, 0, 44,124,120,250, 50,115, 43,181,188,161,
- 74,142,252,143, 13, 50,185,220,184, 84,120, 74, 20, 82,171,255, 0,226, 56,250,237,144, 43,145,216,161,162, 54,224, 11, 8, 8,
- 87,225,198, 51,238, 28,237, 92, 10, 53,222,224,235, 89,105,214,214,100,133,159,142,181, 61,174,230,186, 93, 15, 43,204,204, 21,
-137,168, 98, 28, 24,174, 63, 41,247, 77,146,211,104, 73, 82,148,125,192, 2,113,241,102,173, 91,206,189,184,251,104,183,237, 21,
- 39,173,154,179, 16, 66, 19,186,254,199, 79, 65, 38,201,191, 64,219, 9, 63, 18, 61,248,237,175,165,171,180,170,180,151,179,147,
-154,113, 72,168,247,117, 76,234,247,177, 4,161, 86, 82, 33,163,197, 33, 95, 48, 80,223,188, 56,125, 49,204,255, 0, 68, 22,157,
-189,153, 53, 78,187,172, 51,153,188,122, 12, 1, 10, 3,138, 28,123, 76,131,226, 80, 62,169,105, 42, 7,255, 0,170, 49, 73,211,
-218, 58,148,122,214,170,115, 5, 72,175,163, 20, 86,233, 25, 26,147, 3, 37, 80, 98, 55, 18,157, 77,136,152,208,217,104, 89, 45,
-182,148,132,128, 62, 64,227,124,186,243, 72,104,184,169, 62, 13,221, 9,196, 83, 53, 85,247, 45,111, 52,190,109,202, 65,248,255,
- 0,207, 16,250,158,107,144,182, 16,200,144, 64, 0, 94,231,227,255, 0, 60,105, 33, 19, 78, 78, 81, 86, 13,126,189, 25,198,211,
- 34, 59,219,148,165,146, 8,248,225,147,121,205,250,106, 84, 3,164,139,220,123,175,255, 0,166, 43, 21,102,233,136,145,181, 74,
- 37, 9, 36,165, 63, 46,191,152,198, 43,207, 37,162,125,160,238,220,158,151,244, 22,197,160,214,149, 85,199,106,240,166,106, 63,
-180, 69,222,235,151, 85,128, 54, 62,118,181,240,245, 25,193, 41,106,251,252, 86, 6,196,249,143,253,113, 69, 80,115,160, 68,144,
-183, 29,178, 56, 35,158,188,226, 68,115,211, 5, 42, 45,187,115,199,159,203,251, 48, 23, 27, 53, 92,172, 85,160,246,116,222,173,
-174,175,147,114, 47,233,128, 53,252,194,218, 91, 15, 37, 66,206, 38,252,121, 31, 60, 66, 95,206,237, 56,246,237,228, 0, 64,235,
-228,112, 42,175,156,247,110,141,222,220, 2, 79, 94,131,174, 42,169, 6,160,167, 0,169, 44,188,196,101,120, 3,158, 29,190, 71,
- 26, 39, 72,105, 76,141,175, 18,160, 1, 62,251,117,196, 66, 53,125,176,206,245,174,228, 90,252,245, 28,223,248,227,207,210, 34,
-149, 32, 7, 73,240,157,220,249,121, 96, 93,153,160,169,225,202,136,214, 43,142, 50,199,124,210,141,202,184, 4,254, 24,142,214,
- 51, 20, 89, 80,214, 30, 80, 42, 90, 56, 23,243, 60,219,248,140,106,175,214, 74,183,119, 42,184,219,125,163, 21,230, 96,157, 82,
- 51, 20,227, 43, 59, 1,220, 61,254,191,227,223,130,161,169,170,203, 89, 85, 15,203, 58,105, 84,173,103,138,157, 82,148,192, 33,
-213,248,220,113,196,161, 32,219,173,201,196,170,177,147,230,100,186, 52,186,237,110,171, 21, 17,161, 66,114, 92,146,137, 40, 81,
- 13, 54,146,165, 40, 11,220,216, 3,211, 20,230,178,231,250,237, 47, 48, 71,162, 81, 35,160, 1, 9, 11,154,235,132, 0, 1, 36,
-130, 57,231,131,136, 36,221, 69,253, 33,132,236, 7, 91,157, 37,180,165, 77,184, 9,186, 20, 15, 4, 91,139,130, 58,226, 74,197,
-113, 70, 30, 13,160, 39, 32,142, 68,159,255, 0, 96, 60,180,175, 61,196,144,203,216,170,150,185,220, 13, 60, 34,190,132,125, 27,
-217,183, 78,106, 90, 33, 43, 84,169,181, 38, 27,155, 92,140,101, 58,135, 31, 10,113, 5,211,187,187, 63,247, 65, 8,254,142, 54,
-246,160,204, 20, 92,211,245, 74,106,153,194,159, 13,248, 97,239,178,146,237,148, 80,174,237, 9, 80, 0,116, 37,165, 99,128,123,
- 41,103, 76,159,164,154,146,167,179, 26,170, 77, 80, 89,136,143,171,153, 47,172, 33,181,161, 32, 20,148,131,226,185, 4,244,230,
-248,123,173,122,213, 83,213,236,245, 47, 56, 70,109,230, 35,184,176,136,205, 23,126,226, 83,194, 60, 32,250, 11,155,121,147,136,
-223, 62,242, 31, 75,172, 40, 3,212,137,223,194, 71,149,117,252, 67,125,103,113,100,150,217, 50,149, 4,192, 28,128,255, 0, 85,
-127,206,153,167, 81,156, 43,157,168, 52,181, 41, 39,238, 7, 21,207,229,252,112,233,209,165,146, 33,183, 34, 22,127,130, 23,107,
-186, 2, 87,100,143,194,199, 28,119, 34, 93, 86, 36,133,137,111,168,173,106, 10,113, 65, 96, 2,175, 82,125, 49,131, 25,214,161,
- 18, 34,189,177,229, 39,121, 42, 74,201,221,225, 23,177, 0,124,207, 56, 1,197, 49,200, 5, 15,143,255, 0, 17,175,214,188,217,
-219, 70, 9,253, 63, 26,237, 26,106,114, 66,155, 6,153,169, 52, 71,219, 39,133,151,148,146, 7,192,167, 12, 51,196,156,163, 59,
- 43, 78,165, 83,117, 30,148,196,183,217, 45,180,234,150,163,182,252, 21, 90,220,249,227,143, 63, 77,138, 95, 69, 73,170,211,128,
- 33,143, 15,114,149, 37, 9,191,235, 91,203,156,107,147,159,234,172, 56, 23, 30,186,123,231,141,150,128,178,173,201, 61, 79, 55,
- 62,252, 72, 98,252, 66, 83,151,181, 79,158, 77,127,111,133, 0,216,219,159,241,248,212,154,185,217,119, 40, 46,160,243,213,125,
-127,165, 60,226, 30,187,102, 44, 37,149, 40, 31,189,114,162, 13,237,211, 2,191,205,199, 72, 96, 73,110, 75, 58,204,236,129,221,
- 20,169,147, 13, 32,168,147,197,136, 56,102,228,236,205, 16,137, 17,167, 32,199, 82,206,229,188,160, 86,127, 43,143,225,129,242,
-106,129,146,235, 87, 84,199, 89,241,165, 70, 50, 82, 19,126,137, 42, 28,155, 97,211,138,227,138,137,186, 62,228,160,127,252,253,
-106, 63,211,237,128,140,159, 63,222,162, 26,149,217,179, 79,106,125,219, 80, 53, 22, 91,143, 55,194,208, 98,160, 95,169,224,223,
-156, 85,117, 77, 31,129,150, 20,235, 80,179, 66,138, 2,146,224, 82,146, 5,148,147,112,108, 49,106,230,170,132,167, 28, 47, 41,
-126, 11,220,180,130, 78,229,116,234, 63,134, 43,140,221, 56, 62,162,240,128, 84, 17,225,220,142, 13,253, 15,174, 58,204, 51, 21,
-196,202, 66, 92,120,168,120,132,254,194,137,217,101,216, 69, 26, 94,161,100, 71,162, 21, 85,114,195,162, 90, 99,132, 3, 21,240,
- 16, 84, 7, 42,177,231,156, 61,164,234,230,154, 8, 72,143, 54,133, 41,181, 33, 32, 88, 88,133,144,111,235,138,166,123, 42, 83,
-194, 66,226,187,180,253,237,171,176,198,132, 66,169,202,157,181,152, 32, 3,208,220,147,111,126, 10,112,124, 57,201, 42, 82,181,
-255, 0,204,199,161, 52,161,200,138,158,214,243,182, 94,159, 86,126, 92, 40,229,134, 92, 89, 45, 52, 44,118,143, 76, 18,166,103,
-124,140,236, 6,227, 84,154, 90,146,147,226, 5,176, 65, 62,189,113, 92,251, 5, 85,130,231,114,194,212, 27, 28,217,174, 1,233,
- 98,113,182,157, 68,157, 33, 27,149, 20,133, 40,248, 80,148,158, 79,199, 26,193,198,155,101, 45,131, 1, 48, 7,186,134,166, 86,
-173,234,200,171,234,150, 85,246, 6, 40,217,122,150,204, 86, 90,229, 78,136,254, 37, 43,251, 6, 36,185, 39, 83,116, 90, 54, 87,
-121,188,230,218,151, 61,215,236,217,141, 22,224, 35,205, 74,191,159, 94,152,169,163,105,222,103, 84,132, 54,136, 14, 45,197,167,
-120,109,171,174,223, 44, 26,164,233, 61, 94,168,165,165,216,238,130, 23,182,200,104,222,254,167,208,123,241,158,167,112,182, 97,
- 82, 36, 25,158,115,231, 70, 97, 46, 50,176,160, 1,243,168,190,172, 66,167, 85,115,197, 74,163,146, 86,161, 77,113,123, 98,173,
-105,238,212,180,216, 94,227,203, 7,168,178, 50,245, 91, 32,198,164,230,133,134,234, 48, 64,105, 54, 27,131,205, 3,199, 62,182,
-196,190, 23,103, 89, 78, 93,153, 13,173, 79, 27, 20,134,156, 36, 91,223,232,113, 36,160,118,118,202,137,113, 76, 86, 38, 72,142,
-226, 90, 42, 14,188,164, 37,180,159, 43,146,121,249, 97,174,248,178,204,182,144, 87,170, 72, 32,141,244,250, 30,116, 37,218,246,
-170,146,145,214,130,105,189,115, 70,169,212,199,154,205, 15,184,151,148,118, 35, 99, 36,165,180,250,241,231,137, 60,141, 66,209,
- 90,110, 87,122,147,151,234, 61,228,151, 17,224,113, 81,213,115,239,189,176,229,122, 35,147, 90,101, 43,101, 13,119, 41,178,150,
-249,241,111, 7,139, 0, 63,142, 60,151,163,121, 85,232, 75,151, 3, 41,165,196, 37,223, 11,200,113,105,178,109,233,111, 51,142,
- 70,234,247, 10,188,191, 23, 78, 45,194,100, 24,145,148, 70,194, 15,202,106,202, 26,117, 17, 28,171,159,117,130,149, 27, 54, 84,
-216,114,134,180,119, 77,182, 67,139, 81, 35,113,242,196,219, 67,235,185,111, 38,105, 50,242,238, 98, 68,149,212, 91,154,234,217,
- 76,102,247, 39, 98,173,107,159,141,241,103,157, 42,203,148,197,150, 85, 68,133,126,232, 20,164,172, 41, 70,252,220,223,207, 5,
-168,249,103, 39,210, 32,163,108,112,130,165, 16,234, 16,164,155,243,211,206,231,221,141, 59,254, 40,180,188,180, 75, 10, 65, 41,
- 73, 4,121,143, 90, 75, 97,199, 86, 73,231, 81, 13, 62,213,202, 30, 88,117,249,210,169, 83,156, 14, 54, 18,142,237,159,125,252,
-206, 15, 63,172, 85,154,236,214, 42, 20, 61, 61,152,160,217,225,110, 56,148,238, 73,245,244,196,218,147, 11, 42,182,135,153,122,
-136,210,212, 72, 13,135, 80, 80,180,219,204,113,110,113,179, 48,193,133, 77,132,227,169,134,142,155,252, 68, 5, 95,160,233,215,
-225,142, 98,247, 22,176,188,196, 77,202,217,254,225,211, 85, 24,136,141,132, 84,211,106,160,222, 94, 85, 11,169, 57,168, 57,133,
-109,212, 70,157, 54, 26, 15, 18,158,250, 65,240, 31, 49,112, 45,206, 7,230, 44,137,153,115, 11,138, 92,186, 92, 26, 78,247, 62,
-208,176,181, 45, 86, 34,214, 39,143,195, 18,119, 43,109, 57, 9,184,198,177, 47,107,201, 37,246,210,209, 38,215,189,174, 62,239,
-199,174, 55,212, 51, 21, 58, 20,180,185, 22,162,216, 42, 64, 35,191, 10, 89, 73, 3,204,121,226, 13, 98,142,219, 40, 22, 82, 18,
- 68,196,102,250,147, 62,149, 33,105, 53, 93, 80,187, 27,100,201, 11, 14, 84, 51,107,205,205, 66,194,217,105, 45,125,241,123,147,
-207, 92, 75, 81,165,249,118,142, 24,165,162,108,201,138, 0, 7, 84, 1,105, 42, 81, 62,128,121,124,112, 96,103,200,149, 56,100,
- 79,171, 45,187,170,238, 72,138,141,165,103,208, 19,211, 26,229,234,109, 30, 28, 68, 37,140,208,219, 77, 7, 5,218, 89, 43, 85,
-192,177, 60, 15,203, 14,254, 63,142, 93, 42, 29,113, 71,195,253, 10, 34,108,208, 6,213,186, 6, 66,210,122, 43,237, 52,221, 17,
- 51, 95, 65, 42, 84,103, 92, 83,128, 31, 62,110, 71, 56, 40,183,233,140, 42, 73,165,233,213, 26,146,226, 81,102, 28, 49,210, 13,
-135,235, 1,242,196,122, 14,114,203,108, 71,109, 84,176,236,130,226,212,161,117, 22,210, 9, 60,239,227,166, 25,230,141, 74,203,
- 13, 49,236,242, 22, 80, 16,131,185, 73,178,238,171,249, 27,240, 6, 51,215,113,125,112,224, 11, 82,213,230, 79,202,126, 98,136,
-155, 84, 39, 97, 21, 55,155,154,106,245, 24,145, 93,222,160,148,181,100,247, 50, 18,205,255, 0,162, 7, 24, 88,166,221,212,218,
- 88,121, 72,138,167, 94, 64, 55, 74,156, 65, 87, 7,222, 45,133,137, 11, 55,146, 32, 15,135,243, 83,236, 69,119,245,119, 44,105,
-238,116,211,250,189, 18, 69, 20, 8,114,169,146, 98,186,218,147,112,148, 37,160,133,120,135, 78, 84,180,143, 50, 82, 79, 36,223,
- 31, 25,123, 56,175, 83,251, 58,106,213, 86,179, 50, 92,186,125, 18,151, 84,126,151,152, 22,235, 87,143, 57,108,172,167,186, 9,
- 36,110,116,219,194, 83,226, 23,226,224,144,126,165, 59,171,121, 73, 25, 17,218,158,107,170, 53, 79,136,227, 47, 58,251,174,185,
-181, 13,139,173,106,177, 61, 0, 42, 28,250,164,123,177,242,247,180,125,127, 53,106,110,111,204,186,135,167,185,114,181, 39, 40,
- 79,175, 72,118,157, 88,145, 5,230,225,199, 14, 57,180, 45,130,160, 6,245, 4,128, 92, 60,220,217, 54,234,120,190, 6,179,188,
-113,119, 22,145, 41,114, 1, 42,216, 25, 49, 19,204,131,231,166,198, 43,233,110, 9,252,191,106,110, 30,198, 80, 87,111,148, 66,
- 71,249,172,108,137,208,236,100,229, 32,255, 0,228,153,204, 46,221,122,250, 75,242,158, 73,134,213, 23, 74,244,197,201,213, 57,
- 39,188,156,154,228,180,161, 16,124,131,106, 12,169, 69,110, 16, 77,198,228,237, 6,199,158, 7, 85,105,229, 88,230,188,135,151,
-234, 78,101, 41, 84,169,217,134,148,204,218,131, 14, 19,246, 43,121,176, 75,100,158,124, 62, 33,206, 57,155,232,193,236, 71,164,
-211,242,197, 51,180,182,179, 82,197,118,123,149, 89, 70,133, 65,152, 83,236,141,162, 58,130,123,247, 27,183,218, 18,224, 80, 1,
- 87, 72,176, 36, 19,206, 59,117,140,201, 79,170, 60,181, 64,216,237, 81, 46, 32, 39, 47,165,149, 41,201, 40, 74, 82,165, 41, 14,
- 37, 37, 41, 5, 92,248,186, 5,139,129,126, 33,196,239, 97, 86,119, 62,195, 98,133, 41, 77, 18, 22,178, 78,170,218, 0,232,152,
-220,192,241,231, 94,123,141,123, 5,197,225, 22, 76,246,104,157, 4,149, 24,228, 9, 58,147,227,167,128,170, 62,179,165, 90,166,
-254,108,113,200, 73,105,248,109,238, 13, 20, 60, 18,150,202,150,144, 10,189,246, 6,216, 99, 79,141, 83,205, 57,215,244,107, 76,
-181, 73,154,212,202, 67,110,138,252, 89, 48,214,136,241, 31, 46, 40, 52,195,111,165,127,106, 74, 27,113, 69, 69, 32, 2, 0, 27,
-185, 34, 91, 31, 91, 50,236,252,251,254, 79,162,230, 68,208, 18,166,130,217,139, 85,140,160,243,111,164, 19,221,173,180,248,202,
- 82, 80,175,180, 30, 2, 1, 1, 87, 28,138,213, 65, 84,210,252,175, 39, 95,105, 90, 56,195, 84,196,190,145, 80,147, 73,134,152,
-222,211, 9,199,118,151, 94,111,245,147,117, 29,151,185, 4,222,224,110, 4,182,151, 79,232,219,201, 25,149, 1, 2, 0,223,207,
- 66,121, 0, 13,101,178,211, 40,148,169, 36,168,237,225,212,255, 0,189, 43,163,116, 98,179, 64,236,159, 47, 45, 85, 53,115, 47,
-101, 56,181,183, 84,103, 85,115, 45,114,107,147,169,200,139,185, 64, 48,207,116,211,129,165,120, 2, 76,141,171, 74, 84,165, 36,
- 46,228,237,137,246,148,212,252,173,172,153,186,185,156,169,217,156,194,135, 86, 90,150,219, 82, 29, 46,123, 10,110, 9, 12,169,
- 32, 36,182, 64,240, 1,202, 65, 23, 28, 92,194, 51, 22, 97,205,154,209,162,185, 99, 49,211,230,194,204, 52, 10,132,182,233, 84,
- 55, 38,200, 10, 67, 9,150,250, 24, 75, 42, 74,206,208,128,242,211,185, 11, 54, 7,125,194, 78, 56,155, 86,117, 27, 86,114,166,
-102, 84,188,241, 81,135, 7, 57,229, 10,139, 49,166,181, 10, 66, 66, 39, 65,144,216,126, 58,130, 16, 74, 86,208, 65, 9, 34,246,
-218,234, 65,231, 27,214,121,175,219, 41,182, 1, 57, 20, 36,198,169, 88,141, 58, 29,116, 50, 14,227, 72,219, 70,229,229,173,132,
-165,166,242, 36, 70,177,172,245, 61,126,244,171,239, 62, 82,242, 69, 11, 52, 66,206, 12, 67, 97, 50,144,135,132, 87,123,150,218,
- 14,220, 38,229, 78, 40,130,174,131,169, 29, 72, 3, 21, 70,102,237, 35, 39, 42,166,124,124,229,167,239,152, 45, 84, 10, 23, 80,
-143, 53, 43, 17, 92, 85,150,216,176,178,146,171,110,181,189, 13,137,233,129,186,185,218,210, 64,110, 46,169,229, 45, 52,164, 57,
- 72, 76,240,181, 64,146,210,175, 17, 73,105,144,160,133,130, 2, 6,247, 44, 0, 22, 6,196, 12, 86,122,239,169,116,141, 67,210,
-231,179,229,102, 3, 14,215, 43, 89,129,164, 57, 45, 1, 73,188,118,163, 11, 0, 18,160,139,238, 34,228,160,168,159,214, 28,131,
-126,206,214,233,247, 2,175, 4,230,208,146, 76,204,237, 3,167, 94,181,142, 81,218,174, 92, 81, 36,243, 63,126,149,209,186, 95,
-170, 13,106,148, 6,217,202, 89,222, 4,224,227, 10, 49,212,236,144,133, 45,192, 9, 83,106, 22, 59, 22,145,180,145,225, 36, 92,
-164,112,108, 71, 44,230,108,221, 34, 85, 79, 39,103,186,251,175,194,168, 48,182, 85, 6,165,101, 41, 12,175,122, 46, 20, 0, 82,
-124, 60,148, 44, 18, 60,213,124,114,102,108,206, 90, 88,141, 62,162,234, 62, 72,167, 74,203, 57,234, 46,200,115, 69, 17, 97,152,
- 51, 98,161,128,148,200, 91,118, 39,191, 42,251,196, 16, 15, 36,164,147,124, 29,236,203,219, 27, 44,208,157,117, 58,141, 73,169,
-213,222, 76,144,219,206, 58,251,143, 62,242,142,225,246, 97, 71,106, 64, 22,224,145,239, 61, 49,125, 54,151, 22,246,142,150,145,
-153, 42, 31,166, 6, 96,173,164, 29,189,226, 40, 87, 22, 72, 10, 57, 14, 97,167, 42,233, 93, 47,214, 7,115,111,101,217,121, 27,
- 55,204,239,106, 25,121, 18, 50,235,206,188,162, 87,220,160, 45,166,193,191,236,164,167,229,199,150, 56,107, 59,210,151,151,115,
- 90,226,199,222,136,211, 34,197,154,218, 20,120, 37,198,130,137,249, 40,168, 98,240,127, 84, 90,139,155, 51,197, 50,155, 77,114,
- 60, 44,203, 38, 37, 86, 43, 27,154, 87,114, 84, 54,175,196,133, 16,110, 87,208, 19,247,125,216,173, 53,165,228, 85,211,148,102,
- 71,142, 62,199, 44, 51, 21,247, 19,250,234,110, 67,246, 87,175,221, 41, 23,247, 98, 88, 91, 43,182,125, 95,241, 94,177, 58, 9,
- 19,167, 77,100, 84,109,127,180,242,143, 90,232,143,163,115, 84, 14, 83,204,181, 12,189, 45, 68,179, 45,144,243,105, 31,246,173,
-139,139,124, 69,255, 0, 12,125, 33,203, 95, 72,206,130,100,234, 68, 70,115,142,122, 79,214,142,222, 63,212,116,182,215, 54,115,
-142, 4,164,139,180,208, 37, 36,146, 64,221,110, 65,199,199, 61, 46,153, 93,167, 68,158,188,179, 37,230,106, 5,144,152,171,142,
-171, 46,234, 10, 65, 0,142,132,238,182, 59, 11,179, 77, 17,174,202,250, 53, 84,215,106, 44, 53, 63, 95,110,154,184,237,214, 22,
-192,112, 25,242, 16, 3,108,161, 68,130,128,139,149,169, 66,247,219,207,222, 22,139,202,113,155,253, 20, 72, 87,248,244,211, 85,
- 30,128,124,107,161,195,110, 27, 75,138, 60,213,244,231,238,161, 31, 72, 55,107, 68,118,168,215,215,115, 45, 18, 36,216,148, 90,
- 60, 22,233,244,152,149, 6, 59,167,211,182,234,117,110, 32, 19,181,101,213, 40, 91,174,212,164, 30, 70, 59,199,232,226,201, 52,
-157, 52,236,161,151,233,155,151, 30,177, 94,239, 43, 19, 89,149, 29,108,173,192,240, 79,118, 81,188, 14,241, 33,148,181,226, 77,
-197,201,231, 31, 50,116, 55, 71,165,234,158,169,208,178, 92,218,134,247,171,149,134, 35, 44,163,196,161,222, 56, 55,172,159,112,
- 37, 71,224,113,246,161,110, 80,232, 52,184,244, 26,115, 72,141, 14, 20,116, 71,138,210,120, 13,161, 35,106, 82, 61,192, 11,124,
-176,123, 69, 7,157, 82,135, 42,219, 67,169, 88,210,131, 86,167, 15, 18, 92, 69,184,255, 0,149,241, 1,204,146,187,148, 18,133,
-121, 29,190,238,184,146,230,106,244, 21,247,171,141, 33, 4,216,129,207,248,242,197,101, 88,204,173,165,245, 51, 37,209,112,118,
-245,233,115,124,111,176,153,170,183, 14,229, 21, 31,168,234, 52,218, 60,151, 91,113, 87, 0, 16,146,122,115,231,129, 95,229,129,
-135,228, 2,228,132,128,142,109,126,182,242,192,252,255, 0, 54, 9,136,227,140, 17,215,194,126, 56,231, 60,239,155,230,209, 42,
-238,169,185,101, 34,252, 0,120,183, 63,242,252, 49,162,210, 18,189, 43, 56, 44,184,107,172,105,250,139, 14,104, 71,250, 71,118,
- 69,172,119,112,121,195,245,234, 11,140, 47,106, 31,178, 7, 4,223,174, 56,251, 46,235, 28,134, 2, 1,157,187,144, 84, 20,191,
-133,255, 0,134, 39, 48,245,254, 11,201, 30,218,240,177, 87,175, 62,252, 51,150,198,162,160,160,107,163,152,212, 17, 37, 9, 10,
-144, 82, 22,121, 55,247,227, 25,217,254,152,219,189,227,147,129, 32,144,177,127,125,177,206, 85, 13,117,167,196, 8,109,137, 64,
-163,101,130,138,189,127,199,231,136,156,189,108,153, 42, 98,187,169, 69, 94, 50, 65, 10,234, 47,123, 98,169,180, 81,168,101, 81,
-174,168, 86,169, 66, 91,169, 40,148, 54,158, 0,191, 67,198, 31, 83,179,175,182, 63,113,126,128, 11,121, 95,252,126,120,230,140,
-149, 95,170,215, 38,119,133,242, 83,191,129,127,134, 47,108,150,211, 41,140, 29,117,203,146, 8,254,204, 1,118,225, 52, 37, 38,
- 42,108,250,220,116,135, 91, 55, 10, 60,243,228,112,214,101, 49,167,108, 54,220,171,167, 30,126,152, 35, 13,184,239,196, 70,231,
- 5,246,216,139,225,218, 99, 51, 41,244, 37, 36, 29,132, 17,180,245,247, 98,170,187,162,132,107,152,251, 74,182,197, 27, 87,149,
- 13,247,163, 52,180,192,142,164,169, 99,196,144, 91,232, 60,253,127, 28, 69,229,251, 5, 89,150,226, 52, 99, 45, 27, 1, 43,239,
-148,217, 87,175, 3,175,207, 19, 46,214,212, 40,185,147, 88,101,213, 99, 60, 99,170, 44,102, 89,222, 64, 35,114, 69,135,203,159,
-207, 20,228,172,191, 95,168,151, 82,213,116, 0,203,164, 44, 54,201, 73, 23, 6,195,223,198, 57,139,155,187,117,220, 18, 28,136,
-174, 73,235, 23,156,185, 90,128,144, 77,108,157, 71, 75, 19, 28, 46, 41,148,134,110, 90,112,173, 74, 27,135,186,221, 45,134,178,
-220,151, 76,150,220,248,178, 20,130, 25, 33, 37,196,165, 55, 36,121, 12,110, 86, 66,122, 51,136,134,107,143,135, 29, 4,238, 82,
-238,126, 62,152,209, 81,211, 90,165, 49,230,229, 49, 84, 68,199, 86,157,233, 75,174, 19,208,226,105,196,237,167, 42,156,248, 81,
- 63,164, 92,148,204, 83, 41, 21,199,223,144,220,105,181, 57, 13,119,164,247,171, 71, 59,207, 22, 60,116,198,140,195, 38, 10,163,
-161,231, 38, 63, 36, 33, 27, 31, 37, 22, 31, 48, 58,224,155,148,124,245, 53,132, 63, 2,145, 21,160, 70,210,176,110, 83,240, 24,
- 21, 85,201,121,198, 34,193,140,219, 15,150, 81,119, 18, 77,185,244,243,247,224,237,223, 91,149, 14,248, 30,241, 84, 93,195,221,
-108,234, 41,139, 53,244, 82, 22,193,122,140,160,215,118,164,221,108, 17,184, 30,156,115,127,158, 9,211,234,176, 88, 38,165, 22,
- 42,123,231,145,100,187,221, 27,160,242, 5,207, 65,240,192,105, 43,207, 96,130,230, 91,125,183, 20,174,241,183, 18,202, 74, 83,
-229,239,227, 14,155, 57,165, 80,131,147,195,219, 29, 38,200, 72, 10,185,191, 55,249,224,238, 62,220,110, 61,104, 2,216,142, 70,
-138,175, 51,212,148,174,234, 77,108, 38,228,146,181, 14, 19,127,213, 30,252, 53,166,214, 87, 22, 82,227,189, 86,144,243,110, 46,
-196, 52,209, 55,252, 48,217,170, 85, 66, 81, 74, 81, 21, 75,112, 47,123, 72, 91, 28, 31, 80, 49,148,234, 94,122,109,164, 59, 76,
-130,176,155,155, 89, 54, 41, 62,182,183, 65,128,139,150, 63, 76,129, 62, 67,233, 79,236,254, 6,182,202,203, 20,138,145, 1,217,
- 82, 2, 1, 83,169, 74,211, 98, 72,245, 7,166, 26, 59,148,178,125, 65, 1, 18,169,203, 74,138,174,144,148,238,242,235,240,195,
- 25,181,140,225, 73, 9,129, 85,130, 8, 73, 80, 42,238,201, 85,253, 9, 39, 15,242,254, 77,159, 93,138,135,254,176, 49, 94,121,
-103,106, 81,199, 0,155,156, 20,222, 45,148,230, 83,144, 57, 65,167, 22,193, 71, 65, 94,167, 33,229, 14,225, 18,132,118, 20,150,
-222, 1, 76, 41,187, 94,254,103,155,140, 58, 99, 39,228, 40,115,187,248,180,200, 77, 43, 98,129, 74, 16,171,145,230,122,224, 28,
-252,177,155,105, 79,168, 10,123,207,169,151,118,169, 74, 73, 80, 7,212, 91,200,223,207, 1,179,102,117,205,180,102,156,126,171,
-150,221, 76,118,154, 27,159, 97,173,196, 11, 18, 73,227,243,196,197,203,207, 70, 87,102,124,126,156,234, 72,180,204,114,229,214,
-165,217,178,151, 16,181, 30, 62,150, 57, 21,169,239,255, 0,239, 13,203,225, 15,178, 8,220, 46, 77,199, 54,231,222,112,102,141,
- 51, 46,185, 5,167, 36,209,224,186,235, 77,120,238,141,170, 30,187,118,241,138,154,139,156,166, 38, 43,117,248,244, 57, 11, 19,
- 64, 12,169, 72,224, 55,201,218, 57,243, 28,156, 61,253, 36,206,210, 2, 95,137,151, 22, 15, 62, 20, 36,220, 39,225,228, 48, 69,
-135, 22,212, 41,126, 26,145,254,250,206,181,113, 97, 38,212, 50, 80, 52, 59,243,171,105, 25,150,146,217,246,248,153,109, 72,112,
- 1,181,224,202, 84,164,143, 33,126,182,195, 4, 85,170, 19, 36,169,193, 33, 40,117,199, 9, 81,147, 30,201, 9,244,235,136, 91,
-212,204,225, 34, 11, 77, 83,100, 30,253, 92, 33, 41, 54,247,216,226, 56,170,126,174, 25,201, 98,119,122,222,229,148,133,128, 72,
-242,184, 39, 21, 26, 67,106,152,112, 15, 51,251,213, 99,106,157,226,174, 47,211,120,194, 50, 88, 50,150, 91, 38,206, 4, 20,144,
-181,116,224,117,199,136,175,211, 36, 41,110, 41,222,229,148,139, 37, 43, 1, 87,249, 28, 83,149,166,243,197, 30,154,154,179, 53,
- 37,133, 4, 42,233, 8,233,107, 11,223,203, 1, 89,172,231,185,196, 33,126,218, 66,213,192, 66, 13,137,243,252,112, 68, 89,161,
-105,204,149,136,166,246,116,116,174,134,127, 57, 59, 18, 35,113, 26,172, 48,180, 37, 36, 57,222,128,146,160,121, 1, 54, 56,100,
-141, 68,102, 4,117, 75,151, 87,104,139,217, 40, 46,158, 57,243,248, 98,145,167,101,172,247, 92,101,201,173,179, 40,183, 28,144,
-189,196,220,158,150, 31, 60, 55,159,149,117, 22, 26, 28,126,125, 34,110,196,253,210,164,145,127, 46, 61,112,201,178,182, 39, 41,
-112, 79,186,166, 45,199,252,106,229,168,234,173, 38, 92,125,166,166,203,238, 41,119,222,183, 15,132,219,229,128,237,234, 61, 22,
-159, 32, 61,237,236, 43,119, 46,109, 93,173,248, 98,167,167,229, 12,219, 61,213,182,105,146,218, 1, 36,221, 77,147,205,189,223,
-135,207, 13,219,161,230, 20, 16,210,105,146, 84,164,159, 29,155, 39,140, 88, 77,165,170, 4, 5,211,150, 57,229,171,118, 95,104,
-191, 97,105, 40,165,176,203,196,155,149, 56,226,174, 79,241,192,250,191,104,201,178,211,182,162,148, 4, 18,119,132, 11, 3,249,
-226, 11, 75,210,172,231, 61,213, 61, 18,133, 37,103,161,216, 44,110,112,245,122, 1,170,114,228, 37,110, 80, 8,104,170,222, 53,
- 2,175,158, 33,147, 7, 66,181, 80,159, 19, 83,236, 87,210,137, 43, 90,234,204,149, 57, 69,146,166,208,177, 98, 1, 2,224,245,
-195, 25,186,159, 80,152,160,169, 51, 74,220, 81, 36,238, 95, 56,115, 78,236,227,157,234,145,220, 75,105, 67,105,108,171,236,220,
- 93,137,176, 36, 91,240,192,103,244,123, 54,211, 93, 76,101,210,221, 90,251,144,240, 91,105,186, 84,131,231,124, 21, 15,225,101,
- 80,149, 9,167, 75, 11, 60,169,212, 45, 70,113, 49, 28, 67,200, 72,228,236, 74, 15,158, 27,187,156,106, 33,189,137,184,105,197,
-221, 69,213,143,157,134, 13,163, 66, 51, 51,176,155,115,196,151, 71,137, 81,201,241, 91, 2, 42,122, 93,155,233,242,125,149,202,
-124,148,167,114, 66, 84,166,174,130, 77,249, 7, 9, 23,150, 10, 81,202,161, 82,236, 13, 96,206,109,144,123,198, 81, 48,148,168,
-114, 67,134,228,121, 14,184,212,245,126, 84,196, 45,157,128,165, 92, 36,133, 27,147,130,148,237, 19,206,115,103,161,109, 81, 72,
-102,192,151,199, 2,223,219,137, 37, 83, 67, 94,141, 25,164, 82,170, 12,166,118,197, 23,154, 88, 34,227,200,143, 33,230, 48, 53,
-226, 54, 40, 80, 25,135,223, 90,126,192,197, 87,102,179, 86, 66,136, 12,167,142, 57, 32,244,248,225, 98, 88,141, 17,207,106, 82,
-146,238, 95, 46, 40, 30, 84,209,227, 11, 4, 24,141,153,255, 0, 33,234, 63,122,127,102, 21, 51,157,168, 20,204,215,146,160,204,
-205,172, 71,147, 73,121, 30,205, 30, 28,196, 5,165,240,130, 20,235,132, 17,107,119,138, 28,254,226,135,144,198,231,245, 38,153,
-157, 50, 42,242,221,102, 51, 79, 67,169,182,220, 54,163, 41, 59, 80, 18, 14,237,192, 38,219,118,132,131,197,173,198, 57,166,181,
-170, 70,172,204, 42, 91,106,112,195,166, 65, 68, 90,123, 23, 63,119,170,151,241, 82,202,143,204,224,205, 59, 61,191, 18, 57, 13,
-172, 30,233,189,141, 92,240,216, 63,120,252, 73,233,142,121,120, 86, 85, 2,145, 4, 25, 17,200,206,227,225,233, 93,106, 46, 93,
- 74, 34,116,171,223, 72,117,113,156,156,196,237, 44,170,188,164,177, 4, 54,245, 0,192,144,228, 84,182,211,142, 45,101, 96, 33,
- 98,194,232,222, 73, 36,220,243,123,242, 99, 62,246,138,207,243, 32, 70,153, 30,123,181, 24,240, 95,239,225,206, 97, 65,153,209,
- 29,181,130,219,117, 2,203,232, 69,148,159,187,112,162,164,149, 3,206,116,138,195, 21, 58,162,220, 92,165, 42,117, 73, 77, 71,
-186, 77,187,182, 16, 78,212, 3,251, 74, 36, 95,208, 1,239,195, 77, 81,172, 87,154,139, 95,139, 73,204,111, 68,130,100,136,104,
- 67, 64,165, 37, 41, 3,144,164,220,166,229, 36,155,122,219,165,241, 59,172, 34,210,227, 16,237, 72, 18,168, 38, 70,147, 0, 40,
-142,146,100,248,213,155,105,184,112, 54,149, 4,204,120,125,251,234,255, 0,205,189,173, 50,174,100,163, 50,189, 71,168, 49, 15,
- 48, 51, 29,108,166,189, 14, 0, 73, 91, 15, 4,165, 82, 25,186, 13,156, 74,210,144,227, 42, 32, 21, 54,160,146, 55,224, 44, 47,
-164, 47, 95,178, 70,149,212,251, 52,234, 21,106,149,156,114,229,114,130,237, 50, 53, 97,244, 45, 83, 26,140,251, 65,198, 66, 92,
- 75,129, 10,218,229,148, 74,146,181,120, 10,119,216, 38,220,133,154,115, 86,106,165, 83,233,178, 31,156,163, 34,202, 42, 77,194,
-129, 65,228,146, 58, 29,201, 6,252,126,168, 56,119, 26,190,169, 25,189,200, 70, 3, 13,173,167, 23, 20,169,146, 18, 30, 8,186,
-208,234,145,228,160, 18, 83,184,125,235,131,212, 18,116,172, 48, 91,107, 65,220, 72,141,122,105,255, 0,175, 48, 53,229,215,194,
-174, 94, 22,172,243, 41,162,160,189,149, 49, 6, 0, 7, 81,184,233,166,219,215, 89,118, 55,237, 49,152,180,219, 64,115,142,149,
- 77,126, 58,232, 18,243,118, 92,152,226, 31, 96, 45,212, 43,235, 72,234, 90, 91, 89, 54,104, 40, 48,146, 77,141,237,239, 56,169,
- 59, 87, 55,167,244,189,105, 83,122,108,213, 71,216,228,209,123,169, 95, 89, 77, 75,238, 45,246,164,190,200, 35,106, 18, 16, 2,
- 25,105, 59, 57, 32,164,155,243, 96, 39, 70, 84,186,164,232,217, 74,124, 20, 61, 14,175,155,169,226, 66,150,226,146, 16,152,161,
-217, 42,189,148, 46, 10, 18,174,160,216,129,211, 17,220,209,154,145,153,117, 29,220,202,150, 27, 8, 76, 70,158, 67, 76,131,183,
-123,128,186, 82, 46, 77,252,110,171,240,197,139,116,118,119,110,161, 35,115,152,251,192, 30,164,130,103,122,162,237,211,159,211,
-192, 38, 71,243, 82,122,156, 42,125, 63,179,246,111,167,205, 66,158,118, 44,104,137, 69,136,179, 79,189, 37,178, 72,226,230,193,
-157,191, 50,113, 79,102, 12,208,196,157, 62,164,101, 70, 99,184, 36, 66,155, 41,215,156, 39,133,165,192,208, 64, 3,221,177, 95,
-142, 36, 25,219, 50,213, 77, 28,101,225, 45, 73,102,115,233,126, 99, 64,240,226,155, 10, 9,191,195,188, 86, 34,116,122, 84,186,
-246,104,141, 73,166,199, 47, 60,183, 0,105,161,230,171,216, 15,196,140,104, 50,214, 73, 82,204,235,152,120,105, 31,189,102,182,
-169, 64, 38,172, 13, 55,115, 35,102, 77,101,128,230,110,203,197,172,177, 75,136,244,202,140, 54,110,166,192,106, 58,212,218, 22,
-163,209, 43,120, 32, 19,251,198,195,203, 16,221, 67,203,121,183, 40, 85, 40,121,242,117, 78, 59, 44, 87, 99,187, 54, 34,144,201,
-105, 64, 55, 37,216,229, 43, 64, 31,235, 9,100,169, 92,117, 87, 60,226, 93,170,117,202,102,156,196,137,164,185, 53,230,100, 73,
-109,212, 75,204,115, 66, 2,132,167,211,202, 90, 55,224,182,147,250,167,139,117, 28,156,101,174,250,192,172,245, 38,126,162, 83,
- 41, 16,229,186,154,146, 37,170,162,252, 68,165,109, 72,148, 20,235,131, 98, 64, 77,208,226,214,144, 45, 97,100,245, 60,224, 45,
- 41,243,112,133,161, 61,197, 8,212,242, 27,111,177, 81, 62,100, 1,167, 73,180, 66,155,205,232, 58,209, 58, 60,184, 69,233,185,
-166,176,179, 4, 85,167, 7,218,132, 25,251, 68,181, 98,161,181, 23,225, 59,151,198,235,112,158, 47,140,179,246, 98,106,145, 82,
-164, 82,232,226, 19,130, 53, 21,133, 41,247,227,133,188,210, 92, 5,208,159, 29,211,209, 96,238, 74, 65,230,222, 92,215,185, 50,
-187, 34,175, 74, 75,245, 74,162,222,125, 15,175,114, 93,185, 82,175,206,237,223, 18,112,171,185,165, 85,106,187,213,105,253, 92,
- 67,108, 33, 41,242, 66, 16, 16,145,242, 74, 64,193,147,108, 11,178,174, 95,232,124, 40, 1, 2, 76,239, 93, 41,217, 57, 83, 21,
-168,153, 79, 61, 74,173, 73, 68, 39,115, 84,104,165,232, 12,165,183,210,164, 58,194,220, 45, 56,160, 17,185, 40, 90, 79, 39,195,
-185, 36,216, 28,116, 15,210, 49,153,242, 38, 83,172,229, 61, 47,201, 53,217,147,158,106,147,237, 53,215, 17, 9,168, 12,149,149,
- 20,180, 18,195, 7,186,184, 9,112,149,108, 10, 37,124,147,142,114,210, 93,111,141,160,185, 79, 76, 43, 25,114,140,220,250,133,
- 22, 77, 66,180,168,114, 29, 9,109,201, 82,150,150,152,222,161,200, 9, 75, 13, 40,250, 1,193,244, 9,168, 58,197,156,117,155,
- 81,167,234,110,126,125,151, 42, 19, 84,142,252,196,105, 72,101, 27, 80, 16, 18,128, 73, 33, 32, 36, 1,114, 79,169,185,198, 32,
- 55,111, 93,175,184, 3,112, 68,206,178, 20, 68, 1,208,128, 21, 62, 67, 94, 90, 44,190, 26, 96,182, 35, 83,239,229,206,186, 19,
-177, 46,168,228,253, 48,214,120,217,226,186,221, 70,116,200,177, 29,110,133, 72,165, 83,253,162,100,169,110, 39,101,154, 70,224,
-155,132, 41,126, 37, 16, 5,193,235, 96,123,203,252,160,246,140,205, 20,148,205,111,179,189, 42,145, 29,198,247,181, 35, 54,103,
-148,184,250,193,191, 37,184,209,221, 74, 15,168,220, 49,194, 61,140,117,166,147,166,117,106, 77, 31, 75,116,193,220,205,158,106,
- 46,247,245,249, 50,131,109, 70,165,211,139,136, 75,101, 82, 54,173, 76, 54,119, 93,100, 4,146, 84,139,220, 0, 15,123, 87, 43,
- 26,143, 91,130,152, 85,218, 93, 22, 59,203, 78,224,196, 74,148,132,184, 82, 5,207,118,151,227,163,188, 30,240,109,240,196,109,
- 45,108, 92,186, 46, 45, 61,225,160,145, 49,202, 82, 12,196,245, 0, 19,212,136,173,182, 18,128,192, 86,228,212, 10,169,168,185,
-222,148,234,191, 72,114,173, 33,139,220,173, 84, 90,178,157, 60, 95,146,151, 89,107,215,174,227,240,192,138,206,127,130,234, 4,
-169, 15,236, 4,146,224,191, 61, 58,126, 55, 56, 5,171, 49,231,192, 15,184, 29,113, 37,167, 54,144,179,115,126, 9, 23, 30, 92,
-142,158,184,160,245, 27, 58,214, 96, 76,118, 59, 50,150, 74, 18, 84,171, 31, 49,127,237, 54,199,109,108,219, 89, 52, 85, 1,224,
- 86,106,209,212,173, 99,161,198,105, 9,139, 48, 43,194,119,167,229, 97,138, 3, 81,243,144,170, 33,213, 48,187,144, 70,211,248,
-226, 9, 92,206, 85,202,213, 85,200,113,150,226,156, 64,253,163, 97,254, 63,183, 12,219,151, 87,157, 5, 78, 45, 10, 45,166,201,
-223,180,155,159, 32, 61, 73,254,204, 91, 29,147, 71,245, 80, 66, 2, 40, 69, 95, 80,234, 20,169,106,111,218, 20,139,240, 8, 56,
-217, 31, 88, 42, 69, 1, 66, 97,227,160,191,150, 33,185,230, 21,102,101, 90, 64,102, 3,129,136,227,253,105, 65,241,158,122,122,
-249,159,128,192,234,102, 95,171, 76,124, 33,166, 29, 72, 1, 67,144,121, 34,192,254,103,242,197,129,112,201, 76,200,169,131, 53,
-102,177,169,149,122,137, 12, 34, 66,213,117, 2, 0, 56,159,233,117, 23, 53,102, 71,219, 84,132,169, 45,149,125,229, 14,189, 49,
- 23,210,173, 58,102, 52,148,119,205,151, 93, 67,132, 41, 42, 79,161, 85,255, 0, 36,156,116, 46, 77,135, 10,155,220,165,164,165,
-180,160, 2,164,145,240,192,189,162,221, 70, 2,133, 50,180, 21, 57,211,202, 2,104,177,155,109,109, 18,174, 47,199,159, 31,223,
-139, 71, 46,206,106, 59, 65,183,159,178,147,233,239, 23,197, 96,198,104, 97, 91, 83,125,160, 39,168,255, 0, 31, 12, 57, 78,119,
-143, 14,110,239,110, 54, 4, 2, 71,195, 21,159, 68,138,170,164,149, 85,211, 76,156,236,199,172,204,176, 9,225, 36,158, 5,191,
-182,247,193,236,184,249,102, 98, 36, 75,124,132, 54, 55, 58, 80,174,128,117, 24,160, 99,234,211,161,194,203,115, 71, 43, 55, 80,
-234,155,159,249,226,235,209,156,221, 73,143, 67,149,152,164,237,152,236,118,194,219, 14,216,160,159, 50,175,112, 0,159,125,177,
-203, 99,151,167, 11,195,157,186,203, 57, 68,199, 83,200,122,212,153, 97, 78,172, 35,173, 82,250,153, 11, 62,230,204,217, 87,175,
- 67,162,127,163,170, 91,142, 33,178,130, 74,133,192,184,245,185, 41,183,207, 0,233, 57, 15, 55, 71,158,168, 74,203,253,227,215,
- 43,238, 66,109,111, 9, 5, 95, 30, 5,135,191, 29, 95,156,243, 46, 77,170,209, 34,214, 34, 48,132,166, 99,131,187, 98, 59, 34,
-238,182, 86,148,245, 61, 46,173,191,239, 12, 67, 37,186,186,212,167, 40,241, 86,150, 94,148,227,173,201,117,171, 36, 32, 41, 87,
- 41,221,229,202, 58,143, 47,142, 60, 45, 28, 69,121,124,246,141, 0, 73, 53,214,240,223, 5,191,142, 98,205,216,180,160, 10,206,
-164,236, 0,212,168,248, 1, 39,199,106,231,164,100,234,165, 98,170, 32,204, 74, 17, 33, 47, 56,222,255, 0, 48,144, 69,128, 61,
- 13,249,248, 97,166, 96,200,121,151, 41, 72, 93, 66,116, 87,223, 74, 90, 82, 27, 88, 28, 0, 72,233,240,176,197,238,205, 27, 43,
-105,251, 75,170,102,105,172,181, 30, 50,202, 26, 90, 0, 9, 60,241,183, 21,198,165,235,230, 80,206,181, 7,178,252, 22,131, 76,
- 8,238, 52, 86, 20, 60,107, 59,118, 43,229,226,252,113, 80,227,183,235,117, 72,111,148,242,210,190,176,195,255, 0, 8,255, 0,
- 13,172, 26, 67, 23, 22,203,184,152, 10,112,184,180,153, 38, 37, 41, 66,146,144, 57,193, 10,141,137, 53, 7,165, 79,159,153,148,
-191,209, 8,157,234,160, 50, 68,134, 0,241,161, 68,114, 84,158,189, 1, 56,127, 85,203, 89,133, 16,123,199, 32, 37, 46, 37, 10,
- 75, 97,193,255, 0, 72, 84, 55, 19,238, 31,192,226, 37, 59, 50, 84, 52, 3, 82,105, 57,246,154,180,184,220,225,221, 84,163,111,
-184,121,130, 44,171,143,218, 73, 59,129,245, 22,232, 78, 44,109, 67,212,232,121,131, 37, 58,253, 18,114, 27,113,218,130, 90, 75,
-143, 34,203,105,183, 2,128, 62,235, 37, 93,125, 2, 61, 49,189,135,226, 15, 93, 20,148,160, 65,231,208,243,175,158,191, 23,191,
- 11,237,120, 27, 25, 72,181,112,170,217,224, 84,217, 87,234, 17, 18,149, 68, 2, 83, 32,200, 0, 16, 70,147, 53, 16,145,146,115,
-181,162,185, 41,151,216,106, 52,128,158,237, 6,228,168,168,142,236,143, 49,207, 32,250,131,230, 48, 27, 42,228,233, 75, 91,242,
-163,208,164,160, 62,243,178, 31, 64,112,144, 23,117,133,109, 29, 0, 27, 79, 78,182,191, 36,226,207,174,235,141, 69,156,185, 53,
- 17, 91,140,135,251,176,168,199,194, 72, 46,161, 41, 74,191,239, 11,110,249, 98, 33,156, 53,239, 44, 83,218, 98,143, 8,182,243,
-106,166,149,186,226, 58,149, 23, 20,213,174, 57,242,249,238,198,203, 87,151,197,176,146,141, 9,228,121,111,245,211,198,107,195,
-213,100,137,133, 47, 74, 5, 77,126, 84, 24,207, 84, 39, 36, 53,221, 60, 90, 45,164, 19,185, 92,168, 1,238,228, 3,130,232,204,
-168,144, 91, 49,161,173,106, 66,129, 95, 22, 3,207,230,122,124,240, 10,179,172,212, 10,117,105,216, 12,229,182,196, 24,234, 12,
- 52, 57, 33, 68, 4,128, 57,228,159, 9, 23,249,226,111,151,181, 31, 78,170,240, 36,154,132, 17,222, 71, 67, 8, 72, 77,142,221,
-234, 72, 4,250,147,185, 3,220, 78, 29,215, 10, 0, 89, 65, 32,213, 85,218,119,136, 74,170, 37, 92, 91, 21,170, 74,160, 72, 11,
- 74,223,127,107,174, 54,139,169, 9, 32, 30, 46, 60,172, 77,253,254,236,104,167,228, 42,188,168, 44,205,167,182,242, 7,117,100,
- 41,105, 60,164, 27,124,189,126,126,252, 88, 84, 58,206,152,176,244,174,252, 38, 80, 18,208,219,206,133,219,135, 27, 32, 44, 17,
-200, 3,197,111,150, 35,117, 29, 78,204,244, 12,186,197, 66,155, 73,117,234, 66,231,123, 60,106,171,173, 0,217, 54, 32,182,181,
- 3,109,195,106,125,198,215,193,154,117,215, 88, 61,150,138, 7,101,115, 7,167,136,137, 32,198,154,209, 81, 97,156, 25, 59,107,
-165, 71, 14, 77,212, 74,122,166,165,186,251, 45,168, 74,113,127,104,146,162,120,224, 88,249,139,254,120, 13, 95,200, 57,177,147,
- 2, 28,172,216,103, 71, 83,233, 21,118,165, 68, 74,130,153, 36,149, 41, 36, 88,163,132,148,249,223,118, 38, 72,214,106, 43,148,
-185,179, 43,113, 80, 36,247,203, 41, 82,133,247,186,110,165,255, 0,186,157,168, 30,251,227, 26,174,176,229, 72,178, 95, 93,102,
-150,158,239,184,111,188,142,143,190,178, 65, 82, 83,238, 28, 31,199, 18, 77,205,226, 85,250, 62, 3,239,157, 12,218,229, 61,218,
-200,196,203, 85,120, 43, 84,138, 91, 37,150, 18, 21,220,119, 67,105,184, 40,181,189, 57, 63,142, 8, 59, 7, 38,198, 49,218, 48,
- 81,223,247,101, 74, 74, 60, 55, 74, 83,207, 79,133,190, 88,139, 86, 51,197, 13,230, 91,101,151, 11, 47, 8,174, 56,243, 0, 89,
- 45,130,171, 36,155,123,202, 85,243,196, 94,165, 87,175,205,205,105,109, 51,192, 83, 41, 82, 73, 2,192,223,119,228, 10,186,122,
- 39, 5, 98,209,247,213, 18, 69, 36,219,105,173, 76, 28,160,229,214, 42,107, 45, 54,241,117, 13, 37,229,164, 46,200,222, 84, 82,
- 5,255, 0,162,113,185,113,159,168, 69,113, 85, 42, 42, 89,238,101, 45, 17,214,100,133, 7,146, 15,133, 96,117, 77,211,110, 15,
-166, 43,218, 45,107, 52, 41,247, 95,144,222,246,213, 61, 8, 91,169, 38,229,180,240,144, 9,253,165, 46,223, 60, 75,227,102,232,
- 16, 80,135,107,140,144, 94,121, 68, 54,149,130, 90, 27, 60, 55,183, 79, 13,143,198,248,182,253,147,237,142,186, 83, 46,222, 14,
-148, 93,132, 83, 32, 70,113,151,104,209,200, 12, 21, 92, 0, 65, 0, 94,231,221,207,231,140,183, 81, 36, 45,114,187,150, 4,126,
-232, 20,134,155, 2,235,221,229,242, 3,240,196, 46,161,158,211, 26,168,188,185, 77, 14, 75, 46, 50,133, 60,251,220, 2,149, 40,
- 57,180,123,133,147,242,190, 27, 85,245, 29, 84,135,150,234,160,182,134, 88,112, 20,178,216,232,130,162, 19,248,139,159,233, 98,
-177,182,114, 96,157, 77, 68, 91,235,169,169,236, 37,101,135, 64,109,135,119, 2, 20, 20,218, 83,193, 89, 89, 10,191,194,223,150,
- 31,201, 92, 10,228, 38,152,100, 23, 9, 9, 67,206,146, 80, 91, 4, 17,100,145,231,124, 84, 49,117, 14,170,196, 88,237, 69,130,
- 18,227,234,154,164,133,114,123,209,114, 7,226,164,225,244,141, 71,157, 78,150,195, 78, 72, 82, 17,109,165, 8, 7,198,160, 44,
-165,126, 0,255, 0,189,137,174,201,212, 57,221, 62, 83, 69,236,144, 14,149,102,202,128,219, 47,186,204, 55,209,189,214,144, 19,
-127,190,131,200, 60,244,244,252, 48, 38,100, 89, 47, 84, 99, 54, 34, 37,181,169, 74,238,220,109,177,181, 64, 14,119, 31, 46, 45,
-107,226, 28,238,168,199,106,182,152,149,150,139, 11,117,180,186,129,123,146,109,109,222,224, 44, 72, 30,103, 27, 39,103,168, 14,
- 67,102,111,183,109,109, 78,169,149, 33, 43,182,203, 35,133,123,199, 76, 69, 54,175,160,130,126,244,168,251, 62, 99, 20,118, 46,
- 94,204, 12,230, 41,149,214,106,200, 98, 58,155, 5, 81, 75, 71,119,120, 7, 43,184, 54,177, 22, 22,242, 34,248,144, 53, 75,204,
-111, 56,195,194,162,210,155, 40, 42,229,203,115,107, 1,239,253,111,195, 19,206,206,180, 60,145, 42, 45, 87, 93,181, 74,183, 78,
-141,147,232, 15, 45,134,189,177, 75, 40,149, 40, 67, 47, 41, 43, 8, 33, 69, 8, 7,121, 72,241, 58, 82,150,210, 60, 74, 41,163,
-181, 71,180,119,233,125,125,233, 57,127, 45, 68,161, 83, 90, 10, 84, 72,209,225, 54,219,174, 54,171,132,149,237, 27, 82,121,190,
-212,223,109,254,242,173,124,106, 43, 13,125,251, 65,114,233, 8,210, 6,154,170, 7, 32, 58,115, 36,255, 0, 39, 85,142, 86,194,
-214,119,218,139,213, 33,234, 53, 34,182,136,145, 33, 48,227, 79, 92,203,146,137, 41, 6, 55,136, 41,190, 58,168, 42,202, 73,183,
- 35, 5,169,232, 52,182, 90,106,173, 87, 5,199, 83,246, 73, 74, 71,221, 29, 62, 86,190, 41,202,174,171,230,105,117, 87,123,185,
- 74, 42, 47, 39,106, 65,225, 91, 91,221,127,158,227,134, 34,191,155,100, 65,138,235, 50,214,236,135,214,243, 0,172,159, 3,118,
- 77,205,189, 54,223,159,222,248, 98,162,172,212,251,105, 7, 42, 99,120,231,231, 85,212,210, 8, 31,115, 87,235,178,242,244,218,
-156,105, 74,156,130,236,150,138,152,191, 82, 5,148, 79,167,153, 24,241,179, 71,168,193, 98, 53, 74, 99,125,193, 54, 67,173,158,
- 7,136,143,239,199, 46,126,153,103, 89,254,201, 61,181, 62,133,182,242,217,142,234,250, 43,112,252,184, 23,249,224,136,212, 28,
-228,186, 97,104, 23, 64,136,175, 24, 74,184,220, 54,128, 79,227,248,168,225,215,131, 28,163, 43,148,197,132, 3, 21,210, 45,190,
-221, 5,213,198,165, 50,218,208, 19,246, 69,107,186,184, 54, 39,225,111,227,141,134,173, 75, 33,151,235, 42,140,100, 54,194, 11,
-202,109, 2,201, 42, 30,126,224, 79, 31, 28,115,132, 61, 83,204,177,225,173,249, 82, 94,239, 2, 16,148, 92,241,101, 36, 95,240,
-177,190, 53, 74,213,138,173, 98, 90,131, 82, 10, 27, 61, 86, 15, 43, 9,177, 10,248,146, 63, 60, 65, 24, 74,231,245,111,206,144,
-103, 46,213,211,148,205, 85,166, 81, 97,129, 80, 83, 47, 23,142,228, 45, 12, 37, 92, 88,122,254, 63, 60, 44,114,241,213,108,207,
- 8,132,209, 30,121,166,212,144,118,223,139,121, 17,111,158, 22, 8, 48,134, 0,213, 19,227, 36,124, 34,140,150,210, 19,168,248,
-213, 70,254, 92, 51, 51, 42,159, 39,184, 99,122, 84, 10,120, 9,108, 89, 95,194,195,231,141,243,227, 42,155, 49,167,212,146,225,
-144,224, 17,227, 35,245,136, 22, 3,241,231,228, 49, 61,206, 57,105,138, 91,162,134,195, 91,165, 57, 17,164,132,143, 46, 19,199,
-248,244,192, 4,209,165, 69,110, 67,238, 54,127,208, 88,121, 73,144, 69,252, 74, 59, 82, 6, 58,100, 63,157, 2,106, 9,116,144,
- 42, 41, 75,159, 42,135, 84, 76,242,248, 87,177, 57,116,237, 61, 87,205,173,240,254,236, 73, 93,173, 68,170,229,242,185,201,184,
- 50,131,187, 79,253, 42,202,122, 31,112, 38,231, 17,153, 52, 41, 76,119, 78, 54,217, 8,238,183,171,119,175,151,246, 97,229, 76,
- 90, 44, 90,123, 75, 41, 33, 41, 94,193,212,142,164,252,240,234, 66, 93, 0,154,176, 14,162,161, 58,189, 22, 60,202,219, 50,225,
- 60, 92,117, 51,139, 75,109, 63,116,160, 16, 47,199,173,215,141,180, 74, 82,198, 99, 57,142, 76,175, 8,134,131,180,255, 0,218,
-247,123, 8,252,119, 31,158, 55,188,195,149, 10,139,146, 84,208, 1, 14, 30,237, 32,121,245,255, 0, 7, 14, 90,163, 73,246,182,
- 27,152,174,236, 41, 61,227,151, 28, 11,243, 96, 60,205,191,142, 47,165,216, 64, 79, 56,138, 58,213, 40,203, 60,169,206, 95,170,
- 85,168,115, 23,152,169,138, 87,120,202,159, 68, 70,201,251,206,184,218,144, 21,111,112, 54,254,145,195,100, 58, 96,190,204, 1,
-101,123, 28, 68, 53,222,249,168,164,109, 79,225,206, 36, 45,138,117, 21,110,203,158,180,146, 5,152, 96, 17,116,142,164,251,143,
- 78,112, 36, 70, 98,162,226,100,163,106, 92,144,176, 44, 56, 75, 72,189,255, 0,191, 14,130, 12,170, 42,186,179, 41, 32,114, 21,
- 31,174,166, 49,117,202,157, 81,226,152,241, 90, 1, 65, 63,121, 68,220,237, 30,243,198, 37,172,126,128,101,125, 49,131,172, 84,
- 32,227, 83,230, 83,220,111,184, 43, 27, 90, 88, 86,194, 83,197,239,194,185, 36,245,196, 98,185, 78,135, 94, 92,192,209, 34, 11,
- 74,225, 87,229,195,211,143,125,135,200, 12, 36,149,213,169,176,114,244,136,140, 42,156,210,202,253,157,192,118,161,180,130,108,
- 44, 69,186, 15,153,195, 56,144,178,148,131,177,215,196, 70,212,253,158,100, 1,247, 21, 21,148,244,211, 6, 61, 73,150, 92,114,
-173, 57,231, 36, 57, 37, 5, 68,180,133, 13,160, 40,244, 2,219,143,190,227,211, 25,178,197, 62,108,149,229,193, 61,105,132, 30,
- 10,113, 38,234, 43, 32, 14, 72, 29, 73, 32,241,239,196,134,177,245,132,218, 33,162,211, 84, 99,178,167, 65, 82, 27, 81,176,184,
- 38,220,243,134, 20,236,169, 74,162,180, 39,205, 84,175, 11,106, 94,230,221, 9,220,161,110, 56, 23,197,164,173, 4, 79,165, 27,
- 62,154, 81,214, 50,220,104, 49,149, 22,146,220,223,182,108,108, 67,173,180,202, 45,234, 1, 80,185,231, 2, 42,122, 99,152,159,
-238,221,166,186,167, 11, 87, 46, 54,166,129,185,247, 22,212,161,135, 44,167,187,166, 34,175, 29,151,162,182,165,169, 59, 81, 48,
- 5,170,194,254, 35,110, 48,242,153, 22,177, 82,154, 19, 37,229,165,148, 55,222,184, 68,162,162,160, 18, 8, 73,241, 27,220,144,
- 62,120,100,118,131, 92,194,130, 20, 65,208,214,252,209,154,107, 89,130, 52,104, 53, 56,202,134,212, 6,154,137, 76,136,148,109,
-238,216,108, 29,191, 18, 86,165,172,147,212,168,249, 90,217, 66,169,205,137, 25,170,101, 47,190,126, 76,133,134,216,105, 36,169,
- 78, 45, 92, 90,222,100,156, 12,143, 29,191, 13, 61,110, 93,198,148, 67, 43, 39,239, 40,155,148,254, 7,140, 75,116,238,148,170,
- 53,124,102,233, 21, 36,199, 16, 13,155,120, 50, 22, 82,178,147,114,144,174, 55, 15, 83,211,142, 49, 93,226,219, 13, 24, 30, 67,
-169,229, 69, 66,165, 98,118,174,245,236,117,149,169,221,155,180,176, 81, 41,210, 10,235,121,154,130,185,213,218,212, 20,148,206,
- 97,215, 88, 87,114,219, 74, 82, 84, 20, 27, 94,221,188, 88, 44,147,101, 95,142,160,200,249,203, 35,232,230, 66,163,118,124,143,
-170,143,102,186,141, 49, 5,134,166, 85,100, 50, 37, 60, 84,226,138, 46, 10,130, 90, 72, 10,216,144, 72, 1, 41, 72, 28, 12,124,
-222,201,218,233,157,179, 28,199,105, 52,125, 64,159, 10, 35,141, 55, 16, 73,246,102,146,248,101,180,237,178, 84,218, 80, 82,155,
- 91,129,201,183,222, 28,131, 42,203,250,215, 59, 38,211,218,133, 73,154,134, 31,113,162,228,183, 1,176, 47, 27,218,254,167,144,
- 77,252,241,192, 11,124, 78,209,245,184, 85,222, 89,149, 70,255, 0, 17, 2, 54, 2, 14,194,183,145,136, 21,181,217, 36,194,126,
- 63,126,181,209, 26,203,157,153,122,168,184,210,223,120,133,247,207, 6,236,139, 5, 11, 38,215, 6,196,120,111,127,222, 7, 20,
-124,247,161,102, 7, 34, 8,110, 23, 29,152,208, 74,210,164,249,133, 35,143,153, 39,240,198,216,249,223, 45,213,226,194,109,169,
-233,106,161, 33, 5,180,169, 10,220,219, 77,141,160,146,217,240,254,169,233,111,158, 0,138,165, 6,181, 85,110, 44, 50,219, 18,
- 99,177, 47,187,117,181,157,151, 33, 68,172,130,127, 85, 75,227,158,182,227, 23,173,113, 59,244, 5, 37, 68,147,174,227,198,102,
-169, 92, 92,169,190,244,233, 81,243, 74,166, 82,243, 67,212, 22, 92,107,189, 59, 66,158, 6,214, 74, 71, 36,124, 72, 82,254, 22,
-197,129, 79,203,116,124,189, 25, 20,216,148, 16,239,179,132,186, 17,193, 41,113,196,132,166,231,160, 60,216,126,246,239,217,192,
-230,114,190, 82,115, 57,211,204,233,109,247,158,210,227,114,156,176, 37, 76, 50, 71,120,178,125, 84, 5,133,252,175,137, 27, 90,
-145,167,236,212,170, 53,216, 42, 76,151,225, 84, 82,252,183, 46,118,184,240, 10,238,155,235,109,169,222, 85,183,223,138, 87,216,
-133,229,192,202,153, 51,191,172,127, 3,198,136,130,149,166, 84,119,173, 39, 78,227, 76,170, 71,203,112, 50,235,106,218, 84,185,
- 14,132,130, 20,249, 82, 66,208, 61, 18,128, 66, 69,255, 0, 90,254,163, 27,243,206,144,195,202,208,234,134,149, 77,109,231, 98,
- 41,133,161,108,177,113,177,231, 60, 71,228, 20, 45,115,228,113, 50,139,172, 25, 75, 35,101, 57,176,217,161,172, 58,167,154, 75,
- 18,228, 52, 66,150, 8, 42, 90,238,122,146,178,163,243, 24,205, 61,162,169,143,208,234,181,103, 59,151, 36, 78,149,187,184, 9,
- 73,229, 41, 37, 41, 30,224,181,143,247,113,138,155,236, 89, 46,130, 18,114,207, 93,246,250, 77, 89, 67,118,170, 76,102,214,171,
-156,203,148,170,153, 87, 81, 98, 81,164,211, 84,220,121, 46,148, 54,226, 27, 60,148,130,175, 46,187,129, 81, 30,226, 61,112, 62,
-114,179,140, 73,143, 70,126, 35,232,110, 60,132, 54,225, 3,145,188, 41, 41,255, 0,196,221,191,165,239,197,223, 63, 82,224,230,
-138, 13, 47, 49,162,148,202,137,142,164, 2, 64, 42, 37, 44, 41,160,125,215, 90, 27, 62,237,195, 12,243, 60,150,106,105,250,205,
-216,237, 33,137, 85, 70,212,250,199, 42, 81,100,160,252,109,117,168, 15, 80,156, 94,180,199, 47, 89, 41,204,152, 59,111,208,254,
-213, 5,178,222, 98, 80,175,191,247, 85,210, 41, 89,185,197,187, 78,167, 77,121, 78,179, 37,109, 20, 58, 45,125,138, 41,189,207,
-192,226, 83,148, 52,103, 59, 85, 18,219,245,234,170, 98,161,107, 8, 30, 27,149, 19, 99,235,233,231,141, 26,157,152,225,170,163,
- 76,127, 46,186,159,105,143, 62,243,130, 71, 11,186, 80,174,158,119, 82,148,171,123,177, 56,163, 78,168,206,204,181, 72, 15, 84,
-210,170,117, 52,141,242,146,177,181, 14,166,192,216,251,128, 80,248,131,142,145,174, 53,184, 69,146, 10,219,212,143,145, 0,252,
-233,139,106,146, 1,162,244, 77, 13,200,244,165,183, 14,167,152,148,185, 15,188,166,201, 60, 36, 40, 27, 91,241,190, 38,142,105,
-231,249, 63,210, 90,143,212,217,157,167,145, 54,100,116,182,176,176, 74, 55, 33,194, 83,240, 41, 4,255, 0, 68,226,156,206,217,
-186, 50,114,109, 82,125, 42,114,150, 96, 77,105,194,250, 85,202,212,226,150,155, 3,240,183,225,239,198,138, 69, 94,174,184, 77,
-229, 73,117,249, 14, 49, 36, 54,200,108,146,162,133,219,104, 32,115,115,177, 0, 95,203,113,243,189,243,239,177,245,226, 86, 11,
-105,228,192, 84,143, 64, 15,212, 82,111, 58, 86, 12,213,217,149, 37, 84, 50,245, 2,153, 14,185, 81,101,111,191, 23,106, 29, 89,
- 4,178, 18,171, 41, 64, 92,219,198,180,155,124, 79,166, 42,253, 96,205,199, 42,231, 8, 52,138, 85,119,191, 67,116,244, 9, 18,
- 91,118,253,226,238, 65, 82,189, 14,208,158, 61, 45,136,163,185,115, 48,215,106, 68,174,185, 40,164, 84, 80,194, 73,145,225, 75,
- 6,206,108,227,204,159, 17,183, 68,132,223,166, 7,106,206,151,214, 93,203, 47, 78,160,214, 59,186,140, 39,254,206, 42,159,191,
-181,238, 81,220,155,116, 4, 36,169, 87, 54, 3, 98, 71, 0,227,207, 21,133, 32, 40,229,112,102, 87,132, 13, 77,123, 95,225, 15,
- 23, 97,124, 43,198, 12,222,226, 41,254,201, 74,208,163,188,102, 76, 3,238, 84, 79,132,212,190,187,153,106,186,139,166,179, 50,
-188, 41,229, 79, 54,209,117,158,243,146, 77,186, 98,133,209, 93, 46,206,203,204,117, 7,179,196,206,230, 68, 48,180,195,102,122,
-202, 88, 40, 80,182,235, 0, 20, 85,114, 72,186,128, 6,198,199,166, 29,208,234, 90,153,148,139, 53,226,241, 66, 2, 79,129,181,
-238, 4,247,202, 71, 3,206,192, 3,240, 80,245,195,172,205,172,121,255, 0, 48,100,116,215,169,212, 38,228, 74,145, 12,182,171,
- 38,196,148,239, 74,172, 71,235, 13,183,183,191, 15,103,133, 98, 86, 97,196, 51,148,133,115, 49, 32,251,244,175,117,198,255, 0,
- 17,120, 43, 16,188, 67,133,200, 0,157,137, 19,239, 26,250,117,170,239, 86, 53, 60,162,190,198, 71,145, 81, 76,153,109, 40,182,
-149,247,155,137, 5, 64, 1,124, 93, 57,174, 93, 26,183, 1, 84,168,210,251,159,107, 5,231,212,218,249, 66, 6,221,160, 15, 46,
- 20, 0,247, 92,121, 99,141,169, 26, 97,169, 47,234, 76,236,233,153,225, 56,219, 12, 48, 95, 73, 32,242,171, 14,158,225,126,191,
- 12, 78,169,181,188,242,136,178,101,123, 67,214,117,180,176,183, 86, 73, 40, 72, 95, 32,122,115,197,252,194, 72,199,107,111,128,
- 6, 91, 78, 69,137,210,122, 73,175,159, 63, 23,248,222,207,137,125,146,221,133, 72,103, 57,235,250,242, 0, 9,235, 8,159,120,
-174,132,168,228,198,212,195, 81,233,217,152,174, 76,183, 26,142,150,186,128,146,158,188,245, 0, 15,157,149,233,141, 67, 65, 38,
- 83,169,145,171,149, 9, 66, 64,104, 42, 51, 77,129,247,202, 20,181,172,159, 91, 93, 0, 30,151, 7,211, 16,109, 61,204,153,174,
-136,202,235,146,102,184,164,176,242,228, 57, 34, 74,188,100, 4,216,171,241,186,108, 62, 31, 25, 60,206,210, 15,101,218, 43, 19,
-221,109, 10, 98, 43, 18, 11,111, 61,254,169,180,166,224, 40,143, 51,183,120, 3,206,254,252, 64,217,223, 45,224,211, 7, 54,186,
-199,145,210,188, 17,201,229, 67,179,164,188,149,144,179, 61, 39, 38, 84,170, 42, 92,153,117, 14,237,229, 72,176, 46, 74,186,108,
-129,205,138,110,173,160,220, 88,155, 91,207, 26,151, 57,121, 86, 51,207,197,120,173,201,200, 88,105,174,133,107, 77,172,109,251,
-189,217, 87, 62, 73, 30,184,131, 49, 94,149,170,177,165,192,155, 65,135, 57, 82,231,165,109,212,165,198, 74,221, 97,123,202, 79,
-118,162, 46,144,119,157,214,235,108,108,207,180, 60,247, 62,107,213, 72,144,196, 97, 6, 19,107, 90, 11,132,165, 22, 64,104,219,
-204, 3,193,183,150,226, 60,177,180,253,173,163,140,180, 51, 4,187,254, 66, 33, 58, 8, 17,169,215, 78,241,145, 57,132, 1, 4,
-213,171,147,100,182, 91, 40, 78, 85, 0, 2,186, 19,212,122, 9,243,169, 45, 31, 57, 63, 77,140,213, 13,198,130,153,105,149, 72,
-168,204, 7,149,184,120, 41, 30,160, 38,232, 30,251,159, 46,125,202,253,174,234,206, 34, 70,137, 39, 32, 72,172,211,235, 53, 63,
-106,129, 29,173,200,109, 50,172,190,170, 3,238,221, 86,224,245, 2,248,175,148,140,194,213, 38, 16,159, 77, 46,182,200, 91, 79,
-148, 19,101, 33, 69, 74,183, 30,151, 4,252,109,235,135,113,245, 43, 52,233,132,228,231, 24,153,101, 5,244,193, 68,122,115,129,
- 60, 71, 73, 64, 82,136,226,215, 35,119,251,222,252, 26,213,139,118, 46,130,187,164,153,212,236, 52,141,181,158,158, 85, 89,133,
-161, 46,201, 26,108,124, 69, 74,106,181, 42,188, 70, 96, 51, 95,165,174, 44,199,220,121,199,210,225, 22, 74,110,181, 40,220,112,
-120, 85,191,162, 48,247, 44,212,104,181, 24,159,164, 25,141,101, 75,147, 36,146,223, 82, 27, 64,228,252,128, 35, 0, 51,134,169,
-207,204,249, 34,155, 87,159, 74, 10,147, 37, 0,112,155, 27,157,201, 36,123,143,231,183, 2,242,157, 66,180,183, 13,122,170,148,
- 54,201,151,236, 41,141,110, 1,222,157,195,240, 82,142, 1,119,134,134,140,149, 13, 96,233,226, 38, 7,150,158,148,238,165,181,
- 18, 18, 52,171,170,100, 12,141, 27, 78,227,230, 22, 42, 32, 84,103, 76,116,200, 74,133,194, 24, 8,105, 40, 73,254,144, 89,249,
-140, 72, 32,197,200, 51,147, 20,195,121, 46,200,153,254,138,200, 9,190,237,204, 29,202,248,135, 20,164,255, 0,233,138,146,148,
-198, 96,206, 52,183, 27,105,135, 20,147, 18, 55,179, 33,134,138,138,212,227,224,172, 0, 60,249,199,103,253, 30,253,159,180, 86,
-145,170,249,107, 54,246,132,170,165, 66,158, 67,180,188,186, 80, 86,150,150, 86,218,125,174, 93,129,186, 82, 87,116,179, 99,117,
- 15, 23, 23, 7, 83,135,248,122,231, 19,184, 13, 52, 73, 50,125,195,127,127, 64, 55,171,216,118, 18,246, 36,248,105,160, 73, 63,
-181, 49,200,255, 0, 71,190,177,103, 28,139, 23, 61,229, 61, 54,146,253, 29,198, 76,191,172, 29,150,196,118,212, 82,165, 36,216,
-190,226, 55, 36, 88,157,201, 4,112, 57,190, 42,236,227,167,185, 88, 83, 37,202,164,148,188,138,115, 95,233,251, 20, 8, 4,180,
-132, 1,127, 59, 2,190,125, 65,199,211,222,221, 61,180,116, 55, 34,105,107,255, 0, 84, 33,234,149, 68,199, 82,114,141, 29,149,
-150, 29,121,196,110, 6,107,220,110,110, 58,118,148, 33, 36,110, 89, 4, 36, 1,202,126,109,235,119,106,188,147,172,217, 40, 83,
- 63,201, 59,244, 60,246,236,182, 69, 86,175, 76,168, 54, 97,212, 89, 9,222,224,113,162,216, 94,253,224, 89, 69,107, 85,183, 2,
-162, 44, 7, 75,138,240,214, 23,103,109,144, 93, 17,112,157, 84,149,136, 16,117,208,129,162,163,145,247,154,183,136,224,236, 88,
-128,217, 89, 14, 1, 36, 30, 94, 7,161,240,247, 85, 51, 94,165,185, 42, 37, 69,200, 45, 1, 33,166,208,183, 10, 7,250,164,148,
- 20,219,243, 72,249, 99,211,147,105,178, 33,198,146,167,138,158, 73,239, 30, 82,211,112,226, 89,181,211,243, 11,255, 0,195,143,
- 25,147, 81,131, 42,163, 25,168,133, 70,125, 45, 5, 97, 74,229, 93,218, 11,128,254, 73, 36, 96,132,250,140,186, 88,132,133, 52,
- 18,151,105,109,186,217, 41,191,218, 45, 23, 55,249, 90,254,244,156,121,165,218,221, 66,210,218,117,212,252,135,212, 86, 1, 16,
- 52,167,206,101,204,165, 77,168, 83,106, 40, 40, 82,221,151, 25,148, 71, 35,162,220, 74, 59,196,252,141,193, 62,182,192,202,165,
- 22,151, 86,206,180,170, 28, 18,193,121,214, 24, 10, 88, 55, 74,110,132, 21, 47,221,250,199,231,136,130,107, 21,108,209, 85,145,
- 91,128,218,210,219, 10,115,217, 16, 79, 63, 31,193, 36,147,251,184,219,148, 96,213, 98, 74, 85,101,240,225, 29,225,100,150,207,
- 54, 33,106, 9, 7,203,144,127, 12, 9, 12, 56, 27, 9, 90,251,209, 77,217,166,164,233,211,188,189,153, 53,101,200,213,202,136,
-110,156,149,108,239,208,145,114, 17,112,216,255, 0,186,167, 74, 83,127,253, 48, 10,118, 79,165,196,114, 93, 50, 99,128,200,156,
-164, 52,193,191,129,176,149,163,122,189,110, 66, 65,249,156, 17,114, 4,117,102, 71,145,152,158,117, 49,220, 79,219, 58,149, 16,
-148,236,113,106, 88,248,110, 73,249,243,131, 51,226,100,217, 52,198, 43, 43,154, 84,229, 78, 43,123, 18,226,249,102, 66, 86,158,
- 15,160, 80, 23, 7,223,137,165,197, 38, 6, 99,174,159,127,124,170, 66, 19, 17, 83,236,197,169,157,149,145,217,162, 95,101,109,
- 56,206,242,243, 37, 94,163, 49, 51,235,143,192,165, 20, 70,132,243,109,182,148,110,121,221,138, 37, 43, 74,130, 0, 4,157,170,
- 81, 0, 46,194,157,202, 52,116, 77,170,203, 99, 81,163, 50,227,244, 10, 27,178,212,204, 67,184, 79, 8, 72, 75,101, 38,195,194,
- 72, 72, 85,192,218, 47,215,139,172,135,146,169,249, 18,147, 72,124,161,134,165, 77, 10, 53, 48,183, 18, 1,113,197, 45, 32,149,
- 19,111, 9, 77,191,162, 49, 62,200,154, 31, 92,168,213,233,249,240, 86, 33, 57, 17,208,228, 69,247, 46,135, 16,166, 86,210,219,
- 91,107, 34,246,225, 65, 68, 11,144, 82,147,198, 52,241,172, 78,217,107,236, 26, 48,211,114, 18,175,242, 49,190,191,249, 70,157,
- 60,232,238,188, 28, 80,145,160, 21, 82,183,151, 17, 15, 45, 72,173, 87, 2, 68,247, 26,113, 77,182,148,248, 91,220,162,216, 39,
-254,234, 66,172, 61, 72, 62, 88,144,230,122, 76,136, 89,109, 13, 72,121, 78, 73, 20,205,137, 73,109, 33,105,222,157,247, 42,182,
-226, 54,173, 9,219,123, 11, 11,121,225,236,220,181, 77,171, 85,230, 50,211,128, 83, 92,150,232, 66, 90, 42, 87,217, 32,172,139,
- 21,114,111,116,168,223,203,227,108, 44,192,227,117,140,214,234,234, 47, 36, 33,197, 8,251, 80,174, 55,130,148,148,223,220, 64,
-252, 71,174, 50,205,219,133,112,147,182,167,239,238, 42, 9, 82,144,131,227,254,254,117, 27,107, 43,199,111, 37,196, 92,199,144,
- 22,195,131,194, 7, 59,213,201, 87,251,187, 71,204,225,157, 14,137, 8,164, 66,152,202, 46, 1, 87,116,163,194,236, 21,201,245,
-231,105,196,221,116,186, 75, 84, 95,172,170, 14,132,165,194,180,134,239, 97,100,108,177, 30,242, 71,224,112, 29,138, 13, 34,169,
- 91,102,123, 50,194, 75, 14, 44,170,203,253, 80,129,193,249,220,219,214,216,113,116, 84,146,100,193,154, 4, 2,117,168,238,114,
-201, 50, 2,164, 48,149,160,161,134, 75,105, 75, 64,112,128, 9,113, 67,230, 21,207,191, 3,232,249, 14, 44,154, 51, 19, 92,103,
-104,125,167, 17, 30,201,251,173, 36, 47,197,248,220,124, 70, 44, 42, 99,116,215,145, 50,178,163,181,175,108, 91, 45,130,110, 10,
-119, 0,161,239, 4,113,243,193, 56,212, 90, 51, 25,109,140,202,220,132,180,218,170,166, 3, 45, 56,175, 10, 27,229,213,159,251,
-163,114, 65,194,246,213,160,132,245,164, 1, 34, 5, 86,201,201, 76, 0, 27,110, 42,188, 40, 77,212,148, 95,157,160,237,249, 2,
- 63, 28, 44, 88, 84,220,215, 79,162,211,251,152,208,218,117, 14,202,121,196, 23, 83,117,109, 42,240,222,223,187,180,124,176,177,
- 33,114,255, 0, 88,168,129,227, 84, 25,126,185, 94,204,137,206,111, 33, 93,195,142,123, 60,116,129,200,176,219,131, 58,153, 46,
-159, 10,108, 28,137, 21,180,161, 13, 52, 94,169, 59,183,149, 44,139,128,126, 29, 62,120, 47,149, 80,143,209,202, 50,118, 11,125,
-106, 77,173,241,196,127, 60, 37, 42,204, 82,157, 82, 65, 81,142, 46,162, 57, 60,227,109,167,115,184, 76,108, 72,248,208,180, 43,
-138,141,201,128,245,110, 19,145, 91,143,101, 41,105,241,129,194, 0,185, 36,252, 6, 24,154, 18,165,119,245,183,209,100,165, 27,
- 80,146, 60,173, 96, 7,229,137,173, 29, 8, 25, 65,106, 8, 0,149, 44, 19,110,190, 36,224, 69, 88, 4,193,142,132,139, 36,173,
-119, 3,166, 14, 29, 80, 70,156,207,214, 40,169, 86,177, 81, 12,187,151,144,244,245,169,246,128, 66,146,181, 1,111,196,254, 28,
- 99,202, 85, 44,230, 92,212,137, 50, 29,238,216,122,110,196,168,244, 67, 98,247, 63,128,196,142,130, 7,214,149, 17,111,187, 78,
- 86,223,119,135, 2,160, 37, 41, 97,205,160, 11, 48,233, 22,242,225, 56, 41,112,151, 39,192,124,106, 68,146, 60,234, 45,152,226,
-181,153, 42,179, 30,132, 10, 25, 47, 40,177,239, 70,235,127, 1,130, 95, 82, 67, 49,217,164,197, 66,146,218, 25, 14,186,233, 87,
- 43,220, 5,135,187,174, 30, 69,105,164,192, 27, 90, 72,240, 39,162,127,116,227, 20,255, 0,241, 50, 60,189,149,158, 63, 12, 89,
-113,213,104, 58, 82, 43, 51,150,162, 21, 42,125, 66, 75,191, 87,192,111,187,101,164,149, 40,129,109,199,158, 62, 88,198, 83, 46,
-197,181, 58, 59, 68, 37, 12, 13,196,245, 89, 36, 27,126, 88,152, 67,109, 30,208,201,216, 46, 82,237,205,186,225,142,101,105,164,
-202,164,148,182,145,189, 30, 43, 14,190, 47, 60, 17, 15, 28,213, 52,184, 73, 2,128,211,160,200,105, 13,177, 33, 55,113,215, 67,
-206,123,147, 99,130,203,160,247,212,231, 34,188,215,137, 18, 93, 79, 35,213, 9,219,135, 19,144,129,154,212, 2, 64, 29,217, 22,
-183,149,198, 13,190,148,253, 98,145,180,127,239,231,203,247, 14, 24,184,162,242, 81,200,254,226,162, 84,119,168,196, 74, 44,103,
-242, 83,212,183, 63,215,125, 98,210, 83,238, 5, 42, 73,198,172,200,200,165, 86,223, 98,150,124, 45,161,150,148,145,230,108, 73,
-255, 0,202, 48, 86,144,148,151, 30, 5, 35,255, 0,140,181,229,251,203,192,185,132,175, 51, 84, 55, 27,255, 0,164, 30,191, 28,
- 90, 14, 41, 18, 41,210,117,154, 20,220, 87,225,205, 98, 67,204,144,163,191,186, 4,117, 87, 77,223,138,191, 44, 31,100, 74,238,
- 84,195,170,187, 12, 62, 20,224, 79, 69,147, 99,111,241,233,141, 21, 4,165, 50, 89, 41, 72, 22,100,218,195,167,140, 97,252, 14,
-114,226,212,121, 37,245, 92,159, 63, 14, 32,181, 21,106,106, 89,180,163,185, 53, 83, 98,184,186,201, 81,218,131,224, 55,234,162,
- 69,134, 25,212, 51, 42,227, 85,102,186,233,113,224,167,108,130,151,108, 46, 85,240, 62, 99,242,193,246,208,132,101, 38, 2, 16,
- 7,250, 99, 93, 7,255, 0, 40,156, 66,223, 0,178,110, 58,207,231,240, 56,174, 82,151, 0, 36, 84, 80,181, 21, 26, 59, 23, 49,
-213,162,202,141, 53, 14,186,160,133,108,121,105, 87, 40,243, 60,121,240, 65,198,184, 57,182,162,197,115,187, 19,220, 81, 17,146,
-130,119,159, 53,130,175,198,195, 27,233,169, 79,212,105, 85,133,204,215,238,125,120, 72,192,124,174,211, 78,230, 58,143,122,218,
- 85,181,133, 20,238, 23,177,231, 3,202,128, 9,138,121,204, 8, 53, 42,127, 84, 42,241, 37, 75, 90, 11,203,125,246, 84,220, 66,
-149,113,222, 45, 67,175,184,219,156, 76,180, 83, 59,140,139, 71,136,151,150,204,135,231,206, 81,222,240,221,180, 37, 55, 91,135,
-247,137, 81,182, 42,121,164,251, 68, 83,126,123,213,243,242, 86, 8,197,117,196,199,165,109,113, 66,205,189,107, 31,222,197,117,
-219,180,182, 20, 8,164,162, 74, 35,149, 90, 25,139, 82,243,102,104,169, 46,179, 83,150,194,217,106, 66, 82,150,209, 25,176, 2,
- 74,200, 9, 7,111, 30,120, 7, 95,205,210, 32,187, 10,157, 10, 65, 11,246, 98,244,133,160,218,202, 95,141, 68, 91,206,214, 31,
-142, 54, 83, 90,107,244, 25,106,238,211,115, 45, 36,155,117, 33, 10,182, 5,202, 1,235,173,209,184,134, 92, 0,171,146, 5,198,
- 42,165,134,147,221, 3, 74,118,158, 40,128, 5, 90,153, 59, 88, 11,185, 86, 12, 86,135,217,165,166,212,210,119, 88,146, 30, 77,
-191, 18,148,143,145,193,182, 53, 42,124,186,155, 9,250,195,100,104,145,146,133,217,127,174, 74,183,185,242, 0,255, 0,189,138,
- 98,148,165, 53, 22, 2, 90, 81, 72, 9,108, 0,147,107,120,151,130,217,101,215, 28,136, 67,142, 41, 65, 68, 5, 2,111,113,115,
-140,231,236,153, 4, 71, 63,169,171,169,125,100,213,178,229,102, 54,100,173,200, 20,233, 55,145, 17,131, 33, 42,184, 60,165,162,
- 64, 63,151,224, 48,202, 22,116,172,119,179,242,188,106,178,203, 78, 52,134,214,176,171,110, 55, 78,243,127, 85, 18,163,126,183,
- 89,196, 63, 74, 29,119,184,172,191,222, 43,121, 91,137, 43,191, 36,119, 99,139,250, 97,218,201,110,124,197, 54,118,158,253,174,
- 83,199,174, 2,182,144,131,147,124,191,193,250,211,174,225,193, 83,188,195,169, 15,214, 34, 76,202,144,223,106, 43,109,204, 74,
-159, 41,235,116, 1, 97,129,209,181,101,228,102, 53, 49, 79,121, 81,223,101, 41, 66, 95, 32, 18,149, 46,201,189,252,143,132, 95,
-204,238,242,177,196, 90,151,246,149,169,129,207, 22,245, 58, 87,187,157,199,127, 83,235,136,234,212,164,200,113, 73, 36, 19, 95,
- 72, 36,121,128, 77,177, 30,193,151, 19,146, 52,253,247,167, 55, 78,164,213,215, 11, 85,254,168,174, 56,210, 17,176,176,203,237,
-193, 96,168,149, 19,180,169,110,174,253, 84,162, 83,184,254,207,132, 88, 18, 48, 51, 44,231,218,156,250,104, 19,234,234, 93, 70,
- 89, 88,114, 75,137, 30, 6,212,160, 22, 71,225,180,124,134, 42,202,204,185, 74,206,189,234,164,184, 84,168,242, 55, 40,172,220,
-221,196,223, 6, 50, 66,214,181,160,173,100,253,156,113,201,242,239,209,198, 2,109, 25, 26,199, 79,173, 56,191,184, 3, 67, 82,
-120,185,241,183, 27,164,199, 66, 84,166,105, 17, 92,109,198,148, 62,242,192, 86,213,123,237,112,126, 8,192, 58, 22,112,118,141,
- 73,106, 20,215, 10, 98,198,150,149,183, 99, 98, 82,164, 36, 18, 61,228,121,254,241,192,106, 59,142, 8,205,168, 56,171,170,107,
-161, 70,253, 65, 28,224,126,102, 36, 64,216, 15, 2, 67, 0, 15,119,135, 6,106,221,180,166, 60,127,127,222,138,111,159, 81,130,
-106,210,117,218, 94,106,139, 14, 52, 40,169, 50, 38,182,224, 37, 99,239,180, 28,240,139,122, 0,132,252,176, 2,152,198, 91,167,
- 81, 26, 19,226,119,170,144, 86,148, 53,251,123, 66,249, 31, 21, 20,252,206, 8,100,175, 13, 86,158,226,120, 82, 50,188,133, 33,
- 67,170, 78,215,185, 30,135, 13,139, 45, 43, 58, 82,153, 83, 73, 40, 69, 56, 20, 36,167,132,158,224, 30, 7,151, 60,252,112, 34,
-165, 37,194,128,116,137,249,254,213, 73,199, 20,189, 77,103, 50, 50,171, 52,151,105,222,201,181,181, 54,204,116,243, 97,117, 18,
-234,254, 67,106,148,125,195,223,136,149, 74,137, 50, 69, 1, 89,109, 12,165,201, 82, 18, 88,140,130,200, 88, 80,189,214,162, 15,
- 81,181, 42, 32,122,145,235,137,102,164,188,244, 58, 10, 61,145,213, 53,121,210,193,238,213,183,139,161, 54,227,221,199,195,140,
- 65, 96, 85,170,163, 85,227,182, 42,114, 2, 82, 65, 74,123,229, 88, 92, 11,219,156, 18,212,173,198,179,131, 16, 38, 60, 69, 4,
- 62,164, 43, 77,232,214,152,101, 40, 57,109,109, 46,130,128,150,208,219,110, 33,151, 58,188,225,109, 42, 82,207,244,130,184,247,
- 96,222, 99,156,243, 57, 77,215,229, 74, 46,189, 61,226,135,155, 72,232,148,144,176,143,154,128,192,250, 17, 40,163,184,164,155,
- 16,211, 64, 17,229,215, 15,106,232, 65,160,196,186, 7, 53, 27,158, 58,248,159,254,225,248, 97,238, 30,122,230,247,180,117, 82,
- 73,212,243, 53, 12,217,211, 78, 40,244, 41,174, 52,170, 60, 70, 59,192, 86,134,208,222,223,245,138,119,187, 63,193, 55, 63, 19,
-134, 89,174,141,245,254, 66, 20, 90,124, 36, 23, 99,184,118, 40,162,251, 82,164, 13,234,249, 91,241,196,183, 47, 45,104,205, 41,
- 8, 89, 22,109,229, 11, 31, 48,226, 82, 15,198,220,124, 56,192, 60,170,227,138, 27, 20,226,136, 44, 55,112, 79, 28,145,124, 87,
-237, 8,118, 35,104, 62,253,169,167, 46,162,163,240,116,170,176,131, 37,170,154, 10, 88,130,243, 43, 59, 58, 54, 0, 42, 41, 30,
-251,165, 35,250,120,245,172,141, 81,155,146,154,158,167,183, 58, 43,206,188,251, 97, 54,185,113, 2,196, 31, 59, 40,145,242,197,
-163,168, 11, 91, 57,122, 74,154, 81, 73, 83,237,238, 41, 54,191,216,177,136,149, 41,107, 57,106,152,146,179, 98,182,137, 23,234,
- 74,213,124, 58, 46,220, 90, 65,241, 31, 35, 81,237,148, 5, 61,133,153,179, 29, 34, 22, 93, 6, 59,125,221, 29,180, 60,182, 26,
-104, 52, 22,134,130, 77,136, 0,117, 13,131,126,167,125,249,190, 39, 57, 63, 87,243,142, 80,205, 84,170,229, 6,164,149, 74, 17,
- 1,122, 68,129,112, 84,132,135, 20, 20, 60,199,137, 39,223,179, 0,243,139,104, 53,153,224,160, 31,180,183, 79, 34,216, 4,126,
- 28, 98, 46,151, 93,180,223,181, 87,134, 44,205,190, 46,156, 50, 49,173,105,139, 94,164,246,200, 81, 10,153,208,243,235, 87,173,
-239,110, 27, 88, 90, 21, 7,125, 42, 97,169,122,149, 43, 53, 84,230,230, 10,213,110, 68,135,159, 12,203,146,241,115,196,164,119,
-103, 98, 61,194,193, 92, 11,117,192, 26,117, 66,155, 27, 52,174, 74,226, 37,108,182,195, 8, 89, 39,130,181, 51,189,119,245,232,
- 71,204,226, 63, 81,241, 65,169, 37, 92,143,102, 96, 88,250,119,110,113,135,147, 64, 74,165, 16, 45,224,127,167,185,133, 91, 15,
-123,112,235,168, 82,148, 73, 36, 30,126, 0,205, 13,199,150,181, 74,140,147, 91, 13,124,198,204,169,168,204, 85,195,173,167,187,
- 72,243, 74,129, 22,249,139, 12,107,175,202,169, 73, 37,169, 79,119,150,109,105,110,223,168, 27, 72,184, 30,235,169, 71,229,129,
- 85,162,125,146, 18,175,200,146,205,143,167,137, 56, 41,153, 0, 69, 88,165, 34,194,243, 56, 31,253, 66, 49,146,176, 2,129,231,
-251, 85, 2,179, 88,229, 26,116,185,116, 78,237,108, 4,170, 85,101, 49,247,142, 10, 91, 86,228,168,126, 35,243, 62,184,153,101,
-236,190,244,108,169, 89,101,136, 96,189, 30,190,205,156,243,108, 50,137, 36,129,238,220,166,255, 0, 15,126, 26,105,202, 82,105,
-144, 9, 72,230,168,130,120,255, 0,233,226,111, 77, 1, 45,230, 52,164, 88,123, 68,179, 97,235,199, 56,203,186,186,113, 25,136,
-229,251,138, 65,197, 21,197, 86,149, 57,202,148, 32,208,170, 49, 3, 76, 54,194,153,144,233, 28,237, 43, 46, 42,254,242, 2,191,
- 19,136,229,117, 77, 42,167, 13,134,128,108,180, 25, 66,210,179, 96, 28,184, 73, 63, 11,146,126, 24,153,234,235,104, 69, 94,174,
-148, 32, 0,154,250, 18, 0, 29, 6,213,113,240,197,125,154,137, 57,174, 85,205,236,165, 17,127, 35, 97,139,246,103,180,107, 56,
-211, 64,125, 96,253,105,103, 84,111, 82,170,205, 31, 79,100,211,169,243, 51, 83, 73,155, 46, 3, 41, 49, 99, 21,158,236,172, 0,
-159, 16, 29, 78,237,199,155,129,111, 50,120,121, 70,207,117, 92,179, 57, 84,124,189, 85,112,198,219, 29,229, 65, 46, 89,152,235,
- 80, 5,194,144, 58, 27, 91,159,221,231, 16, 37, 18,170,199,136,223,236, 28, 60,250,220,115,141,212,117, 40, 72,168,172, 40,220,
-193, 93,205,249,251,131, 22, 84,214,116,128,179, 35,167,190,162,167, 20, 83, 21,179, 76,230,231,252,201, 85,122, 50, 42, 13, 51,
- 74, 18,195, 20,213, 37,145,222,144, 92, 32,173, 68,139,131,100,147, 97,231,110,125, 95, 69,211,154,212,170, 34,234,109, 87, 36,
- 41, 2,178,165, 45, 14,155,247,105,223,226,177,181,193, 36, 35,142,156,121, 99, 13, 40,113,104,102,159,177,100, 94,168,229,236,
-127,117,120,147,103,183, 92,143,147,229, 37,135, 20,128,115, 69,136, 65,181,193,108,146, 56,196, 46, 93, 87,108, 82,152, 30, 67,
-239, 90, 98,234,243,122, 84,123, 83,233, 21,255, 0,173,195,139,148,145, 31,111,121, 22, 59, 74, 35,112, 5, 54, 22,242, 5, 74,
-176,247, 32,225,133, 86,137, 63, 44, 40, 71, 98,104,117,228,160,170, 78,211,113,193, 73, 42, 63, 21, 92,129,233,183, 7,245, 75,
-255, 0,121,134,191, 63,110,124, 95,220, 24, 22, 31, 43,159,196,225,181, 88, 5,214, 10,150, 46, 85, 17,237,196,249,248,157,192,
-109, 84, 75, 72, 79, 40,249, 69, 73, 75, 49, 90,242,131, 50,106, 84, 41, 8, 88, 87,117, 74,166,187, 49,198,239,203,174, 56,160,
-150,211,242, 54, 81, 62,236, 55,118, 61, 99, 48,209,163, 82,153,152,190,233,137, 72, 9,106,246, 73,113,221,169, 22,248,217, 87,
-248, 39, 5,104, 11, 90,103,230,128,149,144, 63, 70,209,192, 62,232,223,222,112, 11, 36,186,239,121, 79, 29,226,185,172,193,191,
-139,247, 18,112,109,136,143,191,189,169,131,138,137,167,153,222,149, 38,137, 83, 77, 57,167, 84,144,210, 54,157,135,169, 79,132,
-159,196, 28, 44, 21,206,169, 74,179, 93, 67,114, 65,180,199, 64,184,232, 55, 30, 48,176, 16,250,128,218,132, 28, 49, 95,255,217,
- 0};
-
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1,245, 0,
+ 0, 1, 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0, 0, 0, 1,115, 82, 71, 66, 0,174,206, 28,233, 0, 0, 0, 6, 98, 75, 71,
+ 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24,
+ 0, 0, 0, 7,116, 73, 77, 69, 7,216, 10, 22, 11, 33, 15, 29, 14,195,147, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,189,119,
+152, 93, 71,125,255,255,154,114,206,185,109,171,118,213,165, 85, 47,150,132,229,222,177,177, 29,155, 0, 54,166,183,252, 32,201,
+151, 64, 10,249,133, 18, 72, 32, 33, 33,149,150, 56, 13, 8, 37, 36, 64, 2, 4,211,193,184,130,109,140, 45,217,170, 70, 86,177,
+186,180,146, 86,210,174,118,181,245,222,123,202,204,124,255, 56,231,222,189,187,146,108,131, 77,242,124,147,157,231,177, 87,123,
+239,222,115,102,230,204,157,247,231,253,254,148, 17,206, 57,231, 0, 67,218,180,203,254, 33,192, 1, 2, 11,128, 65, 2,160,178,
+247,157, 0, 11, 72,103,112, 2,192,226, 80, 88, 7, 74, 8,164, 19, 96, 35, 32, 6, 37,129, 0,107, 65,226,192, 57, 80, 18,139,
+ 64, 90,129,115, 32,132, 3, 97, 64, 36, 56, 44, 2,133, 67, 2, 10,144,136,172, 91, 56, 11, 2,112, 50,253,137, 77,123,159,118,
+ 22,156, 2, 33,113,217, 59, 0, 50,123, 11,199,248,171,245, 11,142,143,173, 62, 62,151, 93, 83, 0,120,217,248,106, 31,179,217,
+ 88,107,189,148,217, 29,126,246,214,216,199,218,188,154,108,222, 21,105, 95, 5,224,144,152,236,111,107, 51, 34,236,248,115,106,
+ 28,203,207,220,129,250, 85,211,103, 90,159,199,236,254,233,187, 22,225,116,237,165,244,125,153,174,153,218,114, 81, 19,230,120,
+226, 26,178, 13, 47,213,198, 53,225,222,162, 54,159,160,240,198,251, 38, 44, 9,178,222, 67, 1,168,236,121, 59, 84, 58, 63, 46,
+ 91,185,206,203,134, 97,179,143,235, 73,143,185,113, 53, 52,188,230,100,195,186,146, 24,145,142, 75, 53,244,215, 53,204,145, 32,
+174,191,227, 26,215,229, 84,155,106,255, 29,205,157,227,245,169,133,249,223, 59,255,103, 60, 15, 59,233, 5, 57,105, 95,226, 44,
+251,211,211,220,167,113,159,158,244,172,245, 25,107, 64,100, 27,157, 3, 33,158,254, 86, 18, 16, 66,224,172, 69, 72,133,193,162,
+133, 70, 0, 54, 14,145, 42, 6, 55, 6, 81, 4, 50,135, 20, 1, 88, 13, 42,221,184,157,115, 32, 5,194,101, 61, 16,233,102,153,
+ 2,186,192, 58,139, 20,103, 89,172,245,141,184,214,113, 1, 66,158, 49,192,179, 79,143,156, 0, 26, 96,145,245,255, 79,152,136,
+ 51,174, 39, 38,117, 68, 62, 7, 64, 63,215, 99,148, 13,143, 89, 52, 0,123,237,110,226,249,252,210, 54,206,165,120,134,235,214,
+214,133, 56,251,101,196,211, 44, 60,217, 96, 58,184,108, 44,227,128, 62, 62,106,121,150, 47,129,104, 0,116, 57,193,170,200,174,
+ 35, 92,106,141, 8, 89,191,159,251,185,102,126,226, 43,178,193,160, 21, 19,134, 38,158,254,203, 55,213,166,218, 84,251,223,211,
+ 4, 63,203,134,115,142, 61,200,254,124,247, 61,199,126, 93, 39,230, 41,111,182, 19, 45, 8, 71,157,245, 10,146,172,243,178,142,
+191,147,199, 34, 93,182,147, 91,131, 84, 18,162, 17,202, 91,126, 64,247,158, 45, 20,155, 59,153,119,193, 53, 48,123, 13,232,246,
+148,235, 10,137,181,182,126, 63,151, 49, 32, 33, 4, 2,129, 20,181,225,218,172,127, 13, 32, 90, 99,236,200, 58,211,150,207, 64,
+ 94,157,224, 12, 88, 78,121,153, 25,103,171,128, 16,227, 91,187,153,196,164,107,192, 38,178,121,121,174,235, 97, 28, 60,228,132,
+215,200, 20, 1, 92,202,117,149, 72, 25,187,157,188,152,158, 35,184,187, 6, 86, 46, 26, 22,154,155,200,103, 83,134, 44,152, 48,
+ 79,227, 12,221,158,115,128, 34,155,175, 51, 32, 80,200, 73,216,127,118,144, 84,147, 13,211,236,198, 66,212,250, 57,217,208,144,
+231, 48,112,179,249,117,231,248, 50,100,170,143,112, 18, 37, 0,151, 52,124, 90,140, 63,111,167, 39, 40, 16,114,138, 20, 77,181,
+ 95, 72,179, 83,198,227,255, 43,207, 73, 60,155,231, 36,127,206,247,126,118, 18,167,207, 41, 79,158,193,122, 26, 44,138, 73,140,
+205, 57,131,115, 22, 41, 36,162,246,134, 77,232,125,114, 19, 35, 59,214, 83, 42, 31,135,225, 99,156, 24, 59, 77,251,170, 97,252,
+165,151, 32,131, 38,100, 80,196, 74,137,200,182,238,218,198,110, 51, 50, 38, 38,129, 65,125,139,109,176, 82, 38,131,143, 60, 99,
+ 60,207, 60,113, 98,146, 65,144,222, 75, 62,141,253, 36,159, 23, 64,101, 2, 32, 78,156,255, 9,151,118, 46, 27,183, 69, 54,202,
+209,207, 21,208,207,232,135,155,192,130, 93, 3,163,118,103,168, 4,118, 18,160,217, 51, 45,189, 6,137,189,230, 70,120,214,138,
+213, 36,215,128,152, 60, 41,217, 26,180,147,108, 27, 89, 55, 80,228, 51,170,100, 19, 4,162, 9,134, 98,134,254,231, 50, 0, 26,
+ 20,136, 41, 64,159,106, 83,237,127,111,115, 63, 59,230,254,156, 6,158, 60, 3,225,206, 9,234,245,205, 83,200,113,176,106, 0,
+ 46, 43,106,140, 73,142, 75,156, 13,131, 49,128, 80, 26,233, 98, 28,142, 4,137, 68, 35, 77,149,164, 50,138, 24, 27,162,100,202,
+248,158, 98,232,232,147,244, 14, 13, 48,183, 60, 8, 43, 46,131,246, 46,172,202,147, 0,254,164,109,216, 25,144,154, 6,181, 64,
+214, 89, 59,181,190,100, 67,148,207,202,160,177,103, 97,131,141, 82,238,196,167, 52, 25, 48,157,200, 88, 94, 38, 3,152, 6, 16,
+ 17,207,243, 3, 20,103, 99,175,147,140,136,231,131, 37, 78, 52,232,220, 68,192,204,222, 87, 13,138,132,171,205,139,203,140, 0,
+225,210, 24,134, 6,230,237,196,184,219, 96,252,131,182, 65,221,145,103, 55,183,206,248,118,216,167,255,214,100, 6,157,155,116,
+ 29, 65,198,176, 93,131,188,239, 36, 66,100,198,137, 56, 27, 23,178,136, 44,134,162,129,155,215, 45,240, 70, 86,158,186, 33,108,
+ 93,129,152, 98, 82, 83,237,191,134,177,159,131,156, 8,251,243,179,191,169,246, 60,130,251,211,144,178,231,244,188, 27, 95,179,
+147,200,201,217, 99,122,100,186,249,141,111,228,147, 37,106,217,136,117, 13, 27,172,152, 64,208, 82, 90,109, 19,147, 6,189, 41,
+ 64,121,204, 94,121, 62,173,243, 86, 16,234,102,194,106, 76,123, 94, 82, 12, 79,209,189,225, 46,250, 30,254, 54, 28,253, 41, 58,
+ 30, 36, 71,136, 36,193,217, 4,231, 28, 82, 76, 80,103, 51, 16, 25, 7,240,201,176, 32, 50, 98, 37,220, 68,134,231,206, 88,220,
+118,210,127,181,247,245, 36,132,168,249,218,237,207, 45,129, 60,251,214,224,211, 22, 19,161,198,213,140,151,218,127, 78,254, 23,
+111, 32,227,115, 63,153,221,166, 70,159,104, 0,182, 26,179, 31,255,153,246,123, 50, 80,219, 9,134,152, 60,139,229,235,206,120,
+184,233,173, 92,227,239, 13, 38,153, 56,155,129, 35,220,184, 97,209,176,241,213,215,202, 25, 6,225, 68,167,141,203,198,145, 26,
+ 33,242, 44,179, 99,121,246,178,195, 84,155,106, 83,109,170,253, 12,120,224,228, 89, 80,248,217,237,255,194,217,216, 53, 50, 97,
+ 73,131,223,209,217,236, 58,141,140,177, 1, 16,133,196, 25,153,198,189, 43,129, 49, 6,165, 50,230,150, 24, 72, 70, 97,248, 40,
+125,155,239,167,178,231, 97, 74,241, 16, 90, 66,130, 32,212, 69, 42,193, 52, 22, 93,117, 43,204, 94, 14,173,115, 64,230, 83,146,
+133,196, 57,133,148,147, 54,205,140, 37,141,119, 16,192,155, 24,213, 94,103,113,114,130, 88, 33,200, 62, 91, 99,149, 25,211,114,
+141, 24,208, 56, 70,105,234,159,116, 13,219,191,248,133,202, 46,181,200,250, 20, 72, 92, 35, 96, 77,112,135,216,241, 49,141,199,
+ 58, 62,199,251,214,226,235, 85, 6,216,114, 28, 16, 51,150,219,152, 37, 48, 57,118, 83, 77, 2, 56, 87,151,198,211, 88,141,113,
+208,157, 56,247, 41,179,166,238,171,174,199, 48,144, 52, 24, 11,141,247, 73, 50,133, 72,215,179, 4,196,148,255,113,170,253,143,
+103,232,207, 17, 36,158,241, 62,242,231,236,223,255,238,239,220,100,155,254,156,241, 69,245,128,100,123,246,103, 83,207,222, 58,
+ 23, 82,159,235,126,207, 22,212, 39,116,172,225,225,185,198,205,127,156,161,225, 50,255,163, 20, 96,162,236, 45, 63,253, 91, 27,
+194,208, 17,146,109, 15,208,247,212, 58,188,202, 0,158, 11,177,214,146,120, 37, 6,104,101,254,133, 47, 34,127,222,165,208, 50,
+ 19, 84, 9,100, 14,231, 84, 93, 3, 63, 35, 29, 13,155,166,191,213, 65, 93, 78,100,223, 19,228,250,179,140,105, 18,160,115, 6,
+176, 55, 94,191,214, 3,253, 11, 89,212,238,140, 7,100, 51, 16,155,232,199, 86,238, 76,198, 59,225, 25, 60,231,251,199,117, 80,
+ 23, 53,229,162, 62, 23,182,206,192,205,164,197, 84,235,214,100, 80, 55, 19,230,215, 54,128,175,156,240, 12,168,167,136,121,147,
+192,219,214, 25,243,184,223,220,214, 95,175,129,186,174,207,133,100, 10,212,167,218, 20,168, 79,129,250,255, 59,160,126,150,249,
+123, 94, 64,221, 69, 46,101,163, 53,208,202,152, 83,246,123, 42,113, 26,164,181, 32, 18,176,149,244, 74, 70,128,148, 25,248, 25,
+ 48, 46, 13,127,119, 97,134, 13,165,236,195, 6,194, 81,136, 71,225,240, 14,250, 55,221,133, 24,234, 65,187, 24,103, 5,137,206,
+ 51, 38,243,228,103, 46,166,243,242,155, 97,198,121,144,155, 6, 78, 98,133, 78,189,157, 22,124, 49,238,231, 54, 22,148,108,144,
+169, 29, 96, 45, 66,142, 59,196, 29, 50, 75,137,147, 56, 28, 88,135,148, 13,254,225, 44, 93, 30,145,166,205, 57,151,249, 91, 45,
+ 56, 12, 90, 78, 18,130,157, 58, 83,177, 16, 13,177, 8,207,211,162, 56,215,247, 71, 72,112,198, 34,164,196,186, 4, 41,107,156,
+ 94, 61,231,251, 27,107,144,210, 98,176, 8, 52, 2,133,176,105,192,162,214, 96,140, 65,214,213,118,149,230, 11, 24,139,175, 50,
+159,142,117,105, 95,164,196,102, 25,102,198,102,156, 63,203, 29, 23,103, 91,228,162,102, 36,166,160,110, 38, 27, 9, 13,171,209,
+152, 4, 95,129,200,162, 40,157, 84, 36, 14,180,144, 8, 44,198,184,113,149,104,170, 77,181,255, 65,160,238,156, 67,100,155,159,
+115,162,225,223, 14, 33, 92,154, 26, 12, 19, 94, 7, 89,255,253,105,191,255, 89,157, 7, 33,178, 10, 18,214,166,217, 71, 98,146,
+242,250, 52,160, 94,235, 95,237,239,173,181, 72,249,252,131,189,115,233, 88,165,148, 19,250,121,182,241,215,254,238, 23,254,148,
+108,186,199,213,230,192,217, 36,221,171, 45, 8,217,224, 50, 77,139,177,164, 88, 68, 86,151,165,190,183,141,207,115, 58, 46, 85,
+ 31, 75,109, 46,211,159,212, 95,171,141,183,246,220, 38,128,186,117,198, 77,244,153,218, 9,160,110,112,104, 23,130, 41, 67,111,
+ 55,163,125,135, 49, 73, 21, 33, 60,148, 82, 56, 83,197,154,152, 32, 8, 48,213, 42, 5,109,137, 19, 75,164,138,104, 47,143,141,
+ 42,200, 44, 31, 61, 48, 35,152,238, 45,140, 30,217,141, 78, 66,164, 48, 24, 35,112,126,158, 49, 2,146,214,121,204,189,230, 21,
+ 48, 99, 57, 20,218, 65, 21, 72,178,126,168,108, 94,172, 77,165,254, 36,177,120, 90, 78,152,148,218, 4, 84,163, 16,173, 53, 74,
+142, 15, 56, 49, 9, 90,105,194, 48, 38, 8, 60,146,196,162,149, 64,136, 36,203,179, 15, 8,141, 69,169,244,154,113, 28,145,243,
+ 68, 67, 0,157, 26,103,151,174,129,193,138,231,206, 16, 93,195,215, 68,158,197,226,115,214,130, 72,199,167,164, 2, 97,169, 70,
+ 33,129, 31,156, 51, 21,236,103,109, 49, 9, 34,147,253, 85,102,139, 73, 9,198,186,116, 49,101, 11, 50,142, 12,218,215,117, 85,
+195, 37, 9, 74,167,210,121,210,160, 45,168,108, 33,215,103,112,178,133, 90, 3,245, 44,136,206,101,156,155, 58, 83, 31,159,155,
+200, 88,124, 5,198, 68,232,218,230, 35, 37,233,213, 27, 19,241,166, 98,209,167,218,255, 44, 80,111, 4,244, 26,168,215, 94, 27,
+127,253,108, 6,128, 60,227,179,207, 4,206, 53,160,172, 1,199,211, 27,201,153, 98,102, 82,240,108,188, 79,109, 31,126,118,247,
+127,102, 32, 79,146, 4,207,243, 72,146, 4,173,245,132,113, 54,254,108, 4,246,255,242,167,149,129,110, 18,199,104, 45,211,192,
+ 50,151,170,216,198, 56,194, 48,100,100,108,148, 83,167, 78, 17, 70, 17, 90, 9,194, 56,162,185, 84,100, 90,103, 7,131, 3,167,
+241, 2,159, 74, 37,164, 82,169, 96, 13, 36, 73,194,220,185,115,233,152,214,134,231,121,233,245, 77,132, 86, 26, 71,109,111, 61,
+ 19,127, 68,226,156, 27,247,163,219, 6, 95,103,205,167,154, 64, 56, 64,178,115, 29, 39,183,255,132,104,176,155,162, 78,192, 42,
+194,114, 5,229,171, 12, 80, 65, 88,135,195,224, 5,121, 70, 42, 33, 82, 41, 52, 2, 41, 37, 73,146,224,139,152,146,142, 17,225,
+ 8,210, 90, 76, 18, 33,116,128,177, 18,116,142,170,204, 83,205,181,209,185,250, 74,114,231, 93, 7,237,243, 65,248, 56,151, 78,
+ 82,189, 24,141,115,169,133,226,200,194,228, 93,186,216, 27, 82,234, 92,150, 47, 47,132,192, 56, 80, 82,213,140,165,236,243, 25,
+ 47,140,203, 89,100,159, 7, 58, 32, 6, 18,155, 22,193, 19,184,113, 81,216,157, 5,188,197,179, 75, 49,248, 89,129, 61, 5,196,
+164,129,197, 10, 16, 62,137, 53,104,169,112,206, 97,196, 56,120,138,231,114,211,196,128,146, 24, 41, 8, 45, 4,153,248, 34, 5,
+ 16, 39,160, 37, 40, 89,103,204, 53,235, 84,103,198,141, 20, 16,199, 14,233,139, 44,200,205, 33,176,104, 68,122,109,169,198,131,
+233,196,153,249,230,245,160, 70, 49,169, 2, 96, 67,150,133,115, 22, 92,140, 84, 42, 77,199, 16, 10, 43, 92, 22, 81,224,234, 50,
+253, 20,164, 79,181,255,177, 50,239, 57, 0, 50,142, 99, 60,207,195, 24, 67,146, 36, 4, 65, 80, 39, 58, 66,136,103,193, 86,109,
+166,196,233, 9,215, 79,149, 47,241,172,229,247, 70, 98, 5, 60,175,160,222,120,141, 36, 73, 16, 66,156,113,175, 90, 31,106,255,
+254, 47, 99,234,137, 67,170,137,196,197,217, 4,132,194, 57,193,232,104,153, 35,221,199, 8,130, 28,173,237,109,148, 74, 37,132,
+146,248, 26,134, 70,199,120,228,225,135, 88,188,116, 41,115,103,207, 70,121, 1,198, 56,242,121, 63, 21,195, 13,140,140,142,114,
+178,231, 56, 45, 45, 77,116, 78,159,134,150, 34, 85,164,179,130,111,103, 3,117, 61, 17, 85,228,153,145, 96,198, 66,181, 76,247,
+142, 45,112,242, 32, 37, 49, 64, 46,172,162, 98,104,245, 60,162, 80,164, 8,104,210, 7, 45,165,196,132,131, 20,124,143, 36, 74,
+210,130, 52,214,225,249,138, 40,172, 34,181,196, 24,131, 69, 18,228,155, 49, 46,193, 38, 22, 97, 66,138,206,160,203, 85,250,158,
+120, 16, 53, 60,198,236,203,110,130,210,116, 68,208,132,179, 58,221,184,133,194,216, 20, 76,156, 32,157, 60,192, 56,135,179, 14,
+231, 44, 74,165,252, 85,101, 15, 85,139, 76,214, 72,117, 18,132, 16, 88, 11, 38,137,241,252, 2, 46, 73, 16, 42, 53, 18,132, 5,
+ 79,213,188,214, 2, 83,207,162,111, 40,150, 34,158, 79,110,216, 88,181, 76, 54, 34, 89,250,158, 76,125,217, 21, 82,195, 68,100,
+ 29, 16, 2,236,115,205,149, 23, 54,117,214,219, 90,254, 96,214, 35, 99,210,133,234,107, 98,151,122,189,135, 12,140,133,112, 96,
+207, 49,164, 2,103, 35,150, 45, 94, 72, 46,128,130,159,206,103, 78,166, 30,121,155,100,154,148, 18,103,248,131,206,236,174, 60,
+227,183,198,160, 69, 33,210,231,164, 61, 15,144, 24, 9,213, 4,148, 22, 89,160,156,192, 26,131, 81,224, 79,237,253, 83,237,127,
+ 48,168,215,152,168,115, 46,147,125, 5,158,151, 86,231, 84, 74,213,153,245,179, 7,244,244,186,233,231, 82,249,124,252, 90, 98,
+156, 4, 61, 35, 67,149, 19,250,247,124,178,229,218,181,226, 56, 70, 74,137,214, 26,107,237, 4, 25,190,241,111,255,171,153,186,
+ 84,162, 86, 97, 26, 50, 85, 65,123, 30,214, 66,111,239, 41,122,142,157,100,245,154, 53,120, 94, 74, 22,173,133,145,209,152, 67,
+135, 14,112,255,253,247,179,106,245, 74,102,204,236,194,207, 7,132, 85,135, 14, 4,253,167, 99,170,213, 42,113, 28,211, 92, 42,
+ 49,123,222, 18,142,247,116,227,121, 99,116,118,182,102,216, 96, 56, 87, 28,145,174,111,162, 89,126,144,155,192, 22, 73, 3,222,
+132,143,149, 62, 66, 23, 64,134, 56,171, 72,140,193, 10, 15,235,251, 84,194, 8,229, 28,121, 95, 34,156,193,218, 56,171, 79,238,
+ 8,180, 34, 73,170,200,196,100, 85,217, 52,232, 28,177,145,196, 81, 22, 91, 46, 32,144, 6,108, 66,206, 73,148,179, 84,246, 60,
+194,241,129, 30,102, 93,249, 82,152,181, 28,145,111, 67, 90, 13,120, 72, 5,161,129,200, 64,197,129,231, 65, 32, 83,111,176, 6,
+146, 36, 70,107, 15,107, 45,214,166,146,141, 20,181,200,114, 69,236,192, 73,141,243, 53,101, 7,190,246, 80, 14,132,201,152,112,
+ 70, 82,149,102, 34, 11,108,152,159,218,148, 62, 39,166, 60,121, 1, 55, 24, 13, 34, 11,206,139, 17,196,104,198,128,200,129, 87,
+133,214, 92, 42,160, 40,245, 60,220, 91,164, 76,221, 58,139, 47, 37,214, 36,120,126,186, 80, 70, 19,199,152, 22,124,251,225, 61,
+124,253,238,159,176,107, 95, 55, 82,251, 88,107, 49,206, 98,109,153, 5, 51, 74,220,250,162,171,120,205,205,215,211, 17, 64,171,
+ 7,158,240, 64, 88,226, 56, 68,251,185, 51, 67,106,106, 81,245, 13,105, 27,194,101, 54,192,164, 8,122,225,200,148, 30,139,209,
+146, 50,176,247,196, 24,159,254,244,167,248,141,183,188,137,139,150,204, 6,169,168,144,130,186,117, 32,137, 8,209, 60,114,112,
+136,239, 61,186,131, 3,135, 15, 19, 37, 49,133,130,207, 53,171,151,113,195, 5,139, 57,127, 86, 27,152, 8, 43,116,125,243, 59,
+ 61,208, 71,107,123, 27, 34, 84, 16, 52, 72,158,217,195, 22,130,255,118,153,111,170,253, 47, 19,225, 51, 73,188, 17,160,157, 75,
+119, 7, 33, 32, 49, 14, 41,107,190,228,172, 96,151, 74,141,255,154,191,247,233,175, 15, 74,201, 9,114,123,146,140,251,196,207,
+189,204,107,239,187,186, 33,208,216,223, 70,105,252,185,180,154, 2,224,121,222, 4, 48, 79, 13, 27,123, 78,102,126,182,121,251,
+ 69, 52,147, 88,148,206,226,183,164, 64,123, 30,149, 74,133,158,158, 94, 60, 63,207,234, 53,107, 80, 30, 28,239,173,242,212,222,
+125,244, 28, 59,193,161, 67,135, 56,120,248, 0, 77, 77, 77,136,157, 71,104,105, 57, 76, 53,140,233,239, 63,205,240,200, 88, 26,
+ 68,158, 36,169, 17,163, 4, 11, 22,204,199,247, 36,115,231,117, 97, 18,208, 74, 96,173, 78,159,205,217,202,118, 91,231,220, 4,
+ 80,151,227,155, 44,144,118,214, 85,224,224, 79,233,223,245, 24,163,167, 15,146,195,224, 11, 15,131, 32,113, 14,133,165, 73,198,
+232,112,136,177,254, 30,114,218, 17,217, 84, 18,151,198,225,148,135,145, 1,137, 87, 32,246, 2,240,138,228,242, 45,196,113, 12,
+ 46, 36,169, 12, 33,163, 65,124, 27,163, 77,132,151, 5, 90, 85,188, 86, 78, 55,117,177,236,154, 91, 96,209, 11, 64, 53,225, 92,
+158, 72, 72,156,132, 47,126,243, 30,126,176,110, 11,151, 95,113, 5, 87,190, 96, 5, 47, 88, 58,139, 60,160,156,193,147, 10, 99,
+ 13, 74,164,134, 3, 56, 76, 20, 35,131, 2, 21,160,231,180, 97, 40, 76,144,218,163,168, 97,110,147,164, 80, 75,116, 23,224,132,
+164,154, 56,124, 45, 38, 69,207,203,122, 97, 89, 82,209,254,249, 97,235, 46, 21,147, 77,173,216, 79, 70,107, 71,128,199,118, 31,
+ 97,253,206,195,108,124,108, 35,111,188,233,106,110,187,225, 18, 60, 83,179,200,158,227,125, 77, 4, 74, 17,217,212, 47,230, 9,
+136, 77,130, 83, 62,189, 17,188,237, 79,254,158, 13,123,123,176,126, 27, 82, 5, 36,213, 10, 78, 8,132,167, 64, 36, 8, 98,252,
+120,140, 25, 90,242,143, 31,250, 0,231, 47,108, 33, 15,104, 97,209,186,241, 64, 23,121,102, 5,186, 9,197,142,106, 59, 86,106,
+246,214,229,248, 36, 66,105,141, 65, 50, 6,236, 30,128,223,124,215, 7, 24, 25, 58,205,223,254,249, 7,185,122,217, 44,114, 90,
+ 16,106, 40, 38, 33,158, 14,216,214,115,138,247,124,234,187,172,223,211, 75,217,107, 2,237, 35, 92,140, 69,145, 11, 7, 8,108,
+200,109,215, 95,197,223,254,159, 27,152,230, 43, 92, 82, 65,232, 60, 68, 35, 88,191,192, 88, 85,177,105,239, 46,194,106,149,229,
+ 43,150,179,176,169,128,139, 70,192,107, 2,220,243,182, 97, 77,181,169,246,179, 51,246,241, 2, 80, 38, 19,216, 92, 67,193,172,
+ 90, 0,112,237,204,140,103,179, 68, 39, 6,199,165, 70,130, 16,207, 70,130, 31,255,108,205,216,109, 4,217,231,219,248,173,221,
+ 43,142, 99,124,223, 63,171,234, 48,185, 31,191,248, 7, 50,174,122, 70, 81, 68,181, 90,229,248,201, 94, 60, 29, 48,119,126, 23,
+ 56,216,180,121, 15,247,253,240, 65,134, 71, 42,140,140,140, 80, 40, 21, 25, 28, 28,100,201,146, 37, 92,116,225, 37, 40,229,177,
+103,207, 94,162,196,226,251, 57, 18,107,144, 66, 99,108, 12,214,144, 15, 52, 39,142, 31,230,198, 27, 95,200,101, 23, 45, 71,101,
+226,120, 74,186,207,236,146,182,100,229, 93,235,111, 38, 52, 86, 28, 73,229,110,133, 90,120, 62,211, 58,230,210, 82, 29,192, 57,
+139, 53, 30,194, 73, 36, 17, 58, 25,132,225, 30,236,238,245,228, 42,253,196,229,129,148, 9, 43,143,170,240, 72,114, 29,132,173,
+ 11,201,207, 89, 70,174,125, 38, 34,223, 76,222,207,103, 69, 64, 44,149,211,189, 48,124,156,145, 35, 59,209,195, 61, 84, 70,122,
+105,201,123,168,112,136,150,145, 35, 28,126,232,155,116,197, 9, 44, 90,139, 8, 60,156,244, 83, 73,152, 28,235, 15, 13,179,174,
+251,135,220,121,223, 67,124,228,125,191,205,133,139,103,224, 75,149, 5, 87,213,228,234, 36, 5, 7, 63, 32, 4, 6, 34,184,253,
+ 63,190,199,163, 63,221, 69,226, 96,249,188, 14,110,127,207,219,152,215, 36, 80, 73, 37, 43,154,162,201,233,134,224,173,134,148,
+ 58, 37,206,122, 4,201,207,189, 38,234, 7,156,136,198,162, 57, 16, 1,135,135, 13,239,251,200, 39, 56, 94,209, 72,107,184,126,
+ 56,166,127, 48, 97,110,179,158, 88, 53,237,231, 19,143,112, 42, 71, 28, 27,148,167,192, 89,146, 56, 70,120, 1, 67,192,187,254,
+234,147,108,216,223,135,107,154,137, 41,151,209,201, 48,107,231,118, 80, 42, 4,140, 68, 85,158, 58,114,130, 49, 89,194,229,154,
+ 57, 86, 30,224,255,255,240,223,242, 55, 31,120, 39, 23, 44,106,167, 89, 73, 72,210,224, 68, 85,243, 53, 53, 40, 28,245,170,115,
+181,133, 55,161,214,186,197,100,158, 33,173, 53, 97,156,128,231,115,170, 10,127,240,177, 79,112,180, 42, 80,126, 59,167, 67, 65,
+100, 33,135, 35,177, 2, 79, 43, 30,223,123,148,215,124,228, 43, 28, 25, 43,225, 21,166,227, 85,135, 40,248, 80, 84, 17, 67, 21,
+ 65, 69, 21, 8,155,230,242,197,135,246,179,239,240,113,238,249,235, 55, 83,170,165, 47,202, 2,255,116,207,102,222,249,153,135,
+ 64,232,148,198, 36,247,242,214, 95, 94,203,231,126,231,197,207, 16, 13, 60,213,166,218,207,239,126, 59, 87,108, 78, 99,112, 48,
+ 64, 18, 59,180, 78, 65, 55,243, 24,166,241, 76, 98, 28,212, 27,255,253,108,128,178, 6,128, 73,146,160, 84,202, 0,163,208,226,
+251,242, 25, 11,114,140, 51,122, 65, 28,155,134, 8,109,158,209, 32,120,182, 64, 62,249, 62,190,239,215,193,187, 49,104,176,102,
+ 92,212,254,182, 22,111,240, 11,109, 2,170,213, 42,163,163,195,244,247,247, 35,181, 98,116,116,148, 66, 73,179,119, 95, 55, 91,
+ 54, 63,201,250,199,183,144,203,183,144, 24,193,244, 89,243,137,146,152,249,109,211,105,239,156,137,246,243,236,217,179,135,216,
+129,206,229, 49, 78, 96,156,197,224,144,218, 67, 43, 77, 37,170,160, 60,205,246,157, 79,178,106,229, 34,218,154, 61,158,174,230,
+188,150, 13, 82,231,120, 63, 27, 11,104,130, 21,169,227, 94,182,206,133,164, 61,149, 95, 19, 73, 65, 57,112, 99,216,238, 62,142,
+111,219,132,233, 61, 68, 43, 33,158,242,176,206, 17,203, 28, 97,190,131,166, 69, 23,209,182,232, 50,170,205,115, 24,243,155,209,
+ 77,237,132, 78, 16,104,129,139, 33, 63,171, 74, 80,233,165,121,225,106, 78,109,123,144,177,238, 39, 81,229, 62,242, 90,226, 37,
+195,200, 50,244,108,249, 17,179,103,204, 2,191, 9,240, 83,182, 44,115, 84, 68, 9, 39, 53, 35, 73,196,112, 44, 24,142, 65,248,
+128,146,196,169,216,143, 68,227,123, 18,108,202,217,133, 7,189, 35, 9,221,131, 49, 14,104,106, 10, 41, 27, 71, 37,180,148,130,
+ 28,214, 90, 98,169,137, 26, 38, 74, 9,137,170, 69,134,103,178,187,202,146,202,220, 89,190,166,166,225, 39,212, 75,186,156, 33,
+217,215,114,176,173, 72, 67,190,146,154,251, 67, 64, 8, 84, 81, 12, 25,197, 96, 44,105,201, 23,168,196, 9, 74, 41, 18, 3, 90,
+ 73, 18,145,130,255,217,242, 23, 85,125,252,231,144,142, 72,239,129,167,210,185, 18, 18,223,243,168, 38,142,222,193, 42,219,183,
+239,196,243, 59, 8, 43, 35, 92,184,180,139,119,188,229, 13,116,181, 6, 4, 58,237,103, 95, 4,255,124,199, 15,185,127,221,102,
+ 84,190,153, 99, 35,131,124,254, 27,223,225,175,222,253,235,248,198,209,162, 21,227, 85,221, 38, 84, 25, 64, 61,243,119, 5, 3,
+196, 14,240,124,134,129, 63,251,135, 47,178,227,224, 73, 98, 93, 36,137, 35, 98,161,176, 46, 45, 9,235, 11,205, 96,108,121,215,
+ 23,215,115,180,156, 71,230,243,204,150, 35,252,198,107,175,226,178,243,151, 80,244, 4,221, 61, 39,248,234, 3, 79,240,253,109,
+199,105,111, 42,241,232,238,211,252,213,215,126,204,135,223,112, 93,102, 69,157,226,130, 5, 93,188,239, 53,215,241,214,107,231,
+209, 25,120,252,209,215, 55,243,169,123,158,224,245,215,172,228,250, 85,243,176, 38,139,171,124,190,138,255, 79,181,169,246,180,
+ 96, 47,144, 50,221,183, 70,134, 35,142,246,244, 83,173, 36,120,158,194,216,152, 5, 11,230,211,212, 36,120,224,129, 13,108,220,
+184,145,203,175,184,136,171,175,190, 60,141, 11,106, 96,236,231,252,158,101,105,190,214,146,102,177, 56,248,209,143,214,179, 97,
+195, 6, 46,187,242, 50, 94,116,237,229,147, 24,233,153,215, 72, 44,148,203,134,163, 71,143,146,132, 17, 96,209,158,164,163,163,
+131,233,211,219, 38, 40,191, 78,156,253, 40,133, 70, 55,220, 4,247,155, 76, 83,150,173,131, 67,135,123,248,198, 55,190,193,187,
+223,253,206,172,216, 25,117,223,127, 35, 81,177, 22,134,135,171,244, 28, 63,202,121, 43,151,156,209,125,247, 44,246,158,159,165,
+157, 56,209, 67,165, 82, 97,233,210,165, 56, 1,167, 6,134,217,189,103, 63,119,126,255, 62, 90,218,166, 51, 99,198, 12,252, 32,
+ 79, 53,138, 81, 10,166,119,118, 48,109,122, 39,165, 82,137,187,127,240, 61,186, 22, 45, 78, 99,209,108,140, 53,224,231,242, 0,
+148,203,163,140, 69, 85,250,251,122,152, 61,163,149, 25, 51, 58,105,105,246,198,173,189,115,116, 86,227,178,128, 8, 57, 46,183,
+ 43, 33,211, 52, 42, 28, 66, 10,180, 16, 8,151,234, 61, 90,120,104, 15, 80, 49, 84,250,113,123, 30,229,248,214, 7,240,134,123,
+104, 22, 21, 92, 20, 19, 10,129,244, 10, 84,117, 43,122,225,101,176,248, 50, 76,251, 18,108,177,147,237,135, 79,242,228,198,159,
+114,240,104, 15, 66, 40,102,183,183,113,225,210, 46,174, 92, 54,159,166, 82, 59, 29,205,109, 36,143,249, 68,123,215,161,163,211,
+ 96, 12,121, 29,146,244,239, 39,217,254, 19,244, 69,211,240,154,155,168, 0, 2,157,229,110, 59, 48,150,170, 21,244, 70,176,179,
+167, 74,185, 90, 65, 8, 71,115,177,192,156,246, 28,179, 11,146, 64,130,103, 65, 68, 89,116, 38,154,196, 90, 20, 30,166, 92,197,
+250, 57, 42, 8, 66, 41,217,120,104,144,163,167,134, 56,213, 55,130, 67,163,181,100,230,180,102,150,207,237, 96, 65,135,166, 61,
+ 59,224,205, 40, 75, 66, 90, 27,191, 22, 48, 81, 5, 6,170,176,227, 64, 31,199,134,135, 9,130,128,142, 32, 96,249,252, 78,102,
+148, 82,223,175, 76, 18,180,150, 36, 86,146, 72,232, 30,130,222,193, 42,229,200, 80,169,198,180,183,182, 48,125,182,192,104,176,
+ 86,163,188, 28, 73,146,224,108,132,117, 9, 86,122, 84, 36,156,172,192,174,163, 67, 28, 57,213,207,192,233, 65,112,154,166,130,
+207,130, 57,157, 44,153,221,206,236,146, 32, 79, 42,213,105,149,254,172,157, 84, 90, 5, 78,150, 97,199,158,227,156, 56,178,159,
+215,222,114, 53, 22,129,167, 5,115,219,242,124,230, 99, 31,228,247,254,236,111, 57,127,237, 5,188,227, 77,175,161, 69, 67, 49,
+112, 8, 19,147, 47,120,116, 36,130, 63,126,235,141,116,239,219,198,222,147,101,130, 92, 43,235, 55, 63,197,169,193,132,142, 54,
+ 72, 76, 26,219,128,144,103,230,160,187,113,147,198, 58,129, 20,181, 64,189,184,230, 76, 67, 42, 69, 44,210, 32,193, 15,127,225,
+ 62,238,223,180, 15,151,107,198,132, 33,129, 48, 88, 83,193,216, 40,139,165,208, 60,112,120,148,245, 91,159,164,109,206, 28,198,
+250, 79,114,251,251, 95,207, 43, 47, 94, 0,140, 1, 30, 87,204, 95,201,235, 46,239,226, 21, 31,253, 1,223,219,124,144,160,216,
+196, 55,215,239,224,253,111,184,142,102,160,234, 90,121,225, 82,203, 11, 87,188, 0,240, 25,169, 72, 62,242,182,235,248,212, 67,
+ 91,120,104,203,110,110,120, 65, 87, 22,140,249,204,155,229, 84,155,106,207, 78,169,155, 84, 43,188, 65,206,205, 80, 23, 99, 64,
+ 40,193,190,238, 94, 62,246,225, 47,128,200,129,168, 96, 93, 72,169,152,231, 29,239,120, 7, 35, 99, 69,182, 61,121,140, 85, 47,
+184, 4, 41, 33,140,210, 88, 35,235, 32, 73,210,122, 19,245, 26, 97, 89, 30,181,115,105,114, 74, 20, 57,124, 95,164, 68,196,192,
+208,152,102,251,238, 99, 44, 91,147, 16,101,125,179, 89,141, 39,237,101, 5, 55, 51,249, 55, 78,187,200,158,131,253,124,252,163,
+159,100,237,234,149, 40,233,136,146, 10,151, 93,117, 41, 47,236,188, 4, 45,210,239,188,205,172,121, 9,184, 44,106,220,101, 85,
+ 36,107,125,212, 46, 83, 30,212, 56,225, 73, 12,120, 18,198,198, 52,155,183,237,197,200,241, 10,155,141,227,187,243,251,235,216,
+254,212, 30,222,243,158, 95,229,192,161,211,252,221,237,159,224, 75, 95,250,123,172, 29, 63,183, 66,100,231,153, 52,158, 99, 97,
+ 77, 58, 6, 41, 83,252,211, 34, 77,229, 77, 3,147, 83, 63,190, 64, 65, 38,239,139, 90,180,125, 98,233,233, 57,138, 53,134,149,
+ 43, 87, 98,173,101,104,100,148, 31,252,224,110, 94,242,146,219,184,250,234, 10,187,118,239,167,125,122, 59,109,109, 45,204,155,
+ 63,155, 89,211, 59,153, 57,107, 26,194,193,177,158, 62, 78, 30,233,226,200,209, 99,180,180,182, 19, 38,134, 56, 49, 12, 30, 29,
+197, 24, 67,160, 61,170,213, 50, 90, 91, 2, 95,178, 98,249,162,236,156, 12,135, 53,114, 60,234,126, 50,168,167,145,224, 38, 61,
+160, 2, 80,181,205, 85,164,105,100, 34, 11,156, 16, 88,180, 2,146, 16, 92, 12,225, 32, 67,155,238,103,100,247,122,188,225,110,
+138, 46,196, 19, 14,227,107, 34,145,167, 44, 10,228,102,174, 36,183,232, 34,220,140,243,232, 53, 37,190,250,157,135,249,218, 15,
+127,194,201,177,152,170, 19,152,196,162,133,101,118, 41,224,198, 11,207,227, 93,111,121, 5,115,155,186,152,121,233,205,244, 14,
+ 30, 39, 60, 86,161, 20, 36,152,112,132,230,124, 66,207, 83, 27,153,191,248, 74,172,215,129,206, 23, 16, 50,139,128,148, 30, 85,
+ 45,120,226,192,113, 62,253,213,187,232,235,235, 99,120,176, 31,237, 73,130, 92,129, 5,179,166,243,146, 43, 46,230,182, 27, 46,
+160,205,203, 30,166, 86, 68,214,224, 41,141,113,150,196, 41, 66, 37,232, 30,130,143,124,250, 11,236, 57,118,146,158,190,211,120,
+104,140,113, 41,112, 11,193,156,142,102,110,125,209, 21,188,245,165,215,208,146,151,148, 45,236,220,123,136,200,228,176,206, 99,
+225,226,105,108,222,118,128, 47,127,251,110,158, 58,220, 67, 25, 65,108, 13, 45,158, 79,215,244, 54,222,241, 43,175,225,133, 23,
+204, 33,167, 53, 6,232, 75,224,155,247, 61,198,189,143,110,229,112, 79, 63,213, 40,149,140,148,144, 44, 89,182,148,151,222,242,
+ 18,156, 46, 80,173, 36,228, 60, 8,242, 57,170,206, 49,166,224,177, 39, 79,242,201,175,124,155, 3,199,123, 25,139,170, 68, 81,
+130, 39, 61, 60, 37,193, 69, 44,235,154,193,175,191,250, 37,220,112,201, 10, 10, 10, 14,247, 86, 57,112,188, 23,163, 60,132, 16,
+232, 82, 11,159,251,242,119,216,178,117, 43, 50, 26,228,230,155,175, 38,239, 11,132, 75, 40, 40,197,154,121, 29,252,227, 7,223,
+ 77,169, 84, 98, 94,179, 36,192, 32, 93, 76,161,232, 19,133,101,180,151, 67,106,201,149,107,150,211, 61,176,131, 74,104,241,208,
+ 28,236, 62,198,146,230,217, 72,255,105, 92, 3, 13, 68,183,150,153,144, 36,105,150, 68, 18,135,104,157, 30,244, 83, 5,190,242,
+224, 19,220,113,223,163,132,185, 54,202,213,152,156,159, 67,152, 8,107,199,197,124,237, 18, 30,222,218, 77,161,165,200,200,216,
+ 24, 75, 23, 47,224,194,243,230, 66, 50,130,197,199, 74,141, 76, 66,164,159,227,213, 55, 95,201,119,182,245, 97,132,100, 52,146,
+116, 31, 29, 96,245,220,118,202,210,144, 83, 5,254,225,174, 39,249,235,111,172, 99,168,191, 15, 89,204,163,173,100,112, 44,243,
+ 17, 58,139,203,210, 10,167, 92,234, 83,237, 23, 13,249, 14,135, 80, 18,227, 72, 21, 74,147, 39, 49, 1,127,244,167,191,207,191,
+125,225,243, 28,239,233,230,240,209, 62, 12,121,144, 69,162, 72, 17, 91,120,236,241, 3,172, 91,183, 14, 33, 28,115,230,204,225,
+150, 91,174,103,227,198,157,140,149,135,112,206,113,248,240, 17,194, 48,228,154,171, 46,229,242,203, 87,176,239,192, 16,119,223,
+125, 31, 67, 67, 33, 99,229, 42,198,230, 16,186, 5,235,224,129, 7,158, 96,195,227,219, 40, 21,138,204,156,217,198,139, 95,124,
+ 61, 79, 62,177,131,161,209, 17, 22, 45, 89,204,238, 61, 7, 80,186, 25,207,107,225,247,223,253,107, 72, 5, 54, 43, 86,245,208,
+ 67,219,216,188,113, 19, 5, 63,224,134, 27, 94, 68,199,244,105,108,216,248, 40, 47,189,233,122,132,131, 31, 62,184,158,246,206,
+217,204,156, 53,143,205,155, 54,224,170,101,246,236,221, 77,123,231, 76,222,244,230, 87, 48, 54, 10,235,215,111,102,203,134,109,
+105, 45, 20,227,129,128,175,223,241, 32,123,247,238, 69, 74,205, 11,214, 94,200,141, 55,174,101,251,174, 3,156,236, 29,226,174,
+187,183, 83, 42, 22,185,237, 85,191, 66, 98, 97,199,246, 3, 60,244,227,117, 84, 42, 21, 46,188,112, 45,215, 95,127, 9,247, 63,
+248, 4,113, 28,179,111,207, 94,108, 18,115,195, 13,215,178,122,205, 2,148,148, 36, 36,104,169,137,147, 24, 45,211,172, 0, 79,
+167, 21, 78,133,116, 88, 19, 35,133,199,169, 83,167,136,227,152, 69,139,151,146, 36, 17,163,163,163,124,247,187, 63,224,178,203,
+ 46,195,247, 60,110,186,233, 58, 86,175, 94, 77, 71,199, 52,180, 22,228, 2,178, 35,180, 13, 88, 71,215,220, 78, 94,246,210, 27,
+248,209,131,143,176,117,235, 14,140, 3, 47,200,211, 92,106,194,211, 62,249,124,158, 92,224, 99,147, 50, 35, 35, 39,153, 57,189,
+131, 40,142,240,148, 68, 42,125, 78,177, 80, 27,151, 32,148, 72, 79,169,170,249, 89,157, 32, 52, 2,169, 82, 70, 34,117, 38, 28,
+ 39,229,116,155, 61,185,135,254, 13,247, 49,218,189,147, 32, 26,162,168, 45, 94,226, 48, 54, 38, 22,130,138,167,169, 54,205,101,
+214,146,139,137,155,230, 18,229, 90,184,227,222,205,252,195,215,239,166, 44,155,168, 82,196, 33,145,158,162,234, 98, 14,148, 99,
+190,240,208,102,202, 78,242,103,191,113, 27,179,114, 51,153,126,222,181, 28,237, 31, 32,172,118, 83,240, 45, 81, 56,136,150, 5,
+250,247,111,163,173,121, 14,126,190, 0, 54, 68, 72, 67,197, 9,186,203,240, 79,119,220, 75, 84,141,241,133, 37,112, 1, 54, 52,
+140,134, 17, 7,135,143,177,101,255, 49, 30,219,181,143, 15,252,250, 43,241, 11,138,177, 56, 68,248, 16,155,144,208,198, 68,129,
+207,161, 17,199, 31,222,254, 25,182, 29,236, 33,172, 26,124, 5, 45, 5, 71,190, 73, 99, 8,232, 57, 93,102,231,169, 42,187,255,
+243,126,122,142,247,243,182, 55,223, 70,169, 25,222,253,145,207,112,178,236, 17,139,128,121,243,230,210,119,234, 36, 35,195,101,
+ 44,154,216, 89,208,121, 70, 43,112,170,251, 52, 31,253,215,175, 81,124,207,239,176,122, 94,192,104, 2, 31,252,228, 55,185,255,
+241, 39,136,172, 4,167,211, 28,241, 48,194, 57,203,201, 39,182,179,110,199,110, 98, 20, 94,224,131, 8, 25, 11, 35, 42,202,231,
+ 75, 15,236,229,246,207,253, 7,195,177, 36,142, 99, 58,138, 57,102,180, 6,248, 82, 48, 92,174,208, 87, 53, 60,118,224, 20,123,
+254,233, 43,188,243,215,222,200,171,174, 94,193,250,237,123,248,227,207,124,141,178, 42,224, 35,209, 90, 49, 52, 58, 74, 94,121,
+ 20,133,162, 50, 18, 83,201, 65, 46,159, 22,229,105,213,142,139,186,166, 99,172,195,154, 16, 45, 29, 57, 95, 34,136, 9,124,133,
+148,146, 2,208, 90, 42, 98, 13, 40, 63,192, 79,210, 2, 10,137,149,196,137, 37, 80, 26,215, 16,125, 80, 47,249,154,157, 41,224,
+ 12,104,173,136, 99,144,190, 72,125, 73,158, 6, 19, 17, 41,159,173,199,225, 47, 63,253, 29,134,241, 65, 41,140,239, 83, 49, 33,
+158,240,144,210,195,224, 97, 4, 40, 11, 5, 91,161,172, 75,248, 84,105, 82, 21,114, 46, 6,233, 48, 34, 72,162,223, 73, 35, 0,
+ 0, 32, 0, 73, 68, 65, 84, 43,210,249, 62, 6, 73,135, 27,166, 67,142, 49, 68, 9,172,135,137,210, 44,252,246,124,192,219, 63,
+119, 47,159,189,123, 27, 31,126,227, 5,188,226,178,215, 17, 59,195,154,119,255, 27,158,159,230,197, 75,233,176,206, 77, 9,239,
+ 83,237, 23,236, 83, 31, 23,137,147,172,146,164,231,165, 5,191,164,242,217,179,251, 48, 99, 99, 21,180,239, 49,115,246, 44, 14,
+ 31, 58,130,211,128,214,220,241,205,245,252,224,206, 31,210,218,218,142,194,177,115,215, 81, 78,246,134,148,203, 85,246,236,217,
+ 3,164,209,213,142,132,109,219,246, 49,103,238,159,243, 55, 31,251, 2,131,195, 35, 44, 91,182,136,114, 53, 33, 54,146,106, 69,
+241,181,175,109,229,158,123,238,161,179,115, 26,189, 39,134,217,180,105, 23,167, 7, 44, 3, 3,253,236,218,181, 3,165, 60,162,
+ 56,225,250, 95,186,137,176,154,176,115,103, 25, 72,112,210,209,115,226, 56,223,252,214, 93,188,234,149,175,196, 84, 35, 62,246,
+209,207,240,107,111,253, 53,190,250,213,187,121,217, 75,175,199, 56,216,176,105, 23, 43, 87,230,113,182,149,175,126,229,251,220,
+118,203,181, 92,113,213,213,124,225,223,239, 96,206,252,149, 28,216,127,136,238,238,110,110,123,249,203,217,187,119, 55,222,206,
+237, 36, 6, 6,135,203,220,120,211,173, 88,163,248,220,191,252, 43, 58,223,130, 85, 30,113, 98,177, 22,154,219, 58,249,226,151,
+254,131, 43,174,188,152,143,223,254,105, 94,247,154,219,240,115, 5,238,248,198,119,113,170,141, 77, 27,247,112,226,228, 81,222,
+244,134, 87,178, 99,219, 79,249,242,151,190,206,199, 62,254, 94, 76,156,166,169, 25, 12,158,246,210,115, 43,164,196,154, 84, 65,
+148, 74, 32,149,160, 90, 25, 97,104,184,159,165,203, 86,146, 24, 75,185, 28,113,255,253, 15,178, 98,197, 10,230,205,155,147,166,
+ 27,106, 88,208,213, 81,143,115,168, 17,107,147,164,241, 63,198, 89,140, 25, 99,201,162, 57,120,158,199,192,192, 40,126, 46,143,
+ 69, 82, 42, 53, 83, 40, 20,104,110, 46,209, 84, 12,104,110,202,177,255,224, 17,214,174, 89,150, 22, 76, 35, 78, 85,117,188, 51,
+214,142,182, 98,188,128, 71, 26, 45, 46, 16, 66,226,213, 34,151,173, 65,145,160,108,152,202,152,123, 55,115,100,203,143, 40, 14,
+ 31,163, 88, 57, 73,209,211, 72, 19,167,197, 65,100, 90,118, 48,118,160,219,231, 66,203, 92,130,214, 25,236, 60, 57,198,103,238,
+248, 62,229,220, 52, 70,171,224,148, 95, 47, 72,131, 82, 24,169, 9,165,230,174,199,182,243,178,171, 47,224,197,203, 59,240, 23,
+159,143,183,107, 19,241,145,163, 40, 28,158,176,228,136, 25,233, 59, 70, 91,101, 16,213, 58, 11,107, 83,255,178,139, 19, 76,224,
+ 17,153,132,206,230,128,181,203, 23,209, 89,204,115,232,232, 49, 54, 31, 56, 74, 36, 60, 6, 98,195, 93,143, 61,193,244,150, 2,
+111,120,195, 75,193,203,167,149,109,165,196,250, 1, 67, 6, 62,241,207,255,194,214,253, 61,148,173, 71, 62,200,241,242,155,174,
+227,218,139, 23,211,156,247, 24, 46, 59,190,243,163,117,220,179,101, 47,163, 54,228, 27, 15,109,100,214,226,101,252,242, 77,231,
+209, 31, 9, 6, 69,137,200, 41,134, 15, 28,163, 37, 39,184,120,245,114, 22,116,205,103,180, 60,198,186,173,219, 56, 50, 88, 5,
+ 47,199,238, 19,253,252,248,137, 93,204,156,190,150,127,252,236, 29,220,253,248, 78,134,140, 79, 73, 75,242, 56, 86,173, 92, 70,
+215,172,153, 12,143, 12,176,125,247, 62,250,198, 12, 33,130,216, 65,130,193, 74,143, 19,195, 9,255,126,231, 3,156, 74, 2,140,
+ 14, 40,248,142,215,188,226,151,184,116,205, 10,156,177,244, 14, 13,243,149,187, 31, 96,243,174,221,152, 40,224,243,223,190,159,
+ 11,151, 45,162,191,154,208,107, 52, 85, 85,192,119, 6, 85,174,210, 18,104,206, 95, 52,143,217,249,249,120,164, 32, 44,100,234,
+209, 54,113, 68, 65, 6, 24,225, 80,197,194,120,148,128,137, 65,165,113, 13, 9,112,106, 96,144, 56,206, 82,227,146,152,174, 57,
+115, 51,151,142,110,240,101,141,151, 31,182,153,187, 34, 13,246, 72, 15,222,213, 94, 42, 3,106, 15,156,240,168, 40,216,123,202,
+240,246,247,127,156, 49,124,138, 18,102,207,158,206,174,195, 39,209,158,135, 11, 99,156, 73, 83, 54,164, 3, 33, 45,151,204,109,
+134,112, 12,209,220,193,206,131,189, 60,113,240, 20, 47, 94, 61, 15, 25,149, 17,202, 79, 11, 32,105,159,159,118, 15,114, 42,241,
+208,190, 79,179,111,152,223, 57, 29,128,221,125,131,124,246,158,157,124,224,214,139,248,195, 87, 93,207,152,131,162,132,130, 53,
+ 84,101, 42,148,142, 57, 77,209, 85, 49, 50,199, 84,200,220, 84,123,126, 0,253,220,158, 93,137, 66,169, 52, 27,200, 36, 9,113,
+ 84,197,243, 60,190,247,221,111, 18,219, 10,206,193,177,227,125,105, 16,112, 18,131,244,120,240,161,117, 36, 70,113,213, 85,215,
+131,139,185,243,206, 59,217,184,249,167,172, 89,189,150,106, 40,120,219,219,222,206, 5, 23,182,243, 23,127,249, 57, 78,156, 56,
+193,147, 59,143, 49, 48, 80,229,202,107,174,229,237,191,117, 13,247,222,183,139, 47,127,249,235, 4,126, 19,247,221,251, 19,146,
+ 68,115,225, 5,151, 34, 21,220,249,253,251,248,241, 35,155, 56,127,245, 42,164,202,113,219,109,183,176, 98,197, 50,122,251, 6,
+248,241,143, 28,247,221,127, 39,214,198, 68, 38, 45,142,114,221,117,215,113,227, 13,203, 48, 9, 60,190,113, 43,187,247, 30, 5,
+145, 35,138, 83,247, 64, 98, 20, 66,230,113, 46, 0, 20,183,189,226, 38,132,132,135, 31,217,198,232, 72,200,230, 45, 79,242,154,
+215,190,130,213, 47,152,129,159, 83,252,224,158,251, 16, 18, 46,185,244, 42,118,237,120,138,131, 7,142,162,148,102,100,100,132,
+ 37,203,150,130, 53,188,236,150,213,108,223, 17, 82, 9, 19,214,173,223,201,156, 57,139,120,241,139,175,196, 10,232, 63, 29,242,
+232,186,205,248,202,227,230, 95,122, 49, 23, 93,180,128, 98,222,231,161, 7,126, 2,164,125,170,135,241, 58,139, 68,100,149, 60,
+189, 44, 13, 55,205,231,217,183,111, 31,115,231,117, 33, 4,132,213,132, 31,222,255, 32, 77,165, 22, 22, 44, 88, 68, 18, 70, 76,
+155, 86, 76, 9,138, 19,105,217,216,204, 77,160, 84,154, 66,232, 28,140, 12, 13, 51, 58, 60,192,138, 21,139, 88,117,222, 26,246,
+ 31, 60, 73,169,169,141,106, 24, 82,137, 66,134,134,134, 8,195,144,161,225,211,216,195, 21, 58,166, 53,115,244,216, 9,102,205,
+106, 35, 80,100,199, 73,159, 77,126, 71,165,149,185,107, 14,225,236,204,116, 37, 44,214, 24,180, 82, 16, 87, 33,233,199,110,251,
+ 49,199,182, 62, 72, 48,214,139,136,199,104,245, 4,196, 9,214, 25,132,116, 8, 9, 57, 96,204,129,215, 52,141,196, 47, 32, 80,
+ 60,182, 97, 3,131,145, 96, 4,192, 87, 96, 19,172, 17,105, 14,123, 28,165,145,140,170, 64,217, 56, 30,216,176,137,203,150,189,
+152, 25,126, 30,127,198, 44,226,147, 5, 76, 52,138,146, 30,213,177, 81,108,229, 52, 34, 26,166, 82,137,208,170, 64, 92,141,201,
+229, 74,168,104,148, 85,243,166,241,190, 95,189,141,165, 51, 91,105,246, 52,137,242,248,238, 35, 91,249,212,127,126,159,227,113,
+ 66, 28,228,249,246,143,183,176,230,234,151, 16,225,227,108, 90, 92, 38,198,231,169,227, 99,172,219,182,143, 72, 55,227, 73,197,
+154, 37,139,185,225,234, 43,233, 44, 26, 90,138,138, 89, 10,222, 50,253, 22,214,237,249, 28,161,149,140, 38,240,192,166, 29, 92,
+115,237,121,228,115, 69,170,167, 43, 8,161,152,153, 51,252,206, 27,111,229,133,231, 47,166,181, 24,224,132,199,166,171, 86,243,
+238,127,248,119, 78,140,134,128,226,169,195, 61, 60,121,104, 41,143, 63,185,135,178, 85,228, 60,159, 78, 85,229,119,127,229,213,
+ 92,123,241, 42,124, 34, 20,240,212,177, 83,188,255,147, 95,230,240,144, 69, 75, 31, 37, 37, 65,177,157,135, 30,125,156,131, 61,
+ 39,137, 69,128,112,134, 75, 47, 57,159, 43, 47, 93, 69,123, 94,211,220, 12,157,213, 60,175,205,189,140, 61,135, 14, 51, 24,194,
+129,147, 67,220,245,200,227,116,118,118,162, 60,137,173, 14, 19,105,195,220, 86,143,119,189,242,102,126,233,162, 85, 20,176, 52,
+123,105,158,126, 98,211, 92, 88, 47, 40,101, 65,249, 38, 61, 61, 79, 72,140,117,160,242,144,105, 59, 9,176,121,251, 83,120,158,
+135,115, 48,123, 90, 11,109,165, 28,158, 20,227,117,165, 39, 49, 15,199,248, 1, 45, 66, 26,112, 85,132,203, 17,232,212,217, 85,
+ 5, 14,197,240,174,191,251, 23,122,171, 49,121,165,185,104, 70, 19,239,248,173, 55,240,198, 63,248, 40,177,145,120,210,225, 73,
+131, 71,146, 6, 30, 74,199,165, 23, 47,103,213,220,199,216, 61,168,144,194,227,119, 63,249,125,126,240, 23,111,102, 89, 71,192,
+168, 83,148,146,126, 70,163, 86,190,182,177, 59,149,160, 42,125,188,248,202,229,180, 53,165,253,218,119,180, 23,170,163, 44,158,
+215, 14, 98,152,162,104,102,223,177, 94,202,158, 71, 83,232,192,149,201, 17,164,135,237, 76, 81,245,169,246, 60, 52,113, 46,183,
+ 84,118,106,161,179,227,126,112,107, 99,242, 5, 73,165, 58,204,151,255,227,253,252,240,129,195,124,233, 75,223,226,203, 95,248,
+ 22,175,126,205, 45,228,189, 34,149, 48, 97,180, 28, 98, 81,236, 63,116, 16,220, 24, 43,215, 44, 70, 73,159, 40, 42, 35,149,163,
+173,189,153,150,102,232,156,222,204,137, 19, 39, 40, 87, 66,164, 39,233, 90, 52, 7, 43, 33,182, 21, 60, 47, 32,142, 19, 70, 70,
+ 70, 16,194,113,164,231, 32,137,137, 56,255,194, 21, 36, 49, 36,177,192, 10, 88,186,172,147,165,203, 3,146, 56,143,148, 17,239,
+249,253,215, 18,134,224, 7,240,145,191,249, 60,185, 98,130,203,234,105,228, 75, 62,198, 24,180, 23,160, 60, 8, 19,240, 60, 69,
+ 24, 86,240,188,180,246, 9,170, 86,165,210,224,233, 60,163,163,101, 58, 58, 58, 82, 99, 95,134, 88, 52, 27, 55, 12,242, 79,127,
+119, 59,183,189,252,101,220,114,235, 75,184,227,142,255, 68,137, 4,173, 28,206, 84,144, 14,148,115,248,194, 67, 57, 73, 75,177,
+169,158, 2,214, 92, 42,161,132,192,154, 8,103,195,212,165,236,170,120, 74, 32, 44,196,198,225,121,153,158,104, 65,168, 84, 29,
+105,204,221,183, 86, 96,157, 34,159,111,162, 90, 49,108,218,188,149,114,185,202,139, 94,116, 3, 82, 58, 90, 90,139, 41,225,204,
+138,192, 36,177,197,243,130,212, 45,145,197, 35,196,137,201,228,251,144,150,230, 34, 3,167, 44,167, 79,157,102,207,158,180,166,
+134,149, 73,166, 16,200,180,122, 94,104, 80,162, 76, 84,237,166,179, 99, 26, 82, 26, 60, 33,207, 5,234, 2,235, 82,127,177, 32,
+171, 86,100,226, 52,109,203, 69, 16,134, 48,122,156,211,143,223,205,233,125,155,105,141, 7,200,187, 50,218,147,152,196,129, 83,
+ 72, 93, 0, 89, 33, 73,170,104,149, 21, 18,241,125,116, 80, 66,248, 1, 3, 67, 67,132,198,165,145, 90,217,168,124,161, 9,171,
+ 21,124, 95,101,135,182, 56,194, 40,100,112,112, 16,147,158,180,130, 95,106,166, 42,210,122,228, 54,137,201,249,154,177,177,126,
+194,209, 1, 92,123, 12,164,229, 2,141,141,104,203, 41,110,187,254, 10, 86,205,105,101, 86,222,225,185, 52, 82,228,245, 55, 95,
+192,182, 93,123,248,214,134,157,140, 70, 14, 95,195,147,251, 15,225, 5, 57,180,202,162,167,133, 98,111,247,113, 18, 89, 32,182,
+105, 64,196,177, 99,199,249,228,167, 62, 77,123, 9,226,234, 24,190,159, 99, 40,214, 8, 99,144, 54, 33, 52, 9, 71, 78,158,228,
+ 68, 95, 90,121, 78,249, 30,210, 26, 46, 93,181,148, 23,174, 93,198,188,102, 65, 78,134, 72, 95,114,209,242,217, 44,154, 51,139,
+211,251,123,176, 73, 66,136, 98,119,247,113,122,135, 43, 56, 85,194,132,101,110,188,225, 18,174, 89,179,136,233, 58,162,228,129,
+246, 4, 29,211,102,243,214, 55,188,154,191,252,231,175, 96,240, 9,163, 24, 33, 61,158, 58,112,132,208,128, 83, 10,225, 44,123,
+158,122,138,127,252,167,167,104, 10, 4, 81,162,112, 50, 96,212,130,139, 35,148,240,137,147,132,125,135,123, 80,185, 38,156,245,
+240,114, 10,101,203, 92,117,225, 26,174,121,193, 98,166,251, 9, 77,249, 2, 66, 56,180, 39,145, 66,146,184, 52,128, 69, 9,144,
+ 94, 90, 6, 56, 13,223,207,170, 86,217,212,111,182,253,152,225,112,239, 32,137,110,161, 32,225,226, 53, 43, 41,105,155, 6, 87,
+158,237, 32,151,115,236,108, 73, 28,163,180, 71,236, 4, 21, 9,127,246,137,239,176,245,192, 9,180,146,180,170,136,223,122,195,
+173, 76,247, 33,175, 29,214, 58,156, 73, 80,214,166,233,114, 2,156, 16,180, 6,154,247,191,250,114,126,245,111,127,136,107,110,
+231,192,233, 65,110,126,255,191,240,135,175,187,142,183,223,184, 22,188, 25,124,240,142,159,178,101,239, 49,114, 77, 57,242,218,
+242,123,175,188, 62, 11,206,243,120,201,218,197,172, 61,111, 49,111,255,226,102,142,246, 85,232,143, 3, 62,123,239,189,180, 5,
+179,248,214,129,227,252,145, 45,224, 39, 9,129, 39, 39,157,154, 55,213,166,218, 47, 0,229,107,178, 45,105, 64,152,112,134,176,
+ 58, 66, 33,223,204,142,237,195, 28,237,222, 15, 73, 68,115, 83,137, 66, 62, 32, 10,199, 40,248,154,133, 93,115,217,191,175,155,
+166, 98,192,181, 47,188,142,190, 83,199,217,185,243, 41, 42, 46, 36,240, 28, 90,197,196,177, 70,201, 8, 41, 29, 77,205,121,172,
+ 11,121,224, 71,247, 50,191,235,181,236,222,245, 20, 38,137,208, 10, 22, 45,154, 73,119,247, 65, 10,249,128,171,175,190,129,222,
+222, 94,118,238,220,135, 81, 18, 19, 87,113, 84,241, 84, 74, 2,181, 76,203,120,231,114,233,129,203,237,109, 69,246,237,221, 5,
+238,106,170, 85, 56,112, 96, 31,215,188,112, 62,149,234, 8, 99, 99, 41,184,245,247,159,102,229, 74,143, 48, 42, 19, 4,105,104,
+188,115, 41,216, 39, 73,196,204,153,211, 57,120,240, 0,107,214, 92, 72,121,116, 12, 99, 98,250,250, 78,178, 98,197, 10, 94,251,
+218, 75, 25, 29, 5, 33, 19,172,173, 16,120, 62,213,106, 57, 13,183,141,202, 72, 97, 41, 21,242, 28, 62,124,136, 74, 5, 60, 31,
+ 54,109, 92,207,188,249,139,233, 59,217, 75, 98,170,105, 86,151, 74, 21,102, 33, 64,214, 79, 6, 21,245,115, 64,210,131,173,210,
+ 2, 88, 90, 75,202,229, 42,125,125,253, 28, 60,116, 47,109,109, 29, 28, 63,126,130, 75, 46,185, 4, 99, 12,109,109, 77,169, 1,
+160,108,189,100,121, 90,198,215, 97, 13,120,158, 32,138, 44, 39,123,123,136,227,152, 85,231,157, 79,185,108,216,188,249,167, 12,
+ 12, 84, 48, 66, 32,149, 68, 40, 85, 79,207,147, 66,161, 3,143, 56,118,236, 63,112,132,181, 23,172, 34,159,203,147, 16,115,182,
+132,189,212, 91, 46,210, 0, 32,132, 35, 49,105,244, 31, 34,171,139,222,191,135, 19, 15,221, 73,216,187,159, 22, 55,134,231, 98,
+132, 80,148, 13, 8, 29,160,188, 2,213,112, 12, 79,136, 52, 47, 81,164,190,248, 48, 54,228, 69,170, 88,116,182, 79, 67, 38, 89,
+253, 85,153,158,127, 30, 87,171, 20,242,121,202,233, 47, 20, 2, 69, 62,169, 48,163, 24,224,197, 17,184, 8,146, 52, 10,209, 56,
+139,214, 10, 79, 43,180,141, 9,135,250, 9, 60, 69,146,196, 36,194, 97,133, 37,239, 37, 44,237,154, 65, 62,167,201,229, 20,129,
+148, 24, 1, 5, 96,233,162,249,232, 45,123,144, 70, 17,155, 42, 39, 79, 30, 39, 14,171, 96, 18,148,116, 8, 18,202,229, 50,198,
+ 41,164,151,195, 90,199,169,145,144,211, 35,195, 56, 51, 66, 78, 75, 92, 28,129,246,235,210,181,175, 12,213,145,126,162, 56,162,
+ 92,141, 16, 34, 64,226, 88, 50,127, 14, 77,249, 28,202,135, 32, 40,164, 15, 21,200, 7, 30,202,165,114,177,242, 61, 78,158, 30,
+196, 42, 31,151, 24,218,138, 57, 86, 45,158, 79, 83, 78,210,148,211, 52,229, 36,145,117,120, 2, 94,116,241, 66, 62,161, 98,170,
+113,153,124, 46, 32,113,112,122,112, 4, 99, 37,210,211,184,176,194,192,224, 40,229,161, 16, 27, 85,113, 86, 18, 4,121,198,170,
+ 21,148,214, 20, 68,130,150,134, 83,189,167, 88,176,240, 60,226, 80,227, 21,138,120, 81,200,202,185, 11,104, 45,228, 41,229, 32,
+151,243, 51, 54, 94,203,141, 77, 23,187,161,118, 58, 80, 38, 67,101, 7,187,104,161, 24,115,240, 31,223,185,143, 56,215, 76, 78,
+121,184,209, 62,110,185,254, 74, 2, 91,165,232, 21, 82, 75,178, 17,252,156, 64,138,122,157, 35,210,148, 73, 31,129, 64,251,146,
+136,180,216,206, 31,127,226, 78,238, 93,191, 29,167, 61, 74,241,105, 62,242,190,119,178,114,102, 27, 20,129, 36, 66, 74, 31, 63,
+171, 24, 40,132,200,206, 97,151, 40,147,240,166, 43, 86,209,243,250, 83,188,239,107, 63, 69,181,119,112, 98,172,151,119,126,250,
+ 30,238,219,180,135, 37,139,230,242,175,223,222, 64, 16, 20,168, 14, 12,241,185,247,190,156,133,157,173,152,120, 20,229,121,152,
+106,149,135, 63,244, 42,222,249,217, 31,240,237, 77, 91,153,217,217,201,198, 63,121, 19, 85, 17,242,155,159,221,192,238, 61,123,
+185,120,197,146, 44, 47,216, 77, 56, 76,102,170, 77,181,231,213,175, 94,171,237,224, 68, 22, 13, 46, 16,194, 81,200,105,162,184,
+194, 71,254,250,195,248,129, 66, 41,203,255,247,166, 87, 51,208,127,138, 64, 27,132, 29,227,215,223,252, 42, 62,251,153,127, 99,
+227,186,135,216,186, 97, 61,113, 28,211,210,210,204,156,185, 51,176,102, 24,103,134,201,251,121, 92, 82,197,217, 81,138, 69,193,
+210, 37,243, 57,116,232, 16, 31,253,171,219,201,231,243,120,194,129, 29,230,215,127,245,229,124,234, 83,159, 98,227, 99,143,179,
+101,195, 86,140, 77, 40,148, 74, 44,152,183, 16, 79, 91,180, 20,105,244, 56, 96,195, 56, 53,254,133, 65, 8,205,171, 95,249, 74,
+254,252, 47, 62,198, 31,188,247, 99,140,142, 84, 89,186,108, 41,183,220,122, 5,143, 60,122, 23,127,254,161,191, 39,142,108, 90,
+ 61, 45,174,226,121,134,176, 58,132, 34, 59,240, 83,132, 72, 25,241,203, 55, 95,199, 23,190,244, 69, 14,236,221,195, 83,123,118,
+ 17,104,195,154, 85, 11,248,206, 55,255,147, 15,125,232, 95,233,237, 59, 14, 34,194,211, 43,152, 59,103, 6,251,246, 31,230,163,
+ 31,251, 50,171,207, 91,141,246, 44,215,189,168,139, 77, 91,230,241,187,191,247, 39,180,181,183, 96, 76,196,255,185,233, 45,124,
+233,223,191, 90, 79,135,211, 66,214, 75,239,214,170,116, 70, 81,130,239,231, 82,182,238,210, 66, 60, 90,167,233,127, 39,122,143,
+ 51,115,246, 12,142,247,164,198, 69, 53,138, 56, 61, 52,192,210,229, 11,234, 6, 0, 78, 97, 77,234,114, 20, 66,160,132, 70,121,
+ 41, 67, 31, 28,234,199, 57,195,140, 89, 51,177, 8,118,239, 62,204,192,192, 24, 78,248, 4,129, 79, 24, 87,178,131,108,162,250,
+ 33,100,158,244,168, 68, 85,202,229,144,227, 61,167,104,111,235,202,234,167,158, 37, 79,189, 86, 58, 87,146, 30,227,167,165, 73,
+153,203, 72, 47,246,224, 54,142,109,184,151, 92,165,143,230,120, 24,233, 18,132,150,140,185, 28, 81,169,149,182,105,179,200, 5,
+ 62, 35, 7,118,131, 77,125,234,113, 28,167,150, 79, 84,198, 79,210,156,197,107, 46,191,152, 69,119,175,227,169, 83,163,196, 58,
+ 7, 66, 35, 61, 73, 37, 10, 65,105,164,231, 97, 43,167,153, 81,244,184,254,138,139,241,227, 50,232,136,104,224, 4, 90,216, 44,
+157,192, 18,197, 9, 46, 47,209,129, 79, 24, 86, 50,210,104,113,194, 17, 35, 24,173,134, 40,237, 17,217,244, 84,175,154, 23,119,
+180, 26, 18, 27,139,115, 18, 65, 66, 75, 41, 79,239,169,211, 40,178, 35, 90, 19, 67, 83,224,163,133,161,146,132,104, 21,176,120,
+ 97, 23,171,151,205, 71,203, 10, 62, 6,149, 88,164,239, 19,233,128, 48,172, 80,148, 6, 95, 88, 74, 90,224, 7, 26, 51,106,240,
+133, 67,216,132,156, 18,120,222,248,121,238,190, 74,243,220,147, 36,193,147,130,106, 37, 34, 63,167,152,254,174,114, 84, 43, 85,
+ 78,143,142,224, 23, 2,164,159,246,187, 86,250,113,120, 4, 34,147, 32,132, 79, 20, 69, 56,103,104,111,107, 65,136, 94,146, 36,
+161,152,203,113,209,234,165, 44,232, 40,225,147,160,132, 38,177, 14,229,231, 49, 54, 1, 83, 70,153,152,153,237,237, 24, 79,161,
+165, 34,170,134, 20,148, 34,231,105,124,169,211, 34, 19, 89, 64,142,204,172, 60, 95,137,236, 72,214,148, 50, 24, 39,145, 82,225,
+ 92,132, 16, 62, 85, 1, 59,143, 84,185,235, 39, 27, 9,117, 30, 89, 25,226,165, 87,173,101,209,236, 86, 90, 60, 67, 92,173,224,
+ 21,243, 13,172, 35,205,163, 19,147,150,161, 64, 17,167,181, 93, 25, 5,190,241,240, 1,238,252,201, 70,180, 46,162,109,153,119,
+188,225, 54, 86,207,105,163,217, 87, 84,178,231, 45,132, 32, 10, 35,124, 63,151, 6, 14, 73,151,158,180, 46, 64,197,101,222,251,
+234,107,153, 55,163,153,223,252,151, 31, 82,206, 79,195,247, 44,223,223,118, 10,251,196, 9,154,253, 2, 29, 69,201, 71,127,251,
+165,188,233,242,149, 36,137, 3,165, 83, 23, 80, 80, 32,239, 28,159,127,215,109,212,170,252,153,244,184, 35, 54,125,124,105, 90,
+235,199, 89,164, 74,171, 37, 78, 81,245,169,246,220, 90, 22, 87,242, 52, 69,172,156,115,104, 37, 49, 22, 22, 46,152,199,187,223,
+253,219, 32, 60,164, 74, 72, 76,200,162,133,115,104, 46, 66, 95,191, 99,233,226,233,204,154,219, 65,123,123,142,143,127,244, 29,
+ 28, 62, 52,202,240, 80,132,214, 30,203,151, 55,209,125,100,140,242,216, 13,116, 45,152,129, 0,222,248,186,219,184,245,229, 17,
+243,230,207,228,178,139,223,204,246,237, 39, 9,188, 2,173,173, 77,244,247,158, 98,230,172,118, 58,103, 72, 62,254,209, 63,224,
+232,209,144,193,193, 81,180,150, 44, 95,217,198,145,238,132,145,145, 43, 89,208, 53, 29, 45, 96, 97, 87, 59, 31,248,227,247,164,
+234, 92,150,108,222,218,226,243,247,183,255, 49,219,159, 60, 78,169, 84, 98,206,252, 38,132,130,143,127,236, 47, 56,114,176,151,
+233,157,211, 25, 30, 25,166,181,181,153, 32, 7,127,242,193,247,166, 32, 43,225,213,175,122, 25,165,166,118,166, 77,211, 44, 91,
+242, 65, 78,159, 30,226,237,191,249,122, 14, 28, 60,196,130, 5, 1,183,127,252, 79, 57,118,252, 20,157,211,167, 49, 58,118,154,
+214,230,128,105,211,138,252,195,223,127,156,158,227,167, 88,180,176,147,133, 11, 59, 65,194,239,191,247,205, 28, 62, 82,225,244,
+233,211, 92,176,118, 54,198,192,107, 95,247,114, 10,249, 60, 66,192,252,249,115,121,239,251,222, 89,247, 62,215, 0,221, 24,131,
+ 68,165,233,110,164, 37,107,195,204, 93,188,108,233, 10,230, 47, 88, 66, 88,141,152, 59,119, 46,195,131,131, 41,160,171, 90,105,
+ 91,129, 84, 41,143,118,134,122, 14,222,232,232, 48,195,195,131,104,173,105,110,106,165,183,127,140, 3,135,142,165,217, 57, 66,
+ 83, 13, 67,132, 39, 17,194,166, 69,118,172, 72,139, 13, 57, 65, 79,207, 81,186,186,102,208,219,219,203,234, 85, 93,231, 60,161,
+ 83, 91,145, 50,245,196,105, 60, 98,176, 33,132, 39,169,108,248, 22, 67,123, 54, 81,168, 14,146,151, 14,165, 45,149, 56, 97,204,
+ 21,168,148,102,224, 47,186,130,220,252,133,216,158,167,136,213, 97, 2, 10,216,172,172, 96, 18, 69,184,129, 30, 84,229, 20,152,
+ 14,186, 58,155,249,237,215,191,132,191,250,204, 87, 25,116,142,145, 68, 98, 85,128, 83, 18, 76,140,239, 28, 37, 97,184,254,202,
+139, 88, 50,103, 58, 45,193, 24, 12, 31, 99,248,200, 78, 74,113,136, 20,169, 21,101,117,128,213, 5,100,174, 37, 61, 85,200, 26,
+ 60, 1, 85,231,232,173, 38, 60,178, 99, 63,215,156,191, 0,161, 36,161,133, 68,166,204,239,225,173,187,176, 34, 32,144,130, 92,
+ 2,115, 59,166,177,111,223, 33,180,144, 84, 93, 90,162,101,193,140,118,252,120,132,160,224, 19, 69,163, 44,234,108,225,205, 55,
+ 93, 78,123, 46,100, 90, 73, 19, 86, 29, 85, 52, 91, 14, 30,103,245,121,179, 40,141,166,105, 14,195, 10, 92, 20,162, 84, 33, 53,
+140, 76,132, 38, 65, 59,145,214, 34,183, 18, 95, 42, 92, 98, 80,202,195, 9, 71, 98, 45,179, 59, 90, 41,120,130,209, 48, 65, 4,
+ 5, 30,218,180,131, 95,190,225, 42,138,121,234,192, 23, 2,159,255,246,157,140,233, 34, 97,172, 40, 72,131, 22, 9,243,231, 76,
+ 71,203,125,196,153,187,100,238,244, 86,222,254,210,171,153,230, 25, 28,146, 16, 65,127,146, 6,102,116,228,161,232, 67, 20, 89,
+238, 90,255, 83,148, 24, 65,233, 28, 97, 82, 65,104,133, 84, 65, 26, 12,169, 64,169,244,148,189,172,178,116, 42,227,100,234, 2,
+ 34,181, 82,165,147,196, 2,250,128, 63,253,228, 23,168,200, 28, 24,203,140,162,226,181, 55, 95, 75,158, 16, 79, 64,161, 88,204,
+ 78, 84,163,225,200,218,134,163,107,157,203,246,180, 4, 41, 53, 35,192,250,189,131,252,229, 63,127,129,114, 34,104,146, 35,188,
+229,149, 55,114,235,213,107, 41,169, 42, 77,185, 22, 98, 1, 82,106,162,196,210,164,189,241,243,147, 77,106, 97, 27, 87, 5,207,
+ 99,221,254, 33, 62,250,189, 61,132, 65, 7,206,140, 16,133, 6,103, 37,186,169,128,169, 86,169, 84,243, 20, 11,157, 56,151,160,
+204, 8,161,200,103, 85, 2, 83, 63,166, 49, 14,135,194, 9,149, 62, 83,192,216, 4, 41, 92,250, 69,178,226, 28, 14,209,169, 54,
+213,126, 30, 96, 63, 35,216,164, 94,175,187, 86,161, 77, 74, 40, 53, 9, 86,191,160,115,194,218, 83, 89,168,202,244, 14,193,244,
+142,185, 89,172,135,197, 34, 89,176,176, 52,193, 79, 63,111,126, 17, 95, 21,211,131,160, 28, 44, 92,216,129, 67,144,216, 20, 72,
+207, 95, 51, 3,157, 93,122,238,140,142,250,119, 53,208,176,168, 43,192,118, 5,245, 74,117, 93,243, 53, 74,205, 68,101,229,106,
+ 11, 5, 88,181,106, 54,182,150,217,238, 82, 97,214, 89, 88,189,102,214,132,106,119, 45, 37,104, 62,111, 58, 74, 65,199,244,230,
+116,140, 6, 86,175,156,159, 25, 50,176,112,193,244,250,215,107,126, 87,145,174, 5, 69, 0,206, 95,189, 0, 99, 97, 90, 7,180,
+182,117,224,128,153, 51,218,145,153,202,216,209, 33,232,236,232, 68, 0,171, 86,207,206,206,155, 23,204,239,202, 51,191, 43,159,
+238,173, 2, 22,118,181,212, 79, 66, 43,150, 52,171,215,116,213,207,118,240, 60, 47,221, 83, 82, 93, 30,178,125, 86, 41,197, 96,
+223, 0,109,109,109,233,193,100, 21,203,216, 88,133,177, 74, 21,131,165, 82, 41,211, 84, 42,164, 85, 39, 93,237, 96, 44,133,181,
+ 73, 70,208, 6, 25, 28, 26,194, 90,203,252, 5, 11, 25, 30, 9,121,228,177, 13,196,214, 3, 41,136,108,140,210, 2,227, 76, 86,
+ 7, 67,226,156, 65, 42,205,208, 64, 63,109,237,205,228,114, 30,203,151, 47,169, 27,124,103,203,171,213,178,118,218, 23, 54,149,
+188,199, 78,112,242,209,239, 98,246, 63, 70, 49,236,195,195, 98, 35, 71,132, 34,201,181, 17, 21,103,209,178,248, 18,212,130, 75,
+ 48,197, 34, 74, 25, 42, 79,110, 34,103, 5, 57,169,112,113, 76, 33,128,209,129, 35, 68,221, 59,240,219,103,208, 18, 20,185,229,
+138,149, 36,209, 43,249,247,239,221,207,225,129, 17, 70,179,114,172, 5,207,103, 86,107,145, 27, 46,189,152,215,222,112, 9,109,
+ 98, 24,226,211, 36, 59, 30, 37, 31,158, 74,207,114, 7, 16, 30, 86, 7,120,205, 51, 48,186,136,149, 30, 2, 69, 18,197, 80, 40,
+146, 72,197,119,126,244, 40,109,210,113,221,218, 85, 76,107,153, 70,119,223, 32, 95,188,235,126,158,234,238,197, 26,141,118, 17,
+231, 47,155,199,170, 69,115,120,116,195, 22,162,196, 34,253, 0,233, 44,139,103,181,179,118,201,108, 30,217,223, 71, 33, 40,242,
+196, 19, 91,249,241,156, 86,110,184,114, 41,224, 81, 45, 59,190,123,207,143,184,235,209,199,184,108,237, 26,126,245,198, 43, 88,
+185,116, 49, 86, 66,193,207, 97,134, 98, 34,226,250,201, 65, 74,164,233, 16, 90, 42,162, 16,124,175, 86, 40, 7,136, 66, 22,205,
+108, 99,217,156, 14, 70,186, 71, 24, 30, 29, 99,207,145,144,191,254,231, 47,115,235,245,151, 49,111,102, 59, 54,138,121,104,195,
+147,252,104,253, 19, 12, 85,211, 3, 77,243,165,128,234,232, 32, 47,186,226, 98,238,125,120, 43,135,250, 43,132, 85,203,143, 31,
+ 94,199,197, 51,255, 47,123,239, 29, 38,201, 85,159,251,127, 78,168,170,142,147,211,134,153,205, 43,105,119,181,171, 44, 20, 73,
+ 2, 99, 25, 99,146, 1, 25,219,216, 36,219, 96,204, 5, 95,204,181,125,125,109,192,198,228,100,146, 1, 95, 16,112, 65, 34, 11,
+ 36, 64, 8, 16, 8, 33, 1, 22, 32,105,147, 86,155,195,236,238,236,204, 78,236,233, 80, 85,231,156,251,199,169,238,233, 89,173,
+ 34,248,254,236,231,167,122,158,121,170,167,167,167,170,171,234,156,243, 77,239,247,125, 75, 92,178,105, 45,185, 92,200,225,147,
+ 51,188,255, 83, 95, 98,110,118,150,231, 61,241, 60,158,116,241, 57,172, 89,221, 79,104, 27, 4,210, 81, 79, 83,194,192, 3,217,
+ 22,148,238,188,135, 45,156, 88,156, 50,111,169, 6,100,111, 74, 77, 13,248,226,247,118,241,139, 61, 71,145,185, 14,130,180,202,
+ 51, 46, 63,143,179,134,123, 40,202,148, 64,123,183, 36, 49,134, 32,200, 48,226,153, 65,111,210, 59,122,249, 62,137,192,203,186,
+222,117, 96,142,191,252,199,119, 83, 73, 4,145,130,171,206, 63,139,107,174,186,132,206,160, 78, 87, 62,196,185, 6,185,176, 64,
+ 35,169,147, 43,245, 19,207,206,121,161, 29, 37, 61,255,181, 5,165,114,252,120,215, 81,126,231,205,159, 35,161, 64,221, 9, 86,
+118,215,249,251,151,254, 38,187,246,140,243,209, 91,239, 98,218, 69,104,153,240,156,127,190,150,151, 63,101, 61, 31,121,249,179,
+209,166,154, 93,170, 91,184,228, 83,138,156, 77,173, 62,178,116,255,227,246,252,241,237,215,190,185, 83,246,139, 28, 71,235,213,
+ 19, 22, 73, 20,219, 22,176,121,225,227, 94,178,121, 65,105, 65,147,164, 14,165, 29,161,150, 52, 26, 9, 81,228,215, 38,139,193,
+ 26, 67,144,209,105, 75, 41, 48,169, 7,233, 53,201,106,172,245,138,141,214, 26,100,134,187, 66,136, 76, 4,198,167,202,149,206,
+ 86, 8,231,144, 34,196, 24,207,225,144,117,173,162,240,226, 91, 77,188,149,179, 6,173,156,151,215,146, 26,103,133,167,188,117,
+ 96,140, 7,164,121,150,105, 47,198,101, 50,175, 67, 0,206, 38, 40,225,144,104,164,242,217,208, 36,129, 40,200,238,155, 77, 61,
+186, 28,129,196,120,190, 79, 1, 6, 15,228,117,194, 59, 48,169,243,220,186, 65,155,146,100,156,164, 68, 97,118,223,154,220,234,
+ 34,171, 33, 59,207,167,113,228,200, 81, 46,188,224, 66, 70,143, 77, 50, 49, 62,141, 19, 32,133,166, 50, 55,207,212,236, 12, 14,
+ 15, 54,110, 52, 18, 42,149, 10, 51, 83,211,158, 58,118,118,198,183, 31, 14, 13,209,136, 45,149,185, 58, 59,118,238,161, 86, 79,
+ 17,210,119,131, 41, 33, 72, 76, 76,148,243,216,128, 32, 8, 16, 66,130,177,212,170,115, 44, 25,234,163,175,183,196, 64,127, 55,
+ 54,171,239,159, 54, 82,199,165,104, 33,193,166, 96,230,169,222,125, 43,141,125, 63, 39,168,205,163,130, 0,105, 83, 82, 45,169,
+171, 18, 73,231, 74,202, 27,159,138,236, 95, 75,208, 49,136,202, 73, 8,150, 33,186,187, 97,226, 36,202,197, 32, 13,194,212,137,
+210, 49, 78,236,248, 49,203,122,122, 17,171, 67,150,132,253,188,248, 73,231,112,217,134,213,236, 58,120,132,189, 71, 71, 73, 19,
+203,138,193, 37,244,119,150, 89,183,118, 57, 93, 98,150, 30, 29,195,222,109, 76,236,188,157, 14, 55, 11, 50,245,131, 7, 65, 35,
+ 85,168, 66, 31,170, 52,136, 44,228, 72,172, 35, 44, 20,153,183,142,196, 89,166,141,229,223,110,184,141,175,126,255,151,224, 20,
+243,198, 49,103, 12, 86,228, 8, 69,204,242,142,144,223,187,250, 10,186,131,196, 3, 34, 84,128, 49, 49, 5, 13, 75,242,154, 55,
+190,252, 37, 76,254,203, 39,185,239,232, 36,227, 97,129, 15,223,244, 93,174,191,243,199, 68, 97, 64, 90,135,177,227, 39, 48, 50,
+ 96,242, 39, 63,199, 86,199,249,235,215,190, 6, 74,218,115, 38, 11, 69, 46,202, 97,149, 32,182, 54, 99, 49, 18, 45,166,162,164,
+ 81, 39, 16,158, 4, 54,231,234,172,234, 10,249,179, 23,252, 54,255,227, 3,215, 19,167, 48,211, 48,252,224,238,221,252,124,215,
+ 17,130, 32, 32, 73, 18,230,170, 13, 18, 66,164, 20, 68,133, 60,141,234, 20, 26,199,112, 95,137,231, 63,249,124, 62,126,253, 77,
+204,134,157, 28,171,166,188,237,250,155, 25,248,206, 29, 32, 12, 39,103,103, 57, 58,211,160, 36, 97,230,134,111,210,221,219,197,
+210,225,126, 66, 29, 33,172, 34,148,138,208, 26,164,105,224,164,193, 72, 65,139,229,222, 65,147,212,214,102, 99, 58, 37,197,185,
+ 20, 35, 20, 41,146, 3,147,150,127,249,212,245, 16, 21, 8,226, 26,155,135,251,120,201,111, 63,141,176, 62, 79,190,179,136, 86,
+ 1,177, 1, 21,168,197,152,119,103, 91, 53, 38,200,168,116, 5, 28,173,193,155, 63,250, 25, 38, 69, 14, 33,171,156,179,110, 5,
+175,255,163,231,211, 97,171, 20,149, 32, 10, 2, 44, 48, 11, 88, 41,136, 77, 74, 49, 95, 32, 78, 29,181, 24, 82,237,125,132,137,
+249, 6,175,252,240,215,153, 21, 61, 88, 53,197,250,222,144,155,255,250,117,172,232,211,112, 41,188,236, 41,231,240,242, 15,223,
+200,109, 7,103,232,140, 10,124,226,198,125,212,147,239,240,233, 63,123,250, 35, 95,119, 31, 87,105,123,124,251, 15, 15,218,205,
+ 41,181,118,239, 84,186, 7,196,246,114,193,240,187,133, 37,125, 33,173,175,125, 64, 17,138,150,167, 26,134, 1,105, 86, 71, 6,
+231, 13, 45,144,166, 14, 41, 21, 58, 3,135,185,140, 16, 74, 88,239,144,171, 44, 7,157,166,177,151, 61,118,169,183,125,210,147,
+ 94, 59, 12,214,106, 42,115,150, 35, 71,142,176,113,227,136, 7,247, 9, 31, 13,239,185,255, 8, 35, 35,203,201,135, 30, 4,236,
+161,116, 98,177,255, 34,124, 61,218,171,177,137,172,230,109,144, 82,177, 99,251, 17, 86,174, 92, 78, 46,231, 51,136,198,165, 8,
+ 17,128, 21, 68,129,167,233,129,196, 27,105, 19,123, 22,186, 48,196,186, 20, 41, 36,210,166, 8,169, 73, 18,131, 21,150, 80,103,
+107,144,213,190,108, 39,124, 59,109,243,158, 55,234, 41, 81, 46,132,172, 11,172,153, 74, 95, 49,178,134,234,188, 97,102,186,138,
+ 53, 10,169, 21, 74, 73,194, 48,199,142, 29,247,209,209, 81, 32, 80,138, 98,161, 76,161, 80,162,167,183,159, 40,159, 99,205,154,
+ 53, 40,173,185,239,190,251,233, 27, 24,228,235, 55,222, 76,169,220, 69,160, 67,223,174,108, 13,198, 56,194, 48,194, 89,135,150,
+ 94, 91, 69, 33,185,127,207, 46, 70,134,151,160, 20,156,117,230, 58, 15, 77,147, 18,151, 93,211, 3,140,186, 16, 25,220,199,247,
+ 17,112, 96,231,189,116, 39, 13,242, 90, 96,141,164, 66, 68,146,235,194,245,174,166,103,221, 19,112,131, 27, 81,189,203, 8,100,
+128,151, 10,235, 97,201,186,115,152,153, 60, 68, 18, 59, 52, 18, 27, 55,232,200, 7,196,179,135, 57,252,243,155, 25, 81, 2, 6,
+207,164, 51,234,101,203,210, 34,171, 58,150,146,156, 59,236,131,181, 70,131,142, 32, 64,184,113,100, 58, 3, 7,182,114,228,206,
+111,211,101,231,209, 73, 21, 43, 52,137, 83,168, 92,145,196, 21, 25, 88,178,146, 36, 43, 60, 23,180,163, 24,207, 18, 21,202, 68,
+ 81,192,240,210,181, 28,217,119,136, 90,181, 78, 61, 53,136, 32, 36, 18, 16, 73,203,250, 21, 3,188,224, 25,151,114,241, 89, 35,
+ 40,173, 40,153,121,122,100, 13,164, 36,170,159,164,232, 42,140,172,236,229,141,175,184,134,143,125,225,235,236, 25, 29,103,170,
+214, 96,236,100, 29,107, 45, 90,132,168, 64,211, 91, 10,185,104,195, 70,254,232, 57, 79,241,244,180, 49,228,109,157,193, 40, 66,
+186, 20,109,235, 20, 11, 17, 54, 73,145,249, 0,147,164,228,148,166, 63,111,233,209, 13,226, 56,166, 59, 72, 97,126,138, 43,207,
+ 91,197,223,252,233,239,243,217, 27,111, 97,215,254, 3, 52,172, 99,110,190,142,115, 53,164,132,174, 98,137, 13,235,215,179,115,
+231,118, 42,181, 9,202, 65, 66,135, 54,148, 92,202, 43,158,123, 37,229, 40,228,115,223,253, 9, 71,166,230,169, 86,171,236,173,
+ 76,163, 67,129,147,130,238, 82,158,161,206, 2,207,123,194, 21,108,222,112,134, 39,103, 17,150, 46,215,160,150, 54,232,204,167,
+ 68,162,129,114,198, 91, 86,233, 1,112,194,137,140, 71, 50, 3,191,100, 50,176, 82,120, 93,247, 41,224, 45, 31,248, 56,115,214,
+ 27,254, 14,149,240,138,223,253, 45, 58,180,165,175, 88,244, 34,181, 82,161,164,247,226, 91, 78,175,104,234,198,219,108, 17,240,
+ 17,250,156,128,215,255,227,199,217, 53, 58,195,108, 42, 88, 51, 60,194,171, 95,243, 74, 76, 0, 50, 23,146,132, 48,110, 32, 23,
+248,154,187, 12, 11, 24, 11,243,113,234,241, 13, 26,106, 2,242, 18,222,115,221,119,217,113, 34, 69, 7,134,161,156,228,243,175,
+187,134, 21,189,138,122,165, 65, 20, 54, 88,179,188,204,173,111,189,134,107, 62,112, 35,215,255,108,156,124, 23, 92,119,235, 47,
+120,225,185,195,252,214, 69,222,251, 91,114, 0, 0, 32, 0, 73, 68, 65, 84,103, 44, 94, 93, 30, 24,178, 63,192,184, 63,110,216,
+ 31,223,126,253,155,225,244,253,235,238,180,188,229,167,111,194, 88, 48,251,237, 98,102,105,150,118,151,178, 37, 77,149, 69,215,
+ 18,165,165,143,210,179,233,111,172,244, 37, 41,165, 60, 77,109,243,168, 34,244, 56,166, 76, 8,204,100,103,215, 40,164, 16,236,
+ 63,120,140,247,188,251,131,252,239,127,123, 7, 14,208, 89, 38,248,159,254,233,221,188,225, 13,111,224,156,205, 75,113, 86, 98,
+156,244,211, 43,227, 53, 51,105, 86,106, 16,180,176, 55, 14,213,210,172,122,203,155,223,203,255,252,187,191,225,236,141,189, 94,
+ 24,170, 13,212,102,129, 52, 21,132, 58, 4,155,128, 12, 9,132,204,250,194, 67,223,169, 99, 51,221,141, 64, 97,109, 83, 38, 54,
+123, 95,251, 53, 78, 8,157,161,224, 5, 81,206,103, 8,164,178, 72,165, 50, 41, 84, 47,211, 60, 57, 51, 77,146,120,192,184,203,
+152, 81,247,238,221,207,178,101,131,156,123,238,133, 94,103,164,237,113,186,140,214, 54, 78, 29, 75,150,141, 48, 53, 53, 67,103,
+ 71, 15,251, 15, 31,165,187,119,128, 48, 87, 32,169,123,158,143, 64,105,230,231,231, 17,194, 49, 95,173, 48, 59, 59,203,224, 64,
+ 31,165, 98,158, 21,195, 3,244,247,148,252,243, 51, 38,115,168, 78, 19,169, 59, 20,245, 70, 66, 46, 84, 32,115,116, 47, 89, 77,
+188,127,154,200, 84, 65,134, 84,163, 1,212,178,141,148,215, 95,130,233, 25, 33,215, 49,128, 83, 33, 58, 12, 60, 93,172,236,166,
+180,230, 92,234,123,126, 73, 50, 94, 71,216, 4,165, 19,156,105, 80, 86, 49,241,196,118,198,127, 56, 78,215,138, 11, 8,206,184,
+ 16,122,150,210, 81,238,241,143, 34,137,161,216,128,120, 14,142,237,165,177,103, 59,211,251,183, 83,106, 76, 34,109,156, 33,176,
+ 37, 82, 68,204,212, 28,165,149,203,161,171, 7, 89, 46,162, 37, 60,243,178, 45,172, 95,218, 75, 37, 73, 65, 40,250,250,151, 48,
+ 54, 54,193,174,189,251,152,153,155,167, 94,175,211,219,221,201,198,117,107, 24,236,233, 96,197, 80, 55, 93, 57,133, 16,240,151,
+ 47,186,138,231, 95,185,153,216, 57, 10,161,160,156,171,146,211,130,167,156,187,140,117, 75,255,128,157,247,239,103,239,161,163,
+ 28,157,152,204, 34, 86,193,202,229, 75, 88, 53,212,207,153, 43,150,211, 95, 8, 41,135, 1,132,240,206,191,122, 5, 19,149, 6,
+ 38,174,177,118,168,132, 78,103, 9,243, 69,143,174,199,208, 33, 53,127,250,220,167,240,219, 79,186,152, 70,146,210,223, 89,166,
+183, 88, 32,116,240,252,203,151,179,101,228,185,108,223,123,152,237,123, 14, 48, 83, 79, 72,147, 6,253,229, 2,155,206, 88,195,
+170,225,229,140,141,157, 73, 45,110,160, 92,202,234,193, 78, 58,100, 76, 57,212,252,254, 51,158,192, 69,155,215,115,224,232, 9,
+118,239, 63,192,201,217,105, 82,155,208,217, 81,102,120,112,144, 53, 75,251, 57, 99,176,135,238,188,166,224,224,137,103,159,193,
+ 7,255,234,229, 84,226, 58, 53, 51,199,218, 85, 67,228,100,138, 70,251, 72,192, 57, 63, 0,197,194,138, 97,147, 4, 29, 4, 24,
+107,136, 37, 92,247,237,123,184,115,215, 40, 85,151, 35,176, 85,158,251, 27, 79,224,252,181, 75, 40,170, 24,137, 32,140,162, 86,
+105,112, 81, 18,219, 45, 32,122,155, 91, 3,248,219, 15,125,147, 59,246,141, 51,111, 3,148, 86, 88,149,231,109, 31,189,158,162,
+ 73, 80, 54, 69, 69, 57,143, 76,117, 16,203,136,122,154, 7, 41, 73,195, 60, 31,255,194,151,249,206, 55,225, 37,207,124, 10, 79,
+ 58,103, 29, 31,254,238, 61,148,242, 67, 84,106, 39,249,243,103, 95,196,185,203,122,168, 55,234,144, 11, 73, 26, 13, 18, 18,114,
+ 90,240,153, 63,255,109,246,191,241,163,220,117, 60,197, 6,101,174,189,109,231, 98,163,222, 44, 17,180,107, 90,158,198,128, 63,
+ 30,181, 63,190,253,250, 55,197, 98,185,163,118, 73, 40,211, 38,182, 37, 50,222,248, 76, 80,234, 20,152, 71, 83, 5,209,100,170,
+ 46,214,196, 72,149,227,228,201, 58,179,115, 85,134, 71,122,152,152,152, 69, 43, 71,119,119, 39,135, 15, 78, 83, 44,150,153,171,
+ 76,177,122,117, 31,147,179, 41,198, 38,244,244,228, 57,122,108, 10,151,228,153,155,155, 99,211,230,126,102, 43,134,147, 39, 79,
+ 50, 60, 60,196,201,201,154,255,159,145,165, 72, 9, 58,136,104,196,176,243,190, 41, 14, 29,218, 71,148, 15,185,242,201,103, 35,
+116, 9, 43,188, 67,254,131, 91,119, 80,173,215,232,237,237,230,252,139, 87,179,115,231, 97, 58,242, 93,236,216,126, 31,113,154,
+240,244,223,184,148, 92, 4, 59,118,236,231,240,161,227, 52, 98, 65, 84,232,197,184, 34, 51,115,240,131, 91,239, 64,170,136, 51,
+ 55,108, 98,229,170,136,109, 91,143,177,102,205, 18,118,236, 58,204, 96, 79,158, 37, 67,125, 76, 77,195,109, 63,186,155,196,198,
+172, 93,183,146,179, 55, 12,176,117,231, 24, 43, 87, 13,178,111,223, 9, 6,251, 58,153,158, 26,103,223,190,125, 32, 5,195,203,
+150,179,122,245, 42,114,145, 68, 42,235,115,149, 30, 84,132,177,153,134, 5,150, 19, 39,142, 99, 81, 56, 39,125, 38, 91, 42,246,
+238, 61, 64, 16,230, 25, 89,177, 14, 41, 37,149,121,139, 49,134,169,169, 41, 76, 98, 73,140,161, 90,169, 80,173,215, 61,176, 87,
+104,250,250, 7, 57, 54, 62,201,236,236, 44,221, 97, 30, 37, 36,214, 56, 70, 15, 29,166, 90,171, 80, 46,151,232, 40, 23,233, 88,
+ 54, 4, 46,161, 84,136, 56,103,203, 58,223,126, 14, 40,241,224,212, 87, 90, 2, 81, 20,120, 87,201, 5, 44,217,114, 37, 7,171,
+ 85,230,167,246, 35,164,166,188,230, 60,138, 43,207, 37,238, 94,141, 43,118, 35,180, 34, 12, 20, 38, 73, 81, 90,130,204, 65,199,
+114,250, 54, 92,194,193, 31, 77, 80, 74,167, 40, 75, 71,146,250,134,126, 77,157,180,106,153,216,113, 59,246,208,110, 92,199, 0,
+229,161, 21,232, 98, 25, 29, 72,226,153, 19, 84, 78, 28,164,113,226, 8,185,250, 28,121, 27, 19,186, 6,129, 22,164, 86,147,138,
+144,154,139, 72, 59,151,177,108,227, 37,204, 21,123,200, 21, 75, 24,155, 50,220, 91,102, 73,231, 58,234,245,122,198,200, 31,194,
+112, 55, 87,108, 89,141, 19, 10,155,198,104, 44,210, 89,114,161,166, 24,133, 96,189,130,208,198, 21,125,172, 95,214, 67, 45,142,
+ 17, 2, 10,145, 65, 42, 75, 1, 56,107,176,196, 72,233, 76,204,121,155,168, 26,131,193,115,169, 11, 99,232, 10, 3, 92,163, 65,
+ 62,146,132,202, 79,185,139, 55,172,194, 24,136,227, 58, 74, 37,228, 2,141, 80, 25,148, 82, 9,108, 90,231,156, 53,203,217,176,
+ 74,146, 26, 95,167, 42, 4,142, 98, 0,113, 18,115,230,146, 34,171,135, 54,114,213,197,155,152,174,167,228, 67, 77,144, 54, 80,
+214,215,191,206, 28, 88,129, 68,208,168, 85, 41,228, 3,180, 86, 8,235,232,201, 11,206, 91,217,195,198,165, 93, 36, 23,156,201,
+ 92,173, 14, 82,160, 36,104,107, 40, 42, 40, 69, 94,156, 39,138, 96,249, 80,137,161,222, 18,213, 36, 37,150, 9, 82, 9,242, 74,
+162, 90,218,195,222,162,183, 43, 26, 5, 65,144,169,185, 41, 14, 76,194, 7, 63,251, 21,230, 9,201,107,197, 72, 87, 7,191,243,
+164, 39,208, 21, 26,114,205, 99, 52,193, 27,214,139, 48,156,154, 29,108,213,166,157, 39,175,184,229,182, 31, 97, 40,147,115, 14,
+105, 83,142, 31,222,207,152, 53, 72, 43,136,130,136,106,173,225,181,147,165,102,174, 22, 19,150,123,112,214,208, 48,150,125,135,
+143, 49,105,102,184,250,146,243,136, 13,212,194, 62,100, 26,147,203, 5, 92,117,206, 6,176, 16,161,113,105,131,185, 48, 36,103,
+ 27,216,121, 73, 80,208,252,229, 51, 46,227,154, 15,221,132, 46,245,113,199,253, 71, 57,189,206, 93,155,145,111,215,180,124, 60,
+106,127,124,251,127,106,228,219, 95,219,214, 88,109,206,171,135,194,207,251,232,215,131,173, 44,112,247, 61,219,248,226, 23,190,
+206, 7, 63,242,102,190,240,197,155,192,166,188,234,207,254,128,183,189,243,131,188,240,133,215,240,133, 47,124,142,247,125,224,
+239,248,228,167,191, 76, 16, 40, 94,245,234,231,243,230,127,122, 23, 47,250,221,151,112,237,181,215,242,166, 55,255, 45,247,222,
+251, 75,110,249,246,119,120,255,251,223,196,255,249,220, 13, 20, 75, 33,171, 95,250, 92, 26, 73,150,244,211, 1, 55,125,243,219,
+140,140, 44,231, 27,215,125, 17, 35, 95, 78,108, 37,137,213,188,237,157, 95,102,110,102,150,179,183,108,230,134,111,124,137, 74,
+227,185,124,242,127,127,140,114,177,196,213, 87, 63,147, 27,191,117, 11, 19, 83, 85, 46, 60,111, 35,239,123,255,135,184,236,138,
+ 43,145,178, 72,108, 97,106,182,193,251, 94,251, 94, 46,188,232,124,148,174,243,217,235,222,194,123,223,247,143,188,253, 29,239,
+163, 84, 42,176,114,197, 82,174,188,226,124,250,250,251,120,239,123, 63,137, 37,224,172, 77,107,120,251, 59,223,207,107, 95,243,
+ 90,222,241,142,119,210,221,219,205,240,240, 50,214,174, 90,201, 55,111,252, 26, 79,121,234, 19,113,206,241,197,235,110,224, 13,
+111,248,239,108,218, 56,132,117,170,197, 2, 39,132,207, 82, 54,245, 41,102, 42,115,148,138,157,158,143,223, 38,204,207,207, 51,
+ 49, 49,193,166, 77,155, 8,131, 60,247,237, 60,204,248,196, 24, 38,117, 56,233,213,106, 44,190, 94, 46,148,194,153,132,114, 87,
+142,124,161,192,200,200, 8, 91,183,237,160, 82,169,130, 9,112, 66, 80, 42, 20, 88,178,100, 5, 82, 90,207, 30,168, 13,197,124,
+158,243,207,219,136, 18, 94,184,198, 90,159, 37,113,182,169, 24,121,106,250, 61, 77, 64, 43,172,144, 72,157,135,145, 77, 12,133,
+ 29,164, 83,199,176,214,146,239, 89, 70, 18,148, 9, 75, 93,200, 32,204, 90,222, 44, 4,154,134,133, 80, 42, 68,216, 9,171,158,
+ 64,120,228, 56,201,222,219,136,147, 10,132,129,111,205,114, 33,194, 73,116, 58,139,156,107,160,171, 99, 36,199,182,210,208,154,
+ 36,109, 16, 98,209, 46, 69, 99, 9,149, 64,217,212,171, 12, 53,234,200, 48, 71, 77, 40,230,130, 14, 58,215, 92, 68, 37,191, 12,
+ 93, 26,196,164, 30, 24, 97, 76,130, 12, 3,180, 46, 16, 74,159,136,105, 56, 75, 49,175, 72, 83,135, 82, 33, 73,163, 74, 49,151,
+195,164, 9, 74, 24,148, 86, 30,220,144,213,147,186, 66,223, 75,238, 1,131, 54, 99, 35,130,238, 92, 64, 98, 82,114,121, 77,146,
+ 36, 20,195, 28, 46,246,194, 55, 97, 49,204, 2, 89,131, 16, 10,173, 4,129, 53, 20,242, 57, 82,153, 35, 21, 14, 33, 36,169,115,
+ 8,147, 18,232,128, 8, 73,232,124,118, 40, 12, 20,198,212, 49,105,157, 48,136,136,109, 74, 73,120, 35, 88,138, 52,214, 66,152,
+211, 8, 39,112, 50, 68, 75,207,109,222, 81,240, 53,158,196,164,144,225, 99, 34,101, 8, 67,135, 22,146, 14, 34,116, 36, 72,140,
+195, 74,145,241, 15,164,168, 0,210, 76, 30, 77, 9,232, 12, 53, 78,104, 82,231, 80,120,109,102,140,201,248,216,155, 70,221,100,
+ 96, 54, 47, 65, 91,145,240,119,255,114, 45, 83, 54, 79,106, 12,229,116,134, 87,253,238, 31, 50,220, 29, 17,138,132, 48, 95,242,
+234, 69,194,122,206, 3,235,239, 13, 45, 50,135,133, 90,125,179, 92, 24, 72, 8,171,147,116,229, 28,169, 5,147, 36,148, 35,131,
+177,134, 80, 22,137,107, 53,122,149,196, 38, 53,156,128, 40,151,163, 98,231, 16,104,148,179, 40,231, 40,235, 8,109,125,154, 47,
+ 47, 28,177,153,167, 28,194,242,174, 46,112,117, 42, 88,242,198, 59, 80,214, 58,136,242, 56, 83,103,120, 89, 9,235, 28,121, 37,
+152,170, 38,190,134,184,200,104,159, 6,173,212, 52,238, 82, 62,110,216, 31,223,254,131, 82,239, 15,102,208,155,101,246,224,148,
+ 44,251, 2,108, 78,192, 3, 36, 82, 69, 22,249,215,227, 6, 58,212,108,220,184,133, 79, 76,127,158,241, 19,176,237,222,125,204,
+215,234, 60,231,121, 80,173,165,172, 90,187,134,169,217, 42, 19, 83,176,107,247,113, 42,243,243, 60,235, 56, 84, 19,201, 25,103,
+175,167,163,187,131,125, 7,142,114,232,208, 73, 38,167, 45, 63,255,229, 20, 99,199,235, 60,237,105, 23,144,113,120, 97,157,195,
+ 73,195,107,254,242, 26,180,134,233,106,133, 59,127,122, 23, 78,105,142,140, 29,231,238,123,118,240,202, 87,190,146,254,161, 94,
+ 70, 79, 76,112,251, 29, 91, 73,109,129,151,189,242, 37,156,123,238, 10,156,200,113,207,214, 29,220,118,251,221, 60,225,178, 39,
+241,146,151, 62,147,196,193,205,223,187,147,201,169, 89,116, 88,230,146,203,174, 68, 4,150,173,187,238,225, 71, 63,254, 5, 74,
+107, 94,246,210, 63,224,194, 11, 86,147, 26, 56, 54, 54,205,206,251,182,241,254,127,121, 55,189,131, 80,169, 77,240,195,219,127,
+ 70,177,216,203, 31,189,228, 26, 46,190,120, 37,239,123,239, 23,185,234,233,207,228, 15, 94,114, 21,194,194, 15,191,255, 83, 76,
+186,192,207,145,182,128,104, 50,171,169,123, 97,175,190,222, 65,238,187,111, 15,133, 98, 7, 93,157, 61,220,183,107, 7,221, 61,
+157,244,246,246, 18, 69, 69, 14, 30, 62, 70,189, 1,185, 92,129, 70, 18, 19, 6, 17, 88, 60, 81, 27, 14, 41, 4, 83,147, 51, 56,
+103, 40, 20,114, 60,249, 73, 87,178,103,239,126,226,154, 5, 41,136, 66,141,181, 13, 58, 59, 11, 12, 13, 12, 49,180,100,128, 82,
+ 33, 79,190, 16,100, 57, 25,135, 49,158,132, 76,200, 7, 3,202, 41,225,217,188,130, 8,135, 36, 73, 33, 24, 92,139,234, 28,194,
+ 25,223,167,155, 47,118,128, 82, 89,187,132,239, 77, 72, 51, 89,214,196, 58, 66, 25, 64,121, 41, 75,158,248, 44,198, 42,199,152,
+ 25,139,201, 41,131, 72,235,104, 11,194, 38,148,116,136, 51,117,100, 82,161, 20, 40,170,149, 42, 93, 81, 4,169,245,242,123, 74,
+144,164, 46, 99, 51, 19,200,168, 76, 5,205,124,208, 73,126,228,108, 10, 43,183, 96, 58,150, 17,149,122, 16, 82, 98, 82, 79,174,
+ 34, 1, 43,188,200, 8,120,194, 22,208, 4, 10,140,179,228,114, 33,150,132, 64,123,228,166, 77, 29, 34,123, 45,113, 45, 51, 99,
+ 44,104, 41,177,169, 71, 65, 59,225,133, 70,132,116,228,163, 0, 97, 13, 66,129,144, 2,147, 24,100,224, 21,148,156, 19,104, 33,
+ 17, 90,225, 82,139,210,178,213, 38, 18, 74,129,208, 81,203,136,105,177,224,108, 43,173,176,153,188,173,202,234, 72, 90, 58, 79,
+ 45,168,200,190,153,106,233,171,183,168,210, 17, 72, 21, 82,207,230,111,132, 68, 43, 65, 18, 67, 46,151,225, 35,148, 96,231,129,
+ 19, 28, 62,114,144,167, 95,121, 33,102,161,209, 4,229, 32,204,234,221, 66,138, 86, 5, 79, 9,133,108,119,249,133,197,101,231,
+175, 2,159,190,121, 43,119,108,223, 77,172, 58, 41, 6,112,245,133,231,241,196, 77,107, 41, 5, 13,114,161, 70, 8,215,146, 35,
+117,206,249,251,224,188,151,218, 4,145,202,246, 84, 60,160, 12,252,240,134,127,229,100,205,223,255, 36, 1,161,140,215,179, 55,
+ 1, 65, 0, 50,109,214,228, 97, 78, 56,158,253,103,111, 6,175,187,198, 27,255,226,213, 60,113,221, 0, 75,138, 16,106,159, 24,
+ 49, 78, 97,157,102,102,110,150,129,178, 33,213, 5,112, 1, 36, 22,171, 34, 66, 55, 15, 82,112,178,154,128, 14, 73, 49, 20,114,
+ 94, 79,210,181,229, 49,189,131,114,170,129,111,201,202, 61, 32,106,127, 80,185,233,135, 72, 0, 60, 44, 10,250,209,252,207,227,
+219,127,233,205, 57, 3,214,250, 12,223,163,249, 63, 92,171,237,242,116,162, 48,206,128,208, 16,134, 17, 73, 10, 3, 3, 1,203,
+151, 47,231,123,223,253, 17,103,159,189, 5,235, 20,223,252,214, 15,232,236, 44,179,100, 9, 12, 12, 45,231,187,183,252, 59,103,
+110, 56, 3,107,224,150,155,239,164, 92,234, 97, 96, 0,206,185, 96, 51,199,142,158, 96,235,182,251,121,209,139, 94,204,189,247,
+110,229,240,161, 81,206, 88,191,214,183,187,138, 44,138,108,155, 58, 75,151, 46,103,108,124,150, 52, 77, 25, 30, 30, 70,106,205,
+ 79,126,114, 7,169,243, 32,175,181,171,207, 96,247,253, 59,136,162,128,212,128,203,186, 98,102,231,170,156,189,114, 93,182, 54,
+129, 84,174, 85,199,190,241,198,111,146, 82, 99,201,146, 37,116,118,118,210,104, 36,228,179,158,115,165, 97, 98,114,138, 48,159,
+163,191,223,175, 27,253,253,131,140,143,143, 82,109,212, 40,149, 10,158,193, 50, 53,116,117,247, 97,155,126,148, 80, 72,169,125,
+125, 63, 35,154,241, 83,221,162, 84,144,245,158, 43,150, 47, 93, 74,154,194,158,221,251, 57,121,242, 36,179,179,179,108,222,188,
+153,174,174, 30,118,237,218, 77, 28, 39, 4, 65,142, 56, 49, 8, 20,113, 98,112, 78, 16,133,121,146,180,129,144, 94, 60,109,116,
+244, 24,165, 82,129,139, 46,216, 0, 54,230,224,129, 81,138,197, 34,131,131,253, 44, 91, 62, 68,103, 71,212,234, 42,176, 38,205,
+ 88, 5, 13,169,177, 4, 65, 0, 46,115, 54,180, 58,141, 81, 71,163,131, 5, 4, 93,168, 3,191, 40,231,203,126,241,109,162,235,
+196, 2, 11, 24,194,107,130,183,234,137,105, 10, 58,130,242, 18, 6, 47,125, 54, 71,239,237,102,230,208, 54, 74,114,154,200, 86,
+209, 2,156, 73, 17, 72,172,210, 52,156, 37, 8, 52,214, 38, 56, 33,209, 82,225, 76, 76, 96, 45, 90,133,196, 42, 98, 78, 20,168,
+230,251, 41,172,216, 66, 52,188, 9,215,185, 20, 93,238,193, 74,233, 13,113,214, 67, 40,132,205,210,199,222, 90,170,118, 35,146,
+181, 96,180, 95,182,212,162,173,114, 37, 91,131,207, 75,226, 57,148, 22, 45,199,197, 89,131, 50, 6,147,214,176,105, 29,165, 52,
+168, 18, 82, 10,132,240, 76,104, 45, 10, 18, 1, 34,240,141, 36, 97,219,252,114, 25, 73,120,147,123,184, 53,239, 92,144, 93,131,
+255,158, 13, 4, 78,122,109, 95,153,181, 66, 27, 22,128, 32,243,206,147,216, 68,169,111, 59,137,181,175, 73, 91, 39, 8, 5, 84,
+ 67,127,252,162,128,122, 10,247, 31, 57,201,137,177, 57,234, 49,232, 64,146, 10, 79,134, 90, 84,254,255,154,196, 60, 77, 99,159,
+147, 16, 58,188, 97, 23, 22,156,192, 72, 73, 29,216,115,210,240,137,235,111,160, 65, 72,136, 99,176,160,121,217,243,126,139,188,
+169,146, 11,242, 24,151,146,207,174, 5, 39,176, 78, 96, 81,164,194, 31,191, 9,230,177, 9,228,148, 63,151,115,142,156, 18, 56,
+147,101, 93,128, 88,164,132, 42,197, 88, 71,162, 3,159,177, 8, 44,210, 26,148,210, 28,143, 65, 59,139, 69, 16,185,148,156,153,
+163, 67, 20,233, 82, 26,109, 53,196,117, 82, 89, 96,114,102,138,219,239,217,195,186,165,155, 41,204, 85,145,185,144,212, 25,116,
+172,104,212,170,228, 58,186,185,241,135,247,122,145,151,184,206,240,178,238,133,250,121,102, 81,157, 93, 0,205, 45, 68,240,238,
+ 65,163,118,155,189,167,132,120,160, 54,118, 59,240,201, 45,200,209,186, 22,112,176,125,192,156,138,126,178,167, 7, 65,181,127,
+149, 71, 97, 4,254, 99,252, 3,251,171,194,189,255,127,108,204,125,134, 71, 8, 69, 98, 82, 2, 21,180,250,155, 31,201, 45, 91,
+ 80, 99,151,139, 7,131,243,104,117,161, 61, 33,152,175,255,250, 63,157,181, 97, 13, 55,125,243,171,188,236,101,127,138, 73,225,
+203, 95,253, 18, 23, 93,120, 14,214,192,150, 13,155,185,229, 91,223,226,197,127,240,108,130, 32,226,115,159,253, 26,151, 95,126,
+ 25,194,194,170,225,101, 92,251,201, 47,115,197,229, 79,230, 9, 23,159,201,255,252,187, 47,210, 63, 80, 98,112, 8,246, 31,152,
+163, 84, 42,225,140,231,141,208, 2,210, 24,182,221,187,141,161,190,126,118, 58,199,244,216,113, 4, 49, 87,255,230, 85,108,218,
+ 92, 6, 11, 63,251,201, 56,218, 53, 72,147,196,211,205, 58,131, 51, 49, 75,150, 13,179,109,219, 14,158,246, 27,155, 73, 13, 8,
+147,210, 85, 14,177,166,193,159,255,249,115,201,229, 33, 78, 96,239,158, 10, 90,251,238,152,195,199,102, 49,198, 48, 48, 56,140,
+ 67,177,117, 91,149, 13,155, 10,108,223,182,135,161,161, 65,180,174,121,213, 70, 11,197, 82, 23, 91,183,238,230,153,207, 60,135,
+185, 89,191,222, 90,146,214, 44,105,114,180,203,140,109,206, 19,111,249, 64,111,104,160,135, 72, 43,102, 42,243,116,119,246,144,
+212, 45, 19, 19,147, 36, 73,210, 42,121,212,227, 6, 81,152,207,218,246, 20, 73, 90,203, 2, 26,197,212,201,105,170,213, 42, 61,
+157, 93,236,221,179,159,179,214,143,112,198,218, 97,242,121,207, 3,208,124, 78,205,239,160,148,206,108,148,246,205, 13,217, 35,
+ 63,157, 65,207,128,114,100,198,241,148,233, 46, 52, 78, 60,184,102,116, 51,213,211,130,251, 11,188, 57, 27,222,196,210,142,110,
+170,219,251, 57,186,245,199,164,110,154, 40,173,161,201,162, 80, 44,214, 37, 72,235,144, 74, 98,156, 32,182, 62, 77, 79, 16, 81,
+ 21, 33, 21, 27, 34,123, 87,210,181,114, 19,225,224,153,232,254, 85,136,142, 62,156, 14,179,126,200,172, 47, 25,151, 93,100,123,
+136, 41,179,133,114, 97,191, 48,252,109,107, 17,106,103,227,241, 93,224, 77, 19,109,152,218,117, 23,201,252, 73,116, 62,207,220,
+216, 36, 99,251,142,144, 36, 49, 97,104, 41,246,244,145,203,231, 41,245, 14,128, 84,148,251,150,144, 24, 8,117,130, 46,150, 72,
+146, 6,129,206, 35, 58,186,145, 50, 68, 16, 32, 50,148,162,203,144,223,173,123,157, 17, 76, 36,113,138, 13, 53,239,249,208, 39,
+216,124,246,217, 92,113,229,197,220,250,163,237,252,252,238, 95,242,186,215,252, 62,223,187,237, 30,110,250,254,143,201,135, 1,
+207,123,250,147, 56,255,252,117,188,230,175,223,195,178,229, 75,153, 63,186,151,151,191,252,149,252,240, 23, 59,249,247,187,126,
+193,250,161, 78, 94,251,218, 63,230,134, 91,110,101,197,138, 21, 36, 1,196, 41, 92,251,229,155,217,122,223,110,250,187,202,188,
+242,101, 47, 33, 95,130,191,253,219,247,208, 55,208,207,212,201, 9, 46,189,232, 66,126,235,105,151,211, 27,250,104, 94, 72, 77,
+ 29,152,198,235,203,143,207,167,168,176,136, 52,134, 23,189,240, 69,158, 74,178,144,167, 17, 64,164, 2,106, 52, 65,244,130, 36,
+115,163,106,192, 7,175,253, 22, 95,252,234, 55, 40, 23,202,252,197,159,188,148,223,188,228, 12,116, 0, 90, 9,156,181,228,165,
+ 32,240,122, 70, 16, 9,148,243,169,132,154, 48, 32, 20,161,241,206, 87, 26,215,233,205,231,188, 80, 66,160,160,158, 80,144,130,
+178,178,132,196, 8, 52, 27,250, 4, 91,199,231,152, 87,142,119,124,237, 46, 46,189,104, 3,103,116,229,113,113,140, 14, 37,164,
+134,160,220,197, 77,119, 31,227,243,119,238, 36, 23,116, 82,155,159,231,201,103,109,196, 53,163,239,133,105, 77,147, 49,195,225,
+ 11,108, 62,221,229, 30,152,146,111,143,216, 31, 48,151,236, 35, 10,198, 31, 89, 84,214,102,148,197,195, 27,111,119,202,254, 63,
+118,107,103, 71,123,164,251,255, 66,198,215, 90,140, 53,109,125,218,191, 30,141, 62, 33, 4, 71,127,114, 19,247,124,231,107,236,
+221,181,143, 3,115,130, 87,190,229,221,172,223,178, 5,147,166, 40,173, 31,195, 65,155, 15,220,208,104,196, 68, 81,216, 66,140,
+107, 13,203,150, 13, 16, 5,112,193,121,235, 9, 67,248,204,181, 99,172, 89, 61, 68,164, 97,233, 96, 23,152, 42,151, 95,186, 25,
+ 1,124,246,147, 21, 70,150,245, 35, 12,156,179,233, 44,254,173, 94, 97,243,198,181,244,247,193,210, 37,157,172, 88, 49,140, 20,
+240,133,235, 62,207,166, 77,155, 88, 49,178, 18,225, 26,188,238,181,255, 72, 16,229,153,159,157,231,143,255,232, 26,110,255,209,
+247,233,233,202,243,194,223,125, 38,239,126,247, 91,216,176, 97, 3, 7, 15, 30,228,220,179,207, 33,109,204,146, 15,252,138,156,
+ 36,179,228, 66,195, 21, 87, 92,192,187,222,245,125,222,254,207, 31, 98,124,124,156, 80, 27,122,187,115,172, 93,187,148, 55,190,
+225,173, 12,175, 92,194,182,109,219,120,225, 11, 94, 12, 46, 69,200,148,123,238,189,155,109,219,182,241,250,255,246, 42, 46,189,
+236, 66,254,245, 99, 31,162,175,175,143,227,199, 71,185,230,154,103,241,253, 91,191, 70,154, 86,145, 2, 46,189,228, 66, 62,254,
+177, 79,242,166,127,184,150,202,252, 52,214,198,190, 3,192,248,104, 95,102, 81,186,104,245, 17,250,239, 23, 4,130,174,174, 18,
+249,124,142,254, 36,101,112, 32, 97,215,174, 61, 76,207,206,248,250,187,212, 24, 99, 40,228, 75, 24,227,163,116,207, 28,234,199,
+251,244,244, 36,113, 28, 51, 50,178, 28,107, 99,150, 12,246, 83, 44,120, 5,201,166,141,110,174, 33,242, 49, 82, 81, 11,103,172,
+243,145,153,100,209, 30,197,105,223, 95,180, 95, 88,157,172, 3,103, 99,148,114,224, 26, 48,115, 28, 51, 49,202,177,157,191,192,
+ 77, 29,193, 77, 31, 39, 76,102,137, 68,130,114, 73, 43, 66, 49, 72, 92, 80,160, 70, 64, 93, 22,144, 93,203,201, 13,174,166, 48,
+180,138,124,239, 8,182,208, 73, 80,236, 70, 4, 57,172, 19, 11,229,204,230,226,233,126, 13,158,178,180, 56,103, 72, 39,118,115,
+224,238,123, 57,188,125,148,195,251,183,115,252,196, 62,226,216, 18, 91,205,196,137, 10, 51,149,163,108, 58,115, 13,133, 40, 79,
+169,152,103,211,121, 23,210,179,100, 41, 97,185, 19, 41, 21,197,101,235, 16,206,128,169,226,226, 4,169, 53, 42, 80,232,176, 68,
+ 80,238, 65,151,123, 16,153,132,159,179, 11,198,221,101, 17,237,245, 55,125,143,207,126,253, 59,188,239, 35,111,231, 85,175,122,
+ 19,207,121,206,179,233, 27, 26,228, 45,111,125, 43,127,241,234,215, 49, 49, 62,206, 87,191,242, 5,222,255, 47,239,226, 15, 95,
+246, 58,126,243, 41,151,241,130,167, 92,192,124,173,202,107,222,244, 65,254,233,173,111, 35,156, 27,229,188,243,206,226, 61,159,
+186,129, 67, 71, 70,121,207,223,189,138,175,127,245, 38,110,190,229,118, 94,246,170,255,198, 15,238,248, 25,199, 78, 28,227,237,
+111,121, 37,207,188,250,247,120,241,115,158,205,146,165,203,121,207, 71, 62,197, 7,223,251, 14, 46, 95,219,133,136,107, 56, 21,
+210,208,138,143,126,231, 62,222,245,169,235,169, 19, 97, 13,172, 92, 54,196, 43,174,121, 30,133,116,142,142,188,246,134, 55,210,
+184,164, 65, 20,104, 18,227,159,107,119,103, 7,183,222,249, 11,254,245,139,223,162,225, 2,130, 92, 68, 80, 29,231, 95,255,246,
+ 21, 92,185,105, 21,161, 77, 61,223, 60, 25,173, 34, 42,107,165,243, 2, 45,169, 51, 40,169,124,135, 74, 38, 5, 59,129, 98,243,
+239,255, 3, 83, 38,162,203, 84,121,235,107, 95,202,211, 54, 13, 49, 16, 89,172, 8,249,183,239,254,146, 55,124,225,167,228, 69,
+131,233, 90,200, 72,215, 73,222,249,188, 45, 92, 52, 48, 76,106, 44,177, 19, 92,127,223,126, 62,120,211, 61,156, 12,123, 40, 40,
+133,170,215,216,250,222, 63, 97,121, 87,174,125,165, 93,192, 2,180, 94,251,253, 66, 29, 75,156,242,121,179, 16, 55,181,208, 43,
+ 15,101,208,229,131,219,230, 83,253,134,182,163,201,211, 70,221,246,215, 96,181,228, 35,152,239,167,236,127, 93,219,163, 61,239,
+162,117,234,145,186, 67,143,161,194,157,122, 12, 78,115,107, 84,230, 64, 42,162, 66, 33, 51,244, 46,147, 41,126,184,124,136,227,
+129,144, 81,191,205, 28,216,202,207,191,244,113, 78,142, 79,112,248,240,113,246, 29,154, 96,223,100,133,115, 47,190,146,127,250,
+228,167,192, 42,144,230,193,247,173, 33,160, 30,232,209,101,248, 39,135, 35, 77, 28, 58,240,165,192,217,138,225,208,129, 81,206,
+218, 48,130, 49,176, 99,199,110, 86,175, 89, 73,177, 20, 80,173,192,254,253, 7,216,120,246, 74,156,133,237,219, 14,178, 98,197,
+ 10,202,157,254,152, 59,119, 28, 98,213,170, 17,114, 57, 56,112,240, 40,165, 82,129,238,238, 46, 14, 31, 62, 74, 46,151,163,163,
+163,139,189,123,247, 82, 46,117, 82,107,212, 89, 58,180,148,114,167,102,231, 78,127,156, 98, 9, 78,140,205, 51, 53, 53, 69, 62,
+202, 49, 60,220,199,253,247, 31, 98,100,229, 32, 97, 24,114,242,228, 28,105,234, 88,186,180,147,169,169, 6,199,142, 30, 98,205,
+154,117,236,190,255, 0,171, 86,174,164, 84,130,253, 7, 38,168,214, 43, 12, 14, 14,210,223,155,231,158,123,246,114,198,153, 43,
+153,157,155,162, 82,169,178,122,213, 8, 56,216,183,215, 71,196,107,214, 44, 37,202,195,246,237,247,177,126,253,122,162,200,183,
+187, 77, 77,194,225,209, 19,132, 97,200,219,255,249, 77,188,249, 45,127,199,202,149, 61, 30,231,155, 36, 25,113,150,108,249,238,
+ 45,199, 90, 44,252,158, 24,152,153,169,242,245,111,220, 68,127,223, 16, 97,174,132, 16,126, 93,180,214,162,117,136, 16,130,185,
+185, 25,106,245, 57, 26,181, 26, 67, 75, 6, 8,164, 96,227,198,117, 12, 13,116, 32,197,226, 96,224, 87,197,231,104, 95, 59,245,
+218,172,167,238, 91, 19,238, 65,247,210, 71,217,178,169, 12,163,179, 5,198, 35,226, 85,113,128,229, 93, 75,176,211,199, 72,198,
+246, 82, 31, 63, 76,125,102,130,184, 58,231,107,186, 89, 67,191, 46,118, 16,116,244,211,221,179,148,176,103, 57,170, 60,132, 45,
+116,226,242, 29,168, 48,135,208, 89,178,223, 37,224, 52, 34, 67,104,187, 95,201,176,103,241,139, 48, 56, 59,199,225,219,191,199,
+214,219,127,198,145,195, 71,136, 41,113,248,224, 81,190,253,179,159,177,188,183,204,108,195, 80,140,138, 28, 57, 57,195,222,137,
+ 95,130,128, 40, 84, 12,255,251, 47, 89,214, 61,192,170,145, 1, 46,184,252, 50, 6,109,130,138, 58, 9,202, 37,208, 17,181,153,
+ 25,130, 92, 9,228, 12,114,242, 56, 74, 57, 10, 61,195, 4, 93, 3,200, 66, 9,156,194, 88,135,117, 14,161, 36, 87, 95,253, 84,
+ 62,112,253,183,184,238,134,159, 50, 57, 53,197, 83,159,178,133,207,223,112, 39, 97,185,135,111,222,242,125, 36,150,233,169, 89,
+246,238, 61, 78,108, 36, 23, 94,124, 25,195,195, 3,132, 57,197,115,159,255, 34,222,241,222,247,115,205,213,151,115,246, 5,103,
+209,209,211,133, 56, 54,138,149,112,207,182,157, 60,233,233,191,201,218, 77,131,156,180, 87,112,195, 63,189,153,217,216,147, 51,
+108,217,180,145,117,103,109,228,109, 31,187,142,227, 51, 85,166,230, 75,244,231,115, 24, 37,216, 61,110,248,216,245, 55, 48,235,
+114,158,135,152,148,163, 99, 39,248,199,119,127, 0,237, 18,164,112, 72,169, 61, 33, 5, 9, 38,110, 16,230, 11, 8,107, 56,107,
+245,106, 68, 80,162,174,202,152,176, 72, 37,105,208, 29, 21,249,249,221,247,112,241,186,165, 68,185, 96,129, 76, 67, 41,140,179,
+ 45, 58, 69,207, 51,231, 89,172,132, 18, 24,227,103,149, 9,192,146, 34,101,136,179, 18, 39, 21, 86,248,150, 29,233, 28, 47,127,
+242,102,190,255,139,173,220,188,117,130,245,233, 28,203, 70, 39,248,240,219,238,229, 67,185, 60,182,216,201,177,217,132, 70,234,
+ 40,133, 33, 81, 56,207, 9, 19,240,249,255,241, 59, 44, 43, 43, 95, 30,146,237, 41,204,182, 60, 88, 51,205,238,156,247, 57,132,
+ 88,168,185,180,162,245, 5, 28,114,115, 92,186,135,136, 70, 31, 50, 86, 61, 77, 90,221,158,178,151, 15, 72,223,255, 26, 12,235,
+163,221,255,186, 13,251, 99,217,255, 7, 24,244,102,253, 84, 58,203,142,239,125,155, 79,188,255,189,220,179,251, 0,179,243,243,
+232, 32,160,167,163,135, 63,121,237,235,121,214, 31,253,225, 67, 24,246,135, 46,122,184,140,126,121,235, 55, 63,205,252,124,149,
+202,204, 44,179, 51, 21,170,105,130, 22,142,155,191,243, 77,110, 91,183,142,239,222,179,131,168, 16, 60,182,104,189,229,152, 72,
+130, 64,146,166, 49, 66,134, 20,114,138, 51, 55,120,114,152, 48,128,205,103,175, 67, 74, 15, 14, 43,151, 36,155, 54,174,244,181,
+120, 96,211,198, 21, 52,147, 18, 73,106, 56, 99,253, 8, 58,107,150, 90,179,106, 41,169, 73, 81, 10, 86,173, 26,242, 28,110,169,
+101,203,230,117, 94,150, 57,177, 4, 89, 11,204,186,181,195, 30,185,157, 66,111, 79,145,222,222, 34, 90,251,114,223,198, 13, 35,
+152, 44, 91, 58, 52,216, 65,106,124,125,190,163, 67,211,219,181, 14, 33, 96,203,217, 43, 91,190,245,218, 53,125,164,105, 79, 70,
+ 84, 3, 91, 54,173, 65, 72, 75,190,191,155,222,206, 18, 18, 72, 19, 88,187,166, 11,108, 87,198,250, 6,103,111, 60, 51,171,251,
+195,125,219,119,115,237,103,174,163,175,111, 41,123, 15,236,231,201, 79,185,146,145, 21, 61, 45,246,234, 32, 80,217, 60, 94,240,
+219,155, 21,183,246,228,156,214,208,219, 91,224,137, 87, 94,202, 15,111,187, 3,103, 53, 66,133, 72, 17,226, 50,105,212, 70,163,
+134,181, 41,165, 98,142,225,145, 37, 24, 27,179,118,221, 42,122,123, 59,188, 3, 97,109,139,137, 84,182,129,223, 30,171,113,215,
+ 77, 76,188,115, 30, 28,214, 84,234,106,178,253,156, 46,141,215,190,151,138, 86, 74, 92, 88,155,233,118,104,140, 10,145,170,128,
+232, 47, 34, 59, 7,137,250, 86, 16,197,243,116, 26,139,179,146, 70, 42,136, 83, 67, 20,249,116,133, 83,138, 32, 95,130, 32,143,
+ 17, 26, 21,134,132,185, 66,118, 97, 89,108, 35,154,175, 29, 2,135,117,226, 33, 47,218,209,222,111, 44, 22, 5, 86,126,221,174,
+ 51,246,211,239,112,228,190,237,252,228,142,109,236, 63,112, 24, 25, 20,160, 49,206,214, 67, 7,152, 75, 28, 7,167,230, 9,148,
+102, 98,238, 36,115,113, 66, 53,145, 40, 41,136, 26,142, 74,109,138,237, 7,199,233,188,127, 23, 63,219,190,157,203, 46, 60,135,
+243, 47,127, 26,206,106,250,134,135, 41, 12, 12, 51,127,120, 7,209,208, 90, 26,243, 21,148,210,196, 99,163, 48, 49, 69, 84, 40,
+ 80,238,235, 67,119, 14,102, 41,158,132,128,128,231, 62,235,217,124,234, 51,159,227, 79,158,247, 27, 68, 85,232, 43, 6, 20,148,
+226,165, 47,249,125,250,203, 17, 98,230, 57,244, 13,245,145,147, 49, 56, 67, 20,248,104,246, 25, 79,191,146,203,175,186,146,191,
+124,213, 75, 25, 26, 25, 38,194, 17, 37, 49,182, 6,253,189, 3,108,223,187,151,167,234, 43,185,127,223,253, 12, 13,101,188,202,
+169,195,164, 41,249, 76,119, 37,113,224,148,102,222, 56, 18, 5,239,248,208, 39,152,172, 11,172,202,145,164, 6,173, 3,230,235,
+ 13,148,138, 80, 58,231,249,208,157, 0,167, 40,228, 59, 80,121,152,174, 86, 81,206, 32,162, 50,229,206, 94,164, 60,206,108,101,
+134, 92, 33,130, 70,131,161,254, 1,164,148,164,109,137, 37,159,210, 84,160, 84,235, 93,145, 21,149, 60,216,206, 97,179, 73,150,
+216, 6, 66,105,172, 51,196,198,144, 98, 73, 92, 66, 65, 57,172,181,124,226,185,103,240,229,198,189,108,191,235, 46,198,167,231,
+153, 20, 69,106, 21,137,155, 56, 68, 63,154, 90, 80,166, 98, 75, 92, 48,216,203,239, 93,117, 30, 23,150, 2, 26,243, 21,194, 92,
+222, 47,100, 50,107, 69, 20, 2, 97, 29, 78, 72,255, 94, 43, 61,239, 22,210,217,226, 20, 11, 44,218,250,134, 31, 38,126,150, 15,
+102,119,218, 14,103, 31,178,250,108, 31,182, 46,253,112,243,247, 87, 55,196,191, 82, 32,220,246, 37,254,115,165,226,149, 18,252,
+228,115, 31,225,255,124,244, 95,217, 61, 54,197, 68,181, 65,221,120,102,177,234,124, 76, 37, 22,124,246, 83,159, 65,135, 37,174,
+254,189,223,125,140,105,119, 69,117,116, 39,149,185, 10, 73,163,206,220,124, 21, 36,204, 84, 27,140, 87,235, 56, 33,152,155,159,
+230,210,179,214,242,181, 91,126,192,240,250,181, 62,123, 42, 89,188,127,152, 91,168,180,162, 17,199,104,173,178,172,131, 39, 45,
+105,164, 9, 74, 42,226, 36,245,130, 49, 70,160,181, 34, 78,234,132, 65,208, 58,182, 37,245, 77,116,169,239,139, 9, 2,133, 49,
+ 94,247, 34, 77,211, 12,131,100, 48, 25, 57,139,210,138, 56,110, 16,134, 17, 42, 51,232,141,122,236, 1,203,102, 1,162,101, 76,
+ 10, 86, 96,164,194, 89,135,146, 11, 80, 63, 73,138,196,115,206, 91,147, 32,101,208, 26,102, 38,141,209, 90, 18,100, 64, 54, 37,
+ 0,109,179,108,177, 33, 12, 61,129, 76, 16, 40,146, 52, 33,208, 1,113,156, 16,133,129, 47,255,102,231,218,178,121, 29, 47,251,
+227,223,195, 56, 77,169,220,201,200,112,151,159,246,206, 35,121,125, 11,155,151,121, 22, 25, 75,142, 79,137,183,219, 22,155, 49,
+239, 5, 12,143, 44,229,210,203, 46,226,216,209, 9,234, 13, 16, 66,123,245, 58, 33,176, 46,165, 80,200,225, 76, 29,129, 97,221,
+250,149, 12, 47, 27,192,186,133, 32,224,161,240, 22,143,218,168,187, 54, 75, 39,192,215,209,219,232,251, 30,110,223, 92,235, 84,
+ 22,205,136, 12, 28,230, 50,160, 87,146,106,114, 97, 55, 34, 44,129, 73, 49,137, 33, 69,226,136, 50,104,155, 65, 9,135,115, 14,
+ 35, 32, 80,154, 32,171, 35,165,214,120,207,197,217,236,194,229, 66,218, 61,235, 31, 60,157, 35,220, 2,159,100, 75,152,179, 41,
+ 66, 5,173,218,185,115, 80, 63,177,139, 31,252,219,251, 65, 68,220,242,189,219,169, 91,159, 46,169,205,204, 50,122, 98,154, 35,
+211,147,204, 37,198, 43,136,137,148,212,224,117,222,141, 1, 37,168,167,150, 0, 47, 38, 83, 53,150,216, 77,113,240,155,183,177,
+ 99,235,110, 46, 56,111, 3,235,227,243, 40, 78, 77,208, 61,178,142,100,242, 40,165, 21, 27,153,159, 56, 14,141,121,114,229,152,
+ 52,134,233,137, 41, 24,221, 71,231,242,245,232,206, 78, 66,224, 5,207,184,162, 69, 25,242, 0, 0, 32, 0, 73, 68, 65, 84,140,
+ 31,124,251, 27, 60,251,105,151, 83, 14, 44,207,191,234, 2,166,143, 29,229, 77,127,249, 26,148,141,121,197, 11,158,201,111, 63,
+235,217,116,136, 26, 37, 81, 37,194, 49, 54, 62,198,255,250,235,127, 96,106,190,193, 69, 91, 54,177,105,237, 42,142,237,222, 69,
+209, 86, 41,105,120,229, 31,191,152,255,249,246,247,241,162,223,121, 57,171, 86,173,226,175, 94,245, 50, 74, 22,194,180, 70, 65,
+ 43, 84, 2,170, 62, 75,135, 76, 81,206, 18,132,146,123,183, 31,100,251, 47,127, 65,164,251, 8, 34,131,178, 49, 46, 73, 73,173,
+ 33, 12,242,212, 26, 53,242, 90,163,133,246, 84,190,243,179, 8,160,164, 36, 1, 14, 29, 87,120,217, 11,174,225,208,225,125, 28,
+ 58, 62,139,116, 53,158,116,225, 70,158,120,241, 5,216, 56,129, 92,174, 77,109,221,225,172,197, 89,147, 77, 28,209,194, 56,184,
+140,163,217, 37, 41, 86, 42,250,117,194,116,125,138, 78, 36, 37, 81, 69, 89, 67, 50, 63,207,220,232, 61, 76,111,187,139,241,251,
+119,176,116,244, 0, 34,172,115,172, 96,152,139,167, 73,165, 66,228, 11,232,158, 14,130, 66,158,129,206, 28,231,108, 26,161,220,
+ 25,114,226,248, 81,226,249, 25,250,151,143,144,239,234,197, 89, 3, 82, 33,164,196, 9, 79,243,235,108,102,236, 93,102,106,133,
+122,224,132,115,130,172, 87,178, 53, 6,165, 16, 15,106,122,197, 67, 4,146,238, 65, 28,128, 71, 51,189, 31,233,252,253,181, 26,
+247,255,194,155, 53, 41, 82,105,142,221,251, 99,174,125,211, 27,217,126,112,140, 74,156, 82, 75, 13,213, 52, 37, 16,138,154,117,
+ 4,129,102, 62,110, 48, 57, 51,205,157, 63,248, 33, 79,125,238,179,136,114,209, 99, 58,231,253,183,223, 64,210,136, 73,147,148,
+ 80,107,142, 79, 87,136, 83,131,113,142,186, 49,164, 14, 26,115, 51, 60,235,170, 39,114,221, 87,111,226,140,243,207,121,120,215,
+238,148, 20,144,179,130, 40,244, 40, 90, 99, 61, 19,156,181, 41,174, 86, 99,207,142,109, 28, 62, 58,202,192,208, 82,182, 92,124,
+ 9,198, 38, 94,210,218,166,104,169, 48,158,211,205,175,155, 89,182, 52,142,235, 25,176, 79,120, 94,118,147,144, 90,227, 69, 80,
+124,162,159, 48,212, 88,107, 50, 17, 20, 77,148,145, 63, 5, 81,228,235,230, 38, 37, 80,130,212, 90,164, 85, 56, 41,176,169,245,
+234,158,162, 73, 93,235, 48,214,160, 84, 86,162,203, 96,234, 90, 11,140, 77,189, 64,147,214, 56,103,125,144,102,241, 56, 41, 33,
+ 51,235,149, 16, 4, 2,103, 83,162,200,131,120,147, 36,241,116,183, 8,132,131, 13, 27,214,144,216, 54,121,139,204, 49, 80,205,
+121,207, 98, 98,169,102,224,235,178,117,192, 57,239, 32, 88,151, 18,105,205,170, 21, 35,104, 25, 48,122,116,140,184,145,146, 47,
+ 21, 16,153,221,178, 54,166,220, 89,100, 96,176,135,165, 75,250, 61, 40, 91,184,140,115,127,113,116,222,142,183,120, 76,211,209,
+ 61,152,155,240,136, 23, 15,187,144, 2, 76,155,189, 74, 65, 54, 81, 50, 20,167, 72,253, 93,111,181, 2,169, 22,138,254,129,253,
+193, 11, 78, 65,147,194,176,105,140,253, 77,207,232, 70,155,186, 32,242,244, 6,221,185, 24,236, 52,105,165,206,196,206, 29,148,
+250,122,153, 58, 49, 67, 87, 95,137, 92,127, 47, 95,253,199,247, 50,122,248,110,254,125,207, 49,186,187,151, 49, 57, 57,206,241,
+233, 89,226, 84,112,124,190, 70,146,196,196, 38, 69, 10,129,209,130,185,212,210, 48,134, 46, 4,171, 13,212,181,224,144,117,212,
+180, 68, 57,199, 18,173,232, 8, 21,185, 80,242,228, 77,203,184,236,178, 43,232, 29, 92,141, 80, 17, 29,157, 57, 74,131,203,232,
+ 58,243,124,102, 14,238,167, 49, 59, 69,169,183, 27, 21, 4,136, 32,194, 38, 13,194, 92, 25, 93, 42,162,251, 87,146, 90,144,214,
+144, 38, 9,168,188,247,151,141, 23, 86,136, 27, 53,162, 66,158,106, 61, 37, 10,181,239, 17,215, 1,117,163,168,213,125,250, 90,
+ 7, 77,239, 47,245,131,206, 58, 80, 57,172,131,122,173, 78, 46, 23, 17, 40,129, 73, 98, 47,176,224,188,198,187,179,150,146, 74,
+177, 38, 65, 68, 69, 42, 41,204, 37, 48,223, 0,215,168, 18, 4, 26, 25,104,170,117, 79, 99, 43, 21,196,141,148, 82,161,136, 73,
+ 18, 47,176,227, 44,145, 14,176, 73,140, 14, 35,156,150,220,189,117, 27, 82, 74,206, 61,107, 61, 37, 19,147,211,146,176,148, 35,
+201,198,141, 20, 77,108,143,203, 28, 69,227,129,107,206, 33,172,197,212, 26,132, 66, 48, 89,111, 48,109, 4, 34,140, 8, 82, 67,
+ 78, 41,228,137,253,196, 7,183, 51,119,112, 23,199,238,219,193,225,125, 7, 57,118,232, 8,199,143,143, 81, 67,210,221,219,195,
+192,178,165,132,133, 18, 8,232,232,237,163, 60, 52, 76,170, 67,114,165, 34, 61, 75,135, 41,117,117, 51,184,108,132,190,101,203,
+219,106,231,190,198,223,140,220, 69, 83, 21,174, 57, 78,165, 90, 92,111,119,109,181,120,209, 54, 41, 79, 13,139,155,204,122,238,
+ 52,166,190,169,161,157, 45,211,139, 58, 12,221,105, 82,213,255, 41,162, 92,251,255,241,249,127,213,235, 55,173, 53,227,251, 31,
+250, 95,252,228,150,239,179,247,248, 52, 99,149, 42,181, 70, 74, 61, 53,212, 18, 67, 61, 49,212,141,241, 45,190,249, 2, 67,221,
+125, 92,118,225,165,188,228, 53,175,102,253,185,155, 30, 37,142,199, 27,168,159,125,226,111, 24, 27, 61, 70,117,190,194,232,161,
+ 19,220,189,247, 40,227,149, 58,227,149,152, 70,234, 29,138,212,250,121,145,143,138,124,237,198,155, 79,107,216,125,248,164, 78,
+147,166,241,231,137, 27,117,194,200, 27,221,209,159,221,198, 63,255,237,223,179, 99,255, 33, 78, 84,106, 8,161, 8,163, 60,207,
+120,242,211,121,235, 39, 63,138, 51,214,183,145, 73,209,202, 57, 91, 99,145, 90,249, 84,190,244, 70, 54, 77, 19,207, 42,218,182,
+181, 4, 88, 76,230,156, 75, 47, 55, 13,160,179,118,177, 52,105, 32,149, 66, 74, 65,154, 26,180, 14, 73, 51,177,151,214,113, 76,
+ 29,157,245,197, 57,235,127, 60,210,219, 98,210, 56,203, 56,168, 83,108,135, 60,133,225,209, 98,156, 69,101,244,214,214, 56,164,
+242, 86, 36, 35,217, 91, 92,222,178, 32,164,111, 15, 52,214,103, 49,104,203, 29,156,206,238, 53,253,217,212, 26,148,244,130, 49,
+141,134, 33,204,169,172, 92,225,159, 67, 16,156,210, 5,155,117, 24,121, 2, 25,219,114,146,108,246,218,163,237, 31,251,184,214,
+191, 74, 81, 62,107,133,199, 58,183, 0,183,119, 94, 85,166, 89, 43,245, 98,178, 46, 99, 87, 91,168, 81, 58,231, 9,253,197,169,
+ 94,138,115, 8,169, 51, 28,122,179, 23,124,225, 59, 42,225,251,159, 61,249,138,163,157, 83,201, 97,188, 68,168, 57, 1,137,161,
+114,116,148,227, 59,247,208,191,122,152,185, 19, 19,216, 56, 70, 21,123,184,243, 51,159,164, 90,171,112,243, 47,142,210,213, 89,
+ 98,124, 98,150,123, 15,141, 98,165, 0, 17,144,198, 9, 71, 76, 76,167,133, 1, 41, 57, 39,118,244, 38, 41, 27,115, 17,203,243,
+ 17, 93,197, 60,249,188,239, 93,188,119,108,134, 35,206,113, 93,163,193,129, 56,197,132, 10,187,109,148,131, 99,223, 98,245,242,
+ 37, 60,225,130,243, 25, 90,125, 25,113, 67,115,244,142, 91,232, 89,119, 54, 46,137,153, 60,184,143, 66, 87, 47, 97,169,140, 48,
+117,140,148,152,217,132,120,246, 30,116,152, 35, 77,235, 4, 65,158,168,171, 15, 17, 22,112,129, 34, 49, 13, 10,229, 34, 73,146,
+208,155,151, 72,105, 51,242,127,139, 50,142, 66,212, 28, 24, 22, 35, 28, 40,137,148,254,199,153, 4,225, 32,137, 32,208, 41, 73,
+146, 16, 70, 33, 14,175, 37, 46,108,138,148, 22,129, 65,230, 35,226, 56,166, 67,106,242,210,226, 66,139, 11,241,200, 81,165,176,
+ 37,139,200,178, 40, 46,116, 88, 59,231,219,249,164, 6, 39, 73,109,141,168, 28,145,186, 4, 33, 4, 79, 63,103, 45, 10, 65,220,
+168, 82,202,229,145,129,198,248,218, 79, 91,160,231, 90,160, 93, 45,188,250, 90,243,125,130, 16, 16, 12, 22,243, 12,182,121,179,
+233,212, 24, 83, 51,199,152, 58,122,136, 99, 71, 39, 24,155,174, 51, 54, 93,225,248,124,157, 25,227,249,230,143, 77, 76,144,226,
+ 24, 90,225, 53, 3, 38,143,141,147,159,171, 81, 30, 90, 70,206, 58,130,210, 44,197,114, 25,155,212,177,141, 6, 50, 12,179, 18,
+ 84,150,126, 7,132, 18,184, 52, 1,165, 23,250,215,155,133,181, 22,211, 28,167, 45,245, 60, 16, 43,101, 31,162,178,190, 72,127,
+171,205,243,126, 48, 96,219,127,154, 56,247,215,128,126,255,127,143,158,247,235,138, 98,126,252, 32, 63,250,240,223,179,107,247,
+ 1,166,231,107, 84,234, 13,234,141,148,134,177,204,199, 94,121,209,137,108, 25, 23, 62,170,143, 77,138, 53, 41, 7,119,239,121,
+212, 70, 29,231, 72,230,103,169,213,170,224, 44,105, 35,230,240,248, 52,197, 40, 96,255,100, 5, 99, 45,169,131,122,106,209, 2,
+140,128,233,249, 57,158,245,204,167,113,211,183,190,199,218,115, 54,159, 98,208, 31, 36,123,226, 20,105, 90, 39,140, 66,102,246,
+111,231,218,191,121, 61, 63,220,113,128,189, 19,115, 24,103,136,141, 35, 80, 18,165, 21,247,110,187,135,209, 61,135, 88,186,114,
+ 4,165, 20,206, 38, 52,117,190,164, 14, 49, 73, 3, 21,232,214,218,174,181, 23,157,146, 82,182, 12,184,231,221, 0,165, 84,171,
+189, 75,103,249,118, 99, 82, 92,234,208,161,198, 26,143, 39,208, 82, 98,140, 65, 43,207,241,238, 0, 41,189,178,101,115,206, 8,
+217, 86,206,178, 22,165,245,226,150, 63, 33, 50,103, 34,108, 25,116, 95, 22,144,109, 54,202,207,209,230,212,108,170,181, 25,107,
+ 90,198,219,217, 20, 37,101, 22,125,171,236, 59, 59,212, 41,188, 1,174,173,245,181,105,136,181, 12,252,181, 75, 65, 46,183,192,
+ 43,175,181,119,181,146,140,104,203,101,122, 26, 62,158,149,109,237,140,139, 13,185,115,238, 87, 2,203,233,118, 90,208, 71, 56,
+ 30, 23,166,178, 0, 75,208, 18,237,104, 49, 26,181, 3,142,132,106,113,217,185,108, 50,218,182,116,135, 58,101, 32,182, 95,135,
+ 18, 89, 49,199,145, 57, 7,190,110, 41,156,108,153, 0,143, 3,104,234,125, 59,132,157,198, 85,235,204,143, 29,165,114,114, 26,
+231, 96,239, 93,247, 16, 72,193,217, 47,120, 46,223,125,247,219, 57,114,248, 24, 95,185,245,199, 12, 14, 12,114,124, 98,146, 61,
+227, 39,188, 76,168, 81, 76, 41,131,142, 19,222,145, 11,120, 98,127, 39,198, 88,238, 60,124,146,243, 71, 6, 80, 57,205,201,185,
+ 26,227,141,152,208, 58,162, 80,177, 97,100,128, 13,104,174, 74, 18,210, 52,229,231, 19,211,124,122,124,158, 31, 39,134,241,122,
+157, 37,157,154,176,220,137,169,165,140,108, 60,131,198, 92, 66,109,110,146,174,213, 91,152,222,253,115, 76,117, 22,171,243, 48,
+126,130,206, 85, 27, 9,162,136,160,187,151,201,251,238, 37,236,233,103,122,207, 78,146,233,113, 10,157,157,132, 93, 3,132, 81,
+142,252,224, 50,159, 66, 18, 26,100, 4, 78, 33,148,203,200,101, 84,118, 95,253,189,177,217,163, 8, 50,132,191,140,124,170, 48,
+ 23,250,201,104,101,230,113, 26,127, 60, 43, 66, 18, 64,134, 25,179,180,147, 72, 37,113, 50,192,146,195,137,212,183,174, 57,217,
+ 18, 63,240, 24, 49,225, 17,236, 72,239,140, 73, 65, 36,179, 76,140,179, 40,227, 25,247, 80,190,127, 86,102, 19,210,207,133,228,
+148,241,213, 54, 64,154, 96, 44,231,201,112, 90,147,202, 89, 38, 15, 31,225,248,209, 49,198,231, 98,142, 79,206,114,116,186,194,
+ 84,173,193,108, 61, 97,214,194, 64,127, 15,229, 92,132, 85,154,147,213,132,142,238, 60, 81,169,147,185,106, 29, 55, 55, 75, 84,
+ 42, 97,226, 70, 86,103,243,145,128,141,235, 8, 29, 34, 72,113, 82, 45,212,160,149,202,202, 64, 77, 28,199,226,137,231,154,153,
+ 6,225, 22, 9,194,120, 39, 75,183,141,107,153,165,238, 44, 66,234,133,116,184,245, 52, 67, 66, 8,140, 77, 72,173,196, 9,137,
+ 68, 33, 51,109,234,150, 67,156, 53,167,120,181,173, 95,213,176, 45,224, 76, 30,233,188, 95,252, 89,249,168,246, 11,174,155, 56,
+ 77, 6,191,237, 51,174,173, 36,216,158, 9,105,223, 63,130,239,253, 96,215,209,124,118, 19,219,127,196,157,215,125,156, 67, 7,
+ 71,153,154,174, 48, 62, 83,165,158, 26,230,211,132, 90,195,248, 58,174,241,207, 84,226,141,140,148,146,114,161, 64,210, 72,232,
+ 27, 26,202,164,171, 31,172,118,126,186,228,130,166,178,255, 46,226, 90,221,163,209,103, 42, 20, 2, 69,189,145,146,164, 6, 39,
+ 28,181, 56,201,180, 24, 4,198,120,231,114,170, 50,207,243,158,245, 91,252,124,239, 1,100, 54, 32, 4, 15,125,110,165, 3,126,
+248,161,191,231,134, 47,223,192,253,199,103,152,168, 53,176, 88, 20,130, 80,249,206, 18,141, 99,174, 94,229,214,175,220,200,139,
+223,240,231,222, 8, 74,111, 23,100,160, 61,120, 76,103, 37,167,182, 86,190, 32,227, 7,177,153,155,213, 52,230, 50, 80,200, 76,
+161,177, 9,126,181,206,183,231, 57,219, 4,145,250,110,145,102,107,160,143, 98,205, 41, 70, 96,129,158,213,225,141,166,115, 18,
+169,116,107,174,120,162, 43,237,255,158,201,210, 74,157,137, 83, 53,107,225, 77,184, 11,139,179,187, 94, 47, 61, 75,235, 43,111,
+237, 69,179,148, 38,188, 28,108,134,200,166, 73,212, 34, 88,140,156,147, 66,103, 92, 35,114,145, 99, 46, 69, 6,128,206, 72,197,
+112,210, 43,131,182, 57,249,194,137, 22,200, 69,176, 48,166, 91,199,114, 15, 63, 9,221, 41, 31, 18, 66,160,147, 95,161,126,230,
+ 19,188, 11,175,101,155,145,182,217,119,180,139, 62, 47, 31, 80,207, 51, 44,238, 32, 95,188, 92, 72,175, 39, 43, 78,249,140,112,
+ 45,184,146,197, 27,116, 21,159, 64,146,224, 26, 53,226,217, 89,106, 83,211,204, 29, 31,101,110,102,150,217,227, 39,185,236, 53,
+175,226,167,159,252, 44, 59,126,241, 83,254,125,207, 73,100,208,197,190,209,227, 28,157,157,165, 30, 39,204,104, 69,174, 90,231,
+229, 22, 94, 56,210, 75, 56,216,205,177, 35, 19, 36,206,177,121,245, 0, 59, 39, 43,156, 24, 51, 76,165, 9,145,116, 32, 21,121,
+ 4,149,212, 34,156, 99, 73, 62, 79, 42, 44, 70, 74,222, 52, 56,200,241, 74,149, 91,199,170,124,253,151,187,185,164,234,216,180,
+118, 45,163,187, 66,198,142,140,209, 63,188,142,227, 91,127,137,107,156,192,137,165, 20,187,138,136,194, 18,102, 71,143, 80, 92,
+ 50,140,153, 56, 73,207, 89,231, 51,189,103, 7, 93,107,215,115,248,230,123,113, 82, 32, 10,157,212,227, 58,211, 71, 15,210,185,
+114, 45,133,222, 65,156,246, 2, 42,173,197,142,197, 64,171,230, 61, 83,104, 16, 58,115,196,188,241, 23,109,218,204, 34, 3,176,
+ 52, 25,236, 84, 83,125, 73, 45, 28, 83, 10,129, 21, 1, 26,151,233, 53,235,197,207,109, 1,160,209,122,254, 74, 74,164,149, 77,
+ 41, 36,140,108, 91,226, 93, 54, 9,157, 56,165, 1, 91,208,174,231,230, 23,133,133,188, 12,206, 98, 27, 13,166,166,103, 24, 29,
+159,226,196,228, 12, 19,149, 42, 39,171, 13, 78,214, 13,166, 88,166,187,163,140,210, 1,249,222, 62, 58, 7,135,168,202,144,169,
+241, 49,250, 59, 67, 86,173, 91, 65, 71,119, 23,249, 82, 39,131,195,203, 25, 90,189,150,168, 80,160, 22,199, 30,172,103,235, 16,
+ 68,254, 91, 56, 95,250,145, 89, 77, 93,120,145,105,191,160, 72, 50,165, 38,219,154,136, 18,185,216,240, 72,221,138,165,154, 32,
+121,175, 23, 45, 23, 77, 41,145,229, 3,109,155,151, 46,149,194,166, 14, 99, 44, 46,181,132, 90,130, 82, 24,227, 85,179, 81,153,
+ 18, 30,143,210,168,180,207,193, 71,160, 13,239, 78,153,247, 15,174, 10,246,112, 6, 93,114,170, 43, 47, 30,108,145,105, 7, 33,
+102,191,187,246,247,197, 99, 44,231, 55,219,135,164,224,200, 15,191,200,142, 91,111,228,232,209,163, 28, 28,157,224,248,108,149,
+ 56, 53, 36, 54,211, 46, 87, 62,146,141, 19,139, 75, 93, 22,177, 67, 20,104,180,144,132,161,102,233,250,213,158,130,249, 81, 98,
+239, 79, 28,217,237,203, 85, 73, 74, 61, 78,232,239, 42,177,235,232,164,103,163, 52,150,196,250,115, 55, 18,131,193,101, 81,171,
+224,192,137, 99, 60,239, 73, 87,114,253,143,127,148, 25, 44,245,160, 75,244,252,145, 93,124,227,173,255,157,173,247, 31,100,251,
+209, 41,180, 16,164,169, 37,146, 10, 99, 45, 74,121, 37, 54,133, 35,167, 52,163,163,135, 73, 91,134, 75, 47,130,139, 52,127,111,
+ 7, 91, 54,159, 99,154, 38, 72, 29,128, 82,212,230,166,185,255,206, 31,115,219,247,110,230,192,190, 3, 32, 21, 91,206, 59,143,
+231,189,226,213,116,244,247, 47,190, 31,109,201, 38, 63, 78,213, 34,231,206,102, 22,120, 17,110,192,101,236,213, 72, 4, 41, 66,
+168, 69, 2,174, 2,215,226,108, 95, 12, 66, 59, 61,137, 83, 51, 85,191,176,136,202, 83,189,191,197, 70, 85,180,138,239,109, 8,
+241,102, 0, 98, 90,246, 73,136, 38,100,214, 34, 90,140,127,109,129, 74,123,143,220,175,224,141,183, 98,218, 44,251,128,117,232,
+198,175,208, 16,210,158,104,108, 38,196,156, 92,184,125, 15,134,224, 21,143,226,156,139,208,186,217, 13, 20,153,186,112, 96,102,
+ 48,187,239, 96,251,103, 62,197,166, 87,191, 30, 85,234,163, 49, 62,134, 80, 1, 73,181,194,190, 29,251,153, 61,122,136,181, 79,
+188, 2,109,107, 76,143,141,113, 98,198,114,120, 38, 70, 41,203,108,173,193, 68,189, 65, 49, 73,121,147,113,188,240, 9,235, 17,
+133,136,153,217, 58,197,114,142,189, 56, 62,119,108,154,101,192,110, 7,197, 66,142,176,152,103,223,236, 60, 69,101,168, 38,150,
+126, 96, 28, 40,204, 85,216, 28,104, 58,149,226,115,211, 99, 44, 85,146,171,187,186, 40,205,228,184,245,246,173,236,156,152,224,
+146,165,199, 57,247,146,115,168, 76,141,145,214, 13,129,171, 83,175,156,100,118,236, 56,185,206, 94,130, 82, 9,113,236, 48, 38,
+174,114,226,151, 85,130,158, 65, 26,219,182, 97,115, 93, 36,141,152,169, 61,219, 24, 56,247, 10,102,166,103,177, 58,244,108, 69,
+ 46, 33,174,213, 72, 11, 29,139,238,119,251,115, 17,109,206, 85,147, 22, 86,138,197, 9, 76, 3,139,212,213,116,219, 3,144,205,
+ 76,115,107,194,103, 90,196,206,115,202,167,109,142,156, 56,221,212,145, 11, 99,193,181, 47,235, 89, 42,172,148,201, 48, 58,215,
+206,228,230,192, 88,223,101,235,108, 86,178,201, 12,187, 53,212, 39,142, 49, 57, 53, 73,181, 50,199,108,101,158,217, 90,157, 21,
+235,215,161,195,128,241, 99,199, 40,151,138, 12, 12, 14, 81,236, 40, 33,145,200, 48, 71,119,103,153,101,203,135, 41,150, 59,233,
+ 27, 94, 78,239,202, 53,228,242, 57,140,115,212,146,216, 79,112,171, 17, 74,131,136, 17,132, 30,221,107, 13,210,202, 44, 43, 33,
+ 23, 34,200,204,179,183,109,102, 74,156,102, 28,167, 44, 80,221, 34,252,189,109,142,235,176,249,191,206,247,218,136, 12, 25,141,
+147,152,212, 75,225, 6, 74, 97,141,243,156,254,169, 33,149,158,178, 57,109,102,179, 30,197,218,224, 30,197,252, 6, 78, 43,247,
+121,186,107,124,172, 9,131,135, 67,226,139,199,184, 62, 61, 24, 48,191,169, 19,126,240,134, 15,113,248,222,187, 24, 61, 60,202,
+254, 67,227,212,141, 33, 10, 36, 39, 43,117,172,131, 64, 43, 58,149,164,154, 26,202,145,226, 88,156,160,149,196, 57, 63, 14,138,
+249, 60,229, 98,145,176,167,139,198, 41, 4, 68, 11,233,143,102,144, 39,218, 65, 76, 32, 32,153,157, 66, 72, 65,163,222,160, 24,
+133,236, 60,120,156,185,216, 32,156,163,158, 90,148,128,212, 90,111,208, 51,182, 75, 44, 68, 90,115,203, 79,239,228, 47,158,253,
+ 2,222,241,181, 47,129,179, 62,240, 57,213,160,239,184,131,239,127,244,109,252,116,235, 94,172,243,180,168, 70, 10, 2, 45,136,
+148, 38, 54,222, 17,109,162, 56, 6,123,122,152,155,155,161,122,218, 60,202,233,193,155,105,154, 34,180,166,114, 98,148,239,124,
+228,189,124,229, 43, 55, 48, 62, 59,207,120,173, 65, 35,177, 52, 50,231,244,166, 31,222,193,215,190,116, 35,239,250,244,103, 25,
+217,116,230,233,154, 61, 22,157, 79, 60,132,253, 80,178,125,190,233,182, 78,210,133, 79,251,168, 87, 46, 68,192, 45, 7,177,221,
+ 61,104,163,124, 62,237, 40,122, 32,229,238,194,115,180,109, 15, 55,251,177,110,225, 51, 25,186,182,137,169,105,102,246, 22, 71,
+218, 60,128,184,234, 65,141,247,195,124, 70,100,199,106,126, 74,127,239,159,207,162, 86, 79, 72, 27,134,122,236,211,180, 42,146,
+190,170,231, 22,162, 41,219, 92,112,164, 67, 10, 7, 86, 96,141,223, 7,128, 12, 37, 34,200, 4,186,140,243,117, 72, 99,193, 64,
+146, 58,106, 85, 71,218,180, 40, 70, 32, 13, 4, 54,139,198,243, 22, 23, 64,190, 44,137, 10,158, 67,221,103,241, 29, 78,250, 20,
+134,176, 6, 29,150, 89,186,241,106, 54, 61,253,141,255,151,176,247,142,179,236,186,234, 61,191,123,239, 19,110,168,212,213, 73,
+106,169,149,213,146, 37, 89,150,179,141, 45,108,112,192,198, 96, 12,198, 4, 99,114, 52, 96,242,204,131, 55,192,131, 97,224,241,
+ 97,200,240, 48, 25, 51, 24,143,193,198, 96, 27,131, 19,248, 25, 99,108,225,164,172,150,186,213,234, 86,231,234,234,138, 55,156,
+176,247, 94,243,199,218,231, 86, 9,222,231, 51,127,244,167, 90,234,170,123,111,221,123,206, 94,107,253,210, 34,158,254, 44,213,
+133, 11,140,214, 90,142,124,205, 27, 41, 15,221, 76,216, 88, 71, 36, 99,186,186,198,169, 7,143,115,255,103, 62, 71, 35,145, 55,
+124,237, 55,243,196, 63,255, 13, 79,156,186,200,123,191,240, 24,251, 22,151, 56,189,118,153,237,170, 97,185,106,185,247,139,111,
+101,122,112,153,122, 99,139,122, 92,243,240, 67, 79,176,226,225,157, 65,184,253,202,189, 60,122, 97,141,243, 34, 44,182,129,218,
+ 89, 34,194,177, 86, 88,180,112, 49, 66,153, 14,216,127,242,158, 43, 67,224,178,133, 11, 81, 56,187,190,198, 80,224, 25,115,139,
+220,245,232, 6,247,212, 39,184,250,166, 67,244,183, 61,198, 26,150,246,238,231,228,189,159,225,217, 47,187,139,237,209,152, 11,
+ 71, 31,100,188,185,198,222,195, 55,114,197,237,119, 48, 88,218,207,120,229, 28,139,135,174,135,162, 96,114,233, 60,147,149,243,
+236,191,237, 14,189, 88, 45,248,170, 5, 17,134,120,254,228, 23,110,165,169, 54,104, 91,193,123,161,173,132,232,133,182, 22,188,
+135,166, 17,154,102,199, 22,104, 51,195, 96, 8, 75,139, 80,244, 12,153, 53,184, 12,202, 82, 59,220, 24, 68,125,244, 65,168, 38,
+ 66, 85, 9, 62, 8,185,131,178,111, 40,114, 67,150,171,205, 67, 82,118,123,219,234, 5, 31, 69,102,141,175,179, 42,188,201,157,
+ 81, 15,170, 75, 40,117, 98,103,250,125,147,172,145,105, 34,193,130, 7, 31,244,226,115, 86, 53, 63,209,128, 45, 12,174,176, 52,
+151, 2,143,158,242,108,143, 34,227,137, 80, 54, 66,216,206,112, 65, 88, 30, 8,147,177,112,225,232, 67,244,156,101, 41, 97,212,
+193,193,218,113, 75,181,199,112,110, 96,200,250,134,114, 78,179,243,163, 24,197,178,131, 16,188,224, 74, 21,215,152, 96,200, 27,
+176, 99,232, 77,161,140,150, 65,190,200,220,242, 45,212,163,179, 76, 70,231,217,116,129, 81, 17,137, 70,200,157, 97, 46, 88, 6,
+ 88,140,131,105, 97,136, 3,139,157,115,184,197, 28, 83,170, 45, 71,210,123,226,130, 65,198, 80,136,193,230, 57,253,189,119,178,
+103,255,115,152,222,251, 33,216,184, 72,214, 58,172,100, 56,167,147,110, 4,164, 48,208, 51,180,139,134,182,167,135, 79, 81,131,
+155, 58,108, 48, 16,157,190,191,226,176, 70, 87, 9, 22,203, 55, 96, 92, 15, 63, 58, 15, 97,186,115,248,204,206, 60,229, 28,213,
+115,109, 49,229, 30, 36, 86, 24, 95,237,112,147,169, 32,206,224,107,231,118, 53,218,233, 49, 66, 72, 9,138,122, 6, 32,154, 28,
+ 56,131, 85,163,236, 18, 32,106,128,203,127,154,186,173, 77,252, 99, 7,163,166,174,208, 25, 76,190,160, 34,169,118, 59,209, 63,
+ 78,191, 90,171,212, 72,183,148, 72, 28,224,119,120,201,238,169,141,112,206,237,227,204,185, 85,206,156, 62,195, 19,167, 87,217,
+152, 54, 92,216,154, 48,110, 2,185, 49,204, 15, 10,100,218, 82, 7,161, 95, 58,181, 73,109,142, 57,191, 49,130,104,200,178, 17,
+ 87, 47, 95,137,111,166,132,119,254, 23, 88, 58,128, 29, 46,129,117,200,100, 27,191,117, 25,218, 10,105, 38, 72, 91,167,247,196,
+ 34, 65,105, 23, 59, 92, 96,202, 18, 54,179,132, 54, 80, 53,129, 75,219, 53, 18,133,237, 38, 16, 69,155, 89, 47, 50,107,218, 66,
+242, 27,183,162, 91, 53,223,251,177, 15,242,162, 31,255,118,238,190,225, 44,109, 94, 49,206, 38,152,178, 33, 74, 75,217, 95,228,
+193, 79, 28,228, 11, 15, 61, 65, 20,225,244,250,136, 34,119, 84,109, 36, 51,142,126, 47,103, 32,134, 81,237,201,140,161,141,176,
+ 61, 29, 51, 55, 24,178,249,209,151, 34,205,152, 64,139,151,144, 86, 95, 91, 98, 47, 16,179,128, 43, 33, 90,165, 6,104, 23,248,
+196,159,205,243,207,159, 61,195,137, 75,155,156, 29, 85, 56, 3, 77,208,143, 43, 75,130, 59,137,129,245,241, 38, 31,121,219,219,
+ 41,246,252, 14,181,213,223,175, 73,205,186, 94,114, 70, 81, 49,129, 44,203,112, 24, 92,180,244,157, 99,206,229, 12, 76,129, 51,
+150, 73,221,178,222, 84,108,214, 45,147,160,219, 26,173,129, 72,164,110,161,109, 18,109,104,211,231,157, 66,233,103,170, 43,129,
+126,207, 96, 51, 61, 87, 36, 10, 89,174, 89, 24,193, 67,221,118,187, 43,244,140,202,114, 69,136,186,186, 92,150,202, 8,147,236,
+111,173, 7, 95,107, 82,186, 73,180,162, 85,119, 46,121,169,154,113,155,146,212, 69, 32,180, 66,235,149,246, 40, 51, 40,250,150,
+133,161, 33, 47, 44,121, 6,189, 57, 71,191,231,232,149,234,193, 47, 10,200, 75, 71,153,232, 12, 35,129,141, 77, 79, 53, 9, 68,
+ 47, 84, 85, 36, 68,216,218,136, 84,211, 72,227,133,108,189,217,160, 65, 24,213, 42, 75, 43, 50, 67,158, 22,151,248, 8,161, 78,
+107,203, 50,212,118,144, 38, 60,223, 64, 86,148,132, 88,145,139,114,178,101,207, 96, 34,196,100, 81,232, 26,166, 42, 10,117,186,
+255, 9,234, 10,203, 49,228,141,129, 92,151, 14,216, 18,108,207,226, 75,163, 34, 47, 49,184,204, 17, 98,160, 55, 88,230,139,190,
+242,183, 56,116,227, 23, 67,243, 24,225,228,191, 98,122, 7,137,102,155,213, 99,247,112,197,107,190, 10, 66,139,196,192,248,242,
+ 26,103, 31,124,136,123, 62,249, 73,126,249,111, 63,202,133,234, 9, 54, 30,254, 20, 15,124,226, 83,188,239, 19, 31,103,121, 97,
+153, 83, 43, 23,152,120,207,202,196,115,246, 69,183,176,210, 4, 56,187, 74,214,115,220,243,216, 10,111,207,134, 44,239,159,231,
+234,181, 13,142, 87, 13,167, 19,105, 54,148,128,153, 6, 46, 69,141, 64,149, 8, 91,104,102,250, 9,224, 90,224,178, 8,171,192,
+161,204,112, 54,194,150, 8,159,218,222,228,121, 83,199, 93,143, 4,206, 14,238, 35, 92,123,144,167,221,124, 29,231, 79, 27, 46,
+173,158,100, 50,185, 1,231, 96,105,239, 60,253, 50, 50, 89,125,130,135, 63,248, 40,131,189, 7,233,239,217,135, 60,246, 48,251,
+175,189,129, 61,215,220, 76, 51,153, 48,186,180, 74,111,239, 50,205,165, 21,222,240,220, 23,241,204, 91,143,240,245,223,241,109,
+124,231,207, 28,229,247,254,251, 13,180,227,117,154, 86, 24,215,224,235, 72,104, 58, 72,207, 80,213,130,151,136,115,234,103, 12,
+193, 98, 91, 40,173, 33,235, 65,191, 52,180, 38,224, 10,131,111,180, 41, 8, 2,190, 20, 38, 94,104, 69,200, 44, 84, 1,138,204,
+ 48,200,211,148,157,138,174,110,168,139,122,145, 39,145, 72,102, 53, 94,177,138,144,245, 45,209,107,198,190,177,144,101,194,216,
+ 90,138, 92,111, 76, 9, 6, 73,129, 22,173,236, 40,227,109,169,185, 4,189, 62,180,214,210,154,192,212, 70,198, 81,152, 4, 97,
+161,167, 31,132,193,144, 91, 97,169,103, 24, 56,195,162, 24,114,111, 40,140, 97,185,111,145, 2, 70,185, 16, 11,129,129, 16, 74,
+ 8,198,226,114, 67, 68, 8, 77,196,228,250,123, 56,103,200, 60,216, 6,178, 40,100, 88,202,148,199, 16,170, 85,218,208, 48, 37,
+ 48,118,145, 9,162, 57,205,187,186,119,113, 22,151,131,233,129,153,131,208, 7, 91, 68,218, 86,176, 46,217, 99,188,193, 70,139,
+ 4,240,153,103, 58,122, 20,191,126,150,162,222,166,232,132,162, 68, 68,148,211,180,153, 35, 90,136, 86,139,161, 53, 49,125,143,
+219,105,138,130, 36,106, 63, 49,210,206, 18,167,171,152,124,142, 24,234,157, 25, 68,189,122,233,176,144, 89,118,191,158, 86, 27,
+ 59,255,158, 40, 7,118,241,169,138,106,248,164, 49,232,160,241,167,230, 70, 72,199,173,117, 54, 34,219,201, 95,172, 22,243,110,
+ 8, 73, 13,197,108, 97, 84,148,110,121,195, 12, 25, 53, 9, 90,148,182, 81,199, 77,210,115, 64, 23,223,155, 14,222,142,155, 20,
+ 63,107, 28,186,169,202, 2,155,131, 43, 57,245,196, 25,206,159,185,192,227,103, 86,217,158,180, 76, 26,207,160,200, 16,244,204,
+105, 93,142, 72,205,234,229,117, 70, 77,224,192,129,189,188,233, 13, 95,206,235,191,249,155,184,230,200,157,204,205, 47,146,247,
+ 10,144,134,118,125, 29,147,101, 42,124,242, 77,154,210,116,139,138, 49,218, 92,249,241, 6,147,207,189,159,246,220, 81, 76, 48,
+216,189, 87, 19, 46,110,232,185,151,193,165,245,109,114,107,216,106,125,242, 72,119, 5,105, 39,100, 11, 68,205, 69,137,223,109,
+218,150,191,248,216,253,124,209, 29,119,226,227,163,216, 76, 19, 91,114,147, 81,173, 9, 31,191,231, 97, 54,155, 70,105, 55,132,
+210,169, 14,233,154,133, 1,235,211, 22, 99,160, 47, 14,103, 51,214, 39, 83, 50,231, 40,203, 18,241, 53, 38, 3, 27,117,171, 36,
+206,129,139, 24,103, 20,193,138, 30, 17,135,149,130,119,252,130,240,222,207,221, 75,139, 97,210,122, 36,170, 6, 32,138,230,136,
+116, 75, 81, 22, 6,125,170,198,211,134, 72,127,184,136, 84,107,196,168, 13,139, 72, 82,218, 59,176, 81,155, 64,211,234,176,208,
+115,142,210,100,244,200,113,100,250,126, 89,155, 18, 38, 53,191,194,166,194, 92, 53,187,250, 70,146,192,207,170,166, 40,207,100,
+ 70,113, 73,147,168, 91, 5, 2,245, 53,196, 29,200,104,246,125,179,173,115,169,248,167,203,168,109, 32, 43,210,153,100,180, 52,
+198, 84,232,109, 0, 87, 66,222, 99,230, 14,202,146,174, 54, 81,239, 16,116,137, 86, 89,232,191, 73, 43, 76, 42, 24, 90, 33,179,
+134,210, 25,122,133, 37,179,134, 86, 32,115,150,126,225, 48,153, 22,208, 24,133, 65,223, 81,148, 6, 39, 58, 68,133, 16,152, 27,
+194,120, 27, 70, 85, 36,155,100, 13,193, 7,198, 54, 82, 22, 6, 95, 64,204,180,107,154,182,122,120,196, 86, 29,237,214,166, 67,
+190, 21,174,190,250,102,174, 59,242, 28, 30,190,247, 35,172, 95,190, 76, 22,160,231, 45,214,136, 38,128,165, 55, 56, 68, 93, 32,
+ 66,166, 16,111, 72, 40, 73, 12, 6, 49, 6,151, 67,155, 9,189,210, 48,205, 18, 67,148,101, 88,215,226, 6, 87,240,210, 87,253,
+ 22,135,111,124, 25, 34, 91, 8,171,152,202,227, 22,246,178,254,240,253, 60,246,137, 79,178,124,235,109,106,251,154,172,115,233,
+177,163,156,184,247, 94, 30,248,183,207,242,143,255,122, 31,127,254,199, 63, 79, 94,206,113,242,190,135,184,231,158,251, 56,191,
+ 53,161, 9,134,173,182,101,141,156,127,122,198, 65,154,224,105, 71, 21, 49, 4,222,241,200, 5, 30,190,254, 90,214, 39, 19, 62,
+115,226, 52, 7,128,190,129,101,103,216, 12,194,195, 62,114,251, 85,251,248,233,175,127, 45, 55,221,241,116,150, 15, 30, 98, 97,
+ 56, 71,150,151, 52,147, 41,227,201,152,245,245, 85, 62,246,119,239,227,255,249,231, 79,114,110,107, 76, 1, 92,229, 12,247,133,
+192, 19,245, 54,139,255,242, 0,175,186,125,194,158, 47,253, 18, 30,253,240,167, 57,116,232, 0,163,211,151,184,246, 57, 87,225,
+174,185,134,182,105, 25, 95,218, 38,182,171,108, 79, 85, 20,149,247, 74,214, 79, 63, 65, 94,244, 89,190,249, 86, 98,244, 44, 46,
+239,229,240,158,189, 92, 51, 44,152, 76, 43, 78,221,247, 4,217,224, 31,249,254,159, 58,193,175,255,252, 94, 66,222, 96,123, 66,
+ 91,107, 97,245,181, 42,175,197, 9,193,171,231,222, 71,176, 65,200, 90,104,141,161,159, 89,178,168, 19,188,247,218, 1, 10,208,
+132,136, 71,136, 78,187,217,128,126,174,193, 11, 25, 58,185,123,152, 21,234, 40,162, 98, 59, 81,132,192,228, 90, 40, 76,145, 66,
+ 43, 45,136, 51,184,204, 80,103,208,203, 35, 85, 64,215,229, 2, 94,244,113, 67, 58,216,156, 83,120,203, 57, 67, 5,228,133, 48,
+ 65,152,182, 66, 27, 5, 31,133,133, 5, 75, 59, 0, 19,245,240,243, 49, 45,196,113,176,144, 43,154, 98,172,224, 1,143,110,146,
+170,197, 96,140,144,231,162,157,153, 36, 97,161,168,197,198,215, 66,142, 34, 74,185, 64,137,224,162,197, 54, 19,170,245, 51, 84,
+210, 48,113,145,177, 4,154,168,147, 73,204,146,224,198, 9, 18,162,138,113, 44,196,220, 96, 82,227, 97, 51,104,125, 36, 79, 66,
+ 70,151, 11, 49,179, 68, 99, 65, 70,196,118,140,195, 17, 77,166,147, 90, 84, 94,221, 56, 75,148,136, 9,201,166,152,144, 4, 35,
+ 70,139,156, 86,123,149, 6, 25,187, 83,168,173, 33,212, 35, 76, 51, 86,104,223,217,148,117,175, 78, 21,125,220, 93,108,105,106,
+ 98, 5, 93,106,180,195, 35,198,196,247,219,153,162,216,216, 36, 6,116, 58, 26,237,164,220, 37,199, 75, 87,188,157,157,217,122,
+164,227, 89, 76,103, 37,178, 51, 37,250,110,133,206, 83, 38,124,163, 83,187,132,105, 90,252,144,237,130, 38,255,131, 27, 33,165,
+ 1,202,174, 93,164,198,128,159,223,207,209,199,207,178,190,178,206,153, 11,107,196, 68,169, 44, 12, 6,108, 53,158,245, 11,231,
+105,218,150,125,123, 23,121,205,235,190,140,111,249,241,159,102,110, 97, 15,121, 57, 76,175,202, 67,172,244,249,155, 41, 18, 61,
+121,175, 79, 12, 30, 95, 87,233, 87,142, 72,132,208,140,137,193, 19, 67,192,152,140,252,217, 95,195,220, 75, 23,168,143,126,146,
+ 51, 79, 60, 76, 83, 87,216,220,210, 84,158,237,170,161,137,138,134,138,209,230, 36,179,150, 16,133,208,189, 79,178,195,111,119,
+ 84,228,163, 39,143,243, 79,199,191,130, 23, 29,121, 16,103, 12, 98, 4,103, 44, 11,123, 60,197, 53,219,156, 63, 58, 97,105, 33,
+227,235,191,248, 14,206,156,142,172,110,142, 24, 77, 91,230,162, 36,181,122, 61,219,166, 56,169,107,150,151,135,144,251, 29,187,
+165, 19,196, 68,176, 49, 61,182, 94,175,177,181,108,172,181,252,233,191, 29,199, 89, 75,102,244, 30, 52, 6,218,168,197, 9,209,
+ 84, 72, 99, 12,173,111, 25,244, 6,108,108,172, 50,127,125, 9, 34,228,121, 58, 67,130, 94,223, 86, 89, 46, 76, 84,228, 47,243,
+ 74, 59, 21,214, 81,152,140,194, 57,166,120,154, 54,232,115,101,154,110,222, 33,143, 10,201,119, 72,159, 94, 2, 94, 55,132,211,
+245, 38, 49,189,198,152,134, 75,103, 19,117, 24,180,232, 75, 90,166,213, 93, 90, 88, 67,202,135, 81, 23,170, 40,238,159,162, 51,
+180,185, 16,144,144, 26,122,155, 16,207, 92,109,108, 93, 49,183,105,232,113, 86, 48, 22,250,125,237,155, 99,212,228,187,182, 18,
+188, 19,164,232,132,195, 73, 4,155, 25, 50,231,112, 46,215,137,201,233, 80,157, 13, 19, 76, 32, 66, 16,143,175,161,204, 13,121,
+ 33,100, 83, 67,214,208, 18, 77,164,152, 19, 50,103, 48, 14,124, 52, 68, 34,209, 25, 2,122, 90, 69, 49, 52, 29, 55,227, 29, 89,
+209,167, 55,188,130,105, 12,140,166,129,126, 63,249,210,141, 65,210, 94,218,188, 7,117, 4, 91,232,197,232, 34,152,214, 32, 25,
+216, 90, 59, 22, 6, 66, 86, 26,178,121,144,220, 17, 76,100,110,105, 63, 47,125,245, 91,185,242,154, 23,170,102,190,131,254, 87,
+238,163, 61,191,194,229, 7, 30,102,237,252,136, 97, 49,199,205, 95,247, 93,196,205, 21, 66, 61,101,229,216, 9,142,125,250, 83,
+228,146,243,216,218,101,190,242, 59,255, 11,147, 51,247,178,122,234, 44,159, 60,122,130,202,195,202,104, 11,159,101,124, 7,129,
+103, 93,185,196,137, 83,171,172, 93,218,230,183, 87, 71,220, 7,196, 39, 78,113,211,190, 69,110, 52,112, 65,116, 59,218,151,223,
+117, 11, 63,245, 63,126,147, 61,131, 33,217, 96,200,214,229, 75,140,214, 55, 8,173,103,123, 99, 99, 70,146, 88,231, 88, 94,218,
+203,155,126,232, 71,248,182, 31,248, 97,198,219, 91,188,235,175,254,146, 95,252,171,191,231, 48,112, 33, 68, 38,206,242, 39, 15,
+ 61,206,133,255,251, 79,120,230,171,190,152,122,178, 70, 49,200,112,197, 60,195,131,135,136,245, 20, 87, 46,176,112,240, 8,117,
+ 5,197,222, 27,241,155, 35, 36, 11,108,156,124,156, 98,110,158,141,179,231, 56,246,224,231, 57,179,177, 77,175, 92,228,242,104,
+131, 7, 30,190,135, 79,127,254, 35, 76, 46, 30,227,155,191,239, 19,252,209,111, 60, 23,147, 41,124,237,167,130, 87,201,186,138,
+ 27,131, 54, 11, 81,192, 78,146,228, 36, 66, 49,136, 84,173,174,140,141, 94,243,162,131,104,131, 23, 80,145, 91, 52,218, 45, 64,
+145,241,107, 0, 0, 32, 0, 73, 68, 65, 84,118, 43,112,218,118,102, 62, 72,110,198, 36, 84, 73,112,191, 0, 85, 35, 20,214, 82,
+ 22,170, 36,142,198, 96,156,222,125,206, 66,211,202, 76,119, 18, 68, 8, 77,178, 15, 53, 96,243,136,175,181, 59,110,163,118,195,
+ 54,234, 4, 19, 69,168,131, 80, 24,133,197, 66,166,232,131,180, 26, 98,225, 68,179,153,219,180,140, 65,140, 54, 38,164,215,170,
+ 29,100, 36, 24,237,154, 29, 22,147, 25, 66,212, 66, 89, 20,144,167,199,207,141, 37,143,134, 44,113,253, 98, 35, 65, 82, 83,145,
+226, 36,179, 36, 94,176, 78,167, 15,107, 13,226, 74,218,220,208,184,168, 80, 94,209, 61,183,195,182, 49,173,221, 77, 7, 96,166,
+135,154,201,116, 5,101,231, 90, 51, 93,225, 10, 50,171, 91, 54,130, 52, 74, 81, 1,152, 86, 97,118, 43,105, 4, 49, 6,137,162,
+105, 92,166, 75,202, 98,166,218, 39, 65,121, 98, 93, 10,240,208,194, 42, 49,125, 99, 76,113,209,214, 60,133,215,235, 92, 0,200,
+ 46, 62, 84,216,121,109, 51, 8,221,165,229,198, 97, 23, 40,160,106,101, 9, 65,127,175, 44,201,139, 37, 5, 69, 69,233,242,165,
+ 18, 69,180, 83,176, 99, 8, 24,151, 99,202, 82,121,158,164,118,198,154,157,176,172, 14,162, 79,112,189, 72,196,206, 20,215,150,
+ 99,107, 53,151, 47,173,113,242,236, 69,130, 24,246, 46,207, 99,215,183,184,255,248,105,110,187,229, 6,126,234,221,239,224,170,
+155,110, 99,113,223,149,137, 98,168,211,215,118,135, 3,141, 50,243, 38,153,174,209,136, 66, 94,150,196,182, 33,180,158,224,189,
+ 54, 36,137, 27,215,133,105, 45,213,198, 10,238,240,157,220,120,219,151,176,120,236,179,124,238,125,111,231,204,153,115, 20, 69,
+201,218,120,147, 38, 66,227, 67,138, 53,213,137,215, 97, 8, 49,221,109, 70,102,130, 46,155,138,229,125, 15, 63,204, 75,238,186,
+ 2,169, 47, 32,198,144, 91,139,117,134, 31,122,211,213,216, 8,198, 23,212,219, 55,176,190,122, 22,107, 28,131,178,194,175,141,
+ 17, 34, 33, 68, 46,111,110,115,118,115,139,150, 57,124,189,142, 41,123, 72,107, 33,171,241,161, 38, 70,173,126, 46, 6,221, 91,
+ 33, 22,235,132, 3, 87, 26,230, 74,199,229, 73,203,176,204,152, 43, 29,155,149, 87,157, 79,231, 74, 74,162,181,214,123, 6,189,
+ 30,227,241,152, 94,177, 68, 61, 61, 55, 19, 63,135,116,118,132, 36,208,137,169,192,155,194, 96,177,244, 93,166, 91, 60,137,212,
+190,165,117, 30, 31, 2, 18, 68,239,151, 4,125,219,168,200,151, 75,211,117, 76,240,127, 7,214,216,180,110, 58, 47,244, 90,180,
+ 70, 27,138,174, 95,109,252, 14, 37, 30,196,208, 47,211,240,158,237,210, 26, 57,102, 10,251, 78, 24,148,149,224,189, 65,130,204,
+154, 0,137, 10,219, 71,160, 87,104,237,204, 11,109, 90,138, 76,155,129,208, 66, 51, 21,154, 86,105, 38, 31,146, 31, 63,209,253,
+ 89, 97,200,196,146, 21,118,182, 72,202, 96,116,159,136, 19,162, 4, 76,114, 4, 5,167,215,100, 95,244, 60,206,140, 17,196, 69,
+242, 76, 39,153, 24, 12,193,234,137,111,178, 78, 85,231, 16, 47,196, 24,104,188, 32,177,229,190, 7,238,231,216,177,199,217,222,
+222, 36,136,238, 19,216, 51, 0, 31, 12,109,173, 28,155,235,165, 22, 57,151, 4, 77, 24,178, 92,232,205, 25,218,145, 32, 83, 33,
+ 22,224, 6, 22,227, 2,115, 75,135,121,229,107,223,198,190,131, 55, 34,140,117, 87,176,233, 65,253, 32,241,196,231,105,207,175,
+210,100,123,184,226,235,126,144,225, 35,159,229,226,195, 15,165,211, 66,152,110,141, 88, 57,119, 22,241,142, 63,252,224,199,249,
+127,223,243,135,248,245,199,137, 18,184,120, 97,149, 51,107,219, 8, 22, 31, 35,249,184,225, 87,238,190,149, 11, 23, 55,120,232,
+228, 42,191, 51,109, 57, 15,204, 37, 14,232,242,234, 38, 79, 0,255,227,103,222,204, 87,127,203,183,131, 24, 46,157,125,146,245,
+186, 66, 46, 95,158,165,218,185,178,196,182, 81, 69,102,198,146,149, 61,172, 49, 76,199, 35,182,215,215,168, 71, 35, 94,254, 37,
+ 47,227, 53, 47,255,114,126,255, 29,111,231,237, 31,251, 55,214, 67,228,101, 71,174,228,213,223,251,245, 28,127,248, 12,151,206,
+ 93,226,218,171,151,192, 9,177,173,200,230,250,184,201,148,172,191,136,247,158,176,189, 70,185,119, 15,229,226, 30, 22,174,214,
+188,230,107,159,121, 23,111,216,191,159,111, 31,246, 88,221,156,240,152, 57,207,231, 46,158,225, 80,209,227,185, 71, 47,240,244,
+215, 94,193,145,219, 94,199,131,159,253, 91, 29, 42,106, 84,100,149,220,133,157,119,192,165,110,177,173,132, 94,207,224, 91, 67,
+175,103,104,235, 72, 20, 69, 92, 66,171, 73,127, 62, 64,104,181,219,141, 73, 89,215, 54,130,239,233, 94,116,241, 80,244, 65, 50,
+213, 84, 4,151,110,144,160,103, 96, 75, 68, 48,148,165,121,138, 90, 53,122,189,238, 36,106, 65, 55,209, 42,199,214,193,115,149,
+222,168,226, 77,167,125,209,127,119,250,216, 86,244,134,182, 61, 67, 86,130,140, 5, 9,122,208, 70, 11,141, 49,108, 69, 97,222,
+ 42,197, 16, 17,178, 12, 90,167, 83,253,206, 4, 40,152, 66, 82, 49, 87,189,170, 84,202, 11,155, 76, 40,172,198,135,154,168, 5,
+ 71, 2,136,141,248, 4,151,154,216, 57, 62, 20, 97, 48, 8, 89, 94, 80,236, 61, 12, 7,150,216, 54,199,240,166, 1, 99, 40, 10,
+ 75,219,128,139, 2,181, 26,145, 93,110,136,118,167,248, 25,103,210,166, 56,157,206,109, 74,158,154,201, 97,130,193,181,224, 45,
+ 88, 28, 89, 48,233, 16, 79, 42,243, 16,149, 79, 55,154,130, 40,214, 66, 72,238,210,153,240,118,199,158,179,123, 42,238, 32,113,
+147, 10,214,172,176,207,178, 36,118, 10,244, 78, 53,213, 72, 93,237, 56, 74,160, 77,233,124, 54,217,247,210,207,248,248,148,197,
+ 21, 51,213,211,110, 49,153, 73, 81,189,105,242, 82,181,122,142,155, 59,132, 29, 30, 32,142, 47, 16, 38, 43, 79,145,233, 25,211,
+169, 6,147, 21,203,170,245,149, 20,162,210,246, 23,185,116,242, 44,235,155, 35, 92, 94, 48,140, 19, 76,219,112,231,221,119,243,
+139,239,251, 69,141, 9, 38,130,132,212,244, 4, 32, 79,205,131, 48,155, 84,186, 24,225,214,235,210,142,182,214,180, 14,159,174,
+225,168,132,178,205, 50,181, 70, 90,147, 14,251,136,203, 11,229,119,167,171,236,187,238, 86, 94,243,127,188,149,219, 62,251,207,
+252,248,247,254, 32, 15,157, 60,199,118, 16,230,135, 61, 6,189, 94,178,235, 70, 93, 67, 28,162,194,215,117, 96, 84,251,167,136,
+199,142, 29,123,156, 83, 43,119,115,227, 85,141,246, 29,141, 7,105,177, 86,239, 37, 99, 35,167,158,108, 89,219,216, 36, 68,131,
+ 88,195,252,194,128, 67, 7, 15,112,123,153,115,228,214, 35, 44, 45,239,229,202, 43, 14,179,231,138,171,136,197, 55,144,247,134,
+100,206, 18,253, 20, 95, 62,192,197,199,127, 89,197,170,109, 80,221, 71,102, 9, 18,248,139,183, 31,230, 27,191,233, 52,149,247,
+236, 91,232,177, 84,102, 60,177, 89,165, 94, 75,135, 28,137, 41, 71, 29, 69,155,138,124, 41, 81, 11, 73, 63,111,205,172,248,199,
+104,158, 34,240,149,174,137,177,145, 90, 60,181,109,169,130,135, 76,212,230, 23,165, 3,130, 8,187, 24,155, 78,175,227,131,210,
+124,214,165, 13,117,233,236, 8,102, 7, 49,246,162,197,182,155,144,109,166,246, 81, 81,131,211,140,117,138, 41, 76,212,228, 9,
+197, 11, 80, 77, 81, 93, 81, 38, 72,169,214, 94,151,165,243, 74,116, 80,200,156, 73,189,166, 97,208, 83, 36,211, 5,195,148,136,
+212,122,153,149,125,232,149,134, 44,179, 12, 6, 57, 46,119, 20,118,135,133,114,174,107,210, 45, 54,179, 72, 12, 51,123,156,111,
+132,152, 6, 9,165,187, 13, 89,136, 65,187, 3, 27,117, 65,124, 84, 78,221,183,137, 19, 51,134,195, 87,221,200,104,107,147,147,
+103,206, 43, 25, 63,133,186,110, 89, 51,235,216,104, 40,251,122,224, 55,173, 33,239, 25,250,165,193, 68, 37, 44,242, 60,137, 31,
+ 10,245,253,217,132,201, 15,150, 12,161,111,136, 46,178,239,202,155,120,237, 55,254, 21,195,249, 62,216, 57, 36, 84, 88,119, 21,
+178,254, 41,196,142,224,252, 69,252,198,132,242,101,223,139, 60,248, 65, 62,243,243,111,225,163, 31,250, 60, 63,254,137,127, 69,
+ 38,155,136, 88,214, 78, 60,193,197,147,103,248,194,137,147,172, 3, 47,120,229,215,209,172, 60,192,185, 7, 31,226,223, 63,127,
+ 31, 77,154, 60,182,179,140, 15,236, 27,176,229, 3,239,125,240, 44,127,158,138,178, 69,121,242, 38, 10, 63,250, 93, 95,195, 79,
+252,242,175,176,118,254, 28,151,207,159,197,101, 25, 89, 81,168, 64,185,141,196,198,211, 54,141, 78, 9, 38,195,250,150,163, 15,
+222,199,233,211,151,120,236,248, 41, 14, 44,239,229, 25,119,221,194,149,251, 15, 49,109,166,156, 61,125,140, 47,123,206,115,216,
+ 87, 14,185,170,127,153,103,191,252, 85, 92, 56,191, 70,181,181, 69,152,142, 16,209,221,236,177,109,240,147,192,242, 53,215, 81,
+141,183,137,146, 81, 93,186,128,245, 43,132,173, 57, 76,185, 64, 8, 48,186,188,194,125,107,155,188, 98,121,145, 59, 69,120, 69,
+107, 40,135, 75,252,253,116, 74, 91, 44,240,248, 39,254,141,215,125,253,159,114,239, 61,239,129, 4,249,180, 19, 45,184, 33,253,
+183, 45, 82,193, 13,130,199, 80, 85, 66,127, 62, 13, 65, 86,225,250,105,197, 44,232,199,164,169,119, 58,209,139,214,138, 80,103,
+134,222, 80,200, 58, 33,154,232, 99,135, 6,237, 38, 51,189,142,136, 59, 9,170, 98, 32,223,165,196, 55, 65, 39,234, 40,202,235,
+ 58, 23,201, 18, 46,230,130,168, 82, 92, 96,210, 10,193, 26,134,206, 16, 5,109, 12, 91,161,241, 80,213,144,109, 6, 36,207,158,
+146,199,209,138, 22,217,220, 9,141, 3,162, 77,139,135,116,234, 17,103,104,130,208,203,181, 80,155, 68, 61,196,132,209,185, 76,
+167,127,201,148,134,178, 78, 32, 9, 94,186,250,165,225, 63,202, 37,182, 64, 97,119,156, 45, 46, 51, 56,167, 81,150,196, 6,231,
+210,207, 97, 48,185, 37,166, 14,223,137,193,120,161, 91, 73, 63,139,219, 48, 26,130, 99, 19,158, 40, 70, 72,249, 74,250, 58,140,
+ 90, 6, 77,155, 44, 95,173,204,224,116, 99,220, 46,191,124,103, 91,116,105,200,220,101,135,233,166, 79, 99,119, 38,249, 78,162,
+214, 97,143,105,225, 80, 55, 53,207,214, 53,119,102,157, 46, 88,202, 71, 76, 57, 79,182,120, 3, 97,122,137, 56,185,160,223,145,
+200, 83,233,138,162,236,240,224,106,179,216,101, 61, 74,217,219,118,183, 96, 46,157,196,166,156, 39,223,123,152,122,251,220, 46,
+235,147, 73, 77,131,155,249,139,109,226, 68,201,244,125,176, 38, 50,170, 27, 54, 54,214, 89, 93, 89,227, 25,207,127, 22,175,251,
+201, 95,163, 24, 44,164,230,194, 35,226,255,131,222,127, 55,230,106,118, 12,206,161,213,155,196,166, 52,176, 76,147, 24,197,215,
+122,120, 23,125,133,182,189,215, 4,179, 44, 71, 82, 34,155, 30,200, 50,139,227, 14,147, 85,174,187,253,153,252,237,253,143,179,
+121,249, 2,107,103, 30,227,207,223,250,135,252,235,231,238,101,117,125,155, 38, 42,199,154, 91,199,129,189, 75,220,122,227, 53,
+124,237,235,191,130,235,142, 28,161, 88,186,146,185,193, 60,189,197, 2,179,177, 78, 61, 26, 19,154, 74,197,190,163, 13,154,237,
+ 41, 33,180, 20,131, 30,207,127,221,213,188,236,123,175,192, 58,253,172,234,181, 53,166, 91,219,100,189, 62,213,246,136, 54, 70,
+166,147,150,233,164, 69, 38, 21, 12, 26,236,161,107, 25, 44, 95, 75,187,117, 5, 55,191,240,245,172,157,249, 93,198,231,255, 2,
+ 23, 74, 76, 16,172, 53, 44, 45,192, 59,223,126, 13, 63,242,125, 43, 92,179, 56, 96,216,203, 89,153, 92, 96,218,198, 4,193,235,
+122,109,162,164,107, 46,210, 27, 22,184, 13,125,159, 93,146, 91,204,106, 77, 7,121, 27, 33,146,178,215,141,167,138, 66, 37, 45,
+ 53, 45,222, 6,234, 86,169,193,232,117,128, 80, 65,175,246,134,117,212,162,108,157, 38,101,198,180,208,142,160,136, 73,221, 48,
+219, 89, 30,146,112,219,238,146,219, 91,209,199,204,157,114,214,153,219,113,160,101, 74,253, 19,125, 87,232,101, 86,120,189,215,
+ 65, 47,247, 90,248, 69,160, 40,181,136,231,153,138,132,123,185, 54,159,177, 17,250,206, 80,183,134, 97, 79, 40, 74, 75,191, 52,
+236,219,231, 24, 12,114,138,210, 18, 66,196,137,230,241,207,132,167,185, 37, 6,141, 71, 15, 62,204,146, 87,189,143,120, 47, 52,
+173, 48,173,132,108, 97,113, 15,235,155,107, 73, 93,160,208, 92, 74,232, 36, 36, 56,100, 90,175,211,196, 49, 49, 70,170, 9,212,
+ 83,161,169, 83,250, 87, 38,100, 37,184,220, 80,244,161,215,235,222, 80,155,160, 12,205, 31,118, 78, 40, 10,131, 9,162,123,179,
+ 35,152, 92,120,245, 87,255, 1,215,220,252,202,116, 19,237,129,205,135, 48,195, 62,114,246, 30,112,145,250,161,251, 40,143,124,
+ 17,217, 53, 87,115,254,143,126,140,139,235, 57,147,108, 1,187,124,128,114,120, 24,169, 87,184,252,192,125,156,124,224, 33, 30,
+ 61,126,130,127,127,248, 20, 31,254,151,119, 83, 95, 60,202,229, 83,103, 88, 63,119,129, 39, 87, 46, 49,215, 43, 57,189,181,205,
+139,197,242,194,187,174,231,143,255,233, 65,126,171,141,148,169,208,108, 9,124,219,171, 94,192, 47,254,193, 31, 16, 98,195,233,
+ 71, 31,194,185,140,188, 44,145, 24,180, 51, 12,129,182,169, 84,213, 79,192, 72,198,116,227, 34,191,251,182,119,243,226, 87,124,
+ 57, 63,243,238,247,176,103, 56,207,100,242, 4, 43,127,253, 65, 74, 23,249,218,103, 61,141,175,123,249, 75,120,236,201, 83,172,
+173,156,230,165, 95,245,197,156, 57,126,150, 60,107,217,191,199,177,111,120, 3,147,106, 66,219,212, 12,134, 67,178,114,158,201,
+250, 58, 89,111, 64, 89,182,244,175,191,158, 96, 74,164, 25, 35,211, 77,196, 12,152, 95, 88,224,175,222,245,199,252,248, 27,190,
+139,231, 45,207,113,201, 7,110,205, 45,255,237,138,235,248,248, 31,252, 58,242,149,175,102,223, 51,158,201,243,239,126, 51, 31,
+249,219,223, 83,111,186, 8,161,214,225, 67,178,148, 32, 25, 20, 82, 55, 81, 63,115,223, 64,147, 10,203,120,156,174,129,144, 20,
+160,162,197, 83, 34,140,167,202, 85, 21, 34, 84, 19,163,208,117,170,167,173, 87,197,103, 91, 43,124,216, 54,250, 24,115, 61, 40,
+ 10,165, 92,194,236, 6,146, 29, 17,182,239,214,244,104, 18, 92,158, 89,196,105, 17, 11, 41,145,201, 58,133,233, 50, 3,197,188,
+197, 6,131,247, 90,100, 70,235, 2,251, 84, 39, 16,210, 2, 49, 31,132, 44,135,169, 23,114,235,200,156, 22,242,152, 41,250, 96,
+ 19,196, 27,208,194, 76,130,239,172, 19,124,147,106, 68,166, 58,147,144,105,179,146, 37, 15,170, 14,181, 66,110, 21, 58,175,144,
+ 25,117, 53,171, 55,193, 83,175, 30,199, 7, 7,251, 18,214,232,181,203,207, 10, 51, 11,226,201,141, 34, 4,186, 80, 70,179, 23,
+148,206, 48,255,193,223, 99, 83, 51,145,138,131, 23,104, 4,155,224, 89, 43, 38, 77,228,130, 88, 13,202,177, 34, 42,112,234, 2,
+156,140,106, 89,172,221, 85, 72,163,164, 45, 16,187,178,248, 5,140,117, 72, 76,187,238,125,220,105, 10, 82, 65, 19,217,153,186,
+103,163,142, 49,196,122, 29, 9,245,204,134,104,102, 31,114,178,237,237,122,110, 99, 93,202,248,239,184,240,217, 43,208,112,142,
+244,250, 76,102,241, 27,167,144,201, 42,161,222, 74, 54, 46,153, 69,132,118,250, 56,235, 84, 13,143,117, 58, 64,100,202,179, 84,
+171,107,220,241,210, 87,240, 93,111,253,161, 93,169, 93,241,127,225, 95, 54,187,204, 84,105,236,139,169,234,180, 45,226,125, 18,
+ 60, 69,140, 53,132,170,194,100, 57,174,232,233,171,142, 42, 56,118,101,174,141,186,247,184,178, 84,191,181,247,216, 4, 37, 27,
+227,112,253, 66, 21,243, 97,139,133,249,130,133,219,239,226,231,126,255,237,255, 63, 22,190, 9,248, 6, 25,111,129, 84,132,203,
+ 99, 98,235,177,121,193,248,242, 6, 98, 51,218, 70, 23,165, 12, 15,237,167,156,159,167, 92, 92,192, 71,207,232,194, 42, 96,168,
+ 71, 35,242, 94,143,118, 58,197,139,162,114,153, 19,136, 53,121,175,100,188,185, 73,176,231,136,117,195,210,225,195,180,245,148,
+229, 67,111,102,239,225,239,225,210,189,111,212,248,109,180,216,236, 93, 10,252,225,219, 14,240,201,183, 93,201,116, 82,115,255,
+217,117,206,108,215, 20,206, 81, 7,161,103, 83,225, 9,129, 94,175,199,100,244, 4, 14,163, 62,252,116, 14,205,118, 33, 57, 29,
+ 50,186,186,225,241, 76,196,224, 91,143,199, 83, 73,160,145, 72,227, 85,227,211,250, 72, 8, 66,221,166,233,217, 11, 69,174, 14,
+ 30,159, 38,108, 73, 8, 99,150, 27,157,220,237,142, 19,205, 38, 26, 78,218, 29,247, 88,240, 9,193,204,244,123, 99,242,233,118,
+180,151,143, 42,114, 11,169, 70,182, 45,180,233, 92,244, 65, 41, 0,155, 94, 3,162, 19,122,102, 13,115,115, 42,126,203, 4,188,
+ 19, 70, 83,161, 63, 20,150,250,150,222,208,144, 21,150, 94,223,145, 23,142, 44,183,100,121,218,237,238, 50,140, 53, 56,211, 81,
+161, 26,226,214, 38, 97, 83, 12,234, 72,154,214, 48, 30,193,214,166,144, 69, 81,149,179, 73,111,138,136, 81, 43,130, 49,216, 92,
+ 39,169,213,245, 21,170,137,168,114,175, 21,218,182,155,242, 18, 26, 37,106, 17, 48,105, 33, 75,111,152,209,120,149, 35, 26, 47,
+ 24,171,211,122, 89,104,254,112,219, 52, 92,127,228,229,188,252, 69,255, 59,244,175, 6,179, 87, 87,160, 62,241, 30,152, 86,152,
+253, 87, 80,159, 58,129,223,188,204,240, 75,191,147,237, 79,254, 53,241, 66,133,121,238,119,179,254,222,191,230,125,127,248, 78,
+126,242, 35,239, 64,154,243,172, 63,241, 24,199,239,185,135,203,231, 79, 49, 87, 88,158, 52,194,117,119,126, 17, 76, 87,121,228,
+ 95,254,133,195, 55,222, 68,227, 35,219,211,134,113, 35,252,252,173,251,185,255,193, 39,249,141, 58,204,148,142, 39,163,240,174,
+ 95,253, 9, 94,255,221,111,225,204,195,247, 99,179, 28, 87,148, 42,249,105,107,130,215,101, 35, 93,142,177, 6,161, 8, 54,214,
+188,225, 71,126,133,239,249,214,239,226, 61, 31,252, 48, 55, 93,181, 68,148, 1,139,115, 57,203, 11, 11, 56, 50,222,243,224, 9,
+ 62,242,240, 35,188,238,206,167,113,203,117,123,153,142, 3,253, 50,208, 95,216, 75, 27,182,216,220, 94, 97,245,232, 57,174,127,
+230,115, 88,240, 45,217,124,142,219,179, 76, 51,222,162, 88,220, 67,181,190, 73,180,125,168,215,201,230, 15,224, 66, 69, 61,218,
+228,230, 23,191,156,191,121,242, 81, 94,114,205, 45,244,128,255,185, 57,230,233,167,206,240,188, 43,175,228,170,207, 61,200,123,
+158,125, 59,223,252,200,189,124, 40, 21,117,155,233,180,222,137,134,130,128, 43,244, 51,148, 92,139,113,219, 66,150, 11,211,198,
+208, 76,186, 65, 72,240,105,204,118, 70,152, 52, 9,149,169,192,206,235, 5, 61, 69, 24,204, 25,170, 74,163, 17, 59,245,174,247,
+ 59, 16, 82,219,194,100,162, 34,177,178,103,102,130, 21,151, 58,230, 72,103,111, 50,234,209, 13, 49,249, 67, 82,231, 46,201,139,
+ 42, 42, 38,201, 10,109, 38,136,250,179,155, 19, 97,113,230,231, 21,245,214, 39, 2, 44, 90,104, 99, 36, 56,139,203,133,128,138,
+244,130,232, 20,159, 59,187,139,199, 85,117,191, 41, 13,161,209, 70,206, 59,131,207,186,205,212,250, 53, 4, 16, 39, 24,137, 4,
+ 23, 53,180, 35,109,148, 83,102,209,166, 53,142,130,177, 1,103,156,114,245,201, 18,216,182,130, 53, 14,201, 34,180, 6,103, 59,
+ 41,174,153,153,222, 45, 38,137,221,118, 18,166, 58,222,219, 24, 81,197,173, 81,184,218, 36,222,218,118,153,221, 73, 40,215, 21,
+ 96, 99,221, 83, 98,109,165, 91, 39,219,133, 24, 36, 37,150,201,236,108,229,100, 39,166,211,228, 46,237,150,186,226,107,172,234,
+ 14,100,214, 52,164, 28,129,122,155, 24, 18,174,152,186, 31,109, 86, 34,146,208, 3,133,244,211,148, 29,211,166,171,174, 43,180,
+118,198,145,235,255,223,121,221,198, 52,196,182,221,161, 3,118,160, 13,141,240,141, 9,255,140, 9,250, 77,104, 66,239,105, 47,
+225,233,207,125,109,250, 61,118,212,251, 34,230, 63,103,239, 75,216, 41,236, 18, 18, 54,171,150, 29, 1, 76,111,128,241, 45, 18,
+ 2,226, 3,249,160,175,127, 79, 18, 65,155,229,218, 84,164,166,200,185, 92, 97,253, 16,177,189,222, 78, 42, 89, 39,167,110,106,
+ 66,219,204,172,128,161,190, 76,104,181,137,200,251,125,112,249,108,201,150, 30,226, 77,154,113, 35,190,105, 48, 8,205,164,162,
+218,222, 6, 31,112, 69, 70, 49, 55,207,242,193, 27,201,123,229, 12, 11,158,172,174, 17,124,132, 24,152,191,226, 10, 98, 12,180,
+227, 9, 69, 81, 82,111,109,145, 21, 5, 54,119,180,147, 9,153,181,140,206,157,162,222,220,192,229, 37,115, 7,247,211,214, 21,
+142, 30, 87, 60,247,125, 76,206,191,155,209,185,223, 35,196,140, 24,107,178, 44,231,198,155, 15,113,236,177,115,236, 27,246,185,
+ 56,105,102,203, 78,156, 85, 1,104,153,229, 44, 46, 44,226,195, 10, 34, 41,210, 58,161,115, 62,125, 30, 70,221,152, 20, 78, 41,
+185, 42, 70,130,169,241, 81,181, 43,209, 70,154, 86,240, 49, 42, 29,152,132,188,154, 27, 47, 20,133,222, 66,105,231,150, 94, 78,
+165,162,207, 62, 33,130, 33, 9,242,250,189,100, 97,171,147, 85, 61,232, 61,109,163,138,221, 76,145,108,106, 46, 53,151,157,148,
+194, 65,211,166,159, 65,233, 73, 17,157,222,155, 70,169,170,106,170, 3, 44, 81,245, 30,253,158,165, 44, 44,101,169,168, 69,222,
+128,153,139, 44, 45,233, 57,147,151,208,212,134,162,116,106,109, 43,108,130,253,133,188,232, 50, 60,180, 33,174, 90, 79, 12, 17,
+239, 61,209, 7, 66,240, 84, 85,164,105, 35,155,219,194,100, 2,217,249,211,235,202,179,185, 20,133, 24, 59,195,190, 22,240, 68,
+107,145, 37, 72, 35,203, 80,185,125,148,153,133, 63,118, 30,121, 50, 14, 94,113, 19,189, 50,231,252,202,163,120, 2,101,161, 31,
+222,252, 96,142,107,111,124, 22,235,171,199,121,214,243,127,143, 43,246, 44, 19, 42,131, 43,247,194,228,126,252, 23, 62,137, 59,
+112, 37, 50,191,196,214, 7,254,130,254, 93,175,164,247,244, 47,231,242, 71,223,199,133,179,176,253,233,223,230,224,211,111,226,
+198,165,156, 23, 60,227, 48, 7,239,188, 11,191, 57,102,253,228, 89,154,209, 6, 11,195, 57, 30,120,114,133,215,191,226,133, 64,
+100,245,196, 41,174,186,241, 58,166,213,132, 65,174,249,103, 87, 57,195, 11,174, 88,228,229, 31, 59,199,145,125,123, 24,251,192,
+209,141, 45,158,252,212,223,177,247,224, 97,206, 30,125, 8,151,229,202, 99,250,134, 24, 34,209,171, 15,188, 43,228,221, 48, 51,
+152, 95,224,187,190,231, 71,145,225, 60,127,255, 63, 63,197,207,253,228, 15,242,151,239,248, 19,122,100,108, 95, 94, 97,109,187,
+226,170, 27,110, 98,208,179,124,230,145,135,217,211, 11,220,121,203,109,212, 4,246, 29,190,149,245,181, 13, 30,123,248, 81,174,
+ 58, 48,199,158,229,125, 56, 83, 96,203, 2,223, 52,228,195,140,250, 66,205,224,160,195,149, 37,206, 22,136, 29, 96,164,198, 13,
+230, 9,213,148, 48,217, 34, 47,123, 60, 32, 13, 87, 46,238, 97,126,107,140, 17,225,241,211,103, 24,112,134,219,231,231,248,248,
+ 11, 95,193,139,159,113, 35, 31,114,143,239,236,219,241,169,171,141, 59,252,180,201,244, 66,175,107,157,162,155, 58,113, 85,173,
+ 22, 63,151,233,141, 50,157,234,141, 16,147,106,117, 60, 86,161, 86,145,153, 78,218,160, 95,157,242,212, 89, 97, 40, 68,109,145,
+210, 26, 26,132,194, 26,154, 86, 39,125,151, 26,128,224,181, 97,192, 26,164,133,214,106, 93,179, 34,184,196,115,251, 86, 93, 24,
+ 89, 1,101, 58,246, 15, 31,180,156, 89,139, 24, 35,172,120,184,122, 20, 89,207, 45, 89, 31,100,170, 69,218,166, 3, 35, 0,158,
+142, 35,215, 6, 33, 47,204, 44,169,206, 26,125, 61, 22,213, 13,116,249,203,173, 17, 92, 38,196,220, 16, 50,143,105,244,170,247,
+ 70, 69,122, 85, 38, 84,168,128,208, 98, 84,224, 22, 76,242, 98,167,176, 12,103,240, 24,172, 68,104, 2,209, 25,140, 81,206,187,
+117,202,231, 71,117,231,167,253, 3,233,144,235, 4,152,102, 39, 41,139, 46,168, 39,206,186,136,196,111, 88,157,242, 69, 84,108,
+ 71,216,149,198,216,113,230, 9,146,238,172, 81,178, 43, 16,195,186,180,132, 46,238,172, 95,206,220, 44, 12,200,116,214,183, 84,
+ 96,101,150,138,149,242, 40, 58,136,223, 89, 36, 54,179,162,101, 18,133,208, 37,232,118,211,184, 32,216,108,144,148,236,237,142,
+188, 59, 38, 46,213,116,162,188, 93,141,195, 44,130,208,164, 13,122, 41, 8,168,227,249, 19,253, 98, 51,221, 74,150,237,189,146,
+165, 87,255, 8, 38,207,119,144,128,255,101,208,136, 36,232,202,236,202,183, 84,202, 68,234, 70,159,219, 26,245,196, 55, 21, 38,
+207, 16,175,175, 49, 84, 13,110,216,135,214,167,215,105, 83,174,183,190, 23,116, 49,202, 33, 32, 77,163,191, 98,227,211,211, 4,
+218, 74,171, 74,148,136, 52,109, 58, 75, 35,206, 90,218,105, 5,166, 81, 8, 59, 97,198,161,241, 72,108, 84,159, 16, 2,177, 85,
+126, 57, 43,251,184, 57, 75,150,231,148,215, 47,147,245, 7,248,241, 8,155,229,140, 46, 94,160,169, 91, 6,123,246, 80,204,207,
+ 35,161,165,217,158,226,202,130,106,123, 68, 62,232, 19,154, 6, 67,160,191, 48, 71, 53, 30,211, 95,232, 83, 14,123,108, 28,187,
+151,106,243, 26,246,223,114, 43,235,199,142, 82, 44, 46,209,219,247, 90,122, 7, 94,195,229, 7,222, 68,211,172, 80,150, 3,124,
+200,169,166, 13,227,198,147, 91,141,142, 45, 18, 37,151, 57,199,194,220,144,195,215,222, 64,221,110,144, 37,232,154,160, 13,159,
+147, 68,221, 97, 41,156, 90, 91,187,198,167,245, 66, 48,202,199,199,104,152,250, 72,140,208, 84,145,105,165,136, 26, 70, 27,113,
+141,179, 37,233,115,152, 41,218,179, 76, 11,116,232,202, 92,158, 10,118,178,204,182,181,106,100,156,130,107, 52,162, 52, 92, 86,
+ 36,126, 61, 42,122, 23,155, 14,158, 87, 68, 46,115,250,247,182,130,232,101,214, 88,251, 6,234, 74,127,118,110, 8,101,105, 40,
+114,167,195,131, 85,103, 72,177,207,205,182,210,181, 45, 20, 61, 75,145,155,153,106, 62,119, 59,104,128,106,142, 4,223,120, 70,
+155,170,225,168,155,128, 15,129,182,137, 76, 39,194,100, 18,217, 28, 69, 46, 95,142,100,211,105,196,100,144,149,122,115,228, 9,
+247, 15,162,240, 72,219, 36, 88, 62,232, 74, 60, 9,201, 3,152, 96, 55,107, 4, 95,235,247,181, 62, 50,218, 92,101,146, 67,221,
+122, 21, 37,228,144, 25, 67,175, 63,228,170, 67,175,228,238, 47,125, 63,194, 89, 70, 31,255, 32,253,235,174, 7,223,135,139, 79,
+194,210, 33,194,218, 89,166,143,222,199,226,183,252, 95, 52, 39,254,157, 75,255,244,143,156,252,232,199,120,193,143,125, 15,151,
+ 23, 39,124,250, 47,223,207,135,142, 94,228, 27,127,225,199,129,140,233,234, 10,213,180, 34, 47,122, 60,249,216, 73,222,255,224,
+ 73, 78,188,247,207,160,222, 98,114,121,133, 61, 87, 29,228,204,195, 79, 48, 40, 11,206, 24,203,111,247, 29,191,246,249,227, 28,
+ 3, 22, 86,215, 57, 1,108, 63,246, 9,170,170,101,107,253,146, 46, 11,104, 91, 66,208, 93,229,130,222, 76, 49, 65,129,182,131,
+ 29, 17, 38,107,151,184,247,194,148, 91,110, 60, 76,225, 28, 31,254,192,223, 83,108, 54,252,205,103, 62,206,202,246, 8, 4,110,
+ 59,119,158, 3, 87,236,229,251, 94,124, 59, 55,151,142,159,253,173,183,209, 78, 90, 94,253,197,207,230,214,167,223, 64,237, 43,
+ 6,229,126,130,159, 66, 61,197, 79, 39,216,126, 73,172, 44,243,135, 14, 80,173,174, 83, 46,238,101, 58, 10,170,211,241, 45,113,
+186, 74, 86,244,176, 18,136, 89,201,198,201,227,156,223, 92,231, 7, 95,243,114,254,230, 31,254,133,131,133, 99, 62, 8, 31, 30,
+143, 57,186, 61,226,182,181, 1,223,112,205, 13,252,217,254,199, 73, 49,204,248, 76, 47,116, 9, 32,233,226,105,131,170,208, 61,
+ 80, 77,212, 78, 81,228, 42,254,241, 94, 97,238,182,237,120,172,132, 28, 11, 84, 21, 76, 75,232,207,165,230, 47, 79, 69,211, 24,
+ 77, 68,179, 32,165, 81, 56, 91,146,186, 53,128,183,134,208, 64,183,232, 73,140,138, 62,172,213,231,235, 39,154, 32, 72, 82,212,
+103, 10,207, 71,159,184, 48, 47, 92,251,188,130,207, 29,171, 24, 55,134,245, 8,219,103, 34,253, 59, 44,193, 26,165, 21,218,164,
+138,109, 85,117,238,173, 96, 82,147,146, 57, 51, 83,178,250,144,108,124, 65,146, 40, 69,223, 15, 21,238, 65,139,161, 18,117, 96,
+ 20, 70, 5,127, 21,145, 41,145,137, 68,234,168, 54,193, 50, 55, 41, 3, 91,249,227, 40, 86,213,252, 33, 98,188,194,252,226, 5,
+ 83,234,137, 23,136,184, 34, 65,236, 30, 92,127,158, 80, 7,172, 76,149, 67,150, 78,231, 22,113, 9, 10,235,178,179, 73,211,249,
+ 78,238,175, 65,188,186, 87,204,172,222, 42, 94, 40,206, 97, 93, 42,248,187,114,172,159,146, 35,155,184, 94,146,210,182, 19,119,
+105, 83,191,195, 51,203,110,143,187,176,203, 11,206, 14, 2,144, 38,121,161,155,140,227,236, 49, 58, 37,191,117, 5,110,238, 32,
+ 38,159,199,111,156, 64,226, 36,109,198, 75, 15, 29,163,234, 65,186, 8,177,110, 41, 71,202, 95, 55,236,108,120, 52, 89,182, 19,
+238,149,233, 61,186,240,165,223, 65,113,205, 29,179,233,188, 83,247,119,121,225,122,165,119, 54,184,176,227, 85, 18,159,160,172,
+134, 48,153,224,122,125,117, 2, 68, 65,188,162, 4, 82, 53, 10,134,148, 37, 12,242,153, 3,192,164,125,221,138, 38, 40,229, 33,
+109,171,239,101,136, 41, 96, 69, 55,142,197, 16,212,157,144,101,170, 59,136,186, 29,205,132, 0, 46,199, 24,139, 43,115, 92, 86,
+ 18,234,169,126,222,206,226, 6,253,212,139, 69,252,180,194,149, 96, 51,139, 49, 66,185,103, 47,174,223,131, 44, 35,108,110,169,
+243,100,115,157,232,133,222,242, 2,189,165, 69,178,254, 28,147, 75, 23,212,163, 25, 12,121,145, 19,234, 6, 19, 2, 54, 43, 65,
+ 34, 69,175,196,100, 25,205,100,196,100, 99, 13, 31, 44,142,192,242, 45,183, 51,221,216,192,143, 39,152,220,178,255,174,191, 97,
+124,241,221,124,254,109,239,226,210,197, 85, 30, 61,179, 70,192,144,103,142, 54,209, 19, 18,133,185, 94,143,185,193, 28,115,123,
+106,154,218, 43,159,222,245, 79, 33,233, 42,146,214,163, 75,185, 11, 65,136, 46, 16,124, 42,124, 34,180,168,157,218, 71,165,245,
+ 98,212, 73,218,153,157, 1, 37,164,224,179,216,104,248,139, 73,104, 64,103,180,192,130,245, 59, 34, 56,164, 75,199,131,105, 3,
+ 69,169,195, 79,219,202, 12, 9, 40,138,212, 75, 90,109,144,163,133,118, 42, 73,179, 99, 20, 21,116,170,112,151,132, 32,180,109,
+146,160, 68,221,242,102,157,195, 26,209, 69, 51,185, 54, 9, 34, 58, 64, 97, 5, 35,234,191, 23, 4,103,147,240, 82, 4,107, 21,
+ 98, 15,109,100, 90,123,182,214, 61,227,198, 19,188,208,180, 17,103, 97, 52,137, 84, 85,100, 52, 82,248, 63, 11, 41, 12, 70,140,
+190,248,180,164, 74,133, 81,149,116, 34, 79, 18,141,164, 89, 4,201,139, 28, 18,167,144,103, 10,223, 54,211,200,133,213, 75,244,
+ 7,122,184,229,185,193,181, 22, 50,225, 37,175,124, 39,251, 15, 60, 11,145,136,156,249, 2,205,198, 54,115,215, 62, 31,121,224,
+253,152, 27,159,198,248, 3,255,200,226,221, 47, 96,254,174, 47,225,252,175,253, 32,199, 62,254, 40,207,120,227, 87,240,130,183,
+124, 7,159,250,137,255,202, 35, 23, 90, 46, 4,225,145,211,107, 60,239, 53,175, 36,108,111,177,114,236, 81,104,167, 24,155,113,
+234,252, 37,138, 97,193,222, 67,215,225,155,138,225,158,101,154,209,101,178,172,207, 32, 47,113,219, 35, 94,121,211, 1,238, 62,
+190,194, 28,176, 10,252,234,119,127, 13,249, 96,158,209,214, 5,130, 68, 66, 83, 37, 75, 79,183,153, 43,204, 20,190,221,228, 38,
+201,235,120,234,248, 9, 76,209,103,190,183,200,245, 87, 31,192,212, 53, 31,248,194,103, 88,217, 26,205,250,255, 39, 46,172,178,
+239,210, 26, 91, 14,126,175,137,204,103,150, 26,184,249,142, 91,120,236,216, 81,174,222,191,128,115, 57,123, 14,236,165, 40,231,
+ 40,134,243,244,247, 44, 83,111,111,147,103, 22, 47,142, 80,169,103,195, 20, 37,185, 53,148,123,174,102,227,248, 61,100,131, 5,
+ 92, 90, 97,123,233,209,123,249,221, 15,124,148,155,126,248,187,249,227,119,190,143, 51, 43,235,220,208,207, 57, 81,181,124, 97,
+ 50,225,210, 99, 39,120,195,202,126,254,250,234,203,140,125, 36, 86, 96,134,201, 11,153, 46,246,182, 78,122,167, 86, 63,103, 27,
+ 96,154,146,147,156, 23, 85,190, 39,142, 61,132,157,112,133, 34, 29,194, 49,236,184,125,212, 91,222,229,198,107,182,129, 49, 42,
+136, 9,146,248,113,195,172,211,141, 2,210,168,130, 51, 6,205, 67,144, 20,188, 17,173,217,225,222,188,166, 63, 89,160,200, 21,
+146,190,246,160,227,232,147,158,104, 12,103,199,194,211,114, 67, 99, 19, 92,236,128,244,186,197,106, 94,122,110, 80,193, 80,170,
+ 21, 89, 42,130, 38, 68,196, 89,221,168, 20,226,204,242,231, 18,116,239, 50,168, 48, 52,201, 21, 48, 13,194,166, 13,140,129,224,
+146, 66, 60, 53, 7, 74, 63,136, 78,230,193, 64, 43,170,242, 23, 65,252,142,130, 58,100, 65, 55, 67, 89, 33,230,170,114,207,172,
+ 83, 7, 64,183, 88, 65, 34, 6,167,112,123, 18, 34,170, 47, 49, 9,226,186,132,182,108,158,108,184,151, 48,185, 4,190,210,169,
+ 61,144, 60,254, 42, 5,181,166, 51,134,147, 66, 99, 84, 85,171, 30,242,164,104, 8,250, 94, 25, 31, 21,245,143,162,188,119,231,
+109,199,166,180, 72,153,193,242, 70,146, 96, 46,134,153,160, 78, 11,103,212,205,125,214,238, 20,234, 78,117,153,244, 12,210,214,
+ 72,155, 82,235, 66, 80,104, 57,241,238,198,216, 89, 19, 19, 19, 60,221,137, 20, 49, 86, 21,191, 73, 68,100,173, 1,155,131, 43,
+ 88,126,227,207,165,253,223,102,150, 3,222,113,248,154,160,224,159,186, 88,222,184, 20, 19,214,133,107,120,226,116,170, 80,186,
+247, 51, 21,190,201, 82,192, 79,209,219, 29,218,175,124,148,181,105, 18, 79,141,134,213,205,126,186,208,200,206,252,255, 49,132,
+116,158, 4, 76,158, 67, 93,105,230, 64, 12, 10,211, 59,135,181, 25, 89, 79, 19, 78,154,201, 22, 89,222,195,230, 57,110, 48, 68,
+218, 22, 49,130,248,128,205, 75,124, 53,193,149, 5,249,220,162,118,234,109,139,223,220,164,173,166,100, 69, 65,104, 35,217,160,
+164,232,247,201,122, 3,218,177,158, 79,177,246, 72, 12,180,117,131,137, 94, 17,166, 40,248,122, 74,211,180, 52,163, 9,193,246,
+201,231, 15, 17,170, 77,157,140,215, 55,200,135,125,154,237, 49,229,112, 64, 51, 30, 49, 56,240,122, 94,248,163, 95,193,187,127,
+238, 45,124,234,129,227,244,246,239,155, 45, 25,113, 9, 73,233,149, 61, 14,238,187,138,229, 67,219,108, 62,105,245,172,109, 83,
+ 14, 69,167,159, 48,221, 94, 4, 65, 98,130,230, 61,248, 54, 82, 37, 24, 60, 26,213,204,212,181,204,196,117, 89,102,186, 94, 46,
+105, 52,148,154,202,156, 54,187,157,127, 92,183,185, 41,210, 99,172, 78,210, 38,169,199,155, 78, 16,156, 65,147,118,136,249,105,
+ 90, 14,105,181, 37, 45,114, 67, 81, 38, 5,124,208,159,173, 42,125,236,188,132,249, 57,189,214,170, 73,114,144,213,187, 32,121,
+209,166, 46, 26, 13,213, 41,186,160,171, 78, 28,235,245,189, 23,137,196,160,209,192, 38,165,184,182,141, 77, 12, 74, 36, 52,129,
+ 54, 4,166, 19,161,105,130, 42,248,173, 90,134,183,183,132,233, 40,173, 76,171,235,157,123, 44,179, 59, 77,124,119,168, 85, 19,
+161,109,244, 80,239,151, 10, 33,100,185,126, 95,145,195,160,151,225, 10,181,250, 52,233,205, 14,181,118, 79,161, 53, 4, 31,249,
+150,239, 62,193,190,253,207, 36,198, 6,204,113,194,230,132, 98,113, 8,231, 62, 73,220,188, 0,151, 30,133, 56,129,173, 75,156,
+123,235, 79, 51, 58,181,194,243,127,224, 13, 44,190,241,167, 57,254,215,127,202,169,245,192,202,185,115, 92, 56,125,134,165,195,
+123,113,115,203, 76, 86,206,209,159,235,177,176,119, 63,155, 43,151,249,236, 19, 43,188,252,217,183,128, 68,170,205, 77,218,118,
+170,211, 11, 19,134,203,115,124,239, 48,231, 93, 23, 54, 82,158,190, 97,255,158, 33, 63,246,235,191,206,165,115,167, 9,193,211,
+ 86, 83, 61,216,108,183, 94, 81, 33, 56,233,160,177,168, 65, 18, 49,180,132,186, 33, 26,203,246,230,134, 30,114,227,134,237,245,
+ 21,206,174,235,227, 31,113,240,117,153,229,181,206,224, 36,242,233, 38, 50,200, 44, 23,125,228,101,175,124, 33,205,120,147,245,
+141,109,246, 44,205,177,176,127,145,193,220,128,114,121, 30, 99, 60,182, 95, 40, 34,217, 31, 98,138,130,122,243, 50,229,124, 73,
+ 49,191, 31, 63, 89, 99,122,241, 17,250,251,175, 35, 31,238, 35,214, 99,242,249, 37, 6,123,174,100,253,212,227,252,192, 47,254,
+ 42, 15, 94,188,200,167, 79, 63,202,226, 13, 65, 62,172, 12, 0, 0, 32, 0, 73, 68, 65, 84,215,242,121,129,219, 50,199,253, 34,
+124,116,180,206,183, 93, 58,192, 0,171, 80, 84,151,248, 22,180, 67, 21, 3, 77,163, 23,106,244,224,219, 29,207,112, 93,105, 39,
+ 91, 79,187,125,231,162, 16, 84, 18,125,133, 0,117,155,130, 29,124,242,124,219, 29, 68,213,167,107,169,219, 99,108,108, 82,168,
+ 38,126, 43, 19, 81,200, 53,161,158,161, 85,125, 7,214,224,172,166, 25, 22, 3, 24, 12,148,243, 74, 66,107, 66,136,220,245,226,
+156,249,158,197, 3,151, 34,216,147,145,254,192, 80, 46, 90, 66,110,177, 61,139, 45, 84,148,233,173, 81,238,219,130, 36,120,220,
+ 38,242, 45, 26, 81, 38,220,104,248, 77,140, 66,219, 4, 90, 31,240, 68,106,137,108,167,201,124, 43, 6,214, 8,108,182,162, 69,
+ 62, 38,170, 32,169,211, 99,242, 91,135,168,194, 31, 9, 66,108, 2,177, 9,216, 86,104,167,113,182,166, 82,140, 32,185,193,228,
+ 16,226, 4,105, 39,152, 40, 73, 25,172, 80, 46,105, 5, 38, 81, 15, 8,131,138,243,180,230,170,160,203,149,243,184,229,171, 83,
+ 49,211,201,210,206, 44,103,187, 54,157,205, 50,235,101, 38, 57,158, 65,243,221,198,198,238,243, 16,147,158, 37, 5,163,116,161,
+ 52, 33, 50, 51, 70, 38, 94,218,216, 4,151,239,218,214, 96,173, 78,164,177,245, 59, 30,235,110, 87,125,108,241, 27, 39,105, 55,
+ 79,164,137,220, 37, 10, 96, 39, 80,102,103, 97,159, 75,121,252, 70, 41, 1,179, 51, 26, 75, 34, 58,197, 56,204,112,145,125,111,
+250,239,152,172,252,207, 91,224,140, 81,232, 38, 76,119, 40,135,212,236,236, 80, 17,138,157, 74, 53,217,181, 87,200, 96,242, 28,
+ 83, 20,152,188, 80,213,104,247, 11, 11, 80, 79,192,183, 72,219,236, 74,207, 75, 66, 59,163,209,191,106,153,236, 38,243, 28,155,
+ 59, 92,174,118, 55, 87,228,250,167,215,195, 21, 61,178, 34, 35, 27,148, 90,208,167, 19,242,225, 28,249,158, 37,220,194, 18, 56,
+135,160, 73,122, 18, 90, 32,144, 15, 23,200,231,247,232,175, 51, 30,225,199, 99,124, 53,193, 90, 75, 91,215,152, 76,233, 26, 91,
+228, 90, 52,188,167,218,220, 82,126,190,141,186,168,200, 56,117, 9, 20, 25,211,241,132,118, 60, 98, 58,154,210, 54, 21,205,230,
+ 10,100, 37,245,246, 22,163,139, 43, 84, 27, 91,184, 94, 70,187, 61, 82, 43, 95,219, 96, 92,206, 55,252,210, 31,241,254,123, 63,
+203,217, 11,171,108, 77,107,122,101, 65,140, 66,175,232,177, 60, 55,207,141, 71,142,112,242,228,111,226,125, 76, 58, 23,161,174,
+132,105,173,133, 90,247, 67,105,100,109,167,161,137,181, 16,188, 66,244,222,107,144, 85, 12, 16,155, 36,164, 11, 66,227,181, 56,
+234,144,169,245, 39,250,164,237, 73,103, 83,136, 9,237,235,166,249,164, 94,199,164, 44,136, 92,185,119,147,205,216, 39, 13,217,
+ 74,103, 92, 91,119, 60,250, 14, 18,102, 50, 69, 27,178, 28,134,125, 67,175, 48, 44, 12, 45, 75, 75,134,193, 64,135,194,122,154,
+132,116, 77, 84, 20,210, 40, 12,223, 17,254,209, 11,117, 29, 25,143, 34,211, 58,224,219,180, 54,219,123,170,218,227,219, 72, 12,
+129,182, 81,238, 28, 34, 77,163, 63, 83,183, 48,158, 68, 38,211, 72, 83,193,180,214,166, 7, 59,235,115,119, 18,114,186, 67,215,
+102,202,177,250, 86,161,245,185,133, 33,183, 63,253,185, 28,186,106, 31, 36, 27,219,220,176,199,115,159,119, 7,215, 30, 90, 98,
+ 56, 52,228,185, 33,182, 90, 4,166, 99,200, 40,248,254,159, 88,161,236,245, 16,217,192, 52,247, 83,127,242, 31, 57,246,151,111,
+199,111,173, 17,139,121,206,127,248,239,161, 14, 44, 62,235, 38, 78,255,213,187,121,236,157, 31,227,250,239,252, 30,122,175,254,
+ 63,217,122,215,127,227,145,127, 59, 65,187,189,205,149,119,221,193, 29,175,122, 21,207,186,235, 6,192,210, 76, 38, 44, 94,117,
+ 13,109, 27, 57,250,248,105, 62,125,234, 44,183, 28,222,175, 29, 60, 66,189, 61,102,241,138, 67, 64,159, 24, 45,223,115,203, 1,
+126,117,212,144, 27,184, 24,133,223,249,185, 31,226,226,209, 7,213, 6, 50, 25,165, 0,126, 45,230, 18, 3, 18, 84,136,160,127,
+215, 14, 74,154, 22, 95,215, 52,213,132,151,126,253, 55,113,219, 77,135, 25,109,174,114,126, 90, 81,236,191,146, 55,205, 13,248,
+153,185,130, 27,129,149, 24,217,194,176, 97, 96, 79,102, 56,237, 35,111,252,234,151,240,210,231, 63,147,227, 39, 79,179,127,113,
+ 72,108, 3,153, 53,236,189,246, 90, 92, 97,232, 45, 93, 9, 33, 80,206,207, 43,196,101, 12,109,109,241,227, 17,227,149,147,184,
+ 98, 14, 59,119, 16, 63, 89,163, 88,152, 99,238,240, 45, 52,155, 23,241,211,117,242, 94,159,102, 58, 97,243,204, 41,230,251, 67,
+222,243,224,195,156,127,244, 11,188,191, 13, 60,111,113,145,127,168, 91,222,122,121,133, 63,186,238, 43, 97, 87,161,118,187,166,
+109,100,103,154,110,130, 22,248,182,214,155,162,169,181,232,182,181, 30,206,214,105, 1, 84, 97, 92, 42,102,201,150,210, 52,146,
+ 54,199, 36, 56,189, 86,158,201, 25,181,121, 89,209,102, 64, 15, 91,161,170, 52,157, 78,149,242,250,179, 77,173, 29,115, 8,201,
+239,105, 20,218,239,231,202,139,229,168,111,188,152,131,131, 87, 90,230, 10,104,157,225,145, 11, 65,169,129,158,161, 55, 48,228,
+ 3, 48, 67,139,237, 27,108,143, 89,202, 85,183,125, 78, 82,242, 85, 76, 9,121, 49, 17,114, 18, 52, 4,199, 55, 26,194, 83, 25,
+ 97, 20, 3, 99, 34, 91, 68, 54,162, 70,195,214,187,182,199,153,168,139,134, 44,157, 78, 44, 65,232, 81,136,109, 36, 84, 59, 7,
+ 80, 59,141,132, 38,106,129,148,168,194, 69,163,106,117,135,193,120,189,142, 53,101,171, 43, 74,102,102,137, 50, 41,245,209, 25,
+155,166,248, 26,191,122,156, 48, 78,141,166, 73,220,117,194,165, 59,139,154,236,222, 62,181,123,149,169,145, 93,139, 59, 82, 49,
+ 55, 59, 75,104, 76, 74,105,195,176,195,241,238,252,230,187,162,206,192,100,217,172, 40, 26,103,211,218, 78,221,198,161,145,183,
+ 9, 93,112, 86,209,130,184,139, 6, 48, 59,107,149, 59, 30,155, 20, 45,219, 33, 28, 70, 80,171, 24, 70, 53, 48,214,144,237, 59,
+204,242,215,254,236,172,152,119,123,170,187, 53,159, 18, 70, 90,208,109,130, 34, 99,212,201,126, 54,165,163, 42,247,224, 19, 47,
+159, 97,172, 42,143,245,100,111,244,102,136,237, 44, 46, 87,154, 90, 95, 83,166, 1, 62,177,109,102, 33, 53,161,170, 8,211,177,
+114,233,193,235,159, 54,133,185,116,209,184, 81, 8,117, 77, 59, 25,235, 32, 50, 25,211, 86, 53,245,104,139,102, 60,194,229, 37,
+214, 88,164,245, 72, 53,198,111,173,107,188,105, 83,205,236,115, 18, 90,218,205,117,218,173,109,218,241,152,208,212, 68,177, 52,
+211,138,208, 4, 92,166, 11,138,178,254, 28,237,104, 76, 61, 30,107, 99,100, 13,190,110,176,198,224,131,199,228, 37,126, 90,107,
+163,230,122,184,225,162, 38, 68, 58, 67, 59,221, 38,250,134,106, 99,141,208,180, 52,227,154, 40,134,208,122,124,163,175,127,178,
+186,194,226,112, 31, 39,182,183,121,221, 87,188,156,199,158, 92, 97,208,235, 51, 63,156,227,250,107,143,112,224,170,147,169,135,
+ 76, 13,115,173,121,235,146,226,111,197,128, 79, 75, 81,186,189,227, 33,165,194,145,201,108,235,163, 79,121, 16,190,101,166,211,
+176, 78,245, 48,157,201, 2,204, 14,170,156,156,142,157,162, 34,198,157,239, 13, 33,109,147,116, 26, 62, 19, 83, 98, 92,167, 55,
+106, 91,245,162,183, 77,202,250,104,147,203,196,232,218,218,193,208, 48,236, 65,127, 96,152,155, 55, 44, 44, 25, 22, 22, 45,101,
+207, 48,215,215,188,139, 60, 55,184,220, 98,115, 67, 81,102, 9,241,210, 83,162,242,176,185, 21,168,107, 73,195, 79,160,174, 61,
+ 33, 68,218,170,165,170, 91, 66, 8,196,224, 9,109,164,174, 52,106,183,245,145, 73,165, 5,190,154, 10,147,113, 84, 81,111,151,
+143,225, 18, 4,106,173,134,119,152,212, 37, 77,182, 37,169, 86,245, 80,113,244, 24,230, 7,136,213, 49,178, 76,240,173, 97,126,
+104,232,247, 2,229,208, 99,250,157, 15, 93,223,189, 94,182,135,239,255,161,251, 48, 97, 85,111,202,141,251, 89,121,215,123, 25,
+238,159,227,134,151,190,152,242, 37, 95,198, 35,111,249, 94,174,253,170, 87,194,158,131, 60,242,243,255, 27,231,238,189,200,203,
+ 62,244, 81,204,210,179,169,238,253, 3,238,253,219,127,229, 69,191,244, 59,252,209,247,255, 0,123,202, 5,254,224, 93, 31,226,
+223,142,126,128,250,252, 25,140,141,108, 94,184,200,147, 71, 31,229, 83, 15, 61,202,168,109,185,243,182, 35,248,233,136,188, 55,
+100,186,185, 77,222,159,195,152,150,103,220,118,132,183,254,246,167, 40, 83,202, 80, 3, 60,231,121,207, 99,245,194,121,242, 44,
+195,229, 69, 58,138, 83,126,177, 64, 76,197, 92, 59,108,237,162,124, 80,217,127,127, 97, 15,219,151,206,115,215,157,183,242,209,
+143,126,146, 35, 79,222, 79,252,216,152,163,192,253,192, 4,184,193, 25, 78,196, 72,175, 95,176,218, 70,190,229, 43, 94,192, 75,
+239,190,155,207,126,226, 19,152,216, 82,184,146,197,165, 69,174,184,241, 8,133, 43, 40,231, 22,177,121,137,201, 28, 33,142, 85,
+ 72, 85,228, 20,195,156,106, 20,152,219,219,163, 13, 61, 98,211, 80,109,172, 19,155, 17,249,226, 85,184,193, 18,237,116,132,177,
+ 27,184,222,242,108, 63,113,136,158, 43,142,220,206, 7,222,241, 86, 94,243,198, 55,243,179,203,123,248,231,205, 77,190,227,195,
+239,231,247, 95,241,229,188,249,228, 63, 40,229,218,232,133,220,229, 48, 75,218,135,219, 65,200, 29,140, 43,113,182, 72,108,150,
+123,236, 45,212, 83,109,178,219, 54, 9, 72,102, 55,150, 22,164,144, 4, 69,109, 43,184,158,153,165, 61,229, 70,139,120, 7, 99,
+ 6, 15,153,211,206,188,179,155,248,169,144, 13,212,153, 97, 51,157, 80,141,232, 13,110,103, 89,204,194,115,190, 36,231,253,111,
+247, 76, 60,172, 8, 76, 30,243,244,239,200,136, 61,136, 77,202, 53,243,170,170,213,237, 67, 6,103,162,110, 79,179, 66,136,102,
+ 6,155,103,201,207,218,166,220,123,159, 34, 98,125,171, 30,255, 70,132, 41,170,248,143, 14, 82,234,247, 46, 65, 91,218,136,151,
+226, 35, 5, 21, 17,198, 68,101,248, 20,162,170, 48,153, 65,140,197,244, 83,162, 90, 72,194, 56,175, 80,117,244, 22,187,123,165,
+179, 40,156, 29, 53, 22,112,215, 74, 82, 33,110, 93, 74,161, 39, 73,247,145, 84,241, 97,107,131,119,125,232, 49,190,255, 55,190,
+149,237,227, 99,194,250, 57,157, 80, 76,183,140, 65,215,186,234,155,156, 28, 0,146, 22,242,164,211, 79, 15,139,180, 18, 67, 52,
+ 73,207,152,157, 32, 28, 17,193,186,157, 84, 55, 73, 57,209, 42,160,179,179, 56,217,221,203, 90, 98, 12, 56,231, 52,137,171,131,
+241,173, 69,162,217,201,134, 15,201, 56,220,165,127,152, 4,205, 23, 69, 10,233,177,136, 49,100,123,175,101,233, 53, 63,252,148,
+ 61,233, 59, 95, 83,119,136,164, 34,222,169,254, 19,170,224, 39, 90,232,103, 11,114, 83, 3,145,151, 80, 87, 79,125, 60,152, 5,
+ 60, 72, 85,165,197, 92, 45, 38, 10, 34, 1, 55, 24,208,172,175,171, 63, 59,203, 48,198,210,140, 54,144,144,220, 7,214,225,130,
+167,217,174,136,226,241,117, 75,240, 26, 26, 19,117,156,196,228,142,188,236, 37, 4,102, 10, 49,226,186,230,193,101,196,166,193,
+ 55, 53,214, 56,166,211,203, 68, 31,112,121,142,177, 14, 95, 85, 26,186,147, 26, 36,133,109,133,114,126,145,122, 99, 77,209, 33,
+137, 88,151,225,155, 6,231, 12,190,213,165, 56,190,173,241,211,134,122,218, 18, 37,195, 82,225,138, 66,151,118,133, 64,179,189,
+ 9, 2,211,205, 13,122,139,243,224,114,213, 14, 56,176,101,137, 17,139,224,185,252,248,227,252,230,219,222,205,235,223,240, 46,
+ 94,253,218,111,226,245, 47,123, 9,183,221,126, 4, 99,126,155,194, 42,125, 17, 90,245, 85, 75, 48,120,148,239,110, 66, 18,206,
+122,168,219,136, 9, 66, 48, 6,211, 19, 98, 43,148,165,230, 78,100, 33,125,175,147, 46, 46, 64,151,198,164, 73,222,100,202,139,
+ 59, 35, 52,109,242,194,239,218,168,106, 19,141,156, 59,104,140,106,102,186,152,134,206,183, 30,162,210,128,130, 70, 73,199, 8,
+ 3, 39,248, 96,176, 94,117,103,136, 33, 26, 85,248,231, 61,221,123,210,235,165,184, 86,107,168, 26,131,117, 90,228,243,220, 80,
+230,118,230,119, 15,162,126,242,173,141, 64, 61, 17, 69, 39, 8, 12,250, 70, 81, 72,107,152, 78,116,175,130,179,205,108,219,219,
+157,207,255, 38,158, 46,142,170,110, 48,214, 81, 79,107,182, 55, 71,124,248,131,255,194,120,180,162,121, 36, 13,216,162, 48,244,
+ 74,171,220, 98, 18,192,153,228, 70,177, 14, 74,181, 95,114,121,117,147,207,253,251, 63,115,254,236, 26,133,181,244,122,134, 38,
+ 86,156,124,242, 97,196,141, 89, 88, 50,204, 47, 89,134,115,150,235,174,185,147,183,252,215, 99,200,165,207, 17, 46,159,134,199,
+222,203,229,127,252, 0,143,127,250, 56,195,215,124, 7,249,129,101,214,254,244,183,105,234,150, 98,121, 47,143,255,210, 79,113,
+225,115, 39,121,217,199, 62, 13, 75,119,225, 47,254, 13, 91,199,206, 51,124,250, 23,113,255,223,189,135,187,223,252, 3,124,225,
+244, 57, 94,180,228, 40,247, 30,100,251,210,121, 12,134, 51, 71, 31,225,228,241,227,172, 85, 21,181, 15, 92,117,237, 85,196, 54,
+224,219,134,222,160, 96,251,210, 38,203,135,246,114,205,193,189,124, 60, 29,164,222, 26,110, 63,180, 76,172, 42,252,104,155, 32,
+ 26,116, 16,131,199, 55, 26,241,232,235, 6, 95,213,248,186,162,169,107,154,186,193,183, 21,109, 85, 83,206,205,243,180, 87,191,
+129,249,225, 18,119,255,251,191,242,173,235,231, 57, 61,157,240,158, 20, 18,210, 0, 79,203, 12,143,164, 60,225,181, 73,195,139,
+111,189,158,175,251,234, 47,227,201, 19,167, 56,117,246, 60,165,115, 92,119,248, 10, 14, 92,123, 3,139, 7,247,177,112,211, 17,
+202,125,251,177,101,142,205, 74, 98, 61,157,165, 81,185, 34,199, 56, 24, 93,218,160,186,124, 17,169, 71, 44,221,252, 28, 92,127,
+ 63, 25, 99,242,193, 34, 46, 43,105,182,183, 8,211,117,220,112, 64,181,118,153, 88, 55,255, 31, 89,111, 30,111,249, 85,150,249,
+126,215, 90,191, 97, 15,103,159,177,230, 49,149,169,146, 0, 73,128, 4, 8, 1, 2, 36, 32,162, 68, 16,101,144,182,113,164, 5,
+135,110,212, 30,108,187,111, 59,227,112,181,239,245,210, 40,173, 92, 80, 27, 69,188,128,104,163,128,128, 64, 66, 0,153, 50, 15,
+149,154,135, 83,167,234,204,103, 15,191,105, 13,247,143,119,237,125, 10,229,243,201, 39, 64, 42,167,234,236,179,127,123,173,247,
+121,159,231,251,208, 52, 13,175,126,243,143,114, 96,182,203,199, 54,214,185,228, 61, 51, 38,225,167, 62,253, 73,238,216,127, 43,
+170,150,193, 67, 59,201,106, 78,210, 59, 62,154, 72,148,200, 78,130,129, 85,223, 22, 81,243, 49,242, 48,222,167,215,149, 72,246,
+ 33,114,152,235, 10,106, 27, 40, 10,145,201,148,138,185,241,228,138, 30,111,189,157,170, 10, 99,169, 44,126,254,122, 59,174,241,
+213, 34,111, 27,161,174, 37, 29, 29, 85,210, 72,149, 82,242,240, 92,115,196,160, 77, 96, 4, 28, 63, 47, 24, 59,221, 9,146,117,
+ 79,164,148,200, 71, 87,245,184, 76, 36,213,106, 98,248, 36,126,184, 88,182,139, 70,188, 21,160,203,176,240,140,106, 79,237, 3,
+ 5,129, 50,145,172,169, 27,131, 82,196,211, 69, 74, 60,228,213,248,128,143,133, 36, 99,217, 48, 81,232, 41,141,201,140, 56,211,
+157,252, 90, 21, 20,198,199, 8,140, 23,208, 74,162,141,176, 28,226, 46,118, 59,239,237,227,144, 60,158, 66,153,236,177,181,102,
+ 27,171, 21,127,239, 83,167, 47,243,248,200,243,246, 55,190,159,221,247,190,132,160, 35,191, 50,184,168, 58, 71, 99,155, 10,223,
+ 86, 75,169,148,150, 29,121,216,182,201,133, 32,151, 5,226,190,124, 60,142,203,197,207,203, 1, 61, 38,194,133,201,237, 46,210,
+ 85,199, 14,230, 16, 13,110, 26,111, 61, 42, 25, 79,255,105,140,152, 77,192,218,209,132, 23, 51,242,217, 20,202,100,130,150,213,
+106,178,183, 54,115, 7, 38, 7,186,250, 54, 42,157, 34,132, 50,202, 28, 70,154, 54, 84, 18, 61,217, 89, 84, 23,106, 72, 90,114,
+216,199,198, 48, 97, 3,103,114,139, 51, 10,149,104, 92,221,196,230,145,177,185,168,137,203, 96,217, 99,201, 26,199, 80,175,174,
+224,170, 18, 99,132,250,101,203, 17,174,182, 17, 20, 34,111,170, 98, 99,157,114,176, 69, 51, 28,197, 55, 88,192, 53, 13,245, 96,
+ 32, 18,107, 0, 91, 85,216,186, 1,235, 80,193,225,157,195,213, 53,245,230, 6,245,160,143,171,106,234,178,192, 21, 13, 90, 41,
+ 92, 93,211,140, 70,184,178, 70,167, 50,158,102, 89, 78,210,238,144,118,218,146,228, 9, 30, 95, 55, 40,101,228, 2,225, 3, 42,
+ 75,241, 68, 70, 69,101,177, 62,144,228, 25,154,146, 36,207, 5, 9, 94, 59,108, 85, 83,110,109,208,191,116,129,225,197, 11,244,
+ 47, 92,164, 30,141,112,206, 98, 7, 67,170, 75, 43, 52,229,144,224, 3,157,249, 89, 70, 43,151,120,254,139, 95,197,153,243,199,
+201,146, 30,215, 31,253, 52,153, 75, 72, 66, 2,181, 33,212,154, 80,169,184, 2, 84,219, 41, 28, 47,117,179, 62,210, 32,199, 57,
+178, 36,135, 52, 27,171,200, 97,194, 83, 31, 7, 34,172, 19,239, 87, 24, 67, 5, 67,192, 90,181,237, 3, 53,227,211, 92,126,236,
+ 70,109, 87, 77,187,237, 71,101, 91, 9,136,180,184,177, 90, 88, 71,181,146,184,161, 25,183,192, 25, 35,251,241,118,166,232,118,
+ 52, 83, 29,195, 84,207,208,155,214,204,204,106,118,238,208,180, 91, 9,237,182, 33,205, 19,180, 54, 88,175, 41,202,192,176,111,
+ 25, 21,158,254, 48, 80, 87, 94,140,111,214, 81,215,142,173,141,134,245, 53,199, 86,223, 49, 24, 88,234,202, 81,214,150,213,229,
+ 51,124,229,254,191,225, 99,127,249, 1,254,254,227, 31,231,236,137, 51,252,227,103,238,227, 37, 47,186, 75,134, 48, 39,166,117,
+221,203, 91, 98,183,215, 50,105, 91, 43,178,132,138, 36, 39, 21, 27,172,154,202,177,181, 54,196, 68,165, 46,213,138, 94, 79,209,
+234,136,101,127,172,142, 93,123,253,119,240,134, 31,121,128,176,241, 77,124,109, 9,205,144,203,255,240,143, 92, 56,222,231,224,
+157,183, 64,251, 8,193,180,120,226,239,190,201,158,155,175,101,227,171,247, 51,213,155,226,101,159,252, 20, 42,221,207,234,187,
+238,226,161,159,255, 63,120,236,179, 15,113,234,145, 83,124,237,115, 95,224, 35, 63,245,211,124,103,167,224,182,107,247, 67,214,
+ 97,122,231, 62,234, 66,177,121,121,133, 4, 71, 89,213,120, 96,166, 55,141,141, 89,218,153,131,251,241,174,161,189, 99, 39,102,
+102,150,119,253,187,123,153,159,157, 98,213, 5,238,126,230, 53,156,123,226,113, 41, 76,168, 42,188,141,187,242,186,164, 41, 71,
+ 52,213, 72,246, 73,101, 69, 83, 85, 84,131, 33,182,177,228,187,119,147,110,110,242,161, 93, 59,120,217, 13,183,243, 39, 23,150,
+121,159,135,203, 46,208, 37,240,140, 52,193, 0, 39, 60,172, 1, 87, 95,189,159, 15,189,247,183,121,251,191,126, 29, 23,206, 95,
+226,161,111,125,139,217,142,225,198,163,135,184,225,246,219,216,121,237, 53,244,174,190,129, 52,203,193, 53,248,122, 68, 48,134,
+108,170, 75, 83, 84,216,170,166, 42,234, 40,149,228,168, 68, 28,108,163, 75,103,176,141,220,170,155,141, 75,180,119,238,197, 21,
+ 53,205,176,194, 36,109, 58,123,246, 80,172, 45,147,166, 41,131,181, 21,190,248,229,207,241,136,135,183,204, 76,243,201,178, 98,
+183,119,188,174,156, 17,137,120,204,214,184, 2,200, 48,169, 11, 6,242,248,121,231,162,106,216,212,146,251,244,110, 59,222,134,
+223,174, 94, 13,113,170,109,138,192,168, 63,193,100, 19,130, 18,143, 69,205, 68,246,110,236,182,236, 53,198, 59, 38,241,115, 60,
+203,174,108, 7, 85,177,202, 80,131, 17,179,201, 88,253, 85,120,124,227,184,241,133, 9,237, 84,225, 2, 92,182, 96,159,178,242,
+181,210, 64,229,197, 17, 91, 79, 92,173,146,115, 85,113,154, 13,102,251,112,146,102,209,200,237,142,107,215,166,146,181, 64,223,
+122, 6, 4, 74, 37, 85,193,186, 21,192,200,107,148,165,178, 34,208,140,235, 23,245,246, 1,172,197,145,151, 76, 25,232,165,132,
+110, 70,218, 78,208, 90, 75,105, 67,228,196,155,216,206,164, 99,173,113, 48, 26, 31, 77,104,218,232,109,172,234, 21, 57,103, 61,
+105,251, 16,166,126,136,239,127, 55,236, 19,178, 17, 71, 95,118, 39,253, 62,140,122,240,219, 47,253, 41,118,189,227,103,197, 35,
+ 18,136, 74, 84,204,188,163,233,220,246,114,146,249,253,223,222, 75, 77,216,118,153, 71, 80,140,196,237,116,156,222,153,148,188,
+140, 73,113, 97,252, 67, 87,223,238,142,159, 68,208, 98,108, 84, 41,169,183, 37, 26,225,226, 94, 39,186,228,245,164,221, 13, 19,
+ 39,249,177,162,230,229,215,169,206, 12,115,247,190,243,138, 67, 60, 78,213, 52, 4,202, 24, 29,136,157,152, 65, 73,156, 98, 44,
+ 69, 5, 7, 42,182,217,251, 74,114, 73, 38, 19, 0,131,143,144, 25,235,176,131,129,172, 9,210, 52, 42, 6, 78,148,136,248, 61,
+106, 99,240,117, 77, 51, 28,224,157, 69, 27, 77, 83,150, 52,195, 1,245, 72, 88,240,222, 74,220,173, 25,141, 36,166,134,172,121,
+170,173, 1,213,214, 0, 91, 84,168, 36,193, 24,131,171, 27, 92, 35,183,107,231, 60,245,168,198, 22, 21,174,174,113, 69,133, 43,
+ 43,108, 89, 17,108,131,119,241,159, 85, 21, 38, 49,180,102, 58, 36,173, 22,105, 39, 39,153,234,202,125,168,170,105,202, 66, 86,
+136,222,211, 20, 67,124, 93,161,148,162, 30, 22, 84,197, 8,215, 52,248,198,226,157, 80, 88, 90,221, 46, 77, 81,226, 71, 21,190,
+ 28, 68,197, 73, 46, 5,163,149, 85, 58, 59,118, 98,235,134,186, 63, 32, 40, 69,213,223,100,243,196, 9, 70,151, 46, 81, 15, 7,
+ 4,101,112,161,161,165,115,254,224,227,127, 66, 86, 46,209, 73,218,194,165,183,160,173, 38, 13,154, 60,209,164, 90,147,199,247,
+127, 29,149,170, 49, 60,198, 33,123,118, 19, 83, 48, 62, 38,175,136,110,117,125, 69,165,249,100,155,228,227,234, 75,122,193, 68,
+249,139,221, 10,121, 91,214,202, 74,111,123,138,198, 59,248, 43,106,208, 39,102,224,224,196,115, 4,130,169, 30,127, 46, 54, 86,
+ 24,238,227,135, 93,199, 72,157,214,208,105, 43,186, 93,205,244,180,102,110, 62,101,118,198,208,202, 76,124,102, 20,182,241, 84,
+ 35,199,104,232, 25, 14, 5, 28,227,199,151,222,198, 51, 42, 44,253, 45,203,230,150,103, 99,195, 49, 24, 58,170,210, 81, 23,150,
+ 86,103,150,197,243, 75,212,101, 96,233,220,101,102,123,243, 44, 94,184, 44,230,186, 70,212,200,224, 3,250,186,235,111,101,207,
+194, 28, 89, 34,150, 24, 29,111, 42, 42,104,116, 16, 20,231,120, 13, 20, 44, 36, 94,209,150, 53,210,228,246, 52,158,124,246,237,
+190,157, 87,222,251, 33,124, 24, 81,159, 59, 71,117,254, 18,201,212, 28, 11,175,252, 94,124,107,154, 36,203, 81,116, 56,251,158,
+223,198,162,152, 58,120,128,133,151,191,134,221,255,238, 87, 80, 51,207,101,235,175,254, 53, 15,127,109, 64,117,240, 14,254,233,
+179,223,224,186, 35,211,252,251, 79,253, 37,191,241,119,239,103,125,179, 98,107,247, 60, 20, 35,234, 98,192,198, 37,145,224,203,
+210,137,169, 11,176, 91,235,184,186,196,214, 13, 73,154, 99, 27, 75,146,230,116,123, 45,174,185,237, 57,188,250,230,163,148,192,
+139,159,125, 3,139,103,207,202, 14,171, 24, 81, 13,134,241, 13, 94, 80, 13, 10,234, 97, 73, 85,148,212,131, 45,108,211,160,102,
+167,177,143, 62,194,215, 95,253, 3,188,247, 95,255, 91,254,124,117,192,205,192,177,218,241, 61,185, 38, 85,112,219, 76,135, 19,
+121,194, 49,160,234,182,248,205,183,126, 15,191,243,203, 63,199,234,233,179, 56, 2,223,250,242, 63, 49,219, 10, 60,231,134,107,
+184,233,121,207,102,223, 77,207, 98,225,198,103,146,228, 45, 76,187,141,202,166, 99, 91, 80, 0, 82, 66,109,169,215,214,104,101,
+ 48,179,119, 7, 73,162, 72, 59, 59,168,251, 67,140,118, 36,227, 88,143,130,106,109,137,124,126, 15, 73,111, 14, 91, 12, 32, 40,
+146, 78,143,193,165, 11,116,231,230,184,234,232,173,188,237,123, 95,193,199, 55,182,152,215,176,156,102,188,239,248,147, 28,237,
+237,146, 12,243, 21, 77, 28, 46, 66,104,188, 31, 67,180,162,233, 43, 98, 98,131,151, 93,160,141, 82, 85,170,132,139,174, 67,220,
+ 61,149,178,131,110,130,228,187,155, 90,136, 79,206, 69,167,231,184, 47, 36,132,137, 89, 46, 73,193,199,210, 32,111,196,241,222,
+ 32, 82,185, 23,144,154,244, 73, 71,247,168,106, 71, 25,223,202,173,126,204,129,126,254, 11, 12,121, 10, 3,224,228,185,200,228,
+143, 77, 74, 46, 62,249, 54,182,211,197, 0,209,164,251, 88,212,239, 48,249,122, 90,199, 80,171,150, 74,146,178, 17,233,188, 64,
+166,117, 43,145,113,178, 68, 9, 53, 10, 69,162, 12, 36,102,187,117,204,164, 96, 4,232,146,118, 53,102, 42, 37,157,221, 73,123,
+118, 39,170,211,198,116,212,246, 58,123,204, 92,159,128, 90,197,145, 62,169,147,116,209, 24,166,148, 76,188,241, 53, 12,113,175,
+168,252,182,185, 53,184,192,223,126,238, 56,111,250,245, 71,120,240,115, 95,231, 53,119, 29, 34,177,240,247,235,176,254,193,255,
+155,108,255,117,242,181,227,164,238, 26, 79,152,210,252,210,207,255, 26,143,159, 57, 78,122,232, 22,217,247, 58,105, 13, 11,147,
+ 4,155,152, 9,189,210,248,200,108, 80, 17, 22, 51,158,238,253,184,138, 77, 69, 34,221,248,122,160,181, 92, 10,198,197, 48,106,
+236,130, 87,219,255, 60,198,182,148, 78,100,183,171, 53, 42, 53, 40,157,160,149, 35, 52, 35,113,185, 27,131,202, 90,204,127,255,
+ 47,253, 11, 67, 92, 8,245,246,212, 29,148, 76,232, 65, 95, 97,224,115, 87, 40, 18, 86, 14,116, 87, 67,222,149, 14,116, 39,134,
+ 64, 87,143,112,101,129,206, 90,232, 86, 46, 64, 25,219,108,147,240,242, 92,166,228,170,192,213, 69, 92,121, 40, 92,213,224,189,
+195, 53, 2,138, 25, 3,197,109,105,105,202, 74, 76,147,214, 77,126,125,210,202, 49,105,130, 73, 83,188,147,169, 88, 25, 69,210,
+238,136, 19, 62, 81, 36,173, 20,188,199,121,139, 78, 19, 73, 31,132,128,201,115,210, 78, 70,123,118,134,180,211, 22,216, 77,196,
+ 63, 6, 91, 99,203, 18, 87,202, 45,218, 22, 5,174, 42,113,222,161,116, 66, 57,232, 83, 87, 21,182,146,192,182,192,133, 44, 62,
+194,112,154, 81, 9,174,194,214, 21,182, 24,160,108,131,179,150,225,198, 6,231,238,255, 34,155,167,142, 51,184,112,142,193,197,
+ 37,130, 49, 56,235, 25,109,108, 80,174,247,169, 7, 91,248, 70, 28,179,229,102,205,179,223,240,101, 76,147,160,109, 74,104, 52,
+ 9,154,169,150, 97, 42,211,100, 74, 86, 80, 38, 34,150,199, 67,130,137,224,171, 36,147,207, 31,235,174,248,203, 10,193, 52, 82,
+111, 73,140, 52,159, 37,169,244, 79, 40, 35,215, 77,231,133,110,153,106,105, 72,243, 94, 97,155,136,138,213,178,122, 28,163,171,
+125, 84, 86,205, 36,129, 35,111,153, 52,189,226,110,105, 34, 42, 86,203, 80,210,205,132,217,174,180,124,142,180, 82,133,209,138,
+169,174, 98,102, 42, 78,232,137,196, 90,173, 13, 20,165,165, 28, 53, 12,135, 13,163,129, 12, 13,201,216, 48,108,161, 63,242, 20,
+ 67,207,230,166,103,208,247,140,250,158,205, 53,199,198,134,101,115,211,225,157,166, 59,181,139,178, 12,204,206,238,196, 5, 35,
+170,134,141,119, 84,193,254,147, 24, 37, 21,145, 18,170,215,226, 50,108, 2,237, 86,143,178,168,193,149,212,181, 16,186,188,146,
+253,102, 51, 38,232,148, 65, 96, 32, 93, 67,183,179,147,123,223,252,113, 66,216,192,157,253, 2,131, 71, 30,100,254,229,247, 82,
+157, 63,137,125,226, 43,244, 47,175, 51,191,103,134,234,242, 87, 57,246,192, 5, 76,222, 37,187,229, 14, 66,177,132,154, 63, 74,
+249,197, 95,228,137, 47,109,113,121,195,211,255,232, 39,120,219,175,255, 27,102,239,125, 53, 15,253,200,155,248,223, 15, 45,243,
+177, 51, 27,124,224,231,222, 78,181,190,132,202, 90,244, 47,175,210,212, 14,163, 26,102,166, 91,176, 4,105,154, 82,141, 6,100,
+237, 46,173,222, 52,229,168, 1,163,153,222,177,147, 36,171,249,206,187,110,103,126,118,134,147,199, 79,112,245,161, 3, 12,214,
+ 87,105, 59,135,201,107, 48, 34, 75,185,186,142,241,149,132,116,126,142,193,151,190,204,217,119,127,144,227,149,227, 62, 64,237,
+219,133, 94,188,204,237, 63,250, 22,166,223,255, 65, 30,168, 60, 47,186,225, 90, 62,177,120,158,123,158,113, 29,239,250,177, 31,
+164, 77,130,245,125,134,181,167, 51,151,242,228,131,143,160,221,136,219,159,127, 27, 87,223,126, 27,115, 71,174,161,189,176, 19,
+157,183,168, 71, 35,116,154, 96,178, 60,230,130, 29, 73,175,199,240,216,211,236,124,214, 13, 44, 63,117,150, 98,116,150,164, 53,
+ 67,179,181, 38, 49,150,106,132,105,207,163,156,197,149, 3,124,210,166,187,243, 0, 77, 57,160, 26,246,201,123,211, 36,121, 27,
+167,193,214, 13,253,197, 11,188,247, 35,159,224,167, 94,251, 42, 62,254,241,207, 49, 21, 2,247, 45, 95,230, 87,239,185,151, 19,
+143,254, 13,185, 6, 23,205, 98, 54,230,194,205,216,213,108, 2, 76, 38,121,249, 96,108,154, 9,125, 19,111, 37,215, 30,116, 32,
+109,171,120,211,149,137,178,142,178,243, 56, 18,105,146,184,186, 29,179,223,163, 35,126,108,160, 11, 58, 78, 92, 62, 54,194,141,
+ 33,114,209, 52,101, 98,132,200, 54, 50,161, 87,181, 60,172, 58,149,247,226,142,195,134,214, 55, 45, 85, 21, 56, 81,192, 53,103,
+ 29,106,151, 70, 5,201,204,183,186,219,172,115,239,181, 84, 44,186,128,201,229, 66,161, 98,224,216,152,104,206, 49,146,143,183,
+ 58, 76,226,118,227, 66, 7, 98,212, 74, 39,154, 12, 79,102, 20,237,222, 60,157,222, 12,211,105,139, 94,167, 7,171,139,120,183,
+ 14, 9,178, 54,200, 53,173,206, 28, 33,237,224, 66,137, 15, 77,116,126,199,153,216, 74,102, 87,181, 64,213, 49,121,213, 8, 1,
+ 79,155, 49,190, 85, 77,142,125,163,213, 36,138, 22, 38,192, 26,169, 66,125,225,109, 71,120,100,253, 24,239,248,228, 69, 62,252,
+218, 67,124, 50, 79,217,151, 53,188,249,231, 63,195, 63, 60,248,223,185,240,161, 99,114,104, 70,185,242,255,250,253,251,248,219,
+165, 17, 31,248,157, 47,114,250,190,215, 82,159,121, 56, 26,254, 34, 10, 86,171, 24,111, 83, 49,102,167,198,237, 64,242,130, 68,
+ 0,141,138,149,169,202, 36,223,102,202, 11, 99, 72, 78,132,234,248, 24,127,147,252, 56,219,108,117, 47,113,175, 16,119, 60, 65,
+ 75, 20,207,199, 94,120,185, 1, 6, 22,222,240,223,254,217,238,220, 94,113,180, 95,161,181,134,177,118, 18,182, 43,229,198, 55,
+ 33, 65,137, 9, 80,134, 32,221, 11,229, 8,173, 99, 25, 75, 34,151, 10, 95, 85,242,125,155, 68, 98,137, 10, 66, 89,136, 41, 45,
+ 54,179,121,231,226, 58,193, 16,170, 74, 34,132,145,251,238,109, 29,219,181,100,247, 11, 90,242,202, 89,134,181, 37,137, 78,100,
+135,110, 20, 89, 39, 39,239,117, 37,123, 95,139,204,239, 98,134, 52,233,116,101,221, 99, 12, 38, 77, 8,206,145,246,102, 32,120,
+252,152, 71,175,228, 82,228,170, 74, 46, 14,206, 98,135,210, 54,231,106,201,163,215,182, 18,101,175,106,100, 13,149,104, 70,133,
+ 40, 16,198, 64, 57, 44,192, 59,188,183,184, 98, 72, 93, 88,178,222, 20,222,116, 48,137,166,216,184, 76, 93, 13, 73,179, 46,166,
+181, 73,146, 38,164,237, 54,206, 59,194,250, 58, 93,147, 80, 23,107,100,157,150, 92, 32,250,150,231,255,208,151,248,251,247,220,
+138,115, 10,167, 60, 6, 65, 53,155,120, 65, 17,229, 72,161, 18, 47,211,120,144, 73, 91, 79,252, 36, 66, 37,141,253, 57,209,106,
+ 33, 0, 24,163,101,179,146,198,218,111,115, 69, 33,139,148, 10, 6, 76,182,109,228, 13, 49,161, 98, 35,159, 67,112,216, 74,152,
+ 43,118,123, 61,168,227, 10,186,149,203,159,133, 88,246,148,181,228,179,168,149, 73,220, 76,123,137,206,134,184, 46, 51, 89, 66,
+150, 27, 25,128, 52,132, 90, 58,207,203, 26,138,194, 81, 22,194,131,111,181, 33, 73, 99, 76, 50,136,241,109, 88,137,171,125, 88,
+200,159,163,170,161,174, 21, 73, 2, 95,250,194,103,184,229, 57, 47,230,142,231,245, 88,190,188,201,231,254,225,179,168,160,248,
+210,253, 95, 2, 15, 85, 19, 15,245,227,199, 30, 36,224,132,100,165, 99,224,222, 43, 6,163,130,225,166,139, 31,208, 1,231, 53,
+174,145, 60,177, 67,202, 45,170, 81,160,213, 54,216,198,243,214, 55,127, 10,138,115, 40, 10,138,175,127,145,133,187,190, 19, 22,
+ 14,162,142,125,153, 39, 31, 56, 73,113,169,228,236,234, 69, 14,253,224,143,177,232,115,204,200,145,230, 41, 79,255,254,251, 56,
+242, 99,154, 47,253,222, 39, 88, 58, 63,226,218,217,134,231,253,213,239,176,248,151,127,202,255,248,201,119,177,213,155,227, 84,
+ 89,243,244,176,164,117,232, 0,118,216,103, 84,245,177,117,201,204,194, 60, 39,159, 94,228,204,202, 38, 11,237, 4, 92, 73,171,
+211,197, 54, 53,182, 49,152, 76, 83,244, 75,178,169,156, 44,107,177,231,153,215,242,250,235, 15,242,161,191,248, 59, 46,173,173,
+147, 77,245,168,170, 6,109,228, 80,245,182, 65,161, 72, 15,236, 39,251,214, 67,124,241,221,127,206,197,202, 49, 55,157, 49,170,
+ 28,255,230,167,126,152, 63,121,247,251,201, 14,237,225,177,175,222,143,189,241, 8,111,190,237, 6,174, 61,116, 45,223,151, 84,
+236,123,206,173, 44,158, 91, 99,117,112,153, 61, 87, 95,195,233,135, 31,102,125,233, 2,161, 90,231,101,175,124, 9, 87,223,113,
+ 7,211, 87, 63, 3,101,140,168, 27, 73,134,162,166, 25,246,201,103, 23, 68, 98, 43, 11, 2,138,206,222, 61, 84,155, 91,116,102,
+ 59, 84, 91,144,228, 6,103, 83,146, 86, 23, 55,106, 80, 70, 14,183, 68,137,100,220,212, 67, 97, 92,175, 95,166,169, 43,166,119,
+236, 33,233,116,105,250, 91,244,246,237,167,174, 10,222,253,215,159, 68,191,244,133,124,236, 11, 95,231,205,173,140,254,195, 79,
+147,181, 98,237,245, 21,134,172,208,196,143,196,200,100,215,177, 17,205, 36,178,219, 22,185, 42, 76,118, 80, 42,141, 44,139, 56,
+205,103,177, 15,216,123,145,187,196, 77, 44,180, 36,109,226,108,165, 21,169,130,202,199,126,241, 58, 82, 63,199,208, 23,167,176,
+ 73,160,147, 70, 74,148, 2,171,130, 84,160,102,224,106,133,175, 98,141,104, 16,249,206,123,207,237, 47, 50,124,230, 83,150, 38,
+192,169, 99,158,253, 59,226, 52,158, 72,221,107,240,210,249,220, 54, 98, 14,181,196, 82, 6,163, 4, 33, 27, 87, 10,214,136, 58,
+235,107, 41,172,105,188,196, 58,107, 39, 68,197, 36, 13,164, 10,118, 29,188,142,151,188,246,231, 57,120,237, 97,212,234, 34,126,
+184, 33,251,238,188,141, 73, 83,108,146,176,181,121,129, 83,223,252, 63,105, 66,160,170, 22,241,141,194, 82,145,182,164,210, 85,
+ 41, 69,162,181, 72,203, 25,132, 68,190, 47, 67,116,182, 71, 62,127, 80,146,117, 39,254,221, 71,246,186,224, 92, 77, 36,189,201,
+255,183,115, 71,143,153, 84,243,252,157,158,159,254,187,179,124,224,245,215,241, 19, 31,127,154,222,188,226, 29, 47,122, 39,191,
+251,217,223,102,253,163, 31,151, 60,181,130, 87, 62,119, 15,159,248,196, 73,246,183,224, 79,126,225,183,120,253, 75,159, 33, 19,
+241,216,101, 52,238,171,140,234,193,196, 43, 31,188,192,216, 98, 10, 64, 25,164,215,221,185,109,222,251, 63, 71,171, 79, 40,255,
+ 74,190, 7, 32, 4,131,158, 56,227, 19,180, 17,105,222, 68, 71,188,242, 54,114,141, 3,243,223,255, 95, 81,105,190,157, 61, 15,
+225,159, 29,232,209,149, 72,126, 69,231,151,146, 79,222, 73,103,124,132,142, 55,101,124, 0, 28, 85,127,147, 36,154, 62,130,173,
+ 81, 89,142,175, 74,185,204,164, 25, 1, 43,198, 89,231, 8,182,150, 29,102, 99,177, 69, 25,179,255, 1,226,231,137,168, 94,141,
+ 24,215, 76,140,226, 89, 1, 31, 36, 19,204,109, 32,201,114,146, 52,141, 49,118,143, 78, 83,153, 76,139, 2,147,166, 49,227,239,
+ 38,148, 53,239, 28,105,187, 43,151,237, 36, 65, 27,131,173, 44, 58,203, 81,198,224,155, 50,254, 88, 44,174, 22,164,168, 10, 82,
+ 95,109,139, 82,192, 89,155, 3, 92, 85, 97,189,103,106,186, 71, 83,138,103, 72, 57, 71, 57,170,164,178, 54,213,184, 26,134, 91,
+ 5, 83, 51, 93,182,214,251, 36,173, 64,119, 58, 35,244,102,240,206,179,185,178,140,173, 10,102,174,186,138, 93, 7,175, 99,225,
+234, 35, 52,195, 62,235,231,206,147,117, 90, 36,121, 14,222, 99,171,138,245,179,235,188,234, 29, 15,243,225,247, 28,141, 85,186,
+177, 8, 9, 69, 43,141,249,115,194,132,253, 19, 33,231, 18, 43,139, 70,221,178,140,157, 35, 70,238,118, 58, 17, 70,138,214,219,
+184, 1, 29,182, 27,114,165, 57, 49,140, 59,132, 98, 1,139,184, 65,108, 52,252,198,176,131,207,245,233,210, 0, 0, 32, 0, 73,
+ 68, 65, 84,180,225,197,178,166, 60,147,120,111,154, 43,122, 93,104, 79, 41,242, 92,172, 22,206, 10,235, 34,111, 43,166,114, 73,
+ 7,248, 70,104,155,218, 5,186, 61, 67,167,107,196,188,151,200,239, 89, 55,129,225,192,209,196,156,124,203, 64,107,218,144,183,
+ 21,137,150, 4, 76, 89,203,217,219, 12, 3,131,126,196,215, 6,168, 76,144,234,234, 68,241, 93,175,125, 9, 31,254,243,143, 80,
+141,228,242,210,196,213,195,249,211, 23,169,107,177,136, 4, 2, 73, 89, 69,242, 91, 4,202,160, 69,114, 13,193, 82, 21,226, 70,
+214, 65,246, 9,202,199,210,248, 16,205, 10,137,161, 42, 61, 63,247,142,175, 98, 47,157, 32,185,225, 86, 88,254, 22,189,215,191,
+ 19,255,181,143,161,155,139,244,171, 41,206,157,223,160, 92,188,200,212,141,215,114,241, 47,223,199,243, 94,124, 53, 7,110,186,
+ 1,242, 14,197,229, 45,158,252,159,239, 99,243,244, 37,246,229,138,219, 63,243, 69, 62,250,140,219,217,117,207,171, 57,107,218,
+ 84,195,146,129, 74,201,128,131, 55, 62,151,102,109,145,122,109,141,222,194, 78, 46,158, 56,193,163,199, 79,208,206, 18,218, 77,
+ 66,214,234,210,148, 3, 92,200,152,153,221,137,173, 3,199, 31,249, 2, 55,190,236, 59, 41,150, 23,233,206,206,145,183, 90,188,
+241, 13,247,112,234,233, 69, 78,159, 62,195,212, 84,135, 78,187,133, 78, 51,194,204, 52,187, 70, 5, 79,254,248,187, 57, 95, 52,
+220, 50, 55,197,109,135,186,252,167, 83,151,233, 3,159,126,247,251,121,245,139,159,197, 27,223,248, 50,102,247,221,192,176, 40,
+233,111, 12, 41,251,235,204, 28,185,137,147, 15, 29,163,187,208,102,231,193,253, 92, 62,123,158,213,139,103, 88,191,180,196,221,
+175,185,155, 61, 55,220,202,244,213,215,145,244,102,169, 54,214,105,237,216, 73,211, 31, 82,108,110,208,221, 53, 79,221,223, 68,
+ 39, 25,245,214, 22, 73, 59, 39,201, 18,134,203, 43,228,211, 29,234,114, 64,210, 78,209,202, 71, 90, 85, 71,104,112,214, 82, 85,
+ 5,169, 74,208,153, 37,105,101, 76,239, 62, 64, 83, 85,120, 13,126, 52,194, 22, 5,245, 86,159,217, 35, 87, 83, 23, 67,126,255,
+243, 15,240,192,174, 93,156, 93,217,224,229, 42, 33,205, 69,222,206, 35, 67,195,232,128, 79,162,251,217, 73,211,208,184,136,203,
+143,219,199,226, 33,153,152, 88,109, 24,163,109, 70, 65,187, 45,183,211,204,199, 1, 46, 50,213,179,108, 92,150, 34, 80, 26, 21,
+119, 83,130,130,140, 14,214, 49,180, 34,246,187,171,248,112,142, 15, 90, 31, 39,120,165, 21, 73,166, 80,133,244, 14, 36,241, 82,
+146,169,192,252, 46,205, 76, 27, 86,251,112,161, 10, 92, 95,121,138, 41, 21,121,224,210,188,228, 9, 4, 29, 80,120, 57,132,162,
+196,236,226,225,165, 77,196,222, 70,243,152,143, 49,155, 52,198,200, 82,224,246,151,253, 16,175,252,222, 31, 71, 95,120,152,102,
+115,137,230, 91,103,161,221,149, 3, 43, 56,116, 85, 16, 82, 41,242,152,239,236,102,254,117,127,193,153, 19,159,226,252,201,255,
+ 69, 72, 69,190, 11, 62, 16, 50,131, 50,178, 22,208, 38,224, 18,201,213,147, 72,113,131, 28,164,219,165, 97,147,245,176, 15,177,
+ 13, 76, 38,183,177, 68, 63,166,173,121,231,249,183,111,188,133,255,252,254,111,209,235,192,239,254,237,211,252,198, 27,111,230,
+ 63,253,175,135, 89,202,224, 23, 95,251, 11,252,218, 95,255, 17,235, 31,125, 31,222,121,158,121,221,110,118,182, 78, 50, 8,138,
+ 39,206, 91, 84,214,146, 55, 4,227,254, 92, 29, 25,235,102,155, 1,175,174, 44,103,185, 34,114,167,244, 4,250, 2,219,200,220,
+224,213,182,153,109, 12,150, 49,102,187, 98, 53, 18,229, 68, 17, 50,232,116,220,175,173, 64,137,195,123,230,158, 31, 71,119,102,
+255,217, 65, 14, 74,197, 54, 60, 21, 99, 26, 42,222, 16,199, 59, 42,154,237,165,171, 45,227, 13, 82,190,143, 96, 45,205,160,136,
+ 30,184, 10,237, 61,250, 10, 58, 30, 10,124, 53,154,212,211,142, 1, 50,214, 54, 52,195,130, 16, 99,121,226, 61, 24, 95, 92,228,
+ 66,166,244,248,117,113,104, 99, 72,162, 82, 48, 78,213,108,167, 6,100,100, 12, 77,141,115,141,100,199,199,187,230,162,148,250,
+107,239,208, 90,227,154, 18,229, 83,146,212,196,206,120,189,221, 85, 31, 2,182,174,101,231,110,173, 24, 84,235,154, 96,107,154,
+170,162, 41, 42,234,162, 68,107, 69,214, 50, 52,117, 33, 68, 57,239,177,141,197,123,135,247, 30,157,164, 20,195, 17, 73,158, 49,
+ 26, 22, 4, 52,202,246, 49,233, 30, 60,242, 30, 48,237, 12,175, 51,178,108,142, 11,143, 61,204,250,233, 19,132,114, 64,123,207,
+ 1,182,150, 46,178,112,228, 26, 76, 43,199, 57,139, 43, 71,172,157,245,188,225, 39,159,228, 79,223,125, 29,105, 38, 48, 24,117,
+197, 78,220, 24,145,178,157,247,162,156,120, 38, 84,194,170,218,110,123, 36,200, 1,172,181,218, 86, 1,199,124,244, 8, 8,204,
+ 82,185, 12,140,149, 64,252,246,138,106,156, 65,143,220, 38,156,147, 36,142,142,191,206, 71, 48, 86,158, 67,214, 81,180, 59,138,
+110, 75, 62, 63,116, 8,228,153,162,215,213,194,116, 79, 21,229, 48, 48,218,144,182,203, 52,215,164, 45,185,200,121,239,105, 42,
+ 79, 93,138,121, 41,139,221,234, 83, 93, 67,167,165,133, 21, 20,155, 50,141, 23,211,108, 93,201,106,179,140,107,239,224,228, 50,
+161, 85,224,194,217, 21, 90,237, 57, 6, 91,107,226, 9, 10, 2,174,145,202, 93,249, 62, 76, 10, 73, 81, 9,122, 79,167, 50, 49,
+ 57, 43, 22,123,226,100,210,148,145,151, 27,155,178, 18, 45,100, 45, 49,201,122,222,241, 31, 63, 79,122,233, 17, 72,247, 17,150,
+142,161,246,220,206,229, 63,250, 73,230,239,121, 51,229,137,251, 56,247,192, 38, 11,185,226,201,194, 65, 51, 32,243, 21, 43,195,
+192,201, 15,127,142, 23,239,152,167,240,154,103, 61,239, 40,199,191,120,138, 67, 47,188,142, 79,188,236, 21,156,168,115,206,127,
+254, 1,246, 78,117,120,170, 17,248,195, 45,151, 54, 81,131,243,148,253, 62,197,214, 22, 91,253, 45,106,231, 73, 84,206,226, 86,
+193,205,251,103,105,202,130,180,213,193,110, 13,113,182, 97,184,126,153,195,207,184,153,188, 59,197, 96,169,161,179,107, 31,245,
+214, 58,249,158,221, 60,239,166, 27,121,230, 90,197,218,137,199, 56,246,244, 25, 46,158, 91,228,192, 31,125,148,143,172, 13,152,
+ 55,176, 59, 55,252, 98, 89,179,126,182,226,157,183, 93,195, 61,223,255,106, 14,220,250, 2,150,143, 61,196,220,245,207, 98,115,
+109, 64, 85, 59,202,114,200,204,129,195,172, 46, 46, 98, 90,154,238,244, 14,202, 81,201,242,241,167, 72,155,134,151,190,226,133,
+236,191,229,118,166, 14, 31, 37,153,153,167, 90, 89,166,181,123, 47,213,202, 42,213, 96,200,212,174, 5,202,173, 1,157, 29, 11,
+244, 47, 46,209, 20,125,166, 15,236,143,141, 83,176,118,226, 56, 83,123,246,144,180, 51, 70, 43, 5, 73,171, 34,168, 60, 22, 64,
+ 56,210,124, 22,103, 43,130,171,105, 74, 23, 15,224, 64,185,114, 9,211,233,145, 78,117,168,215, 55, 40, 55, 55, 72,123, 61,108,
+ 83,241,245,203,151,185,247,192, 62,190,114,225, 20,102,110,140, 98,221, 54,180,201, 52,173, 38,229, 91, 99,138,224,120,127, 69,
+244, 94,140,119,167, 70, 9,152, 33,137, 38,148, 73, 14,212, 8,166, 53, 77, 35, 97, 78,111,155,188, 26, 63,110, 54,146,168,153,
+247,219, 53,134, 42,129,212, 51,233,231,246, 94,162, 30, 10,137,145, 36, 65, 80,176, 58,145,137,199,228,177,226,194,105,130,243,
+220,124,171,225,254, 47, 57, 86, 45,156,125,194,179,243,182, 4,221, 86, 36, 65,154,142,146,200, 19, 31,197, 41, 92,101,177, 88,
+198,130, 73,164, 29, 9, 19, 72, 81, 20,209, 60,235,141, 38,113,142, 59,238,249, 9,238,249,158, 55, 18,150,142,227, 31,255,130,
+124, 16,134,184, 20,171, 7, 34,193, 26, 37, 45,133,237,120,240, 52, 53, 6,205,225,125, 47,225,208, 51,222,202, 55, 62,243, 3,
+148,197, 50, 73, 42,101, 53, 33, 26, 79, 67,252, 80, 11,122,188,175,142,238,124, 37, 23,107,167,182,217,235,168,168,152,196, 49,
+ 69,206, 65, 61, 57,116,116,112,124,228,147, 79,176,191,151, 80,244, 45,223,104,224,121,159, 63,198, 61,183, 44,240,247,143,173,
+114,223,186,227, 63,188,246,109,252,234,187,222,194,232,241,227, 56, 20,207,158,111,241,217,149,146,203,193,161,146,156,208, 52,
+ 66,114, 51,250, 74,158,138, 76,206, 90, 77,154,217, 38, 25,250,176,205,171,143,187,140, 43, 38,117, 53,105,136, 83, 99,234,107,
+ 60,136, 38,229, 46, 17,231,170,146,100, 12,149,141,189,228,134,224, 60,237,231,188,154,116,223,209,127, 65,110, 87,255,172, 98,
+246,219, 90,214,130,142, 19,122,172,238,243, 77, 52,227, 65,112, 66,145,243,214,226,198,220,209,104,134,243, 74,176,157, 62, 68,
+201, 41, 42, 8, 42, 74,232, 62,196,184, 43,110, 18,215, 15, 77, 13, 73,130,117, 78,154,219,140,222, 30, 7,149,198, 43,217,165,
+251, 70,246,238,184, 32, 62, 18, 87, 76,154,238,148, 50, 36,121, 75, 50,253,182,193, 58,185,240,248,166, 34,155,234, 17,172, 24,
+239,210,172, 37, 82,124,154,225,202, 34, 18, 3,165,134, 51, 77,115,138, 81, 33, 81,195, 68,190, 94, 81,213, 40,173,169,155, 70,
+ 48,164,222,209,233,204,179,181,188, 66,171,219,161,238,247,197, 48,103, 45, 42, 81, 84,181,228,164,141,115, 4,101,104,154, 17,
+173, 36,101,109,105,149,206,252, 2, 89,119,134,133, 35,207,228,194, 99, 15,114,242,107,247, 97,171, 62,221,233, 89,118,223,120,
+ 51,197,250, 58,221, 29,251, 81,105, 70,218,105,211, 50, 9,214, 90, 6,203,107,108, 45,101,252,224, 79, 30,227, 67,127,116, 29,
+218, 10, 45,210, 7, 37, 83,167,151,203,125, 99,161,113,242,126, 72, 76, 60,112,195,152,215, 30, 97, 79, 42, 18,146,163,169, 77,
+238,134,177,191,196,200, 75, 62,238, 42,137, 96,196, 73,116,118, 12,205,170, 43,249, 90,206, 49,137,163,134, 40, 70,101,169, 34,
+203, 36,253,149,183,199, 37, 84, 82,118,214,238,106,166, 58, 26,147, 40,178, 84,250,209,117, 15, 76,166,232,116,117,140,223,130,
+ 87, 90,248,252,113,149,105,180,162,219,214,116, 59,137, 56,247,189, 39, 53,154, 38, 56,188,149,194,171,178,146,201,222, 85, 97,
+194,175, 47,134, 66,103,221,183,235, 16,251, 95,125, 13, 69, 37,164, 66, 13,252,233, 7,254, 76,158,203, 16, 34,254, 26,146,225,
+150, 44,241, 91,221, 64,226, 21, 69, 21,198,151, 88,185, 60, 58,121,184, 76,156,210, 74, 23, 72,219,144,182,224, 7,126,244,127,
+176,239,224,126, 54, 62,253, 53,124,181, 66,239,230, 27, 73,221, 38,121,190,139,100,215,126,190,254,203,159,231,234, 91, 14,177,
+120,205, 81, 70,143, 46,242,194,223,252, 37,126,229,214,215,177,235,250, 67, 60,227,232, 85,172, 28,127,154, 60,235,208,186,233,
+ 89, 76, 61,103,137, 47,127,233, 81,158,238, 43, 92,221, 48, 55,211,195,245, 50,190,114,108,145,231,236,152,161, 59,157,147,237,
+ 56, 64, 58,186,192,202,133,199,164,207,253,242, 34, 89,203, 48,213,202, 56,180, 48, 29,107, 99, 29, 58,213, 40,147, 97,146,148,
+164,213, 34,216,138,188, 55,207,104,125,139,116,170,203,242,241,199,217,255,204, 91,184,124,234,107,220,240,221,175, 97,223,133,
+ 75, 84,131,130,206,207,255, 20,207,124,226, 4,201, 76, 78, 50, 61,203,155,106, 75,107, 97,129,193, 96,196,210,177,227,156, 59,
+241, 20,179,123,118,161,242, 28,107, 55, 81, 73, 70,103,122, 39, 43,231,207,146,181, 82,230,246,236,166, 28, 14, 88, 58,113,156,
+133,133, 54,187,111, 61,204,145, 59,239,166,117,240, 40,186,213,194, 14, 70, 56, 91, 99, 71, 91,100,243,243, 84,155,155,162, 33,
+105,216, 90,188, 72, 83,150, 12, 23, 87,233,238,152,197,228, 93,121, 32,122, 59, 40, 55, 54,233, 44,204, 98,178, 22,213, 96,141,
+180, 21, 72, 58,179, 20,163,138, 52, 53,212,253,117, 76,103, 6,109, 45, 38, 49,242, 48,229, 45, 66,204,114, 36, 83, 93,217, 79,
+ 90, 71,146,229, 52,117,201, 95,156, 58,201,239, 79,237,156,236,142,148,151,134, 36,231,182,153, 36,232,109,148,107, 98,174, 88,
+ 77,134,111,223, 57,137, 92, 25, 98, 64, 59, 86, 14, 26,249,159,217,248, 13, 30,165,180,128, 60, 72, 62,182,168, 69, 42,231,132,
+195, 60,102,152,140, 37,182, 36, 85, 19,160, 4, 42,238,189,188, 48,143, 67,236, 42,110,130,228, 67,147, 76, 81, 13, 3, 59,246,
+ 41, 82, 3,149,131,203, 91,176, 43,139,223, 71, 84,156, 18,195,196,164, 34, 7,139,112,253, 85,144,107,125, 80, 1, 85,202, 65,
+222,210, 30,139, 71, 39,109,222,250, 31, 63,206, 44,151,112, 79,252, 19,164, 25,206,122,124, 83,196,201, 69, 30, 22,145,195, 19,
+ 92, 51, 64, 85, 67, 89,181,196, 0,174,246, 53,106,180,201,109,119,253, 15, 78, 60,244,126, 86, 46,124, 82,234,196,147,152, 65,
+199,160,146, 22,215,223,249,243,212,126, 68,189,120,138,102,241, 12,195,111,125,115, 34,193,143, 93,215,202,203,109,106,242,218,
+ 92,209,129,174, 18, 8, 62,225,193,197,134, 37, 7,123,115, 56,144,194,239, 94, 40,249,247,121,194,238,174,166,223,120,238, 91,
+181,252,222,111,252,127,188,243, 63,191,141,226,241,175,241,195, 47, 62,196,103, 63,124,140,229,149, 13, 76,166,104, 10,143, 78,
+146,137,180,174, 99, 46, 92, 77,250,221,245, 21,241,181, 49,240, 69, 79, 14,106, 53, 30,163, 98,138,102, 27,132,176, 29,187, 83,
+ 19,117, 92,161,243, 25, 57,224, 93, 33,184, 85, 98,219,154,115,180,174,189,141,169,155, 95,142,143,113,184,111,143,174,197,184,
+ 95, 24, 23,251,142,165,141,184, 91,247,110,187, 70, 85,169,152, 52,105,226,196,220, 96,155, 42,254,121,149,144,215,162, 14,235,
+ 3,184,200, 2, 85, 74,163,241,248,218, 99,235,134,166, 28, 97,178,150,236,205,189, 19, 71,121,108,171, 67,107,124, 85, 16,210,
+ 20,227, 77,116,250,139,212,236,106, 41,137,177,214, 10, 15, 28, 19,223,247,114, 25, 51,169,198, 86, 37,137,110, 75,171,154, 70,
+ 90,219, 8,216,209, 96, 82, 58,163,131, 69,167, 61,225,194,107, 8,190,217,230, 10, 16, 68,146, 55,154,208,136, 26, 81,151,141,
+112, 24,210, 12,215, 4, 18,163, 37,103,221,202,169,171, 90,126, 44, 90,163,242,148, 4,205,104,176, 69,146, 38,226, 51,178, 13,
+105,167,203, 96, 80,162,178,134,144,228, 4,147,176,244,212,195, 4,223,144, 79,119,241, 3,135,205,166,216, 88, 60,143, 27,149,
+156,122,236,113,246, 94,115, 45,123,174, 63,202,212,158, 93, 36,105, 74,103,126, 26,215, 56,154, 17,188,249,109,199,249,224,123,
+174, 35, 4,197,104,232,240, 45, 38,211,185,119, 16, 74,185, 77,215,245,182,154, 71,172, 5,103,172,224, 53, 1, 59,254,172,106,
+ 34,130, 32,139,159, 79,201,216, 29,175, 36,170, 23, 87,124,147,172,120,196, 71,123, 55,238, 87,152,244, 29,201, 68, 62, 30,100,
+198,245,169,137,162,221,150,164, 74,158, 41,242,220,144,231,129, 68, 43, 92, 18, 83, 48,109,141, 74,197,167, 98, 98, 19, 38, 90,
+209,238,106,156,149, 76,123,158, 8,114,217, 68,242, 91, 81, 53, 56,171,168,155,192, 96, 8,195, 81,116,228,199, 20,209, 56, 69,
+ 89, 55,129,255,249, 63,255, 4,109,100,119,158, 68, 80,149,142, 97,144, 36,141,143,150, 6, 61, 24,200, 77,160, 46, 53,163, 81,
+160, 30, 41,170,161,196,143,196,198, 47,205, 89,120,105, 63,218,185, 71, 72, 67, 47,123,213,143,112,235, 29,111, 34,172, 29,195,
+109,110,113,246, 27, 15, 74,140,103,176,193,204,235,223,192,197,247,252, 28,189,217, 89,170,141, 11,116,253, 58,223,255,179,111,
+229,255,121,197, 15, 51,154,155,227,241,229,130, 37,223,194, 45, 92,205, 85,247,190,146,165, 47,127,131, 39,191,121,146, 77,159,
+178, 82,212,156, 24, 20, 60,188, 82,242,199, 15,157,230,109, 71,119,243,179,183,238,229, 25,251,118,224, 71, 35, 76,222, 65,249,
+148,102,107,133,189, 87, 93, 77, 43,209,204,228, 9, 47,120,198, 33, 6,253, 45, 65, 19,118,167, 8,214,146,117,102, 98,195, 18,
+152,188, 77, 49,232, 99,140,102,255,179,158,207,168, 95, 96,218, 45, 6,235,107, 20,163,146,166,217,128,164,131,106, 43,102,246,
+ 31,193,168,156,129,202,185,112,122,145,162,168,112,102,138,222,252, 2,105,119, 71, 44,165,111, 24,108,141, 24,110,174,114,241,
+177, 19, 28,186,238, 0,101,229,185,124,234, 36,135, 15,239,230,250,231,191,136,107, 94,250,157,180,246, 93, 43,123, 50,147,177,
+121,246, 28, 58, 75, 73,102,246,176,246,248, 19,180,119, 46, 80,172,173, 74, 23,179,247, 12, 47,175, 49,189,111,129,203, 79, 29,
+167,220, 92,163,216, 88, 37,237,165, 20,107, 67,236, 96,157,238,142, 30,206,181,113,205,128,128, 33, 56, 69,103,215, 30,218, 11,
+ 7,169,215, 46,115,249,169,135, 88, 59,119, 18,149,180,164, 66,179, 41,240,206, 98, 76, 6,105,142, 45,227,237, 93, 39,180, 84,
+202,207, 44,159, 37, 36, 81,222,201,100,101,153,102,226, 32,205,243,237, 28,104,222,138, 12,248,200,108, 55,122,108, 28,145,253,
+123, 24,163, 91,237,118,237,234,184,150,215, 24,137,167, 37,241,220,171, 27,145,156,172,133, 81,225, 9, 74,240,142, 4,113, 86,
+ 71,229,149, 86, 14,157,182, 60, 40,237,232,118,199, 68,188,107, 44,140,209, 70, 28,235, 89,166,162, 39, 4, 76,170, 33,211,116,
+219,242, 48,172, 54, 72,100, 38, 17,249, 44, 49, 74,242,223, 78,204,104, 58, 64,158,233,232,118,151, 67, 66, 43, 69,146, 24, 34,
+161,150,155,159,247,131,252,204,175,124,156,153,141,135,176, 75, 23,176,214,209,244, 55,104,250,171,216,162,194, 15,251,132,152,
+ 57, 38,120,194,112, 83,178,193,117,137, 27,108,224,134,171,216,205,203, 52, 75,103,113,203,103, 9,139, 79,113,205,209,215,115,
+221,115,127, 11,221,120,180, 5, 26, 5,214,113,205,181,111,199,246,251,164,170,199,212,141,175, 96,199,119,253, 59, 14,252,194,
+ 31,162,210,100, 34,229,106, 37, 53,118, 99,159, 90,184,226,147, 78, 46, 41,114,248,254,192, 75,175,162,147,192,226, 8,134,241,
+112,255,227,115, 3,246,105, 67, 10, 44,100,240,231,199,134,124,254, 79, 62,132,233, 76, 51, 53,211, 99,198,192, 82, 31,216,185,
+ 35,178,224, 99,188, 45,102,211,199,184, 83, 49,195,233, 8,139,245,219, 45, 50, 99,103, 83, 36,209, 4, 47,178,178, 23,119,163,
+ 28,158,113,242,159, 68,220,140,200,149, 58,159,198,116, 22, 80, 38,137, 46,120,153,215,147,157,135,232,189,248, 45,219,209,185,
+ 43,136,113,219,179,121, 29, 15,240, 38,122, 0,212, 54,250,117, 92, 53, 23,164, 82,203,149, 37,161, 41,113,182,194,150,101,156,
+184,197,222, 28,156,196,207,130,146,245,150, 78, 82,233, 64,247, 50, 48,160,163,201, 79,169,184, 87, 23,199,184,196, 4, 29, 42,
+145,242, 14,211,106,139, 47, 32, 32, 84,202, 88,190, 29,156, 37, 24, 81, 32, 2, 96,203,146,162, 63,144,174,245,184,138,208, 99,
+198,169,146,229,111,136,113, 63, 41,131, 73,176,229,136,164, 59,141,175, 75,180, 54,130, 14,214,137,112,234,189,167, 25, 13,164,
+ 28,196, 57,156,119, 84,197, 8, 91,187, 8,252, 25,167, 12, 50,170,225, 8,111, 61, 78, 69,182,184,243,104, 99, 24, 12, 7,164,
+121,134, 49, 10,147, 27,188,171,241,117,133,233,182, 9, 73,198,197, 39, 30,101,229,244, 49,116,171, 69,107,126,129,249, 67, 87,
+177,112,248, 58,218,221, 30,197,218, 18,143, 62,244, 13, 78, 63,246, 16,107, 23,206,176,113,238, 20, 27,103,207, 64, 8,116,230,
+230,232,237,217, 67,181,181, 73,214,158,229, 95,253,228, 73, 10,159, 80, 27, 65,113, 43,179,141, 44,150, 34,169,109, 84,181,109,
+228, 98, 57,254,220,241,209,172,235, 99, 93,170,115,219,117,168,227,238, 18,233, 37,146,127,175,169, 67,252,107,220,213,190,237,
+ 33, 26, 31,162, 19,117, 72,143, 43,141, 5, 36, 99,162, 66,157,154,104,148, 51,144,166, 65, 94,159, 84,250,211,179,142,162,219,
+ 19,154,156,214,210,226,230,172,199, 36,134, 78, 59,165,221, 50,100,169, 38,205,140,164, 38,130, 20,160, 5, 23,168, 11,207,214,
+ 86,160, 42, 34,228,202,110, 11, 79,227,203,134,183, 80, 70,140,119,154, 68,106,161, 21,212,172, 15, 33, 38, 65, 3, 85, 21,208,
+245, 80,178,124,213, 8,170,129,194,149, 10, 59,146,191,154, 38,106, 28,113, 74,218,189,123, 39,187,118,238, 97,118,110,154,215,
+188,233,183,176,253,199, 8,143,124,150,108,166, 75,119,255, 85, 44,223,255, 5,137,131,176,131,222, 85,251,112,157, 29, 44,149,
+123,185,238,237,111,228,233,207,125,129,229,149, 33,155, 94,179, 84,212, 44, 94, 94,231,232, 59,126,137,211,247,127,131,211,223,
+ 60,193,165,149, 13,212,230,144,205,202,115,243,174, 89,102, 58,109,190,242,219,239,224,251,238,190,133, 71, 31, 58,201,140,171,
+112,202, 80,108,174,227, 29,204,239,221,203,226,233,147,220,112,221, 33,246,206,204,113,248,240, 62,218, 51, 61,105,204, 73, 12,
+206, 54, 12,214, 47,137,219, 41, 70,119, 58,211, 11,180,122, 61,234,122,192,218,226, 34,115,251,118,179,181,186, 33,178,249,158,
+ 3, 12, 86,214,232,236, 62, 72,227, 36,243, 91,148, 5, 42,203,200,102,230,201,186, 25,214,167,108,174,109, 81, 12,134,232, 52,
+ 37, 81,150,186,134,169,217, 22, 13,134,229,167, 30,229,134,231,220,192,129,103,221,204,194,245,215,144,237, 62,132,158,154,130,
+ 36,163, 90, 94, 70,249,130,214,222, 35, 12,207, 60, 77,119,247, 60,253,165,139,116, 22,230, 25,174,172, 73,143,120,150,114,249,
+212, 57,252,168,100,245,233,147,108, 46,158,166,169, 70,168,182,162,218,170, 25,109,173,146,166, 26, 91,105,108,177, 76,210, 89,
+ 96,253,228, 19,212, 91,203,180,230,230, 56,120,251, 75,233,204,204,179,121,225,164,100, 89,131,162,236,111, 81, 55, 53,190, 46,
+ 48,121, 78, 93, 22, 40,109,240,193,209,233,205,242,170,239,253, 25,201,116,198,202, 63,157,196,195, 59,153, 48, 64,136,145,235,
+201,132, 62, 46, 79, 72, 98,125,170, 74, 4,181, 56,110,113, 51,169, 28,144, 89,174, 72,218, 10,157,171,137,103, 74,105, 97,247,
+ 57, 27,235, 18, 35,253, 33,104, 53,201,185,155,100, 60,165, 11, 29, 42,207,132,202,228, 35,237,169,172, 61, 77,228,244,143,123,
+217,199,224, 21,157,200, 67,117,228,160, 60,140,125, 15,106, 61,200, 37,199,139,100,109,188,162,109, 12,218, 75,213,176,142, 93,
+238, 74, 73, 9,133, 73, 4,198, 98, 8, 60,227,142,159,230,174,187,191,151,240,212, 87,176,131, 77,108, 57,196,217, 82,192, 34,
+ 85, 65,104, 10,233, 5, 40,183, 8,222, 18,219, 81, 9, 85,131, 43,135,212, 91, 43,212,171,107, 84,203,139, 56,223, 80,157, 63,
+134,187,120, 26,127,230, 17,230,167,122, 92,123,199, 31, 96,106,135,169, 29,211,179,183,224, 75, 69,240, 37, 94, 41,170,167, 31,
+160,124,236, 51,152,206, 62, 14,254,230,103,105,221,120,135, 76,227,248, 73,130, 64,212,240,232, 71, 80, 97,242,122, 66,224,232,
+161, 29, 28,157,203,216,244,112,215,188,240,196,119,165,240,224, 80,242,200,179, 26,110,154,133, 95,255,220, 69,118,222,126, 11,
+173, 78,139,110,166, 73,123,138,223,250,149, 15,202, 89, 56,238,103,143,209, 64,117,133,148, 62, 62,200, 39, 53,177, 38,146,224,
+162,236,172, 98,191,184, 50, 18, 75,187,210, 52, 55,169, 37,141, 95, 39,248,128, 43,150,177,195, 37,188,173,163, 97,206,160,210,
+ 14,179,223,253,206, 43,170, 83,249, 54,115,156,236,209, 93, 36,252, 68,183,229, 21,147,252,228, 80,151,246, 14, 92,211,224,234,
+ 10,103, 27,236,104, 68, 83, 21,226,182,111,106, 49,170,122, 31, 65, 57, 78,128, 45,209,240,102,109,141, 43, 43,201,144, 91,217,
+207,187,186,150, 60, 59, 74,170,112, 3, 17,233, 41, 95, 31, 45, 9, 0,193,154, 54,210,129,237, 60,182,172,112, 78,254,187,143,
+ 80, 27,111,173,224, 92, 91, 29,249, 99,155,120,154, 25, 77,210,238,160, 77, 34,127,142,170, 36,157,234,226,155, 82, 26,224,226,
+ 26, 65,141, 3,214,193, 99, 7, 5,222, 90,225,245, 55, 13,213,230, 16, 29, 2,202, 5,234,202,146,229, 57, 65, 67, 93, 54,241,
+107, 54,114, 40, 26, 69, 89,148, 88,103, 41,183, 6, 36, 89, 34,253,221, 74,177,177,182, 65,127,125,133,209,250, 26, 23,207,157,
+ 33,239, 45, 80,141, 10,138,245, 21,234,209, 0,103, 71,108,156,126,156,181, 11, 23,217,218, 92,167, 53, 53,197,204,158,189,180,
+231,231,153, 61,116, 8,101, 12,182,174,168,182,250,232, 36,161, 30, 85,224, 19,126,226, 63, 92,164,213,157,149, 11, 57,146,166,
+ 26,179, 42,136,165, 70, 62, 74,230,206,199,234,239, 56,136,140,255,185,155,168,128, 19,100, 67,140,160,137, 95,193,196, 0, 68,
+237,226,196,191,125,191,155,228,219,253,132, 91, 17, 89, 53, 99, 37, 82, 9, 92,166,213, 18,169,189,219, 17,192,154,209,219,160,
+195, 44, 19,112,149,191, 2,180, 28, 8,104,163,201,115, 67, 18, 63,191,148,150,181,141,179, 30,219,120,234,218, 83, 85,158,245,
+ 45, 47, 77,145, 74,190,142,242,219, 7,251,248,153, 75, 51,152,155,155,229,245,223,251, 90,222,248,134, 31,228,222,239,122, 45,
+211,211,179, 2, 7,243,241,210, 50, 6, 39,186, 70, 83, 85,176,185, 5,131, 1, 52,141,162,169, 20,161, 84, 36, 78,145,122, 69,
+ 18,196,124,211,223, 88,231,252,169,147,252,204, 47,255, 13,132, 53,154, 79,253,191,232,171,110, 98,243,159, 62, 41, 93,176,209,
+129,105,186,135, 41, 23, 79, 66,154,115,253,205, 7, 89,127,248, 97, 92, 93,243,239,239,251, 34,139, 27, 67,214,234,154,207, 63,
+116, 2,197, 20,166, 41, 57,120,221, 1,172, 54,220,191, 82,242,123,239,124, 37,126,115,147, 59,205, 22,203,159,255, 12,155,231,
+206,113,235,141,251,249,186,215,164,182,194,164, 57, 62,139,153,191, 90, 49, 55,191,139, 29, 51, 93,166,166,218,100, 83,179,148,
+163, 1, 73,146, 98,235,154,249,189, 7,169, 70, 91, 56,103, 73,242, 54,193,104,146, 86, 27,103, 29,157,118, 78,111,223, 65,134,
+203, 43, 76, 45, 28,192, 55,150,114,216,167, 42, 6,216,186,100,184,186, 70,162, 53,115, 7,175, 98,249,244, 57,242,169,105, 26,
+ 11,237,110,134,173, 45, 73,106,208,173, 30,235, 23, 46,112,244,249,215,210, 63,127,129, 3, 87,237, 98,215, 53, 55,209,217,181,
+139,214,158,171,208, 89, 11, 84, 66,168,106,134, 75,151,152,127,246, 29, 44,125,249, 75,116,119,238,100,241,177, 39,232,238,156,
+193,121,133, 43, 43, 86, 78,159, 99,216, 95, 39,159,202,241, 90, 97,171,138, 80, 90, 92, 53,130,166,226,220, 19,143,208, 20, 91,
+ 4, 45, 31, 76,195,229,203,120,187, 65,107,102, 7,222, 5,182, 46,156, 37,232, 4, 76, 78, 61,216,148, 10,191, 86,139, 44,239,
+162,179, 22, 1, 69, 83,148,228,237,142, 32,129,147, 4,219, 52,188,238,135,126, 89,164,170, 40,181,143, 33, 66, 4,200, 19,201,
+105,130, 76,238,201, 54, 34, 92, 46, 2,145,171,236, 98,127,177, 54,113,194,137, 3,147, 31,231, 77,195,182,201,206, 55,114,235,
+246,241, 97,156,124, 78,251,109, 85, 54, 49, 76, 32, 51,114,187,141,187,123, 45,183, 84,145, 50,253,182,177, 37,246,114,168,232,
+ 67,208, 41,236,186, 46,161, 21, 91,151, 86, 47, 5, 92, 51,150, 45,229,198, 77,144,120,166, 74,228, 64,212,136,171,125,130,116,
+209,138,219, 95,246,123, 60,231,217,207,195,159,121,140,166,182, 52,195, 18,183,185,130, 27, 20,184, 66, 84, 16,223, 52,132,186,
+148,104, 84, 83,224,135,107,132,122,128, 31,173,203, 5,160,232, 99,203, 13,170,205, 21,134,143,124,133,226,242, 37,134,103, 30,
+167,185,124, 30,123,230, 81,122,186,230,224,115,127, 15,106,207,174,249,239,198,214, 37, 1,141,219,188, 68,125,236,126,234,167,
+238,163,248,236,239, 16, 46, 63,202,174, 31,249, 47,244,238,121,203,228, 18, 36,147,113, 68,176,106, 45, 50,127,162,162,194,173,
+177, 42,240,182,215, 60,139,131, 93,197, 71, 46, 85,220,212, 78,112, 30, 14,181, 96, 65,195,238, 92,148, 8,151,195,131,239,251,
+ 11,118,191,252, 22,234,161, 39,247,129,191, 63, 61,100,107,121, 53,106,148,126, 66,136,155, 20,174,168,113,168, 88,111, 87,162,
+142, 75, 78, 98,102, 61,140, 49,182,225, 10, 74,221,184, 12,197, 95, 81, 52,163, 20, 42,203, 81, 8,218, 80,167, 9, 42,107,163,
+ 76,194,220, 27,254,235,191,152,202,183,101,119, 27,221, 79,181,132,142,175, 36,136, 16,119, 74, 46,214, 15, 90,129,180,184, 98,
+132, 45, 70, 52,163, 82,140,103, 72, 27,163,171, 43,188,179,132,186, 17,117, 97, 92,183,218,148,248,218,226,138, 42, 78, 76, 86,
+ 86, 72,241,160,111,170, 10, 91,215,232, 84, 99,178,244,138,170, 66,201,236,155, 52,145, 85, 73,144,114,168,224, 3,206, 71,215,
+124, 93,225,227, 78,203,141, 31,130,200,203, 87, 17,176,227,108, 45, 90,113,240,248,224,132,107,145,102,148, 91,253,137, 73, 12,
+109,228, 34, 20,215, 47,182,150,150,174,180,149, 83, 14, 6,212,117, 77, 8, 37,163,193, 72, 10, 67, 92, 77,177, 53,160,169,107,
+202,162,162, 41, 10,154,170,164, 26,108, 82,110, 14,229,107, 56, 79,127, 48,146,131,210,180, 72,167,218,108,172, 15, 56,123,226,
+ 24, 54, 24,150,207,157,100,184,186,136, 81, 13,182,222,164,101, 2,169, 47, 24, 85, 21, 83,115,123,217,113,224, 8, 58, 73, 25,
+173,111,176,122,226, 56, 43,199,143,115,233,161,135, 56,249,153,143,177,113,234, 24,174,182,108, 45, 46,178,124,226, 56, 63,250,
+246, 39,185,238,250,123,177, 74, 38,107, 33, 69, 70,143, 23, 34, 55, 55,177,167,188,137,101, 45, 89, 22,239,106,113,125, 23,133,
+ 16,154, 42,160,116, 28, 24, 98,235,160,181,210,196,214, 52, 49,240, 80,199,152,155, 17,105,125,156, 65, 87,241,239,214,201, 90,
+ 79, 7, 49, 1,231, 45, 77,158,137, 4,159,166, 74,178,231,209,119,166, 9,210,117,129, 64,156,172, 11, 88, 43, 43, 15, 99, 20,
+153,145,175,129,145, 88,237,112,104, 25, 13, 27,138, 65,195,104,228,104,154, 64,183, 5,211, 83,138, 78, 75,186, 45,210, 36, 76,
+252, 43,198, 68, 22,150,133,239,184,231,229,124,245,129, 47,243,231,255,235,207,120,224,129, 7,120,233, 75, 94, 46, 9, 1, 27,
+136,188, 34,130,135, 4,167,112, 94,246, 14, 74, 41,172, 14,100, 70,145,101,122,130,145, 76,140,162,165, 19, 84, 89,115,203, 93,
+175,100,126,247, 53,156,127,247,219,217,113,244,106, 86,255,225, 19,236,124,213,171, 88,121,106,149, 19,159,254, 42, 11,175,253,
+ 1,216,122,130, 29,111,252, 25,248,236, 55,249,218, 95,125,145, 67,175,126, 1,173,253,251,120,240,111, 63,134,221,216,162,233,
+118,168, 19, 8,163, 19,236,191,231,110, 62,246, 43,127,200,170,243,188,251, 93,111, 38,153, 81,156,169, 19,158,218, 80,180,251,
+203, 28, 91,222,164,212,134,155,231,102,160, 61,205,112,237, 20,213, 96,157,233,217,221,244, 55, 87,216,181,119, 39,215, 94,181,
+ 7,133, 39,203,115,210,212,160,179, 14,205,214, 50,105, 43, 35,109,181, 32, 24,146, 84,147,119,218,168,164, 69,176, 57,189,107,
+ 14, 83,172, 13,104, 79,247, 40, 7,235,116, 23,118, 83,142, 2,105, 18,232,206,207, 97,203,128,201, 52,107,139,103,105, 79,119,
+ 88,191,124,145, 60, 77,241,180, 25,246,215, 9, 86,209, 20, 67,166,122,134,206,236, 46,102,231, 58,236,124,214, 77,212, 13,100,
+179,179,177,209,169, 69,168, 75,138,213, 21,102,174, 61,204,230,201, 19,204, 93,123,152,213,179,231, 73,117, 67,190,235, 8,231,
+239,255, 34,105,110,176, 85, 77,111, 71, 15,215,120,234,194, 50,220, 28, 82,109,173, 80,187,134,218,167,100, 89,155,102, 88, 82,
+108,109,160, 76,142,171,106, 2,107,244,215,135,164, 89,155,170,172,184,244,200, 87,153,222,123, 21,249,204, 46,202,173, 45,218,
+ 89,142, 43,134, 36, 65,170, 91, 77,158, 99,109, 77,127,105, 13,141, 99,106,239, 94,140,201,184,237,206,215,243,149, 47,124, 4,
+199, 21, 25,114, 7, 73, 30, 61, 62,106, 98, 80, 70,197, 72,114, 26,129, 52,227,156, 40, 65,164,245,186, 22, 7,102,150,201,164,
+ 60, 62,204, 85,116,176, 54,245,182, 76,159,197,232,138,201,133, 80,167,157,252,230,117, 9,173,116,156, 51,149, 93,121,154, 9,
+ 67,193,185, 64,170, 21,141, 11, 84, 54,200,141, 89, 11, 71, 65,155,136,164, 13,129, 44,147,201, 59, 79,225,204,229,192,156, 82,
+152,212,147, 68, 86,179,119,226, 33, 48,169, 84, 61,170, 36,110, 98,227,180,249,220, 23,253, 6, 87,237,217,133, 59,245, 4,110,
+ 52,164,174,170,104, 28,107, 8, 20,242, 33,221, 88, 84,171,133, 81, 38,210,214, 32,232, 20,191,177,142,171, 11,188,243, 52,155,
+155,216,193, 8,156,151,194,164, 44,199,110,100,212,155, 27,116,182,214, 81,104,166, 15, 31,197,223,242,159,169, 7,139, 52, 43,
+125,212,220, 60,118,241,105,108, 83,145,237, 62,140,173, 43,138,207,255, 33,249, 13, 47, 98,246,158,215,145,236,188,154,245, 15,
+191,139, 48,222, 73, 71,180,179, 48,221, 5, 51,139, 14, 24,165, 8,214,243,171,111,188,149,255,244,231,223,226,161,129,101, 46,
+129, 22,176,171, 45,171, 9,235, 96,103, 10,239,189,239, 44, 79,125,236, 61,108,182,226,207, 55,131,223,252,155,135,249,245, 31,
+191, 59,102,207, 67, 52,201,153,137,188, 25,198, 6,186, 43,235, 77,199,101, 39,113, 71, 29,198,184,217, 52,145, 41, 94, 93, 81,
+126,237,199,124,249, 56, 81, 71,127, 73,136, 32,238,217,239,254,183,168, 36,219,222,153, 95, 9,153, 25,219,153, 93,132,199, 4,
+ 32,237,108, 79,229, 33,196, 58,175,134, 80, 75,145,138,171, 42,154, 98, 64, 61, 28,146,164, 57, 58, 49, 18, 3,171, 27,172,173,
+100, 63, 26,207, 86, 99, 82,108, 85,224,154, 90, 36,238,104,157,182, 85,137,175, 36,238, 22,108,192,186,134, 52,207, 9,181,149,
+172,146, 0, 13,208, 90,201, 69,193,104, 18, 45,187,118, 91, 85,147,239, 69,214, 73,105, 68, 37,199,213, 74,128,224,154, 9, 30,
+ 87, 69, 23,125, 8, 65, 80,179,206,209, 84, 37,157, 78, 75,208,181,200,206,223,228, 25,182, 9,232, 44,195,141, 68,145, 75,218,
+ 45, 70,235,235, 52,117, 77,119,174,195,230,165,101,108,211,208,106,117, 24,110,245,165, 57,204, 59,188,109,240,182,198,214, 53,
+245, 96,139, 98,171, 79, 85,215, 76,237,152,195, 7,141,117, 22,237,193, 54, 21,167,142, 61,206,198,168, 97,247,238,221, 12, 55,
+ 87,152,153,217, 79, 43, 79,153,234,117, 40, 86,215,248,204, 63,126,133,222,238,125,188,252,165,119,112,244,249,207,102,110,239,
+ 62,178,249, 57,116,167, 3,209,252, 8,207, 65,121,135, 74,106, 90, 7,247,128, 50,248, 0,247,124,199, 31,145,183,167,121,226,
+209, 63,149, 72,104, 34,206,120,173, 96,232, 3,174,158,244,224, 8,245, 55, 78,180,182, 17,210,175,109,182,135, 15,141,146,131,
+ 86, 75, 58,102,188,246, 27, 79,251, 54, 34,168, 37,247, 30, 38,241, 56, 27,219,119,211, 24,141, 75,148,162,147,106,218,137, 38,
+ 51,210,196,214,110, 25,146, 84, 38,227, 81, 25,177,216,117, 32,235,104, 18, 39,151, 42,103, 21, 73, 34,211,185,139, 43,172,166,
+244, 84, 46, 80, 14,229, 57, 74, 51, 69,187, 45,229, 68,164, 10, 61,128, 94,207, 75, 17,218, 56,125, 20,205,126, 90,139, 89, 61,
+ 73, 20,203, 43,151, 80,192,229, 75,151,112, 22,202, 66,100,120,173,182, 49,182, 73,166, 52,181,147, 26, 75,145, 70,117,172, 30,
+149, 23, 39, 49,154,116, 92, 86,161, 28,111,249,185, 15,177,244,193,183,211, 12, 45,173, 61, 71,176, 35,104, 61,239,167,113,159,
+123, 11,243, 71,246,242,224,219,255, 21, 7,191,239,245, 44,124,199, 15,225, 7, 31, 65, 31,190,158,229,115,125, 54,207,158,225,
+115, 31,189,159,255,246,186,103,114,241,198, 87,242, 35,191,242,123,176,177,194,234,250,136,165,188,203,109, 7, 61, 51, 71, 15,
+240, 7, 63,253,251, 52, 83, 29,254,203,143,221,197, 7,254,224,239,200,186, 45,210, 0,231, 83, 5,137,165,169,161,211,237,210,
+ 84,142, 86,150,145,166, 41, 33, 56,218,221,105,178, 86, 11,165, 53,222,214,209, 77,171,232,204,206, 50, 90, 95,101,122,239, 97,
+242, 25, 88,126,250, 73,188,114,184,114,192,214,198, 58,211,123,247,160, 76,155,186, 44,105, 79,207, 96,235,130,186,240,148,197,
+144,110,222,195, 59,168,138,154,166,232,211,238,237,167, 24, 88,138,254, 38,123,175,186,142,165,147, 27,204,204,229,236, 61,122,
+ 35, 33,159, 66,117,102,104,169,128,233, 78,131,145, 29, 87,136,230, 43,211,221,193,234, 19, 15,112,245, 43,239,102,233,145, 71,
+ 56,252,226,187, 25,156, 62, 77,103,126,142,106, 80,144,229,134,114,107, 36, 18,141,181, 40,223,160, 13, 92,120,242, 52,117, 83,
+177,176,119,158,162, 40,176, 77, 13, 42, 39,184,134,164,149,145, 38, 83,184,224,200, 90,179,244, 87,197, 31,160,149,103,246,224,
+245,216,202,210,212,142,164,151, 81, 14,135,180,117,138, 78,115,122,187, 23,104,134, 67,124, 85, 18,210,148,183,254,204,123,249,
+242,125, 31, 83, 33,186, 12, 0, 0, 32, 0, 73, 68, 65, 84,153,132,213, 67, 52,157,248,152, 77, 79,244,246, 13, 89,199, 29,212,
+132,132, 20, 77, 33,227,174,128,241, 33, 46,239,151,128,183, 42,170,180,106,194,153,118, 99,174,187,147, 55,244, 24, 66, 22,227,
+186, 36,185,236,188, 26, 43,187,167,196, 43,129,211, 68,163,221,152, 59,159,197, 28,185, 55, 17, 67,107,137,188,124, 69,146, 69,
+182,188, 87, 12, 43,145,210,141, 17,224, 3,185, 66,121,143, 70,163,114, 35,135,159,242, 82,234,162, 3,187, 15,188,152,171, 14,
+ 92,141, 63,254, 45,108, 57,148,184,147, 29,197,178, 25,135, 15,154, 80, 15, 68,242,180, 21, 46,237,196, 46,235,145, 52, 68, 85,
+ 35,108,127, 72, 83, 21, 52,253,130,102,115, 64, 57,170, 49, 54, 96, 90, 41,105, 39, 35,171,166,168,214,214,152,113,142, 78, 8,
+204, 30,185, 17,119,224, 78,182, 30,250, 85, 58,123, 15, 81, 46,157, 36,153,158,159,212,126,251,206, 14,236,234, 25,212,249,175,
+ 51,117,219, 11, 25,124,225, 16,205,165,179,178,247,136,211,221,248,192, 80,241,245, 32, 4, 84,106,104, 5,248,137, 23, 31,230,
+189,247,157,225, 92, 9,207,154,146,201,167,142, 63, 43, 11,156, 45, 61,217, 20,100, 86,138,122, 20,240,116, 63,224,154, 33, 73,
+222,139, 95,119,194,126,141,252,150, 49, 41,238, 10, 98,219,196,203, 23,198,140, 95,145,161,221,118,171, 70, 8,210,141, 78, 52,
+150,133, 32, 77,110, 81,195,151,253,235,179, 95, 69,178,227,224,191,144,219,183,255,227,228, 79,222,148, 98,222,203, 58,219,124,
+208,232,120, 15,197, 0,215, 84, 82, 44,227, 44, 85,191,143, 45, 11, 1,189,100,224,154, 26, 95,121,217, 69, 7, 4, 8, 20, 57,
+248, 33,245, 52,163,161,188,151,243, 28, 69,160,169, 74,234,225, 16, 99,210, 88, 88,211,196, 38,189,248,156, 87,226, 15,144,239,
+139,216,168,214,144,180, 51, 92,211,208,212,117,100,174, 39, 49,101,225,241, 54,136,127,195, 24,172,109,100, 39, 15, 88,107,133,
+ 26,169,196,128, 42,117,183, 18, 13,116,117, 51,169,135,182,213,128,150,153, 70,103, 25, 58,149, 11,146,206, 83,113,178, 59,143,
+206, 19,124, 8,216, 96,208,121, 70,222,235,177, 57, 40, 8,186,193,151,130,154, 21, 84,172,116, 91,148, 69, 1, 42, 48,216, 88,
+151,182,200,170, 32,203, 59,172, 46, 94,228,212,210, 37,208, 25,123,118,204,176,115,231, 52, 11,123,119,147,230, 57,243,121,202,
+142, 35, 7,184,253,206,119,147,204,206, 69, 71,117, 1,245, 16, 46, 15,161,221,129,246, 84, 92, 6,143, 11, 31, 70, 40,103, 33,
+107,163,243,140,208,154,226,101,175,248,125,246, 29,124, 41,127,253,209, 31, 38, 87, 26,219,120, 6,131,237,149,223, 88, 28, 74,
+140,144, 34,147, 54,152, 60, 76,176,252,227,157,250,216, 69, 47,117,172,219, 62, 30,157,202, 35,154,164,242,121,230, 35,224,102,
+ 60,237,107, 45,195, 74,158, 41,178, 68, 98,108,179,115,154,118, 91, 72,149, 19,226,113,108,143, 43, 99, 83,154,247, 48,229, 3,
+117,237,105,183,132,164,216,201,212, 36,106,215,184,152,143,111,196, 36,220,237, 40,186, 29, 35, 43,206, 0,182,114,196,193, 95,
+136,121, 13,147, 38, 75, 31,132,249, 49,246, 36,237,221,179,135,165,165,139, 44, 44,236,137,208,156, 88,143, 93,111, 39, 54,205,
+179, 14,116,126,105,140,116, 50, 42,186,251,140, 38, 83, 6,131, 72,149, 45, 45,175,230, 15,254,226, 7,216,217, 89,229,248, 7,
+254, 26,125,240, 32, 59,158,255,124,178,231,124, 31, 79,255,194,157, 44,159,221,100,253,209, 83, 60,252,228,101,182, 54, 87,184,
+254,222, 55,179,241,240,167,105,210,253,124,228, 47, 63,203,115,239,189,155,187,158,183,151, 11,223, 56,206,169, 66,179,122,254,
+ 12,223,125,195, 78,254,234,195,159,225,206,187,158,195,119,191,233, 78,126,253, 39,223,203,115,223,240, 93,172, 93,190,204,165,
+115, 75, 92, 90,216,205,197,229, 13, 70, 70,115,120,231, 44,223,243,246,183,241,244,253, 95, 97,126,239, 46, 22,207, 92,166,216,
+ 90, 99,106,122,150,149,229,203,236,156, 51,236, 60,124,132,116,106,150, 36,107, 81, 13,135,228,221, 22,105,123,138,225,234, 6,
+ 1,143,201, 12, 89,107,154,106, 88, 49,183,127, 23,253,229, 13,230, 14,236, 97,245,204, 69,108, 83, 17, 84,160, 59, 51,197,230,
+202, 38, 51,187,119, 80,143, 60,101, 57,224,210,233,147, 52,229, 6,123,174, 61, 66,146,103,116,167,122,212,253, 62,189,238, 20,
+ 71, 95,248, 92,124, 50, 69,107,118, 7,224, 73,122, 11, 52,235, 43,152,222, 12,120,133, 29,246,105, 45,236, 96,180,116,145,106,
+115, 72, 61, 58,199,174,163,183,162,146,156,245, 83,103,240,174,102,180,185, 14, 42,208,153,157,163, 24,148,140,250,235,232, 52,
+101,125,105,139, 39, 30,123, 24, 99,107, 70,245,144,165,227, 23,113,186,162, 26,246, 9, 62,176,177,178, 76, 89,142, 24,108, 46,
+163, 66,139,225, 96,147,197,147, 15, 11,177, 42,155, 66,235,132,172, 59, 3, 90,211,221,177, 83,228, 79,219, 68, 96,130, 84,188,
+ 6, 20, 89,158,115,230,248,131, 92,186,112, 76, 76, 30,209, 77,153,165, 99,162, 91,124,152,198,184, 68, 45, 0,134,241,129,159,
+ 42, 72,178,113,108, 68,145,183,162,179, 61,102,202, 61,219,120,216, 16, 43,214, 90,121, 28,204, 34, 77, 77, 93,225,172,111,165,
+ 42, 26,244, 68,238,210, 17,204,162,144,189,145,138, 13, 74, 65, 9, 23,186,170, 3, 73,186,221,238, 22,162, 19,230,228,137,192,
+104, 24,240, 5, 92,125,189,161, 51,165,201,123, 74,156,162, 68, 58, 92,158,196,245,131,236,221,243,246, 12,119,189,244, 87, 9,
+ 23,142,209,172,175, 75,230,191,216,194,142, 10,130,119,114, 16,120, 71,104, 42,240,134,224,170, 72, 87,211,132,122, 68, 40, 74,
+145,120,203, 17,205,214,136,209,218, 38,229,160,166,236,215, 12,251, 53,222, 4,170,178,145, 2,161,173,130,114,109,149,180,149,
+144,230, 45,204,206, 61, 84,107,155,180,231,103,169,206, 60, 78, 58, 63,143, 78, 51,116,107, 90, 82, 29,157,121, 76,104, 80,121,
+206,212,221,255,134,254,231,254, 76,166,185,216,223,174,148,154, 56,201,213,183,103,188,216,177,208,229,252,210, 6,173,178,225,
+ 72, 7,150, 74,168,227, 57, 92,198,237,135,137, 69,104, 54,186,139, 27, 7,111,122,238, 94, 76,222,217,142,174,197,203,131, 30,
+239,205,199,193,236,224,197,233, 31,145,175, 97,210,157, 62,110,146,139,174,117, 45, 61,235,147, 28,187, 22, 99, 89,208, 70,186,
+189,209, 36,179, 59,152,125,249, 91, 39,203, 81,249, 61,220,118,213, 22, 33,118,163,215, 49,235, 30,205, 29, 49,162,134, 14,132,
+ 74, 14,112, 91, 22, 40, 5,213,214, 38,182,169,241, 77, 45,160, 22,192,149,163,137, 91,156, 68,203, 65,232, 45, 33,238,189,189,
+107, 98,164, 77,156,235,245,104,136,139,165,222, 98,172, 76,196, 71,225, 99, 57,142,150,182, 58, 91,203,138,108,172, 46,120,107,
+ 99,135,142,149,122, 86,231,165, 99, 62, 49,177,255, 90, 97, 76, 58,121, 77,131,147, 18,151,241, 26, 37, 4, 41,156, 26,171, 50,
+206, 73, 15,122,136,106,145, 73, 51, 76,187, 37,124,249, 98,136,111,106,170,162,192, 86, 5, 77,213, 80,141,162, 81,206, 90,112,
+ 53, 85, 37, 82, 62, 1,188,247, 98, 98, 12,144,207,204,144,119,218,212, 77,141, 78, 12, 58,214,220,174,173,174,240,191, 63,249,
+ 5,250,181,227,166,195,123,121,246,237,183,114,237, 45, 55,115,205,190,221,236,159,235,209,155,157,198,228, 25,122, 12, 86, 79,
+ 51, 98, 41,136,144, 92, 66,132, 78, 40,189,253, 35,116, 78, 62, 72, 90, 29, 81, 37,234,146, 80,151,236,216,115, 11,215,222,240,
+ 26, 30,126,240,125,216,184, 47,174,170,109,116,181, 54,144,119, 20, 89,220,171,167,153, 20, 61,185, 32, 7,121,146,170,137,177,
+110,156,204,113,126,242, 22,141, 32, 26, 89,183, 5,183,173, 68,134,200,195,200, 82,145,193,123, 61,205,194, 78,205,204,140,161,
+219,137,240,110, 37, 3, 71, 8, 66,176,220,234,123,182, 54, 3,101, 37,151, 4, 23,225, 71,157,150, 70, 25, 35,106,119,116,224,
+215,165,195, 57, 72, 51, 77,167,147,144,165, 58,170, 13,158,218,130,171, 61,235,107,158,205, 13,113,193, 55,205,118,198, 94, 56,
+ 26,138,165,165,139,220,241,130, 23,241,130, 23, 60,159,185,249, 93,252,195,167,255,145,254,160,144,215,105, 28,171,180,144,120,
+ 47,102, 16, 99,140,192, 67, 82, 69,199,104, 82,163, 72,163,147, 53, 73, 20, 11, 59,246,112,211,157,175, 96,241,191,191,129,206,
+117,207,100,126,119, 15,175, 15,161,235,243, 12,186,207, 99,225,197,211,228, 79,126,153, 81,107,154, 79,125,234, 81,190,139,132,
+221,183,221,205,177, 95,123, 15,215, 61,251, 22, 30,253,230,227,252,216, 7,254,144, 79,127,240, 69, 92,119,231, 97,154,191,117,
+252,250,175,253, 17,199, 6,129,159,253,212,223,240,199,175,124, 21, 87,223,115, 23,223,124,248, 24,183,119, 2,239,250,198, 34,
+116,187,108,109, 21, 52, 1,126,232,229,207,133,160,201,242, 22,163,173, 1,117, 53,160,219,107, 83,214, 53,189,169,156,217,233,
+ 25,242, 78, 23,239, 28,217, 84, 15,191,178, 74,112,129,209,198, 58,190, 25,210,153, 57, 72, 93,214, 88, 59, 36,201, 12, 73,187,
+ 71,112, 22,147,180,169,135,155,244,186, 11, 76,205,205, 80,142, 60,155,203,171,108, 44, 95, 34, 49,255, 63, 93,239, 29,101,233,
+117,151,233, 62,123,127,233,228, 83,185, 58,231, 86,183,114,176, 36,203,114,144,131, 44, 99, 28,193, 38,216, 88, 6,204,192,128,
+ 23, 44,102,102,153,176,128,203, 0,151,112, 49, 3,107, 76,158, 11,115,125, 49,120, 8,182,193,152,224, 36, 39,217,150,101, 89,
+ 86,206, 45,181,212,185,114,213,137, 95,218,225,254,177,247,119,170,196,112,123,173, 94,213,221,117,186,234,212, 9,223,254,133,
+247,125, 94,183, 19,170, 69,150, 19,175,120, 53, 81,103,150,135, 63,243, 37, 78,222,122, 13,205, 43,174, 64,231, 57,241,212,172,
+ 83,109,106, 77,216,110, 98,181,113, 7, 58, 18,157,246,220,184, 86, 27,242,193,144,160, 86, 35,169,199,132,237, 25,150, 31,121,
+144,114, 60, 32, 72, 66,116,105,216, 56,251, 44,251,174,185,158,241, 96, 68, 62,204, 48, 38,229,241, 71, 79, 19, 48,102,117, 35,
+103,116,113,157,115, 43,171, 28, 93,155, 97,105, 77,113,169,191, 65, 18,213,105,214, 34,246,205,207, 49, 51,247, 2,211,211, 11,
+100,217,136,116,248, 8,173,214, 20,251,175,127, 25,155, 23,207, 96, 6,238, 66,213,154,159, 33,138,155, 8, 44,209, 84,205,119,
+118, 80,150, 37, 63,242,159,254, 7, 15,254,192,222, 73,156, 97,101, 53, 22,161,111,128,194,138, 81,238,247, 80,102,155, 69,130,
+113, 35, 32, 2,183,254, 43, 50,119, 72,218, 76, 16,132,149, 34,219, 29,244, 81,232,198,194, 65,228,149,157, 98, 59, 57, 73, 38,
+174, 58,173, 40,116, 2, 40,149, 37, 12,173, 35,104, 5,146, 0,141, 13, 4,177,103,194, 43,237,175, 27,218, 1,145,240, 58,173,
+210,194,174, 26, 44,251, 93,154, 26,131,157,115, 7,183, 1,108, 36,144, 72, 55, 93, 80,206, 64, 21, 7,112,243,171,126, 25, 46,
+ 60, 69,177,178, 74, 57, 30, 96,178, 20, 53,206,220,197,175,200,157,122,217, 0, 38, 71, 16,186, 43, 77,233,252,199, 46,130, 83,
+ 97,242, 28,147, 41,138,222,144, 81,191, 36, 27, 21,140,122, 37,218, 56, 76,164, 54,134,233,121, 69, 49, 46,104, 77, 43,120,240,
+ 33,100, 92,163,129, 97,238,245,239,164, 56,245,109,146,185, 5, 8, 19,100,210,130, 90,151,144, 24,155,116,177, 73, 27,214,207,
+ 33,186,251,152,126,207, 47,179,241, 87,191,230, 14, 7,107,156,197, 44,148, 30,226,179, 99,103, 98,220,104,252, 71,239, 56,201,
+127,255,235, 7,220,218, 55,112,106, 90, 35, 33,214,174, 91, 47,128, 92,121,237,132,132,253, 13,136,218,211,254,112,222,134,196,
+136,202,115,174,156,218,123, 2,160,177,206,246,102,140,113, 97, 80,193, 54, 2,214,101,147,187,132, 61, 43, 93,250,153,155, 5,
+ 86,163,120,131, 13, 34,164,132,233,183,255,236,191, 43,138,171,130, 94,172, 85, 19,133,147, 53, 6, 17,239, 24, 17,161,160, 40,
+252,120,218,169,169,243,126,143, 60, 29,185,179,197, 51, 68, 85,158,110, 71,248, 90,139,201, 75,116,158,185,215,134,209, 14, 70,
+165,156, 69, 78,105, 69, 64, 60, 97, 7, 24, 44, 90, 41, 4, 22, 85,184,113,185,115,138,132, 94, 4, 85,184,187, 39, 37, 90,149,
+ 46,218,182,250, 9,132, 11,234,149,113,197,193, 55,110,202,164, 75,132, 13, 8, 43,175,147,206, 41,199, 46,114, 53, 12, 36, 97,
+ 82,115,130,182,172, 32,108, 72,202,209, 8, 17,133, 36,205,182, 75,102,179, 22, 83,164,174, 88, 41,114, 84,150,250, 93,121, 78,
+ 49,204,156,157,206, 24,198,195, 49, 90,185,221,153, 12, 2,226,122,205,123,237, 19,247,117,208,132, 73,136, 49,134,225,104,200,
+ 84,167,205,235,110,184,129,119,190,249, 45, 68,166,132, 86, 11, 99, 21,245,233, 41,207,127,246,138,177, 9, 73,197,159,160,113,
+228, 99,106,171,220, 98,207,104, 53, 62,210,176,170,228,139,212,215,110, 62, 50,118,176,206,174,238, 33,126,230,231, 7,124,252,
+ 99, 63,204,195,223,254, 24, 82, 64,173, 30, 82, 20,138, 48,114,235,182,192, 99,163,221,119,179,142,117,225,213,238,186, 66, 18,
+ 40, 38,233,109,213,171, 73,238,204, 98, 23, 19, 16, 35,198,184, 6,214, 59,251,168,213,161,221,146,196,177,159, 64,102, 22,173,
+133,163,182, 5,110,127,174, 53,164, 62,199, 92,149,142, 74, 87,171, 89, 2,233,192, 50, 86, 88, 66, 4,202, 24,172,149,212, 18,
+ 75, 28, 6,212, 26, 1, 82, 88, 74,165, 41,180,196, 42,195, 40,181,164, 35, 71,166, 43, 51,247, 51,168,204,101, 98, 68,145,155,
+122,174,175,110,242,143,159,252, 7,183, 99, 47, 96,156, 90,167,220, 55, 30,190, 67,245, 61, 67,129, 84, 2,109, 45,181, 80,210,
+138, 67,154,194, 61, 96,145, 20,228,170, 68,149,150,247,255,241,221,164, 95,254,111, 52,231,118,147,116, 15, 33, 35, 65, 48,123,
+146,167,126,233,101, 28,251,241,191,229,238,159,123, 23, 87,126,231,109,172,254,203, 71, 28,192,254,254,191, 35,188,241,245,236,
+185,236,175, 56,253,200, 58,255,235,158,135,121,223,102,143,153, 67,251,248,163,223,255,159,140,115,195, 19,189,140, 51,131,156,
+103,255,236,143,153, 61,122,156,207,222,127,138, 63,253,196, 31,242,193, 31,251, 0, 63,248,206,203,185,251,190,199,120, 48,203,
+ 88,108, 36,200,110,147,236,194,115, 36,237, 6, 91,107,107, 4, 73, 68,216,232, 98, 41, 49,170, 36,238, 52,145,141, 14, 69,154,
+ 33,194, 4,105, 3,130, 64,144,143,198,116,247, 30, 70,171, 18, 33, 29, 84,163, 24, 14,124, 55,155, 16, 53,219, 36, 73,135,206,
+226, 2, 82, 54,233,191,240, 56,163,229, 75,220,240,230, 91,208,166,205,249, 71, 78,211,238, 46, 32,227, 26,155,231, 46,113,237,
+107, 94, 65, 99,126,129, 98, 60, 38,233,204,184,215,116,163,195,232,252, 25,218,115,215, 81,174, 92, 32, 94,216, 11,249, 8,163,
+ 10,146,118,155,115,223,186,159,249,163, 11,140, 55, 11,106,221, 5,202,254, 6,166,204, 93,247, 66,192,250,217,179, 28,187,249,
+165,140, 55, 50,132, 77,233,204,205,115,241,153,231,232, 54, 35,166,167,246,209,235, 11,206, 62,243, 52,237,122,196, 70, 47, 71,
+ 74,201, 84, 28, 83, 90,193,233,165, 77,190,117,234, 2,253,178, 32, 17, 33, 97, 36, 17, 4,116, 63,249,101,222,244,249,187,248,
+190,159,252, 0,205,122,141,233, 93, 11,136, 80,162, 84,142,213,130, 40,142,118,228, 46, 7,180,187,179,180,186,115,244,183,214,
+220, 53,165, 74,192,196,137, 70, 28,144,197, 79, 83, 61,236, 65, 86,187,213, 42, 56,203, 95,240,210,220, 5, 46, 72,159, 96, 25,
+ 38,214, 49,155,165,152,196, 98, 11,223,225, 27, 49,209, 21, 57, 8,132, 15, 14, 18,222,163,154,212, 5, 74, 59, 82, 86, 18,184,
+177, 87, 32,157, 80, 44,144, 16, 8, 67,174,157,181, 3,143,175, 69,187, 10,254,224, 62,201,189,143,105, 86,183, 28,126,164,217,
+ 9, 16,129, 65, 89,176,198, 37,190, 25, 4, 81, 3,210,145, 37,136,166,153, 10,219,148, 43,207,162,210, 33,122, 56, 64,103,153,
+ 83, 42,151,165, 83,180, 87,104, 86,173, 17,148, 72, 12,218,108,251, 98,172, 86, 24,173, 40,199, 99,242,145, 98,176,146,177,214,
+ 47,200, 50,205, 11, 35,133,212,150,151,221,176, 23, 49,219,101,102,183, 96,125,101, 76,250,244, 50, 97,251, 81,100,103,150,198,
+169, 47, 19, 95,241,125,216, 11, 15,161, 11,141,104,204, 34,103, 15, 66,212,112,187,216, 32, 33,104,181,176,107,207,209,188,230,
+ 38,210, 43, 94, 70,250,196,125,238,208, 53, 59,184,230,222,250,102,124, 9, 47,131, 0, 35, 4,223,113,162,203,215, 78,247, 80,
+118,155,191, 95,161,210,199, 59,248, 3, 2,248,169, 59,174,216, 6,171, 80,237,197, 61,215,221, 31, 10, 19,235,152,177,219, 7,
+181,168, 50,209,141,247,170,251, 8,218, 29,225, 45,198, 71,150,138, 48,113,207,127, 28,130, 12,169, 95,247, 6, 23, 4,179, 99,
+143,238,184,238,129,239, 88, 42,181,187,131,189,184, 3,222,239,209,141,114,228,180,193, 96, 2,141,209,217,152,180,223,119,207,
+155,181, 72, 27, 33,173, 70, 25,231,131, 23, 17,148, 74, 77, 4,108,214,195, 18,180,111, 13, 93, 64,141, 36, 40, 21, 50, 10, 38,
+ 65, 44,194, 26, 31, 88, 99, 9, 66,103,193,211,186, 32,176, 33, 97,152,120,208, 73,137,209,206,206, 87, 9, 9,101,224, 0, 60,
+166, 44, 17,177, 3,223, 24,109, 8,163, 8, 97, 52,121,233,108,106, 86, 88,108,169,145, 81,132, 9, 3,212,120,140, 41, 75,100,
+ 24, 56, 61,141, 42,145,214, 64, 91, 32,195, 24,132, 69,101, 25, 69, 58, 70,229, 57, 89,191,231, 2, 98,178,124,194,166,151, 34,
+ 96,156, 14, 17,196, 8, 97,145,113, 52, 9,215, 9,194, 0,227, 8,251,140,199, 25,221,118,157,183,220,254, 29, 4,132,164, 43,
+ 23, 9,209, 4,181, 16, 89,139,160, 62,237, 42,105, 47,146,156,168,107, 67,207,138,174, 78, 24, 17,186, 60,226, 64,186, 55,179,
+159,212,108,243,129,212, 14, 5, 45,219,224, 11, 93, 98,135, 61,222,249,198,255,198, 91,222,252,251,220,127,255,223,242,153,127,
+254, 53,180,217,152,140,192,181, 79, 44,116,248,106,247,186,180, 62,125, 80,123,241,172,246,126,117, 83,108, 83,142,149,241, 17,
+203,202,227,167, 11,175, 31,154, 52, 25,130, 40, 22,212,234,130,118, 71,208,108,184,100, 73, 93,184,176,167,176, 38,145, 30, 53,
+ 91,133, 63,233, 18,108, 4, 53,159,113, 16, 70, 78,155, 35,173, 68,107,103, 69,172,215, 3,247,122, 15,188,200,206,175, 38,181,
+ 54,164,169,102,208, 55, 12, 71, 78,116,167,189, 84,164,226,212, 91, 31, 25, 29, 74, 71,153,147,129,155, 52,222,241,250,215,243,
+ 79,255,242,249,201,164, 33,144, 14, 28, 23, 74, 44, 34, 20, 68, 72,162, 64, 82, 23,146, 90, 32, 73, 36,132,161,164,208,154,151,
+189,253,135, 72, 90, 37, 23, 31,121,130, 93,111,249,110, 54, 63,253, 89,166,223,255, 65, 46,253,253, 47,208,185,234,141,124,233,
+199,223,193, 87, 30, 63,207, 45, 63,241, 19, 36,139,109, 46,223,123,132,108,239,229,180,250,151,216,115,235, 53,236, 91, 62,199,
+235,110,185,158, 95,125,239, 79,240,253,223,251,122,222,223, 10,185,249, 21, 55,242,200,215, 30,230,195, 95,120,140,183,253,204,
+ 31,240,206,151,156,224,225, 11,107, 60,251,205,111,241, 91,159,125, 16,128,227,115, 29,154, 81,192,189,203,125,126,124,113,142,
+124, 48,116,202,205, 81,143,124,184,133, 42, 51,162,164,134,202, 71, 52, 27, 83,110,231, 39, 37,233,230, 58, 81, 35, 70,198, 77,
+162, 36, 69, 21, 5,148,134,250,204, 46,198,235,103,105,206,117, 65,132,180,231, 58,140,183,122,104, 97, 64,198,100,227, 1,221,
+197,125, 52,234,109,146,233, 67, 92,124,252,105,172, 29, 17,119,119, 65, 16, 48,123,104, 63, 65,156, 32,194,132,250,226, 52,217,
+234, 37,194,250, 20, 2, 73,251,200, 21,152, 52, 37,158, 93,196,166, 99,210,173, 77,176, 26, 25,198, 76,239,217,131, 26, 43,106,
+141,132,120,102, 23,203,143, 61, 77,210,106, 32, 73,232,175, 45, 49,189, 56, 79,109,102,150,179,143, 62, 72,189,221,165,191,153,
+ 97, 44, 28,191,106, 63,131,141, 1,131,165, 37,114, 47,194, 88,217,220,164,159, 22, 28, 91,232, 32, 13, 52,195,128,250, 84,147,
+180,172, 81,175,197,148, 38,160,208,138, 94, 90,240,199,255,240, 25,254,224,239,254,153, 43,247, 29, 98,207,226, 52,111,122,253,
+ 27,185,253,125, 63, 72, 50, 61,133, 16,241, 54, 45,219,229,141, 50,221,157, 33, 29,174, 97,119,128,101, 34, 33, 73, 2, 40,170,
+ 78,204,147,145, 18,151, 61,130, 18,150, 2,119,152,171,210,189,209,108, 32, 38,133,185,195, 14,251,160,152,220, 18,249, 93,119,
+ 32, 60, 77, 46,113, 59,175, 73,135, 93,184,157, 46, 2, 18, 81, 5,193, 56, 77, 71,105,182,173,107,206, 78,226,166, 0, 81,104,
+ 25,165, 78, 44, 23, 37,206,187,174,149,165,185, 40,217,232,107, 74, 11,115,137,227,187,107,229, 41,110,184, 93,101,228,145,173,
+113, 44,185,238,150,159,134,165,179,168,113,138, 30,141, 48, 58, 71,149, 37,182, 84,232,241, 16,157,187, 3,196, 8,141, 29,100,
+132,173, 38, 38,146, 48,220, 68, 37, 49,129,207,135,212, 74,161, 83,197,104, 35,101,163,151,179,180,165, 56, 53, 86,188,123,119,
+147,253, 71,219, 48, 76,177, 79, 13,137,195,148,147,183,158, 36,189,238,118, 78,125,250, 46,130,224,110,194, 91, 95, 75,124,233,
+ 27,196,175,252, 49,138, 47,254, 17, 38, 12,177,131, 53,119, 72, 89,231,251,150,187, 47, 35,156, 90,192,246,206, 51,247, 67,191,
+197,185,159,123,237,182,117,192,248, 80, 21,172,143, 85,149,219, 23, 89,224,208, 85,135,249,231,167, 30, 98,108, 32,247,231,127,
+ 44,157,143,221, 55, 76, 72,224,103,239, 56,193,137, 99,123,125, 48, 11,147, 46, 91,120,192,201, 36,153,205,167,171, 89, 49, 73,
+ 15,152,116,233, 24,177, 99,175, 34, 39, 30,108,227,253,223,248,240, 23, 25, 68, 32, 66,100,152,208,188,250, 53,158, 95, 47,119,
+116,232,198, 97, 96, 43,176,140, 75,255, 64,231, 46, 69,205, 71,200, 97,203,194,165, 46,142,134,238,177,208,198,217,200, 4,104,
+173,188,221, 53,242,214, 50,141,140, 35,103,251,242, 25,230,166,116, 98, 18, 33,165, 91,225, 76,172,113, 26, 35, 2, 68,197, 1,
+192, 89,212,172, 41,182,187,119,107, 40,139, 2, 19, 66, 24,248, 3,210,128, 49,202, 39, 10,150,238,103,182,118, 50,113,208,165,
+235,246, 43,226, 74,149, 76,103,149,246,235,192,128,192, 79,211,172, 86, 46, 89, 79, 65, 62,238, 57,143,134,204,105,239, 90, 68,
+ 21, 99, 39,162,203, 82,242,254,192,197, 72, 43,133, 42, 74,175,212,215,110, 39, 31,134,238,121,179,110,245,164,138,194,223,182,
+ 4, 18,130, 80,178,177,186,194,213,199, 15,114,229,245,215, 81,174,110,162,202,146,100,102, 22,185, 48,231,188,170, 97, 88,145,
+ 95, 92,232, 67, 28, 67,173,182,131, 26,229,159,239, 42,128, 92,250, 57,121, 24,111,211, 84,194,200,253,189,138, 89, 19,114, 91,
+126,238,109,136,194, 91, 17, 19, 83,240,242,151,125, 15, 47,127,217,247, 82,104,131, 54, 5,229,120,147,126, 58, 98,117,245, 73,
+150, 47, 62,202, 83, 79,252, 43,253,173,101,148, 30, 97, 52, 40,237,172,171, 70, 90,132,215, 7,137, 0, 84,238,235, 63, 95,131,
+120,233,149,127,205, 11,130,216,173, 5,107, 9, 52,154,174,248,178,214, 53, 21,101,225, 66,174,172,177, 24,229, 10,192,178,112,
+ 44,250, 73,120,140, 79,104, 19, 82,120, 13, 64, 21, 5, 28, 98,132, 75,165,180,184,175,103,180, 35,185,230, 99, 67,175,103,217,
+234, 89,210,177, 37,245,147, 69, 97,157, 96,175,194,230, 86,137,216,210,155, 59,132,129, 47,124,225,243,132, 98,123, 45, 81,150,
+194,133,113,189,244, 88,235, 87,132,117, 10,191,110, 18, 50, 95,175,209,137, 2, 98, 9,153,133, 82, 4,188,255,247,254, 14, 53,
+122,156, 72, 37,200,225, 11,180,222,249, 65, 70,159,251, 93, 46,158,137,184,231,115, 95,227,154,215, 94,199, 21,111,123, 23,127,
+254,179,191,196, 91,255,243,251,248,181, 15,126,148, 59, 63,240, 35,132,231, 31, 70, 30,188,140,167,254,215,199,121,122,105,204,
+129,110,192, 43,223,252,122,230, 14,206,243,225, 63,250, 4,229,174,253, 28, 60,121, 25,135, 22,102, 72,154, 17, 31,185,239, 73,
+ 94,119, 98, 15,199,235,146,229, 81, 70,163,213,224,224,158, 57,164,128, 55,189,250, 58,106, 73, 72,173,187,200,218,249, 11,196,
+ 73,131,124,220, 71,134,130,108, 52,230,154, 27,175,167,190,251, 48,189, 75,167,105, 76,207, 96, 84, 73, 16,198, 46,173,172,204,
+ 9,146, 26,197,176, 79,144,212,208,165,243,160,134, 81,157,149,103,159, 97,254,232, 97, 46, 61,250, 0, 73,171, 69,148,212, 72,
+186, 93,134,107, 91,164, 91,107,204, 30,216, 71,107, 97, 55, 66, 7, 68,173, 6, 97,210, 36, 72, 34, 76, 81, 16,214, 26, 4,141,
+166,123, 17,214,155,216,210,101,179,247, 94,112,135,118,125,102,142,188, 63, 32,237,245,176,166,164,189,107, 1,163, 5,171,207,
+156, 34,136,107, 44,157, 58, 69,210, 74, 16, 2,198, 27, 61,242,209,128, 48, 14, 57,251,212, 41, 58,179, 13, 52, 1,198, 6, 44,
+ 93,184, 72, 81, 22, 12, 83,197, 70, 58,102,186,158,240,194,218,128,149,225,152,102, 28,145, 27, 77,102, 97,125,152,210,207, 82,
+ 10,165, 89,104, 39, 28,152,237,114,112, 97,154, 48,148, 44,111,109,242,192, 99,143,241,145, 63,251,115,158,251,234,151, 24, 62,
+191,196,204,222,221,180,102,166,253,138, 75,115,232,216,141,124,253,139,255, 47,219, 86, 99, 73,136, 91, 95, 6, 1,132, 72,234,
+194,229,125, 55,165, 32, 48,110,172, 94, 26, 55,206,117,128, 23, 71,129,147,194,113,147,171,144, 22, 33,221, 53, 65, 26,225,216,
+202, 62, 19,125,231,123,185, 34, 58, 25, 33,168, 69,174,219,143, 34, 87,108, 26, 51,153,210, 86, 71,199,100,116, 38,181, 79,134,
+179, 85,183, 46, 64, 9,106, 53,201,167,191,232, 30,155, 43,247, 8,230,143,135, 19, 81,158, 43, 12, 92,245, 16,200,128, 40,110,
+112,205, 21,239,166,120,238,105,138,205, 53,116, 54, 66,101,110, 7,107, 83,231, 43, 46, 55, 7,168,113,134, 30,102, 46,239,220,
+199,116, 26, 3,118,152, 97, 77,137, 29,231,152, 66, 81,228, 5,195,205,130,139, 43, 57,223,220, 44,185,115,119,157,153,169,144,
+213, 39, 55,168, 91, 77,173, 41, 88,209, 33,203,253,156,217,251,190,197,193, 59,110,101,105,121,139,160,236,147,116,103,145, 51,
+187, 16, 83,123,208,231, 31,199,148, 41,100, 61,236,120, 29,179,185, 68,177,124,154,104,122, 17,153, 52, 64, 12, 9, 22,175, 34,
+123,252,171,219, 35,119,233, 14,114,225,105,112, 66, 84, 12, 76, 23,162,116,207,147, 23, 56, 51,130,145,217,126,252,173,132,161,
+ 15,227,249,197, 55,158,224,250,203,247,110,239, 97, 42,219,156,183,150, 9,223, 25, 73, 79,233,168,146,222, 28, 39, 32,152, 20,
+ 16, 21,197, 77, 72,223,165, 84,128, 26,255,239, 50, 8,182, 65, 52,129, 96,250,237, 31, 32, 72,234,147, 61,250,246, 46,189, 10,
+106,241, 18,103, 91, 98,243, 17, 24, 71,188,179,133,179, 84,232, 60,163, 24,246, 40,179, 12, 83,150,104, 93,250, 3,178,192,250,
+ 21, 73,224,169,120,202,104,119,176,170, 2,229,119,202, 8,227,226,124,109, 21, 56, 99,183,189,238,149, 69, 15,235,246,221,202,
+161, 94,133,167,231, 85,185,233,149,144,202, 26,141,206,221,110,189, 2,170, 72,225,194, 89,156,183, 93, 99,173,203, 76, 15,130,
+112,130,204, 53,165,154,196,215, 58,175,185, 70,202,112,130, 80, 54,218,177,217, 3, 9, 81,171, 65,210,110,131,209,148, 89, 78,
+ 57, 30,146, 15,135,110,252,158, 23,190, 96, 9, 38, 76, 0,235, 85,252, 65,163,134, 53, 18,171, 21,217,104, 72, 89,228,200, 32,
+160, 63, 74,185,113,111,151,163, 87, 94,142,218, 26,128, 95, 41,202,197,121, 39, 49,143, 99,159,234,228, 53, 12, 97,224,247,114,
+254,160, 14, 42, 19,121,205, 9,227, 26, 13,104,118, 92,172,109,179, 13,173,105,104,116,220, 30, 61,174,185,185,114,245,255, 42,
+139, 13,219,248,233,237,195,222,221,255, 64, 64, 40, 35,106,245, 14,157,246, 44,187, 23, 79,114,236,216,107,184,229,229,255,145,
+219, 94,255,115,220,242,242,159,100,223,161, 87,176,181,190,204,250,250, 11,190,243, 14,209,198, 76, 44,148, 2, 55, 30,172,178,
+ 36,170, 61,187, 20, 2, 25, 66,189, 38,104,183, 36,187,118, 7, 52, 27, 78,152, 88,100,142,255, 32,172, 75,242, 21,129,131,188,
+140, 6,134, 44,243, 67,138, 72, 48, 53, 37,105,181, 66,234,141,144, 40,116,111, 42, 33, 3, 39, 62,175,154, 39, 43,176,218,146,
+102,134,209, 80,209,235,107, 86,150, 52,189,158, 97, 60,116,117, 79,153,131, 45,157, 56,216,120,106,156, 8, 28, 10,187,212,142,
+ 44,153,151,126,200,161, 39,131, 48, 2,225, 26,164, 48, 10, 36, 81, 0,109, 25, 48,157,212,152,138, 67, 4,150,126,174, 25,150,
+ 37, 55,124,199,247,131,216, 34, 28,157,165, 40, 83,104,180,120,252,119,239,100,243,137,167, 17, 71,110,231,238, 7, 78,115,240,
+101,215,114,239,239,253, 54,223, 92, 86,220,153,150,252,242,127,121, 39,119,125,224,231,121,197,251,190,155,244,233, 71, 40,116,
+206,251,127,245, 55,184,229,173,119, 18,196,127, 78, 99,113, 47,221,227, 87,240,200,179,231,185,212, 75,249,167, 71,159,229, 79,
+126,244, 59,185,110,166,201,123,127,253, 35, 28,157,239,144, 90, 56,125,105,141,135, 47,174,210,207, 20, 7,143, 28,192,138,132,
+ 90, 45, 64,107,141, 12, 67,226,122,147,241, 96, 11,171,115,106,237, 14,101,218,167, 61,183,135,184,222, 65, 21, 91, 4,113, 76,
+218,223, 98,220,219,162,179,176,155,165,103, 30,231,192,245,183, 50, 92,190, 64,109,106, 6,107,114,166,119, 45, 48, 88,221,100,
+238,224, 81,106, 83, 93,134,235, 27, 52,166, 23, 24,110,172, 51,189,111, 63,181,118,147,184,209,100,180,122,137,206,241,203,201,
+ 46, 93, 32,238, 76,161,243,129, 27, 69,201, 16, 17, 55,176,105, 58, 49, 91, 7, 97,157,176,214, 36,239,111,185, 52,187, 81,138,
+206, 55,152,185,236, 50,158,191,251, 27, 68, 53, 65, 49,202,104,180, 91, 12,215,214,136,234, 33,129,174,147,180,106,172, 95,218,
+ 96,110, 97,202,167, 60, 41, 8,224,240,241, 19,180, 47, 61, 71,115,121,192, 96, 52, 36, 18,112,108,161, 75,174,224,249,245, 30,
+153, 82,180,106, 53, 26, 73,128,214,174,195, 25,231,138,113,174, 16,129,228,224,252, 2,215,157,184,220,161, 14,107, 53, 54,251,
+ 35, 30,120,248,219,108,172, 44,113,229,173, 47,229,232, 77, 47,101,102,255,110,142, 93,254, 82,140,149, 8,223,189,132,129, 27,
+133,199,129,192,148,238,160, 14,128,196, 72,175,110,118,105,106, 97,100, 49,210,239,114,133,192, 6,219, 62,210,192,103, 13, 27,
+237, 32, 28, 88,235,104, 87, 21, 48,198,191, 24,141, 87,167,235,210, 65, 40,176, 78,215, 17, 71, 46,212, 34, 16,214,219,225,172,
+139,106,245, 41,107,198,106,136, 64,102,222, 3,239,213,177, 97, 34, 9,107, 1, 66,228,148, 6, 78,157, 54,156, 52,130,160,244,
+251,127,101, 33, 49,132,177, 67,207,214,154, 45, 24,172,161,211, 33,106,232,178, 3, 76, 81,160,211,148,162, 63,198,140,125,182,
+244,184,244,168, 82, 65, 80,139, 8, 76,140, 40, 45,162,208,132,141, 8, 50,229, 20,183,163,146, 97,191,228,204, 72,241,170, 86,
+200,222,169,128,103,159,216,100,215,222,136,251,210,128,143, 70,123,201, 6, 41,209, 3,171,220,181, 53,224, 95,215,190,200,235,
+222,125, 59,231, 7, 43,212, 87,158,167, 49,179,151, 96,247,149,132,115,167, 41,215, 94,192, 6,145, 27,223, 54, 19,244,112,131,
+241, 99,119,209,188,250,118,132, 93,160,117,253,205,244,254,177,142,205, 51,103,209,242, 49,185,198,216, 23, 17,182, 68, 16, 2,
+130, 31,127,251, 75,248,229,191,249, 54,143, 15,161,111, 97, 70, 66, 97,161, 38,225, 23, 94,127,140,107, 46, 63, 48, 17,196, 57,
+213,123,176, 77,115,147, 46,162, 88, 4, 1,198,163,117, 93,129, 21,249,239, 37, 29,102,183, 2,250,132,161,183,195,137, 29,158,
+ 36,144, 81,228, 86, 24, 6,136,106,200,214, 12, 65,107,122, 71, 16, 76,181, 75,215, 59,146,215,220,206,220, 22, 41, 89,127,139,
+ 32,138, 29, 31, 61,207, 92, 0,139, 49, 20,131, 1, 86,130,202, 75,127,168,217, 9,152, 7, 99,220,126, 60, 8, 8,164,116, 76,
+ 0,227,147,254,124,253,224,216,244,214, 63,134, 62, 98,200, 56, 6,185, 53, 10, 27, 72, 7,141,113,168, 56, 87,114,228,214, 7,
+244,104,172,149,152,194,121,218, 85,225, 80,156, 50,136,156,247, 94, 56,250,153,145,194, 69,163, 74,247,184, 41,149, 19, 68,117,
+239,216,113,128,146,216, 11,223,140,210,110,204, 91,102,174, 8, 49,150, 60, 29, 19, 37, 9,137,192,139,220, 44,229,120,132,201,
+ 75,144,130, 50, 47, 48, 24, 23, 21,235, 39,228,177,159,140, 25, 29, 98, 74,103,101,211,214,123,171,179,130, 76, 7,220,120,112,
+158,221,251,230,208, 27,125,176,146,176,211, 66, 76,117,157,108,220, 79, 83,136,130,109,242,148,244,135,120, 92,115, 35,178,138,
+ 96,181, 51, 49,111,162,224,242,107,147,234,223,236,206,162,137, 29, 93,254,164,188,247, 12, 2, 60,249,202,227,134,241,194,208,
+201,247,209,147,196,189, 90,173,201, 21, 87,222,206, 21, 87,189, 30,107, 36,247,126,253,111,249,135,143,253, 60,163, 98,153, 48,
+138, 80,185,170,112, 11, 62, 83,193, 9,242,171,167, 63,148,142, 24,215,108,249,107, 93, 32, 8,132, 96,122, 78,144,110,105,167,
+ 76,199, 96,180,165, 40,141,243,206,251,140,148,216,143, 21,195, 96, 66,104, 34,140, 4,198, 72, 74, 12, 2,227,139, 8,135,140,
+205,198,154,193,150, 98,125,205,208,219, 50,164, 35, 55,109, 84,213,170, 32,112, 57, 21, 81, 92,193,114, 44, 83,179, 51,220,246,
+202, 87, 17, 6, 17,127,249, 87, 31,227,166, 27,111,226, 27,247,220,231,136,119, 22, 10, 3,113, 8,178, 22, 69,116,235, 77, 58,
+113, 76,183, 22, 18, 73, 39, 60,208,194, 50, 42, 21,175,251,129,247, 50,190,255,159,160,215, 71, 54,219, 20,107, 23,144,151, 46,
+ 80, 59,118, 19,250,225,207,112,231, 91,111,227,167,254,235,135,185,253,206,239,226,229,187, 18,222,242, 99, 31,228,227,159,255,
+ 54,241,236, 12,247,127,241,219,116, 79,222, 72,163, 51,197, 55, 63,252, 71,124,249, 95, 63,198, 61,207,109, 48,200, 10, 46,108,
+110,241,252, 90,159,123, 95,184,200,161,185, 54,191,241,209, 47,240,127,188,235,181,148,129, 32, 53,174, 26,110, 55, 26,164,133,
+ 98,166, 22,211, 93,220, 75, 54, 28, 49, 88, 95,163, 63,216,162,191,113,134,124, 60, 98,216,223,228,200,225,131,164, 89, 70, 32,
+ 67,199, 59, 23,110, 79, 28,214, 59,244, 47,157,167, 53,213, 65, 70, 53,154,173, 6, 65, 24,210,152,238, 32,172, 65, 21,138,214,
+194,110,202, 52,167,214,237, 16,213, 91,164,189, 62,131,165, 23,152,221,191,135,233, 67, 71,137,219, 83,156,249,214,253,204, 95,
+117, 3, 38, 27, 17,214,125,238, 57,134,160,222,152,160,127,116,158,186,157, 87, 16,146,141, 50,100, 0,197,176, 32,153, 93,100,
+184,180, 78,107,126, 22,140, 97,188,182, 65,210,108,144, 14, 54, 8, 27, 9, 69, 30, 17, 69, 17, 65, 28,162, 21,140,251,235,136,
+208,179, 3, 10,141,202, 20,185, 30,209,104, 52,152,157, 89,224,234,253,211, 92,190,111, 55,227,172,160,180,154,125,211, 45,246,
+ 77,183,105,132, 1,105,169, 25,228, 5, 82, 66,179, 22, 48,211,106,176,216,105,163, 85,206,202,234, 5,206, 92, 56,199,165,165,
+101,162, 72,114,237,137,147, 28,185,226, 4, 75,207, 60,198,218, 83,207,176,126,246, 28,195,245, 77, 94,254,154,247, 98,148, 15,
+239, 17, 14,226, 96,148,247,162, 3,210,186,138,185,180, 48, 86,150,145, 50, 46,222, 80, 88, 63, 14,183,212, 99, 63, 50,151,194,
+237,175,125,119,102, 13,224, 89,240, 46,177, 77, 76, 38,195, 70, 11,103,229,240, 29,127, 84,115, 20,167, 32,148,132, 65, 0, 70,
+ 78,198,159, 65,228, 46, 8, 90, 57,143,185, 46, 42,107,138, 64, 24,233, 67, 90,220,213,172,221,132,129,134, 51, 75,134,209, 39,
+198,220,247,235, 35, 62,255, 27, 99, 62,253, 91, 41,255,250,107, 99,254,225, 23, 7,124,228, 71,183,216, 23,190, 13, 59, 26,160,
+ 70, 35,116,158,162,139, 12, 53, 26, 81,108,245, 81,131, 49,121,111,200,120, 35, 99,184,145,211, 95, 29, 83, 2,227,141,148,241,
+218,136, 98,144,161,138,130,188, 55, 70,143,114,116,145,131, 18,104, 3, 23, 83,195,145, 86, 64,111,117,140,110,199,156, 29,196,
+188,252, 47, 63,203, 95,126,232, 67,252,221, 95,124,152,191,127,226, 97,150, 78,221,207, 29,247,109,242,153, 63,252, 4,139, 55,
+190,137,222, 67,223,162,236,173, 99,207, 61, 64,244,146,183,184, 39,192,231,141,139, 90, 13,209,154,114,187,207,199,190, 8,131,
+101,236,120,153,249,247,253,222,100, 52, 92,161, 90, 43, 22,114, 83,250,135, 0, 0, 32, 0, 73, 68, 65, 84,139,240,123, 92,183,
+ 44,183, 52, 27, 49,191,251,190, 91,249,241,107,230,120,233, 66,131,154,132, 17,240,230,227, 51, 92,119,229, 1, 55,186, 55,248,
+221, 46, 88,109,144, 97,128,149, 94,152, 86,169,218,149,222, 22,209, 9,235,243,187,205, 68, 16,230,208,132,174,219, 50, 30,251,
+110,101,224, 70,250,198, 96, 69, 56,161,107,116, 94,125,231,164, 59,223, 30,187,151, 59,200, 68,213, 71,151, 17,110,242, 28, 83,
+102, 20, 89,138, 74, 29, 48,165, 72,199, 40, 85, 82,164, 57, 74, 41,180,247,179, 91, 31,218, 98,171,157,249,142, 68, 57, 7,132,
+ 49,232, 66,161,173,174,160,183,126, 63,235,151,182,104,175, 72, 87,152,162,192, 26, 55, 54,119, 7,170,246,227,107, 87,232,168,
+178,160,204, 51,202,162,112, 20, 58,165, 93,166,121,150, 83,102, 57, 34,156, 92,241, 61,140, 71, 16,132, 17,218, 23, 5,198,223,
+ 63,173,220,154, 65,198,177,243,146, 91,103, 59,182,198, 16,134,193,164,168,118, 93,121,138, 42,114,178,204,233,120, 8, 66, 4,
+225,196,125, 34,172, 65,249,172, 81,107, 45,166,122,125,231, 99, 84, 97,200,211,140,249, 70,141,221,123,218,148,155, 91, 78,221,
+223,136, 17,205,150,107, 77,227, 58,212,235, 80, 79, 92, 18,225,212, 44, 76, 47,194,220,110,152, 90,132, 70,219,141,216, 43, 60,
+176,221,118, 68,108, 63,119,147,120,193,109, 76, 90, 85,232, 73, 47, 14,220,249,251, 69,207,249,206,143,213,237,119,236,242,253,
+200, 95, 84,129,233, 30, 78,116,235, 43,191,159,223,249,253, 23,248,192, 47,220,141,181, 53,180,177, 24,237, 32, 48,210, 55, 30,
+ 21,120,166, 10,156, 10,188, 67,199,104, 73, 24, 75,234,173,136, 56, 14,104,118, 2, 58, 51,174, 37, 86,165,211, 13,229,185,107,
+ 52,170, 17,190,179,245, 90,194,192,167,245,121,193, 80,229,214, 84,202, 80,228, 37,233,168,100,220,215,108,108, 24,250, 91,134,
+ 52,133, 34,151, 20,153, 32,203, 5,218, 10, 87,194, 74,183,206,244, 8, 3, 94,125,219,107,184,235,243, 95, 32, 31, 43,172,178,
+236,221,181,119, 18,101,237,182, 69, 62,163,161,219,158,165, 85,107, 64, 0,129,176,136, 64,146,233,146,177,177, 4,141, 54,173,
+181, 71,144,181, 14,170, 54, 69,104, 46, 66, 33, 97,102,145,123,190,248, 8, 87,191,247, 93,220,243,192,227,188,253,196, 30,222,
+255,139,127,194,190,203, 14,146, 4,130,175, 60,115,142, 63,253,212, 55,184,235,147, 95,162,125,240, 8,175,250,201,239, 39,153,
+110,242,201,223,249, 85,214,115,205,111,254,237, 23,249,245,127,250, 58,239,126,195,141,156,221, 26,146,142, 75,102,219,117,254,
+228,179,223,230,199,110,189,138, 75,253, 17, 7,186, 13,230, 26, 53,110, 62,114,144,119,220,242, 18,186,179,187, 16, 82,178,181,
+182,198,220,194, 65,202, 77, 65, 99,106, 26,107, 2,146,122, 64, 92, 75, 16, 65, 72, 84,111, 32,164, 35,202, 33,161,214,158, 34,
+233,238, 34, 8, 2, 90,243,251, 49,101, 74,189, 51,235,200, 66,227, 33, 86, 4, 96, 11,154, 11,123,209,133,162,236,103,236,189,
+246, 6,186,135,142, 82, 12,182,216, 60,115,134, 35,183,222,138, 74, 83,116, 58, 70,151, 41, 32,136,154, 13,108,225, 32, 20,202,
+239,240,210,205,117,159,152, 84, 34,162, 6,186, 24,210, 59,123, 30,173,123,204, 92,118, 29,203,143,159, 34,168,135, 12, 86,215,
+221,142,196,104,242,209, 38,113,171,134, 20, 33,207, 63,113,138,246,116,147, 98, 92,112,241,217, 39, 9,107,134,116,148,163, 70,
+ 67,194, 70,157, 84, 89,246,238,153,227,208,225,131,156,220,189,151,221,173, 58,135,230,231,105,197, 9,141, 40,228,232,124,151,
+ 19, 11, 51,212,162,152, 82,187,139,122, 45,138,216, 55, 55,195,108,103,138, 99,135,143,210,157,105,211,170,213, 89,223, 90,166,
+ 72,135, 28, 58,121, 21,237, 93,115,232,209,144,209,218, 18,239,188,243, 87,221,138,204,184, 68,162, 88, 66, 61,116,118, 39,173,
+ 44,121,105, 40,148,166, 44, 13,169,182,228,214,146,123, 49, 71, 82,131,169, 41,151,106, 36, 35,127,232,250, 14, 93, 87,193, 93,
+218,141,147,208,118, 50,186,174, 48,136, 65,236,170,219, 40,118,187,238, 36,145,196,158,144, 22, 4,206,110, 25, 73,235,210,217,
+132,139, 42,117, 60,104,225, 46, 24,210, 34, 98, 8, 99,167,200, 22, 6, 46,155,130, 15,238,131,107, 11,248,216, 61,154, 83, 25,
+172,148,176, 97, 96, 93,195,134,133,179, 5,204, 92,125, 2,181,186,234,246,162,186, 68, 13,135,232,193,136,114, 51, 37,235,143,
+ 25,174,103,244, 86,199,244, 55, 50,250,131,130,245,243, 3, 54, 55, 82,198,253,156,254,218,152, 97, 47, 39, 31,149, 12,251, 57,
+249, 70,142, 86,154, 40, 22, 36,210,249,137,219,215, 95,203,250, 74,206,241, 15,253, 33,229,165,167,217,236,109,176,190,124,158,
+229,211, 79,161, 85,128,181, 57, 63,179,217,160,255,177, 79,161,195,144,252,133, 71, 49,197, 24, 46,220, 71,237,229, 63,128, 77,
+ 71, 16,184,240, 16, 17, 70,136, 90, 27, 19,214,200,206, 60, 6,131,117,226, 3,251,144,141,174,211, 38, 88, 23,166,226,246,167,
+194, 55, 58,254, 34,232,189,229, 86, 91,222,254,154,147,188,108,223, 52,203, 10,110,158, 18,252,224, 91,174,247, 66,198,192, 77,
+ 83,220,166,209, 23,100,142, 97, 33,170,121,189, 1, 25,199, 30, 76, 99,156,144,205,143,145, 61, 32,221, 55, 99,118, 59,112, 70,
+134,147,166,205,218,234, 96,138,145, 73,139,120,118,175, 87,202, 91,175, 8, 87, 47,198, 13,138, 42,105,205,161, 88, 13, 46,232,
+ 68,231,169, 43, 88,132,160,204, 51,215, 57,121,234,155, 53,218,255,172,158, 91, 17, 5,152, 82, 81,230,142, 38,135, 23,222,105,
+ 63,230,118,135,188,246,159,115,192, 29,229,113,174,214,163, 99,181,135,113, 27,255,209, 90,129, 21,110,122,104,180,115,153,216,
+ 64,186, 34,194, 23,252,166, 44, 28, 95,222,234, 29,207,139,239,164, 67, 57,129,206,148, 74,163, 75,229,247,225,133,155,128,120,
+ 33, 90,149, 69,163, 74,103,227, 11,147, 4,100, 64, 89, 22,168,220, 97,105,173, 21,136, 48, 70,132,129, 59, 2, 45,152,162,240,
+116, 60,151, 87, 97,138, 18,165, 21,101, 89,146, 15,134,152, 60,101,109, 88,114,203,201, 5,202, 94,134, 16, 17,162,221, 65,182,
+187, 80,111, 67,187, 11,173, 22,116,186,238, 32,159, 94,128,198,148, 27,177, 91,175,106,173, 14,235, 10, 41, 92, 61,201, 62, 72,
+121,251, 57,180, 59, 70,235, 98, 91,126, 94, 41,189, 38, 29, 60,219,106, 90, 25,110,155,195, 39,183,209,219, 33, 19,102,135,211,
+163,130,107, 88,243,162,129,193,145,163, 55,241,161, 63, 93,230,251,127,224, 67,232,204, 16, 6, 14,124, 84,229, 11, 73,191, 97,
+ 9, 35,103,161,141, 35, 65,189, 33,105,182, 66,106, 53, 73, 82, 23, 36, 45,137,140, 37, 50, 18,100, 5,228,169, 37, 77,221,218,
+ 79,122,141, 95,224, 15, 88, 83, 90,111, 2, 16,219,241,205, 86, 84,148, 6,167,154,207, 45,101,234,198,236, 54, 21,148,169,197,
+ 22, 16, 90,139, 48,158, 17, 35, 93,131, 99,133,131,217,200, 64,144, 13, 70,216, 82, 16, 26, 73, 64,128,212,222,173,226,250, 37,
+226, 0,100,175,220, 98,107,180,129, 65, 83,150,154, 92, 43,134, 90,147,150, 57,215,222,246,157,148,151,150, 89,126,240, 62,204,
+ 56,225,220, 93,255, 72, 84,183, 52,246, 95,207,242,185, 37,254,233, 47, 63,195,204,104,133, 47, 61,118,154,160,222,224, 43, 15,
+156, 66, 38, 17,135,187, 53,238, 59,183,198,215, 46,110,114,233,155,223,228,155, 95,122,156,135,158,190,196, 37, 29, 49,213,169,
+243, 23, 63,251,125, 92, 62,213,224,190,111, 61,193,117,115, 45, 10,107,185,108,113,134, 47, 61,123,145,165,141, 30,227,210,240,
+213,115,107,244,250,125, 78, 95, 90,230,207,190,252, 13,138,108, 68, 89,106,134,253, 33,129, 44, 9,187, 53,172,209, 4, 73,196,
+226,226, 2,241,212,188,143,132,148, 88, 93, 18, 55, 59, 88, 93, 16, 36, 13, 70, 27,151, 40,198,125,194,122, 29, 17, 38,244, 87,
+151,233, 93, 60, 75,107,118, 22,173, 74, 90,211, 83,147, 61,223,252,101, 39, 33,168, 99, 74,141,202, 75,186,251,247,162, 74,231,
+ 75, 45,198, 41, 97,123, 10,163,220,142, 77,151, 5, 4, 49,229,104,192, 96,121, 9, 33, 74,178,193,128,250,116,139,241,250, 10,
+173,133, 25, 78,127,237, 91, 28,188,233,106,202, 65,223, 83, 61, 3,122,171, 43,196,205,144,180, 55,166, 51, 93,167, 53,189,200,
+197, 83,171,132,122, 64,123,110, 22, 17,116,176,229,136,246,116, 7, 17,198, 12,179,146, 44, 75, 81,121, 73,156, 72,180,212,236,
+222,115,152,118, 43, 70, 88,195,254,153, 25,218,141,132, 78, 82,167,149, 68, 92,190,103,145, 67,115,211,204,212, 19,138,162,224,
+244,165, 21,158, 95, 94,102, 60, 26,208,106,212, 24,231, 99,180,209, 24,171,200,179,148,165,103,158, 64,149,138, 40,105,209,157,
+ 89, 36,170,205, 96, 52,148,133, 11,243, 41,149, 19,118, 88,227,198,180,153,133,220,192, 88,185,191,203,200,153,156,107, 53,151,
+202, 38,195, 10,245,106,125,119,180,221, 57, 26,225, 42,229,220,211,157, 76,197, 40, 9,182,185,206,181,154,160, 61, 21, 16,199,
+ 2, 25, 72, 87, 61, 11, 55, 5, 16, 59, 24,228,218,227, 25,109, 53,210, 23, 18, 34,127, 45,176, 22,253,100,201, 75,114,120,186,
+128,115,133, 19,246,141, 53,100,198, 77, 26,172, 15,150,155,158, 73,152,154, 75, 40, 7,125, 23,206, 81, 58, 68,111, 49,202, 41,
+138,146,108, 84, 50, 28,150, 12, 71, 37, 91,131,130,205,158, 98,101, 37, 99,121, 37,103,249,226,136,141, 94,193, 86, 63,103,125,
+101,196,120, 88,146,141, 75, 84, 90,146,102,134,169, 80,208, 27,228, 12,108,200,133, 49,204, 28, 60,198,160,183,193,211, 15,124,
+141, 32,170,129,129,180,215, 99,233,209, 7,120,248,244, 99, 76,189,230, 50,172,109, 81,172, 47,163,214,150, 48,131, 30, 50, 10,
+137, 15, 94,239, 29, 19,174, 51, 22, 65,132, 8, 99,215,121,172,158,193, 14,206, 50,247,227,191,191,157,255,110, 28, 66, 85,248,
+176, 14, 55,166,244,227,120, 5, 34, 10, 57,253,244, 57,254,244,193, 11, 28,110,194, 7,222,249, 82, 7,237, 8,165,219, 97,248,
+174,222, 17, 57,252, 14,117,135,114, 89, 72,167, 4,223,238,212,229,118,180,159,117,202, 36,233, 21,240,214, 88,132, 12,221,251,
+198,250, 29,123, 20,185,145,189,213, 36,135,175,223, 97, 95,171,186, 45, 31,159, 85, 29, 6,214,184, 59,174, 50, 87,140,171, 18,
+ 93,184,189, 49, 22,242,241,144,178, 44,156,210,188,202, 73,199,249,176,173, 50,158,131,174,124, 33,105, 38, 9,109,186, 40,182,
+ 57,242, 90,185,255,175,141,199,174,110, 11, 12,181,246, 99, 94,163,125,118,186,118,234,116,233, 59,108, 85,122, 5,182,197, 86,
+123,113,237,172,174,198,123,213,177, 46,175,221,104,227,155, 75,175,208,247, 10,112,107,220,254, 95,107,141, 86,238, 99,153,167,
+ 62,190,211, 9,222,140,113, 59,124, 25,133, 68, 73, 29,137, 64, 41,237,224, 73, 82,184,194,162, 84,238, 85, 96,220,251, 79, 41,
+ 15,190,209, 26,165, 10,242, 81, 74, 57, 30, 3,112,105,179,199,187,110,187, 18, 85, 90, 68,173, 14, 83, 29,100,189, 1,157,105,
+152,157,133,233, 25,152, 89,132,230,140, 39,246,137,237,231, 98,162,117,240, 66, 72, 27, 84,129,231,147, 52,185,237,219,248, 14,
+222,226,111, 87,133, 36,136,237,120,177, 42, 83, 96,167, 7,205, 86, 33,234, 85,109,224,179, 86,181,242,241,142,213,115,226, 47,
+ 38,238,201,193,162, 38,245,129,245,232,226,215,190,225, 71,249,147,191, 92,167,209,156,115,215, 17,237,149,240,214, 91,235,107,
+ 14, 60,211,104, 73, 90, 45, 89, 5, 9, 34, 3, 55,229, 10, 67,231,137,207,115,203, 48,181,228,165,247,168,151,147,183,150,211,
+ 23,225,198,251, 66, 86,171, 70, 23, 36, 37, 3,137, 20,146, 48, 22,212, 99,111,161,211,174,108,150,149,102,136, 10,185,236,155,
+ 31,227, 72,155, 90,129, 40, 53,115,211,115, 72, 4,115,211, 51, 8,173, 8,132,152, 88,218, 42,222,147, 28,103, 35, 12,138,220,
+104, 70, 86, 51, 82, 5,125, 85, 50, 84, 37,111,253,161,255, 76, 20,149, 60,252,169,175,177,118,246, 60,243,223,249, 99,228,203,
+207, 98,206, 61,197, 59,190,247, 59,248,253, 79,222,207, 45,119,190,157,107, 15,204, 65, 58,230,225,245, 49,223,117,116,145, 91,
+246,207,241, 93,251,103,120,211,155,223,202,239,127,232, 35, 92,216, 82, 92,243,138,107,177, 8, 78, 47,109,176,188,214,167, 27,
+199,252,205,125, 79,211,173,215,152,111,214, 57,191, 57,224, 88,183,201, 86, 86,114,197,124,135, 43,103,218,172, 12, 82,186,245,
+152, 46, 48,222, 88,159,100, 56,219, 64, 16, 69, 53, 54,150,206,177,177,114,145,214,236,110,242, 44,155, 92, 40,194, 86,135,193,
+218,138,123,115,234,146,184,214, 32,136, 19,100, 88,199,154, 18,149,141,153, 61,112,136,218,244, 28,121,127, 72, 99,110,129,116,
+107,139,184, 51, 69, 57, 94,135,184,142, 26, 15,137,234, 13,226,230, 20,101,158, 35, 66,167, 14, 13,106, 45,172, 46,208, 74, 17,
+ 68,206, 7,177,113,230, 89,226, 36,162,117,224, 4,229,120, 68,115, 97, 55, 27, 47,156, 67,214, 58,108,156,123,142,184,153, 48,
+ 88, 93,114,150,186,168,129, 41, 44,189,181, 62,232, 17,139,199,143,114,233,249,101,214, 46,156,101,239,137, 67,168, 66, 48,189,
+119,158,153,189,151, 99, 3,195,194,129,235,161,236, 51, 59, 63, 75, 82,111, 19, 38, 53,180, 42,153,153,157,166, 21, 74,174,186,
+226, 8, 87, 95,115, 53, 47, 57,121, 57,194, 10, 6,105,129, 64, 48,221,106,113,248,192, 46,254,195,123,126,148, 59,223,254, 61,
+ 92,125,104, 55,253,173,117,214,150, 86,104,213,107,204,205, 77, 83,230, 25, 65,173,142, 16, 6, 41, 35, 90,115,179, 0,220,252,
+138,119, 16,132, 16, 7,110, 55, 90, 0,169,215,154, 40, 11,153,118,163,119, 35,183,249,204, 66,122, 34, 92,224,118,222,218, 79,
+ 78,101, 84,189, 63, 45,202, 88, 39, 68, 50,174,126, 15,132,215,201,196,126,127, 21, 58, 36,108,229, 13,149,145,123,165,106,107,
+ 17,218,237, 47, 69, 53, 30,243, 66, 57, 97, 65, 11,247,181,101, 0, 73, 32, 8,194,128,232, 51, 25, 79,254,125, 78,207, 58,239,
+117, 97,182,201, 76, 77, 79,179,219,200,161, 52,130,184, 91,131,173, 45,138,225, 22, 38, 47,177,133, 27,173,234, 82, 81,140, 74,
+ 70,155, 57,253, 97,201,198, 86,201,218, 72,115, 97,168, 56, 51,208,156,235,151, 60,181, 82,112,126, 45,227,210,122,193,217,181,
+130,173, 97,201,120,172,208,185, 34, 80,150,213, 18,134, 86,114,233,185, 51,196,187,103,248,236, 95,253, 54,191,244, 11,255,133,
+191,249,187, 63,228,135,127,248, 29,156,127,242, 62,178,113,198,197,243, 91, 44,191,231, 6,212, 74, 31,177,120,148,244,210, 5,
+138,213,115,232,241, 0,115,233, 9,226,107,223,136,168,207, 19, 76,237, 67,212,166, 92,216, 73,144,160, 85, 73,217,223,130,222,
+ 10,241,124,215,251,176,171,184,211, 96, 2,165,153,136,212,164, 68, 68,130,180, 63,224,119,239, 62,195,238, 6,252,212,237,151,
+ 81,239, 54,189, 24, 46,112, 98,183,138,233,110,181, 83,130, 87, 7,120,213, 49, 97, 39,130, 67, 17, 8, 55,146,246, 64,148,109,
+ 83,176,167,205, 9,235, 10,140, 64,120, 62,185,246, 23, 94,119, 64, 53,175,189,221, 95,120,203,201,136,221, 29,228,218,103, 2,
+123, 22,187, 42, 80,121,134,206, 29,167, 93,107,151, 96, 81, 22, 25,217,120,236, 88,234, 86,251,241,185,195,109,105,163, 49,147,
+ 75,165,197, 88, 71, 81,211, 69,129,241,148, 54,140,193,250, 23,172, 16,129,191,127,206,118, 86,117,238,214, 26, 63, 17, 8,208,
+166, 68, 43,141,136, 2,100,176,237,211,183,218, 17,237,140,113,240, 24, 35,172,243,190,107, 63, 86,247, 17,180, 70,104,255,216,
+ 8, 7,150,177,222, 49, 81,186,251, 84,173, 10,116,145,161,243,194, 1,113,172, 70,107, 55,238,183, 24,202,116,236,198,242, 62,
+158, 76, 43,131,214, 26,235,149,248,214, 24,103,123, 11,164,183, 59, 42,138,116,140, 46, 10, 4, 26,147,101,108,245, 7,188,230,
+138,131, 52,218,109,231,159, 79, 18, 68,210,132, 61, 7, 96,113,183,239,202,167, 29, 64,162, 10,117,216,185, 47,255, 55,128, 35,
+119, 37,208, 59,254, 77,191,120,252,238,222,245,254,243,193, 54,164,162,226, 72,111,159,228, 59,114,191,183, 15,234, 73,234,158,
+246,216,181,234,183, 86,219,183,175, 14,124,227, 37,226,136, 29, 93,187, 32,169, 53,248,189, 63, 62,203, 43, 95,245, 67, 4,161,
+179,109,135,194, 53, 18,129, 15,161,106,181,221,250,208,189,132,141,159, 82,185, 98, 48, 8, 44, 74, 65, 58,134,108,236, 85,239,
+ 94,220,111,164,192,148,174,192, 49,147, 44, 33, 65,224,223, 7, 50,144, 68, 81, 64, 20, 74,146,154,195,200,134,225,182, 97,192,
+ 26,183,242,148,222,230,239,235, 66, 4, 16, 91,248,252,231,190,196,203, 94,118, 43, 83,237, 46,183,191,250, 85,124,253,203, 95,
+246,156, 5,231, 4,154,168,240, 95,114, 89,237, 87, 64,160,133, 70,134,150, 76, 43, 70,214, 96,163, 6,111,254,190,239,161,127,
+239,167,208,131, 26,247,127,225,110, 58,243,139,212, 15, 95,206,220,190, 33, 73, 52,195,117, 7,142,240,254, 95,253, 51,174,217,
+ 59,195, 64, 89, 86,135, 41, 11,211, 45,222,247,238,215,114,174,111,104, 55, 52,159,127,232, 5, 14,236,154,198,102, 25,255,231,
+ 39,239,102, 61, 87, 92,183,111,150,171,102, 27,140,117,200,129,153, 22,159, 57,117,129, 80, 72,222,112,213, 65,190,126,102,149,
+203,247,206, 48, 74, 75,142, 52, 18,214,141,101, 74, 88,254,227, 79,188,151,149, 75, 75, 88, 99,201, 70, 35,130,208,178,181,220,
+167, 28,109,114,197,181, 87, 18,181, 58,190, 99, 8, 72,234, 45, 70, 27,107, 52,231, 22,200, 7, 3,234, 83,179,200, 32, 96,180,
+181, 78, 20, 71,168, 76, 17, 53, 26, 4,113, 76, 62,216,162,179,103, 63,195,213, 37,116,150,210, 89, 92, 68, 36, 53, 2, 41, 41,
+211,177, 59, 68,179, 33, 97,173, 78,216,108, 81,110,109,145,247,215,168,205, 46,130, 85,140,214, 86,105,116, 59, 68,141, 46,227,
+165, 51,100,195, 30, 73,171, 75, 16, 64, 54, 76,217, 58,115,134,122, 39, 97,180,177, 78,148,212, 25,110,244, 24,111,108,177,112,
+116,154,233,197,131, 12, 54,251,172,157,237,209,153, 42,209,186,198,168,183,132, 54,146,213,231,215,104,181, 53,181,238, 17,244,
+224, 57, 74,186, 36,186, 73,166, 46,145,180,118,145,171, 49,139,139, 71,217,236, 95, 98,102,254, 8,141,122, 3, 83,244,185,249,
+218,151, 50, 28,110,162,140,166, 22,180,201,139,148,194, 20,116,102,231,120,249,107,222,196,190, 3,123,216,123,228, 36,141, 90,
+131,153,197,189, 52,219, 13,116,105,153,218,187,143,246,238, 5, 84,169,216,127,248,106,190,244, 47,127, 0,198,145,154,180,113,
+ 96, 5,131, 69,249, 63, 23,108,103,115, 36,137, 83,141, 86, 48, 41, 85,229, 99,187, 19,215, 89,123, 60,177,201,137,179,173,231,
+107, 11,159, 16,231,148,165, 81, 44, 28, 69, 46, 22, 52,234,210,165, 44, 9, 39,156, 27,167,118,242, 10,151,129,152, 36,171, 25,
+ 99,145,213,181, 95, 89,106,117,201,240,175, 51, 30,120,208, 48,180,142,156, 54, 48,219,197,191,211, 10,184,223,120,120,205,109,
+ 47,221,207,173,175, 56,193,248,236, 69,138, 97,223,141,118, 71, 41,253,149, 49,233, 32,103,208, 47, 25,142, 53,107,153, 98, 57,
+ 55,188,144, 26, 30, 30,104, 86, 70,154,168, 21,115,255,166,230,124, 95,177,186,158,209,138,164, 11,131, 48,110, 45,112,110,168,
+104, 27,184,120,177,199,238,171, 15,241,183,143,220,203, 83,151, 44, 3,181,159, 93,157,148, 79,220,123, 15,223,187,103,138,225,
+207,255, 20, 89,163, 78,231,242,125,132, 55,191,157,213, 79,125,148,250,238, 57,130,198, 12, 65,123, 26, 25, 24, 68,107, 47,197,
+217,111,123,111,206,246,216,209,150, 5, 65,189,142,236,204, 49,184,247,179,216,178,244,129, 42,248, 56, 86, 79,107,171, 96, 45,
+ 82,242,219, 31,189,143,101, 13,239,188,188,195,141,215,157,112, 99,200, 32,156, 60,169, 21,254,213,197,160,110, 7,170, 72, 31,
+219,231,246,193, 21,223,125,251,243, 21, 50, 86,200,192, 91,234,196,132,101, 94,125, 94, 4,145,183,207, 5,200,184, 78,243,250,
+ 59, 42,212,208,142,195,194,108,195, 74,208, 96,114, 76,158,163,211,145, 35,191,149,238,176,211,218,160,202,220,139,222,152,216,
+254,140,111,211, 68, 53, 41,160,250,156, 99,204, 27,163,221,232, 92,149,110,239,110,236, 68,245,110,169,118,237,218,123,203,131,
+237,160,152,106, 88, 81, 42,164,103, 61,104,173, 16, 30, 7,237,178,207, 37, 70,105, 23, 63,156, 56, 27, 91, 16,248, 17,122, 21,
+ 41, 43, 92,224,140, 85,190, 96,193, 56, 81, 92, 89,122,187, 85,129, 46,245,132,137,224,164, 66,210,197,191, 90,139, 8, 3, 84,
+ 58,246,141,142,117, 29,190,114,197, 68,153,103,147,233,152, 49,214, 77, 6,112, 88, 92,165, 44,229,120,200,104, 48,228,196,222,
+121, 78, 28, 63, 72,169, 53, 54,174, 17,205,237, 66,238, 63, 12, 83,211, 78,189, 94, 29,230, 59, 15,223,137,181, 97, 7, 26,152,
+ 29,110,135, 23, 29,214,114,199,159, 5,255,251, 47,187, 99, 52,239, 5,113,213,193, 61, 97, 86,235,237,164,189,234,144,175,164,
+235, 90,111,223, 14,177, 61, 37,168,220, 24, 94,184, 43, 38,201, 55,219, 48,163,107, 95,242,102,118,237,185,156,135,239,251,123,
+194, 0,162, 68, 80,175, 9,230,230, 37,211,211, 33,205,182, 59,228,139,204,160, 75,151, 41,161,177, 20,169,101,148, 58, 27,154,
+ 82, 21,222, 90,208,110,185,177,125,163, 17, 18,215, 36, 81, 40,157,211,162, 74,240,243,247,171,210,253,169,210, 50,236,187,157,
+250,112,100,200,203,202,130,234, 10,156, 40,220, 94, 94, 72,239, 48, 42,198, 5, 79, 60,250, 52,143, 63,248, 16,207, 61,253, 52,
+195, 44, 71, 8, 65,233, 27, 26,132,247,223,231,202,144, 81,146, 91, 69, 63,203,217, 40,114, 6, 42,229,186,219,222, 76,239,139,
+ 31,229,107,159,248, 38, 7,110, 62,206,147,143,174,242,241, 63,255, 36,233,150, 37, 56,249, 54,202,205,175,210,109,228,252,230,
+247,191,150,127,124,232, 12, 69,191,207,254,118,131, 39,122, 5,151,202, 58,151,134, 41,191,243,137,187, 57,179,190,193,255,245,
+183,159,227,240,209,253,220,245, 11,223,203, 66, 28,243,119,247, 62,201,245, 55, 92,193,231, 78,157,229,101, 55, 28,227,182,131,
+ 11,132, 1,252,227, 67,167,153,105, 36,148,163,156, 72, 64,207, 26,116,169,216,219,172,177,114,254, 28, 83,115,243, 40,235,118,
+ 83,121,218, 99,247,209,195, 76,205,204, 18,134, 9, 65, 20, 81,235, 76, 19, 68, 9,218,104,218,243, 11, 96, 12,233,160, 71,153,
+143,220,197, 12,137, 12, 19,226,102,141,108, 99, 19, 91,150, 14, 6,129,160, 49,213, 37,172, 55, 8, 59,211, 96, 37, 42, 79,253,
+139, 75, 83,159,223,199,120,117,109, 98,127,168,117,103, 80,227,145,195, 73, 14, 71,212,231, 22, 56,251,173,251, 41,243,140,169,
+189,251, 81,121, 65,212,172,179,250,236, 11, 44,158, 56,204,120,181,207,226,241, 35, 12,215,214,208,101, 70,109,170, 77,173,189,
+135, 65, 63, 99,253,194,144,188,191, 68,103,118,218, 51,178, 53, 97, 18,211,153, 77,168,181,219,200, 32, 99,102,223, 73,154,237,
+105,166,103, 27, 46, 25, 72,128, 52, 33,163,180, 79,171, 51,195,212,226, 94,122, 27,231,185,250,134, 91,201, 84, 74,158,143, 89,
+ 92,220,205,137, 19, 87, 49,191,184, 15,155, 21,244,215, 87,120,252,193,111,112,234,137, 71,209, 69, 65,173,211,101,118,255, 30,
+146,198, 20,179, 7, 14,208,217,179,219,103, 9, 75,102, 23,246, 19, 69, 1,214, 3, 97,178,210,146, 21,144, 42, 24,151,214, 89,
+ 29, 61,181,201,217,108,156,231, 82,250,102, 75, 88, 55, 26,207, 51, 55,186,159,228, 35, 23,144,101, 22,171, 32,203, 45,121,110,
+ 80, 10,138,220,215,243,210,129,110,162, 72, 76,160, 52,129,181,168,220, 32,180,161, 44, 12,101,105,209,133,139, 46,180, 5, 4,
+218, 98,149, 69, 88,227, 24,245,255, 92,240,236, 41,195,186,129, 94,225, 2, 93, 74,175,223, 73,173, 91, 23,172, 21,176,169,220,
+200,107,156,193, 45,175,188, 2,250, 61,116,153, 59,224,200,214,128,114,152, 83,140, 10,250, 91, 5,131, 84, 51, 40, 13, 27,133,
+229,254,158,230,149,173,152, 15, 94, 61,205,255,120,237, 34, 63, 53, 27,240,179, 93,248,149,155,246,240,131, 63,252, 29,124,105,
+ 67,243,248,165,148,193, 88, 17,134,208, 18,130,199,134,154,212,194,102,170, 41,149,228,240,209, 69, 14,236,154, 97,247,122,193,
+135,209,220,245, 11,255,157, 23,226, 24, 41, 37,167, 62,122, 23,157, 3, 87,177,113,113, 11, 53, 24,145, 95, 58,141, 94, 95,194,
+244, 86,137,246, 29,195,246,135,152,116,132, 30,244,209,163,190,203,127,175,119,209,233, 24,178, 33, 97,119,207,118,255, 52, 49,
+182, 58,225,169,211, 51, 4, 60,120,207, 19,124,107, 8, 87,207, 8,238,120,245,141,110,164,239,163, 67, 69,224, 58, 10, 91, 45,
+ 28,125,241,100,253,238,210, 10,233, 61,234, 85, 39,239,186,119, 33, 92, 97,134, 12, 16,200, 73, 49, 49,217,171, 87, 93, 49, 18,
+171,148, 63,252, 13,178, 61,187,227,114, 91,249, 13,245,228, 32,175, 98,248,116,230,194, 88,116, 89, 78, 14, 87,129,197,148,142,
+188,102,114,135,222, 53, 74, 99,148, 59, 44,173,210, 19,245,187,245, 1,219, 50, 12,157, 98,223,143,205, 43,134,186, 53,238,208,
+176,198,125, 13, 93, 20, 62,253,206,139, 15,171, 46,213, 35, 79,101,228, 52, 1,214,218,237,236,115, 32,136, 66, 39,154, 11, 61,
+ 38,217, 90,130, 56, 66,134,161, 99,179, 91, 8,163,196,129,132,148,241, 57,236,214, 91,240,180,167,147,233, 29, 59,123, 77,158,
+ 23, 46, 61, 78,104, 2,191,184,181,101, 65,153, 23, 20,163, 17,101,233, 52, 28, 54,176,216, 42,217,196, 56,225,158, 46,180,187,
+198, 89, 8,194, 8, 91, 20,196,181, 58, 11,157, 54, 87, 31,222, 67,150, 43,172,140, 73, 14, 28, 65, 28, 60, 12,221, 41,136,167,
+ 17,180, 28, 81,133,232,223, 28,196,226, 69,162,197,255,253,151,249, 55,183,253,255, 57,204, 69, 53,145,217, 49,149, 49,126,172,
+111,118,172, 58, 38, 29,123, 85,153,123,193, 39, 62, 68, 66,121,202,140,217,121,215,140, 27, 21,250,255,111,209, 47, 74,250,171,
+ 62,222,124,203, 59,184,245,182,247, 16,197, 78, 52, 23,198,174, 41, 17,194, 89, 99,203,194, 82,102,134,108,236,138, 9,235,179,
+203,181,246, 54,182,216,137,254,163, 90, 85, 11, 91, 2, 79,155,195, 59, 40,172,144,206,217, 35, 33,196, 53, 58, 66, 8, 2,105,
+ 29, 39, 62,118,105,145, 85, 60,172,242, 68, 71,180,139,136, 54,165,224,246,215,220, 1, 37,124,223,247,190,135,119,189,235, 61,
+220,121,231,157,252,192,187,239,228,189, 63,112, 39, 74,111,235, 16,180,118, 15, 71,112,195,201,248, 87,148,177,110,167, 46, 12,
+169,214, 20, 70,243,129,223,252, 56,203,159,254, 75, 46, 46,143, 89, 58,125, 1, 35, 12,167, 95,216, 32, 93, 91, 98,255,238, 69,
+212,236, 49,198, 15,125,158,217,189, 7,121,249,145,221, 76,231, 57,193,174, 5, 26, 73,204, 47,253,213,103,184,230,200, 46,142,
+205,119,249,198,179, 23, 25, 40,195,112,179,207,119,191,229,118, 62,241, 47, 95,230,252, 32,227, 93,111,127, 29, 15,125,235, 81,
+ 62,249,224,179,188,243,150,171, 56,117, 97,157,133, 78,157,165, 65,202,173,199,246,112,122,109,139, 68, 72, 54,210,156,149, 97,
+198,247,188,241, 86,166, 22,119,179,118, 97,133,178,204, 48,101,128,149, 25,217,176,207,101, 87, 93, 77, 99,215, 62, 8, 92,119,
+144,116,166, 41, 6, 3,162,118,151,205, 51,231,168,183, 35,100,220,246, 30, 90, 67,210,108, 17,212, 18,226,233, 5,108, 54, 66,
+132, 49, 42,203,136, 26, 45,100, 24,144,109,172, 32, 68,128, 20,154,176, 59,207,224,220,243,180,118,239,162,232,245, 8,106, 13,
+194,102,155,222,217,231, 73, 90,117,242,193, 24, 53, 26, 49,218, 88,102,239, 75,110, 38,239,109,249,176, 7,203, 51,247,126,147,
+195, 55, 92, 65,153, 9,172, 78,233,175,167,196,137,101,115,105, 29,107, 54, 8,226, 38,131,181, 13, 58,211, 1,245,169, 57,122,
+ 91, 2, 97, 54,168,119,102, 41, 75, 9,118,236, 10,142,233, 61,206,202,213,108,178,118,254, 41,100,216, 32,105,181,156,166, 32,
+146, 68, 73, 23, 25,105,142, 92,253, 90, 30,249,250, 63,179,111,247, 33,102, 23,230, 73, 26, 9, 38, 43,105,204, 76, 81,228, 67,
+ 14, 28,187,156,189,251,143,208, 93,220, 75,210,108,208,232,182,152, 57,113, 5,145,144, 52, 23,102,177, 86, 56, 22,187, 16, 60,
+252,237,207,210, 91,187,128, 49, 78,197,157, 27,207, 18, 17,219,103,133,177, 96,132, 37,240, 49,172, 80,129, 26, 4,133,218, 86,
+149, 10,239,101,246,113,207,206,115,233, 15,109, 85, 90, 84,233,172, 35, 81,236, 88,238, 73, 82,221, 15,208, 74, 80,228, 6,155,
+ 91,207,174,152,176, 33,221,255,205, 28, 49,202,104, 72,238,183, 60,250,117,205,165,212, 29,228,198, 79,126, 59,161,131,171,212,
+ 66, 24, 41,152,142,221,225, 30, 4,174, 8,121,215,143,220, 70,211,148,164, 27,155,168,205, 45, 76, 94, 48, 88, 79, 25,109,164,
+172,247, 75,214, 70,138,181, 84,243,229,213,146, 15,191,118,145,235,143, 5,180, 15,159,224,225,167,123,220,253,244, 58,207,245,
+ 53,143,158,238, 81, 62,254, 44,111, 57,220,226,172, 77,120,108,109,204,174, 88,114,104, 42,226, 43,203, 5,161,177, 92,234,182,
+184, 42,148,252,167,164,224,221,175,186,154, 93,211,243,252,233, 87, 95, 96,113, 38, 96,163, 52, 92, 90, 47,144, 65,192,177,151,
+159,224,185,175,220, 71,123, 33, 70, 90, 71,112, 11, 91, 29,100, 82, 35, 62,112, 21,201,194, 97,146,107,110, 35, 8, 20,118, 60,
+ 70,198, 17, 65,123,150,160,222, 34, 95, 93, 71, 93,124,222, 89,119,124,199, 82, 73,116,180,177, 72, 93,242,193,207, 62, 75,183,
+ 6, 63,125,199,229,212, 91,173,237, 64,150,192,121,106,173, 31, 19, 59, 17,151,152, 36,208,137, 48,242, 34, 36,137,181,218,117,
+246, 21,124,198,122, 8, 75,169, 17,145, 11, 60, 17, 85,200,180, 16, 78, 44,225,211, 94, 68, 28,249,108,128,128,218,209,151, 16,
+239, 57,238,151, 60,118,219,190,102, 12, 86, 23, 8,235, 14,110,157,141, 40,199,174, 75,183,214, 96, 61,118,182, 24, 14,156, 72,
+204,175, 5, 92,202,169,242,208, 29,124, 49, 2,129, 12, 93,174,187,144,104, 79, 31,195, 88,215,249, 34, 95, 52,162, 21, 30,160,
+ 32,195,192,217,238, 42,106,154,181, 19, 21,183, 12,228,196,234, 55, 41,120,140,179,160, 89,227,173, 87,210,145,197,170,216, 89,
+225,253,254, 66,138,237,226,196, 90, 63,174, 55, 88,229,138, 4,177,163,251,157,156, 99, 81,101, 35,117,201,123, 50,112,201,128,
+129, 20,222,215,110,209,218,169,248,221,234,217,108, 7,214, 25, 60,132, 70,161, 74, 69, 45,146,220,116,104,142,220, 4,132, 83,
+ 51,196, 87, 92, 5, 11,123,160,209, 65,200,182, 19, 63,238, 64,243,190,184,232,218, 17,187, 88,253,126,209, 33,254,239,141,229,
+255,189,238,124, 7,172,188,234,196, 39, 42,202,127,211,145, 79,254,236, 11,168,210, 11,114, 38,227,121,187, 77,182,155, 60, 96,
+225, 14, 86,130,240,107,149, 23,167,253, 25,163,185,238,198,183,242,133,207,126,144, 48,180, 52,107,146,110, 71,208,234, 6,149,
+163,221, 77,251, 51,215,101,151,202,137,127,135, 67, 75, 58, 50,120,105, 21, 97, 40,168, 37,208,108, 74, 26, 77, 65, 32, 5,194,
+ 74,194, 80, 78, 44,187,122, 71,168,139,181,134, 82, 89,178,145,166,223, 55,100,169, 33, 75,183,119,255,129,112, 9,113,210, 75,
+ 75, 78, 61,243, 28,214,194, 67,143, 60,201, 3,247, 63,200, 67, 15, 62,204,183, 31,124,152,167, 79,159,102,156, 22, 8,105, 41,
+212,118,202, 92,112,195,201,228, 87, 20, 6,133,255,166, 82, 82,107, 77,241,246,183,189,133,193, 87,238,226,250,119,189,139,175,
+127,238, 81, 46, 12,250,236,219, 61,205, 47,127,250, 33,222,125,251,141, 44, 63,250, 56,135,238,248, 14,206,124,245,110, 6, 79,
+ 62,194,212, 85,215,211,147,117,182,242, 49, 87,239,158,227,127,222,243, 56,131, 81,202,127,125,227, 75,120,244,244, 37, 30, 59,
+191,198,241,153, 58, 11,161,101, 53,213, 60,254,196,115,252,196,219, 94,201,151,191,253, 12,247, 60,127,129,249, 86,131, 70, 28,
+ 49, 80, 78, 65, 26,135, 33, 55, 30, 90,192,140, 82, 86, 10,205,187,223,112, 3,105, 33,177,104,242,116,140, 21, 5,131,245, 30,
+197, 40,229,208,241, 3,132,237, 41,234,173, 46, 50,105,160,149,101,253,236,105, 26,221,105,202, 97,143,246,254,227,232,124, 68,
+214, 31,160,138,140, 48,169, 81,230, 99,116,158, 19,214,155,200, 40,166,216,220, 32,153,158, 65,103, 57,113,179, 69, 57,206, 40,
+198,155, 36,157, 41,132,113, 45,122, 85,205,235, 34, 99,180,180, 68,123,255, 62,116,238,222, 40, 97, 0,245,233, 57,134,171, 27,
+ 4, 81,200,198,185,101,226, 80, 50,119,244, 56,151,158,122,218, 5,100,140, 7, 4, 81,157,241,242, 22,135,111,186, 30,149, 89,
+ 86,159,125,129, 67,215, 95,197,249,103,206,179,117,225, 28,221,185, 58,130, 6, 90,101,206,183, 45, 36, 83,251,175, 68,101,125,
+ 54,206, 60,207,160,127,145,118,103, 23,195,205, 85,106,173, 58,173,246,110, 6, 91, 43,236, 57,126, 45,217,198, 18, 74,148,204,
+236, 61,196,212,194,126, 22,143, 94, 78,103, 97,158, 50, 31, 18, 98,104, 78,117,153,222,187,151, 93,151,157,164,189,127, 23,182,
+180, 36,221, 58, 82, 5, 68,157,182,127,241,111,239,204, 30,188,247,159, 92, 24,134,113,105, 71, 74,187,131,178,114, 15, 87,233,
+ 73, 81,228,128, 8,198, 56,209,136, 86,206,239, 43,253,206, 60, 12, 69, 21,200,229,119,178, 16, 75,151, 87, 44,132,160,212, 56,
+ 69,170,117,157,122, 28,187, 96, 5,109,192,150, 6,157, 85,222,242,237,208,152, 80,128,205, 93,236,161,202, 32,236, 91, 86, 62,
+173, 56,147,185, 55,218,150,130,102,224,128, 42, 67,227, 84,161, 74, 67, 39,134, 65,233,238,127, 43,132,225, 8,126,228,231,223,
+ 10, 43,203,228,155, 61,116,127,132,210,154,209,218,152,222, 86,206,198, 72,145, 42,203,131, 27,138,127,248,192,117, 52, 59, 17,
+163,155,223,199,167, 62,250, 57, 6,171,107, 28,121,211, 27,217,247,186,215, 50,115,236, 0, 47,188,112,145, 39,159,237,115, 44,
+ 42,232, 16,176,146,212,216, 21, 41, 74, 33, 89, 26, 42, 94, 57,234,113,234,204,152,123,198, 49, 31,191,235, 49, 30,123,242, 28,
+113, 83,112, 38, 55,100, 90, 16, 9,104,212,106, 76,207,181, 57,245,212,121,226,205, 77,108,153, 57,166,125,173, 78, 92,159,193,
+108,173, 17,236, 58,142,136, 27, 4,179, 71,137,247, 28, 66,118,247,194,112, 9,139, 32, 63,117, 47,197,250,170,247, 60, 79,194,
+199,189,177, 75,240, 23, 31,191,143,199, 82,203,141,243, 9,175,124,233,229, 62,180,185,178,158, 85, 33, 45, 46,239,209,218,170,
+219, 54,147, 93,253,196,179, 46,133,255,138,219, 80, 26, 59, 25,191, 51, 25,253, 79,226,251,188, 42, 90,134,161,239,122,221,237,
+ 90,215,191,158,176, 51,231, 71, 60,162,146, 15,123,170,152, 87,186,151, 5,101, 81, 56, 5,119, 89, 32,133,116,239,195,178,164,
+ 44, 92, 26, 25,214,135,170,104,229, 64, 51, 82, 76, 64, 51, 24, 8,107,177,155,160, 43, 61,177,177, 85,234,120,172, 19,210, 73,
+ 41,221, 97, 17,120,101,190,181, 46,158,181,138,137,245, 98, 54,225, 15,106,163,118,164,129, 84,145,197,165,246, 84, 61,207,181,
+183, 14, 99, 90, 21, 88,210, 7,200, 24, 23, 41,232,190,183, 54,254,188,114,187,127,167,144, 55,254,251,224, 44,108,126, 42, 50,
+ 41, 50,172,251, 25,221,125, 50,254,103,223,158, 38, 88,235, 4, 48, 86, 56,177,160, 48, 22, 83, 22,100,185,230,230,110,128,110,
+116,169, 29, 57, 74,120,242, 42,152,154,131,168, 14,182, 62,177, 20,110, 31,126,190, 43,174,166, 39,149,120,209, 7,194, 76, 14,
+212, 73, 87,110,255,157, 3,253,223,142,233, 43,239,185,218, 22,191,189,104,204,206,139, 15,247, 42,138,204,236,216,155, 27,189,
+173,126,175, 48,113,136,109, 1, 29, 59, 95,119, 30,130,244,111,198,240,149,165,176,209,152,229,212,211,159, 35,169, 9,194,216,
+ 9,217,146, 72,210,108, 70, 78, 27,228, 87,143,214, 64,161, 12, 69,106,201, 82, 71,111,147,184, 49,125, 84, 19, 46,115, 61,112,
+ 26,147, 40,144,126,229,226, 0, 50,149,208, 24, 99, 49,165,113,162,244,212,208,219,212,164, 67, 40, 75, 75, 86, 56,199,145, 16,
+130,208, 8,172,242,218, 36,225,174,171,175,125,205, 27,121,230,153,231,208, 24,146,122,147,215,221,241, 6, 30,127,252,113,167,
+117,242, 67,174, 50,119, 38, 32, 71,230,146, 22, 29, 26,180,208,204, 47, 46,178,245,153,191,128, 56,161,117,104, 15,135,103, 98,
+174,152,159,231,211,207, 45,243,202,189, 83, 92,118,237, 53, 92,255,234, 91,120,250,163,127,205,254, 55,188,107,107,151,232, 0,
+ 0, 32, 0, 73, 68, 65, 84,133,107, 63,240,211,108, 12, 71,124,250,190,199,248,139,111, 60,201,190,233, 26, 11, 81,136, 38,160,
+ 39, 66,126,238, 29, 47,231,192, 84,139,191,249,242,195,220,120,211,213,164,163,140, 7,206, 46,179,180, 53,100,247, 92,135,147,
+179, 93, 78,175,110, 49,204, 10,108, 89,114,105,115, 64,145,229,204, 41,205, 74, 94, 50, 91,143,105,116, 23, 24,111, 93, 64, 74,
+ 67,156, 52,193, 74,218, 51, 51,200, 80, 18,215,234, 68, 81,140,136,234, 96,225,133,111,125,149,164, 22, 98,138, 49,141,217,121,
+140,202, 80, 89, 74, 82,171,209,152,154,162,204, 51,106,237, 14,227,245,101,194, 70, 29,140,165, 54, 61, 75,186,185, 78, 24,199,
+136,168,198,104, 99,157,198,204,156, 27,253,105,133, 78,115,172, 41, 72, 55,151, 65, 59, 88, 68,177,185,138, 16,154,149, 83,207,
+ 48, 92, 57, 69,186,185, 76,153, 13, 81, 69,206,202,115,103,216,117,217, 33,206, 63,250, 8,187, 78, 28, 39,235, 59,170,220,210,
+153,231,232,236,107, 83,100, 57,131,181, 53,102, 14,236, 98,227,194, 57,130, 90,147, 70,219, 32,137, 49,102, 72,210,156, 33,205,
+ 10,202,113, 78,148,212,233,173,156,167, 61,123,128,122, 61, 65, 54, 26,180,166,103,208, 26,182, 54, 78, 83,111, 69, 52,218, 51,
+ 68,211, 51,204,204,239, 70,155,156,230,204, 20,157, 61,123,168,207,206, 50,179,255, 40,135,110,124, 37,157,185, 61, 68,205, 25,
+108,156, 16, 4, 1,157, 67,199, 49, 74, 19,182,219,152, 34,197,106,231,135, 85, 69,193,117, 55,189,217, 97,152,133,131,115, 90,
+207,105,175,180,201, 21,251, 93,226,226,172,149,134,180,112,137, 74,133,114, 99,199,234,154, 30, 8,167, 42,109,182, 4,113,130,
+183,243,185, 47, 20,121, 43, 70,153,187, 74, 83,249, 40,195, 66,121,128,138,127,223,106, 13, 70, 25,164,133,192, 87,207,186, 16,
+152,212, 82,140, 44,229, 63, 40,206,103,238,126,142, 20, 44, 36,176,233, 23,255,177,191,246,200,192,253, 91,102,220,247,204, 13,
+ 12,129,176,149, 96, 50, 47,156, 74, 66,140,214, 12, 54, 51,122, 67,197,214, 72,113,113, 88,240,170, 27,247,145, 52, 2,254,229,
+ 83, 75,252,223, 63,242, 43, 92,247, 61,111,228, 53, 31,249, 40, 39,223,253, 30, 14,191,234, 21, 28,127,243,219,184,227, 15,254,
+128, 87,252,230, 47,115,239, 48,100,121, 88,176,124,105,196,115, 27,138, 91, 22, 98,214, 35,201,111,245,224,108, 2,101, 54,160,
+214,130, 52,129,213,210, 50,178,176, 97, 12,103, 21,140,145,140, 71, 57,195, 66,178,150, 89,210, 48, 33,218,123,146,238,137,155,
+160, 24, 96,211, 1,143,255, 63, 31,228,233,255,240, 10, 55,251, 19, 16,212,107, 4, 39,223,142,200,135,164,207,158,218,142, 60,
+173,124,201, 90, 33,133,228,235, 95,121,148,127, 92, 51, 28,172,195,143,190,229, 58, 63,237,246,234,117, 15,246,216,217, 39, 86,
+254,115, 25, 4, 19, 82,144,173, 68,120, 59, 83,119, 42, 72, 75,245, 77,119,248,205,237, 68,193,236,198,249,214, 88,231, 79,199,
+199,228,118, 23, 60, 28,166, 82, 67,107,199,254, 54,218,101, 5,148, 94,225,142,197,250,139,180, 83,147,151, 20,105,138, 49,202,
+113,180, 13,200, 80,122,158,123, 48,241,246, 58, 82,169,231,209, 91,215, 45, 27,173,188, 82, 88, 78,172, 87, 19, 56, 78, 24,110,
+107,181, 38, 34,174,202, 15,237,221, 23,149, 23, 31, 59, 17,216, 77,132,114, 94, 7,224, 84,252, 98,242,248,107,165, 38, 95, 10,
+175,196,119, 73,108,190,187,173, 86, 31, 81,228,178,196,165,179,190,133,158, 15,128,135, 7, 9, 31,158,226,138, 21, 95, 12, 84,
+ 42,127, 15,210, 81,202, 56,113, 99, 37,192,210,250,255, 35,236,205,163,109, 77,235,250,206,207,243,188,195,126,247,116,230,225,
+158, 59, 15, 85, 69,205,163, 69, 1, 37,197, 12, 34,216,198, 9, 67, 18,210,145,132, 21,117,117, 47,237, 94,203,213, 49,246,178,
+ 77,186, 77,162, 73,107, 86, 52,157,164, 87,130,137, 24, 65,204,138, 70, 81, 64, 81,153, 4, 10, 40, 10,168, 42,168,233,214,157,
+239, 61,247,204,251,236,225,157,158,161,255,248, 61,239, 62,167, 64,210,139,117,185,247, 86,221,161,206, 57,123,191,191,233,251,
+253,124,209,218, 81,121,248,238,227, 61,244,137,211,116,238,187, 31,125,235, 29, 48, 59, 43, 74, 47,159,189,140, 17,112, 80,216,
+237, 33,241,226,161, 21,249,244,238,173,254,127, 86,240,127,197,180,223, 60, 69,124, 16,211,249,102,213,222, 76,228,230, 96, 74,
+175, 43,166,121,205, 58, 88,220,154,216,200,166,128, 55, 55,188,186, 98,154,112, 50,253,115,236,116,181,239,125,253,109,255,165,
+214, 26, 30,125,253,251, 2, 47, 67, 73,160,148, 87,100,157, 88,106, 75, 91, 17,181,229, 73, 87, 85,158,114, 2, 54, 87,212,165,
+ 68, 15,235,176,173,136,188,167,152,120,242,220, 83, 77,124,152,234, 29,198, 91, 76,105,169, 3,101,178,174,106, 76,104, 72,108,
+ 56,223, 88, 47, 91,200, 68,100, 22, 68, 38, 4,199, 56, 61,237,121,156,247, 60,241,196,147,188,249,173,111, 38,106,117,121,221,
+155,223,202, 39,254,226,207,176, 42, 92, 31,108, 24,168, 28,232, 86, 26, 30,208,177,199,107,143, 87,142,187,238,127, 21,118, 52,
+ 98,246,212, 49, 62,241,191,254, 44,127,254,149,151,184, 50,216,103,117,245, 8,175,188,101, 13, 91,143,248,215,239,251, 57,206,
+239, 68, 92,250,230,101, 62,243,233,103, 73,142, 30,229,214,149, 30,111,120,197, 89,126,239,235,151,249,224, 47,188,151,163,253,
+140, 79, 63,123,133,185, 35, 43, 60,112,106,145,207,157,191,206,191,250,189,207,240,119, 95,119, 39,215,135, 57,255,246, 15, 63,
+203,255,248,170, 87,240,194,250, 14, 15, 30, 95,228,210,222,144,187,151,230, 40,173,231,145,181, 37,230, 23,122,220,118,124, 25,
+167,224,241, 63,251, 20, 71, 95,113, 15, 85, 62, 65,121, 43,204,226, 50, 39, 47, 10,180,210, 84, 69, 49,189,181,157,184,231,126,
+ 58,139, 71,105,205, 44, 98, 77,133,142, 83,178,153, 89, 72, 19,156,243,180, 58, 29,188,215,244, 22,151, 80, 73, 27,111,107, 84,
+ 18,147,164, 89, 32, 67,201, 29, 47,158, 61, 74, 61, 30, 19,105,240,174, 98,188,181, 67,127,245, 56, 58, 78,168,171, 2,239, 61,
+ 81,210, 34,235,246, 89,185,229, 1,180,142,200,102, 59, 92,121,250,121,250, 43,109,177,163,237,142,152, 12, 70, 84,149,167, 59,
+127,140,196,183, 88, 57,115,148,124,152,227,156,195,152, 17, 78,205,146,239,238,179,116,242, 52,101,105, 72,219, 61,172, 85,184,
+218, 16,165,194,200,118,182,164, 24,110,176,122,226, 21,248, 73, 73,167,159,114,255,235,255, 58,174,154,144,245,150, 25, 13,110,
+114,252,158,135,217,186,113,145, 94,127,153,213,115,119,176,112,226, 36, 88, 71, 57,222, 35,237,100, 68,177,102,225,236, 25,218,
+ 51,179,224, 99,116, 20, 81,237,238,163,179,152,114, 82, 99,204, 68,148,158, 58,162,215,159, 39,205,102, 41,236, 33, 62,114, 18,
+ 64, 8,225, 69,100, 67, 58,155, 9, 27,177, 50, 63,224,174, 91,215, 96,186, 15, 38,186, 56, 86,116,250, 18,127,154,245, 53,105,
+ 38, 34,146, 86, 44,111, 14, 13,168,144,155, 78, 45, 2,187, 52,172,132, 19,175,208, 86,163,141, 48,228,155,160, 3,107, 20,157,
+167, 44,151, 39,114, 43,175, 28,204,198,176, 89, 66, 91,195,208,192, 92, 44, 47,252,202,192, 98, 10, 71, 90, 48,151, 64, 47,208,
+154,178, 36,198,199, 82, 80,156,117,184,210, 81,148,146,143, 92, 90,120,113,199,241, 99, 63,253, 70,126,247, 23,191,204,139, 27,
+187,188,120,251, 26,119,191,247, 39, 73, 82, 81,232,235, 88,209,238,116,136, 76, 78, 43,139,121,213,143,191,143, 47, 31, 57,197,
+185,196,241,228,192,161, 21,188,247, 92,151, 94, 12, 87,107,184,102,100,147, 80,132,216,211,161,131,125,171,216,247,112,115, 84,
+ 98,116,202,206,230, 21,230, 86,103, 56,246,200, 99, 44,191,242, 53, 48,222,160,186,254, 18, 73, 84,241,125, 63,245, 27,108,173,
+143,177, 79,126, 8,218,115,144,239,130,217, 65,157,122, 39,222, 74,112, 73,163, 55, 82,104,240,154,107, 95,127,129,247, 63, 55,
+100,185, 5,239,188,123, 85, 38,179, 40, 80, 0,189, 11, 19,119, 16,178,133,102, 0,231,130,181, 56, 20,203, 80,216,155,184,213,
+ 38,114,118,186,178,158,114,230,221, 84, 12,166,149, 58,152,166, 26,218,150,115, 33,238, 52, 14,108,121,115,240,128,119, 33,254,
+212, 7,106, 91,240,197,123,107,241,166, 2,107,112,166,196,216, 16,182,226,154,108, 77,135, 53,246,224,166,170, 52, 81, 72,150,
+147,245,184,232, 10,234, 58,140, 62, 46,192,100,130, 13,173, 41,128,234,176, 32, 78,224,237,242,251,173,220,232, 27,196,156,111,
+110,182, 32, 73,140, 38,220,244,157, 23,188,107, 81,139,197,206,185, 32, 52,148, 70,196, 20,225,254, 29,166,109,103, 2,243, 29,
+ 97,132,120,156,228,212, 39, 17, 58,213, 16,203,215,195, 6, 11,158,136, 29,237, 1,182, 54, 52, 37, 62,184,130,154,143,181,209,
+ 10, 88, 83,163, 21, 76, 42,203, 67, 75, 29,226, 51,183,146,222,113, 55, 44, 31, 17,144, 12,201,183, 21,244,230,107, 44,172,128,
+102, 66,111, 86,228,230,192,135, 58,181,179,125,167,226,237,254,138,159,251,208, 28,216, 67,119,244,176,246,115, 70,190, 25, 43,
+ 2, 28,107, 2,181, 37,168,220,203, 92, 10,183, 58, 44,150,115, 82,212,203, 74, 10,187, 9, 69,222,148,193, 51,235, 14,130,214,
+253,193,199,214,108, 34,226, 88,196,142,119,223,247, 63,200,243,169, 29,145,117, 98,178,150, 14,144, 44, 77,218,210,232, 84,145,
+ 79, 60,195, 93,152, 12, 33, 81, 50, 73,215,185,104, 73,170,250,224, 25, 99,166, 22,122,143,173, 29,101,109, 25,236, 85, 12,135,
+ 53, 69,105,168,106, 75, 93, 89,137,195,245, 30, 99, 60, 74, 55, 11, 9, 37,247,124,171,228, 25, 20,150, 14,206,195,229,107, 87,
+121,254,252,121,126,240,135,126,144, 79,252,249, 39,185,185,177, 67,101,228,239,244, 62, 0,149, 37, 28, 73, 79,173,129,193,209,
+194, 61, 15, 61,192,232,234, 53,102,206,221,194, 3,223,251, 24,239,254, 71, 63,207,229, 43,215,120,230,197, 75, 36,113,196,198,
+139,207,241,217,245,130,229,123, 31,226, 31,253,167,143,242,127,126,224,163,124,229,241,175,242,187, 95,191,200,147, 47,190, 68,
+ 85, 27,222,244,115,255, 47, 15,223,178,198, 39,190,113,137,127,252,159,255,148,163,115, 61, 58,145,226,133,107,219, 44, 44, 45,
+242,214,227,243, 92,217, 29, 19,197, 9, 71,187, 45, 42,107,233, 42,197,196, 88, 78,245,219,124,121,125,155, 43,195,130,225,238,
+144, 94, 20,243,103, 79, 60, 79,177,179, 78, 89, 26,140, 41, 68,204,102,133,233, 76, 64,104,154,170,160, 24,238, 17, 37, 29,242,
+221, 77,246,174, 93, 98,176,126, 89,110, 85,206, 16,233, 8, 13,196,237, 46,202, 91,162, 78, 15, 95, 87,210,253, 89, 79,220,105,
+227,234, 66, 84,240, 71,143,227,139, 49,155,207,189, 64,212,237, 17, 37, 41, 89,127,134,114, 56, 20,166,179,145, 53,220,104,119,
+143, 40,129,108, 97,149,221,203, 87, 41,199, 53,147,237, 77,214,110, 57,205,197,175, 62, 67, 57,218,225,218, 11, 95,193, 81, 49,
+ 30,110,211,157,239,224, 76,155,122, 82,144, 15,247, 73, 59,125,118,183,111,146,102,226,135,150,247,100,140,181, 5,237,222, 12,
+ 73,214, 99,255,198, 37,122,115, 43,164,221, 14, 42,234, 97,117, 65,220,234, 50, 25,109,210,159, 63, 70,127,105,133,185,165,163,
+108, 62,255, 28, 73, 43,161,191, 48, 67,156,164,216,188,100,102,229, 24,206, 87,180, 59,179,116, 86,142,179,127,253, 6, 90,235,
+112, 47,172,137,162,136,186,178, 18,217, 23,117,166, 57,220,222,195,242,218,157, 18,144, 96, 14,132,172, 77, 30,131,157, 58, 85,
+ 60,181, 5, 99, 4, 15,107, 2,106,179, 44, 61, 85, 45, 41, 70,113, 72, 97,140, 91, 34,130,107,183, 52,173, 76,216,238, 42, 81,
+ 68, 40, 90, 33, 27,162,157, 41,210, 84,178,136,211, 52,194,107, 77,214,210,164,177,166, 21, 41,116, 13, 73,228,165,216,148, 30,
+ 55,241,236,189,224,233,103, 33,231,221, 11, 65,174, 27,139, 13,175,165,225,114, 17,222,223,192,184,134,157, 90, 26,128,194,192,
+137, 76,226, 26,189, 85,248, 96, 94,247,133, 65, 41, 17, 8,214,193, 18,167, 82,207,149, 17, 60,183, 7,255,234, 51, 31, 99,231,
+234, 5,116, 20,145,245,231,185,244,252,147,124,248, 3,255,140,107, 23,191,201,194,202, 42,187,181,230,103,251,123,216,180, 69,
+221,239,243,205,155, 57, 71, 86, 82,254,214,177, 54,251, 78,152,235, 35, 96,228,229,199,185,135,125, 5,198, 41,150,143, 44,240,
+ 7,239,255,109,222,248,198,219,184,253,251,190,143,197, 7, 30,130,189, 43,184,241, 62,245,104,159,129,173,176, 64,103,166, 77,
+113,245, 69, 40,247,161,213, 71,153, 18,149,236,178,252,247,127,125,154, 1,222, 88, 9, 7,215, 55,248,165, 47,108,224, 99,120,
+245,145,140, 71, 30,188,109, 90, 8,154, 41,177, 33,129, 53, 64,160,198, 87,172, 84, 3,151, 81,211,130,217,144,216,228, 14,227,
+ 56,112,185,201, 52,220,252,131,105,161, 80,210,188,121, 43,197,116,122,134, 49,246, 16,160, 38,152,114, 93, 19,211, 41, 35,138,
+242,158,122, 50,164,174,202, 32, 58,107, 97,141,197, 22,146,124,225,157, 17, 98, 92, 19, 32, 18, 30,100,205,116, 46, 76, 18,143,
+ 55, 14,175,253,212,190, 54, 93, 87, 7, 45, 0,232,144, 83, 82, 29, 82,234, 75, 67, 74,104, 50,228,125,225, 14, 9, 7, 15, 32,
+ 52,206, 57, 9,252, 49, 70,154, 93, 27,126, 30,128, 52, 77,113,247,138,176, 41,240, 97,186, 62,160,160,201, 58, 74, 86,189, 4,
+ 56,142,156,169, 85,200, 90, 87,211, 27,126,147, 30,103,173,108, 2, 60,128, 49,225, 38, 31, 44,118,225,155,113,158,219, 50, 75,
+118,230, 44,209,209,227, 48,211,131, 78, 87,176,175, 62,249, 14, 5,189, 57,178,153,151,217, 10, 15,204,223,223, 73, 40,231,255,
+138,169,253, 32,236, 71, 68,113,135, 0, 53, 13,135,215,218,131,130,236, 12,211,123, 95, 25, 38,240,218,200,247, 69, 57,165,120,
+ 6,150,182,124,220,101,142, 31,141, 26,171, 78,152, 50, 10,166, 55,193,170,154,166, 13,126,171, 18,222, 89,195, 91,223,249,127,
+ 17, 71, 18,200,210,235, 69, 68,137,150,231, 86,124,176,128,202, 43, 24,142,133,177,225,173,162, 46,196,178,214, 92, 7,116,128,
+ 17,213, 65,255,103, 45,212,149, 99,176,103,216, 88,175,217,221, 51,140,246, 45,249,200, 80, 20,134,162,116,148, 97, 51,105,140,
+111,184, 57,242,231, 25,168,173,167, 54,240,174,119,255, 45,126,244,111,190,135,247,188,247, 61, 60,242,154, 71,208,177,226, 29,
+239,252, 94,254,230,223,126, 15,170,209, 54,133,141, 39, 10,226, 72,201, 65,223, 91, 71,109, 21,177,246,156, 57,182, 68,244,216,
+155,217,250,250,227,124,249, 99, 95,167,158,187, 78,235,214,187, 57,126,233, 37,190,247,135,223,200,199, 62,240, 71,188,226,236,
+ 26,191,252,219, 31,227,201, 27, 91,220,190, 60,199,149, 97,193,127,120,207,235,248,212, 51, 87,249,216,115, 87, 57,183,208,227,
+119,190,244, 60,191,252,131,223,205, 47,252,215,207,242,153, 56,226,103,223,124, 63, 31,124,252, 89,126,229,247, 63,203, 47,254,
+216, 91, 73,127,247,147,252,206,227,207,242,158,239, 58,203,175,125,254,121,222,120,118,141, 63,121,113,157,119,220,115,154,203,
+123, 35,134,133,225,141,183, 30,227,179, 47, 94,231,210,229,117,102,151,214,184,126,225, 58,155,219, 91,116,122, 51, 84,251,134,
+124, 50, 17,193, 76, 49,161,237, 60,189,165, 35,140,110,174,179,116,238, 14,198, 59, 59, 44,159, 56,134, 45,115,226, 44,147,104,
+186,124,130, 87, 17,206,121,210,118, 15, 51,217,199, 84,181,184, 40,211, 4, 21,162, 13,147,217, 69,234,193, 54,237,185, 30,182,
+168,208, 73,130, 41,199, 68,190, 21, 54, 80,134,209,198, 38,155, 23, 46,115,242,222,123,184,252,181,175,211,155,155, 97,239,202,
+ 13, 98, 85, 19,165, 29,188, 87,244,230, 23,153,236,110,210,238,118, 25,237, 12, 89, 58,186,194,112, 48, 34,207, 75,156,141, 37,
+ 97,169,244,116, 22, 59,236,173, 15,233, 47,119, 40,203, 26, 48, 98, 51, 52,150,108,118,158,237,171, 79,210, 95, 58,137,138, 20,
+227,193,117, 90,237, 57, 70, 59, 27,204,173,157, 97,126,249, 4,206, 25,116, 75,147,181,123, 88,239,152, 12,246,169,139,130,253,
+173,171,204, 31, 59, 78,218,155,165,191,182,202,240,230, 58, 81,106,169, 75,133, 55, 37,217,194, 18, 94,131, 78, 82,234,170, 38,
+109, 69, 56, 11,113,226,121,237,155,255, 6,207,126,227,243, 76,137,159,225,253,226, 67, 16, 8, 86, 88,237,205,117, 76, 59, 80,
+ 78,201,166, 54,146,247, 96, 89, 74,156, 96,214,209,248, 72,147,198,160, 50,168,115,143,110,123,234,218, 17, 39, 98, 71, 73,194,
+116,151,180, 52, 81, 18, 84,214,177,166, 82, 34,128,138, 99, 5,149,199, 86, 13, 28, 77,177,244, 13,195, 87,114, 41,210,165,149,
+111, 90,203,154,189,165,101, 90,111, 74, 82, 55,112, 85,102, 98,177,182, 21, 78, 38,250,124, 52,146,253,127,228,160,170, 81,153,
+216,184,162, 72, 48,183, 19, 7,131,170, 67, 10, 60,117,122,153,185, 52, 35,207, 50,162,168,195, 7,126,237, 31,242,133, 47,127,
+ 9,235,225,227,159,250, 10,183,124,215,107,248,153,245,231,248,200,139, 3,198,115, 61,108,105,249,210,216,114,110,175,230,209,
+187,102, 73, 20,252,235, 75, 57, 29,160,163,229,243,166, 16,191,252,108, 10,147,209, 22,239,120,199,157, 28,125,228,181,180,143,
+172, 17,233, 10,175, 35, 76, 49, 65, 37, 17, 73,171,205,171,129,149, 51,243, 50,233, 76,118,195,243,114,140,143, 83, 90,167, 78,
+ 16,205,174,226,247, 55,169,106, 75,226, 45,191,242,137,151,216, 86,112,123, 27,254,206, 59, 31,146,134,174, 41,234, 65,145,221,
+ 76,119, 58,100,160, 79,173,104,145, 62,120,152, 43,125, 40, 35, 93,152,239,186, 17,139,121,139, 10,140,127,165,227, 48, 64,134,
+ 98,173, 27, 27,114,132,115,149,196,112,171,230,230,111, 67, 13,141,192, 22,162, 94,183, 86,114,217,131, 63,217, 24,137, 84,117,
+ 90,240,178,174, 42,131, 61, 75,138,173,210,209, 84,144, 54, 21,199, 25,135,234,164, 68, 13,213,205, 26,185,167,219, 6, 12, 35,
+ 19,186,138, 29,182,116,168,112, 59,215, 73,160,246,225,113, 85, 80, 77, 39,137,164,134, 5,144,143,111,210,218,124,131,198,245,
+161, 57,113, 88, 39,217,232, 56,135, 78,210,233, 58, 63, 10,242,230,230,212,224,157, 17,154, 37, 97, 59,100,108, 16,148,202,122,
+223,167,145, 52, 12, 62, 58,164,186, 15,125,143,115, 34, 36,181, 34,186,243, 78,238,242, 77,196,158, 19,223,105,184, 38,196,232,
+170, 96,241,212, 25, 88, 92,130,118, 10,105,231, 0,242, 18,136,111, 47, 95,189, 31,190,161, 55, 98,180,195, 43,115, 23,178,212,
+195,118,198,127, 39, 81,220,183, 20,249, 70,229,238, 15,221,193,155, 45,141, 53,161,169, 9,147,181, 57,244,115, 31,226, 91, 61,
+146, 73,234,226,131, 7,145, 51, 80, 11,198,215, 7, 65,162,206,186, 33,171,189,148, 19, 21, 72,145,143, 99, 80, 9,158, 26,165,
+ 15,154, 25,165, 53, 11, 75,103,105,183, 99, 58,189,136, 86,170, 2, 22, 91,190,183,178,240, 33,109, 9,216,105, 92,120,170, 2,
+ 12,158, 44,134, 52, 21,198,134, 69, 6,142, 68, 11,210,119, 50,246,212,214,177,187,107, 24,140, 28, 12, 60,157,174,162,151,202,
+122,190,200,101, 35, 40,197, 91,133,169, 93,145,133, 5,140,117,130,192,127,255,251, 63, 48, 93,213, 79,161,123,234,224, 37, 17,
+150, 99, 33,150, 26,116, 26, 69,196, 74, 19,121, 69,172, 52,206, 66,123,238, 94,218,173, 54, 31,251, 79,127, 65,103,110,142, 15,
+255,193,159,210, 27,141, 57,183,188,194,199,127,239, 83,228,147,146,135,239,191,133,170,170,232, 37,154,167, 54,118,121,242,202,
+ 54,127,113,126,147, 59,110, 63,195,114, 39,225,202,206,136,126,164,248,229,143, 61,206,191,122,247,163, 92, 88,223,225,227,207,
+ 92,226,181,167,150, 72,241,252,199, 63,250, 34, 63,240,216,221,140,119, 6,140,218, 93, 94,125,124,137, 78, 55,227,142, 35,115,
+124,245,234, 22,221, 36,101,127, 82,210,153,233,115,231, 98,135,122, 92,114,237,194,115,100,115,139,204,204, 31,165, 44, 42,234,
+ 90,222,252, 62,146, 46,176, 26, 15, 25,174, 95,165,189,176,194,246,197,243, 84,227, 33,233,220, 17,226, 52, 69, 71, 17,163,173,
+ 13,188, 43,177,165,248,251,108,152,210,147, 86, 27,208,140,119,182, 4, 40,163, 53,213,206, 77,246, 46, 95,101,246,204, 57,168,
+ 11,198, 91,155,164,221, 62,222, 89,242,189, 93,108, 93,160, 35,205,201,187,239,100,120,115,151, 88, 27, 76,229, 32,178, 44,157,
+190,149,193,205, 13,162,212,115,227,133, 75,248,196, 48,222, 47, 81, 84,212, 14,246,215,111, 82,215, 67,172, 29,208,202,186, 36,
+ 45, 67, 93,165,232,164, 34, 82,109,138,114, 72,148,206, 2,145,172,175,235,146,172,187, 34,171,113, 21,209,154, 89,228,212, 61,
+223, 77,148,212, 20,227, 1,229,120,159,164, 55,139,169, 75, 90,157, 57, 48,142,217,181, 85, 84, 26,227,108,142, 43,157, 76, 58,
+ 74,194, 54,214,159,187, 76, 49,222,167, 46, 36,170, 48,109,183, 81, 90,124,225,242, 62,117,212, 85,205,109,119, 62, 42,153,229,
+ 33,109,209, 29,228, 42,136, 50, 51, 52,221,205,251,205,132, 27,106, 89,129,169, 69,232,134, 13,197,189,144,199,135, 15,249,158,
+226, 73,215, 36,169,228, 11, 39,169,208,154,226,200, 7,180,179,208,158, 60, 78,172,110, 77,214,171, 86, 68, 78,110,239,186,112,
+236, 93,242,108, 23,176, 91,138, 77,205, 0,173, 72, 20,238,203,153, 8,249,250, 49,100, 33,209,205, 42,121,241, 87, 86,132,116,
+206,135,155,123, 28, 80,116,173, 20,213,138,137, 35, 69, 18,107,102,219, 26, 29,193,133, 63,126,154,139, 14, 30,121,229, 93,148,
+163, 1,117,145, 83,141,246,249,232, 39,191,196,218,202,157,124,238,230,105, 80,154,159,123,225,113, 62,244,213,109, 54,146,136,
+207,108, 78, 80,198,178,239,224,165,157, 10,149,192,171,239, 91,228,127,191,115,134, 19, 45,205,134,129, 93, 7, 67, 15,111, 90,
+136,249,177,187,230,120,211, 59, 30, 96,245,161, 87,209, 59,119,142,246,114, 15,148,193, 22, 57,222, 86,196,173, 54, 89,148,240,
+ 47,254,233, 91,232,220,118, 26,157,205,201, 46,176, 28,131,169, 81,213, 8, 95,109,177,244, 55,254, 15, 65,137,122,199,207,255,
+246,147, 92,168,224, 88, 2, 63,245, 78, 1, 64, 53,247, 87, 81,179,135, 67,111,220,172,185,165, 16, 79, 87,235,214, 78,149,195,
+ 83,174,118, 28,208,165,145, 20,148,233,221,188, 41, 14, 86,124,141, 30, 65, 93,249, 16,177, 39,194,180,120, 58,181,121,107,240,
+ 69, 62, 85,197,131,147,156,245, 72,135,194, 44, 15,245,120,138,151,181, 56, 83, 73,254,121, 19,212,130,158,222,200, 69,224, 33,
+250,129,230, 69,169,211, 84, 10,165,115,184, 0,200,137,116,132, 78, 68,208, 4, 26,173,117, 16,168, 73,138,154,156,197, 67,222,
+186, 86,216,128, 90, 61, 36,166, 6,219, 8,235, 36, 71, 94,208,181, 58,220,255,197,139,175,211, 24, 21,136,138,214,123, 73,141,
+115, 70,144,178, 97,155,225, 3,109, 94, 69, 26,103, 28,166, 62, 8, 90,240,222,227,141,232,121,228, 44, 36,236,121,140,132,138,
+ 88,107, 37,218,213, 57,129,206, 56, 41,228,206,186,224, 96, 80, 24, 21,113,118,190, 3,253,190,252,185,105,235, 16,127,221, 3,
+ 21,222,151,225,222, 92,133,111,223,178,114,247,223,186, 86,215,255,125,129,251,183, 21,244,239, 96,109,107, 80,178,211,137,253,
+144,146, 61, 82, 7, 34, 78, 1,167, 31, 20,120, 99,164, 25,176, 14, 95,213, 2, 9, 50, 6, 87,228,216,253,125,204,112,128,175,
+106,108, 94,134, 91,123,216,122,140, 71, 7,127,214,183, 9,230, 60,183,221,249, 14,218,237,136, 36, 9, 5, 61, 86,211,224, 24,
+135, 19,175,122, 8,113,201,173,163, 48, 30,175,157, 76,214, 65,124,111,131,205,183,178,142,178,114,236,237, 90, 54, 55, 45, 91,
+ 91,150,141, 45,203,214,166,229,250,186,101,107,203, 49, 26,138,189,215, 84,210,238, 89, 3,117, 41, 77, 67, 97,164,129,170, 11,
+ 97,131,136,190, 72,148,241, 13, 30, 63, 77, 15,233, 91,213,193,243, 53,110, 71,154, 81, 41,112, 8,173, 97,113,110,129, 56, 89,
+167,246,150, 55,254,208, 15,242,233,143,124,130,239,123,221, 93,108,230, 53,159,255,242,121,126,226, 87,126,138, 79,254,155, 15,
+242, 23,207,221,228, 53,103,151,185,246,228, 62, 71,218, 17,221, 94,155, 63,127,230, 18,191,249,185,111,240,163,247,156,226,157,
+119,156,224, 87, 63,253, 77, 22,250,109,190,120,101,135,127,254,174, 87,243,235,159,120,154,213,149,121, 30,213,138,199, 47,239,
+240,196,249,155,188,235,209, 59,248,195, 47, 62,199,143, 60,118, 23,191,250,145,199,121,236,174, 51, 92,222, 30,134,164, 36,207,
+ 98, 47,225,146,142, 89, 93,238,211,137,219,236,108, 94, 67,199,154,118,187,197,104, 8,137,242,212,147,154, 36, 49, 36, 89,135,
+ 36,107, 81,142,118, 73,187,125,162, 56, 34, 74, 91,228,123, 3, 58,237, 21,188,181,116,214, 94, 65,181,189,137, 78,192,149, 69,
+240,144,182,185,246,228, 23, 56,249,170, 71,169,134, 19,226, 94, 31, 95, 37, 56, 91,161, 85, 76,212,235, 99,182,119,200,122,125,
+ 76, 53, 98,188,125,131,164, 53, 79,148,182,240, 46,102,247,250, 58,107,119,156,226,218,211, 23,201,250,154,218, 20, 76,214, 39,
+232, 72,209,233, 45, 65,189, 69,183,155,160,146,121,118,174, 93,195, 26,143, 27, 79, 88, 88, 89,166,200, 75,218,115,139,220,120,
+238, 37,150,143,119, 41, 93, 77,210, 89,160, 30, 12, 48,213, 38,174,101,217,187,121, 25,180,199, 84, 5,237,217, 89, 34, 29,177,
+191,125,157,180,189, 72,146,143,233,173, 30,193, 26, 67,149,239,177,116,244, 52,237,185, 89,138,193, 30, 90,139, 8, 42,237,204,
+162,146,136,209,214, 22,147,205, 13, 86,110,187, 27,231, 42,242,193,132,228,200,172,116,251,214, 18,197, 41,120, 43, 14,129, 56,
+ 33,214,138, 31,125,235,219,121,254,202,243,124,241,233,243,211,109, 91,124,232,197,171, 36, 80,141, 72,123,156, 11,201, 96, 90,
+133,219,162,162, 54, 80,228,144,181,193, 20, 30,157,138, 71, 83,200, 87,144,117, 84,152,124, 32,107, 43,210, 76,160, 41, 90, 67,
+229, 28, 70, 43,185, 21,162, 80,169, 40,230,125, 14, 45,231,136, 47,123,158, 43,229,191,197, 43,232, 42,216,179,144,134, 97,192,
+ 88,249,185, 53,208,138, 3, 35, 57, 88,243,186, 17, 12, 3, 58, 54, 42, 45,168, 56,224, 87, 99,162,128,121,138, 19,133, 25, 58,
+ 86,186,138,207,127,230,235, 12,128, 59,111, 63, 73,177, 47,241,158,152,156, 61, 11,127,248,213,111,240,203, 43, 17, 63,240,170,
+ 87,242, 47, 62,127,137,167,252, 13,226,194, 50,246,138,182,130,235,132,105,127,232, 56,115,207, 12, 15,174,205,179,118,124,155,
+237,237,156, 52, 82,204,246, 90,204, 28,153, 97,238,150, 83,204,221,118, 7,237, 99, 39,200,150,103, 33,213,184,237, 77,124, 89,
+226,124,141,142, 82,204,120,200,241, 31,254,219,140, 95,248, 10, 81,175,143, 47,135,226,139, 78,218, 33, 65,171, 67,235,248, 93,
+124,248, 47,174,240,145, 23,175, 19, 71,112, 91, 15,126,242,123,238, 97,102,166, 47,170,118, 4,168, 34, 91, 80,133, 15,156,124,
+ 20, 7, 5, 53, 22, 15,162,196,117,170, 3,198,182, 23,144,191, 15,185,233,132,175,157, 68,241, 29, 82,206,155, 32, 20,115,117,
+112,142, 88,228,208, 34,222,107,239,100, 61,110,118,215, 73, 22,142,224, 85, 5,196,242,235,146, 36,112,203,139,144, 57,110,195,
+148, 43,163,136,248,204,229, 99, 16,107, 24, 18,100, 98, 85, 0,232,132,164, 53,107,136,226, 20, 31, 5, 76,108, 99, 59, 11,118,
+ 60,101, 68,140,215, 52, 52, 74,201,180, 52, 21,194,105,143,175, 61, 74, 9,177, 45, 78, 82,168,101,107,164,130, 37,138, 52,150,
+116, 52, 26,129,188,159,110, 15,148,245,144, 52,154, 18, 63, 37,210,249, 58,136,235,106,137, 20,244,181,136,192,188, 22,100, 40,
+206, 9,242, 88, 49, 21,191, 41, 35,106,121,231,101,184,142,104,154,160,144, 86,232,152, 38, 59,250, 16,172,162,163,136,204, 26,
+ 90,179,115,242,166,141, 35,185, 77,171,228,192,129,160, 14,243,249, 15, 21,108, 26,205,128,123,121, 1,126, 89,172, 26,223,193,
+195,126,248,215,248, 67,152,216,230,255,204,203,127,153,179, 47, 87,189, 55, 58, 9,117,232, 80,124,160, 24, 59,216, 24, 4, 65,
+143, 55,181,232, 24, 42,131,179, 5,170,182, 40, 21, 67,156, 96, 71, 35,162,222,140,112,141,226,112, 31,140, 98,177, 75, 70,233,
+203,236,109, 15,191,230,231,121,242,241,143, 3,154,184, 89, 6, 52,205,149,151,103,156,113,142,210,136,200, 77, 71, 65, 70, 24,
+ 88, 29,104,133,173, 61,149,177, 2, 47, 43, 96,127,207,178, 55,176,228,185,199,148, 80,228,142,105, 86, 75,165,200,199,225,124,
+ 25,190, 53, 0, 25, 23,222, 87,214,203, 6, 52,214,112,223,189,247,242,224,125,119, 31,144,117,129, 15,254,214,127,166,110, 44,
+190, 7, 9,149, 41, 45, 85, 81, 7, 69,225,194,194, 18,155,255,237,131, 44,220,114,146,211, 63,248, 70,230,239,185,135, 63,254,
+192, 31,240,153,175,126,149,145,138, 56,255,181,175,241,224,247,191,129,232,249,155,188,239, 55, 63,202, 98, 22, 51, 42, 12, 30,
+ 77,165, 21,119, 47,207,240,204,141, 93,156,142,248,181,247,188,158,255,242,103, 95,229,223,127,246,155, 60,177,218,231,123, 31,
+ 60,195,135,191,240, 44,167,143, 44,112,247,234, 12, 95,185,116,147,249,185,179,188,246,129, 51,124,237,234, 54, 63,254,182,135,
+248,203,167, 46,177, 55, 24, 49, 40, 74,238, 94,157,103,125, 84,176, 21,197,164, 74,113,254,133, 23,152, 91, 61,198,112,176, 67,
+153, 23, 68,174,162,246, 50, 25,216,114, 36,113,144,104,146, 86,139, 40,201,168,203, 18,147, 15,177, 85,129,247,142,238,226, 50,
+118,188, 31,162, 31, 59,232,180,205,254,165,231,233,174,157, 96,238,232, 81, 72,250,224,135,232, 40,102,184,125,141,229,219,110,
+101,124,243, 58, 42,214, 36, 89,202,230,133, 11,180,123, 29,146, 44, 35, 74, 18,226, 36,227,250,243, 23,209,170,194, 90, 77,153,
+231,244,230,231, 25,141,247,177,101,194,112,112,137,217,181, 91,209,164,168,164,195,214,181, 75,236, 94,218, 96,238,204, 12, 43,
+167,110,163,156,140,169,138, 9,197,112,151,254, 92, 74,111,249, 40,155,151, 55,200,102, 58,224, 43, 58,115,199,133, 70,228, 28,
+206,213, 36,157, 89,140,171, 73,186, 61,218,115, 75,180,186, 5,221,185, 37,174, 63,251, 36,139,199,110, 69,199,109,202,201, 22,
+203,179,119,160, 72, 40,134,155,100,189, 57,186, 75, 75,244,151,142,224,156, 33, 61,119, 43,237,185, 62,163,237, 45, 58,243,243,
+ 2,188, 48, 86, 30, 88, 65, 84, 20,199, 49, 90,195,220,204, 60, 15, 47, 29,227, 77,119, 63,196,179, 23,126,149,193,222, 24,244,
+193,251,173,209, 18, 17,208,173, 81, 36, 47,240,198,229,169,163, 64, 56, 50,114, 91,143, 90, 26, 91, 43, 8,120,196, 40,130,220,
+ 41,201,118,198,139,117, 43,112,190,173,149,238,222, 7,114,140,211,160,236, 33,125,118,237,121,241, 9,203,118,121, 40,181,209,
+ 67, 59,146, 27,117,132, 20,109,239,165,160,119,244, 84, 63, 53,197,221,102, 26,142,165, 80, 94,187,137, 74, 84, 88, 47, 39, 56,
+ 59,162,221,137,137,149, 34,139, 52,243,153, 38, 29,229, 28,157,209,124,254,207, 62,207,223,122,199, 15,179,113,115,140,141, 60,
+191,243,163,119,113,174,117,138,199,213, 9,126,226, 23,255, 29, 51, 9, 24, 37, 19,120, 91, 43, 46, 79, 74, 22, 58, 45,198,133,
+129,200, 83, 86,158,217, 83,203,180,151,230, 56,237, 28,222, 69,164,189, 30,237,133, 21,210,163,199,104,173, 28, 37, 93, 93,130,
+ 86, 11, 63,218,198,185, 28, 87, 21, 33, 22,212,160,108, 37, 78,142,213,115,224, 12,110,180, 7,105, 42,146,135, 60, 66,233, 20,
+ 98,197,211, 62,165, 5,156,238,192, 79,188,253, 94,102,103,251, 1, 14,166,167,225, 36, 42, 0,100, 36, 62, 85,135,226, 43,235,
+ 72, 23, 48,175, 81,152,114, 85,227,211,214, 97, 61,219,212,248,131,205,189, 8,200,180, 14, 2, 73, 2,137, 77,225,172, 21, 43,
+ 28, 14,156, 20,103, 29,126, 94,109, 92,164,125,238,254,105,172,170,169, 75, 18,239,208,173, 12, 21,197,184, 60, 15, 43,247, 92,
+242,225,117, 68,156,166,228,195,145, 76,184, 1,101, 59, 21,240,185, 90,190,134,198, 17,121, 37,192,150, 88, 86,217, 62, 8,234,
+180,142,167,112, 22,240,248, 40, 14,174,228,176,150,215, 42, 20, 26, 29, 68,127,160,147, 88, 86,220, 77, 24, 72,176,147, 73,230,
+185, 15,162,209,122,202,195, 23, 78,128,154, 90, 61,124, 16, 32,218,170, 10,201, 44, 34, 22,244,166,134, 72, 99,170, 90,222, 83,
+173, 86, 80,213, 7,156,178,150,105,181,185,191, 11,178, 20,156,138,208,205,103,221, 29, 8,228, 26,167, 0, 74, 97,117,196, 82,
+190,143,141, 23,136,188, 19,161, 89,154, 74, 81, 53,145,200,173,189, 2,101,190, 37, 46,213, 77, 69,139,130, 42,251,239,212,241,
+111,155,204,213,183, 76,244,135,115,210,221,161,109,124, 88,253,153, 74,110,222,198, 4,249,182,159, 10, 16, 15,120,238, 94,198,
+ 81,107,166,103,147,198,159,238, 66, 68,114,227, 38,176,181,216,247,116, 43, 35,153,111, 99,198, 57, 42, 46,208,173, 12, 63, 42,
+ 80, 89, 39,220, 14,191,221,118,215,235,159, 70, 5,184,133, 53, 54, 52,129,242,186,177, 86, 84,234,182,161,187, 21,146,119, 51,
+181,198, 39, 42,184,239,100,226, 30, 27,203,112,224,216,222,118, 76, 10, 79,153, 75, 6, 59, 70,238,231, 10, 37,122,165, 58,104,
+ 3,235,112,206, 52, 18,179,106, 67,248, 85,208, 83, 98, 61,220,123,231, 93,124,232, 67,191,131,113, 22, 21,123, 34,127,144,165,
+174, 17,180,172,114, 16,189,225,238,254, 47, 12,139,154,202, 89,140,119,188,254,173,239,166,119,241, 37,246,138,121,242,103,254,
+136,254,137,121,110,123,224,117,252,208, 15,189,157,211, 89,202,169,147,171,252,211,255,240, 39,156, 95,191,193,171, 79, 44,113,
+101,119,204,106, 43,162,221,235,242,240,173,183,240,165, 11,151,169,173,227,252,230, 30,159,126,238, 58,127,253,209,219,121,244,
+228, 2, 55,183, 6,124,228, 27,215,248,145, 87,222, 74, 43,210,108,143, 75,238, 60, 50,207, 71,191,126,129, 88,107, 92, 89, 51,
+172, 29,189, 68,115,255,173,107, 88,227,105,165, 41,155,251, 19, 34, 5,115, 89, 66, 84, 22,220,250,192,131,108,111,222, 68,199,
+ 49, 69, 97,184,118,241, 10,143, 60,246, 40,217,252, 18,214,137,162, 43,157,157,197, 59,133,142, 99,146,206, 60,202, 25,162,172,
+ 29,194, 58, 10,162, 36, 65, 39,169, 88, 61,226,136,209,205, 29,102, 79,158, 96,255,202,121,218,243, 75,216,178, 98,188,113,157,
+206,242,154, 68, 20,230, 57,213,164,162, 28,237, 97, 43,195,120,103,147,133,147,107,120, 82,242,221, 93, 22,207,158, 97,231,226,
+ 37,188,181, 36,169,166, 46, 13,163,193, 54,237,110, 6,222, 96, 77, 68, 81, 84,212,227, 29,226,246, 42,118,114, 21,218, 29,234,
+137,195,185, 10,103, 99, 58,179, 41,206,181,201,247,115, 76,109,105,117,193, 89, 77, 20,183,104,247,231,196, 18, 99, 61, 89,119,
+158,186, 30,179,116,244, 22,198, 59,235, 20,249,144,165, 83,119,144,205,206,113,245,155,143,147,181,103, 88, 58,123, 43,189,149,
+ 37,246, 55,111,210,158,153, 71, 41,205,220,177, 53,170,124,140,171, 43,112, 80, 14, 71,120,107,105,117,187, 68,137, 76, 72, 30,
+ 35, 15,122,173, 36,192,162, 24, 51,124,226, 35, 84,186,197,219, 78, 45,240, 71, 79, 63, 55, 21,158, 38,161, 75,213, 10,142, 46,
+175,242,166,215,188,134, 43, 55,111, 82,215, 85,112, 83,136,104,196, 5,239,185, 87,146,186, 38,140,101, 81,194,107, 45, 94,118,
+103, 37, 75, 61, 78, 20,105,248,247, 34,174, 10,226,165,138,105,172, 99,100, 65,229,158,100,232,169,158,179, 60, 51, 16,193, 89,
+ 29,114, 31, 38,225, 13,144,132,116,198, 88, 75,241,206,253,129,160,100,223, 4,251, 72, 4, 75, 9, 60,120,174, 79,231,216,178,
+228,166,187, 26, 95,212,228,163,138,106,191,164, 54, 30,109, 61, 55,107,120,118,219,242,202,239,185,157,183,221, 86,178,248,197,
+223,160,253,129,223,230,191,253,241, 38, 31,254,220, 11,124,245,207,159,160,223,215,172, 59,207, 40,132,222, 68, 74,177,231, 20,
+ 75,237,152, 19, 29,197,169,147,179,244,102, 5, 55,220, 89, 90,162,213,155,163,189,178, 74,231,228, 25, 58,103,206,145, 29, 63,
+ 69,188, 48, 11,157, 20,202, 17,126, 50,192, 85,114,111, 37,146, 93,155, 86, 74,172, 93, 73, 18,138,146,158,122,152,181, 22,101,
+143, 79,225,228,194, 42,187, 95,248, 28, 63,253,174,251,105,181,146, 41, 36,102,106,229, 10, 60,120,149, 70,135, 82,174,154,127,
+ 39,223,235, 0,153, 17,165,245,129, 23,219, 7, 76,105, 51,173,123,231, 15, 18,184, 8, 94,234, 72, 75, 52,105, 3, 76,105,104,
+115, 74,133,182, 76,152,242,188,108,237,124, 0, 0, 32, 0, 73, 68, 65, 84, 42,105,209,185,237,225, 16,111, 90, 72,134,189, 49,
+ 68,105, 26, 66, 87, 36,100,197,154, 74, 86,247, 74, 68,113,166, 42,195, 3, 47,164,170, 1,105,214, 10, 76,122,225,159, 71, 90,
+ 5, 53,127, 52,213, 0,248,233, 64, 25, 50,224, 21,211,236,119,172, 11,126,100, 23,108,210, 82, 32,117, 67, 90,242, 34,238, 83,
+177, 96,119, 93,136,108, 37,248,231,157,245,178,161, 80,138, 36,138,209, 58, 88,211, 84, 32,199, 5, 97,158,175,202,112, 6,177,
+ 7, 49,175, 86, 88,242,141,184,209, 53, 66, 71, 77, 40, 0, 70,254, 59, 66, 60,172,142,162, 67,214, 59, 63,253,188,248,233,157,
+ 76,136,118, 11,245,144,164,215, 7,239,132,104, 23,199, 83,123,162,220,170,125, 24, 13,237, 1,150, 85, 55,158,112,243, 29, 6,
+241, 67, 19,120,211, 77,163,190,229, 23, 29,198,202,234,160,120,175, 15, 56,238,166, 22, 19,118, 85,203,125,174, 42,229,199,101,
+ 41,150,198, 34,135,186, 14,100,196, 3, 0,141,183, 54, 20,118,135, 55, 6, 95,215,120,107,166,130, 65,241,131,203,231, 57,106,
+117, 4, 97,236, 29, 58,107, 99,243, 9,202, 90, 84,175, 31, 94, 39,209,203, 62,184, 40,210, 92,191,252, 95,168,171, 29,156, 19,
+143,191,169, 28,181,113,228, 19,199,112,228,217,219, 11,138,116,201, 44, 34,235, 74, 49,141, 82,104, 37,106,250, 90, 26,143, 37,
+ 39,125,123,203, 51,158, 32,118,184, 66,200,156, 85,117, 32,232,199, 40,124,165, 72,188, 70, 91, 69,236,229,189,226, 14,148,124,
+ 98,227,213,176, 48,191,200,246,214, 38,214,148,196,250,192, 1,104, 2,250,190, 73,162,141, 94,117, 87,231, 23, 70,149,193,160,
+169,106,207,163,223,253, 6,110,237,246,249,226, 7,126,159,217,187, 30,197,238, 95,101,239, 51, 31,100,251,179,127,130,169, 21,
+ 39,142,180,249,234, 51,235,112,203, 29,252,193,231,158,224,204,226, 2,175, 62,189,204,133,107, 55, 57,127,109,157,168,213, 98,
+ 82, 86, 44,247, 50,242,202,240,252,198,128,212, 43,190,235,212, 50, 11,221,140,143, 61,117,153, 27,195,130, 71,206, 29,225,169,
+ 75,155,220,181, 50,195,141,221, 17,243,189,140,157,193,152,187,207, 28,229,147, 95, 61, 79,167,157,178, 61, 41,153, 73, 19,246,
+243,154,251,142, 47,113,254,165,235,156,186,235, 4,113,156, 97,140,220,237,246,110,110,112,236,216, 60,199,238,123, 13,227,205,
+107,204, 28, 59,139,138, 51, 76, 62, 18,129, 87,218,150,160,135,170, 38, 74, 83,116,214, 70,121,141, 51, 18,150,144,116, 50,108,
+149,163, 85, 68,156,181, 80, 90,179,123,229, 18, 51,171, 71,216, 58,255, 34,202, 67,214,239,113,254,243,159,103,241,244, 26,144,
+162,124, 77,107,118,137,205, 11, 23, 81,113,204,112,107, 27,107, 5,138, 81, 85,134,170,170,137,116,202,252,234, 42,187, 55,118,
+201,243,117,210, 86,135, 86, 39, 67, 69, 25,198, 84,116,103, 22,153,236,111,208,153, 93,102,127, 99, 11,175, 12,222, 24,146,110,
+ 15,111,170,176,174,139,232,206, 47,160,116, 74,123,102,150,253,157,235,104, 29,209,106,119,105,247,231,169,170, 28,147, 23, 28,
+187,231,126,138,253, 93, 54, 46,126,147,197,163,167, 88,189,227, 94,210, 44,163,204,135, 88, 91,179,118,199, 61, 12,214,175,211,
+234,245, 25,109,239,145,116, 50, 90,157, 14, 81,214,193, 57, 67,146, 68,196,113, 34,197, 3, 33, 34,121,231,169, 6,215, 25, 62,
+251, 37,146, 44,198,213,142,209,205, 75, 92, 43, 42, 9,239, 10,111,219,251,206,222,202, 79,190,237,135, 57,154, 36,188,241,212,
+ 41,254,228,133,111, 76,239,236, 26, 37,164, 57, 47, 63,110,167,144,182,228,213,152,182,244, 52,157,173,129, 68,197,137, 34, 75,
+181, 32,103, 35, 77,164,161,158,120,121, 30, 4, 17,174,114,224, 74, 71,188,231,249,250,215, 28, 27, 53, 83,122,218, 56,172,175,
+ 82, 45,161, 51, 82, 88, 97, 96, 68, 28,151, 70,242,107,230, 91, 7, 48,172, 91, 59,176,178,214, 99,237,222,179, 76, 54,119,161,
+168,240, 85,133, 29,149,216,194, 76, 7,133, 23, 10,199,157,137,226,221, 75, 3, 62,252, 75,159,226,211, 95,220,227, 11,123,154,
+ 42, 82,184, 8, 70, 49,108, 27, 97,226,239,251,192,155,215,138, 36,142, 88,142, 45,119, 46,181, 56,178, 54, 75,255,232, 42,237,
+197, 37,162,246, 44,237,149, 35,180, 79,221, 74,118,236, 20,241,242, 42,106,166, 47,221, 72, 89,224,139,137,172, 19,243, 34,160,
+ 88,195,202, 88, 71, 65,101,238,167, 48, 24,149,102,168, 72, 60,235, 42,105,131,182, 44, 31,187,139, 87,236,124,102,234,181,110,
+ 64, 27, 13, 67,124, 26,182,226, 57, 88,195, 42,166,241,170,226, 39, 63,224,102,235, 40,136, 18,194,125, 91,135,248,214,198,222,
+164,195,244,115,240,247, 53,240,143, 38,209,173, 17, 99,185,240, 49, 4, 91,148,175,233,221,251,198, 48, 61, 74,206,183, 10,103,
+163,102, 59,208,100,152, 91, 83,163,163, 24,103, 13,245, 36, 15,196, 58, 1,201,104,173,137,146, 88, 50,199,195, 58, 57,138, 98,
+116, 28, 17,105, 45,161, 42, 54,248,171,155,167, 31, 7,130, 63, 97,213,135,213,245, 33,244,102, 20,178,187,149, 86,146, 20, 24,
+ 69, 83,127,191, 53, 70,148,248, 38,196,183, 86, 34,118,139, 18, 1,221,168, 36, 10, 91,227,208, 16,132,226,228,144,134,193, 59,
+137,114,117, 83,198,187,155,126, 14,197,154, 30, 78, 28, 8,169, 78, 55,160,155,208, 12, 43,229,131, 86, 1,177,249, 58, 66, 8,
+ 77, 88,191,199, 17,157,209,206,212, 46,166,194,231,131, 64, 2,124, 25,208,165,185,157, 59,127, 32,100,115,246, 91, 10,250, 33,
+ 26,156, 58,184, 55, 79,163, 84,191,109,253,238, 15,221,211,141,116,231, 62, 40,220,155, 66, 94,150, 7, 1, 45, 13,101,175,129,
+229,148, 5, 62, 12, 51, 1,137, 40,155, 36,165, 14, 53, 47, 72, 97,119,114, 98,113, 38, 88,238,194,153, 41,202,218,232,180, 37,
+ 13,113,218,194, 78,198,232,158,164, 95, 54,194, 64, 21,160, 91,162,132, 79,185,122,249,163,161,129,130,201,200, 49, 30, 58,242,
+202, 49,216,151, 59,120, 89,202,157, 59,138, 37,217, 45, 73, 21,113, 16,213, 17, 94, 62,251, 3,199,230,134, 39,159,248,208,171,
+120,202,176,148,144,105, 94, 4,167,218, 42, 18, 52, 29, 52, 29, 21,209, 66, 97, 14,105, 24,180,130, 8,129,109,189,246,177,215,
+242,192,125,247,114,207, 61,119,115,247, 61,247,113,239, 61,247,241,196, 19, 95,159, 10,230, 84,208, 19,198,165,177, 88,175, 56,
+121,242, 86,138,124,135,108,116,153,151,190,248, 18,179,186,199,159,252,218,127,230,117,127,247,175,177,246,246,247, 18,149, 3,
+174,254,199,255,194,199,126,227,203,220,179,112,146,223,248,203,199, 33,138,169,117,196, 7,158,188,192, 15,220,182,198,137,153,
+ 22,159, 95, 31,241,244,122,205,137,197, 57, 30,108, 69,252,233,249,117,158, 84, 3, 74,165,232,225,121,245,217, 35,248,218,240,
+155,127,249, 77, 30,123,197, 49,250, 89,202,169,190,101, 60, 41,184,101,101,134,103, 47,174,243,214,251,207,241,151,223,188, 76,
+156,182,168,172,167,155,106, 94,218, 24,208,110,167,236,111,108, 19,103, 25,160,152,140, 38,228,149, 33, 65, 97,202, 9, 73,214,
+145,233, 91, 41,161, 49, 57,133,169,114,162, 36,166, 28,237,147,246, 79, 96,234,240, 48,168,192,150, 5,113,183, 77,218,202,100,
+237,220,233,227,202,130,221, 11, 23,200,122, 45,178,110, 70,171,223,102,231,234, 58,115, 71,142,178,115,249, 34, 43,183,221,199,
+222,181,139, 68, 55,174,179,117,229, 60,253,133, 37,188,133,164,213,162,178, 21,219, 87,110, 48,115,100,142,172,223, 99,227,202,
+ 21,122,243,115,108, 94,186, 73,178, 20, 99, 74,139,181, 57,249,126, 65,210,217,166, 59,187, 68, 62,222, 39, 73, 34,122,157, 25,
+ 74,165,168,135, 19,234,122, 64,146, 46, 81, 84, 99,242,253, 13,122,243,231,136,146,152, 56,105, 73,234,147,110, 99,234,154,229,
+147,183,113,243,252, 83,212, 69,193,100,119,155, 72, 41,226,172, 79,177, 55, 4,111, 41,246,118, 81, 58,166, 46, 74,170,193,136,
+206,220, 60, 43,231,206,177,123,237, 50,179,107,107, 50,201, 68,169, 52, 36,113,138,181,150, 52, 77,228, 70, 27, 41, 38, 55,206,
+ 51, 28, 12,233, 44,175, 80,232, 49,111,234,204,241,165,237, 33, 62,128,103,140,243,188,251,225, 55,176,125,227,138,216, 93,119,
+ 54,136,155,116,196,192, 66, 54,129, 44,167,156,128, 25, 90, 29, 39, 23, 54,109,233,247, 35, 92,192,201,166, 94,238,130,101,225,
+165,227, 13,214, 14,237, 21,190,114,104,231,101, 37, 31,238,189,234,138,101,163,130,110, 34,171,244, 81, 24, 42,218,145,120,211,
+173, 15, 43,119, 15,203, 45, 41,230,214, 65, 79,195,184,146,194,110, 60,244,187,154,199, 63,121,129, 87,190,239,251,136, 34,141,
+109, 73,225, 76,103, 82,226,157,136,158,177, 12,246,225,150,182,226, 27,185,231,167, 63, 58,224, 61,119,118,216,223, 40,136, 75,
+ 24, 57,207,142,241, 76, 60,140, 61, 76, 66, 44,137,241, 48,118,158, 62,112, 91, 47,226,232,114,135,222,210, 12, 89,127,129,108,
+102,145,236,248,105,146,165, 21,244,236, 34,244, 58,178,238,172, 10,168,114,252,100,132,173,114, 92,153,139, 79,121,106, 47,107,
+188,224,200, 58, 55, 10,115,157,169, 65, 59,116, 58, 47,239,236,214, 28, 94, 45, 72,242, 86,160,152, 57,235,209,113,184, 81,198,
+ 7,182, 69, 29, 86,197,226, 4, 11, 92,241, 38, 26,202,137, 40,174, 41, 56, 82,236,157, 40,228,157, 23,143,185, 53,232,144, 31,
+ 46, 5,223,162,226, 88, 78, 29, 28,162,176,133, 66,238,188, 67, 43, 11, 42, 66, 97,177,147,125,156, 49,168, 88, 54, 9,182,174,
+209, 73, 58, 45,158, 58, 73, 73, 59, 29,172,173,240,101,129, 69, 60,227, 77, 98,163,214, 26,175, 35,226, 36,150,166, 71,213,225,
+254,169,112,182, 34,206, 18, 89,165, 6, 97,155,173,205,180,135,113, 58,232,194,144, 73,186,121,192,187,160,124, 86, 78,164,197,
+206,134, 25, 63,172,222, 81, 30, 99, 44,174, 18, 69,189, 41, 75,140,147,201, 17,149, 16,225, 66,118,188, 59, 64,198,123, 11, 58,
+104, 0, 28, 88, 91, 19,197, 73,176,248,217, 41,236, 71,225,167,195,175,115,193,239,223, 8, 16,195,154, 63,138,195,230,196, 49,
+ 21, 24,250, 96, 47,180,182, 34,210,201,180, 72,215,227, 33,186,215, 11,193, 53,242,251,146, 40,158,230,185,139, 34, 60,188,161,
+ 85,124,192,127,110, 38,106,107, 27,214,243, 1,181, 77,249,111,185,177,235, 32,172, 83, 7, 29,118,147,174,214,172,221,157,196,
+193, 82,215,210,193,231,121,176,172, 21,184, 60, 71,181, 18, 48, 6, 87, 84,168, 52, 70,107,209,102,184,170, 66,167,226,170,105,
+154, 21, 9, 20, 34,144,249,106,108,195, 65, 8,241,206,222,129,171,106,220,100,136,139, 37,230, 87, 39, 9, 36, 41,218, 89,252,
+ 96, 23,181,116,228,144,234, 95,130,123,156, 53,204, 47, 63, 70, 62,246,164,137,216, 18,247, 7,150,189, 61,139,177,142,124, 44,
+231,179,218, 31, 90,108, 52, 58,194,248, 0,211, 90, 15, 29,131, 93, 79,145,135, 41,189,150,181,125,179,154,111, 2,228, 60,138,
+ 86,164,192,200,247,189, 68, 99,106, 79,229, 60,198, 90,148, 22,187, 91, 28,174, 56, 31,252,173, 15,160, 34,153,168, 28, 80,212,
+211,240,196,105,255,100, 29,232,202, 27,140,179,228,227, 29,138,114,196,140, 77,120,238,194, 22, 79,220, 92,231,137, 27, 99,254,
+248, 3, 31,231,194, 31,126,146,171, 79, 95,227,196, 99,111,228,187,126,228,157, 60,248,174, 31,224, 39,223,114, 23,223,123, 98,
+158,119,156, 93,224,150,163, 75,108,150, 53,255,254,137,139, 44,116, 82,222,124,118, 25,106,199, 11,219, 35,222,114,106,153,133,
+ 86,194,151, 46,111,241,212,198, 30, 30,168,149,231,199, 95,127, 23, 69, 81,242,169, 75, 91,228,237, 54,115,115, 61,158,219,158,
+160,210,136, 43,219, 35,238, 63,115,132,213, 94,202, 94, 93, 17,197, 9, 46,139,185,144, 91,158,248,220, 87,209,145,163, 24,239,
+ 17,197, 30,167, 52,149,169,112,222, 18,183,103,209, 89, 23,103, 42,177,185,196,145,100, 8,231, 19, 58,139,171,120, 60, 81,148,
+128,245, 68,237, 30, 73,183,135,138,219, 20,195, 33, 73,167,199,120,253, 10,166,202,153, 89, 93,166,213,155,161,202, 39,164,221,
+ 30,163,205, 45,242,241, 46,115, 71,142, 49, 25,108,211,155,159, 67,165,179,204,205,205,177,116,226, 36,163,193, 46,222, 59,116,
+148, 50,186,185,193,218,153, 51,140, 6,187, 88, 91,147,244, 58,168, 36, 35, 78, 91,212, 6,210,172,143, 78,103,240,213,182,196,
+142, 70, 25, 73, 47, 65,183,122,184, 81,137, 87,178, 18,236,204,205, 16,235, 25,234,114,159,241,254, 6,173,206, 12,117, 93,226,
+ 48,180, 91,109,242,253, 77,218, 11, 11, 84,229,152, 52,237, 48,220,184, 70, 54, 51,195,236,210, 9, 70, 27, 55,240, 56,138,253,
+ 93,230,214, 78, 72,248, 68,162,169, 70, 35,136, 60,173,110, 15,188, 36, 15, 69, 90,139, 48,172,121,129, 55,221,184,135,226,234,
+243, 92,123,252,203, 88,175, 72,226, 12,250,243,180, 7,226, 17,143,128,133, 78,135,201,104,130,170, 39,120,111,217, 92,223, 66,
+133,120,211, 88, 73,193,208, 22,108, 1,213, 4,138,137,103, 52,176,228,133,195, 76, 60,147,137, 5,237,228,243, 16, 43,218,109,
+153,160, 76,160, 35, 53, 89, 15,218,202,218, 29, 11,149,245, 84, 10, 54,118,101,205,253, 82, 14, 87, 10, 89,187,143, 29,236, 84,
+144, 91,249,111, 24, 59, 41,230,185,147, 58,214,137,165,216, 30,235,200,243,121,100, 96, 96, 60, 23,215, 43,201, 81, 12,159, 3,
+157,197,196,105, 76,167,155,208, 75, 99, 86,231, 18, 78,117, 99,214,186, 17,221, 4, 94,204, 61,157, 44,102,162, 97,228, 21, 70,
+ 41, 10, 20, 37, 98,147,243, 10,170, 84, 51,113,240,214,142,225,161, 51,125, 78,223,119,134, 99, 15,127, 23,139,175,126, 45,179,
+223,253, 54, 90,175,184, 29,189, 56, 3, 20,176,119, 13,182,175,225,246,110, 96, 7, 59,216,124,140,203, 71,248,224,103, 22,222,
+186,168, 95,189, 62, 80,138,123,219,124,181,226,144, 42, 33, 77, 84,161, 87,248,201,185,101,178,219, 31, 58, 16,184,133,198, 64,
+ 10,189, 66,163, 2,110, 85, 26, 46,225, 76,203,109, 93,169, 38,221, 77,138,185, 40,226,133,235, 78,152, 50, 9, 83,161, 82,209,
+212,210,229,141,153,230,170,171,102,138,114, 1, 20, 20,192, 48,202,135, 31,187, 90,234, 66, 93, 99,139, 97, 72, 67,137, 2,254,
+181, 10, 19,171, 76,198,186,213, 22, 21,123,156,136, 47, 56, 8,171,148, 82,104, 29,211,157,157, 37,233,117, 15, 68,101, 74,161,
+163,132,164,213, 22, 49, 90, 36,249,241, 83,210, 94, 8,219, 16,182,166,155,194,113,252, 97,230,186, 11,197, 67,107,162, 56,146,
+ 70,202, 56,208, 2, 20,177, 86,238,215,117,145, 79, 9,119,246,240, 45,218, 57, 92,101,194, 61, 60,216,145,234, 58,132,192, 4,
+212, 43, 97,171, 96,195,246, 66, 41,137,239,156, 78,243, 1,221, 29, 52, 16,206,155, 3, 43, 93,243,191, 0, 76,170,107, 59, 93,
+241, 59, 37,226, 57,111, 45,118, 82, 96,138, 9, 85, 62,193,212, 5,245, 96,135,106,103, 11, 70, 3,152,140, 68, 17, 94, 79,130,
+133,172, 10,208,151,234, 80, 94,121, 37,107,114, 27,252,227,254,144, 95,221,219,151, 39,169, 53, 43,123, 87, 7,171,218, 33, 90,
+156,179, 7,160,152, 60,135,201, 16, 63, 26,224,203, 2,133,195, 12,246, 48,227,137, 88, 24,247,247, 48,147, 49, 84, 53,190,174,
+177,121, 33, 27, 8, 43,141,131,107,196,128,193,254,167, 2,204, 72,249, 70, 34,233, 3,216,199, 96,138, 2, 55, 30, 75, 3, 17,
+ 39,232,197,229,151, 5,187,248,201, 8,182,183,167,228,192,118,123, 9,235, 60,101,110,201, 39,142,209,190, 99,119,199,113,227,
+154, 99,107, 3,198,195,240, 41, 10,182,250,170,106, 78,136, 80, 86,142,114,226,200, 11,207, 36,135,253,161,151, 0, 42, 43, 44,
+ 28, 83, 11,177, 14,171, 80, 33, 51, 67, 43,232,164,138,110, 28,209,141, 53,153, 86,116, 18, 69,150,200,217,178,209, 49, 58,235,
+ 41,107, 57, 51, 26, 39,223, 55,226,204, 41, 50, 34,108, 42, 99,235, 61, 73,234,216,218, 93, 71,227,233,222,246, 16,175,248, 46,
+197,187,126,229,251,249,189,159,248, 89,254,237,151, 94,228,183,158,253, 36,111, 56, 62,203, 71,158,187,201, 63,248,161,215,242,
+204,141,167, 57,125,114,133,135, 31,125,128,231, 94,186,202, 27,206,174,240,141, 27, 91,252,216, 99,119, 51,174, 29, 79, 95,217,
+ 96, 38, 82, 44,205,164,124,242,218, 54,195,188,100,190,221,102,125, 92,178, 89,108, 49,223,110,241,149, 27, 47,113,100,190,199,
+253,167,150,121,230,242, 22,235,147,138, 59,150,103, 24, 43,207,182,205,217, 28, 71,172,206,116,184,179,219,226,234, 94,193, 78,
+ 81,176, 58,211,230,249,235, 59,188, 90,165,120,213,194, 89,137, 41,180,149, 40, 53,189,149, 67,133,111,248,192,113,130,210,137,
+ 60,168, 90,125,204,254, 54, 58, 77,209,145,162,216,217,162,206,115, 58, 26,226, 78,155,106, 60, 32,155,153, 99,243,226,121,150,
+207,156,229,133,207,126,154, 91, 31,125,140,107, 79, 61,141,110,105,138,193,152,180,221,101,255,242, 58,253,213,121,182,175, 94,
+103,110,101,141,107,223,188, 76,167,147,209, 93, 90,224,202, 83, 23, 57,251,224,221, 92,123,225, 34, 85, 49,162,149,181,217,223,
+ 94, 39,202,192,121, 67, 49,153,128,218, 35, 77, 61,179,171,167,168,203,148,114,176, 77,127,101,142,225,214, 30, 73,150, 82,238,
+239, 16,181,219,100,189,101,174, 63,255, 28,243,199,150,136,116,194,104,103,157,181,179, 15,179,123,243, 89,116,156,128, 82, 12,
+ 55,214,177,117,205,104,111, 3,175, 45,221,217, 53,210,153, 30, 42,213,148,227, 49, 62,240,180,139,189, 1, 11,167, 78, 51,188,
+113,147,201,246, 46,113,146,200,138,211, 67, 49, 25, 81, 23, 19,230,150, 87, 14,108, 75, 97,189, 30,107,153,230,242,205, 77,178,
+118,196,220,109,103,240,191,255, 53,212,172, 60,187,142,247,231, 41, 39, 99, 34, 44, 9,138,141,241,136, 52,168,218,227, 96,123,
+115, 78,216,240, 88, 79, 61,129,220,123,108, 71,203,196,150, 40, 20,154, 56,213,164, 25,100,237,132, 36, 6, 83, 59, 90,145,194,
+185,136, 36, 18, 18,153,115,158,202, 59,233,253, 29,220, 68,214,236, 39, 58,176, 87,201,155, 35, 15,176,176,149, 4, 38, 30,250,
+ 41, 88,167,216, 46, 60,186,134,249, 12,226, 22, 92,201,161, 23, 54,192,223,220,243,180,198,134,193,214, 46, 81,146, 80, 15, 71,
+168, 52, 35,233, 84,244,142,244,130,133, 11, 90, 89,196, 67,145,108,199, 63,117, 33,231,157,183,119,200,199, 14, 27, 59, 38,181,
+164,202,149,120,118,209,108, 20,142,119,173,182,248, 59,223,127, 59,167, 95,247, 32, 11,119, 63, 72, 52, 51, 47,221, 73, 89,227,
+ 7,151,241,102, 50,181, 22,121,149,224,181, 64,135,132,146, 22,204,255,222,225, 76, 40, 56, 74,139,144,208, 40,188,146, 98,170,
+130,210, 91,244,110, 17,180,102,136,151, 31,224,127,249,158, 55,241,113,167,248,233, 23, 47,209, 5,161,150, 77, 89,238,178,118,
+245,138, 67,109,126,216, 2, 52,188,109,149, 4,191,183,132,183,200, 10, 93, 77,197,201,205,134, 64,148,230,225, 22,175,226,198,
+ 68, 29, 20,230, 77,253,116,193,250,168, 15, 30,190, 1,210, 65, 32, 57,150, 87,158, 39,190,227,149,224, 3,146,184,174,240,214,
+ 76, 55, 1,104, 77,164, 91, 1, 50, 83, 79,167, 94, 21,124,243,196, 17, 90,123, 92,160,103,201,160, 24,116, 8, 72, 3,162,117,
+132, 11,129,193, 74, 71,225,174, 29, 10,245, 20, 83, 43,183,120,165, 84,184,207, 26, 72, 35,153,170,148,216,154,168, 17,226,157,
+ 1, 83, 87,210,136, 52, 22, 41,239,195,246, 43, 10,108,115,113,216, 4, 9, 97, 16,161, 73,128,139, 68,214,134,207,183, 14,244,
+ 54, 29,133,207,249, 1,129, 85,104,179, 33,211,157,176, 95,117, 90, 16,162,234,224, 12,162,148,220,232,181,142,193, 90, 92,172,
+ 5, 97, 26, 43,236,104, 2,253,126,208,167, 84, 48,218,147, 30,170,149,202,118,195,246,160,229,100,106,143,226,131,169,124,234,
+ 4, 8,104,216, 40, 9,103, 11, 29, 62,190,224, 51,159,158, 50, 14,111,232, 27, 95,125,168,126, 58, 58, 80,133, 21, 99,236,254,
+ 8, 91,149, 97,250, 14,201,122,117,133,106,165, 96, 42, 76, 94,160,226,132, 72, 75, 19, 23,153, 8, 84,140, 15, 52, 58, 63,205,
+ 86,247, 47,211, 22,136, 82, 93,194,113,240, 21, 42,169,228,246,158,231,168,254, 76, 0, 86,244,240,206,192,112, 8,219, 91,112,
+233, 42,254,238, 59, 81,139, 75, 36,105,151,186,138,113,153,195, 20,142,193,190,103, 52,134, 97, 14,229, 68,174, 6,161,180, 76,
+ 11,174,181, 1,132, 5, 24, 45,233,148,249,196, 81,215,161,167, 14,162,125,121,121,202, 38, 35,110,150, 27,141, 20, 62,108,203,
+146, 72,113, 16, 39,115, 32, 72,205,235, 32,135, 64, 28,122,141, 22,209,187, 41, 10, 98,218, 92,196, 94, 43,137,123,211,160,156,
+166,211,155,199,181, 75,134, 23,159,225,149, 63,252, 58,146, 94,159,127,252,137,175,241, 19,255,243,223,228, 47,255,193,175,147,
+160,184,180, 55,226,215, 63,247,204,244,235,216,209,144,197, 9, 95,190,188,205,184,182,244, 98,205,177, 94,202,137,133, 25,254,
+218,237, 39,232, 70,240,153, 23,111,176, 89, 58,246,198, 5,214, 24,110, 89,154, 97,115,103,200,239, 93,217,228,236,242, 28,111,
+189,101,149,175,221, 28,130, 82,108, 77, 42, 78,207,205,179, 50,119,147,205,170,102,101,105,158,157, 97,202,238,164, 98,223, 58,
+158,121,234, 89,206,158, 61, 65,173, 68,185,170,147, 22,174,174,104,205,174, 30,172, 15,241, 68,105, 70, 61, 28,136,133,170, 46,
+240,120, 76, 57, 1,171,104,205,204, 50,220,218,161, 61, 95,147,102, 25,187,235,235,116,102,250,120, 3,227,221, 29, 90, 89,139,
+201,254,144,124, 52, 32, 77,186,180, 98,197,104,119,192,104,176, 67, 54,219,165, 24,237,179,175, 29,198, 79,152, 91, 92,102,111,
+125,135,164,229, 41,234,154, 56, 74,217,185,114,157,213,179, 43,196,173, 53,146,120, 76, 28,119,240, 46, 33,223,189,193,145, 51,
+183,224,125, 74,158, 15,101,109,170, 82, 84, 58, 64, 69,125,170,226, 26,189, 46, 56,163,104,117, 34,176, 41,113, 71,138,250,169,
+ 7,239,226,242, 51,127, 78,127,229, 20,229,222, 6,113,156,176,176,118,134,124,119, 11, 87, 91,230, 78, 29, 37,237,116, 80, 90,
+ 9,222, 54, 73,193, 41,121, 8, 89, 71, 54,211, 15,180,173, 68,132, 62,129,134,149,100, 93, 17,217,120,137,117,117,117,152, 72,
+ 38,251, 44,158, 60,198,112,123, 64,178, 58,135, 51,142,181, 36,226,186,117, 36, 10,206,204, 45,224, 76, 65,172, 45,182, 44, 24,
+216,130,182, 82,152,224,205,117, 86,238, 65,222,122,116, 44,183,162,220,133,113, 77, 67,145, 40,210,150, 34, 73, 53,113, 34, 55,
+118, 29, 43,178, 56, 2,167,197,143, 94, 6,203,142,145,217, 77, 43,133,137, 61,203, 71, 20,209, 11,158, 43,185, 24,100, 26,161,
+108, 28,193,182,133,173,137,252,253,247,173,181,121,253,253,139,252,200, 15, 63,194,147, 95,122,158, 95,254,205,175,115,108, 22,
+250, 73, 88,209, 71, 48,208,240,226,227,231,185,245,254,179,212,197, 4,103,106,162, 94,151, 22, 30, 95,148,196,169, 34,205, 13,
+105,166,105,197,154, 91,231, 99,190,112,173,164,211,143,217, 24,122,198,214, 49,114,138,101, 15,127,239,225,101,126,244,191,254,
+ 49,201, 98, 13, 87, 47,224,214, 47, 99, 7,187,248,225, 64, 44, 80,182, 20,159,183,146,181,180, 87, 26,180, 9, 55,104,145,175,
+202,228,235,197, 14,134, 15, 28,239, 8, 76,130,143,133, 24,166,106,131,143, 82,148, 78,209,221,101,116,103, 14,235, 45, 23, 30,
+255, 40,255,250,227, 79,112, 28,120,246,233,175,241,170,183,188, 5,115,241,233,169,182,201, 91, 27,238,199,118,154, 28,230, 27,
+ 43, 67,152,178,189, 49, 16,133,123,122, 19, 8, 18, 80,158,222, 25,233,114,100,239, 47, 73,110,141,221, 72, 53,150, 46, 41,162,
+ 62,216, 35, 60, 90, 50, 20,132,237,139,142, 99,156, 49,232, 56,198, 91, 79,241,252, 23,233,222,241, 32,168,136, 72,199, 84,174,
+198,155, 74,232,113,206, 4,209, 83,130,210, 81, 72, 97,147, 38, 70, 28, 98, 65,148,161, 98, 81,199,251, 92, 68,126, 81, 44,247,
+251,192,102,240,166,154, 50,195,157, 59,216, 56,120, 99,241,145,150, 48,149, 0,118,113, 97,203,228, 76,133, 47, 37,100,133, 36,
+149,169, 49,172,197, 61, 14,231,165,184, 88, 35,194,142,131,220,121, 31, 8,119, 33,165, 77,107,148,181,146,225, 30,232,115,178,
+149, 86,211,201,210,163,160, 62, 8,150,105,104,112,205, 68,175,144,102,217,151,181, 52,228, 73, 60,253,103, 40,127,128,178,245,
+146, 23,175, 52, 24,107,195,246, 66,220, 11,186, 81,194, 56,133,247, 21,182,180, 56, 29,163,109, 77,100,186, 2,165, 73, 93, 48,
+ 66,171, 3,194,137, 59, 20,188, 18, 16,181, 52,167,160,195, 74,119,117,200,162,214,192,247, 27, 95,152, 11,147,127, 93,225,135,
+ 67,170,193, 46,166, 10, 44,246,128,243,197,131,170,170,131,188,122, 43, 80,160, 40, 73,165, 40, 54,218, 64,235, 69,131, 84, 75,
+ 70, 64, 19,127, 43,104, 97, 43, 74,248,160, 77, 80, 86, 50,234, 85,154,200,250, 47, 77,153,222, 8, 77, 77,253,197, 47, 18,245,
+123,178,181, 10,205,109, 20, 39,114,210,156,200, 10,125, 50, 22, 59,154, 9, 65, 85, 10,217, 44,106,237,167, 30,113,135, 20,115,
+173, 69, 20,103, 92,248,186,134, 15, 95,251,166,176,171,112, 94, 9,171,119, 39, 89, 6, 85,228,136, 93, 32,212, 77,157, 12, 18,
+196, 84, 91,143,241,112,203,185,179,188,246,181,175, 36,205, 50,172, 87,228, 69,197,127,252,205,223, 66, 7, 70, 81,195,123,138,
+ 21,146, 40,163,195,223, 26,247, 50, 94,252,226, 19, 60,255,251,159,226,150, 89,184,113,179,166, 44,114,218, 45,197, 32,202,120,
+255,151,159,231, 27, 59,251, 66, 43, 10, 39,166, 78,150,177,152, 40, 30, 60,121,132, 79,189,120,141,185, 52, 98,175,118, 92,185,
+186,197,248,165,155,172,246, 51, 30, 88,158,227,193,153, 54,145,130,167, 55, 71,108, 12,199,220, 50,223,229,109,183,173,240,249,
+235, 67,126,239, 27,215, 89,238,164,236, 21,134,149, 44,225,123,238, 61,197,205,209, 38,145, 83, 12,205, 14, 38,118,232, 56,226,
+ 68, 39,230,197, 75, 79,178,186, 60, 27,214,180,134,178,168,192, 20,210,181,235, 8, 48,168, 36,149,104,194,172, 67,212,238, 80,
+238,108, 17,247,103,193, 90,242,225, 54,233,236, 34, 73,164,240,214, 16,101, 61,182,207,191,132, 59,177,130,138, 60,123, 87,174,
+115,252,190,251,184,248,149,167,232, 47,206,176,191, 57,100,118,237, 8,155, 87, 55,233,205,182,176,214,146,101, 25, 30, 77,130,
+162,174, 61,219,151,110, 64,188, 67,127,246, 36,181, 27,208, 95, 60,137,194,145,239,238, 17,117, 28,197,100, 68,150, 69,180,142,
+156, 68, 69,154,178,168,193, 64,154, 41, 38,163,125,210, 36,163,172,198,212,166, 38,235, 47,178,179,126, 9,167, 82, 76, 61,196,
+251, 57, 34,157,224,234,146,118,127,150,200, 69,196,237, 30,149,169,137, 90,109, 6, 55, 46,144,182,187,244,215,142,163,188,165,
+213,235,225, 76, 65,150,205,210, 89,153,103,120,253, 6,221,249, 69,218,115, 51, 76,246, 6,242, 32, 86,130,158,140,146,132,186,
+ 44, 14,238,162,190,133, 11, 28,246,114,176, 75,123,113,158,253,237, 77, 22,150,103,153,140, 74, 30, 56, 62,203, 53,187, 75, 26,
+105,142,247,231,160, 42,240, 89,130, 31, 15,185,126,125,155,172,163,169,189,248, 56, 29, 94, 32, 50, 74,161,157,172,144,156, 85,
+ 20,149, 71, 37, 80, 20,142, 86,169,104,117,132,159, 30, 39, 17,113, 28, 76,107, 70, 77,211, 88, 76, 41, 27,102,109,229, 88,237,
+ 12, 84,177,162, 8,154,152,110, 12, 57,178,118, 79,128,141, 49,252,234,251, 30,230,213,175,185,157, 52,203,200,139,146,225,222,
+128, 87, 62,116,142, 15,221,113,148,127,254,239, 62,205, 83, 87, 39, 44,245, 96,179,130, 94, 15, 62,242,167,223,224, 31, 62,118,
+ 7,227,253, 25,212,100, 52,189, 47,183, 42,139,142, 75,146,196,208,238, 38,244,231, 91, 44, 15, 42,206, 29,201,216,221,173, 97,
+ 53, 35,237,104, 78,158,156,227,142,159,251, 37,146,219,222, 66,245,229,223, 98,242,169,111,162,235, 33,166,242,148, 58, 34,238,
+247,137,211,150,124,238,243, 28,159,102,104,231, 32,109,201,165, 83, 69, 83,192,138,194,203,180,110,188, 76,180,141, 3, 40, 40,
+110,209,145,132,242,116,230, 80,157, 69,116,103, 14, 63,217,198,235,121,142,221,253,118,250,192,145,118,204, 63,251,203, 13,222,
+127,250, 89,122,169, 70,187,112,219, 12, 54,174,102, 5,233,172,147, 98,232, 36,227,218, 71, 81,160,202, 57,129, 58, 73,133, 22,
+241, 82,227, 67,244, 77,146, 89,184, 55, 59,185,187,170, 38,151,119,122,234, 53, 77,130, 73,104, 36, 2,132, 38, 4, 82, 55,141,
+ 69,113,237, 5,240, 50, 33,122,107,131, 77,204, 6, 14,130,199, 86, 5,206,121,226, 36, 22, 52,103,243,128, 87, 58,188,134, 83,
+217,106, 40,136,166,113,168, 86, 44,144, 49,193,231, 47, 55,111,157,196,216,170,154, 82,220,124, 16, 87, 73, 16, 99,160,216, 89,
+ 47, 25,220,210,209,200, 68,223,136,177,234, 90,138,120, 67,136,115, 34,234,116,161, 17,147,251,130,199,225, 66,227, 28,132, 95,
+ 40,188, 82,210, 68, 52, 73,106,110,154,156, 19,126,111, 72,153,139, 91,146,181,110,106,116,154, 4,146, 99,133,178, 26,111,106,
+209, 4, 25, 67,148,181,130,112,172, 41,116,130,106,214,234,224,254, 92, 79, 10,116,127,134,168,149,128,171,209,173,118,152,208,
+147, 80,252,197, 97,226,202, 9, 9, 14,232,136, 54, 34,110,238,231, 28,162, 78,185, 67,183,245, 38,232, 38,140,173, 58, 4,242,
+124,155,203,205, 30, 96,127,241,208,237,161,244,134, 20,216,178, 10,155,145,112,242, 9, 77,158,172,250,165,192,249, 78, 38, 52,
+169, 38, 46,215,134, 39,139,113,248, 42,128,119,108,141,173,173,252, 56, 8, 23,133,169, 20, 20,242, 42,156, 62,154, 79,120, 20,
+ 76,232,237, 14,254,200,170, 32,115,103,103,167,135,105, 83,213,232, 68, 36, 46,229, 4,124, 13,206, 6, 65,162,133,118, 42,212,
+204, 56,134, 86, 11,201, 89,215, 18, 5,109, 45,216, 90, 78, 78,170,209, 70,218, 80,204, 27,137, 66,152,172,149,149, 51,166,115,
+ 48, 14, 34, 64, 83,195,164,118, 82,164,131,182,197, 43,143,143,224,161, 71, 30,225, 67, 31,254,175,124,239, 59,223,206, 31,127,
+244,163, 60,242,202, 87,161,131, 48, 79, 5, 56,164, 3,116, 75, 71, 68, 74, 19, 57, 33, 45,169,108,158,241, 48,231,251,223,245,
+ 22, 58,183, 61,192,205, 90,179,180, 60,203, 31,126,224, 15,248,123, 15,158,193, 58,197, 7,255,229, 63,199, 3,255,228,239,191,
+151, 44, 77, 88,237,180, 89,159,148,252,238, 83, 23, 68,173,167, 20,166, 54,244,163,152,227,237, 20,172,227,241,107, 91,252,201,
+ 75, 55,249,220,181, 93,172, 49,204,198,154,235,227,138, 79, 95,219,231, 88,183,197,155, 79, 47, 48,223,201, 88,238,164, 28,233,
+244, 88, 59, 25,145,249, 8,172, 10,177,114,138,118,236,104,199, 21, 93, 93, 96,203,130,186, 50,232, 36,101,243,230, 14, 81, 28,
+139,237,203, 91, 92, 85,132,219,149,248, 12,109, 49, 65, 37, 9,147,245, 75,232,172, 29,146,149, 44,105,191, 47,170,216,186,102,
+126,237, 8,221,249, 53, 58,115, 51, 20,249,132, 50,175,168,242,138, 40,120, 72,243,113, 78,149,239, 19,183, 50,108,109,177,206,
+ 49, 25,238,210, 91,156,103,119, 99,147,153,181, 5,242,145,167, 48,155, 56,111, 73, 90, 9,186,213, 33,207, 7,204, 45, 29,163,
+154, 24,140,201, 81,169,162,174, 93,232,224, 61,113,167, 43,147,180,146,117,120,111,126, 1,155, 39, 76,246,111,176,180,118, 11,
+ 42, 78, 41,134, 35,116, 42, 22,166,172,191, 72, 54,211, 71,121,199,112,253, 10, 51, 43,107,108, 92,124, 6,235, 42, 58,243, 43,
+ 24,103, 80, 17, 20,163, 17,237,197,101,204,100,194,236,209, 19, 12, 55,215,241, 22, 76, 57,193,228,101,120,193, 57,129,204,196,
+145,144,213,218,109,121,208,215, 53,120,207,222,238, 58,173, 94,143,186,168, 40, 38,251,104, 20, 11, 71, 87,200, 74,104, 59, 77,
+154,246,136,179,182,228, 3,143, 38,104, 7, 93, 47,241,129,190, 14,129, 31,141, 96, 42,208, 31, 35,192, 26,233,106,139, 60,224,
+158,173,220,186, 27,197,113,172, 21, 81, 75, 30,140,214,129, 75,128, 68,161,188, 34, 9,208,142,170,171,232,167,242,236, 25, 91,
+ 73, 92,139,181,252, 57,183,175,182,121,219, 95,123, 61,227, 81,201, 96, 48,160, 44, 10, 34, 15,206, 23,216, 8,254,222,219,239,
+228,103,222,126, 11, 51, 10, 94,209,147,223,247,133,231,134, 36,113,141,142, 52, 58,237, 16,165, 45,226, 94,135,120,190, 71,186,
+212, 35, 91,108,211, 89,233, 49,127,164,207,201, 87,204,178,118,124,150, 59,239, 95,224,193,183,222,193,235,255,201,255,198,189,
+255,233,207, 72,102,250,108,252, 63, 63,193,215,254,229,255,205,207,252, 79,255,134,215,188,247,183,120,223,207,125,136,141, 39,
+190, 66,185,113,141,106,127, 11, 59,222, 23, 64, 79, 93,137, 8,206,203,195, 72, 68, 85,213,129, 34,218,131,199,224,234, 66, 94,
+163,129,153,142,206, 80,233, 60,186,183,130,238, 46, 19,197, 45,204,250,139,212,209, 10,241,145,135,232,116, 59,252,216, 59, 31,
+ 99,175, 48, 92,217, 41,216,217,217,160,247,186,119,227,194,233, 66, 4,206, 74, 30,124,193,223,229,140, 13,119,220,134,211, 30,
+130,120,236, 1, 22, 85,110,153, 33,182,212,251, 0,250,144,201,223, 53,196,171,218, 30,220,130,235, 16,110,226,100,211, 96,195,
+189,221,155, 48, 89,213,149,248,189,235, 10,234, 10, 87, 78,240,196,225,227,116, 83, 17, 82,148,180,228,190,239,131,207, 60, 20,
+152, 70,136,167,163,136, 56, 77, 14,110,253, 48,205, 92,215, 81, 36,122,129,180, 37, 5,217, 7, 95,121, 29, 88,238, 62, 76,200,
+113, 44, 31,147,151, 61,169,119, 22,235,228,118, 93,151,165, 76,228, 78,244, 13, 62,210,232, 56, 22,144,142, 82,248, 88, 77,129,
+ 47, 90, 19, 66, 99, 74,172,169,197,230,230,229,107, 87,215,149,164, 61,218,208, 68,132,175,169, 11,138, 43, 23,254,135, 86,152,
+178,144, 51,131, 21,239,147,243, 6, 91,214,216,170,192, 58,115, 40,240,198, 5, 85,127,211,160,136, 66, 84, 26,163, 10, 21, 39,
+ 20,163,241,180, 1,243,206, 73,210, 91, 28,129, 78,136,211, 76,162,167,149,130,218, 98,170,160, 45,113,149, 84,180,166, 32, 55,
+223, 92, 35,158, 11,183,247, 58,248,179,170, 82,138,180,171, 2,182,181, 58, 20,172, 67,168,142,114,134,160,170, 96,105,137,246,
+ 76, 87,108, 89,121,142,207, 71,184,241, 24,183, 55,192, 15,247,113,131, 33,126, 52, 66,249, 26,229, 76, 56, 71,200,223,239,172,
+ 76,226,120,135, 67, 62, 78,107, 15, 53,103,214, 6,184,145,147,247,145, 13, 77,218, 33, 37,191, 82,177, 52, 95,105, 74,122,242,
+ 52,250,200, 17, 84,146,224,189,167, 44, 70, 20,227,130, 58,119, 12,255, 63,178,222, 52,220,178,172, 46,243,252,173, 97,239,125,
+134,123,206, 29, 34,226, 70, 68,102, 70, 78, 36,100, 36,144,100, 2,138, 32,147, 34,106, 41,216,165, 45,106,149,104, 85,151, 72,
+ 57,181, 67, 89,104, 89,213,143,150, 90, 5,109, 59,149,138,218,150, 15, 34,206,221, 45, 98,129, 72, 41,130,136,128,128, 80,200,
+144, 9, 57,147, 25,145, 49,223,233,220, 51,236, 97, 77,253,225,191,206,185,129,245,129,135,124,200, 36,242,220,125,207, 94,235,
+ 63,188,239,239,157, 36, 98,254, 81,147,131,202, 40, 6, 61, 77, 63,231, 80, 20, 86,144, 72,130, 71, 72, 43,185,192,108,150, 31,
+ 89,119,228,248, 91,154,231, 10, 35,197,138, 78, 95,104,217,239,218,196, 65, 19,216,171, 3, 93, 76,168, 36, 26,129,152,235,100,
+ 31, 19,243,249,130,182,149, 0,179,232, 3,167, 78,110, 11,133,120, 25, 37,159, 57, 74,218, 90,193,196, 22,136, 79, 46,185,192,
+177, 83,219, 92,250,212, 63,176,215,246,121,215, 35, 87,121,213,151, 63, 15,213, 95, 99,199,148,124,244,252, 37,254,253, 79,255,
+ 12, 0, 63,254, 27,111,230, 88,175,160, 9,158,185,139,252,214,191,251, 65, 38, 77, 71,139,230, 41,235, 67, 42,149,168, 19,108,
+ 84, 37, 27,189,146, 69,231, 56,119, 48,227,177,131, 57,199,183,214,121,202,169, 77,198,192,133,131, 25, 15,237,183, 52,206,115,
+ 98, 88, 81,151, 5,123, 15,223, 79,231, 20, 46, 15,159, 18,138,210,106, 6, 24, 78,216,130,249,227,255, 3, 69,228,248,198,128,
+217,116, 42, 95, 82,155,213,146, 90,163,139, 18, 95,207,197, 83, 90,244,209, 74,209, 63,118, 35,161, 89, 80,142,198, 76,175, 92,
+164,157, 77,241, 77, 71,187,168, 89,204,230, 76, 46, 61,193, 98,127, 66,244,115, 92, 93, 83,246,123,180, 77, 75,202, 21,104,215,
+122,188,139,184,214,225, 67,160,212,138, 54, 56,246,159,220,193, 47,174,209,239,143, 40,236,128,118, 86, 83,246,228, 96,211, 8,
+ 6, 53,120,159,199, 62,134,217,222,101,180,113,152, 84, 64,208, 68, 95, 3,100,116,132,220, 0, 0, 32, 0, 73, 68, 65, 84,134,
+118,190, 79,213, 47,241,221,140,225,104,141,122, 90, 19,124, 67,217,175, 88, 28,236, 81,141,199,236, 95,122,130, 27,158,245, 28,
+ 46, 61,246, 0, 87, 30,251, 12, 33,120,186,214,113,236,198, 59,105,155, 41,147,203, 23,177,182,162, 26,244,169,214, 6,148,195,
+ 49,186, 52, 20,189, 30,139,201, 62,202,150,244,199, 35,124, 23,153, 93,187, 44, 62, 92, 99,113,109,141, 49,134, 72,196,228,228,
+162,221,135,207, 99,251, 67,198, 91, 35,186,197, 33,138,142,245, 91,182,121,218, 98,192, 90, 84, 12,135,107, 40, 21, 72,198,176,
+127,105,151,202, 24,134,104, 74, 52,165,201,248,194, 36,163,115,225,183, 43, 90, 47,214,142, 16, 35,222, 39, 66,138, 24, 43,222,
+116,163, 19,133, 81, 40,157, 50, 26, 58,229, 29,148,236,162,172, 86,226,229,244,194, 9,154,118,114,153,103, 29, 23,133,129,115,
+ 51,120,219,175,191,150,107,147, 22,187,117,156, 84, 86,146,142,229, 58,156, 15, 20, 69,226,196, 93, 39,121,202,115, 78,242, 61,
+255,236,121,124,246, 64,196,109,143, 28, 6, 38,211, 22,149, 34, 74, 42, 17, 84, 81, 98,198,107,216,254,144,226,248,136,225,169,
+117, 54,110, 57,206,232,150,211,108, 61,243, 54,110,123,237,247,112,235,127,252,121,214,158,242, 84,210,167,255, 59, 87,254,244,
+ 77,124,254, 61,239,227,151,254,224,113,254,102, 39,177, 23, 19, 31,184,236,121,199,155, 62, 67,243,228, 99,248,131, 93,162,111,
+133,126,182,228,108, 43,115, 20, 83, 26,243,193, 28, 3,169,149,132,175,100, 45, 73,151, 36,211, 71,245, 54, 81,253, 99,152,241,
+ 49,204, 96,131,212, 44,104, 47, 62, 70,216,126, 17,122,243, 78, 66,215,224,186,150,255,244,230,223,229, 98,130, 83,165,230,141,
+ 31,217,101,241,209,119,161,202,225,234,194,138, 62, 44, 87,200,226, 87, 95, 42,172, 17,132, 85,202,123,229,180, 26,157,166, 85,
+215, 38,226,188,124,138, 44,177,177, 57,206, 52, 45, 71,218,164,163, 56,191,180,244, 76,235, 44,252,139,196, 36, 49,170, 41,166,
+188,247, 86,248,131,107, 40, 37, 9,129,228, 92,246,213, 96,250,186,231,115, 36, 57,142,171,188,119,109,139,163,145,113, 18, 28,
+108, 12, 17,141, 48,209, 83,215,202,164, 35, 8,251, 61,248,124, 9,102,116,173, 20, 40, 33, 15, 25, 98,214, 50, 52,153,123,145,
+240,109, 71,202,133, 79,202,255, 92,178,178,127, 79, 93,155,215, 40,249,207,244,185,155,244, 94,138, 37,239, 69,216, 21,147,216,
+ 19,131,187, 46,207, 61,235, 15, 98,166,161,117, 25, 33,219, 57,185,184,148,228, 80,248,186, 93, 21,123, 74,105, 17, 44, 42, 37,
+221,124,138, 34, 28, 84, 41,103,197,135, 28,245, 42,133,148, 83, 66,225, 11,157,203,130,189,235,241,168,128, 23, 33,178,238, 9,
+ 78, 55,164, 28,119,234,115, 32,202,210, 6,152,215, 32, 43, 85,214, 82, 32, 23,157, 92,218, 62, 95,236, 33,239,205,235,249,209,
+101,222,181, 48, 57,128, 69, 45,127, 86,175, 15, 27,155,244, 7, 3, 6,253, 10, 91,183,152,182,198,204,166,232,201, 20,189,187,
+131,154,207, 81, 62,160,109,145,181, 35,136, 67,161,115,194,208,136, 34,184,140, 81, 58,246,144,194, 17,103, 32,175, 46,150,224,
+ 32,212,117,107,128,149, 96,191,148,118,249,198, 27,225,216,137, 21,243,222,185, 5,222, 37, 90, 23,233,186,200, 98,145,240, 78,
+161,162, 32, 90, 43, 35,123,111,197,145,157,223, 59,133,247, 90, 54, 12, 46,209,182,114,185, 39, 45,117,142, 90, 74, 19,148,236,
+202,151, 54,223, 37, 24,175,243, 34,168,235,188,136, 34,151, 82, 6, 89, 3,197, 28,210, 2,143,126,254, 33, 76,101,184,255,179,
+159,225, 91,191,245,159,113,238,220,147,130,249, 54, 34,252, 93,126, 30,107,115,152,124,138, 73,156, 11, 56,238,255,228,227,248,
+113,143,181,238,239,136, 58,242, 7,239,254, 16, 79,169, 20,238,244, 45,220,188, 57, 38,170,200,187,223,242, 38,254,233,191,254,
+110,250, 42,113,188, 80,220,253,220,187,177,253,146, 24, 97,218,180, 28, 54,137,187,214,215,168, 99,224,252,188,203,100,174,130,
+ 19,131, 62,243, 16,249,196,133, 29, 66,132,123, 78,140,232,138,130, 91,250,154,253,198,243,192,197, 3,254,207,127,245,229, 28,
+ 60,254,215,132,164,136, 81,198, 22, 86, 43,170,168,217, 42, 44, 91,214, 80, 68, 79, 59,185, 68, 81,141,153,215, 53,218,150,104,
+219, 35,165,128,233,245, 73, 40, 92, 61,161, 87,108,229, 84,166,136,111, 22, 36,215,209,223,218,228,218, 99,143, 99, 13,108,220,
+114, 51, 23, 63,115, 63, 49,118,140,142,159,225,220,103, 30,228,204, 51,207,114,245,241,203, 76,246,174, 98,251,199,113,126, 70,
+ 17, 54,177,202,211, 46, 90,154,102,194,250,214, 41,218,249,132,216,122,110,190,251, 44,135, 87, 47, 98,123, 5,139,131,171, 88,
+187, 73, 83, 79, 24,108,110, 51,216,220,160, 62,156,146,116, 71, 55,169, 81,195,150,114, 48, 34,122,141,238, 59,209, 51, 20, 61,
+217,101,199, 6, 99, 78,114,225,177,251,184,237,158,103,179,216,111, 73,177, 37, 37, 69,179, 56,192,205, 22,212,135, 59,204,247,
+246, 40, 74, 75,185,118,156,122,247,128, 98,109,200,230,205,183,103, 85,113,230, 72, 39,240,243,134,209,182,193, 22,134,106, 48,
+ 34,225,241,141,167,158,207,176,121,212, 21,130,135, 0,193, 7, 76,145,171, 72,228, 89, 29, 94, 57,160, 11,142,222,168,162,155,
+238,163,138, 68, 81,173,241,252, 23, 63,157,199, 30, 57, 71,104,102, 16, 26,146, 81, 92,120,226,128,173,129,102, 70,162,210,138,
+ 16, 85,182,229, 36,220,242,157,242, 71,165,169,107, 21,131, 65,214, 49,101,120,178,226, 58,230,117, 86, 95,163,147,132,197,104,
+ 57,133,140, 75, 84, 94,209,120,197, 51,110, 87,156,127, 48,173,152,199,151, 14,225,221, 63,245, 85, 76, 99, 73,168, 15,104, 30,
+249, 20,221,229, 29,186, 69, 39,123,170, 78, 48,181,213,201, 77,250,103, 78,210, 31, 22,188,225,123,239,229,255,120,227, 39, 89,
+ 31,192,235,223,240,151,188,225,245,223,196,206,249,107,104,101, 81, 85,133,238, 10,162,181, 24,163,233,143,135,152,193, 0,165,
+ 10,122,207,121, 57,122, 84,192, 35,159, 36, 54, 45,126, 50,161, 26, 24,110,123,225, 93,252,220,109, 27, 92,248,220, 21,246,175,
+213,220,112,178,226,230,151,222,138, 62,125, 59,109, 35, 10, 97,165, 75, 84, 33, 99, 76,149, 2, 41, 26, 72, 78, 70,237,209, 11,
+116, 39,211,230,232,173,163,138, 1,216, 1,170,215,199, 14, 71, 40, 93, 16,174,158,199,233, 53,212,237,223,128, 10, 53,209, 45,
+208, 86, 83,148,235, 20, 39,110,224,238,155, 78,208, 92,219,229,195,143,238, 49,187,122,137, 51,223,242, 90,118,223,249,251,153,
+105, 45, 35,241,228,151, 81,183, 17,101, 69,123,161,148,116,162,164,152, 5,113, 98, 97, 74,193,231,236,111, 17, 61, 98,116,238,
+232, 83,182, 18,201,216, 91,101, 81,159,204, 31, 89, 89,218,146, 79,171,220,118,188,135,194, 74, 71,229, 4, 84,115,240,129,183,
+177,253,170,239, 62, 18,178, 69, 73, 95, 36, 72,199,153,186,150, 16,142, 46, 72,181, 74,112, 23, 5,188,213,154,128,128,102,146,
+ 11,168, 74,138,178,216,205, 69,240,150,129, 59,137,163,216,205,152,213,124, 33,248,172, 37,145,203, 89, 72,117,130,182,141, 41,
+171,252,139, 76,165,139, 81,138,161,182,203, 96, 27, 77, 82,138,208,116, 89,146, 16,100,213,177, 76,113, 51, 70,180, 3, 75, 86,
+125, 18, 1, 98,136,203,207,159,208,201, 98,173,206, 17,155, 74, 16,202, 62,228,238, 58,161, 11, 69, 12, 10,141,124, 6,101,133,
+110,167,146, 67, 45, 51,234,139, 50,199,184,202,216, 25,101,161,107,233,186,128,239, 60,218, 77, 81,101, 41,163,107,215, 9,138,
+ 55,230, 44,101,165, 86,174, 32, 49, 90,199, 35, 90,172,190, 14, 17,155,215, 44, 43,172,236, 10,239,154,189,129,182, 16,159,160,
+239,160,117, 71, 88, 86,215, 17,234, 57,170,109,208,253, 65,190,229, 2,156, 58, 65,169, 18,122,177, 32, 46, 22,164,186, 38,228,
+ 16, 22,213,239, 99, 6,107,232, 94, 95,138, 81, 0, 31, 36,130,214,123,188, 77, 89,163, 18,196,130,232, 5,223,251, 5,193,113,
+ 74,180, 28, 43,112,146, 53, 95,152, 68, 71,129,170, 74, 82,225,178,249,194,242,224,125,239,101,177, 72, 28, 78, 35,147,125,185,
+176, 85, 94,129,169, 32, 86,210,136,116,233,206, 75,110, 68, 8,146,165,238, 59, 37, 3,142, 78, 86,132, 75,198,142, 50,226, 51,
+ 95, 2,129, 76, 82,121,181, 36, 29,187, 54, 10,111,178, 64, 89, 11,127, 32, 70, 17,229,250,236,228, 65,193,179,239,190,139,199,
+ 30,253, 44, 15, 61,252, 16, 15, 62,244,144,108, 53, 76,174, 67,175, 99, 0,217,202, 26,172,146, 20,161,206,123, 92, 59,227,197,
+ 47,249, 18, 94,255,214,247,113,174,113,148,253,138,107,179, 5,213, 28,182,143, 59,126,232,219,190,145,135, 30,122,156,251, 62,
+241,247,252,233,175,252, 18,191,250,166, 55,113,223, 99,143,241,216,125, 15,240,200, 3, 15,112,251,198,144,131,174, 35, 69,197,
+253,147, 25,165, 49,140, 74, 1,102,204,186,200,110, 59, 99,173, 44, 24, 90, 75,169,225,252,172, 35,106,205,165, 69, 98,221, 42,
+206,108,142,184,233,184,230,240, 81,131, 79, 98,187,209, 57,164,163,208,154,129, 54,140,108, 65,169, 20,113,114, 30, 61, 60, 65,
+220,186, 73, 32, 28, 89, 17,155, 98,194, 20,122, 37, 10,114,245, 28,136,248,122, 70, 87,215,148,195, 33, 59,143, 63,202, 29,207,
+127, 1,205,100,194,226,112,202,250,246, 49,166,123, 19, 81, 89,215, 13,245,116, 10,193, 97,108, 69,232,162,116, 32,185,163,177,
+166,164,105, 14,233, 50,243, 57,164, 9,193, 37,208,158,168, 60, 90, 7,208, 22,183,168,179,109,165,162, 57,152, 50,222, 62,193,
+254,165,115,244,199, 5,211,157, 75, 12,143,111, 17,154,128,173, 44,135, 59,187,244,215,199,248,208,177,121, 82, 60,198,100, 16,
+200,112,235, 52, 87,207,221,199,228,202, 69,140,177,236,156,123,128,254,104,155,254,218,136, 75,143,125,154,170, 26, 83,142,135,
+184,121,195,112,235, 4,101,191, 66,151, 5,107,227,117, 14,175, 94,226,196,109,183,226,141,167,157, 46,164,235,172, 74,146,247,
+ 12, 54, 55,105,103, 11,214, 54,198,196, 38,224,219, 26, 91,148, 50,134, 13, 13,251, 87,119, 81, 81,225,219,150,148, 2,126,222,
+ 96,123,138,225,230,136,167,127,241, 51, 9,126, 33,200,202,206,243, 15, 23,103, 60,251, 41, 5, 77, 12,216,164, 88, 90,162, 67,
+ 94,181,249,108,157,138, 94,222,105, 95,136,127,179,174, 19,245, 44, 49, 24, 44,163, 45,229, 96, 42, 10, 77,155,167,120, 70, 93,
+247,142,122,208,181,162,106, 34, 91,103, 11,110,127,162,227,225, 90,206,154,167,159,234,243,204, 23,127, 49,123,243,130,246,177,
+ 15,210, 60,246, 36,244, 43,116, 81, 80,148,106,165,232,141,251, 51,234,217,156,234,142, 91, 40,202,130, 55,190,238, 94, 94,254,
+115,159,228, 23, 63,118,192, 79,183, 11,121,225,181,100,125,235,129,193,134,138,254,120, 64,177,185, 73,185,117, 10,182,239,128,
+246, 50, 92,201,235,158,102, 65,240,142,242,196, 54,232,136, 25,141,184,235,121,207,146,100, 46,101,240, 78,196, 98,118, 67, 44,
+ 82, 90, 27,180, 42, 86,192,139, 20, 90,217,159,107, 72, 46, 8,137, 79,151, 36,221, 67, 39, 75, 82, 61,172, 53, 24, 29,137,211,
+125,226,236, 16,119,226,121,216, 19,119,146,218,125,146, 82,104,221,199,244,202, 85,199,241,159,223,240,227,188,250, 95,252, 0,
+ 99, 5,127,244,217,125,126,224,239,223,131, 42,171,149,152, 74, 97,114,108, 99, 60,234,142,115,251,150,194,210,147, 45,123,120,
+ 81,188,103,206,110,182, 94,165,156, 47,169,172, 21, 22,188,202, 33, 45, 43, 74,232, 18,164, 34, 29,167, 90, 90,144,242,200, 91,
+103,242,156, 92, 66, 21,110,247, 60, 40,131, 45, 45,190, 19,173, 75, 86,194,201,200, 88, 41,146,119,248, 28,198,100,138, 66,252,
+237,185,229,137,203,236, 75,173, 40,135, 3, 17,155,121,143,239, 58, 18,146,240,103,139,146,174,157, 11,233, 46, 83,242, 66, 43,
+157,106,112, 45,160,178,152,143,213,133,142,151, 11, 61,100,190,248,138,182,178, 36,154, 37, 36, 65, 46,255,189,168,100,221,160,
+140,112,232,245, 50, 45, 61,169, 76, 96,245,248, 54,119,150,202, 80, 20, 50, 21, 11,241,136,222, 22,189,132,169,196, 78, 68,105,
+177, 21,144, 77,210, 10,173, 44, 9, 25,249, 43,173, 4,146, 2, 66,203, 76,160,136,116,115,135,173, 74, 76, 81,226, 6, 35,186,
+195, 67,232,149,232,182, 33, 52,141, 64,184,188, 39, 25, 47,191, 63,155,247,228,230,186,244,180,229,232, 60,250, 35,118,123, 92,
+134,205, 92,143,126,205,255,108,204, 24,215, 37,233,206,183,194, 75,246, 30, 22, 11, 82,211,224, 58, 71,218,219,165,220,216,144,
+181, 74,240,176,190,137,141,137,176,191, 79,208, 22, 19,199,164, 65, 31,181,185,129, 30, 14,242, 26,200,147,148,232, 29,150,177,
+179,218,115, 93,188,108,214, 45,164,165, 19, 99, 41, 46, 92,178, 7,174,251,172, 95, 16,228,178, 60, 88, 4, 90,100,140,230,143,
+223,242,131,172,141, 18,237, 2, 90,119,221, 20, 43, 66,200,129, 42,209, 72,224,138,178,160, 27, 48, 54,225, 26, 88,212, 9,215,
+ 66,219, 40, 90,119,221, 88, 32, 55, 40,154, 35,231, 72, 17, 21,149,210,232, 32,105,111,201,228,198, 39,175,113, 74, 45, 86,220,
+194,200, 99, 44, 43,197,254,254, 14,155, 27,199,216,217,219, 21,199, 96, 54,175,196, 28, 81, 15, 75, 57, 68, 52,148, 70,227, 99,
+148,189, 38, 37,167,159,123,150,111, 95,192,238,100,143,127,255,142,191,227,145,183,255, 23,222,240,179,191,199,159, 60,240, 56,
+237, 7, 63,198,199, 31,122,148,173,251, 63,199, 35,191,250, 38,142,141, 6, 92,154,204,248,225,255,245,149,252,246, 59,222,197,
+118, 1,235,101, 73,136, 9,171,161,245,129, 89, 23, 8, 9, 74,163, 80, 49,114,176,104, 40,141,102,173,148,125,110,207, 40,206,
+110, 22,204, 27,207,115,159,251,108,246,239,251, 24, 74, 67,161, 12, 67,155, 8,120, 42,147, 24,107,195,168,180, 84, 74, 98, 58,
+ 59,109, 96,126,153, 58, 53,242, 29, 52, 86, 68, 44,209,163,109, 9, 9,218,233, 62,209,121,202,181, 33, 16, 40,202, 10,146, 98,
+188,117,140,181,147, 55,114,233, 51,255, 64, 12,129, 75,143, 61, 68, 81,142,241, 93,205, 98, 90, 83,207, 14,136, 81,210,139,108,
+ 81, 81, 55, 51, 82,242, 68, 5,221, 98,129,170, 3,137,146,182,222, 99,109,235, 24, 41, 42, 22,135,231, 24,157, 56,142,171, 27,
+250,235, 27,204,246,247, 24,142,215,177,166, 0, 93,224, 92, 77, 10,154,114,173, 15,177,132,208,163,157, 95,193,246,199,146,177,
+ 16, 3,174,233,168,170, 10, 55,155, 98,251, 35, 38,215, 22,204,246, 46,131, 74,180,179, 9,182, 55, 68, 37, 75,215, 76, 73, 70,
+ 81,104,152, 53, 13, 23, 62,249, 73,220,188, 97,227,228, 41,194,109,103, 24,159, 56, 73,217,175, 56,188, 22,185,246,216, 57,182,
+110,190,145,241,240, 6,186,182, 89, 69, 77, 21,189, 33,245,116, 15, 24,175,252,196,166,167, 9, 62,224,187,154,245,205, 30,174,
+157, 19,242,174,210, 43, 13,170,135,214,150,212,213,146,150, 25, 35,113, 50,229,193, 73,199,115, 99, 65,105, 52,101,136,204,209,
+132, 24, 8, 6,186,152,147, 53,163,164,164,153,108,203,136, 17, 92,151, 68, 16,146,147,172, 18,137,152, 43,216,148, 68,109, 26,
+140,236,167,172, 86, 18, 19,171, 20, 58, 25,170,144,120,222,151,150,204, 62,208,113, 45,192,241,245, 74,196,120,186, 32, 92,219,
+193,174,245,137,189, 18,237,142, 50,160,147, 5, 51,168, 72, 33,224,174,236, 80,157,218,102,182,179,195, 7,127,228, 94, 94,251,
+230,251,249, 47,255,245, 3,252,208,107, 94,196,244,176, 21,117,183,169,176,163, 1,118,115,147,242,244, 25,216,124, 10,184,171,
+ 80, 47,136,179, 41, 49,149, 68,215,144,124, 35, 29,207,250, 22,106,208,224, 67,160,107, 35, 26,193,127,162, 51,221,204, 74,119,
+128, 86, 71, 60,111,151, 57,211, 62,146,148, 37,154, 10,204,128,164, 75,208, 6,173, 28,116, 17,127,176,131,179,155,196, 51,175,
+ 68,219,132, 91, 92, 69, 25, 77,185,182, 38, 7,181,234,227,189,195, 90,203, 15,127,247,235, 56, 85,105, 10,165,248,163,143,156,
+231, 95,221,187,205,246,215,127, 51, 59,239,250,111, 71,179,215, 37, 8, 95,229, 40,205,148, 91,157, 37, 92,134, 28,183,154, 15,
+166,180, 82,193,103, 11,157,202,202,156,224,115, 68,232,117, 62,111,150, 99,119, 81,161, 39,144,177,110,238,244, 66, 43,184, 85,
+133, 34,249,134, 56,117, 82,224, 14,214, 73, 7,251, 43,227,173,210,150,232,154, 85,102,249, 18,194,162, 84, 22,200, 45,135,230,
+222,101,135,158,168,151,201, 2, 48, 91, 20,116, 93, 71,215, 52,217, 11,126,189,160, 77,166, 9, 62, 7,199,104, 43,162, 39,153,
+ 72,228, 53,133,145, 66, 68, 60,249,215,229,195, 47,199,189,217,143, 30,186, 70,166, 11, 17,130, 74, 88, 99, 49,214, 19,163,193,
+216, 60,165, 8,224,157,151,145,121,219,161,181, 37,196,128,166,144,119, 42, 23, 11,218,106,218,133,207,201,113, 82,172,216, 40,
+ 59,113,159, 18,102, 57, 85, 73,146, 83,255, 5,211,141,144, 8,190,149, 73, 75, 4,125,250, 38,234, 43,159,199, 20,199, 73, 49,
+224,235, 6, 91, 85,164,162, 32,216, 78, 58, 72, 99,164,242,206,220,254, 21,107,125,101,216,207, 23, 55, 81,114, 72,149,254,199,
+254,181,235,214, 34, 42,231,157, 39,104, 90, 82,118, 50,164,224, 73,222, 17, 90, 79,237,246, 40, 74,147,169,142, 74, 52, 15,155,
+199, 81,131,145,172,131,172, 89,145,247, 72, 66,117,140, 42,255,251, 37, 88,143, 16,175,203,104,191,238,175, 37,174, 61, 19,252,
+174, 3,220, 37,165,190, 32,135, 61,165, 47,204,125,215, 90,243,215,239,124, 51,147,201, 12,231, 20,157,151, 36, 72, 19,151, 97,
+ 50,154,164, 16,145,175,138,120,149,208, 49, 65,153, 72, 45,212, 13,204,231, 18, 90, 21, 82,150, 24, 44, 31, 93,167,208, 3,113,
+ 2,169,168, 40,141,166,175,160,175, 52,198, 66,235, 34,139,124,177, 47,195,233, 98, 74, 84, 54, 7,201,100,101,251, 45,183,222,
+202, 29, 79,189,131,249,194, 9,208, 38,192,239,255,222,239,225,227, 10,244, 40,147,223, 42, 83,162, 92,230,112,206,167, 19,110,
+ 62,123, 3, 47, 24,157,224,193, 79, 61,204,119,156,219,225,119,222,242,255,113,178,222, 97,205,183, 60,114,238, 9,250,189,138,
+255,252,195,255,134, 63,121,215, 59,121,248,220, 5,214,250, 61,222,250, 87,239,229,216,198,152,218, 7, 44, 48,233, 26, 78,143,
+250,148, 72,164,107,235, 61,195,210, 50, 44, 44,209, 7,118, 93, 32, 42,205,180,115,236,183,145,121,235,112,157,231,103,158,255,
+ 12, 14, 62,246, 4,125, 93,112,188, 76, 40, 7, 65, 43, 42,149,216, 48,150,161,150, 75, 61,146,104, 67,100,230,193, 25,131, 41,
+251, 68,215, 18,189,199, 20, 21,221,236, 64,124,144,116,196, 88,160,154, 58,143,244, 74, 38,151, 46,161, 10,197,181,135, 31, 96,
+126, 56,197,205,106,226,226, 2,246,134, 49, 11, 63, 39,250, 68, 81, 85, 34,116,200,149,121, 97, 43,234, 60, 57,112,174,165, 24,
+ 88,140, 82,196, 73, 36,248, 5,197, 96, 64,209,245, 73, 62, 81,216, 30,205,236,128,126,111,147,102,190, 7, 3,241, 91,117,237,
+ 4,116,193, 98,239, 42,189,225, 24,215, 88,186,174,197, 28,214,104,213, 82, 84,199,233, 22,251,148, 91, 55, 48,221,157,208, 45,
+206,211,223, 28, 51,219, 59, 32, 68,203,225,206, 5,250,195, 99,152,168,248,208,219,254,144,219,159,251, 28,206, 62,251,171, 57,
+247,224, 95, 16, 93,199,243, 95,253,189,232,194, 50,191,186, 71, 49,236,227,154,142,162,234, 51, 92, 63, 70,125,120,192,232,216,
+ 73, 52, 48,189,118,133,141, 83,167,101,234, 80, 13,240, 33, 96,139, 2,175, 34,222, 37, 76, 97,153, 93,120,152,155,158,126, 43,
+190,153,160,226, 66,118,155, 69,159, 96, 74, 18,134, 20, 21,214, 38,124,242, 52, 7,115,174,229,103,165, 51, 48, 38,198, 68,176,
+ 66, 95,114, 42,175,218, 50,161,210, 26,176, 58,209, 58, 69,229,229, 80, 8, 46,146,186,132, 75, 74,162, 94, 99,196, 42, 25, 69,
+ 38, 13,177, 80,180,141, 28,194,117, 94,173, 18, 20,107, 70,241,138,231,245,248,111, 31,107,112, 49,192,218, 22, 92,219,147,112,
+ 13,219,147, 42, 94,105,116, 33,167,129, 10,121,112,155, 81,153,201, 20, 20,227, 17,151,247, 14,120,243,119,156,101,251,245,159,
+225,251, 94, 61, 39, 37,147,133, 68, 5,197,104, 68,117,226, 6, 24,157, 1, 93, 47,151,209, 40, 83, 16, 46, 95,164,107, 27,244,
+ 96,132, 42,123, 36,215,202,184,188,244, 24,235, 51, 37, 44, 11,133,181, 70, 85, 85,246,132,123, 57,232,156,140,171, 99, 74,226,
+195,181, 35,185,208,149, 66,227, 80,201,147,166, 53,222,121,218,147, 47,132,209, 77,232,112, 32,113,181,253, 1,213,218, 16,211,
+235,145,114, 40,199,249,251, 63,206,243,239,125, 41, 91, 64, 89,106,186, 40, 49,157,159,216,109,121,233,103, 62, 33,130, 32,239,
+ 50,145, 44,161,205,242, 18,203, 35,231, 36,137, 61, 74, 41, 34, 26,165,151, 7,100, 58,194,202,106,155,213,213,113,213, 1, 41,
+142,208,170, 43,174,187, 86, 71,164,182,148,211,223, 8, 71, 97, 48, 65,101,210,168,168,196,253,254, 85,202,237,141,236,183, 54,
+196,228,209, 74, 62,111, 12, 62,251,226,179,103, 62,120,138,178, 20, 5,190,119,242,217, 98,123,164,200, 86, 57,177, 76, 73,218,
+156,119, 78, 38, 29, 41,137,108, 57,134,213, 78, 58,230, 32,150,232, 85, 30, 79,135, 76,208, 83,196, 46, 23, 57, 33, 17,147, 91,
+ 37,160,165,236, 55,143,222, 19,156,147,200,212, 37,114, 20, 67, 8, 73,216,239, 62, 18,112,160,156, 76,109,130,196,167,198,144,
+ 81, 97, 62, 97, 10,179, 10, 59,137, 64,234, 4, 19, 29,242, 68,193, 22, 34, 2, 54, 86,211,181, 14,235, 51,119, 62, 4,202,194,
+202,115, 86, 34, 4, 84,222,147, 58,135,183, 89, 98,160, 13, 93,227,114,244,107, 90, 9,235,146,115, 36,107,136,214,160,151,221,
+ 57, 25,118,180,188,208, 77,145,173, 6,133, 60,219, 24,101, 63,110,138,236,151,191,126, 52, 31,143,144,176, 89,165, 30, 22, 51,
+ 9,184,137, 75, 78,187,120,198, 33,224, 66,118, 22,248, 32,209,207, 36,130,149, 12, 3, 99,141, 76,115, 66, 32, 32, 83,160,116,
+221, 78, 60,173, 98,112,213, 23, 66,237,114,145,160,254, 81,156,171,216,200,244,117, 20,188, 47,188,208,131,247,212,139, 41,191,
+245,139,255, 59, 69, 63, 55, 26, 57,125, 77,231, 66, 33, 70, 17,150, 22, 54,225,146,184,131, 82, 18,110,129,107,210, 74,240,219,
+ 1,174,201,185, 52, 94,172,111, 6, 8,157,198, 20,138, 66, 41, 97,163, 40, 77,233,197,198,187,240,137,224, 69, 77,151, 77, 48,
+216, 36, 29,186, 82,240,212,179,119,242,200, 35, 15,240, 23,127,249,223,185,116,229,154,104,145, 50, 11,168,238,178, 11, 77, 29,
+185, 8, 53, 81,225, 98,164, 77, 34, 50,232, 46,127,154,251,126,247, 77,168,233, 35,108,109, 84,188,246,117,255,154, 87,124,203,
+ 55,241,251,159, 56,199,253,251,115, 14,162, 98,238, 61,223,245, 31,127,138,183,191,247, 3,164, 24,120,229, 75, 94,196,221,103,
+159,198,108, 94, 51,212, 80, 32,163,144, 39, 14, 22, 92,107, 58,106, 39, 47,164, 54,150, 39,103, 53,155,163, 1,199, 6, 61, 54,
+ 74,193, 34,222, 60,176,156, 94, 27,114,227,250, 26,189,131,115, 24, 85, 48, 40,123,140,202, 34,143,234, 53, 27,214, 50,178, 22,
+171,100, 71, 21,151,169,191, 6,102,205, 2, 91,245,228,144, 78, 9,116,174,198,115, 80,140,181, 34, 46,177,101,159,107,143, 61,
+130,247, 11,118,207, 61, 74,115,184, 79, 74,158, 84, 4, 54,110,184, 91, 48,148,206, 51,219,223,229,202, 35, 15,227,218, 9,222,
+ 69,186,110, 38,254, 90, 99,233, 22, 45, 49,192,238, 19,151,104,235,171, 12,143,157,192,181,226, 7, 13,222, 97,236, 26, 77,179,
+ 79, 81,245,240, 62,224, 22,135,232, 98,128,247, 29,193, 37,170,181, 33,218,244, 56,184,188,131, 82, 53,166,200,185,207,214,210,
+ 45, 26,148,174,113,237, 28,219,243,152,202,178,152,204,209, 54,208, 76, 46, 51,223,191,194,197, 71, 62, 11, 90,179,219,193,253,
+159,190,159,143,253,213, 95,241,233, 7,206,241,169, 79,124,138, 7,254,242,175, 80,109,131, 53, 45, 69,242,152,194, 50, 24,143,
+ 81, 86, 20,159,222,119,216,178,202,202, 88, 41,237,170,193, 80, 48,154, 25,149,136,149, 29,225, 71,223,249,155,140, 78,157,201,
+239, 75, 68, 43, 39,106, 98,211, 35, 42,133, 42, 4, 32,131,210,120,231,104,178, 26,217, 69,241,141, 7, 36,248,160,203,194,143,
+ 46, 74, 84,225,202,246,154,213,238,190, 77, 52,179,196,124, 17,153,215, 9,231, 5, 22, 18, 50, 10, 58, 68,169, 72,157,151,100,
+ 44, 95,130,171, 20, 93,246,209, 86, 81,113, 76,105,190,247,139,134,124,215,115, 55,152, 79,107,226,193,133,172, 76,145, 84, 36,
+ 93, 89, 84, 89, 96, 55,215, 41,207,108, 11,250,219,104, 25,141,106, 75, 49, 28,211,239,247,216,141,150,183,254,211, 83, 28,255,
+231,111,231,196,241, 10,221,171, 40,214, 70,152,225, 24,214,214, 97, 56,130,102, 6,109, 71, 74,133,164,213,141,199,148,163, 17,
+106,113, 64,216,187, 8,245, 28,229, 23,152,148, 48, 70, 99,141,198,246,250,152,126, 31,211,171, 50, 46, 53, 18,219,142,216,186,
+204, 15,143, 36, 44,193,110, 18,181,184, 51, 84, 59, 35, 45, 22,184,107,215,152,181, 99, 38,199, 95, 78,180,125, 98,115,141, 24,
+ 28,182, 87, 81,141, 6,232, 66, 97,203, 33,190,142,188,234,233, 79,227, 89,247,190,148, 91,250,134, 65,169, 87, 16,161, 83, 61,
+205, 27,222,241, 57,220,133,243, 28,255,250,255, 45,115,215, 83,206, 60,207, 99,243, 44,220, 90,142, 45,197, 35, 29, 51, 15, 61,
+136, 13, 45,102,111,118,240,146, 79,176,130,139,116, 89, 5, 31,115,152, 70, 90,133,173,144, 25,231, 41,211,197,162,115, 25,182,
+ 34,144,153,163,157,125,100,250,177, 63, 71,233, 98, 21, 1,172,150,177,122,121,239,189,132,196, 44, 47, 52, 85,150, 89,217,190,
+220,215,179,194,167, 46, 69, 99, 33,143,248, 37,128, 69,138, 13,188,144,202, 82,254,185,209, 25,143,170,142, 70,249, 49,118, 34,
+186,210, 10,215, 52,120,223, 74,151, 29, 34,193,119, 34,188, 92,212,184, 78,152,244, 62, 4,156,115,180, 77,135,247,157,172,171,
+124,135,243, 14,215, 9,155, 35,116, 45,177,109, 9, 94, 10, 10,223, 53, 57, 97,178, 35,120,151, 71,252, 45,193,121, 98,134,172,
+196, 32, 43, 7,223,118, 52,243,154, 20, 60,174,109, 8,205,130,208, 44,112,109, 35,207,195,117,196,174,197,117, 78,138,141,174,
+147,213,184,209, 56,231,178,234,190,149,103,208,118,194, 64, 8,162, 38, 23, 85,150, 23, 91, 97,200,207,195, 24, 40, 74,185,192,
+ 11,147,101,213, 57,162, 49,100,213,123,138, 71, 93,114,200,220,246, 28,196, 66,219, 16,219,134,176, 88, 72,224, 77,219, 18, 91,
+ 81,199,167,182, 35, 54, 93, 22, 3, 42,186, 69, 67,219,200,243, 13, 49,208,117, 14,239, 28, 46, 63,147, 20,151,244,196,116,132,
+138, 93,238,254,149,150,105, 79,186, 46,220,102,217,153,231,184, 91,181,196, 14, 7,255, 63,133,179,197, 24, 49,214,240, 93,175,
+ 56, 75,219, 40, 22, 53,204,106,152,215,146, 47,211,116, 34,232,245,153,238,215, 56, 57,227,234, 46,230,238, 60, 81,183, 48,157,
+103, 38,252, 18,221,154,129,122,202, 41,116,210,152,160,136,157, 98,144, 52,253, 88, 80,122,145,171,187, 54,209,185,136, 3,154,
+152, 8, 38,127,255,140,252, 58,208,240,172,187,159,137, 66,241,226, 23,190, 72,202,166, 60,156,104,253, 81,237,210, 69,145, 49,
+ 56, 15,230, 37,119,175,255,100,136, 17, 23, 69,221,121,118,188,206,165,199,247, 25,247, 29, 79,252,245,223,114,108,187,226,215,
+126,228, 23,185,231,217, 79,103,182,104, 57, 85, 90,116, 12,172,245,250,164,232,169,130,231,237, 31,251, 20,149, 74, 28,204,107,
+ 14, 58,199, 51,111, 61,195,238,193, 33,167,215,250, 12,140, 34, 42, 77, 85, 24,118,234,142, 74, 41, 46,205, 59, 22, 94,248,205,
+ 79,219, 28,112,176,232,232, 98,226, 59,190,250,133,108, 29, 60,158, 93, 43, 82,121,250, 36,145,119, 3,109,216,176,134,129,182,
+226,161,142,158,253,224,217,139,158, 98,125,139, 23,126,205,183,160, 76,129, 91, 76,209, 90,246,109,221,108,130, 46, 44, 73,137,
+ 80,197,213, 51,180, 49, 12,214,199,196, 38, 82, 14, 53,243,195, 78, 42,103,101, 72,174, 65,151,235, 12,214, 74,162, 75, 40,171,
+177,182,207,124,127,143,132, 99,182,243, 36,253,241,166, 8, 95, 98,192, 90, 67,183,208, 52,211,115, 84,163,173,204,174,238,208,
+ 85,129, 86,150,249,254, 30,229,208,128, 31,178,179,243,121, 70,155,235,168,168,209, 21,132,185,166,191,185,198,222,185, 61, 90,
+127,141,209,214, 9,230, 59, 7,216,194,112,184,183, 71, 53, 50,216, 98, 3, 55,159, 81,141,143,241,228,131,247, 81,174, 25,166,
+251, 19, 38, 87, 46,112,234,216, 41,206,156,172,216,220,220,226,236,109,183, 48,180,142,197,254, 21, 62,255,177,143,177,152, 52,
+248,105,195,230,173, 39, 8, 59, 51,202,141,117,180, 53, 4,215, 17, 92,195, 96,188,197,225,229, 11,148,189, 30,166, 40, 51,148,
+ 66,112,152,221, 98, 78, 89, 20,252,194,207,191,150,103,223,126, 43, 90,151,210,212, 42, 81,100,232,178,135, 45, 42, 82,116,178,
+ 55, 84,208, 92,153,240,231, 15, 79,120,193,205, 5, 7, 42, 49, 79,145, 41,145, 6,104,151,121, 33, 86, 70,240,214, 66, 89,229,
+134,192, 42,202, 82, 34, 8,173, 86, 88,171, 41, 75, 77,116,162,126, 14, 81,130, 75,162, 79,196, 54, 23, 7,141,140,184,146, 83,
+152, 0,253, 78,211,247,138, 94, 48,156,184,227, 22,122, 55,220, 72,216,191, 72,119,245, 26,244,123, 96, 13,166,234, 81,156,188,
+137,242,212, 41,220,181, 43, 82,245, 91, 5, 69,129, 46, 7,232,254, 16,188,167,219,219,231, 25,119,158,224,205, 31,184,200, 77,
+182,229,222,231,220, 73, 23,193, 14, 70,216,205, 83,224, 69,205, 27,187, 5,177,145, 67, 43,117, 78, 58,218,178,135, 29,140,208,
+131, 33,166, 63, 68, 21,149, 64, 66,114,140,173,140,187,237,138, 84,182,242, 72,167, 18,170, 33,201,140,242,136,122, 65,170,231,
+164,230,144,174, 46,153,108,189,128, 56,220, 70, 49, 39,210, 81, 12, 43,202,209,152, 98, 56, 64, 27, 69, 53,188,129,183,191,241,
+ 13, 60,255, 37, 95, 71,218, 63,224,116,169,151,113,224, 34,254,202, 97, 16,135, 93,228,155,159,181,205,214,139, 95,192,236,211,
+255, 35,239,148, 85,206,230,200, 30, 92,179, 84,226,235, 60,225,144, 86, 65, 93,151, 24,165,242,206, 93, 45, 17,150, 62,174,180,
+ 1,218,154,149, 64,108, 25,225,154,212, 50, 77, 60,171,235, 51,160, 70,160, 49,113,149, 19,162,180, 34,206, 14, 24, 63,255,149,
+132,197, 30,166,215,199,150, 61,217, 41,251,142,110,118, 72,104,107,130, 11,171,236, 16,171,151, 33, 76,118,197,108,195,251,149,
+117, 47,248, 72,116,173,216,191,150,160,153,140,105,139, 73, 29, 69,107,166, 72, 76, 2,104, 74, 41, 9,221, 12, 1,237, 72,244,
+102,200,104, 82,228, 29, 90, 66, 94, 84,194,119,142,206, 57, 66,144,139,179,115, 78,184, 45, 49, 91, 21,151, 57,238,185, 32,136,
+ 89,109,143,145, 84, 49,177,211,101, 79, 62, 50,177,113,173, 32, 81,131,143, 25, 32, 19,178, 72, 48,160, 82, 20,107, 92,126,238,
+ 33,137, 79, 94,161, 8, 62,160, 98, 32,116,142,164, 12,182, 87, 74, 26,229,165, 75,244,198,107,178,103,215, 22,219,175,208, 85,
+ 79,246,241, 90,184, 4,203,213, 4, 74,229,139,188, 18,227,115,182, 11, 18,243,116,235,186,137, 12,174, 61,234,126,243,109,150,
+234, 5, 42, 68,252,225, 4, 92,135,171, 23,184, 70,222, 19, 82, 32,248,112,132,156,205, 33,224,106,121, 35,243,143,226,215,181,
+ 94,193,124,150,197,167,220,104, 41,187, 52,146,144,248,150, 41,128,249,194,143,136, 96, 19, 99,177,101,129,237,245, 81,131, 33,
+186,215,203, 88, 54,123, 29,167, 33, 48, 59,216,227,173,191,249,115,162,135,208, 57,183, 66,229, 31, 41, 41, 98,210,171,188,139,
+152,217, 14,162, 19,146,207, 52,155,231,212,181, 28,118,167,181,112, 54, 44, 90, 2,193,180,128,180, 42,163,233, 41, 67, 79,105,
+138,252,227,204,218,192, 34, 68,130,150,117, 87,204,255,238,100,100, 50,160, 20, 12, 71, 99, 94,246,210, 47,103, 99,115,139,167,
+222,113,150,167,222,121, 15,103,207,222,195, 51,158,121, 15,159,254,212,167,143,134, 35,153,222,107, 93,146,164,161,194,200,152,
+ 98,209,182, 84,235, 91,124,228, 67,143,179, 56,119, 64,120,207,251, 81, 3,195,188,105,153,207, 23,116, 42,114,211,198,136,247,
+ 62,177,195, 86,169, 57,123,108, 72, 82,137,211,163, 62,105, 58,165,208,224,154, 6,131, 98,183,233,100,220,133,226,210,188,225,
+ 91,190,232,110, 62,252,185, 7,177,202,224, 98, 98,175,150,106,109,179, 87,225,149,229,120,119, 21,101, 12,198, 68,108,180, 84,
+ 38,209,115,158,190, 41, 24,105,168,172,197, 68, 25,123, 52, 49, 49,143,129,218,123,238,121,250,189, 40, 99,240,237,130,178,191,
+ 70, 74, 50, 78,182,189,138,122, 58,165, 28, 38,186,206,163, 73,204,118,247, 81, 58,210,122, 71,115,105, 70,215,117,160, 42, 98,
+187, 71,215, 25, 66, 56,196,218, 10, 59,218,164,153, 94,194, 7,104,166, 7,244,199,183, 80, 13, 78, 50,185,246, 56,235, 39,110,
+ 39,118, 17,179, 81,176,152, 46,240, 49, 16,124,135,107, 59,218,110,202,112,180,142, 39, 80, 88,137,174, 52, 69,162,153, 56,194,
+241, 26,165, 11, 74, 93,114,112,248, 36,235, 55, 31,163, 24, 86, 12, 55, 70, 36,103, 24, 30,219, 34,161,232,171, 26, 75,133,143,
+141,124,147, 26, 88, 44,246, 40,202, 27,217, 56,113,146,110, 49, 97,127,103,202, 45,103,215, 40,170, 30,166, 88,103,189, 72,140,
+142,111,178,113,203,151,112,203,243, 95,192,238, 67,159,229,252,199, 63,206,248,216,109,108,108,111,161,181,198,246,215,184,250,
+232,195,156,184,237, 14, 6,199,142, 17, 67,164, 93,204,169,250, 3, 20,138,182,158,161,139,146,166,158,145, 10,248,245,247,254,
+ 5, 63,250,202, 87,160,155, 30,237, 96,131, 50,200, 97, 99,250, 21, 69, 5,116, 53, 77, 29, 48,165,162, 80,240,241, 39,106, 78,
+220, 92,209, 36,249,146, 6, 18, 81,165, 85,130, 80, 92, 6, 63,229,213,150,201, 76, 99, 5,212,117,162,172, 18,195,158, 6, 11,
+ 97, 17, 41, 10, 45, 83,201, 76, 77,245, 46,187, 83,130,168,224,241,138, 34,194, 32,104,246,246, 59, 30,255,228,147,124,235, 43,
+ 74, 38,151, 21,102,208, 39, 86, 21, 84, 37,229,137,155, 49,227,117,220,133, 71, 73,157,151,184, 81, 31,243, 43, 20,165,219, 27,
+ 15, 49, 23, 3, 79, 94,152,240,193,239,191,139, 59,127,241,115,156,220, 90,227,197, 95,247,114,185, 29,157, 3, 21,136,237,156,
+176, 88, 16, 93,155,115,178,243, 1,163,149,132,117,144, 8, 49,174,196,195, 41,137,158, 4, 93,228, 67, 68,172, 75, 41, 65, 50,
+ 61,146, 29,130, 42, 73,237,148,208, 46, 72, 77,135, 15, 37,211,241,115,136,131, 33,101,154,147,156,228, 64,247,198, 99,202,181,
+ 53,208,129,193,230, 13, 92,252,220, 39,248,170,123,159,198,126, 23,184,167,103,112, 49, 31,242, 25,206, 82, 26,139, 91,238,125,
+ 83,194,161,233,158, 60,135,234,175, 19,231,147, 85,144, 71,200,130,210, 24,162,196,145,202, 13,191, 82,183, 11, 82, 56,173,210,
+207,148,214,196, 37, 94,117, 57,251,212,162,197, 16, 23, 67,238,252,211, 81,113,158,114,210, 91,204, 9,104, 42, 8, 67, 51,146,
+187, 45, 93,226,103, 7,178,142, 48, 90,158,175,217,146,142, 93,137,192, 48, 69, 69, 8, 66,223, 51,218, 16, 82, 86,235, 27,133,
+210,165,136,168,108,135,175,157,184,175,156,147,207,148,225, 38, 81,235,163,209,109,182,197,173,216,154, 64,200,118,191,164,174,
+243,195, 7, 71, 8,203,216,207,110, 57,215, 88, 93,236,193, 7,220,162,198, 39,136,206,163,172,193,117,200,119, 44,136,141, 19,
+ 47,177,169,178,118, 1, 31, 60, 58, 74,232, 84,236, 58,108, 89,138,245,205,100,155,150,147,194, 47, 37,217,157, 7,101,133,152,
+ 57,172,232, 92,182,115,197, 32, 46,133, 32, 93,158,192,163,178,165,141, 68,153, 23,177, 73, 41,201,126, 80, 71,224,156, 24,132,
+198, 70, 97,101,236, 29,162,100,252,100,251,161,228,119,106,185,196,151,193, 47, 8,167,127,197, 71,237,132,151, 26, 98, 71,108,
+ 26, 89,109,233,204,250,175,107,252,124, 46, 46,151,186,206,223, 18, 45, 84,191, 37,227, 52, 38, 20, 45,170, 44, 68,159, 17,128,
+104, 69,144, 25,132, 49,162,162,151, 93,191,213,215,197,246,202,248, 41,105, 89, 93, 44, 99,117,117,206,156, 71,231, 34, 50,105,
+140, 17, 81,106,140, 33,219, 26,175, 75,118, 75, 71, 0,166,217,199, 63, 46, 14,155, 32,156,254,216,202,123,164, 76, 94, 39,170,
+132,242, 74, 70,234, 42,163,140,115, 1,178,104,164,163, 79, 89, 21,188,148,165, 84,133, 32,157, 85, 82,148, 58, 83,252,156,241,
+190,203,176, 0, 0, 32, 0, 73, 68, 65, 84,194, 43,104, 82,196, 38,112, 33, 50,243,145, 46,239, 44,179,150, 18, 99, 98,126,150,
+ 98, 18,248,232, 71, 62,202,135, 63,242, 17,190,232,185, 47,224,111, 63,240, 97,252,117, 24,253,112, 93,184,222,146,168,105,190,
+244, 25,195,159, 84, 38, 98,148,166, 52,154, 83, 55,222,204,163, 31,124,140,227, 39,183,104, 85,143,247,126,250, 18,111, 61, 55,
+231,165, 55,173,241, 85,223,254, 26, 62,250,200,195,148, 27, 39,248,137, 31,251,183,124,205, 87,188,140,123, 94,240, 66, 78,140,
+215,249,228, 3,143,114,243, 77,167,153, 28, 30,242,138,103,222,202,109,125,205,164,110,241, 33, 49, 42, 20,227,170,226,177,171,
+ 59, 52, 57,170,209,104,197, 23,111,175,177, 85, 26,146, 41, 57, 61,172,120,229,211,182, 51,100, 34,255,226,150, 24,196,148, 88,
+215,134,126, 81,160,181,140, 96, 28,145, 58,120, 22, 42,241, 69, 47,255,122, 78,156, 60, 67, 12, 30, 83,245,104,243, 23, 42,120,
+ 65, 42,246, 71, 27, 76, 46, 94, 70, 27,131,115, 18, 86,208,214, 75, 74, 85,143,114, 96, 57,184,188,143, 46, 2, 68,131, 86,208,
+ 53, 45,133, 53,153, 90, 37, 66, 9, 93, 24,209, 90, 40, 39, 57,202,133, 70, 57, 69,240,142,162,234,179,119,245, 2,227, 99,219,
+116,139, 89,102, 96,123, 98,236, 40,170, 30,169,179,152, 94, 34,118, 13,168,138, 20, 26,148, 50,204,247,246, 81,101, 75, 89, 14,
+ 73,201,113,176,115,128,214, 19,250,107, 39,112,237, 2,173, 52,205,162, 99,122,240, 56,253, 65, 65, 85,142, 73, 42, 98,204,128,
+170,239,232, 15, 78, 51, 61,120,146,205, 27,238, 96, 49,109,241,177,165, 26,109,112,227,179,159,203,240,216, 9,202,209, 16,165,
+ 11, 98,244,128, 97,176,181,193,254,197,243, 20,213,128,114, 48, 0, 68, 33, 92,244, 42, 20,210, 73, 78, 15,175,242,158,119,252,
+ 6, 74,193,135, 62,247, 48,201,246,185,251,233,119, 17,236, 38, 73,139, 0, 72, 43,177,206,185,230,144, 39, 62,117,129,191,184,
+212, 48,233,224,105,183, 88,102, 49,209,229,247,116,185,251,210,121,130, 87,100, 87, 83, 81, 72, 2,155,181,146,168, 37,231,136,
+162, 42,116, 22, 6,201,151,212,116, 9,213, 66,108, 19,190, 78,248, 69,130, 69, 66,117,208,219,131,143,127,174,227, 93,143, 53,
+252,191, 23, 60,229,230,136, 87,126,245,115,233,218, 22, 55,217, 69,247,122, 20, 39,111,198,172, 31, 35, 28,238,224,118, 46,161,
+172,149, 78, 79,139,184,200, 12,214,209,131, 17,248, 57, 97,239, 16,155, 18,131,241, 26,204, 23,124,223,219, 30,231, 5,199, 27,
+206,190,228,197, 68,211, 35,206,247, 8,211, 67, 73,127,114, 29,201,101,102,117, 78, 74, 91,102, 60,163,244, 10, 69, 74,202, 16,
+ 36, 85,200,129, 90,183,164,168, 73,197,128, 84,140, 32,116,146, 84, 54,217,165,155, 5, 38,189,103, 50,173,158,130,173, 16,150,
+ 65, 37, 99,246,114,109,140,173, 74,122,227, 49,213, 96,155,239,255,170,151,241, 61, 63,250, 51,156, 41, 52,107,153,183,191, 12,
+199,170, 10,205,229, 58, 48,220, 88,227,218, 97,205,168,208, 52, 62,241, 13,247,156,164,127,106, 76,239,204,115,104,158,120, 96,
+213,165,163, 37, 11, 96,133,192, 90,165,108,229,174,154,235,236, 7,153,178,166,178,224, 45, 59,218,164, 51, 90,230,212,174,168,
+114,113,245,255, 85, 41,253,163, 93,168,202,251,231, 44,212,138, 29,218, 90, 6,103,159,135,238, 91, 98,219, 81, 12, 70,171, 29,
+170,107,230,184,102, 46,222,239,232,177,166, 16,220,177,213, 50, 57,202,148,186,224, 59,124,211,137,166, 35,248,236,237,150,159,
+ 33,116, 50, 34, 86,214,224,154,154,148,121,233, 49,196,156,201, 29, 4, 64,147,243,186,189,247,196,214,225,187, 46, 7,171,200,
+ 42,193,181, 45, 33,143,136,125,231,233,188,163, 93, 52, 52,141,140,221,149, 17, 59,220,146, 60, 18,149, 4,220,172,146, 77, 67,
+204,103, 19, 43,200,130,136,172,101, 28,238,186, 14,223,121,233,206,151,145,177,217,190,151, 98,194,117,157,196, 35,167,152,159,
+113, 22,172,134,101, 78,121, 68, 87, 54,163,114, 21,236, 92,161,223,239,161,141,197, 20, 6, 91, 86, 20,101, 41,235,180,194, 74,
+ 97, 84,100,175,191, 81, 80,246,100,244,190,140,103, 85, 72,231,158,124,206, 2,181,121,167, 46,157, 57,206,225,235, 57,110, 62,
+197,237, 79,104,231,115, 66, 39,207, 40,180, 45,161, 94,208,205,231,132,224, 87,251,113,149,161, 60,194,102,136,171,236,250,101,
+240,139, 74,226,249, 95, 5,215,132,220, 6, 47,163, 97,151,209,100,234,136,226,183, 76, 17,206, 58, 96,116, 81, 72,209, 80, 88,
+138,181, 17,202, 20,168, 94, 63,211, 17, 11,252,222, 46, 74, 41,186,239,252, 17, 62,220, 63,192,235,150,232, 21, 97,105, 63, 67,
+216, 24, 74,201,180,203,102, 4,246, 18, 73,237,162,184,247,124, 39,235, 65, 41, 54, 69, 16, 39,191, 31,149,167, 59,153,235,174,
+ 20, 49,202, 8, 95,165,196, 34, 70,225, 8,216, 92,211, 40,209, 97, 44,245, 1,203, 1,134,207,100,185, 39,207, 63,137,213, 71,
+143,128, 36,225, 46,225,122,104,223, 50,132, 49,165, 12,152, 39,178,223,181,108,140,198,252,218,187, 31,228,106,244,220,185, 49,
+230,228, 96,206, 3, 97,192,191,253,201,255,139, 87,221,113,154,233,206, 21,126,246, 39,127,154,241,160,207, 62, 48,176,150,157,
+201, 33, 23,247,247,185,125,251, 56, 63,247,190,127,160, 95, 20,108,247, 11,142, 15, 43,214,171,130, 51, 27,125,254,246,243, 59,
+171,148, 33, 31, 2, 15,238,206,184, 99,107, 64,232, 58,214, 7, 61, 82,215,162,178,186, 51, 37, 75, 21, 35, 67, 99,233,105, 69,
+105, 68, 60,160,148, 37, 21, 9,147, 20,198, 42,130,131,227,167,111,198,183, 53,189,241, 49, 66,211, 16,157,167,115,141,132,185,
+132,192,193,229, 39,105,155, 57,237, 98, 66,217, 31,210, 54,158,162,170, 56,220,219,165,168, 6, 76, 47, 93,166,191,118,140,217,
+222,195,244, 54,207, 80, 47, 22,148,189,117,177,162, 77, 59,102,147,171,108,108,223,134,155, 75, 26,217,222,197, 3,250, 3,133,
+ 74,199,153,205,119,233, 13, 12, 93,187, 96, 56, 94,163,171, 91, 20, 5,157,239,208, 41,162,117, 65,215, 54,204, 14,119,100,247,
+106, 43,124, 23,169, 6, 61,202,106, 72, 50, 61, 22, 7, 87,209,202,210, 31, 30,163,215,239, 99, 10,139,119, 30, 31, 58, 76, 89,
+ 48,185,112, 69, 82,219,204,128, 24, 53,166,128,114, 45,161,108, 15,221,211, 52,243,146, 43, 23, 63,206,230,201,167, 17, 66,192,
+ 47, 90,140, 6, 95, 88,202,162,207,225,181, 75,140, 78,156,166,158, 30, 98,203,138,170,191,198, 98,239, 42,229, 77,183,210,206,
+ 91, 6,235,107, 66,191,138,158,178,223,231,145,143,126, 4,107,143,192, 80,127,243,153,251,249,224,167,238,231,127,249,178, 47,
+227,249,207,124, 6,221,252, 0,231, 12,113,177,160,187,188,207, 31, 60,112,128,210,112,185,133,223,251,112, 3,121,186,157, 45,
+148, 20,121, 93,217,183, 2,139, 89, 98,165, 43, 43, 30,244, 99,107,137,106, 0,253,245,200,211,238, 76,108,223, 86, 48,232, 67,
+175, 50, 20, 5, 88,151,112, 83,136,179, 68, 61,129,243,127,223,241,247, 79, 68, 22, 30,174,101,151, 77,105,225,175, 31,222,161,
+212, 17,108, 69,177,190, 78, 72, 80,172,159,192,215, 83,194,206, 69,136, 74,198,198, 70,132, 94,145,132, 42,181, 4,139,248,128,
+202, 93,245,212, 7,126,236,149,183,115,113,242, 0,175,248,133, 79,240,186, 79,190,129,159,125,219, 27,233,246,206, 19, 38,251,
+ 82, 21,135,110,213,225,165, 40,111, 87,202,187,100,146,147, 64,148,176,132,161, 68,208,217, 47,171, 75,146, 46,228,165, 93, 76,
+112,251,215,232,230,145,217,214,115,232,250, 39,168,170, 72,207, 6, 76,207, 98,122, 21,197,176, 71,209, 95, 67,105,195,214, 45,
+119,242,167,191,244,179,124,231,235,126,158, 27, 20, 60, 61,119,231, 75,182,180,213,154,153,243, 96, 13,127,246,214, 95,225,174,
+175,252, 6,230,243,134,219,111,120, 42,119, 12, 45,163,141, 53, 6,167,206, 80,221,251, 42, 14, 62,248,167,178,119, 76, 9,240,
+226,137, 95, 74,219, 67,144, 75, 59, 11,160,150, 30,109,117, 29, 31, 62,118,110,165,204, 17, 6,121, 92,137,167,142, 6,246,114,
+241,172,118, 1, 25,154,178, 12,149, 17, 4,150,149,174, 61, 7,202, 28,252,237, 31,115,236,107, 95, 77,219, 77,100,197, 99,123,
+114, 80, 21,213, 81,142,246,210, 40,166, 88,121,179,117, 81,146, 92,139, 86, 22,159,139,249,235,139,170,172,199,147,189,127,235,
+ 80,218, 16,150,151, 74,240,171,164, 53,239,226, 42,117,204,183,173,168,172,151, 57,232, 25, 22, 19,124,148,137, 75, 4,159,109,
+115,174,115,116,203,169, 72,136,244,135, 61,193,148,146, 80, 73,225,210,209, 92, 89,101,165,184,107, 58,180, 45, 72,218,137,184,
+ 16,157, 51,189, 5,133, 26,131, 76, 4,180,206, 78, 5, 39, 40, 46,231,164, 80,201,209,234, 2,112,210, 26,223,133,124,231,138,
+248,217,119, 29,198, 24,137,130,141,200,222,190,147,201,108, 92,238,194,163, 4, 38,129,202,180,168,252, 31, 93,200, 5,191,140,
+ 36, 43,147,116,233,174,203, 42,120,225,146,154,194, 18, 0,211, 54,164,206,211,214,139, 76, 15,204, 47,185,235,136,243,185,232,
+ 67, 26, 71, 84, 26,213,151,209,191, 41, 45, 38, 67,134,150, 16, 33, 41,186,141, 56, 35,140, 69,100,232, 58,139, 90,245,106, 6,
+ 46,107, 34,105,109, 5,197,155,137,136, 41, 55,130, 90,166, 25,248,128,118, 14, 63, 95, 80, 84, 3,152, 78, 81,235,199, 72, 46,
+ 48,189,114,137, 63,254,162,151,240,141, 47,122, 57, 47,122,201,171,120,231, 59,222,140, 50, 73,198,231, 49,235, 3,151,231,149,
+ 6, 79, 92, 45, 2, 72, 9,215,201, 14, 59,184, 92,112,101, 11,191, 79,162, 94, 79, 62, 72, 83,230, 19, 70, 65, 71, 18, 34,102,
+130,218, 10, 92,139, 66, 46,114,169, 83,146,200, 25,114,186,173, 86,208, 6,217,128,196, 8,195, 99, 27,188,232, 69, 95, 70,175,
+ 55, 98,127,111,202,123,222,251,126,174,238,236,211,249, 37, 95, 39, 81, 88,176,201, 68,116,138, 68,165,240, 33, 50,153, 29,240,
+ 21, 47,255, 50, 94,246, 93,223,197,199, 62,240, 97,222,252,182,191,224,159,127,213, 23,243,254, 7,175,241,148, 81, 69, 10,142,
+201,228,144,187,182, 55,232,247,122,204,139, 1,183,109,173,241,193,251, 31,225,177,157, 57, 87,175,237, 50, 64, 51, 44, 45,187,
+ 77, 71,101, 44,231,167, 13,107,253, 1, 90,193,237,163, 62, 13,137, 46, 42,214, 43,203,133, 69, 32,162,184,231,212, 56,251, 12,
+101, 76,165, 59, 79,161, 10,214, 74, 37,135, 35, 98,210,143,161,203,122, 22,137,145, 52, 10,214, 70, 27,153,165,236,196,119,107,
+ 37,176,194, 53,115,138,106, 64,115,120, 64, 97, 53,182, 88,195,165,200,228,218, 46,131,181, 10,173, 43,218,217, 33,190,107, 40,
+122, 11,122, 27, 55, 66,236,216, 61,255, 4, 39,110, 57,131,107, 21,182, 63,160,185,224,136,199, 61, 41, 53, 4,215, 49, 28,143,
+ 88,204,118, 40, 71, 96, 88,142,167, 42, 18,158,182, 62,100,109,125, 27, 55, 23,133,114,136,157,164,196, 21, 21,190,107,233, 13,
+123, 76, 39,251,180,179,203, 4,223,209,236,206, 48,131, 25, 93,221, 39,118, 9, 51, 40,232,143,142, 83, 31, 54,244,251,155,130,
+153, 61,181, 65,125, 8,235,219, 91,212, 51,133,119,115, 10, 61,198, 84, 2, 85, 89, 59, 81, 65,186,139, 20, 44,135,251,143,177,
+127,249, 56, 55,204,159,129,210,154,201,229, 11, 12, 55, 55,136,193,179,251,249, 71, 25,159,216,198,148, 37,213,112,157,216,212,
+ 25,167,217,195, 53,135, 25,166,161,120,231,239,255,199,108, 99,146,247,219, 42,233,162,223,254,190,191,225, 79,254,234,111,120,
+222,217,219,121,233, 51,111,199,246, 6,212, 68,238,159,194,241,129,216,213,186, 92,193, 58, 17,134,174,226, 1,181,150,247,115,
+217,204,121,192, 56,249,179,167, 53,116, 1, 10,147,248,244,125,142, 50, 57,150, 92, 5,179,196, 44,102,219,244,161,135,118,149,
+ 34, 39,126, 78,159, 96,221,192,197, 3,199,222,147,231,137,186, 79,113,242, 6,226,238, 46,170, 40, 73, 59,123,248,195, 41,102,
+109,176,186,172,196,150,155,208, 70, 68, 89, 97, 49,149,201,203,180, 67,147,184, 54,233,248,213,111,127, 58,225,119, 63,203,207,
+191,247, 60,175,124,203,239,241,194, 23, 61,155,182,203, 28,241, 37,105,203,103,140,106, 12, 43, 75,210, 23,192, 47, 84, 30,249,
+106, 39,187, 74, 23, 72,218,225,166, 51, 38, 15, 61, 65,119,211, 75,224,212, 29, 20, 69, 98, 80, 68, 76,105,209,101,137,233,247,
+ 40,122, 21, 49, 70,198,219,167,217, 61,119,142,179,189, 83,204,125,228,108,207,224, 67,202, 23,122,202, 81,216,134,115,181,227,
+167,191,239,155,248,134, 31,252,126,162,170,152,238,239,163, 85,193,253,143, 63,200,135,191,227,203, 41,110, 56,197,240,230, 59,
+ 8, 69,155,249,239, 57,184, 36, 42,146,142,162, 28, 86,228, 68, 55,241,178, 11, 54, 54,174, 70,199,132,144,243,215, 83,254,251,
+ 75, 82, 86, 14, 33,201, 49,172,202,232,163, 61, 55, 2, 7, 81,198,172, 60,197,171,221,105,148, 85,132,178,226,152,168, 31,189,
+ 15,211,235, 19,163, 35, 58, 81,124, 75,176,141,116,244, 41,127,142, 16, 3,189,178, 66, 27, 67,138,126, 5,191,137,161,147,137,
+157,174,100,207,163, 88, 37,175, 97, 12,100,132,108, 74, 33,187, 0, 34,193,137,184,204,119, 14,231, 28, 42, 36, 65,179,250,144,
+ 83,225,178,166, 24,129,232,196,184,188,188, 29,193,121,218,214, 81,183,173,212, 71, 70, 81, 20, 21,174,109,196, 49,160, 20, 42,
+ 28,217,241,162, 15, 43,111,121, 74,178,223, 47, 85, 73,138,162,248, 38, 38, 66,134,172, 68, 31, 49,133,145,157,238, 42,156, 37,
+ 16, 67,162, 91, 68,180, 21,143,179,242, 6,111, 20, 42, 72,254,186,139, 17, 91,150,132,228,192,151, 24,165, 81, 4,146,235, 8,
+109, 67,232,186, 12,170,202, 98,179,234,127, 82,143,229,248,213, 60, 69,233,156, 8,224,180,206,203, 99, 25,115,211, 54,164,197,
+ 2, 83, 86, 96, 10, 82, 76,216,144, 48, 74, 2,123, 34,129,160, 13,244,251, 40,239,177, 77, 77,152, 76, 9, 87, 61, 29,138, 88,
+ 22,164,178,196,150, 21,182, 95, 97,123, 37,198, 90, 84,217,195, 68, 35,110, 7, 83,162,146, 71,121, 45,110,137,148, 25,247, 25,
+250, 67, 92,226,143,211,106, 93, 36, 29,114, 66,235,128,194,146,122, 67,252,162,166,218, 30,128, 46,121,232,103,127,138,183,254,
+250,155,184,122,113,151,111,184,249, 86, 70,223,245,109,124,221, 11,238,229,221,127,254,219, 36,163,104, 73, 36,189,156, 80,201,
+247,217, 57,209,118,173, 88, 4,203,181, 96, 56, 2,214,233, 32,118,253,180, 28, 86,229, 70, 57, 88, 37,143, 45, 69, 92, 86,152,
+248, 0, 61, 3, 86,201, 95,107, 19, 69,139,152,207, 57, 67,134,219, 24, 8,121,210,249,178,151,189,140,247,191,255, 67, 60,254,
+196, 21,182,143,159,228,203,190,252,101,252,254, 31,254, 73,174, 57,197,223,238, 28,216, 36, 95, 85, 20,158,104,225,224,224, 50,
+167,191,246, 89,216, 59,239,229,159,124,201,151,114,230,150, 51,196,249, 21, 62,250, 15,127, 66,213, 27,242,119,251, 29,255,242,
+107,254, 9, 55,156,190,129, 63,251,179, 63,227,217,219, 3,174, 78,230,212, 74,243,190, 55,190,150,250,218, 46,151, 47,239,241,
+246,191,251, 60,159,185,176,195,194, 59,122,166,224,179,151,174, 97,148,226,161, 73, 45, 7,170, 46, 56,232, 34,195, 66, 99,147,
+226,169, 39, 55, 37, 97, 41,163, 42,181, 49,104,149, 80,169, 16, 63,102, 10,171, 17,148, 85, 70, 94,246, 38,210, 55, 6,213,213,
+168,245, 99,162,196,238, 90,140,173,114,130,146, 34,116, 13, 40, 75,209,215,180,179,134,197,162,145, 3,217, 84, 20, 85, 73, 59,
+ 59,160, 90, 59, 65, 61,189,132,102,132,174, 20,163, 19,103, 56,220,185, 70,181,118, 12,215,204, 24,172,143,233, 22, 83, 22,211,
+ 67,170,193, 6,221, 98, 66, 89, 13, 80, 33,161,171, 42,115,160, 61, 93,221,178,216, 63, 96,122,237, 60, 91, 55, 62,133,182,174,
+133, 20, 85, 40,138, 94, 65,219, 30, 82, 13,183,105,102,123,160, 10,124,104, 41,215,199,212,139, 43,244, 21,180,173, 33,249,125,
+240, 70,176,173,229,154,252,178,140,165,232,105,130,131,195,189, 75, 12,215,101, 23,218, 53, 10, 83,204,233,154, 14,165, 46,210,
+227, 12,183, 60,243, 43,184,241,158,231, 48,185,114,137,241,182, 80,239, 54,111, 60,195,149, 71, 31, 97,227,198, 51,116,243,154,
+201,229, 39,216,190,243, 25, 52,211, 67,122,235,235, 56, 87, 75,199,101, 75,234,249,132,233,206,149,163, 61,104, 92, 2,164,196,
+158,166,108,226, 83,143,124,158, 7, 31,126,156,161, 86,156, 80,134, 31,122, 97,143,104, 20,141, 78,236,167, 72, 71,100, 22, 3,
+139, 32,158,221,140,218,167,237,178,235, 40,192,225, 34,143,174,144,151, 97,238,229,127, 15, 73, 46,237, 37,148, 43,223,151, 84,
+ 89,168,162,145, 51,104, 92,193, 86,161,120,229, 77,125,238, 94, 47,248,131, 7, 38, 52, 30,126,227,119, 63,200,191,249,225,111,
+100,182, 31, 49,253, 57, 74, 73,152,177,202,241,161,171, 3, 53, 95,184,170, 40, 73,205, 76,186,183,126, 73, 58,104, 72,117,141,
+ 93, 27,114,101,222,241,203,223,122,150,111,190,239, 26, 63,254,107,239,227,253, 95,249, 60,194,242,128,117,121,156,188, 28, 11,
+166, 40, 29, 97,182, 10,165,156, 58,162,146, 65,245, 42,180, 54,184,174,101,241,196,121, 14, 30,190, 76,216,190,151,242,185,175,
+161,234,201,238, 80, 85, 22, 91,150,216,170,192, 84, 21,201,104, 76,191,199,241, 27,110,229, 71, 94,245,106,222,242,151, 31,227,
+169,149,102,164, 53, 77, 76,121, 92,155, 24, 88,195,197,133,227,236,233,117,254,159,119,254, 10,131,237, 27,104,234, 64, 57,176,
+184,121, 75, 61,155,243,185,159,251, 65,238,252,146,187,216,124,198,179, 96,124, 12, 93,174, 73,199,156, 34,113,233,231, 77,234,
+200,135,189,180,163, 5,143, 41,138, 47, 28,155, 39,241,160, 47, 3, 90, 84, 86, 26,171, 44,214, 90, 66,173, 69, 5, 31, 80,166,
+ 88,121,130, 99,184,142, 50,151,228,187, 21, 99, 64, 23,178,191, 47, 54,143,115,227,247,254, 50,232, 5,101, 81, 10,251, 60,249,
+213, 76, 53, 52,221,170,104,146, 67, 76,203, 20, 99, 25, 27, 27,211,170,107, 75,153, 21,158, 50, 1, 47,154, 4,222,203, 74,108,
+117, 65,166,140, 79, 13,116,117,141,111, 61,222, 7,105, 28,242,222, 60, 44, 3, 88,178, 16, 68, 58,244,220,169,119,145,206,121,
+234,133, 88, 14,101, 71,107,133,206,168,197,235,174,180,132,229, 68,231,240, 33, 98,141,166,109, 90,116, 97, 81, 49, 95, 80,249,
+ 29, 95, 18,197, 36, 34, 85,138,137,164, 10, 33, 98,102,214,168, 50,134, 24, 60, 46, 70,138, 21, 78, 76,173,214, 34,166,144,177,
+187,107, 26,138,170, 71, 55,159,162, 80, 24,163, 9, 41,137,146,190,169, 69, 85,190, 76,130,139,233,186,125,186, 17, 53,234,178,
+ 28,211, 26,218, 57, 76,229,204, 18, 75,138,207,106,215, 72,152, 79,161,109,193,181,164,166, 65,181, 29,152, 66,242, 68,208,216,
+232, 72,166,192,143, 70,196,162,148, 64,153,224, 73,179,133, 64,155, 22, 29,126,127, 66,173,243, 37, 61, 24,208,219, 28, 83,172,
+ 13,209, 69,129, 49, 45,202, 24,180, 41,208, 70,173,138,196,184,154, 55,155, 92,164, 41, 17, 34,166,152,233,196,145,160, 44, 41,
+104,134,235,219,232, 96,248,157,111,253, 38, 62,252,222,191, 99, 13,248,138,187,206,114, 60,174,241, 69,111,253, 35,210,179,239,
+ 97,216,214, 98, 25,204,209,183, 90,169,108, 75,204, 25,232,185,120,142, 57,183, 92, 37,145, 21, 56,249,113,133,250, 22, 33,120,
+133, 45,142, 26, 34, 49,131,136,119, 61,230, 21,129,206,246, 51,140, 88,179, 75, 43, 96, 27, 33,199,165,163,102, 70, 29, 5,222,
+185, 32,127,246,197, 75, 87, 72, 17,158,188,112,133,103,229, 33, 74, 74, 73,164, 10,121,227, 99,147,142,132, 20,137, 42, 72, 58,
+ 19, 29,189,211,219,116,215, 30,228,221, 63,240, 99,252,252,135, 46,112,239,153, 17,159,217,217,231,238,219,206, 16,234,154,183,
+254,249,187,121,124,214,240,162, 91, 78,241,161,139,123,188,228,158, 91,249,251,191,125, 35,204, 12,255,225,229,223,201,133,197,
+130, 59, 54, 45,111,120,243,191,227, 53, 63,252,171, 60,112,121, 23,109, 20,133,181,172, 15, 44, 79, 89,239,241,228, 76, 8, 72,
+ 73,105,110, 88,235,113,156, 5,198, 90,146, 15,185, 58,149,151,202, 42, 45, 72, 73,159,178, 93, 86,163,162,198, 36, 24,235,130,
+ 16, 3,139,195,150,225,150, 35,184, 22,223, 74,249,228, 59,135,177,138,102, 94,227,125, 64,227,104,155,134,230,112, 23,101,123,
+236, 92, 60,199,104,243,180,136, 93,154, 22, 87, 55,172,159,188,137,217,222,101,170,209, 58,138, 77, 57, 39,186, 6,223, 52,152,
+162,164,155, 7,186,250, 73,122,107,219, 44,230, 59,162,206, 77,138,122, 58,165, 26,110,176,152, 28, 50, 58,121,140,217,222,144,
+118, 49,165,107, 29, 73,245,240,147, 93, 52, 21, 36, 77,215,206,115,212,165, 37, 56,135, 46, 75, 74,182,232,247,251,236,236,205,
+232,173, 53,116, 11, 7,122,129,155,174, 49,157, 94,101, 48, 26,176, 12,192,114, 78,209,214,115, 48, 21, 85, 15,246,175,236, 80,
+ 13, 43,122,189,147,140,142,157,194, 86, 5, 87, 30,252, 12, 39,239,184,139,201,165,243,108,220,120, 59,211,189, 61,241,245, 86,
+125,174, 62,242, 16, 55,222,117, 55,237, 98, 38,251, 70, 52,174,107, 40,171, 18, 21, 11, 30,252,200,187, 48, 73, 98, 33, 67, 16,
+ 81, 72, 81, 66,211, 66, 53, 40,242, 78,207, 75, 42, 80, 82,116, 86,236, 23, 78,139,206, 33, 22,203, 98, 64, 99,109,148,253,210,
+ 64, 58,177,141,101,194,167,130, 27,147,188, 12,202,202, 11, 84, 26,197,230, 64, 51,180,208,175, 44, 93,128,221, 93,216,191, 22,
+ 49, 13,168, 38, 49, 46, 52,183, 12, 13,199,140, 97,168, 13,184,132,137,154,217,172,225,161, 26,134, 61,248,253,247,125,158, 31,
+125,157, 96, 56,237,218, 8,124, 45,213,191,206,151,142,213,168,100, 64, 39,204,218, 6, 74, 57,226,116, 15, 93,245,100,100,187,
+ 21, 8,243,134,164, 91,236,176,207,238,180,229,238, 59,182,248,191, 79, 15,105,166, 11, 33,143, 45, 41, 15, 41, 43,155,147, 36,
+ 52, 97, 75,138,181, 30, 54, 57,156,247, 68, 52,126, 86,179,120,244, 28,147, 7,158,100,113,165, 99,252, 53,223, 72,245,202, 87,
+ 99,122, 5,170,153, 67, 81, 97,109, 15, 59,232,163, 11,141,178, 37, 49, 58, 78,221,254, 52,222,245, 91,191,205,107,126,248, 23,
+216, 2,158, 86, 25, 17,193, 93, 7,203,232, 92,224, 92,231,248,173, 95,124, 29,247,126,229, 87, 51,157, 76,241,109,196,148, 61,
+230,151,174,225, 98,197,231,127,230,187, 57,245,212, 77,142,221,253,116,198,103,239,149,168,226,202,162,139,190,216,210, 98,166,
+192,173,132,112,153, 34, 23, 36, 47, 93,112,164, 2,244, 80,198,172,172, 69,203,165, 94, 34,137,102,195, 7, 86,224, 46,147, 35,
+ 92,149,149,130, 96, 5,244, 90,242,224,229,119, 78,206,119, 79, 49, 81,108,157,226,204, 15,252, 90, 86, 51,107, 76, 89,226,155,
+ 6, 59, 20,168,148,171,231,194, 44, 88,170,160,179, 96,207,150,229, 81,135,238,221,106,164,156,150, 45, 84, 74, 25, 20,179, 12,
+ 13, 11,226, 88,200,121,241,193,119, 66,157, 11, 65,108,107,221, 50, 16, 4, 82,116,130,115, 77,113,101,149,138, 49, 18,157,199,
+123, 79,231, 3,157,243,180,117,135,143, 17,163, 21, 49, 37,140, 18,107,146,111,192, 90, 47,170, 4, 45, 68,204,174,113,226,234,
+ 89, 52, 34,158, 51,134, 24,193,150, 89,117,191,244,250, 7,233, 12, 77,144,201, 64,200, 2, 97, 99,132,147,230, 91,135,107,161,
+176, 90,212,218, 57, 98, 85,119,134, 94,191,135, 55, 6, 82, 67,212, 26,187,244,207, 71, 97,215,119,139, 5,201,187, 37,239, 49,
+ 63, 78,125,116,137,131, 48,219,149,146, 11,126,178, 79,247,248, 57,166,151,206, 83, 55, 45,214,121,236,104, 3,115,234, 4,101,
+191,135, 73, 90, 68,162, 57, 89,110,153,236,167, 18,232,164, 73,190,197,186, 78, 98, 70,109, 73,212,150,116,172, 34,166, 45,146,
+ 18,173, 66,108, 29,113, 94,211,237,238, 50,123,242, 34,206, 90,138,181, 49,229,177,177,252,247,160, 39, 73,115, 89, 7,162,146,
+146,174,216,213, 25,150,164, 86,142,131,232, 35,110,209, 48, 88, 63,206,252,202, 5,222,251,203,191,193,223,124,228, 83,244,123,
+ 21,235, 91, 99,158, 59,222,100,115, 50,231,139,239,251, 8,234,216, 9, 73,221, 28,172, 97,171, 33, 93, 59,147,120,243,188, 29,
+146,239,106,202,180,193, 28, 10,148, 95,127,114,232,161,134, 21, 74, 86,235,165, 2, 94, 6, 30,254,186,108, 10,157,192, 37,176,
+ 36,140,149,144,150, 66, 73,161, 98,205, 17,201, 54,100, 64, 95,206, 28, 90, 58, 45, 9, 17,182, 54, 79,241,248,227,151,217, 58,
+113,138,214, 41, 58,119, 20,115,189, 12,213,179, 62, 70,146,246, 96, 19, 85, 63, 81, 86, 17,223,238,241, 59,223,244, 61,188,255,
+252,156, 31,255, 15,175,193, 63,246, 48,111,254,220,123, 72,159,127, 18, 83, 22,124,237,179,239,228,171,191,237, 95,242,187,191,
+246, 95, 57,115,106,196,235,255,224,167,104,222,246, 39,244,158,250, 84,110,191, 97,204,167, 31,238,232, 79, 34,255,226,219,126,
+130, 63,124,203, 79,240,211,175,127, 11,151,103, 53, 23,230,158,133,247,124,114,183,225,120,223, 48, 50,129,203, 77,228,204,200,
+ 18,201, 47,158, 18,178, 89, 82, 96,242, 24, 48, 38,181,138,106, 68, 75,103,223,211,134, 53,173,105, 85,129,217,216, 34,117, 13,
+244, 6, 88,171,105,235, 5,190,105, 40, 7,107,212,251,251, 12,198, 35, 22, 51, 71, 53,232,211, 45, 10, 66,138,180,211,142,237,
+ 27, 75,234,137, 33, 41, 1, 51, 40, 18,139,201, 30,229,112, 76, 8,130,186,117, 93,141,247, 30,181, 56,164, 28, 85, 68, 87, 49,
+157,237, 81, 31, 28, 80, 86, 3,186, 46, 80,148,134,197,100, 31, 76,160, 62, 92,208, 46, 38, 24, 51,144,139, 37, 41,130, 11,148,
+131,200,147, 15, 92,101,243,244, 62,221,162,199,249,207,221,207,217, 47,125, 58,245,161, 66,235, 5,109,125,156,182,222, 99,235,
+228, 41,186, 54, 81,216, 17,135,135,251,244,134,107, 76,247, 15, 24,172,175, 51,221,219,197,104,159,227,137, 59,166, 87, 14,233,
+141, 71,162,214, 44, 26,124, 91,211,214, 51,138,162,135,169, 74,138, 97, 31,239, 28,135, 23, 47,209, 95, 31,115,225,254, 79,115,
+211, 51,158,197,124,111,159, 16, 29,163,227,167,240, 93, 45, 47, 68, 2, 85, 68,222,251,155, 63,190, 74, 88, 36,219, 82, 9,160,
+ 10,205,250,120,141,255,159,172, 55, 15,151,244, 44,235,252, 63,207,242, 46,181,156,125,233,211, 75,122,205, 74, 2, 89, 32, 11,
+ 19, 89, 4, 2,200, 14, 6, 84, 24, 64, 68, 81,208,203,153,193,223,184, 33, 63,103,126, 14,200,140, 58, 8, 81,217,100, 80, 81,
+ 35, 75, 36, 64, 68, 4, 5, 66, 8, 97,201,190,118,200,210,123,247, 57,125,182,170, 58, 85,245,110,207, 50,127, 60,111,213, 9,
+254,114, 93,157, 43, 87,119,231,116,159,170,183,158,251,185,239,251,251,253,124,165,140, 89, 62,181, 18,148,154,202,147,201,144,
+ 9,110,113, 56, 37, 40,156,195,214,191, 22,177, 45,234,168,181, 80, 40, 81,127, 88,100,120,224,149, 9,187, 37, 45, 37, 54, 3,
+213,144, 52, 83,193,220,130,102,247,146, 32,201, 5,233, 38,200,174, 68,230, 14, 10,129, 47,125,192, 34,250, 48,213,185,119, 37,
+ 99,163, 78,195,236, 20,158,211, 71, 79,133,148,188, 56,136,123,100,154, 34, 34,129,168,131, 63,132, 10,140,112, 41, 4, 85,103,
+ 29,226, 56,196, 85, 70, 42,216, 80, 26,113, 24,121,214, 33,206,195, 97, 73,185, 58,160,115, 98, 5, 85, 11,225,108,105,160,178,
+184, 42, 99,106,162,201, 48, 47, 88, 91, 91,230,240,145, 77, 30,127,108,141,231, 94,124, 14,246,196, 89, 84,220, 68,159,115,144,
+214,107,174,103,114,118, 1, 95, 12, 16,174, 10, 84,188,201, 38, 58,137,145,113,176,221, 89, 83, 50,189,184,192,218,137,227, 92,
+189,247, 42, 78,117,135, 28, 72, 67, 49,183,126,164,213,135, 88, 73,150, 51,195,235,159,127, 25,191,253,193,255, 65,158,103,116,
+ 55,214,209,209, 4,118,152,145,117, 12,118,237, 4, 39, 63,254,223, 88,188,244, 92, 22, 47,191,136,169,139,175,132,214, 84, 29,
+ 19,101, 17, 73, 3,151, 13, 65,171, 49, 40,198,139, 81,118,123,120,131, 36,174,238,216,235,168, 85,191,141,220, 28,199,125, 2,
+ 66,132,130, 62, 82,188,203, 58, 3, 94, 72, 25, 28, 6,245, 74,205,213, 82,221, 16, 28, 82, 67, 87,240, 8,161,217,243,174, 15,
+214, 5, 45, 3, 36,209,196, 28,101,119, 13, 95,133,144,234,192,235, 49, 99,123, 85, 32,189, 17, 8,125, 74, 80,244,138,186,179,
+241,200, 36,170, 71,231,182,158, 50,200, 26,158, 19,196,157, 40,112,121,129, 19,190,238,238, 60,101, 81, 98, 42, 75, 81, 4,231,
+142,113,102, 76,219, 51, 85, 21,158, 89, 19,128, 52,101, 21, 70,243,101, 89,146, 15,203, 96, 7,118,225, 34,228,188,163,212,160,
+173,166,114, 5,206, 70, 53,222, 84,224,235, 86,170,170, 42,132, 11, 29,178,146, 9, 85,150, 35, 76, 84, 31,240, 2, 99,220, 24,
+ 0,100,172, 12, 64, 22, 25, 32, 59, 69, 30, 46, 25, 35, 1,160,209,245,254,121,164,222, 18, 6,169, 68,189,246, 9, 69, 95, 37,
+ 1,161,173,176, 88,235, 41,250,125, 76, 89,133,247,218,243, 20,209,153,216, 22,188,200, 8,134, 67,232,172, 51,188,255, 65, 86,
+ 79,157,193, 61,121,138,185,211, 43, 40, 1,214, 58, 76,102,232,165,154, 98,207, 14,212, 69,135,136,102, 38, 81, 58, 13,140,119,
+ 31,154,177,112, 7,115,248, 42, 68,170,142,232,148,194,107,164, 16, 40,165,176,194,227,227, 20,215,106, 18,205,205,144, 14,135,
+216,193, 22,102,189,139, 57,186, 73,134,100,144, 36,200, 86, 3,217,108, 35, 35,137, 18,186, 22,208,185,122,226, 98,113,149,165,
+202,250,180,167, 23,168, 10,199,223,190,231,131,108,148,150,168,221, 96,106,102, 18, 45, 4,251,178,130,243,175,216,199,229, 95,
+255,215, 31, 35,203, 5,244,112,140,207,125, 88, 23,214, 91,213,194,109,127, 6,172, 15,170,248, 17, 60, 73, 70, 96, 75,129, 80,
+225, 91, 21, 62,116,211, 74,249,113,241, 31,193,249, 70, 49,194,210,213, 72,132,154,140, 89,179,145,208,163,140,164,167,196,210,
+139, 64,153,174, 47,150,240,205,111,124,147,171,174,126, 30,215, 92, 59,193,202,234, 22, 95,253,151,127,163, 54, 67,132,188, 1,
+ 73,157,147, 34, 9,132, 28, 25, 20, 1,165,235, 35, 15, 92,197, 47,221,113, 43,191,212,156,133,193, 38,203,159,254, 24, 55,182,
+103,184,251,193, 39, 40, 17, 60,176,178,193,167, 62,244, 33,190,246,240, 49, 58, 63,248, 33,229,189,247,242,127,222,250, 97,222,
+245,195, 63,195,148, 37,151, 46, 77,242,130,171,207,103,198, 87,236,127,237,123,121,227,185, 75, 28, 27,150, 44, 15, 13,150, 64,
+208, 42,135, 33,177,248, 96,203,115,193,124, 28, 44, 4,210,133,221,220, 72, 13, 90,119,118,193, 18, 18,198, 23, 35, 33,142,170,
+133, 65, 73,229, 73, 35,143, 74, 91,193, 75, 74, 16, 37,108,156, 93,101,254,156, 24, 21,199,168, 36,166, 92, 41,208, 73,201,160,
+159, 33,133,169,125,157, 37, 85,222, 71,197, 41, 81, 58, 69,145, 15, 49,182,196,150,134,170,200, 16, 50,193, 20, 97, 37, 80, 22,
+ 25, 74,165,193,206,146, 91,108,229,217, 56,251, 56, 58,158,199,155, 38,131,172,143,116,142,210,228, 33,199,184, 40, 25,244,115,
+162, 72, 6,136,194, 80,176,116,238,110, 78, 63,121,140,197, 61, 19, 68,147,243, 20,195, 2,103, 42, 84, 67,209, 57,187, 74,119,
+107,133, 5,183,155,205,149, 83,204,238,156, 99,171,179,137,181,146, 40,106,210, 89, 89, 33,106, 53,217,216, 56,205,252,210, 34,
+174, 28, 34, 27, 45, 42,171,241,110,200,116,123, 31,113, 99, 18, 91, 22, 28,186,230, 57, 12, 55, 58,180,231, 23,176, 69,142, 78,
+ 19, 78,222,127, 23,207,120,249,171, 57,122,247, 93,180,102, 23,104, 78,205,145,247,123, 68, 73, 74,210,108, 81,149, 67, 86,238,
+191,141, 97,119, 53,216, 71,159,178, 23, 50, 2, 76,225,232,103, 37,121,209, 15, 5,189,222,107, 27, 5,165, 11, 1, 16, 78,134,
+253,150,169, 25,224, 94,212,174,169, 90,248, 49,202, 83,240,245,120,105, 44,172, 37, 8,172, 34, 5,202, 10,180, 3,170,160,226,
+ 20, 69, 48,187,139,202, 67, 37, 67,168,130, 23,193, 62, 98, 61,145, 22, 60, 81, 4, 36,177, 7, 14, 76,194, 39, 62,242, 53,126,
+243,189,215,147, 13, 11,164, 20,136,246, 4, 58, 78,145,177, 10,157,170, 10, 69,198, 87, 67, 84, 20,141,255, 82, 94,133,206, 82,
+170, 8,175, 4,102, 80,160, 82, 73,154, 38,188,255,107,199,153,122,228, 70, 62,240, 39,111,101,227,196, 25,204, 48, 99,216, 27,
+146, 31, 95,231,170,191,121,128,173,194, 97,129, 6,208, 16,240,254,111,159,230,142, 47,254, 37, 34,109,133, 61, 67, 57,132,162,
+ 31, 24,238,113, 19, 17,107,116, 18,132, 65, 72,129, 78, 99, 38, 91,179,252,214,127,124, 39,127,251,205,251, 56,144, 72,118,199,
+146,202,109,119,231,137, 86,172, 14, 43, 14, 44, 78,240, 55,159,253, 0,243, 7, 14,210, 61,187,130,119, 18, 73, 68,222,219,160,
+176, 9,254, 7,159, 99,227,123,255,198,222,231, 94,202,228,185,251,153,186,248, 42,226,165,131, 97,132,172, 19, 16, 26, 61, 53,
+139,235,173, 5,126,122, 18,215, 32, 16, 89, 11, 89,195,251, 22, 52,113, 46,140, 61,125,200,176, 30, 3,158,172, 29,103,128, 59,
+231,145, 66,134,203,210,152,199, 29, 18,231,194, 30,221,214, 2,183,250,107, 58, 17,196, 95, 56,132,208,232,169, 57,100,156,224,
+124, 86, 79,231,131,205, 48,154,156, 9,248, 87, 99,198,106,100,129,168,195, 0, 66, 1, 10,214,174, 36,168,204,139, 2,103,171,
+177,242,222,215, 5, 37,164,166,249,177,186, 90, 18,194,176,205,112, 48,158,212, 89,239,169, 76,133,171, 92,216,231, 11, 63, 78,
+ 37,179,198,140, 17,198,210, 4, 2, 89,101, 45, 85,229,200,141,197, 24,131,183, 97, 87,158,120, 48,133,165,148, 5, 90,171,218,
+130, 23,236, 86, 78,202, 64,175, 27,137,168,180,164, 26, 14,131,104,111,152, 99,149, 66, 72, 73, 85, 22, 8, 20, 74,171, 90, 8,
+ 88, 39,231,213,175, 97,150,149,196,177,198,214, 40, 94, 87,154, 58,230,222,162, 84, 68,145, 21, 97, 43,235, 29,210,106, 84,172,
+235,244, 65,133,208,150, 34, 11,224, 28,111, 70,176, 32,247,227,196,215,209,127, 8,139, 61,115,150,254,177, 83,200,147,107,204,
+ 31, 63,133,137, 99,156,210,200, 72,224,253,144,238,242, 6,233,242, 58,199,190,120, 59,170,149,144,156,179,200,196,213, 79, 39,
+221,191, 7, 45, 53,178,149,128,147,168, 56,208, 84,162, 58, 69, 77,200,209,123,169, 81,222, 97,172,195,101, 67,188, 83,200,137,
+ 73,104, 54,145, 83,179,196,166, 66, 84, 5, 62,203,177,121,133,233,108,226,133,164, 82, 1, 42, 35,149, 70,214,173,106, 36, 52,
+135, 94,248, 90,238,248,171,191,225,139, 55,255, 51,211,115, 83,161,118, 32,152, 72, 52, 7, 87,183,120,254, 95,223,192,206, 55,
+253, 2,166, 24,160,147,214,118,184, 75,157,248, 87,217, 90,109, 62,178,231,121, 80,113,184, 80,151,101, 24,163,123, 81,175,142,
+ 70,238, 63, 31,246,235, 82, 5, 55,143,123,138,103,156,209, 61,201,135, 72,242,168, 30,175,187,250,210, 32,106,181,122, 28, 5,
+202,166, 29, 9,243, 2, 48, 51,100,226,136, 48, 41,125,233, 79, 94,199,189,247, 61,198, 93,247, 63, 66,183,155, 81, 84,126,220,
+ 52,249,122, 50,160,195, 48,114,244, 97, 11,190, 60, 39, 45, 85, 17,225, 87,110,231,230,235,223,205,233, 77, 71,191, 91,240,160,
+143,184,242,242,115, 57,118,116,149,153, 86,202, 75, 47, 63,151, 63,248,237,183, 35,146,103, 16, 79,157,230,170, 95,189, 30, 35,
+230,185,232,130, 57, 86,238,239,240, 11, 55,124,153, 43,118,205,240,156,189, 51,244,171,138,103,238,221,197,151, 30, 57,198,158,
+137, 6, 8,199,122, 22, 70,164,147,113,196,190, 25,129, 19, 1, 27, 43,189, 15,209,155, 85, 61,230, 27,169,101, 17, 4, 40, 80,
+ 1,117, 30,173,112, 2,227,193, 12,135,248,214, 84, 96,112, 59,135,138, 27,236,186,224, 2, 60, 6,123,118,149, 98,160,177,222,
+ 82,244, 11,116,172, 41,122, 3,138, 34, 11,240,152, 50,167, 17, 55, 48,213,144,200, 37,244, 59, 61, 38, 23, 11,170,178, 36,157,
+104, 0, 2,157,104,140, 13,170,213, 50, 43,104,180, 35,112, 83,160,166,177, 85,143,220,135, 55,182,200, 60,198,244,208,113, 3,
+235, 37,141,118,194,230,250, 58,173,201, 54, 38,119,152,108,131,169,169, 25,178,173, 45,166,231, 38, 49, 53,196, 64, 71, 19,120,
+239,104,166, 83, 84, 89,142,138, 91, 60,116,251, 93,236,187,228, 0,166, 42,112, 46,194, 11,141,201, 50,180, 74,233,111,230, 12,
+183, 42,162,102,198,212,236, 78, 76, 81,208, 61,123, 18, 33, 37,187,206,127, 6,131,181, 14,233,100,139,225,198, 26,121,150,147,
+117,206,178,255, 89, 87,115,226,222, 7,104,159, 45, 33, 43, 0, 0, 32, 0, 73, 68, 65, 84, 78,207,225,173, 37,235,174, 17, 55,
+ 2,109,110,216,221,164, 61, 63,199, 23,127,251,122,172, 16, 40, 29, 14, 47,231,192,202,109,164,115,111, 56,192, 26, 72, 61, 68,
+178,206, 54,175, 31, 36,175,130,194,215, 56, 31,162,139, 24, 79, 63,235, 91,234,182,162,115,228,154, 10,241,133,161, 80,107, 33,
+144,149, 36,146,161,200, 75, 47,240,185, 64, 20, 2, 42, 16, 86,160,108,173,174,118,117, 68, 33,146, 97,110, 56, 89, 4, 65,201,
+176,130, 70, 4, 87, 75,131,205,107, 10,154,110, 32,132, 35,217,185,132,217,234,134,238, 93,212, 73, 93,222, 35,157, 27,147,170,
+198,123,240,102,132,207,115,162,201, 41,178, 78,151, 7,143,116,185,245,201, 1, 59, 5, 88, 31, 34, 59,135, 27, 61,242, 35,235,
+ 76,202, 24,239,225,156, 72,214,235,164,112,225,153,143, 4,215,188,250, 23,185,243,230, 63,199, 39, 41, 34, 13, 22, 34,153, 70,
+ 40,173,144,113, 18,220, 27,120, 22,246,236,230,139, 31,249, 56,239,124,239, 39,152,251,119,163,118, 87,239,224,140,245,172,231,
+134, 63,122,239,219,121,241, 91,222,196,218,153,101,122, 43,103,177,101,176, 73,154, 34,172,137,138, 47,252, 57, 54,242, 28,124,
+229,115, 72, 22,231,153,184,232, 10,226,133, 61,224, 6, 16,165, 8,149,140,119,212, 30,129, 80, 97,146, 36, 70,113,169,163,116,
+ 49,227,240,114, 59, 54,117, 36,201, 19,181, 28,120, 4,116, 17, 90,133, 93,117, 18,215,212, 57, 81,119,253, 34, 20, 51,251,227,
+ 22,164,192, 42,175,163,117, 1,169, 29,122,110, 39,225,138, 95, 23,147,202,141, 61, 58,178, 38, 32,142,232,107,222, 86, 97,138,
+ 32, 25, 39,155, 33, 37, 82,199, 33,244,196,213, 2, 56, 27,212,227,225, 22, 17, 58,109, 81,139,213,140,171,168,178, 33,206,187,
+144,151, 46, 36,182,202,234,241,183,161, 40, 3, 72, 37,136,244, 61,198,133, 93,173,112,225,191, 77, 93,200,171,210, 4,210, 91,
+ 81, 5, 27,102,164,137,156,192, 82, 81, 25,144, 90,132,226, 45,101, 64,180,214,144, 30, 83,133,145,186, 40,131, 69,196,251,208,
+233,171,186,168,187, 26, 56, 35, 77, 88, 61,152,202,225,109, 69, 89, 21,200,210,144,180,154,108, 13, 43, 26,205,136,170,170,106,
+158,125,184,246, 24, 27, 92, 9,162,204,177, 62,162, 93,230,200, 29, 83, 53,174,216,225, 9,106,248,188,215, 27, 39,236, 61,133,
+191, 90,219, 26, 69,168, 50, 3,143, 25, 12, 41,163,132,137, 39,158,160,108,164, 8, 99, 64,170, 64,212,203, 10,166,103,218, 68,
+ 73,194,142,115,118,163,141,199,157, 58,139,185,249, 86, 78,246,243,208, 20, 36, 17, 19,105,204,153,162,196,123,207,201, 65,201,
+102, 86,144,180, 27,244,107, 0,217,228,204, 4, 59,118,206,114,241,179, 47,163, 61, 53, 73, 50,217,100,176,217, 37,154,104,225,
+210, 4,145,198,136, 70, 11,105, 13,145,171,159, 45, 93,107, 61,172,199,148, 37,141,169, 69,150,158,253, 18,254,233, 55,255, 51,
+199, 31, 61, 66,115,102,146,245,210, 50, 23, 41, 46,136, 27,204,167, 9, 87, 29,191, 3, 61, 61, 71,213, 91, 39,105,182,255,127,
+225, 46,185,247,148,198,109,107, 5,235, 2,107, 75, 63,214, 24, 89, 87, 11,217, 70,176,195, 81,236,179, 14,143,108,157,141, 20,
+146, 35,235,206,217,121, 31,196,198,245,161,167,117,189,127,175,127,159,212, 53, 30, 86, 9, 18,229, 49,110,188,165,194,141,180,
+ 72, 30,110,250,252, 77,236,217,119, 30, 47,125,233, 75,233,244, 10,238,186,231, 65,142, 31, 59, 94, 71, 2,215,187,122, 9, 58,
+ 85,226, 41,126, 98, 16,145,167,236,220,206,109,191,254, 30,118, 93,112,128,217,164,133, 50,142,143,254,253, 93,220,246,131, 39,
+105, 54, 18,174,145,154,207,127,251, 65, 62,242,123,191,134,239,253,128,219,223,241, 70,214, 23, 46, 99,223, 55,254,149,171, 94,
+253, 82,254,230,159,111, 96,231,204, 4, 46,109,178,187,153,208,235,111,113,108,101,141, 11, 38, 27,116,189, 8, 81,128, 90,209,
+246,158,118, 20, 97, 35, 79, 89,239,175, 34,165, 81, 54,236,165,168, 71,129,158,240, 74,134,108,229,192,120, 54, 56,140,183,228,
+120,242,110,151,230,228, 84, 32, 42, 9, 79,177, 57,164, 61,183,192,198,201, 99, 68,105, 19, 83,230, 40,149,112,230,232,163, 76,
+207,239, 66,234, 6,237,169,148,238,250, 6, 69, 86, 18, 55, 51,138,225, 22, 73,107, 10,225, 21,121,191, 3,162,193,176,115,150,
+ 70,123, 17,107, 10,164, 19,108,109,174,210,154,158,101,107, 99, 3, 33, 4,189,213,101, 34,157, 32, 34, 75, 20,105,172, 16,244,
+123, 67, 22,118,183, 66, 74,161,142, 80, 34,197,228, 21, 90, 89, 76, 5,241,132,198, 84, 45,100, 62, 0, 4,121,230,233,247,142,
+ 49, 53, 51, 79,101, 52,167,143, 61,204,228,212, 30,136,160, 40, 74,176, 49, 69,177,130, 80, 13,108,213, 71,233, 38,195,225,128,
+214, 76,147, 34,107,208,223,234,113,206,193, 43, 88,220,115, 46,233, 84,155,198,212, 44,195,126,135,214,194, 2, 27,199,143,209,
+158,155,167,177,255, 60, 78, 29,126,148,221, 79,187,132,206,201, 83, 52,102,102, 80, 81, 3, 99, 45,162, 16, 36,205, 6,223,253,
+243,223, 66,138,186, 59, 54,163,155, 43, 99, 79,102, 88, 35, 7, 43, 97,164,160, 33, 61,137, 24,221,182, 97, 88,163, 92,188, 18,
+ 88,227, 17, 81,189,103,114,225, 48,147,245, 72,203,215,153,196,193,206, 28,168,112, 42, 22,196, 66, 16, 35,136,157, 64,150,160,
+242,144, 30, 38, 11, 31, 14, 63, 35,106,192,195,200,162, 20,188,237,199, 54,135,156, 41,183,131, 16,230, 53,236,152, 77,120,236,
+147, 95,226,252, 95,122, 5,185, 3,157, 38, 68,179, 59,194, 39, 73, 55,198,185,220,194,215, 50,253,122,180, 45,164, 67,136, 8,
+ 95, 25,116,156, 98, 81,180, 91, 45,126,255, 51, 63, 96,113, 2,250, 37,220,252,233, 91,121,205,219,174, 35,239,231, 52,167,154,
+108, 61,112,138, 75, 38, 52,143,119, 74,148, 24,237, 47, 67, 2,221,161, 84,241,172,215,252, 42,119,221,242, 17,244,196, 4, 66,
+203, 80,216,147, 24,107, 42,166,230,119,113,228,158, 59,121,241,213,175,103,179, 48, 28, 76, 85,184, 24,249,109,105, 86, 26,105,
+ 78, 14, 74, 94,113,245, 69,188,239, 35, 31, 32, 55, 21,107,167, 78, 99,139, 16,163,107,243,156,138, 6, 60,248, 29,186,223,253,
+ 23,102,159,113,136,185,243,247, 18,207,237,160,125,193,165,232,233,133,176, 63, 81, 65,201,227, 69, 18,116, 20,171, 39, 67, 26,
+152, 84, 53, 66,187,142, 96, 69,213,170,237,250,134, 50,126, 14, 66, 42, 85, 0,159,212,157,150,144,245,103, 84,226, 75, 91,179,
+222,109, 13,173,222,142,130, 28,217,186, 66,219, 83,107,138,189, 3, 23,196,118,122,114,110,172, 84,199, 58,168,134,148,221, 77,
+156,169, 72,151,246, 4,181,118,237,217, 14, 25,218,150,198, 84,187, 22,161, 57,204,112, 11, 41, 37, 82,234, 0,209, 49, 99, 67,
+ 56,190,166,176,133,192,177, 80,132,109, 89, 91,246, 76, 96,243,251,170,196, 25,139, 45, 11,138, 60,216,211, 16, 1, 44,163, 99,
+133,181, 46,196, 97, 90, 31, 10,186,179, 24,107,168,188,165,116, 22,227, 92,232,220, 48, 88,225, 81, 73, 20,198,250,182,246,166,
+187,144,121,110, 77,184, 20,216,154,109,128, 7,170, 32, 58,180,120,124, 85,143,206,173,175, 53, 7, 18,105, 3, 58,217, 24,195,
+160, 55,164,191,209,165, 69, 69,107,239, 94,250, 67, 19, 70,184,248, 96, 93,171, 9,128, 46,219,126,190,109, 55,131,165,169,241,
+ 1, 47,165, 36,142, 19,242,254, 22,182,170,208,222,143,147,238, 24, 79, 54,202, 48,170,171, 42,138,188, 64,173,174, 7, 97,154,
+177,184,202,129, 15,216, 90, 91,120,242,162, 79, 28,151,184,225, 42, 86,192,106, 81,177,101, 29,103, 26, 9,198, 67, 49, 28, 34,
+178, 28,165, 53, 81, 26,209, 90,156, 33,198,177,182,182,197,206, 52, 66, 56, 65,214, 25,240,248,114,135,239,125,239, 17, 42, 36,
+251,118, 76,243,154,159,125, 33,214, 25, 68,179,129,111,181, 80, 19, 9,210, 59, 68, 21, 44,136, 33, 66,192, 81,229, 57,205,137,
+121,118, 60,255,167,120,248,159,190, 12, 58,230,120,127, 72, 9,236,108,198, 44,110,102, 92,244,182,151,179,247,131,127,130, 93,
+ 94, 67,103, 67,116,171,189,173, 29, 96, 27,201,208,235,244, 41, 76, 88, 49,121, 41,144,210,143,133,139, 35,254,148, 15,157, 48,
+198,131, 54,181, 78,196, 4, 55,151,146, 2, 87,131,168, 70, 83,229,224,210,169,159,249,218, 38, 39, 71,225, 86,120, 10,235,145,
+ 90, 80,121, 72,194,227, 48,190, 95, 69, 42,156, 1,145,132, 74,130,243,134,195,143, 62,194,163,143, 31,227,226, 75,175,225,133,
+ 47,124, 33,189,173, 62,247,223,127, 63,135, 15, 31, 30,221,111,209,145, 82, 68, 24,168,125,115, 94,192,145,175,127,138,133,133,
+ 93,252,207,207, 63,138, 94,152,229,104,167,207,109, 95,250, 51,222,245, 95, 62,128,214,224,163,136,199,143, 46,147,157, 62, 70,
+188,117,150,125,207, 62,200,190,230, 44,221, 97, 65,123,115,157, 67, 59,167, 73,251, 57,155,131,140, 71,150,123, 76,181, 82, 10,
+107,217, 55,147,208, 93, 29, 50, 29, 9, 86, 7, 37,115,177, 98, 50,133,161,205, 41, 81, 68, 46, 98,162,142,168,123,138,102,103,
+252,194,139, 17,112, 65, 41,132,213, 88, 87, 50, 44, 29,199, 31,189,135,153, 93,187,145,222,160,226, 22,241,142, 9,214,143,159,
+ 96,102,105, 23,235,167,206, 80, 20, 57,131,173, 62,105,220, 68, 42,144,137,199, 21,150,108,171,194,187,138,124,107, 19, 25, 53,
+ 40,250,155,164,147,115,116,151, 79, 51,179,235, 0,203, 39, 54,136, 14,164,224, 84, 16,128,200,136,206,242, 25, 84, 28,177,185,
+118, 22, 37,125,240,101, 17, 4, 28, 85, 94,209,235,117,217,177,103,145,162,172,144,194, 99,170, 10,231, 4,189,124,147,233,217,
+ 57,122,107, 91, 72, 28, 69, 57, 68, 69, 45,146, 84,177,190,226,104, 52,115,148,146, 56,215,160, 50, 57, 81,163,205, 86,119, 35,
+236, 73,109,133, 47, 37,150,138,134,246, 36, 81,147,181,141,101, 90,173, 54, 73, 60,131, 82,146,205,181, 99, 44, 52, 46,160,119,
+118,153, 40,105,176,121,236, 24, 69,153,163,250,125,178,147,199, 57,231,138,171, 56,121,223,157,204, 31, 56,111,236, 83,141,146,
+ 36,172, 9,206, 30,225,129,127,252, 56,194, 11,180,240, 20,206,147,123, 79, 37,160, 26,171,159,194,191,198,225, 77, 66,144, 72,
+ 73, 74,240,158, 23,194,163, 74, 17,124,151, 58,156,245, 35, 23,148, 24,141,242,107,218,146, 29,249,134,149, 8,123, 53, 91, 51,
+ 47, 44,164, 74,160, 43, 16,165, 64, 88,143, 42, 36,210,168,122,135, 62,114, 64,203,177, 16,234,158, 78, 69,233, 32,173,161, 87,
+ 87, 77, 70, 65,168,162, 4,143,125,226, 22,206,125,199,235, 48, 86,224, 68,132,158, 89,194, 14, 7,117, 55, 18, 60,211, 78, 10,
+192, 32,163, 24, 39, 35,132,205,234, 40, 74,197,226, 76,202,179,222,114, 35,237,102,240,139,122, 5, 31,253,251, 7,121,222,243,
+ 47,100,106,105,150,245,149, 62,115,151,239,229,242,123,215,184,117,253, 12, 7,163,167, 0, 32, 4, 84,206,115, 40, 81, 60,243,
+ 21,239,228,129, 91,255, 6,149,166,148,121, 70, 43,105,145,164, 17,191,242,138,183,112,203,189, 79,114, 40, 85, 44, 37, 50,240,
+241,235,215, 44, 86,146,141,204,144, 36,130, 91,110,252, 35,246, 95,113, 25,157,213, 85, 92, 97, 49,121,129, 29,230, 24,213,196,
+ 13,114,202, 47,253, 25, 78,122, 14,190,226, 90,226,217, 41,212,244, 60,141,115,206, 67, 36,237,176,239, 86, 2, 92, 5,186, 13,
+ 8, 76,191,194, 14,186, 72,169, 3,209,205,213, 72,206, 58,251,124,164, 80,151,245, 28,207,153,170, 22,201,185, 32, 56,244,129,
+197, 61,158, 45,142,246,166,118,148, 83,109, 17, 94,213,100, 54, 95,219,206, 70,222,159, 80, 80,133, 14,196,181,113,119,238, 69,
+176, 63, 84, 38, 64, 93,172, 33, 63,123,154, 97,119,157,201,253,231,193,198, 90,152,176,168,144,213, 30,197, 73,248, 26,128, 41,
+ 50,164,212, 72, 29,161,164,170, 59,156, 58,190,212, 86, 65,144, 70, 80,160, 91, 28, 85, 21, 68,117,190, 78,104, 51,101,137,177,
+ 65,201,110,173,197,216, 58,112, 5,143, 29, 86, 40,173,176,245, 24,222,121, 95,255,222,138,188,176,129, 39,225, 28,194, 57,164,
+208,184,122,212,110, 17,148,117,178,155,179, 22, 99,131,216,205, 26, 59,222, 43,135,180,185, 16,187, 42,148,168, 59,189,112, 33,
+138, 84,184, 92,142,246,178,130, 16, 55,187,210, 27, 48,167, 5,241,233, 51,100, 19,211,232, 56,236,165,181, 50,232,122,246,171,
+116,224, 48,200, 56, 70, 15, 11,220,176,192, 54, 83,226, 58, 92, 40,138, 20, 91,189,173,122, 98, 82,227,201,252, 83,124,235,214,
+133, 86,180,223,167, 18, 10,238,188,143, 92, 72,232, 15, 81, 94,241,192,153, 85, 78, 14,114,172, 84,148, 82,114,182,159, 49, 28,
+ 20,136,122, 85,100,159, 18,206,218, 72, 52, 81,164, 72,202, 64, 72, 89,237,103,224, 60,137,146,244, 77,157,186, 39, 97, 50,141,
+104, 55, 98,132,144, 12,135, 37, 31,253,208, 63,242,211,175,188,146,189,151, 28, 10,187,226, 56, 66, 54, 26,200,134, 12,182,208,
+162,196,185, 24,165,155, 44, 60,247,167, 88, 89, 61, 77,235,194,243,248,210,239,188,143,115,230,218,204,122, 73, 99,189,207, 79,
+125,237,239,105, 94,122, 57,213,145, 99,196,147, 83, 40, 61,138,232, 86, 63,150,216,230,189,167,180, 6,139, 71, 73,106,200, 89,
+237,182, 82,132,169,234,168, 91, 55,161, 73, 81, 58,188, 76,120,129,173,195,137, 70, 49,168, 74,201,176, 22,144, 16,215,116, 77,
+148, 39,141,195,209, 19,169,218, 72, 48, 66, 30,235, 32, 28, 30,189, 21, 66,143,181,184,232, 72, 16, 89,207,174, 3, 7, 57,112,
+232, 34,178, 92,241,195,123, 30,226,171, 95,253, 6,214, 11, 94,245,234, 87,115,248,145,195, 97, 85,234,235, 78,221, 56,137, 33,
+124, 88,139, 18,214,166,167,120,206, 47,191,144, 95, 47, 62,199,247,159,236,114,227, 45,127,197, 86,123,142, 55, 94,114,128, 91,
+ 30, 61,202,225,147,103,185,224,208, 94, 68,103,131,244,218, 55,144,124,235,239,136,174,120, 25, 31,126,249, 59,249, 95,247,124,
+156,210,127,133,118,154,226,243,156,211, 50,140, 72,103, 82,205,230,192,224,164, 36,141, 4,173, 8,180,176, 60,239, 57, 23,114,
+254, 75, 94,134,207, 50,146, 10,154,141, 41,116,148, 82,174,173, 98, 58,235,216,173, 46,101,103,157,188,211, 65, 84, 37, 54, 74,
+144,213, 16, 83,101, 24,103,169,240,124,251,107, 55,243,140,231,188,148,120, 98,138,124,171,139,200,130,120,173,172, 2, 51, 57,
+ 73, 19,178,238, 38,179,187,247,210, 91, 95,197,148, 21, 58,105, 82,230, 25, 81,210, 64, 72,131, 43,160,183,213, 35,105, 42,108,
+213, 34,207,215, 89,220,119,136, 97,111,131,164,217,194,123, 71,214,235,227, 40, 41, 7, 61,240, 38, 20,222, 78,135, 52,149, 68,
+ 19, 41, 42,134,249,165, 37, 28,138,170,168,208, 81, 69, 97, 74, 26, 58,102,107,163,199,228,244, 4, 82, 8,162, 52,161, 63,232,
+131, 16,108,172,175, 50, 49,221,224,216,147,199,153,223,177,128,148,142, 97, 30, 60,241,101,158,208,219, 88, 38, 73, 21,158, 18,
+165, 21, 91,101,143, 88, 71, 40, 27,161, 92,139,164, 49,207,147,143,254,128, 11, 47,125, 1, 85, 94,176,126,230, 8,231, 93,249,
+147,108,158, 60, 70,220,106,114,246,209,251,217,119,197,181,156,125,252,113,218,115, 59,200, 54, 59,120, 41, 73,219, 19,100, 91,
+ 61,166,151, 22,184,241,205, 47, 0, 47, 48,120,134, 6,250, 46,164, 13,149,120,172, 12,234,119,107, 71, 42,208, 58, 87,216, 65,
+ 4,164, 58,240,189, 99, 36, 77, 21,124,152,214,133,100, 54, 33, 61,165, 21,193,158, 93,250, 49,135, 60,140,227, 5,170,206,213,
+ 86, 94,160, 13,164, 66,162,173, 66,149, 97,209, 20, 85, 2,149,213,105, 5, 70, 34,234,112, 23, 33,130, 21, 72, 57,195,137,188,
+254,128, 88,152,143,224, 39,246,214, 20, 50, 27,196, 84,143,127,242,102, 14,253,244, 11,240,139, 51,216, 2,100,163,137, 47,182,
+112,149, 8, 38,149, 72,131,106, 33,156, 69, 84, 37, 94, 7,149,252,142, 93, 11,252,252,175,127, 26, 81,103, 92,140, 78,169,169,
+ 57,248,181, 95,255, 60,159,190,233, 93,180,251, 25,149,111,243,187,239,188,150, 29,159,188,131,247,124,255, 20, 7, 35, 57, 62,
+212, 36, 80, 90,207,193, 68,113,217,243,222,194,231, 63,246, 30, 46,184,252,105,124,241,163,159,226,221, 31,190,137, 61, 2, 14,
+ 38, 18,251,148,189,185, 70, 80,122,199,233,204,240, 71,191,253,102, 94,245,142,183,179,113,118,153,206,242, 10, 38, 43,177, 89,
+137,181, 96, 84,139,252,171, 55, 98,142, 61,194,204,101,231, 49,115,254, 30, 84,187,141,156, 90, 34,158, 93, 68,197, 41, 74,219,
+ 96,233,171, 10,104,205,130,110,129, 76, 49,107,167,194, 46,182,190,216,132, 49,197,200, 95, 94,231,169, 11, 17,246,208,117, 20,
+166,171, 28, 50, 82,181,117,175, 30,185, 72,182, 61,231,227,184, 86, 66,218, 27,193,247,238,107,197,249,200,203, 35,116,109, 9,
+244, 46,216, 11, 61,152,238,122,237,103, 12,133,223,149, 69,176,165,233, 8, 51,204,232,157,120, 18,161, 85,184,132, 14,131, 75,
+ 70,213,251, 84,239, 29, 58, 74,169,202,124,140,177,213, 90, 96,109,157, 54,231, 61, 38,203, 72, 90, 77, 68, 20,225,234, 72,211,
+ 32,174, 10,226,184,170, 52,193, 57, 83, 25,170,170,192,228,101,216,169,214, 92,117, 91, 83,236,108, 61,126,175, 10, 67,229,130,
+ 80,174,178, 62, 40,255,133,192, 11,135, 41, 76, 77,220,139,193,135, 2,145, 87, 65,145,109,109,216,130, 87,198,162,130,115, 60,
+164,115,141,215, 19,224,141, 32,210,114, 60, 17,241, 50,208, 55, 93, 13, 1,210,141, 20,155, 15,201,135, 57,157,254, 6, 81,236,
+104,236, 92, 64, 87, 30, 37, 13, 90, 43,162, 81,208,142,117,196,182,198,194, 22, 21, 36, 97, 94, 28,233,132, 52,218,162, 26,228,
+ 68, 19,205,122,170,225,182,125,164,181,246,192, 12, 6, 56,231,169,214,123,172,123,193,201,238,144, 51, 69, 73, 30,107,202,202,
+146,247,251,232,118,139,103,191,234,249,156,247,250, 87, 48,125,233,179,144, 50,240,213, 85,212,196, 12,187, 88, 23, 49, 60,246,
+ 16, 55,188,251,189,148,199, 86,152,197,160,109,137,112,154,190,146, 56,169, 40,140,161, 33, 5,222, 73, 26,210,211, 80,154, 11,
+ 23,167,249,250, 45,119,243,246,171,159, 14, 58, 70,232, 40,156, 22, 58,130,164,129,104, 58, 68, 89,162,100, 11,117,249, 85,252,
+105,148,210, 53,158, 11,119, 76, 51, 45, 96,165,128,159,223, 56,193,224,236, 9,170,179,171,193,234,167,131,221, 79, 74, 21, 26,
+131,177,142,192,209,235,118,201,109, 22, 40,166, 46,104,186,180,216,182,155,133,172,128, 64,147, 19,110,123,175, 30,136,139,212,
+232,214, 80,216, 35, 25,206,180, 70, 4,145, 10,255,159, 80, 53, 67,192, 67, 36,221,216,223,174, 35,208,113, 56, 48,242, 98,123,
+226, 56,114,127, 26, 91,191,149, 6,118, 45, 45,241,173,111,126,135, 83,103,187,100,133,199,186,240, 92,220,254,157,219, 2,178,
+191,190,140,107,173, 36,177,151, 88, 95,139,211, 28, 44,175, 30,231,201, 7, 54, 57,123,226, 12,239,248,200, 13, 60,118,203,231,
+208,170,100, 71,211,241, 51,207,187,130,219,190,123, 23, 15, 45,159, 37,190,242, 5, 48,220, 96,250, 89,207,224,137, 91, 62,202,
+115, 47,156,102,237,214, 91,121,227,203,159,198,111,124,244, 54,158, 62,215,196, 13, 13, 11,141,152,205,202,176,163, 25, 49,232,
+ 21,172, 34, 25, 86,142, 75, 38, 12,123, 46,122, 46,235, 15,159, 65, 74, 73,167,211,195, 84, 71,144, 66, 33,227,144,181, 92,150,
+ 18,167,231,240,243,139,117, 83, 16, 68, 54, 18,201, 4,158,139,237,128,199,143,221, 79,190,181, 73,212,108, 99,202, 62,205,169,
+ 5, 84,210,196, 20, 37, 19,179,115, 20,217,128,214,212, 44,195,225, 32, 96, 1,243,156, 56,210,117,182,120,133, 23, 26,100, 73,
+179, 61,201,160,215, 37,105, 79, 97,205, 16, 31, 57,146,246, 36,101, 62, 64, 74,205,196,204, 36,249,112, 64, 26,167, 20, 69, 65,
+ 26, 39, 68, 11,237,154,167, 12, 54,207,177, 6,182, 54,215, 65, 54,113, 6, 36, 2,137, 34,110, 78,146,103, 21,222,105,124,217,
+ 71,136, 8, 83, 25,164,138,201,178, 33,179, 11,243,108,172,109, 48, 61,221,160,215,205,137,210, 10, 95, 9,250,189,138,170,176,
+ 88, 57,164,217,108, 34, 69,204,176, 42, 17, 42,166,215, 95,195,186,138,246,196, 36,155,171, 39,201, 6, 29, 22,247,156,199,217,
+ 39, 31,161, 44,134,100, 3,197,194,254,167, 81, 22, 57, 46,207,200,138,156,180,221,162, 61, 61, 71,111,125,133,153, 93,123,185,
+225,103, 47,160,225,130,101,169,178,158,190,245,228,214, 83,138, 64,123,139,106,178, 92,164,131,192,201,123, 81, 71, 98, 11,180,
+146,164, 50,208,171,172,243,104, 32,243, 62,192, 97, 68, 24,209,134, 38,209,227, 92,157,225,174, 5,190, 10,133, 56,242, 2,233,
+ 5,145,135, 68, 75, 34, 43, 72,100, 40,230,110, 40, 80,165, 64,148, 33, 46, 21, 83,175, 89, 71, 43, 64, 47,120,120,121,192,114,
+ 5,145, 15, 43,192,197, 52,240,197,125, 13, 42,242,222,163,164,224,200, 23,190,201,190,151, 61,135,104,247, 2, 86, 64, 85,166,
+232, 20,156, 13,123, 1, 95, 5,107,154,136, 27,136,178,100,215,129,253,188,255,125, 55,242,221,227, 67, 22, 27,144,104,232, 85,
+ 97, 26, 96, 44, 44,204,193,219,223,252, 9, 62,251,229,255,135, 19,135,143,178, 21,195, 91,222,126, 21,115,238,123,252,218, 15,
+207,132,253, 58,219, 14,161,202,122,246, 38,146, 55,254,242,251,112, 64, 90,239,205,171,122,101, 65, 29,243, 24, 75,193,153,204,
+242,234,103, 95,196, 31,124,226,143,168,172,101,245,196,201,128, 12, 45, 42, 92,110, 67,244,237, 99, 63,160,251,111, 95,162,189,
+127, 7,231,188,238, 90, 84,163,137,108,183, 17,233, 28,186,213, 66, 10,139,212, 22,100,132, 31,118, 16,173,105,188,110,131,106,
+ 32,244, 28,167,111,248,217,241,238, 54,200, 86,228, 24, 32,237,107,184,199, 56,132, 69, 4, 27,148,212, 50,136,234,148, 10,162,
+183,177,221, 71,142, 59,251,145, 78, 2, 33, 2, 27, 94,248,237,156,239,218, 47, 62, 10, 13, 9,241,169, 22,145, 68,148,103,143,
+134, 91,152, 28,227,194,112, 56,100,210,192,103, 57,189,211,167,137,218, 45,210,137, 22, 89,119,139, 56,141, 81, 73,130, 20, 97,
+130,166,180,194, 20, 5,101,158,133, 67, 54,138, 17,101, 80,191, 59, 2,188,195, 57, 95,167,194,217,113,252,104, 85, 57, 60, 22,
+107,130, 69, 45,192,100, 42,172,183,136, 74, 96,188, 9, 16,148, 58,232,195, 88, 75, 85, 84, 20,165,165, 48,150,178,242, 24,239,
+ 2,235, 95, 73,170,202,162,211, 80, 44,156,177, 84, 88,156,146,120,235, 66, 3, 98, 66,199, 46,132,160,172, 3, 73, 70, 30,251,
+162,176, 36,105, 18,180, 0,222, 17, 41, 31,130,130,156,161,244, 1, 3,155,101, 37,173, 86,147, 65,111,139,125, 51, 77,202, 66,
+144,245, 75,242,173, 1,105,146, 80, 33, 80,198, 34,136, 49,206, 17,137,138, 88, 69,200, 90,200,231,117, 24, 17, 11, 33, 72, 91,
+ 45,178,238, 38,173,197,153, 26,162,100, 33,170,199, 81,222, 65,101, 49,253, 28,133,228,142,110,206,177,188, 12, 84, 52,227,200,
+187,125,158,243, 51,207,227,249, 31,255, 24,186,213, 2, 98,108,182,133, 43,134, 99,148,174, 53,107,164, 75,231,112,244,223,190,
+204, 85, 63,251, 59, 44,237,217,197,244,197,255,129,139,207,191,144, 99,199, 78,208, 95, 62,204,197,203, 39,185, 4,139,205, 74,
+196,116,139,126, 97,240,214,211,140, 60,189,202, 50, 59,217,224,200, 55,238,230,252,159,123, 57, 62,138,144,113, 4, 42, 25, 51,
+219,141,245,204, 93,126, 37, 15,127,230, 83,108, 25,207,249,139, 83,200,193,128,199, 15, 94,194,119,207,187,152,127,124,250,179,
+248,193,209,199, 89,123,242,112, 16, 95, 74, 21, 86, 54,226,169, 36,228,240,181, 54, 86,207,140, 37, 5,163,143,131,146,146, 72,
+ 8, 76, 45, 72, 68,132, 24,214,250,216, 8,157,244, 72,115,228, 60,206,212,236,117, 21,130,170, 90, 82, 50, 17, 73,144,142, 33,
+161,251,142, 42,135,243, 97, 42,167,164, 39, 86, 34,172,186,106, 45, 19, 46, 48,230, 71, 5,157, 16, 58,138, 51,130,219,191,125,
+ 7,235,125,106, 58,224, 40,133, 14,206,174,174,133,115,214, 7,134,135, 78,133,194,196, 50, 8, 59,156, 68, 70,158,179, 79, 62,
+ 76, 47,187,128,235,191,254, 53, 40, 51,190,250,255,221,201, 31,222,242, 0, 23,237,153,162, 97, 42,158,136,166, 88, 60,184,147,
+199, 30, 58,203,149, 47,189,134,104,233,233, 44,158,247, 8,135, 94,247, 22,212,161, 75, 89,251,224,159,112,222,108,147,153,137,
+148,189,165, 99, 79, 43,101,178, 40,185,103,163,207,116, 67,211,207, 13, 66, 64,187,149,114,250,248, 49, 54,215, 58, 28, 63,181,
+ 66, 51,209,180, 91, 45,156, 80,172,108,108,177,214,233, 50, 63,217,100,162,221,166, 44, 77,253, 98,133, 17, 91, 20,215,227, 64,
+ 37, 73,212, 57,100,253,140,217,125, 9,141,246, 60,182,202, 17, 50, 38,110,164,244,179, 77,148, 82, 68,105,194,112,229, 44,141,
+137, 38,249,233, 1,115, 75,243,208,235,209,104,207,208,239,108,177,113,234, 56, 51,231,236,162, 49,145, 98,170,130,188, 7, 71,
+238,253, 87,246, 63,253, 82,170, 82, 32, 35,203,214,102, 31, 99,251, 32, 44, 85,230, 64, 26, 26,173, 73,112,146, 60, 51, 97, 71,
+ 28, 9,188,136,217, 92, 93,103,102,190,137,179,154,202, 22, 8, 29,200, 65, 85,153, 33,170, 10,165, 82,202, 60,199, 58,135, 80,
+208,221,236,145,245, 51,166,166,155, 52, 39, 26,148,213, 16, 27, 68,222, 24, 91, 18, 71, 49,152,138,138,146, 94,111, 64,150,195,
+210,252, 34, 62,181,164,141, 9,116,212, 36, 31,150,156, 61,254, 36,173,153, 57,218,211, 51, 52,166,102,201,186,235,244,214, 10,
+226,180,197,196,220, 34, 81,218,100,237,196,113,102,119,237,230,230, 63,125, 39,229, 96, 64, 44, 3,209,173,235, 60, 67, 60,185,
+ 11,233,106, 78, 62,101,213, 89, 65, 42,195,222, 71, 85,146, 72, 43, 34, 33,137, 28,196, 82,210, 20,130,161,115,116,132, 37, 22,
+ 4,166,113, 72,225,164,244, 4,100, 46, 18, 85, 6,229,123, 3,129,116,129,135,220, 20, 33,105,173, 33, 36,202,200,240, 28, 90,
+129, 44, 61,210,132, 23, 65,212, 6,247,169,253,115,172,116,183,248,198,247, 78,241,240, 0,214,109,173,203,115,112, 81, 67,143,
+169,104,163,207,225, 8,193,125,236,159,110, 35,153,110,208, 59,103, 7,151, 93,247, 19,224, 12,221,181,205,176,131,149, 30,239,
+ 36,182, 44,104, 54, 82, 94,115,253,255,230,190, 45,195,158,118,128,226,196,163,122,228, 2, 24, 71, 1, 86, 84,188,233,250, 63,
+229,255,124,250, 93,172, 60,113,140, 50,137,121,233,207, 95,205, 95,171, 31,240, 75,223, 59,205, 66, 29,169, 59,246,174, 58, 88,
+140,229, 88, 9,187,157,201, 28, 46, 52,171,153,225,192,226, 20,255,112,243, 7,152, 63,116, 62, 27,167,207,224, 75,131, 41, 42,
+ 92,110, 48,186,129, 63,250, 32, 27,183,220, 68,107,105,130,189, 47,121, 38,205,197, 25, 72, 18, 72,167,112, 58, 69,107,135,180,
+ 57, 74,198, 8,155,225,187,155,200,233, 93,208,218,137, 72,102, 64,165,244, 31,248, 30,174,170,130,131, 96, 4,140,175, 15,147,
+113,152, 71, 77, 12, 19,163,147,162,166,197,141,196,133,130,186,155, 87,117,254,184,219,254, 62, 71, 22, 33,165,234,149,149,144,
+219,151,134,250, 0, 20,117,176,134,212, 18, 95, 57, 92,145, 17, 94,229, 98, 28, 67, 28,186,169, 90,219,225, 28, 43,135, 15,179,
+231,210, 75,137, 90, 77,210,118, 43, 8,101, 85, 16,117,153, 42, 64,105,108,145, 99,173, 33,138, 34,140,202, 40, 43, 19,130, 63,
+128, 34,207,198,241,219,214,134, 8, 88, 87, 21,152,194,142, 67,118,170, 42, 16, 41,173, 13,179, 22,161, 21,194,123, 34,111, 40,
+ 74,135,169, 66,231, 95, 85, 21,149, 9, 33, 81,227,192, 50,107,208,169,162, 50, 97, 10, 33,234, 92,114,237, 3,190,212, 84, 22,
+235, 29, 85,173,194, 31,141,124, 61,193, 38, 53, 51, 49,193,106,167,135, 3,154,141, 24,231,204,216,105, 86,122, 40, 75, 67, 85,
+ 57,140,119, 56, 29,236,111, 11,137,224,225,174, 36,218,216,162,152,242,196, 90,145, 68,154,254,176, 64,105,201,188,144,104,101,
+200, 79, 46, 19, 77,182,107,225,162, 67, 11, 71,172, 99,242,206, 26,222, 31,172, 89, 2,110, 59, 74,213,134,214,176, 28,244,113,
+101, 73,122,222,185,196,247,220, 79, 6, 60,227, 39,159,201, 11, 63,244, 63, 16,105, 74,126,230, 56, 81,179, 21, 28, 30,163,203,
+157, 80,120,111, 72,167,118,242,228,183,191,202,107,222,249, 62,174,189,234, 90,246,238,158, 35, 31, 12,120,211,243,247,242,173,
+251,135,124,255,135, 75,220, 59,181,151,239,118,142,241,250,255, 48,195,220, 35, 71, 57,251,216, 73,228,252, 36,162,114, 76, 68,
+ 96,163,136,251,239,124,156,139,127,185, 25,124,225, 42, 10, 30,117, 45,240, 78, 32,116, 74,116,209, 51,185,233, 39, 95,198, 69,
+ 75,211, 36,214,114,230,167, 95,197,196,185, 23,114,201,147,103,248,156,157,224,182, 79,255, 53,215,188,254,167,233,173,156, 9,
+238, 12, 89, 91,114,198,180, 56,143,210,154,251,238,185,157,184, 6,205,104,198, 86,251, 80,203,141, 64,200,218,166, 86, 91,210,
+188,171,129, 50, 54, 88,218, 70, 84, 55,141, 68,123,208, 94, 50,161, 52,109, 69,224,119, 16,192, 54, 90, 5,194,160,138,182, 17,
+176, 81, 13,175, 49,118,155,236, 39,124, 16, 7, 75, 31, 52, 74,105,141,129, 85,206,147,213,128,197,235,174,187,142,175,253,203,
+215,131, 69,238, 41,148, 95,245,242,171, 91,255,205,169,240,192, 41, 21, 98,227,172,183,188,252, 23,255,152,120,215,229, 28,249,
+239,111,229,107, 95,188,139, 63,250,175,175,229,212,195, 39,249,149, 63,252, 29,162,229, 83, 28, 76,224,196, 67, 15,114,205,235,
+223, 5,102,141,170,179, 69,243,188,105, 88,125, 18,223,222,199,195, 63,120, 8,132,228, 71,171, 29,146, 68,177,163, 21,115,207,
+234,128,185, 52,102,232, 28, 10,207,190,169, 22,157,110,198,218,198, 38,214, 11, 54,134, 5, 79,156,222,224,241, 51,171, 12,134,
+ 3,180,146,156,221,202, 57,190,182,193,233,141, 45, 86,123,125, 78,111, 14, 56,178,178,198,163,167,206,114,124,173,203,201,149,
+ 14,135,143, 47,115,197,229, 23,112,206,211, 46,166,123,242, 40, 83, 59,247, 81,100, 3, 6, 27,235, 12,122,125,226, 56, 38,207,
+ 10, 6,195, 1,147,147, 83, 40,169,104, 78, 76, 83,100, 21,195, 65,159,222,218,105,230,246, 44, 81, 14, 43,132,104, 49,236,173,
+210,156,110,161,226, 41,132,176,216, 74, 98, 77,216,123, 97, 44,147, 51,243,248, 74, 17,199, 18,107,160, 44, 11,146, 36,166,223,
+239, 16,197, 49,145,142,113,214, 49, 53, 51, 71, 20, 69,148,133,161,204, 75,156,179, 84,182,194,228,134,193, 32,199,122, 67,191,
+179,133,179,134, 78,175, 32,142, 53,157,205, 1,222, 25,138,162,160,170, 12,206, 9, 42, 27,118,173,195,204, 49, 49,181,200, 68,
+ 99,146,115,118,159,139,140, 60,113,212,164,219, 91, 71, 75,193,194,206, 3,196, 73, 66,107,102,134,193,230, 6,101, 54, 64, 8,
+135, 78, 82, 90, 51, 59,112, 64,247,236,105,166, 22,119,242,240,247,191,192,247,191,240,177, 90, 49, 11,185,247,116,235, 31,185,
+247,148,158, 58, 30, 50, 32, 10, 83, 5, 10, 73,106, 5,169, 16, 76,106,201,172,148, 76, 40, 69, 44, 20, 81, 29,179, 89, 57,208,
+245,238, 91, 56, 17,108, 28, 72, 90, 74,145,120, 65,138,160, 45, 5, 13, 47, 73,189, 8, 63,143,164,233, 20,109, 33,137,209, 8,
+ 27,168,170,210,201, 26,214, 22, 84,211,101,162,121,207,205, 71,249,250,143,182,216,240,208,241,161,232, 86, 14, 38, 35,168,156,
+ 99,103, 83, 49,213,208, 99, 13, 70,240,222, 6, 81, 77,227,220, 67,252,218,135,110,231, 63,253,213,119,121,228,174, 71,249,169,
+107, 14,129,181, 52,218,109,100,222,167,101, 28,131,141, 13,222,242,250,203,184,227,235, 15,115,188,158, 40, 84, 35, 59, 94, 72,
+138,164, 89,127,136, 50, 99,184,243, 43,119,241,186,119,188,132,238, 74, 7,209, 74,216,251,140,157,188,121,103,131, 47,220,125,
+134, 45,239, 73,159, 18,182, 50,182,104,242, 84, 29,153,103,173,112,124,240,255,125, 27,191,255, 23, 31, 32, 43, 75,134,235,155,
+152,172,196, 12,134, 24, 26,152,179,167, 25,254,195,159, 49, 56,250, 8,123, 95,114, 57,243,151,236, 37,158,158,128,214, 36, 62,
+153, 8,110, 16, 10,148,116, 68,173, 38,194, 6,194,151,154,217,133,156,216,141,143,167,195, 68,138, 69,142,191,255,141, 99, 80,
+197,216, 59, 51, 26,187,143, 5,112,163,250, 62,242, 37,110,143,135,199, 45,142,120,138,243,105,244,255, 56, 55,254,229, 16, 77,
+ 58, 98,188,251,113,196,106,192,207,214,236,246,209,151,181,134,246, 21,207, 71, 53,154, 1,217, 91,133,124,113, 83,150,216,170,
+160, 44, 10,178, 94,143, 39,238,190,135,131, 87, 92,142,136,146,224,239,151, 18,165, 35,170,108,128, 45,194,110,188,202,139,218,
+205, 96,235,192,149,224,136, 9, 4, 95,135,175, 12,101, 89, 6, 59,107, 89, 5,248, 76, 81, 82,228, 57,166, 42, 40,134, 5,101,
+101,199,169,114,179,110,136,233,117,233,148, 46,168,190,109,232,236,135,153, 9,142, 15,107,195,190, 93, 8,154,192, 30, 95, 50,
+111, 42,166,171, 2,223,233, 83,102, 37,157,229, 13,182, 54,250,156, 62,221, 9,127, 78, 94,134, 32, 21,130, 50,122,247,142, 5,
+142,158, 89, 14, 84, 52, 31,156, 29, 82, 5,254,120, 81, 57, 42, 99, 41, 43, 75,105,130, 48, 78, 27,195, 82, 83, 82,148,134,163,
+ 61,199,161,182, 38,235, 15,113,205, 36,104, 24,132, 32, 51,134,103,165, 9, 13, 28,190,151, 83,157, 58,141,237,110,161,167, 39,
+145, 73, 10,214,224,140,163,189,107, 9, 17,169,144, 97,175,158,194,123,207, 50,178,147, 43,228,221, 30,213,218,128,153,213,211,
+ 20, 78,241,130, 27,126, 7,155, 13,177, 69,137, 78, 26,168, 40,169,229,219, 98,236,170,112,214, 80,244,135, 60,250,157, 59,185,
+249,174, 7,248,169, 23, 93,203,222,102,132, 22,103,121,236,240,143,104,165, 5, 23, 93,124, 30, 59, 91, 13, 30,249,209,227, 12,
+ 58, 25,127,124,248,123,236,216, 59,199,173,255,240, 21,210,102, 76,130,167,161,160, 95, 84, 92,254,178,231,226,132, 64,214,185,
+247,163,252,116, 41, 99,212,206,189,124,255,189,239, 35, 79, 83,222,221, 27,240,205,187, 31,226,224,204, 4,215,253,204,155, 56,
+245,196, 41,238,185,243, 46,222,248, 75,111,167,232,119, 80, 73,138, 78, 82,148,142,183,131,134,234,231,250,195,239,255, 79,172,
+109,172,212,156,253, 32,220, 77,180, 68,233,176, 30,171, 76, 29, 94, 36,130, 80, 23, 2, 60, 70,178,109,214,112, 38,232,193, 90,
+ 90,208, 84,138, 9, 45,104, 39, 97,114, 83, 67,164,209, 18, 18, 37, 80, 64, 26,135,204, 11,173,196, 56, 59, 39,252, 8,150,109,
+172, 64, 59,129, 54,130,216, 8, 94,251,234,159, 97, 98,122, 1,132,102,144,101, 60,114,248, 71, 65, 35,161,106,143,122, 45,116,
+214,101,108, 48,206,146,196, 97,172,173,133,195, 8,137,219,121, 25,247,252,198,139, 56,243,196, 10,175,185,238, 34, 78, 62,246,
+ 36,221,178,228,167,127,238,183,248,244, 63,254, 29,207,191,254, 77,188,237,218,103,132,111, 46, 59,134,109, 45,177,242,119, 55,
+176,227, 13,191,200,137,219,111, 98,110,113,142,187,159, 56,195,179,118,207,225,164,226, 88,119,200, 84,172,208, 4,232,194,148,
+134,210, 75,238, 58,190, 50, 22, 21, 73, 4, 70, 8,132,135, 44,210,144, 89,140, 51, 52,227, 4, 47, 4,153,177, 8,130, 90,185,
+178,142,202,134,108, 99,107, 13, 71,143,159,230,234, 40,166, 57, 55,143, 49, 5, 42, 74, 73, 26, 41,222, 91,154,179,211,193, 34,
+180, 12,121, 94,161,211, 38,107,203,235,100,189, 13,102,166, 39,145,102,103,136,230, 83, 26,239,115,162,116,130, 34, 47,176, 69,
+129,104, 53,209,245,254,197, 27,135,208, 2,235, 10,166, 22,230,233,173,175,146,229, 25, 81, 28,208,144,147,147,139, 68, 73, 0,
+ 51,120, 25,209,237,173, 81,149, 10,124, 69, 86,100, 72, 19, 81,102,125,116,148,176,185,185,197,212, 84,131, 65, 94,146,146,146,
+196,146,126, 81,161,188,162, 55,204, 73,162, 56, 48,140,177,120,165,136,244, 36,147,147, 17,101, 86,145,180,155,156, 90,126,140,
+ 61,187,246, 49,191,251, 92,146, 36, 13,251, 78,192,186,130,147,143,222,199,190,139,158,137,212, 49,157,213, 83, 44,205, 46,145,
+117,215, 17, 90, 51,185,176,147,147, 71,239,230,150,143,254, 30, 66, 10,202, 90,197,102,132,167,231, 60,165, 11, 20,185, 49,162,
+ 80, 6,229,178,179, 65, 68, 23, 35,152,209,130, 89,169,104,138,144, 15, 44,165,192, 10, 79,229, 37,109, 25,246,233,206,215, 15,
+155,135,180, 22,195,201, 90, 69, 26,185,240, 30,107, 33, 72, 76,216,173, 55,133, 32, 54,146,246, 57,251,152,187,244, 42,150,255,
+233,243, 97, 34,235, 67,182,250,163, 91, 25, 31,186,179, 79,210, 8, 53,166,170, 87,237,186,152, 39, 13,255, 0, 0, 32, 0, 73,
+ 68, 65, 84, 46, 64, 41,208,179,240,185, 99, 61,222,164, 21, 75,173,104,108,137,164, 46, 48,253,199,143,240,213,191,127, 59, 79,
+222,251, 40,205, 68,226,187,125,178,227,171,156,126,236,104,237,175, 14,230,211,101,231,248,212,159,191,129, 55,255,250,103, 57,
+ 81,133, 63,167,165, 97,232,194,222,126,163,130,182, 14, 54,186,141,188,228,177,191,248, 12,231,190,253,181, 44, 31, 63, 77,148,
+166,180,174, 62,159,175,239,157,231, 15, 62,114, 7,159, 62,181,197,129, 68,109,139,224,252,118, 45,141,149,100,232, 37,247,125,
+255, 51,244,139,156,147, 63,122, 2,111, 2,209,206, 37,147,216,245, 46,217, 87,254, 2,107, 50, 22,174, 58,159,169,115, 22,195,
+ 78, 58,110,224,117, 18,186,196,178,143,112, 6, 41, 99,164,146,152,245, 19,168,169,121,226, 93, 23, 64,123, 15, 94, 36, 1,191,
+220, 60,143, 35,191,247, 6, 16, 42,236,217,145, 53, 25,180,238, 88,234,136, 82, 95,123,150, 69, 61,178, 14,202,119, 59, 42,195,
+224, 3,203, 94,198,186, 46,210,245, 97,103,106, 65, 94,189, 31,118,198, 33,234,221, 48, 35,252,236, 72, 57, 25,141,188,122,126,
+236,123,223,252,250,141, 44,190,225, 87, 97,123,113, 49,182, 90,153, 50, 8,152, 38,230,102,184,255,107,255,194,149,215,255,108,
+216,137, 87, 85,173,196,206, 41,243,140,114,152, 5, 58, 89, 94, 82,149, 65,212, 22, 34,101, 3,199,220, 25, 67, 81,228,129, 30,
+ 87,134,120, 83,147,231,148,101,137,113,150,188,168, 48,245,247,156, 85,134,103,205, 73,170,147,235, 60,126,214,144, 77,107, 90,
+174,196, 88, 75, 67,105, 86,125,142,203,195,124, 97, 82,194,211, 68,198,130, 52,148,195,138,181,129,161, 95,193,176,178, 40, 32,
+ 49, 33,116,100, 30, 65,177,145, 99, 61,156, 57,185, 65,225, 28, 75,251,118,112,247,169,135,144, 73, 74,210, 0, 21,171, 32,180,
+171,121, 12,149,181, 65,253,110,195, 62, 63, 31,165,132, 25,195,108, 43,102,169, 5,135,215, 12,151,204, 70,172,244, 7,108,169,
+152,169,118, 3, 83, 89,230,180,196, 84, 54, 8,181,188,160, 92,239, 80,126,239, 94, 92, 28,211,190,248, 16, 82, 43,108,105, 16,
+177,197, 85, 37, 50,142, 65, 36, 53, 10, 45, 4, 22,249,202, 98,132, 68, 25,216, 20,158, 63,121,206, 47,242,182, 63,249, 53,118,
+191,228, 37, 33,225,206,123,164,175,159,167, 26, 53, 43,116,130, 93, 91,225,245,239,185,129,183,189,249, 87, 56,120,254, 12,159,
+254,200, 71,248,137, 93,187,248,201,231, 94,203, 11,126,227,125,252,207,223,123, 59, 79,123,250, 46,238,189,127,158,123,143,108,
+240,181, 15,127,144,171, 94,253, 58, 62,112,234, 1,110,120,218,213,168, 72, 82,120,104,181,162, 16,163, 92,214, 78,141, 26,150,
+227,157,161,181,255,105, 84,171,167,185, 13,248,231,181,206,120, 90,244,233, 47,254, 51,215, 60,239, 74, 46, 59,180,159, 91,191,
+251,157,237,164, 72,169,235, 21,145, 24, 79,148,172,181, 40, 37, 57,115,226, 48, 90,134, 96,179, 17,175, 95, 73,137,178,130, 88,
+133,102,165, 52,182, 46,232, 30, 99, 71,187,244,240,218,186, 26, 32,227, 44, 20, 21,248, 36, 4,147, 9, 17,154,157,209,115, 29,
+ 17, 26, 36, 98,168,180,196, 43, 71, 85,143,253, 81, 96,140, 32,174,215, 90, 74,128, 52,193, 17,132, 23,124,229,179, 55,193,244,
+ 28, 51,115,187,120,213,203, 47, 71, 40,205,223,254,253,141, 88, 31, 60,238, 35, 75,155,180,202, 34, 35, 16,113, 56,176, 99,163,
+208, 86,112,226,177, 47,211,125,224, 71,180,159,251, 42,174,248,157,255,204, 93,183, 29,230,238,229, 30,175,188,112,129, 19, 55,
+125,140,203,119,206,241,161,219,238,103,253,190,191,198, 14, 11,116, 75,227, 47,126, 3,174,183,202,161,107,246,161, 60,204, 52,
+ 99, 38,167,166, 56,221,205,216, 51,219,164, 17,199,244,202, 96, 1,105, 41, 56,220,205,233, 13,115, 54,242,146,204, 58,250,101,
+184,141, 26,239,201,138, 10,235, 42, 26, 58, 14, 34, 17,239, 80, 94, 48,145, 42,210, 56,162, 29,167, 52,226,136, 94,127,200,149,
+151,156,203,207,189,251,221,148, 89, 78,212,104, 33,117, 68, 49,236,210, 90,220,131,183, 6,161, 34,138,173, 1,105,179, 5,206,
+ 96,108,133,160,160, 61, 51, 15,113,130,136, 21, 34,110,132,112,134, 50, 39, 74, 83,162, 56, 66, 74,201,176,191,133,208, 33, 30,
+ 54, 78, 27, 68,122,146,126, 55, 35,105,107,144, 17,147,179, 83,164,205,132,214,228, 52,101,153, 83, 86,158, 94,167,143,142, 68,
+ 16,141,120,139,177,193, 51, 61, 24, 12,192,195,153,229, 77, 10, 91,209, 31,228,120, 36,155,189, 33,131,172, 34, 73, 83,166,103,
+166, 41, 76,196,122,127,128, 19,158, 40,137, 72,149, 68, 74, 67,164, 98, 38, 26, 49,179,173, 54, 87, 93,117, 29, 7, 46,126, 54,
+173,118, 11, 33, 29, 18,193,230,250, 9,148, 74, 56,247,178,107,169,202,156,229, 99, 15,178,227,224, 69,100,189, 14,173,217,121,
+162, 70,155,108,176,202, 39, 63,240, 54,114, 31,148,237,165,244,100,202, 51,116,158,130,208,149,142,226,110,149,222, 22, 55,135,
+ 99, 54, 80,252,230,148,100, 90, 9,218, 74, 18, 75, 73, 34, 4,145,133, 4,205, 36, 17, 77, 36,169,208, 52,149, 98,202, 43,102,
+ 81, 44, 10,205, 2,138, 5, 52,243, 40,118,168,136, 57,175,152, 66, 51,233, 21,169, 83,156,115,221, 27,185,242,134, 15,177,255,
+181,207,225, 89,127,249,119,236,122,229,203,216,249,138, 87,115,164,211,227,253,119,246,137,210, 80, 72, 19, 5,155, 6,250,118,
+187,145, 28,184,160,252, 28, 90,184,241,190, 77,246,253,194,107,183,185,137, 53,209,140,162,226,240,167,254, 9,121,170, 67,239,
+238,227,156,249,250,247,233, 62,118,164,246, 96,215,170,122, 64, 68,138, 39,110,188,149,143,189,227, 50, 58, 67,104, 72,200,235,
+ 49,191,100, 59, 69, 73,213,183,244,162, 95,241,163, 79,126,137,165, 3,251,168,178, 12, 25, 73,170, 93,179,252,254,123,175,227,
+ 75,175,184,128, 83, 69, 72, 56, 75,235, 8, 71, 87,199, 56,158,206, 12, 55,127,230,143, 57,115,236, 4, 91,167,151,201,215,214,
+ 49,133, 36, 95,239,210,249,171, 63,166,248,218,167,216,113,205, 1, 14,189,246,217,204, 28, 92,130, 56,198, 37, 19,160, 35,188,
+ 41,240, 85, 15,170, 45,164, 48,184,225, 58,213,234, 25,228,196, 60,122,225, 92, 72,118,212, 62,228, 28, 49,177,155,229,191,254,
+ 67,204,198, 25,156,173,130,237,166,134, 5,248,145, 97,188, 62,232,188,117, 79,105,193,125, 29,230, 82,207, 33, 17, 99,134,190,
+175, 2, 92,102,100,121, 11,116,184, 17, 16, 38,216,116,168,147,192,130,211, 74, 32,132, 27, 99, 97,195, 5, 32, 88,197,132, 16,
+ 12, 30,252, 54,208, 8,157,188, 36,120,170, 93,133, 49, 21, 69, 54, 8,207,100, 77,235,184,243,139,159,163, 53, 51,135,138,147,
+208,213, 23, 5, 69,191, 31,186,116, 99,194,247,231, 3,178,212,217, 16, 58,109,171, 18,140,193, 57, 83,255,188,197,150, 21, 85,
+ 97, 66,140,106, 89,142, 30, 21,132, 16,204,182, 52,115, 69,143,219, 14,119,120,104, 96,152,104, 70, 65,249,238, 96,163,159,113,
+158,246, 60,173, 28,242,226,104,192,117,141, 33,123,218,142,194,122,250, 78, 80, 33,209,145,100,113, 34,101,126, 34,101,223,108,
+202,174,169,152,189, 19, 49,187, 90, 49,251, 38, 19, 14, 76, 38, 92, 58,223, 98,162,211,101,169,112,248,213, 46,230,244, 58,221,
+227,107, 12, 55,183, 40,242,176, 10, 48, 38,232, 85,156, 11,176, 31,137,103,203, 75,250, 70, 50, 59,157,112,104, 38,193, 9,207,
+227,155,142,253, 30,162, 65, 70, 54,200,217,161,117, 96,126, 24, 31, 66,104, 74, 71, 85, 88,114,227, 24,102, 57,103, 30, 56,204,
+198,234, 58,222, 90,172, 9,107, 11,138,178,142,110, 13,246, 62,231, 65, 36, 9, 88,136, 69, 88, 19,236,153,159,226,216,191,220,
+142,108, 38, 53,142,215,109,231,148,215, 23, 99,107, 74, 14,223,123, 23,115,139, 75,232,184, 96, 70, 27,238,184,251, 9,126,255,
+139,223,226, 5,191,241, 62,148,132,223,122,223,167,152, 88,218,203,174, 11,175, 32,137, 4,247,220,255, 40,177, 86,244,142, 31,
+225, 93,135,239,161, 2, 78,173,116,120,205,239,254, 60,249, 86,191,206,106, 16, 99, 5,170,119,144,236,222,207, 58, 37,255,220,
+ 78,126,204,115,190,119,215, 78,148,140,120, 98,179,195,206,185, 26, 48, 35, 85,157,220, 39,217, 30, 51, 5,145,220,233,147, 71,
+176,182, 34,213, 2, 93, 11, 19,163, 40, 56, 38,210, 72, 18, 9,133,150,130, 36, 10, 29,182,173, 47,170,149,169,133,108, 46,156,
+ 31,101,157,111,110,106,164,171,212,130,138,224, 6,146,117, 90,237, 40,202, 85, 68, 32, 99, 16, 81, 16, 18,187, 17,144,166,118,
+137, 90, 27, 58,117, 97, 4,177, 21, 36, 78,112,104,255, 94, 14,237, 63,143,221,187,247,208,239,117,185,239,190,251, 66,212,171,
+170, 63,147, 8, 44, 2, 93, 26,135,142,194,158, 44,138,130, 88, 73, 3, 63,250,238,103, 56,117,218,242,171,255,241, 23,120,242,
+150,143,209, 55,130,165, 29,115,196,133,103,179,191,201,175, 94,119, 13,127,241,242, 23,209,123,240, 9,242,134,102,231,179,247,
+176,246,200, 3,152,217, 73,166, 95,244, 38,102, 62,243,223,153, 76, 20,143,156, 88,163, 91, 89,158,209, 78,177,110,147,245,210,
+132,238, 77,122,142,231,134,102,172,105, 9, 73, 83,107, 68, 4,145, 84, 68, 74,147,198,146,162, 10, 0, 8, 45, 71,168,204,240,
+ 66, 78, 79, 52,168,140,231,177,227,203,220,240,191,126,147, 43,126,230, 77, 20,155,107,232, 36, 70, 39, 13,178,173, 14,210, 75,
+ 54,142, 62,130,138, 19,210,102,131,214,236,116,200, 61,238,247, 17,214,176,255,162, 11,120,242,161, 39,152,152,110, 49,236, 14,
+176,206,208, 72, 99,148,138, 41,141, 37, 31,100, 76, 47,237, 96,216,219,194, 25, 77, 57, 60,203,212,194, 18, 82, 69, 84,213,128,
+178,232,208,154,106,209,237,156, 33,146, 77, 58,249, 26, 85,213, 39,203, 54,145, 40,250,155, 25, 81,170, 48, 70,210,237,108,210,
+158,156,100, 56,200, 80, 72, 78,174,245,152,158, 72,168,140, 35, 82, 49,248, 96, 11, 27,246, 6,148,149,225,210,243, 46,227,254,
+ 71,238,161, 42, 60,139,115,123, 56,247,252,167,147, 54, 96,117,249, 56,237,169, 89, 34, 37, 49,101, 78,234, 65,234, 20, 17,197,
+152, 50, 99,215,190, 11, 64, 73, 54,151,143,147,180, 90,204,239, 60,200,112,227, 12,211, 59, 15, 81,102, 3,154, 83,147,252,238,
+175, 60, 7, 41, 60,214, 75,140,243, 88, 27, 70,126,149, 15,153, 90,255,126,202,106, 76,120,232,194,152,213,161,188,162, 33, 20,
+ 13, 20,137, 80, 40, 23,108,110, 94, 72, 26,120, 34, 41,112, 14, 38,241, 68, 85, 16,110,164, 46,220, 58,181, 20,200,154,208, 34,
+234,248, 68, 89,139, 76,148, 80, 52,150, 63,199,202, 7,191,197,220,197, 23,145, 29, 57, 65,241,248, 26,223,252,234, 17,254,242,
+184, 99,186, 9,185, 9, 54,144,118,180,173,244,108, 72,200, 70, 1, 48, 53,209, 45, 23, 80,220,123,123,237,141,222,150,162,123,
+ 27,186,191,226,236,198, 24,247, 52, 98,111,136,154,193, 28,148, 48,225,107,119, 78,102, 92, 48, 5,107, 38, 28,106,137, 12, 69,
+ 60,119,176,167, 5,119,118,224, 29, 23,199, 72, 37,176, 89,206, 99,159,252, 2, 7,222,242, 90, 54,151, 79,160,180,162,240,138,
+ 67,175,124, 6,119, 95,178,147,183,221,112, 59, 63,202,131,160,210, 17,210,229, 94,124,249,161, 96,161, 60,121,134,254,242, 26,
+ 50,223, 68, 61,250, 15,204,205,193,226, 11,206, 71,183,154,160, 21, 34,141,113, 66, 5, 13,153, 45,240, 85, 81,147,192, 12,190,
+ 40, 48, 38, 67, 79, 47, 18, 45, 29, 68, 78,157, 3, 50,197,231, 27,200,198, 4, 98,230, 34,214,191,122, 19,189, 59,110, 9, 3,
+ 64, 25,108, 97,206,186, 96,201, 20, 98,236, 63, 20,255, 46,172,107,219, 76, 29,162, 85, 69,125, 73,242, 53,179, 61,132,185,140,
+ 38, 28,129, 13,143,243,227,225,136,148,146,209,120,194,213, 42,121, 33, 71,112,143,218,187,107,131,156,216,123,193,202, 63,126,
+136, 29,175,124, 43,248, 12, 91,149, 72, 29,118,203,198,133, 41,128, 20, 10, 17,197, 12, 59, 29,126,120,211,223,114,229,235,223,
+138, 41, 50,156,173, 48,101, 21,166,120, 66,133, 72, 75,111,234,168,214, 17, 7, 62,236,244,157, 9, 29,250,200,179,142,183, 56,
+ 31,136,117, 78,120,180,116,108,246, 75, 94,122,225, 60, 63,252,246, 81, 14, 15, 42,118, 44,204, 18,121, 79, 36, 29,179, 91, 93,
+246, 41, 19,130,205,154,142,137,249, 6, 73, 51, 38,207, 44, 26, 67, 85,228, 76,181, 34, 38, 38, 82,100, 35, 70, 8, 65,220, 74,
+ 41, 51, 67,175, 55,192, 35,208, 90, 97, 60, 76,204,182,112, 6,138, 60,167,242,130,114,104,112, 74, 48,204, 42,150,123, 3,214,
+149, 38, 78, 34,172,175, 45, 85, 4,161, 90, 28, 41, 58,121, 65,145, 27, 46, 57,119,134, 7, 86,114,156,133,147, 91,138,153,212,
+240, 80,103,192, 11,231, 38,176, 33, 77, 36,116,149,165, 9,178, 9, 32,154,104, 50, 63, 63, 71, 58,191,147,188,183, 73, 51, 89,
+164,202,135, 68,113, 82,103,137, 26,220, 32, 7, 83,225,134, 5, 40,136, 19,197,188, 17,108, 85,134,162,159,227,170, 10, 44,200,
+ 58,106, 86, 8,139,247,181,162,220,123,182,182,182,216,185,184,196, 48,239,114,231, 29,143,210,127, 74,224,119, 64,128,123, 92,
+177, 69,231,212, 41,202,170, 98,239,174, 25,140, 49,232, 70, 74,255,241, 71,120,253, 55,190, 74,241,201,255,141,140,226, 80,134,
+ 71,139,227, 17, 99,213, 89,212,142,221,220,247,229,207,242,170,103, 61,157, 47,125,235,206, 49, 52,230,205,175,120, 46, 39,123,
+107,108,116, 87,249, 47,215,191, 10,239,202, 64,145,148,122, 60,110, 31,253,163,180,230,209, 7,190, 79, 18,213,128, 37, 31, 0,
+104, 82, 9, 34, 33,136,164,128, 72, 80, 88, 73,110, 92,157,172,247, 84,155,239,104,244, 94,127, 79, 53,228, 93,136, 48,158, 87,
+202, 81,137, 32,162,171, 45,237, 88,231,208,162, 22,201,250, 64,145,115, 2,156, 23,219, 81,175, 54,224, 2, 68, 9,174, 6, 2,
+189,232, 5, 47,230,174, 35,167,248,246, 61,247,241,196,137,147,148,214, 32,253,136,251, 16, 60,245, 74,130,174,188, 71,121,143,
+214,170,246, 15, 42,164, 87,108, 30,126,152,119,124,253, 75,244,127,248,101, 62,252,187,159, 34,154,108,115,253,158,105,110,121,
+224, 4,229, 99, 9,239,254,208, 47,242,111,159,248, 12,131,116,150, 23,189,242, 50, 78,124,231, 4,123, 95,246, 58,142,223,116,
+ 35, 7,246,247,185,230,133,151,113,242,179,247,113,118,152,241,234,103, 95,194,185, 7,247,176,214, 43,249,252,163,167,168,156,
+199, 56,193, 76,171,201,116,156, 80,185,112,200, 69, 90,209,136,131, 39, 52,214,138,217, 86,155, 94,150,225,113,104, 39, 66,230,
+174, 18,129, 1, 93, 90,190,242,173, 27,105,236,216,141, 27,108,161,146, 20, 33, 4,213,214, 6,113,163, 69,180,103, 31, 58,190,
+144,213,199, 30,160, 24,244, 65,104,226, 56,194,198, 17,113,115,146,214,204, 2, 66, 28,161, 28, 12,105, 47, 44, 48,216, 92,163,
+ 44, 75, 92,153,131,138,145, 10,170,114,192,244,194, 12,221,245, 62, 84,130, 97,175, 79,156, 52, 40, 7, 21, 29,183, 73, 62,236,
+209,152,156, 98,184, 53,100,208,219, 34,203,135, 20, 69,193, 70, 63, 99,162,221, 32,177, 9,121, 86,162,163,136, 65, 63, 40,115,
+143,173,118,208,145,196, 88,143,146,154,173, 44,167,157,166, 52, 98, 77, 97, 4,194, 9,246,156,123,128,243,159,118, 13,165,233,
+176,181,181, 76,175,119, 2,107,103, 88,220,117, 0, 37, 37,206,148, 76,239,220,205, 32,223,162, 49, 53, 77,220,156,160,216,234,
+178,190,124,140,249,221,231,178,184,255, 60,250, 27,107,120, 83, 49,181,231, 32,142,138,185,165,221,252,215,159,191,104,124,160,
+226, 61,218,134,157, 94, 8,248,169, 15,189,145,208,211,109,139, 69,172,169,111,154, 54,228,150,199, 34,120, 47, 35, 25, 30,252,
+209, 40, 89,218, 48, 30,108, 33,105,215,169, 70,202, 65, 44, 66, 0,143,240,160,188,216,206,241, 30, 41,175, 69, 24, 15,124,248,
+ 31, 54,184,245,196, 89,102,121,136, 45,160, 47, 64,181,198,137,165,196, 34,140,244,135, 38,116,228,169,222,246,196,182, 85,248,
+187,102, 22, 94,116, 32, 98,229,158,213,113,176,136,168,211,157, 70, 25, 79, 35,188,233,104,145, 37, 68,157,173, 78, 45,125, 21,
+142,120,105, 63,151,188,251,197,244,110,252, 3,244, 68, 16, 43,185,186,222, 47,198,112,166, 8,237,194,243,246,205,143,201,101,
+ 46,207,121,226,227, 55,178,247,173,175, 97,176,185,134,140, 36, 78, 57,184, 96,137,207,125,232,181,152,173,156,108,125,139,211,
+255,151,172,247, 14,183,236, 58,235,251, 63,107,173,221, 78,189,253, 78,185,211, 37,205,140,172, 81,239,150, 92,130,141,108,112,
+ 9, 53,224,184, 1,191, 96, 48, 24, 98,155, 80,108, 76,208, 15, 28, 48,196, 63, 74, 48,198,166, 5, 23,146, 95,176,193,198, 20,
+199, 13, 99,185,224, 34,201,150,213,187,102, 52,154, 59,115,235,169,251,236,182,214,202, 31,107,237,115,175,200,163, 71,207,140,
+ 30,221, 57,115,206, 62,123,175,247,125,191,239,183,156,221,230,225, 39, 55, 56,254,226, 23,240,232,135,223, 75,135, 9,251, 22,
+ 66,154,115, 29,226,127,115, 2,173, 4, 66,133,136, 36,154, 78,208,232,220,105,205,141,243,186, 54,147,177,179, 10,142,154, 68,
+ 11, 43,132, 51,251,145,201, 50,214, 20,216,124, 11,217,222,131,156, 59,200,230,103,255,158,205,191,123,159,175,207, 78,190, 86,
+ 23,104, 99,236, 20,206, 20, 94,174, 35, 3,159, 89,238,247, 4,194,115, 18,132,112,228, 56, 39, 66,116,132, 42, 43, 37,178,118,
+ 64,243,198, 49,194, 95,111, 97,188, 75,159,177,211,235, 46, 96, 26,175,108,189, 27,157,197, 32,133,194, 98, 25,223,245, 41,170,
+219, 94,141,181, 26,213, 72,168,170, 18, 83, 58,235, 83, 21, 37,144, 79, 16, 82,209,232,180,121,250,193, 71, 57,248,224,221, 44,
+ 28, 58,134, 12, 3, 71,122, 43, 43, 66, 18,183,202,215, 22, 25, 6, 80,228,126,106, 55, 8, 83,250,240,151,210, 33, 16,202, 5,
+173, 68,113, 76,165, 53,166,128,216, 90, 94,113,229, 34, 49, 99,238, 59,159, 51,152,104,222,120,168,193,114,219, 96,199, 5,165,
+181, 68, 11,115,100,169,139,200,154, 93,110, 99, 44,140, 77, 73,186,157,179,119,223, 12,139, 7,231,221, 80,217,233, 50,217,238,
+ 19,207, 45, 81, 78, 82,130,141, 45,154, 11,243, 88, 93, 34, 27,109, 26,179, 93,170,201,152,188, 63,162,152,140, 9,195,136,206,
+254,253,136,168,193,112,117,141,103, 30, 95,101,109,123,204,150,129,243, 74,178, 53, 41, 72, 2,225, 76,137, 10,139, 18, 78, 67,
+ 61, 31,195,147, 35,232, 34,160,138,152,211, 35,102, 2, 73, 94,104, 68,238, 60, 41, 2, 32,150,206,160, 38, 12, 20, 82,192,184,
+204, 16,107,155, 36,179,179,142, 47,146,103, 4,113, 12,233, 24, 59, 28, 65, 89,185,179,214, 72, 98, 21,112, 34,209,108, 93,117,
+ 41,131, 39,158,112, 33, 57,149,241,209,185, 1,214, 72,144,214,163, 11,154,206,124,135, 11,219,235,232,234, 8, 23, 95,126, 41,
+ 65,244,119, 46,239,221,111, 85, 86,246,238,165, 85,132,168, 64,179, 61,236,113,217,141, 55, 82, 20,133,219, 39, 71,145,139,169,
+158,237, 98,172, 64,201,208,167, 10, 50,109, 62,101,203, 57,194,189,231,175, 62,203, 31,188,251,157, 92,253,161,191,100,107,173,
+207,137,195, 7,144,157, 3,156, 91, 19,172, 62,242, 41, 94,250,186,247, 49,220, 58,239,160,123,233,121, 54,187,244,233, 82, 10,
+222,251, 91, 63,141, 52,142,128, 23, 10,233,207, 3,199, 13, 74, 2, 9,185, 64, 89, 77,160, 36,161, 53, 62, 70,213, 27, 49,121,
+116, 71, 42, 47,163,173,197, 32,214, 17,228,148, 84, 4,161, 0, 91, 58,162,180, 54,200,132,169, 52, 23,175, 12,173, 35,170,235,
+108,131,188,116,188,162,208, 58,169,156,209,240,222,247,255, 9,186, 61,199,252,254, 3, 92,126,245,181, 84,198,242, 55, 31,251,
+216,148,145,111,189,221, 67, 96, 43, 73,134,123,200, 43,105, 41,173, 37, 40,192, 40,133,169, 6,188,243,117,191,202, 75, 94,254,
+ 60,110,254,158,151,176,246,197,207,113,237,107,190, 23,145,110, 51,122,244, 30, 78, 46, 4,252,252, 95,127,137,239,122,249, 73,
+170,170,226,153,187, 30,100,255, 53,167, 88,253,240,111, 82, 69,251,232,175, 93,224,200, 92,151, 59,238,124, 0, 49,217,228,218,
+131,179,124,252,145,115, 24, 9,165,112,129, 17,113, 4,199,230,218, 24,235,157,155,140, 35,134, 24, 99,177,166,100,190, 29, 51,
+211,154,165, 63,153,144,166, 35,138,178,224,242, 83,167,120,227,239,253, 22, 85,225, 4,131, 86, 58,167, 46, 51, 25, 19,182,102,
+157, 65,141,174, 40,210, 49, 69,150,209,232,182,137, 91, 45,176, 21,205,206, 12,219,107,155,164,195, 49, 51,139,243, 20,195, 62,
+ 84,153,211,245,202,156,214,220, 12,163,222,136, 78,123,129,126,111,155, 94,185,129, 41,115,154, 75,179, 88, 3,227,254, 22, 73,
+ 91,177,122,102, 27, 99,122,200,160,201,160, 55,230,220,133, 45,138,178, 96,152, 85, 68, 17, 4,185,166, 44,114,202,170, 34,208,
+130, 74,107, 38,185,101,115,148, 50,223,142,105,198, 13,214,122, 67, 2, 21, 96,204,132, 80,133,100, 70, 51,183,220, 34, 8, 19,
+206,158,255, 38, 86, 27, 22,151, 15,209,233, 46,209,234,204,145,166,155,232, 34,227,192,241, 43, 41,242, 1,179,179, 7, 64, 40,
+178,113,159,184,217,102,255, 69,151, 49,187,239, 16,227,254, 38,217, 36,229,200,229,215, 82,228, 41,237,206, 60,255,233,245,151,
+ 78,141,124, 80,142,205, 94,177, 19, 52, 0, 59,217,192, 74, 91,140,116,146, 13, 25,236,196,158, 10, 11,137, 15,212, 9,144,126,
+ 58, 99, 58,113, 41, 4, 77, 41,137,118, 73,117,164,111, 16,148, 16, 83,120,115,135, 96, 37,167,198, 66, 86,192,247,157,156,231,
+205,255,245, 21, 60,250,217, 59,184,247,204, 4,162,132,123, 78,111,242,141,199,123, 40,207,208,215,218, 21,216, 72,193,164,114,
+239,173, 33,221, 20, 61,209,112,249,156,226,214,189,115, 14, 27,247,211, 25,117, 50,178,244, 93, 52, 62,192,198,251,123, 91, 43,
+166, 6, 83, 22,216,243,202,215,114,224, 71, 95,202,237, 7, 95, 68,222,129,141, 17,252,216, 69, 49,127,123,206, 65,146, 43,157,
+144, 59,206,149,124,224,223,159,164,234, 13,188,172,203,255, 93, 86,240,244, 7, 63,206,193, 87,189,140,209,120,132, 82,110, 90,
+ 28, 11,133,157,107,195, 76,131,131,135, 23, 57,124,243, 49, 76,185, 70,112,240,160, 75, 33, 52,238, 52, 48, 83,115, 12,233, 14,
+ 76, 93,185,137,220, 90,103,147, 90,149, 46,106, 56, 72, 8,103, 23,145,113, 11,217, 94,194, 70,109,108,217, 67,169, 38, 34, 88,
+ 34, 88, 58,204,249,255,245, 65,250,126, 66, 87, 82, 98,164,157, 50,107,173,176, 83,178,208, 78,230,184,242,112,186,240, 12,110,
+191,142,168,167, 49,233,124,220, 69,253, 34,248, 44,121,124, 92,107, 32, 17, 70, 56, 79,113, 97,189,233,139,215,176, 23,218, 53,
+ 89,222,175,221, 33,159, 21, 66, 74,180,214,110, 58, 9, 66,206,188,235, 71, 57,250,107,127, 77,185,241, 40, 65, 24, 17,180,154,
+200,113, 74, 96, 52, 86,135, 72, 99,209,121, 70,119, 97,158,207,254,233,127,231,149,111,126, 11, 82, 69, 4,205, 22,229, 96, 72,
+ 89, 20, 68,141, 24,148,116, 83,166,111, 74,116,225, 60,206,221, 51,160,128,220, 17,237,162, 4, 93, 76,156,249,139,177,156,216,
+151,112,232,232, 18, 79,222,181,206, 75,175,221,199, 27,143, 46,178,124,234, 24, 36, 9,229, 96,200,214,163, 79,144,143, 53,147,
+241, 26,237,153,132,112,182, 69,255,194,136,116, 80,112,240,212, 49,230,246,205, 18,181, 91,152,176, 65,145, 22, 84,149, 70, 37,
+ 17,166,200,104, 47, 45, 18,207,205, 98,170,146, 32,105, 32,195, 24,155, 79,136,103, 58, 88, 61,161,181,188, 64,208,108,160,146,
+ 6,173, 61, 11, 92,188,184,200,202,104,196,100,179,207,183, 31, 57,199,184,217,102,144, 85,156, 30,101,196,113, 64, 32, 5, 54,
+208, 92,178,183,205,183, 31,238, 49,182, 33, 77,163,144, 26, 6,227,148,142,145, 40, 35,144,198,157,239, 82, 8, 2, 33, 8,141,
+219, 23,207, 70, 49, 89, 9,166, 40,176,121, 65, 17,134, 4,205,142,115,216,211, 26, 43,124, 84,177,178,148, 85,197,226, 76,155,
+175,223,117, 31,179,221, 38,182,200, 48, 37,168,178,112, 74, 5, 43, 65, 57, 37,132,169, 42,142, 95,117, 53,137,252,159, 72, 85,
+146,218,130,119,190,225, 53,252,210,123, 62,128, 49,176,103,113,145,223,121,231, 27,249,232,231,190,194,230, 48,101,111,187,193,
+115,110,184,153,141,181,117,135,242, 4, 46,106, 85,180,155,211,120,179,250,172,168, 37,248,170,221,102, 52, 26,240,229, 59, 31,
+226,203,255,112, 55, 66, 47,115,241,241, 43,201,180,224,233, 39, 87,249,196,231,191,200,167, 63,252,110,138, 34,163,154,164, 68,
+173, 25,148,216, 49,157,113,205, 93,197,234,217, 51, 96, 52, 66, 74,231,181, 17,128,182,138,210, 39,168, 5, 74,209,138, 13, 19,
+ 35, 25, 87,142,235, 32,113, 50, 52,107,167, 73,192,222,159,193, 53,137, 8,136, 34,208,194,184,192, 36, 64,250, 33,198, 10,231,
+176,169,212,142,139,159,149,222, 7, 4, 55,236, 26, 11,105, 1, 38,179,228, 26, 26, 86, 35,180,100,229,216, 69, 52, 22,247, 49,
+187,103, 15, 91,163,148,211,103,207,186,115,217, 75,189, 17,174,177, 8, 98, 37,168,188, 6,175,208,130,208,184,135,185,178,112,
+230,254,175,146,107,201,139,223,245,155,132,247,127,149, 95,249,147,207,243,203, 31,123, 25,119,127,252, 9, 62,252, 55,159,225,
+178,189,243,188,242,170,139, 24,158,189, 64,167,157, 50,124,252, 1,178, 27,175, 37,156,219, 71,220,153,229,186, 27,143,243,181,
+175, 63,198,147,153, 38, 21, 93, 46,172,111,113,113, 43,224,161, 81, 73, 97, 5,179,113, 3,161, 97,146, 22,204,182, 91,196,205,
+136, 86,179, 67, 85, 89,186,221,134,243, 67, 14, 66,182,123, 61,154,177, 68,218,132, 23,253,192,109,220,246,150, 95,196,228, 57,
+ 42, 40, 48, 66,161, 84, 76,149,143,145, 97, 19,173, 51,138,225,128,184,221,161, 50,134,197, 67,199, 41,139, 49, 97, 12,189,213,
+ 49,179,123,150,232,148,134,168,221,102,110,105,137,167,183,251, 72,109,232,118,218,116,218,139,100,217,144, 36,209,100,249,132,
+ 56,110,177,185,250, 52,115, 11, 49,229,176,135, 8, 90,216,124, 66,191, 63, 97,115,115,131,195, 43,115,108,156,223,102, 56,170,
+216, 26,164, 78,106,231,245, 75,214,192,214,120, 76, 35,142,216, 30,166, 52,226,152, 39,206,111, 50,211,138,136,195,144, 39, 47,
+108, 19, 71,130,134, 80,168, 64,176,157,231,204, 52, 20, 39,142, 95,193,147,143,223, 75, 24, 40, 14, 28,190, 12,157,167,132, 81,
+130,165, 32,237,109,113,197,243, 95,193,100,210, 39, 9,230, 73, 22,150,200,210, 17,243,251, 15, 48,234,109, 17, 69, 9,217,160,
+ 71,149, 78, 56,112,226, 10,250,107,231,137, 26, 49, 63,255,227, 87,161,118,181,130, 86, 11,148, 39,192, 41,111,103,136,151, 68,
+160, 65, 70, 46,210,207,159,193,211,208, 0, 41, 37, 10,199,206, 5,151, 50,100,141,211,130, 27,169,156, 50,202, 57,132,251, 4,
+ 40,129, 84,238, 95,140, 69,212, 44,232, 58,207,220,155, 56,184,157,173,147,151,124,249,157,127,201,151, 47,228, 60,255, 80,204,
+210, 66,131,155,143,132,236, 31, 72,254,126,195, 16,120,233,136,244, 33, 8, 19,239,220,134,117, 59,239, 43,230, 66, 94,117,201,
+ 60,181, 9,187,245, 19,169, 13,234,112,118,166, 15,150,144,194,235, 82,133, 15, 46,113, 69, 94, 0,123,126,240,185,124,235, 77,
+ 63,198, 71,206, 67,167, 35,249,167,159, 60,198,207,255,207,199,176, 22, 94,113,164,205,108, 0,207,223,223, 34,238, 13,221,231,
+145, 59,113, 35, 72,183,191,123,230,163,159,226,226,159,248, 97,214,207,156, 65,121,253,181, 48, 10,194, 16, 17, 75,207,174,174,
+ 35, 19, 5, 54,112,210, 24,180,241, 49,154,222,230,212,104,172, 39, 45, 97, 53, 34, 72,156,158, 30, 16,113, 7,145,204,123,221,
+ 96, 15, 58, 11,200,230, 44,193,193,147, 60,241,107,111,165,220, 58,239, 57,183,198, 91,207, 58,180,171, 54,204,144,214,186,223,
+ 89,235, 39,108,124,186,151,115,125,179, 53,217, 77,186, 98, 45,172,159,188,167,242, 37, 15,197,123, 16, 0,109,167, 9,124,117,
+ 76, 41,222,223,191,214,212,226,189,181, 69,160,124, 72, 9,211, 8, 87, 42, 39,227, 58,253, 27,175,229,208,219,254,148,254, 83,
+247,187, 76, 0, 89, 59,214, 90,103, 85, 42, 93,227,179,188,178,194, 63,188,247,143,248,222,183,190,153,193,198, 26, 42, 12,168,
+202,130,162, 40, 9,148,162,240,161, 51,218, 47, 59,171,202,249,164,155, 74,251,156,120,139, 21, 6, 81, 40,146, 36, 98,159,181,
+ 92,122,114,129,100,207, 62, 46,249,206, 69,186, 23, 29,119, 44,250,241, 8,213,234, 18, 14, 6,228,163,148,242,244, 51,116,150,
+ 58,116, 23, 58,200, 86, 11,181,149,179,116,116, 47, 43,207,187, 5, 81, 78,168, 38, 3,140, 8,168,250, 35,130, 48, 68, 72,137,
+234,206,184,156,236,164, 69, 20,199,160, 43,242,254, 6, 81,119,150,192, 26,130, 70,236, 53,246,190, 25, 86, 1, 54, 16, 52,104,
+211,218,179,194,117,157, 22,214,104, 86,159, 89, 39, 57, 93,210,201,241,204,123,215,156,141, 10, 77,217,180,152, 64,160,138,136,
+213,113, 78, 16,198,180,124,138,142,136,220,234, 37, 84, 18, 21, 74,148,118, 4,200,208, 66,214,219, 38,140, 99,196, 40,132,110,
+142, 53, 62, 66, 21,215,148,219, 32, 32, 47, 45, 69, 89, 50,211,136, 56, 55,158, 80,165, 99, 23, 31, 93,149,136, 32, 2, 81, 98,
+ 9,156, 15,145,181, 68,179,243,236, 9,250, 12,122, 19,116,127, 31,123, 14,205,241,193,223,122, 27, 58,140, 41,242,140,239,123,
+253, 47,242, 71, 31,254,119,124,238,142, 47,243,137,223,127, 51, 89, 89,250,231, 71, 32,140,244,196, 49,229,149, 21,202, 15, 1,
+202, 19,120, 13,237,131, 71, 81,141,152,215, 94,183,135,159,249,189,247, 51, 63, 59, 71,183, 53,139,180, 16, 87,235,252,237,239,
+191,149,189,199, 47, 98,212, 91, 39,106,116, 60,226,164,166,152,185,148, 2, 33, 66, 62,240,190, 95,117, 94,238,214,155,101, 25,
+119,198, 5, 62, 42, 55, 22, 2, 17, 74,194, 92, 58, 27, 94,164, 35, 99,214,216, 95, 45,241,196, 21,106,233,215,120, 90, 26,114,
+ 3,102, 82,208, 8, 4, 13,225,194,175,164,240, 70, 66,222,184, 47,140,220,112, 85, 63, 79,120,125,122, 89, 89, 50, 45,200, 11,
+203,196, 64,128,230,112,119,142, 7, 31,125,148,167,238,184,131,210,152, 90,109,186,163,171,175, 83,225,190,235,150,214,237,198,
+ 26,111,143,231,116,113,129,117,251,128,113, 62,230,198,185,125, 28,125,221, 59,248,165,171,158,207,211, 90,176, 39, 42, 56, 54,
+ 60,195, 99, 91,150, 55,255,151,159,102,237, 11,255,204,133,237, 9, 55,254,151,247, 99,198, 21, 15,253,241, 31,179,247,186,107,
+153,123,222,139, 8,179, 33,107, 27, 5,131,237, 17,107,219, 61, 46,127,206, 73,132,169, 88,157, 84, 28,223, 59,207,193,133, 54,
+ 43, 75,179,196, 65, 76, 20, 74, 86,150,151, 40,202,138,197,249, 6, 65,152,176,185,182,206,242,114, 27,171, 21,198, 84, 28, 90,
+ 89,228, 7,127,243, 15, 96, 50, 6, 93, 32, 84,128, 46, 83,175,233,116, 19,145,201, 82,146,197,189,232,172,112, 14,104,129, 68,
+133, 13,202,116, 12,166,162,217,157,243, 63, 11, 58, 55, 72,160, 61,211,162, 49, 51,199,176,183, 73, 24,196,108,111,109,209,233,
+118,217, 62,183,198,241,203,142, 48, 30,104,230, 23,231, 24,174,110,145, 52, 91, 60,244,192, 25,174,187,226, 8,253,126,201,120,
+ 82, 48,202, 11,202,170, 66, 27, 71, 68,233, 38, 33,131,180, 64,107,195,184,116,222,211,231,251, 41, 82, 24, 26,113,194, 90,191,
+160,180, 21, 74, 73, 90,113,196,218,160, 32,138, 44,215, 93,122, 25,141, 86,147,113, 58,228, 57,151, 61,143,241,112, 29, 83,102,
+236, 59,114, 9, 79, 61,124, 55,167,110,254, 46,100,226,166,184,214,252, 2, 2, 65,107, 97, 17,163, 43,132, 54, 52,102, 59,152,
+210,210,104, 53,233,159, 59,139,108, 54,249,173, 95,122, 57,214,119,127,117, 34,144,246,187, 39,233,155,197, 66, 56,198,122,237,
+214,233, 80, 90,225, 85, 79,194,219,158, 58, 98, 92, 55, 20,116,131,128, 4, 65,136,147,172, 97,119, 10,163,244, 14,101, 46,172,
+195, 23,115,156,105,141, 35,102,225, 25,207, 59, 43,219, 41, 56,107, 53,157, 78, 66, 38,224, 19,207,100,252,221,147, 25, 31,123,
+ 34,229,222,177, 95, 17, 24,199,122,111,121,216, 61,116,182,243, 44,197,240,198,147, 93,158,187,183,227, 33, 53,233,139,181,123,
+ 8, 93,126,189,244,166, 19, 98, 42, 29, 17,211,234,179,107,217,135, 32,191,247, 11,188,228, 61, 79,112,104, 6, 62,244,250, 83,
+188,227, 35,143,240, 72,102, 57, 53, 27,242,255,156,154,231,216,108,204,222, 78,228, 58,228,250,239, 18,210, 29, 20,245,252,107,
+161,255,208,227,204, 95,123, 37,197,104,228, 6, 91,101,157,181,169, 21, 16,184, 85,139,131, 50,188,180,198,175, 33, 48, 26,131,
+ 43, 68, 22, 23, 94, 33,195, 4, 17, 53, 29, 44, 15,144,204, 34,195, 24, 33, 75,148,178,136,184, 67,178,176,159,124,125,139,211,
+239,122, 59, 58, 29, 78,249, 4,194, 74,207,254,221, 57,132,106, 62, 65,189, 39,159, 22,234, 58,191,217, 7, 41,137,105,248, 13,
+211,233,123,247,114, 84,120,187,211, 29,121,144,123, 14,165,144, 72, 85,175, 55,158, 45,127,179,149,246,168,205,142,233, 13,182,
+ 38,225, 73,108,150, 50,248,234,167, 88,190,237,135, 72, 55,207, 83, 22, 5, 0,197,196, 49,215,133, 39,240, 25,173, 9,195,144,
+167,190,117, 55,199,111,184,137, 81,175,143, 41, 43,116,233, 16, 14,167, 69, 47, 93,214,186, 17, 88, 93,248, 59,205, 49,231,173,
+146, 40, 37, 88,232, 52, 56,184, 52,199,141,183, 94,193,236,161, 3,132,115,203, 68,179, 51, 4, 11, 7, 60,147, 63, 67, 70, 77,
+ 44,142,203,130,214,180, 22,154,132,137, 34,221, 30,145,142, 10,226,249, 57,230, 47,121, 14, 86, 79, 40,242, 28, 25,181,209,101,
+ 73,153, 77,136, 23,151,137, 59,115, 78,199,220, 8, 93,211,143,147,215, 69,179, 11, 72,165, 16, 88,162, 86, 27,173, 13,197, 36,
+ 69,181,187, 68, 73, 11,213,153,131, 42,167,181, 56,131, 82,146, 70,171, 65, 87,103, 4,210, 93, 80, 19, 72, 46,108,229, 60,210,
+ 43,105, 6, 1,157,208,113,162, 54,171,156,253, 65,128,180,130, 72,130,148, 1,129,132, 64, 72,148,148,200, 56, 36,104,181, 9,
+219, 77, 38,101,238,125, 3, 2,146,164,233,136,132,163,148, 50, 43,168, 38,154,254,118,138, 61,243, 4, 66, 56, 31,228,199,250,
+ 35,110,248,129,239,192, 22,154, 32, 73, 28,129,113,122,101,221, 63,249,164,228,101, 47,190,129,223,123,239, 95, 99,146, 54,221,
+153,101,150,246, 30, 99,125,173,224,225,199,214,120,250,238,111,240,223, 62,242,183,252,252, 43,175,230, 39,110,255,117, 6, 27,
+235, 59,217, 50, 22,144, 33,234,220, 83,200, 32, 64,181,218,200, 32,244,212,110,129,214,150,246,197,151, 67,210,228,182, 87,190,
+128,255,248,154,151,112,219,149, 7,120,225,149,123,248,169, 31,121, 9, 63,251,214, 55,144, 44, 46, 49, 25, 14, 9,130, 16, 21,
+198, 68, 73,130,138, 98,132,116,207,109, 85, 85,100,147, 17,191,251,235, 63,225,184, 55, 66, 80,149,110,191, 45,164, 67,182,218,
+202,113,189,164, 16,100, 90, 51, 46, 52,149,112, 28,133,170,180, 94, 38, 41,166, 8,167, 64,144,132,130, 40, 16, 52, 26,150, 32,
+112, 13,105, 0, 4,129,112, 28, 38, 97,157, 85,121,224,215, 8, 82,120,233,176,207,217, 48,194, 21,244, 76, 80,100,144,149,130,
+ 66, 59, 46,207, 13,183,220, 66,212,104,128, 82, 76,202, 9,101, 85, 57,122,129, 71, 75, 29, 17, 15,212, 43,111,110,223,110, 48,
+110,151,170, 5,162,242, 29,177,133,225, 96,141,171,142,220,192, 51,247,124,154,163,139, 33, 43,227, 9, 47,250,229, 95,224,255,
+127,255, 95,243,147,111,251, 49,190,245,201,207,241,149, 71,206,241,169, 59, 30,231,135,126,241,199, 72,191,241, 1,242,228, 4,
+ 11,179, 57,241,177, 83,164,171,247,243,212, 3, 67,134,105,198,153,141, 1, 55, 95,117,130,108,146,115,241,225, 99,156, 93, 61,
+239, 29,215, 42,150,230, 59, 72, 25, 50, 28,245,137,195,144,193,112,200,210, 98, 3,140, 98,212, 31, 50, 51,147, 16, 43,197, 27,
+254,226, 67, 48,238, 99,109,134, 8, 91, 84,217,216, 31, 10, 26, 25,197,148,195, 1,241,204, 28,186,200, 41, 39, 41, 85,149, 19,
+198, 9,166, 52,232,188,160, 57,187, 64,153,167,148,185,102, 50,114,187,247, 56,142,136,154,109,134, 27, 23, 88,185,244, 82,158,
+184,251,126,158,115,227, 41,202,204,178,184, 60, 67,145, 85,116,103,219,100, 99, 77,220, 76,184,112,110,147, 35,203,109,242,202,
+ 57,169,173,111, 15, 64, 88, 98, 41, 40,140,179, 6, 28,149,206,152,162,170,156,164,165,168, 44,163, 60,167,219,104,144,151,150,
+141,241,152, 32, 52, 48, 80, 0, 0, 32, 0, 73, 68, 65, 84,102, 28, 16, 5, 1, 69,161, 48,162,224,200,210, 2,251,150,246,177,
+182,189,198,137,139,159,139, 10, 53,253,173, 85,142, 92,124, 13, 79,159,190,135, 35, 39,174,161,187,188,136, 64,146,180,187,140,
+182,214,105,206,205, 18,119, 92,194, 91,220,110, 49, 94, 95,199, 26, 67, 62, 73, 89, 56,120,144,245,143,255, 55,110,186,254, 69,
+ 60,185,181, 74, 62,233, 79,211,207,204,206,122,213,217,193, 90, 55, 64,217,192,117,141, 82, 56,194,135, 12,156, 33,130,244, 36,
+183, 40, 16,196, 8, 58, 66, 49,215,157, 39,148, 1,210, 86, 83, 56, 27, 33, 93, 78,120,157, 21,108,221, 6,182,238, 36,167,100,
+244,250,128,247,204,103,124, 74, 90,189, 83,218,223,138,121,238,222, 38, 47,216,219, 64,148, 37, 51,129,224,251, 14, 52, 57,210,
+ 16,140,115,205,176,182,169, 22, 78, 98,246, 11,167,230,152,107,196, 88, 41,166,218,244, 58,252,199, 76,255, 14,143, 44,120,235,
+207,154, 12, 88,239,232,118,254,156, 32,219, 46,184,124, 94,241,154,231, 44,144,246, 38, 28,159,143,248,142,253, 77, 94,114,108,
+198,125, 38,159,229, 61, 13, 74,150, 98,170, 19,181,187, 25,186,165,134,170,162,121,244, 48,186,202, 60,100,231, 35,134,119,233,
+122,157,115, 4,211,194, 70, 32, 16, 54,112, 5, 92, 5,142, 21, 40, 5,216,202, 25,201,134, 13,132,117,217,226, 42,108, 18,206,
+238, 33,144, 9,103,254,236,253,244,239,252, 23, 55,109, 83,107,204,253,247,189, 75, 33,239, 98,226,133, 39,206,213, 42, 52,103,
+155, 43,148,112,105,103, 90, 35, 3, 53,157,198,169,195,123,106, 59, 83,185,163, 80,243,216,227,142,159,185,127,109,199,130,151,
+110,170,241, 54,177,214, 90,132,242,217,144,218, 21,146,157,130,224, 61,228, 17,232, 34,103,240,197, 79,208,185,250, 86, 68,163,
+ 73, 62,232,131,174, 8, 91,109,138, 73,134,209, 21,129,103,195,235,178,162, 72, 71,116, 23, 22,200,125,248, 75, 62, 73,137,146,
+136,108, 48,112, 5,220, 24,207,204,118,161, 41,142, 97, 92,113,120,223, 2,151,221,116, 13, 43,207,185,152,246,225,195,136,214,
+ 12, 34,112,211,161, 8, 99,100,220, 68,200, 16,157, 13, 17, 65, 19, 84, 3, 73, 73,228, 92, 96,153,228,176,121,182, 79,115,177,
+205,220, 37, 39,209,249,132, 60, 29, 1,146,201,198, 5, 68, 24, 19,207, 45,128, 82,168, 40, 65,132,161,227, 38, 78, 70, 4,157,
+166, 35,156, 89,141, 12, 66,180,174, 45,107, 13, 70, 8, 23,143,106, 42,116, 54,113,190,245,185,139, 18,110, 46,204,211,104, 69,
+ 84,165,115,162,123,116, 61,103,125, 82,209,136, 20,115, 97, 72, 34, 20,231, 38, 99,150,226,192,165,131,121,103, 0, 41, 37,202,
+ 72,130, 40, 64, 53, 26,168,102, 76, 16,183, 73, 77,234, 73,171, 6,153, 52,144,214, 80,109,246,168, 82,151,172, 54,234,101,244,
+ 31,121,144, 66, 72, 18,107, 57,211, 75, 57,245,221, 55, 32,100, 64, 16, 69,200, 64, 97, 85,136,173,109, 15,180,163,173, 70,221,
+ 57,126,248,229, 55,241,255,253,246,239,242,197,251,159,162, 27, 53,185,246,208, 60,127,250,119,159,228, 51, 95,253, 26, 31,254,
+207,255,158,159,248,245,119,178,181,250,204,212,160,168,150, 84, 90,169, 80,103, 31, 71, 5, 33,178,229,195,123,164,131,183,172,
+ 21,180, 46,189,134, 98,178,205,104,227, 60, 54, 74, 88, 60,116,152, 3, 39, 78, 18,182,186, 20,185, 91, 31, 8, 41,145, 42, 68,
+133, 17, 97,228,214, 29,210, 55, 32,198, 24,214, 31,127,140, 79,254,253, 95, 76,227, 83,149,116, 30,238, 8, 8,141,164, 25, 6,
+132, 82, 82, 26,152,148,174,168,103,149, 37, 47, 93, 97, 22, 8,146, 40, 66, 87,134, 64, 56, 57,156,146,130, 40,128, 56, 22, 59,
+210,125, 63, 68, 9,101, 16, 46,249, 24,229,109, 99, 69,192,212,132,200, 84,238,188, 45,115, 24,167,144,149,160,181,131,228,173,
+129,135, 31,124,128, 97, 58, 97,126,113,145,155,159,123, 19, 87, 92,126, 37,247, 62,112, 47,198,251,104, 72, 1,177, 16,168, 87,
+220,212,185, 29,225, 33, 83,235, 13,234, 49,104,109,185,254,165,111,226,216,169,171,249,171,255,252,251,188,240,215,110,167, 85,
+156,163,183,122, 1,221,235,113,195,187,255, 43, 79,253,249,159,240,161,199,198,188,234, 5,199, 81,231, 31,231,200,109, 63,200,
+211, 95,249, 39,154, 75,123, 41, 39,134,229,151,126, 15, 79,255,203,191, 48,236,103,228,133,230,222, 39,207,114,213,137,139,121,
+236,244, 25,246,238, 89, 36,207, 82,102,219, 13,154,141, 6,101, 89,177,216,237, 18,199, 17, 73,156,160,164, 98,110,113, 22,107,
+ 4,231,159, 62,203, 79,254,225,187, 9,227, 14,186, 24, 35,195,192,105,184,189,148, 66,132,177, 59,132,226, 24, 93, 86,148,233,
+152,168,211, 65,185,147, 18,139,165, 42,114,170, 73,138,140, 98,167,185, 45, 44,189,181,103,104,206,207, 50,220,220,102,229,228,
+165,156,249,214,253,216,124,200,145,171,174, 98,243,244, 51,196,141, 38,186, 40, 64,134,232, 74,179,189,222,163,149,104,154,115,
+139,228,105,202,102, 63, 35, 14, 74,207,214, 10, 49,166, 4, 25, 48,206,220,228, 30, 72,129, 18, 33, 27,131, 49, 75, 51, 29,198,
+ 69,197,168, 40,104,132, 18, 33, 20, 73, 24, 19,169,128,102,162, 88,236,116, 9, 19,197,201, 35, 55, 48,179,167,195,185,167, 30,
+ 96,113,254, 40, 85,144, 17, 7, 13,246, 30, 59, 78, 16,132, 72,169, 24,109,175,147,180,219,180,231, 22, 48,214, 80, 76,198,152,
+162, 36, 27,143,193, 26, 22,143, 94,196,219,111,185,129,199, 79,175,113,205, 37,123,185,246,138, 91, 57,117,221,243,249,230,157,
+ 95, 36, 82,146, 10,183, 51, 47,189,132,173, 46,240,214,203, 86,168,137, 31,254, 41, 13, 36, 72, 35,136,165,160,169, 36, 51, 65,
+196,158, 61,151,160,108,137, 40, 50, 23,226, 41,148,223,173,219, 29, 50, 74, 13,209,214, 58, 76,243,236,228,174,105,226,163,119,
+ 50, 19,194,195,110,222,244, 36, 80,146, 75,102, 98,226, 64,242,233, 11, 25,247, 14, 42, 44,208, 82,208,142, 4,215, 47,196,252,
+204,115,230, 9, 2, 71,180, 82,222, 56, 89, 8, 59,157, 2, 69, 13,141,251,105, 84,214,113,190,176, 19,193, 42,133,151,110,213,
+204, 85,193,114, 43,112,159,195, 90,218, 81, 64, 59, 9, 92,202,149,112,254,229, 83,100, 66, 10,143,102, 56, 2, 96,109,101, 44,
+132, 43,144,229,198, 22, 10, 65,114,240,128, 39,168,249, 11, 80, 84, 96, 42, 68,224,155,128,202, 78, 47,152, 83,153,233, 58,197,
+104, 7, 62,193, 5,118,216, 34, 67, 37, 9,201,220, 30, 2, 25,177,254,217,207,178,249,185,207,184,253, 59, 96,234,239, 64,236,
+ 56,188, 77, 39,235, 90,146,102,157,157, 37,214, 67,145, 82, 76,141,182,132,181,211, 12,240,186, 33,178,186,242,135,182,221,197,
+139,176,187, 58, 52, 92,179, 36,236,212,104, 71,170, 29, 8,126, 26, 18,227,225, 0,231,149,238,146,196,108,157, 7, 80, 95,157,
+ 64, 78, 85,234,147,251,254, 5,206, 62, 74,243,196,213,152, 48,162,154,164, 84, 89,238, 81, 17,144, 97, 64,220, 76,216, 90, 61,
+207,194,202,126,138,225, 8,109, 74,143, 22,120,233,157,117,205,133, 83,115,104, 26,141, 6,233,120, 68, 59, 10, 57,121,213,113,
+102,142, 30,113,168,146,115,223,194,154, 18, 17,197,200, 32, 1, 21, 34,163, 8, 51,238, 97,100,140,213,160,204,152,112,102, 22,
+173, 53,147,137, 97,107,109,192,161,155,174, 35,234,180, 64,134, 84,227, 30,218,104,140, 8, 49,229, 4,213,104,146, 44,238, 71,
+133, 13,178,193, 22, 65, 35, 38, 8, 66,170,178, 64,231,133,107, 98, 42, 77, 89, 20,148,165, 91,137,228,163, 1, 65,232,214,138,
+ 66, 69, 24, 83, 82,142,115,100, 28, 99, 10,141, 8, 2,162, 56, 33,140, 35,170,209, 4, 81, 84, 8, 41,104,202,136, 56,144,140,
+139,156, 40, 18,116,140, 32,148,202, 5, 39, 73, 73,168,132, 59,151,146,136,160,153, 32, 27, 49,121,169,209, 38, 71, 72,129, 12,
+ 36, 74, 5,216,116,228,204,184, 84, 64,158, 87, 12,158, 56, 77, 98, 13,218,194,153,113,198,202,101, 43,180,151, 23,144,161,247,
+101, 87,106, 7,185,177,245,206, 90,163, 26, 45,222,248,147,175,229,182, 43,247, 34, 70,167,121,252,233, 71,248, 15,175,122, 49,
+239,124,231, 91, 56,114,245, 53, 12,182, 54, 80, 82, 96,181,240, 43, 24,183,171, 70,133,200,179,143, 33, 35,133, 76,154,206,221,
+111,202,126, 15,105, 94,122, 45,233,246,211,206,139, 64,212, 81,192,218, 19,234,106, 79, 4,129, 80, 1, 97, 24, 17,196, 9, 50,
+136, 92,136,145,113,169,118, 95,255,237,223,224, 27,103,191,233,206, 26, 43,188, 9,140, 68, 89,119, 46, 4,129,139,248, 30,231,
+ 21,131, 66, 51, 46, 12,165,182,228,133,155,232, 23, 23,230,152,155,153,101, 50, 74, 17, 88, 66, 37,136, 66,103, 17, 43,149,117,
+134, 85,214, 5,245,152,192, 34, 34,151, 94,105,132,147,124, 10,143,151, 91, 47,129,171, 85,133,121, 6,105,102, 41, 10,175, 62,
+ 66, 16, 9, 56,126,244, 16,135, 15, 31, 97,121,207, 30, 70,233,136, 71, 30,123,132,245,245,117,183, 38,245, 76,145, 88, 9,212,
+ 43,158,219,190, 61,168, 15, 66,109,156,232, 94,192,145,203, 94,204,119,188,246, 93, 20,217,136, 91, 94,126, 37,250,220, 5,246,
+188,250,231,120,248, 55,223,206,119,254,197, 7,201,123, 19,162,187,239, 96,105,121, 31,159,186,231, 73,126,230,163,255, 72,254,
+208, 29,100,131, 77, 78,127,251, 25, 22,246,205, 19, 69,150,152,156,135,191,245, 52, 27,195,140, 94,154,243,163,175,123, 57,255,
+248,133,187,156,211,218,100,194, 76,179, 65, 51,105,160, 2, 69, 89,148,180, 26, 49,139, 75, 75, 88,109,232,111,109, 17, 39,138,
+ 23,126,255, 43, 88,185,233, 5,216, 60,245,138, 98,137, 41, 29,209, 69, 70, 77,116,145, 81, 14,251,168,184, 65,149,101, 4,129,
+ 79,241,242,169, 68,147,222, 6,205,185, 57,132, 74,144, 74, 48, 25, 12,105,118,103,136,162,144,184,221, 36, 78, 98,130,164,193,
+250,147,103, 89, 57,121,132,124, 92, 34, 3, 73,145,102,132,141, 38, 82, 41, 38,233, 4, 65,198,252,222, 67,244, 54, 7,148,121,
+198,246,246, 54,115,221, 14, 69,110,152, 84, 57,203,179, 93,182, 71, 5, 89,145,211, 12,221,195,212,207, 75,150,187, 9,227,194,
+ 50, 42, 11,154, 65, 64, 24, 4, 84, 70,208, 14, 99,180,173,232,196, 49,243,179, 29, 46, 59,118, 19,179,251,102, 89, 61,253, 32,
+ 81, 56,203,210,145,131,244,206,159,229,232,229,215, 78,117,197, 85,145,146,246,134,204, 44,239, 33,153,159,161, 72, 83,226,164,
+ 73, 85,230, 8,109, 88, 60,124,140, 15,188,233,213,132, 42,228,196,108,194, 95,125,246,110, 46, 94,108,210, 49, 5, 55, 95,123,
+ 61,119,222,255,109,140,183, 56,212, 98,167,150, 8,229, 32,110, 41, 28,154,166,237,142,196, 73, 10, 8,149,164, 33, 4, 77, 41,
+152, 15, 35,218, 81,128,200, 82, 2, 91, 77, 73,111,214, 75,226,100,189, 47,223,149, 68,101,237,110,149,148,157,190,176,240,147,
+114,189,219,221,209,212,237, 76,144,123,154, 1, 55, 45, 53,248,206,149, 38,223,177,183,201, 11,246, 54,249, 55,251, 91, 92, 62,
+159, 96,172, 47, 72,187,222,172, 20,181,173,233, 14,219,213,238,138, 23,222, 97,231,213,164, 48, 59, 77,252,218, 49,166,112,175,
+ 41,165,244,124, 3, 53,125, 21,235, 11,144,172,181,175,162,158, 96, 93,193,151,190,153, 17,222, 13,162,220,216,160,123,233,165,
+136, 40,242,117,208,173,133, 68, 16,122,148,162,242,138, 3,207,188, 9,164, 55,252,241, 58, 96, 99, 48,101,137,148, 2,213,108,
+210,152, 93,192,110,142,216,248,212,103,232,221,121, 23,101,175,231,139,164, 95, 49,248,172,116, 16, 59, 19, 57,174,224, 78, 27,
+142,169,132,191,150,242,249,221,250,238,107, 23,120,215, 45, 85,147,247, 92,225,118,129, 94,117,140,170,255, 25, 41,119,252,180,
+107,152, 93,187, 56,214,218,165, 11,127, 15,139,218, 43,119,122,197,235,239,206,250,117, 77,205,113,112,255, 79,103, 35,244, 35,
+119,147, 12, 46,208, 88,218,143,154,153, 67,151, 21, 65,183, 67,160, 66,132, 18, 36,157, 54,233,120, 76,103,118,158,241,214, 54,
+ 50, 8,168,180,147,196, 18, 40,202,178,112,188, 6,107,157,149,172,148, 92,119,235, 85,204, 30, 63, 6,102,130,144,129, 75,149,
+211,165,227, 48,200, 0,209,104,185,235,161,115,108,218,167,178, 33, 84,154,176, 21,163, 58, 51, 84, 52,216,190,208, 39,156, 91,
+ 96,233,216, 65,176, 21, 85, 49, 65,143, 55, 49, 38, 68, 4, 1, 86,103,174, 9,146, 18, 61,218,198, 84,153,219,231, 75, 87,184,
+141,129,201, 48,165, 44, 74,170,202,146,143, 71,148,217,132, 42,205, 72, 55, 54,220,127,143,251, 14,113,168, 10,100,148,184,204,
+ 8,143,166,196,205,132,125, 43,139, 28,234,134,148,195, 18,237, 9,136,149,174,216, 46, 53,135,226,208,123,124, 88, 23, 13,108,
+ 32,138, 2, 84, 20,163,154, 17,178,217, 34,153, 89, 98,187,119,222,125,135,218, 16,196, 17,166, 63,164,200, 74, 4, 1,197, 56,
+163, 55, 76,105,247, 55,105,198, 49, 74, 41,182, 78,159, 99,229,197,215, 59, 55,195, 40,152,174,183,236, 14, 4,230,125, 14, 44,
+101,165,153,217,187,159,203,110,186,137,235, 94,240, 60,150,143, 28,161,168,140,147, 33,138,192, 31, 7, 78,156,109,234,197,159,
+ 10, 17,143,221,135,138, 18,135,150,120,211, 12, 33, 20, 50,105,145, 28, 57, 73,186,113,122, 42,173,116,247,140,156,122, 41, 88,
+ 15,137, 75, 21, 16, 70, 77,231, 38, 23,132, 83, 89, 91,245,169,207,242,129,127,248, 19,158, 73,157,155,169, 84,158,204,107,220,
+180, 29, 7, 46,183, 34, 43, 13, 91,105,197,184, 48, 84,198, 48, 41, 44, 69,229,206,207, 80, 40, 38,147, 9,121, 94, 18,133, 18,
+ 97,161, 17, 58,137,175, 8,133,147, 14, 27, 55, 84,170,216, 34,195,218,112,201,165,178, 9,223, 1, 89, 13, 69,233,119,233, 5,
+228, 57,164, 41, 20,133,107,130, 3,227, 50, 49, 94,255,195,255, 14,101, 12,223,190,247, 30,238,190,231, 94, 46,172,175, 59,166,
+190,159,143, 2, 1,177,146,168,151,221,210,186, 61,178,138, 0,103, 77,103, 44,204,239, 63,201,247,191,229,111,176,147, 45,226,
+217,125,136,249,121,194, 68,115,238, 11,159,166,125,233,101, 44, 63,239, 86,190,252,170, 87,242,119, 15, 12,120,252,158, 71,248,
+141,255,241,123,252,217,155,222,194,115,174,233,178,239,166,235,185,239,147, 95, 71,156,121,140,246,161,131,236,189,234, 50,238,
+254,196,151,233,149, 26, 43, 3,158,184,247,126, 78, 28, 62, 4, 85, 74,210,104,162,148, 34, 9, 3,132,177,236, 93,217,135, 8,
+ 36, 85,153, 57, 91, 85, 93,113,252,178,227, 92,255,227,111,194,166, 35,103,144,128, 65, 37, 29,143,246,134, 20,131, 30,194,135,
+ 63,148,163,129,219, 79,169, 96,234,101, 92,101, 5,201,204, 60, 58,207,177, 85,142,138, 26,160, 75,130, 36, 38,159,164,116,150,
+246, 59,136, 39,108, 48,217,218, 98,225,240, 97,178,241,136,114,146,211, 93, 88, 98, 50, 30,121,247,170,148,217,197, 61,140,182,
+ 71, 20,197,132, 65, 47,101,105, 62,194,170, 54,189, 94,159,149,125, 51, 12, 83, 75, 86, 24,132,201,105, 39, 9,163, 82, 48,223,
+ 84, 20, 70, 49, 46,114,218, 81, 72, 20, 68, 68, 65, 76,158, 87, 68,161, 68,163,233,196, 49, 87, 93,114, 37,221,165,101,242,162,
+207,100,156,114,242,218,231,113,250,145,187, 56,118,234, 6,138,241, 16, 21,132, 8, 5,131,181, 13, 58,243,203,204, 28, 88, 33,
+189,176, 74, 60, 51, 75, 89, 20, 84, 89,198,252,129,253,252,218, 79,190,136,199,214,159,228,231,126,229, 61,156,125,248, 94,190,
+251,182,239,224,191,127,228,147,220,250,226,151,178,231,242,171,184,249,248, 65,238,184,243,107, 88,229, 53,147,158,220,102,167,
+218, 98, 65,229,167, 56, 33,107,231, 47,215,201, 54,172,100, 78, 72,102,165, 32,206, 70, 68, 85,133,139,214, 17, 83, 9, 28,194,
+ 57,239,249,147,222,237,215, 37,222,147, 93, 76, 89,162,211, 26,235,249, 13, 98,183,227,152, 47,190,211,237,237,244, 53,220,172,
+231,224,239, 29, 54,189,144, 59,178, 43,118, 21,171,122,100, 20, 72,191, 14,216,217,163,215, 5, 67,248,149,129, 48,255,186,204,
+136,105, 51,226, 10, 38,207,218, 49, 11, 33,188,116,139,233, 7, 23,114,167,137, 97,103,128,197, 90,193,248,193,135,233, 92,250,
+ 28,108,171,133, 53,181,254,196,233,170,119, 55, 50,198,136, 41,132,111,173, 32, 8, 67, 84, 51,161,209,108, 99,183, 83,122,119,
+124,157,193,221,223,102,244,196,105, 76, 94,236,192,248,158,209,104,167,214,172, 59,252, 1,215,180,137,233,148,172, 2, 63,249,
+ 75, 57,109,136,166, 5,190, 54,134,113,111, 6, 17,184,152, 58, 99,245,180,112, 27,171,221,245,241, 59, 78,177,123, 95,110,236,
+174,164, 94,127, 15,217, 29, 95, 92,233,179,166,107,184, 85, 32,118, 60,185,189, 94, 87, 40,151,200,231,174,167,153,218,201,154,
+241, 8,125,230, 33,212,233,251,104,245, 87, 73,182,158,166, 57,188, 64,179,119,129,230,246, 25, 90, 27, 79, 49,187, 56, 79, 26,
+182, 49, 69,233,101,115, 46,250,211, 26, 31, 23,235, 45,131,247,236, 93,226,192,229,151, 32, 66,137,136, 91,211, 6, 11, 79,160,
+148,141, 6,194, 58,193,164, 41,114,202,225, 22,229,164, 36, 8, 3,130,174, 51, 0, 42,211,140,167,239,185,143,249,195,251,232,
+204,207, 96,202, 49,198,184, 0,155,108,216,119, 33, 42,217,144,114, 82, 32, 48,100,253, 13,168, 12, 85, 49, 33, 27,143, 41,134,
+ 19,210,113, 74,127, 99,155, 50,207, 25,110,110,145, 13, 6,100,163,148, 42,207,157,190, 95, 8,210,254,152, 48,136, 41,243, 28,
+ 43, 32, 31, 12,200, 6, 35,103,121, 59, 30, 67,101, 72,230,231, 9, 76,142, 20,130, 86,148, 48,204, 50, 54,139,156,163,205, 6,
+129,117,242,183, 72, 10, 2, 33, 9, 3, 73,216,140, 9,146, 38,170,213, 36,156, 93,100,245,236, 83, 68,177,147,142, 69,113,130,
+204, 11,170,188,116, 40, 69, 94,145,229, 48,121,228, 81,150,102,218,156, 43, 11,236,160,100,241,133,167, 80, 6,100,160,144, 65,
+ 56,101,168,215,197,221,178, 11,129, 17,194, 69,215, 86,149,215,181,239,172,108, 4,214,135, 11,213, 77,172,117,201,108, 79,222,
+143, 74,154,168,102, 11,171,164,143,105,149,200,230, 12,201,193,139, 24,111,157,113,176, 60,187,154,106,239,153, 80,223, 99, 74,
+ 69,200, 40, 33,140, 18,100, 24, 67,101, 40, 77,133,185,253,119,248,131,213, 47,161, 75,135, 70,137,218,250,213, 63,206, 70,184,
+103, 73, 36,109, 70, 69, 69, 90, 84, 76, 10,231,236, 87, 84,142, 88, 90, 20, 37,101, 81, 17, 7,138,216,203,102,149,132, 32,176,
+222,225, 77, 56,228, 83, 9,100, 4, 65,232,152,239,177, 55,162, 65, 58,175,248, 70,210,112, 49,191,133, 37, 43, 92, 65,119, 52,
+ 7,225, 16, 82,229, 28, 55, 31,186,231,155, 12,122, 91,204,237, 89,230,250,155,111,230,248,137, 19,220,119,255,131,211,126, 57,
+ 80, 78,149, 36,181, 5, 17, 88, 34, 33, 72,148, 34,110,182,120,213,219,254, 25, 61,122, 6,107, 53,249,246,121, 68,235, 48, 98,
+227,107,252,227, 47,191,135,163,175,251, 85,178,123, 62,197,124,171,228,120, 51, 36, 93, 88, 96,207, 11, 94,200, 86,127,204,252,
+ 21, 63, 8,139, 7,185,232,210, 54,119,126,227, 12,102,227, 41,250,103, 46,208,233,198, 52,132, 96, 61,117, 94,206, 13, 81, 18,
+ 34,137,226,136, 86,179, 65,216,104, 18, 53, 19,198,233,152, 42,175,136, 26, 49, 97, 51,166, 55, 24,113,235, 27,223,132, 30,143,
+ 48,198, 56, 27,219,164,141, 46, 11,132, 80, 84,233, 8,163,115,103, 80, 49,153, 16,196,177,151, 87,184, 91,165,156, 84, 68,173,
+ 6, 86,107,210,237,109,170, 50,199,228, 99,194, 48, 32,110,118, 88, 60,116, 17, 85, 89, 98,133, 98,188,177,198,254,203, 78,178,
+125,230, 25,218,115,115, 44, 29, 57, 74,111,125,205,201, 96,168, 88,218,127,144, 81,111,224, 96, 28, 21, 51, 59,211,100,126,229,
+ 40,166,146,172,236,159, 71,151,150,118,210,160, 27,133, 44,118, 26,204,180,230,104, 5, 22, 33, 67,146, 40,102,161,157,208, 77,
+ 18,246, 47, 44,129, 81,164,186, 96, 92,100, 36, 65,192,129,165,101, 58,157,121,132,132,116,216,103, 97,121,133, 97,239, 2,243,
+ 11,135, 40, 38, 3, 31,112,165, 25,109,109,147,180, 59,204,236, 91,100,178,185, 70, 99,105,145,170,170,136, 27,146,249,125,203,
+252,225, 79,125, 23,195,222, 6,132,130, 95,122,215,235, 57,112,229, 41, 70, 42,225,103,126,234, 71,248,223, 31,254, 75,154, 71,
+ 79, 97,198, 41,175,253,217, 95,199, 71, 93,251, 48, 2, 71,246, 80,190,144, 6,245, 1,235, 13, 19, 2,220,141, 21, 41,136,173,
+ 99,132, 6,214,151,115, 63,117, 91,233,101,223,218,238,120, 51,120, 35, 18,140,120, 54, 12, 92,167,121, 25,166,185,213,211,233,
+217, 23,231,154, 69, 42,216,241, 40,183, 53,129,149, 93,198, 80, 62,198, 85,238, 58, 73,220, 36,233, 52,211, 83, 43,211,218, 53,
+ 78,236, 16,186,234,215,180,117,232,251,174,148, 49,166, 19,248, 78,153,183,254,240,112,147,151, 39,220, 73, 87,236,165,159, 72,
+157,201,133,220, 41,140,190, 1,176, 18,206,127,244,227,140,190,240, 21,146, 32, 38,153, 93,164,177,247, 0,241,236, 2, 97,163,
+131, 8, 99, 84, 20,211,104,197, 52,163, 16, 81, 65, 92,105,138, 7,158,160,247, 15, 95,224,220, 71,254,158,245,127,254, 50,197,
+120,132,174,229, 8, 72,183,134,242,230, 2,182, 94,144,123,244,162,214,227, 11,235, 99, 84,237,179,137,140,181, 26, 97,234,248,
+ 86,163, 30,254,122,200, 64,121, 65,173, 83, 74, 96,156,227,156,156, 46, 77,132,207, 81,247,247, 64,229,167, 44,255, 58,211, 88,
+214,154,124,199, 14, 91, 30, 99, 92,115,230, 27, 33,103, 66,227,223,159,118,136,130,209, 53,115,179, 38, 36,121,237,187, 5, 51,
+ 25, 35,210, 33,182,183,137, 24,111, 35,179, 20, 81, 86,140,238,252, 60,123,142, 29, 67,132, 33,152,146, 42,203,208,121,233, 38,
+244, 34,159,250,191,239, 63,178, 7, 17,198, 16, 38, 16, 52, 61, 9, 2,100,152, 32, 67,185,147, 47,142, 6, 83, 32, 27,109,178,
+222,134, 67, 98, 66,133, 41, 11,202,254, 6,149,214,116,230,102, 49,101, 78, 57, 25, 81,165, 27,110, 85, 97,115,172, 46, 65, 5,
+ 4,145,162, 28,245, 17, 65, 72, 81,102, 20,147,140,124, 48,100,212, 31,208,223, 26, 80,228, 21,233, 56, 37,155,100, 12,135, 25,
+163,254,152,173,245, 62,195,113,198,133,115, 91, 20,149, 97, 56, 28, 50,236, 13, 25,109,110,144, 79, 38,164,163, 33,195,254,128,
+241, 36, 39,203, 50,180, 41,153, 95,154,231,224,225, 5,150,246,183,105,197, 17, 74, 6,104,191, 38, 50,194, 41,154,172, 48,158,
+139, 89,185,142,184, 2,107, 43,130,112,134,116, 48, 96,178,213,103,188,213, 71, 7, 18,202, 2, 83, 20, 52,218, 77,218,203, 75,
+108, 84,154,204, 90,148,182, 84,163, 49, 91, 79, 60, 77, 54, 26, 80,166, 41,186, 72, 49, 69,134,169, 10,199, 19,168,252,250,200,
+ 48,157,218,153, 54,199,245,253,227, 31, 86, 15,239,216, 90,181,130,191,103,139,220,237,254,240, 5, 93, 56, 57,100, 50,179, 48,
+117,131,179, 86,187,103,219,122,225,120, 93,208,125,113, 7,135,182, 9,165,220, 97, 23, 40,182,127,246,231, 56,183,127,150,188,
+ 50, 88,229, 28,225,140,117, 62, 13,149,177,100,165, 97,148, 27,210, 82,161,154, 29, 10, 33, 73, 11, 77, 86, 26,202, 90, 65,100,
+221,123, 12, 37,206,105, 46,112,111,181,242,183,188, 68, 58, 72, 93,187, 84,203, 48,112,207, 95, 24,185,157,186,244, 77,123, 28,
+133,116,219,109,172, 81,206,208,175,128,170,180, 84,149,123, 14,149,176, 4,214, 53,100, 39, 47,190,136,147,151, 94,198, 37,151,
+156,160, 42, 74,158,124,234,180, 51, 36,210,126,213,229,165,166,129, 17, 22, 93, 66, 32, 20, 21, 5,255,225, 55, 79, 99, 71,167,
+ 81,170,225, 72, 37, 97, 68,181,189,197,249, 51, 99,126,234,211,127,128,213, 79, 35,155, 51, 60,244,208,136,243,195, 30,239,187,
+255, 81, 62,249,234, 87,243,179,111,255, 17,254,252,251, 95,205, 15,252,214, 91,216,251,188, 23,115,236,241, 85,190,244, 39,255,
+192,141, 63,189,200,203, 94,125, 27,189,223,253, 8,103,183, 13,179,157, 14,127,251,181,251,248,237,255,248, 26, 62,249,181,111,
+ 82, 86, 21,189,237,109,230,186, 77,202,137,101,189,159,114, 52,154,193, 20, 49,111,120,231, 47, 83, 25, 67, 16, 52, 48, 38,199,
+138,157, 12,104,171, 75,208, 21, 66, 4,232, 34, 67, 72, 23,101,170,194, 0,157, 87, 46,130,211, 20, 24,155,160,203, 28,155,231,
+116, 14, 30,167,154,140,221, 97,129, 64, 68, 77,236, 48,101,184,182,202,190, 43,175,102,227,225, 71, 64, 42, 26,243,139,172,222,
+247, 16, 18, 73, 49,153,176,231,162,163,172, 63,179,206,194,254,125, 12, 54,122,116,103, 23,168, 90, 13, 38,227,140,118, 91, 49,
+ 25, 43, 22, 23, 23,216,234,107, 90,121,159, 72, 45,177,209, 31,178, 56,211,196,152,144, 48, 78,232,141, 32,140, 91, 28, 63,114,
+ 25,143,159,255,103,164,112,134, 63,141, 36, 98, 60, 54, 16, 54,200,243, 1, 70, 27,230,150, 87, 72,135, 27,116,103,150, 48,166,
+196, 68, 1,101, 89, 16, 37,109, 58,123, 22, 16, 42,112, 4,234, 36, 6, 51, 33, 74, 58,252,229,219, 95,195,198,249,115, 46, 17,
+ 74,187,233,251,189,159,254, 32,111,126,197, 27, 88,186,252, 58,206,191,239, 67,152, 34, 99, 99,125,204,169,203, 15, 80, 25, 23,
+ 9, 88,231,110,200, 26,169,113,196,108, 52, 14,142, 50,214, 71,155,122, 15,247,142,130,216, 56, 11, 89, 91,251, 26, 90,247,251,
+ 58,216,195,238, 2, 87,157,108,203,122, 77,248, 78,100,103, 61,130,215,224,235, 78, 10, 24,254, 65,221,193,202,119,179,167,173,
+135,204,217, 69,188,219,237, 2, 49,109, 44,180,192,122,103, 39, 60,113,111,186, 19,174, 27, 6, 95,248,108,205,250,158, 18, 91,
+236,174,230,163,102,246,219,233, 52,234,199,213,233,158,182,126,239,102, 10,244, 59, 72, 77, 5,206, 18, 21,229,119,201,194, 50,
+121,250, 28,171,207,124,220, 31,112,138,160, 21,123,105,159, 64,104,131,173, 74,116, 94,120,248,218, 31, 32,120, 7, 55, 81,175,
+ 50,132, 7, 65,236,212, 92,199,133,169, 40, 95,235, 93,232,196, 20, 0, 8,188,153, 16,142,149, 62, 45,174, 82,248,108,241, 41,
+241,223,193,129, 8,159,133,110,166, 13,178,240, 50, 64,163,119,125,135,194, 31,204,210, 69,141,202,192, 53, 52, 83, 54,187, 20,
+211, 98, 45,188,169,135,216,181,125,169,155,139,186,176, 79, 29, 56,118, 33, 57, 94, 13,231, 14,233,157,155,192, 93,229, 74,239,
+ 32, 5,224,253, 41, 44,193, 99,223, 36,238,236,165, 20,150,114, 52, 68,107,111,150, 99, 53,101, 86,177,111,207, 12,243, 39, 47,
+193, 20, 5, 76,250,136,184,242,136,137,132,168,233, 38,116,173,177, 85,142,176, 6, 83,102,152,178,194, 58, 11, 53,103,242, 80,
+142,208, 85, 69,107,182, 3, 85,202,100,107,136, 48, 14,141,172,170, 2,101, 52,149, 73,177,194,241, 96, 76, 54,114, 81,154, 66,
+ 81,166, 25,195,222,144,237,245, 33,253, 97, 78,156, 4,104, 3, 10,203, 96, 48, 33,155,228, 72, 96,116,110,196,210, 98,131, 42,
+ 47,166,169,110,162, 55,162,211,113,103, 51, 34, 68, 6,129, 35,153,142,198,142, 63, 80, 89, 26,221, 22, 43,251,231,201, 86, 13,
+147,202, 16, 84,134, 72, 8,140,128,170, 82,236, 2,192, 28,105, 47,205, 80, 71, 46, 35,253,214,167, 16,203, 49,162,183, 69,216,
+237, 80,233,138, 80, 24, 84, 43,100,118,255, 2,102,118,150,115,253,161,203,172,239, 52, 56,253,161,207, 49,251, 43,175,163, 72,
+ 71,136, 48, 34,244, 49,211,110, 98,246, 92,120, 21,184,103,223, 91,165, 9, 79,220,152,174,121,208,110,154,181,181, 50,163,142,
+ 0,214, 14, 65,171, 57, 29,190,233,180, 90, 35, 91, 45,236,104,136, 54,154,192, 59, 18,214,247,164, 53,210,157, 31,218,122,174,
+136, 99,251, 11, 31, 4,211,191,251,171,112,239, 19,124,240,176, 83, 71,153, 18,239, 64, 40,208, 62,147,188, 20,160, 75, 67, 86,
+ 77,232,157,126,134,113, 86,144,230,198,121,167,216,169,235,197, 84,184,145, 21,213, 52,168,165,134, 23,181,118, 23, 56,142,160,
+ 17,187, 92,117, 25,184,124,118,231,108,227,204,188,242,162,162,215,219,102,156, 26, 76,102, 49,133, 69, 26,167, 96, 64, 8, 66,
+227, 24,245, 45, 41,216,179,184,196, 99,143, 63,198, 35,119,220,193,184, 50,228,254,156, 82,210,157,213,210, 63, 76,234,182, 27,
+ 26,183,135, 82, 33,172,230,135,254,223,111, 17,137, 12, 33, 2,103,214,159,143, 16, 74, 81,244,214, 89, 56,126,130,251,255,236,
+247,233,200, 13,190,254,123,127,196,245, 47, 62,193,167,191, 50,224,133, 63,254, 90, 58,219, 15, 18,180, 34,110,121,247, 95,240,
+169, 31,254, 30,102, 14,236, 99,255,169,203,176,197,152,115,247, 62,140,221, 56,195,185, 39,214,120, 36,131,211,253,140,131, 51,
+ 9,159,191,243, 33,110, 57,117,156,205, 81, 74, 51,138, 89, 88, 90, 34, 43, 12,157,134,224,200,165,167,104,116,219,156,120,225,
+243, 29,137,160, 24,131, 12, 80,210,105, 91,109, 85, 97,242, 9,214, 90,202, 73,138,138, 99,148,140,177, 86,184,189, 83,224,110,
+164, 32,110,160,226, 6,227,181,243, 44, 28, 63, 73,186,190,238, 37, 65, 22, 21, 37,156,127,224, 62, 26,115, 29,102, 14, 28,166,
+119,230, 9,242,126,159, 61,207, 57,201,246,153,179, 4, 73,204,112,109,147, 99,215, 95,205,234,163,103,232,206,118,201,198, 25,
+141,110, 7, 83, 26, 71,162, 51,150,102,187, 67,163, 25, 80,104, 75, 51, 50,204,118, 22,233,206, 47,177,119,105,158, 70,212,101,
+ 97, 97,145,202, 86, 8,173,217,191,255, 8, 75,123, 86,184,247,209,111,250,169,212,210,109,118,185,238,242, 27, 9, 27, 32,164,
+ 38, 76,186,204, 46,204, 98,181,128,200, 25,110,116, 22, 23, 8, 84, 76, 16, 75, 90,115, 75, 24, 12,157,165, 57,132, 13, 9, 26,
+109,254,247,251,222,193, 93, 95,252, 12, 69, 77, 74, 83, 14,182, 51,128,138,218, 92,119,233, 73, 26,213,128,229, 19,151,243,228,
+167,255,134,197, 99, 23,113,102, 48,228,153, 11,103,119,100,104,190, 0,123, 98,120, 13, 82, 19, 89, 39, 93,107, 88,193,130, 84,
+ 44, 40, 69, 91, 5, 36, 72,130,169,188, 73,120, 98, 85,125, 80, 72, 31, 4,226,160,204,186,200,107,111, 71, 90, 79,192, 53, 57,
+207,213,166, 29,194,218, 46, 79, 20, 31, 50,194,179,166,252,218,163,172,222, 7,215,133,214,201,171,124,106,152,172, 77,227,124,
+135, 47,120,150,209,205, 20,250, 83, 59,159,193,237,136,119,246,225,198,248,120,209, 93, 70, 57,212, 69,107, 58,201,123,231, 53,
+185, 3,221,163,228,180,129,169, 89,248,120, 27,200,122,239,111,141, 99,127,187,123,185,192, 22, 5,186, 40,208,229,191,202, 44,
+223,253,231,252,231,182, 98,151, 71,155,113,223,245,148,145, 46,197,179,152,238,136, 93, 59,115, 47, 37, 68,136, 41, 3, 93,212,
+112,183,221, 97,168, 83,155,198,120,178, 31,181, 81,141, 39, 14, 78,247,234,117,203, 81, 91,254, 42,249,236, 21, 74, 77,198,171,
+181,240, 74, 60, 91,254, 86,127,223,102, 23,217,193,218,103,185,126,213, 95,190,173, 25,151,236,164,200,185,230,206, 76, 63,175,
+245, 13, 65,126,254, 41,186, 87, 60,151,209, 96,224, 78,105,173,153, 76, 82,242,209,136,108, 50,230,226,139, 86,232,238, 95,198,
+244,207, 59,254, 66,205,191,145,210,217,204,234, 12,170, 12,116,134,169, 52,182,210,216, 60,101,184,186, 74,107,105, 17, 97, 10,
+202,209,128,178,180,100,227, 33,161,205,176, 58,163, 42, 43,108,153,163,179, 2, 99, 5, 85, 81, 34,195, 16, 43, 4,249,112, 68,
+ 54, 74,209, 6, 70,189, 17,107,231,182, 57,243,204,128, 65, 89,209,235, 21, 60,120,174,207,211,235, 67, 30, 89, 27,113,102, 84,
+241,205, 11, 35,198,165,102,117,123, 66,145,151,156, 89, 31,179, 61, 44, 24, 79, 74,214, 55,199,108,246, 38, 84, 69, 65,145,151,
+200, 64, 81, 20, 37, 32,169,180, 96,156,166,206, 57, 10, 16,121, 70,104,156,221,105, 44, 29, 25, 44, 8, 3, 26,157, 22, 65,171,
+ 67, 48,211,198, 38, 93,198, 97,192, 96, 48, 64,102, 35,180, 10,136,162, 8,225, 61, 75,130,184,225,144,149,110,151, 39,239,252,
+ 54, 51,141, 6, 97, 40,232,175, 14,152,185,234, 40, 66, 73, 84, 16, 57,102,185,220,145, 71,214, 4,216, 29,206,197,180,133,223,
+185,159,141,247, 30,112,113,140,174,129,211,238,153, 82, 79, 62,136,106,205, 32,226,216,239,212,193, 84,134,230,145, 75,177,121,
+ 78,154,110, 56,254, 76,125,239, 24,235,164,130,149,198, 26,131, 82, 49, 97,220, 32,108,117, 93, 20,112,105,185,235,138, 91, 56,
+249,186,215,241, 59, 95,251, 75, 39, 97,171,117,230, 53, 26,101, 65, 91,215,112, 84,218,144,229, 21,147, 66,163,117, 61,201, 51,
+101,172, 72, 95, 72, 3, 1, 97, 80, 35,117, 76, 11,127,162, 4,173,166,164,213,132, 40,118,177,220, 88, 8,189,191,187,173, 32,
+203, 44,233,200,144,142, 12,194, 8,178,137,128, 74,130, 17, 40,227,178, 34,186, 74,210, 10, 36,183,222,122, 43, 50,137, 81, 65,
+192, 40, 77, 41,170,202,103,187,187,243, 52, 16,238,188, 86, 47,189,185,125,187, 48,134, 87,190,229, 31,153,157, 95,112, 29, 62,
+194,101,146, 11,133, 41, 38, 4,141, 38,195, 45,195,242,201, 69, 76, 60,203,224,203, 95, 36,220,187,192,139,126,252,245, 60,246,
+199,239, 36, 90, 57, 64,107,101,133, 71,222,246,195,156,248,233,183,178,250, 87,239,103,245,155,247,178,117,118,155,243,207,140,
+ 57,122, 52,102,107, 96,120,106, 44, 56,151,150,204,198, 1, 15,246, 83,204,214, 58, 7,143,173,160,117,136, 38, 67, 9,193,202,
+209,253,220,125,231, 3,188,226, 13,175, 66, 53,218,128, 33,236, 44, 32, 84, 72, 53,234,123, 88,207, 82,229, 25,101, 62, 65, 42,
+137,214, 21, 50, 74,176,218, 96,242,146,176, 25, 33,163, 6,217,246, 38,213,120, 76, 50,219, 70, 70, 45,119, 72, 91, 77, 62,232,
+ 81,230, 19, 22, 14, 29, 36,234,204,177,245,212,147, 72,165,232,236,217,131,206, 50,138,180, 96,120, 97,157,165,131,123,153, 12,
+ 71, 84,121, 78, 99,166, 67,220,108, 48,220,234, 51,179,103,150, 34,203,105,119, 58, 68,141, 14, 81,123,158,222,153,117,154, 93,
+ 75,119, 97,145,238,220, 60,243,199, 46, 71,143, 54, 88, 58,116, 20, 81,142, 89, 90, 92,224,212, 53,207,227,238,175,125,145,178,
+ 28, 16, 5,146, 32,136,184,233,170, 91,105, 36,146,206, 92,135, 81,175,207,193, 75,142,163,141, 37, 8, 21,147,254,132,125,151,
+156,192,218,130, 32,112, 33, 51,205,197, 69, 16,150, 70,107, 30, 66,203,104,123,149,255,245,174,255,196,216,251,112, 27, 47, 79,
+203,188,169,201,225,195,199,232,246, 6,252,225,123, 63,198,203, 94,245, 61, 52,230, 98,146, 80,178, 77,204,131, 15,220,141, 10,
+220,158,173,174, 89,202,223,164, 74, 72, 66, 36, 77, 33,105, 9,193,172,144,236, 13, 2,230,164,139, 74, 13,165, 68, 90,185,211,
+ 77, 91,235,119,197, 94, 63, 91,241,172,189,217, 20,250,181, 30,110,157, 14,196, 98,202,145,178,187,217,116,117,113, 48,187, 10,
+ 10,255, 87,110,169,159,186,107,104,221, 21,170,233,110,127,202, 36, 23,211,181,219,180, 65,176, 59,123, 92, 91,239,200,167,198,
+ 42,181,190,218,117,250, 18,225,167,225,122,111, 47,166, 36, 63,233, 11, 86, 93, 56,167,100,239,233,126,223,187,215,213,204,224,
+154, 24,168,205,142, 78,155, 29,216, 81, 74,137,214,214, 79,212,118,250, 89,166,129, 43,211, 24,211, 93,187,233,186,113,120, 22,
+111, 65,185, 98,172,148,231, 45,212,250,125,118,116,233, 59,238, 63,254,146,200, 93, 60, 0,187,219, 42,203, 39,222,213, 64,196,
+ 14,131, 93,248,148,181,233,190, 93,219,157,240, 0,177,235,215, 90, 25,225, 67,159,237,174, 34,204,116,159,111, 92, 67, 35,118,
+125,137,117, 99, 50, 37, 47,214,231,247, 78, 8, 79,109, 52, 48,181,255, 69, 82, 62,246, 77,194,227,215, 50,220,220, 36,105, 54,
+ 25,110,110, 80,228, 57, 75, 51,109, 46,123,201,139,168,122,171,211,176, 25,215, 1, 6,136,168,133, 45, 70, 80,229,216,106,226,
+ 97,228, 10, 83,229,232,116,200,250,227,143,178,112,228, 8, 54, 79,201, 54,215,169,202,140,205,167,215, 8, 85,133, 82, 56,244,
+ 16,156,132, 22,227, 52,243, 85, 69,158,142, 41,243,146, 65,111,194, 36,205, 89, 95,237,113,110, 51,229,220, 32,231,194, 48,231,
+174,115, 67, 54,210,146,213, 73,197,189,253,130,103, 38, 37,131, 18,182, 74,195,106,102,120,178, 95,176,154, 86, 12, 11,205, 83,
+195,130, 97,238,146,189, 54, 70, 37,141, 64, 50,153, 20, 36,145,194, 10,201,184, 63, 2, 93,145,230, 37,219,163, 28, 91,104, 34,
+ 99,221, 62, 93, 41, 34, 43, 73,162,144,168,221, 34,108, 52,144,205, 54,133, 74,216,170, 10,218, 71, 79,177,246,237,127, 33, 74,
+154,232, 74,211,153,105, 58,167, 64,165, 80, 42,164,189,184,151,187,255,233, 75,236,157,109,210,203, 74, 68,168, 48,167, 7, 52,
+174, 63,234, 84, 83, 42,152, 62, 31, 86,136,233,176,224, 8,154,169,132, 28, 0, 0, 32, 0, 73, 68, 65, 84,203,114,103,149, 38,
+118,206, 9,180,147, 26,218,186,168, 27,143, 16,101, 25,242,244, 35,168,206,140, 83, 55, 9,225, 92, 67,141,160,117,244, 82,244,
+104, 72, 90,246,145, 74,237,202,113, 48,110, 24,173, 42,103,172, 21,183,136, 90, 45,130, 56, 66, 69, 93,190,114,197,181,236, 59,
+122,144,211, 75, 9,159,121,228, 46,114,237, 13,177,148, 11,114,113,230,131, 98,154, 74,236,238, 81, 73, 24, 70,100, 89,181, 43,
+105, 80, 76,213, 23,113, 20,208,233, 38,142,119,130, 69, 41,247,208,132, 18, 58,137,100,177,163,104,249,130, 30, 4,214, 33,102,
+ 62,243,162,172, 28,161,111, 60,180, 20,153,132, 66,184, 12,117,237, 24,239,210, 10, 66, 41,233, 68, 17,157, 70,204,125,247,223,
+199,104,156,178,188,180,200,181, 55,222,196, 21, 87, 95,193,125,247,221,139, 12,156, 22, 94, 10, 73,172, 4, 50, 48,240,162,215,
+253, 17,203,251,143, 97,138, 49, 53,136, 40, 60,129, 71,168, 24, 93,106,226, 86,196,214, 5, 69,243,154,155,185,248,123,175,231,
+220,183, 31, 35,185,245,117,180,226,130,206, 53, 55,210,125,254, 15,209, 73, 42,246,188,240,229,220,240,231,159, 96,223,201, 46,
+151,254,219, 23,243,188,231,207,112,224,187,111, 98,238,208, 60,139, 73,192,188, 48, 76,252,129,113,102,123,140,209,134, 81,182,
+141, 52,146, 60, 79,217, 92,239,115,252,248, 1,146,238, 28, 66, 69, 8, 25,160,171, 2,132,165,202, 75,116, 58, 64, 23,169,107,
+ 62, 12,148,227,161,131,200,170, 28, 99, 53, 50,114,135,226,224,233, 51,180,150, 87,136,103,186,132, 51,203,140,206,157, 69, 79,
+134, 20,233,144,238,129,195,116,246, 30, 68,107,201,240,194, 5, 58, 75,203,140,183, 6, 32, 20,218,184,116,158,165, 35,135,144,
+ 81,194,176, 55,102,118,239, 30,154,115,243,164,195,138,206,236, 44,197, 80, 51,187, 52,135, 8, 21,107,231,207,144,141, 55, 56,
+120,242, 4,113,208, 64,197, 22,173, 20,197,214, 42,179,251,247,179,176,114, 49, 38, 31, 18, 5,154,193,198, 83,156, 56,190,194,
+165, 7, 14,115,253,241, 75, 56,181,255, 0,251, 22, 22,105,116, 2,132, 85,172, 28,186,152,116,216,167, 51,191, 68,158, 78, 88,
+ 60,112,144,246,210, 28,166, 84, 68,173,136,112,102, 30, 25, 42, 58, 11,203, 88,233, 18,131,200,115, 7, 23, 97,153,120,211,160,
+220, 39,129, 69, 81,192, 45,167,174,165, 26,110,240, 11,191,241,118,130,185, 46,171,159,255, 52, 34, 73, 88, 91,127, 6, 17, 56,
+163,178,192, 79,232,177,179,111, 38,176,146, 72, 72,186, 74, 48, 39, 4,139, 74,178, 23,201,156, 80, 36, 82,144, 72,137,170, 33,
+ 89, 95, 56,167,149,153, 93,147,216, 84,241,100,255,111, 6,250,174,179,223, 65,129,150,103, 69, 45,152, 29,178,215, 20,179,221,
+ 93, 28,234, 61,251,174, 49,190,118,144,219,165,178,218, 41, 98,245, 20, 88,239,244,252,110,177, 78,121,171, 33, 62,247,179,214,
+179,249,107, 56,218,127, 38,229, 57,182, 74,236, 10,129, 17,117, 76,146,219,164, 5, 62, 17,206, 10,223, 32,236,104,197,181,103,
+220, 27,237, 72, 56,214, 79,215, 22,175,229, 22,194,169, 35, 37, 24,140, 79, 27,243,134,243, 53,140,237,119,164,181,139,157,245,
+221,141, 84, 62, 44,165,206, 50,159,202, 15,236,174,204,115,235,141, 91,172,223,147,179,195, 68,183,222,205,110, 10,129,251,207,
+110,156,209,139,172, 27, 16,111,222, 93, 75,230,116,169,119,190, 67,191, 83, 23, 22, 31, 53,229,161,242,210,165,216,200,192, 47,
+254,234,247, 84,195,180, 66, 98, 43,127,205,181,222,213,149,153, 29,145,175,223,203,187,247,227,154, 36,180,223,197, 91,231, 37,
+111,189,219,152,245, 73, 99,234,243,255,131,229,197, 5,170,178, 68, 10,193,133,181, 77, 14, 93,180,226, 77,126, 42,170,237, 53,
+202,254, 26,229,230, 42,214, 84,216, 50,197,150,153,147,127, 88,192,148,232, 34, 69,103, 61,198,171, 79, 49, 94, 91, 71,216,138,
+ 50, 29, 81,101,125,198, 27, 91,244, 55,122,152,170,112,172,121,173,169,138, 18,141, 70,231, 21, 84, 57,249, 36,163,204, 42,178,
+202,146,142, 11, 46,172,246, 56,187,145,178,214,207,176,194,242,149,243, 35,206, 23,154, 71,211,138,243,185,101, 37,137,249,174,
+189,123, 57, 53,211,225,134,197, 5,174,152,155, 97,100,224, 92,105,184, 63,173, 56,155, 91,190, 53, 40,249,226, 90,206, 83,227,
+138, 47, 61, 61,164, 63,202, 25, 14, 82,138,116, 68,179,233,140,186, 2, 36,137,132, 65,101,200,180,161, 48,150,172,172, 92, 1,
+173, 85, 28, 82, 34, 21,100,227,140, 82, 24,148, 45,177,203, 39,153, 12,183, 24,143,134,244,251, 67,116,230,108, 86, 69, 96,136,
+ 67, 56,126,203,181,172,110,246, 17, 8,148,146, 60,243,196,147,152,123,207,145,230, 99,138,241,136, 98, 50,161,202, 38,152,162,
+ 64,151,165, 91, 91, 84, 37,214, 84, 24,227,166,104,170,202,125,183, 85,181,179,118,161,118,124, 52,160, 66,236, 51, 79,184, 70,
+ 75, 56, 25,103,253,221,139, 48,116, 35,174, 53,238, 59,211,213,212, 22,220, 84, 21,182, 40,166,247,132, 10, 3, 84, 16, 18, 36,
+115,156,127,211,155,217,234,111,209,110,207,241,158, 59, 63,138,149,126,133, 35, 93, 1, 13,172, 59,215, 90,145, 66, 41,233,181,
+225,130,133,133, 37,246,238, 89, 33, 14, 67,103,168,132,112, 83,185,245, 86,187,157, 22,237,168, 69, 86, 57, 98,167,182, 2, 97,
+ 37,205, 56,164, 21, 73, 26,129, 32, 82, 78, 30,167,252,128, 64, 33,176,149,196, 26,193,112, 32,152,100,130,178,112, 43,187,192,
+ 72, 90, 10, 98, 4, 1, 46, 91,163,219, 76,136,162,152,229,253, 7, 56,122,209, 49,150,247,238,103,107,179,199, 61,223,188, 7,
+101, 5,232,218, 4,204, 98,133, 32,248,183,111,252, 11, 14, 92,116,163,227, 8, 71, 93,215, 58,120,137, 77,141, 97,170, 40,225,
+252,227,143, 34,163, 14, 95,249,229,119,112,195,109, 71, 72, 90, 25, 73,178,198, 63,253,253,131,252,232,237, 87,179,241,209,183,
+147, 92,123, 35, 52,247,112,215,111,191,141, 19,175,126, 7,233,249, 71, 9,247,104,170,198,113, 50, 30,100, 38,236, 33,165,228,
+225,173,148,163,173,136,254,112,196,250,154, 51,111, 57,123,126,149, 35, 7,247,242,213, 59,239,227, 63,191,251, 29, 24, 25, 33,
+116,133, 10,155, 84,222, 29, 43, 72, 26, 20,195, 62, 50, 40,145, 81, 19, 19, 40,162, 96,150,170,114,240,182,201,221, 94,175, 74,
+199,204, 30, 57, 76,145, 14, 17, 82, 81,172,175, 34,164, 98,178,189,201,242, 21, 87, 50, 58,127, 30, 21, 72,178,193,144,184,213,
+102,227,177, 39,233, 44,206,162,243,140, 32, 78, 16,113,196,246,249, 53,198,189, 13,142, 94,119, 45,235,143, 63,193,120, 48, 32,
+110, 5, 84,185,197, 72,227,180,247,195,156, 75,175,190,140, 50, 55,228,153,165,181,184, 72,190,118, 63,182, 41, 33,154,167,204,
+ 50,198,155, 79,112,228,212, 53,228, 89, 73,210,158,103, 50,234,177,176,180, 68,179, 59,199,201,197, 61,232,170, 96,239,209,171,
+ 25,108, 12,152, 89, 92,228,233, 39, 31,193, 84,112,240,178, 43,104,204,118, 80, 42, 98,238,240, 10,217,120,194,204,226, 60, 97,
+224,204, 65,164,117,246,106,186,116,251,182,202, 63, 19,133, 47,232, 26, 69, 20,183,184,232,232, 33,190,244,197,175,112,245, 13,
+115,100, 15,125,131,203,223,250,219,160, 20,131,173,191,114,204, 85,107,161,112,222,219, 66, 10, 66, 43,104, 37, 1, 11,243,243,
+136,209,136, 86, 86, 50, 35, 4,221, 72,209, 14, 4,137,144, 46,227,156,218, 93,204, 78,235, 71, 61,113,213, 93,248,179,228,107,
+245,115,107,205,206,207,212,123,219,186,120,138, 29, 45, 91,189, 41,181,214, 78, 37, 98, 53,116, 44,107,239, 90,249,236,132,181,
+169,183,188,223,231,154, 26,206,171, 11,243, 20,145, 16,211, 2,137, 39, 11, 90,179, 19,249, 34,165,147,147,201, 93, 82,185,250,
+173, 73, 47,221,115, 69,174,142, 37,101, 26, 24, 83, 19,234,172,216, 21,100, 82,239,171, 13,126, 31,110,167, 5, 83,248, 15, 38,
+119, 89,174,154,250,215, 93,205, 76,173,183,159,174, 39, 60,147,220,122, 19, 31, 93, 89,103, 71, 43,189, 44,173,254, 46, 48,211,
+235, 99,173,143, 61,149,174,113, 53, 83, 68,221, 71,172, 42, 57,221, 47,214, 25, 1, 72, 7,239,153, 74, 79, 53,234,118,218, 52,
+ 89, 15, 55, 90,207, 20,175, 3,180,204,191,106,198,172,247,146,247,112,185,117,210, 56,231, 39, 47,156, 94,223, 95, 79,247,193,
+141, 87, 17,236,110, 48,216,249,194,216,209,247,214, 77,137,177,181,215,134,207,104,215,110,223,206, 87, 63,198,226,209,203,104,
+ 92,124,156, 35,203, 77, 86, 78, 94,204,248,161,111, 80, 13, 86, 49, 18,200, 50,144,154, 36,155, 16, 31, 60, 49, 85, 43,160, 34,
+ 96,130, 41, 82,244, 56, 35, 29,244,153, 12, 39,152,116,132, 46, 38, 20, 85,200,104,235, 60,162, 50,228,233,152,102,123, 6, 99,
+ 4, 69,161, 29, 12, 95,148, 76,134, 19, 44,146, 73, 1, 89,110, 25,140, 51, 10, 3,227, 76,179, 85, 26, 62,242,120,143,110,224,
+ 2,143,154, 50, 32, 84,130, 84, 74,238,232,245,168,202,138,197, 73,198,177, 56,225,165,139, 11,168, 32, 96,179,204,120,172,159,
+114, 94,231, 68, 74,176,150, 27, 2, 9,247,108, 78,184, 82, 73, 90,147,146, 78,199,208, 76, 98, 42, 11, 81, 28, 16,181, 18,242,
+ 52, 39, 43, 13,137,247, 34,177,194, 17, 39,141,245,105,141, 24,204,255, 33,235,205,163, 45,189,234, 58,239,207,222,207,120,230,
+225,206,247, 86,221, 91, 73, 77,169,164, 82,153, 99, 2, 9, 36,160,128, 50,168, 56,161, 66,139,104,183,118, 59,188, 78,221,175,
+195,171,104,175,229,194, 94, 54, 78,171,181,105,193,110, 20,151, 12, 34, 40, 74, 16,136, 96, 32,129,204, 33,115,170, 42, 53, 87,
+221,249,222,115,207,248,204,123,191,127,236,231, 12,101,255, 81,171, 32, 44,110,238, 61,231,220,103,239,223,247,247,253,126,190,
+ 74,145, 38, 33,151, 58, 9,242,210, 6,135, 14,185,236,236, 73,156, 74, 9, 18, 11, 25,249, 72, 75,113,251, 91,223,204, 31,127,
+245, 49,110, 45,149,232, 42, 69,193,115, 56,253,137, 7, 57,114,237,187,136,104,231,239, 99,254,123,155, 35, 99,135, 23,101,172,
+ 28, 94, 32,243,232,205,200,236,166, 71,127,107,173,208,182, 11,167, 94,134,122,221,196,151,173, 73,178,161, 52, 69, 51, 42, 29,
+ 93, 56, 65,153, 21, 85,154, 25,102, 61, 2,203,117,144, 72,220,250, 28, 91,127,249, 17, 30,252,200,255,225,218, 99, 71, 88,155,
+ 47,211,123, 53, 26, 61, 62,124, 75,224,216,146,138,107, 96, 51,122, 88,120,164, 53,177, 16, 70,245,232,236, 98, 97, 0, 51,227,
+150, 66,243,253,196, 73, 74, 28,133,198,189,158,171,147,101,223,197,119, 4, 5, 55, 53,101, 46, 22,216, 66,147,196, 32, 51,129,
+ 74, 33,214,138, 48,132, 56,209,132,145, 1,191,233, 84, 80, 4, 44,164,145,232,209, 72, 45, 8,227,148,126, 24,241, 67,223,243,
+189,172,173,175,243,216, 51,207,178,186,182, 74,148,166, 88,249,179, 76,229,175,115,170, 21,246,190,195,119, 27,214,115, 94, 49,
+ 99,170, 10, 83, 44,219, 39, 25,180,145,133, 18,253, 43, 87, 40,150, 43,232, 36, 98,254,230, 55,240,204,195, 95,167,178,176, 4,
+178, 75, 81,131,163,187,156,251,210, 99,220,241,193, 63, 4,107, 0,131, 29, 68,103,157,221, 83,151, 56,127,174, 75,249,249, 7,
+ 57,114,243, 53, 92, 63, 27,112,233,147, 61, 58,169,133,239, 75,138,184,148,125, 88,107, 39, 44,213,235,108,109,247,248,246, 55,
+220,141, 44, 21,232,183,214, 41, 79, 47, 17,108, 92, 64, 43,141, 91, 46,229, 89, 63,207,200,124,105, 10, 74,144,166, 61, 44,183,
+132,214, 22,144, 96,251, 69,208,144, 6, 1,105, 48,128, 76, 97, 21, 76, 51, 91,101,126,158,141, 23, 94,193,182, 20,133,169, 41,
+138,141,105,122,155,155,148,155, 53,220,114, 21,165, 52, 73,208, 35, 25, 4,128, 96,106,126,129,221, 11,231,137,163,152, 65,107,
+135,233,229, 5,250,173, 54,126,177, 68, 18, 11,132,206,144, 5,159,160,211,165,187,183,135,214, 1, 75,199,110,161,219, 82,116,
+119,206,163,173, 26, 59, 59, 91,212,231, 86, 40, 87, 75, 8, 75, 50,127,253, 45,204,107, 73,123,115,147, 82,173, 65,191,183,199,
+250,217, 87, 57,250,218, 55,209,217, 94,229,174,239,127, 23,142,111,147,236,117,232,246, 6, 12,118,183,152, 94, 89,166, 88,113,
+ 40, 20, 61, 84,166, 13,124,194, 53, 31, 98, 33, 76, 46,114,184,239, 9, 50, 51, 81, 42,157,241,223,255,235,135,120,225, 67,191,
+207,218,171, 87,184,241,194,243,212,190,235, 71,200,226, 30,150,244, 57,245,226,211,163,200,152, 51,236, 18,215,218, 52,176,105,
+ 65,210, 25, 80, 10, 18,234,150,160, 42, 44, 74,194, 72,119,182, 16, 6, 39, 60,169,144, 14, 87,169,234,234,230, 78, 49, 58, 25,
+ 76, 4,106, 24,133, 26, 26,139,133,209,162,198, 36,182,171,236,241,227,137, 95,231,187,222, 9,191,220, 88,214, 30,197,176,184,
+234, 50, 97,228,230, 92,154, 31, 30,190,218, 56, 93,135,206,122,115,192,229,213,163,114, 88, 80,147,155,193, 36, 99, 16, 78,166,
+ 71,195,172, 26,181,151,233,209,107, 54,148,182, 13,151,122,210,192, 55,121,167, 25,201, 5,249,160, 58, 84, 27,204,197, 70, 98,
+228,244, 97, 59,218, 48,158, 51,148,232,117,126, 1, 26,202,247,227,135, 75, 94, 99, 58,228,211,232,225,247, 54,129,126, 69,140,
+100, 70,114, 52,165, 74,149,145, 51,135,253,233, 50,143, 19, 40,243,150, 73,203, 71, 91, 22,164,161,185, 28,137, 92,189,203,149,
+138,209,123, 40, 13,104, 67,101,198,241, 59,202,242,231,147,245, 36, 4, 71,165,217, 40, 42, 56,169,230, 76,220, 82, 70,142,233,
+ 73, 51, 36,121, 23,187, 49, 99,142,211, 10,163,157,186,158, 80, 27, 68,174,216, 76,188, 1,233,153,231,241, 94,125,129, 3,239,
+124, 23, 74, 70, 68,187,219,172, 63,246,117,138, 75, 11,148, 26, 62,131,237, 54, 73, 16,226, 76, 45, 34, 11,197,220, 12,224,161,
+ 11, 51,100,187,187, 36,131, 46, 73,183,203,244,210, 2,105, 28, 16,245, 35,122,123, 93,130,126,196,102, 43,162, 94,151,244,219,
+ 3,210, 84, 16,199, 41, 66, 42,194, 78, 76,123,187, 79, 34, 37, 65, 0,171,155, 61, 94,184,210,229,114,144,242,173,221,144,189,
+ 20,246, 87,125, 22, 27,117,234, 37,143,106,169, 64,193,181,113, 93,155,162,239,160, 51, 77,156,165,236,244, 67, 46,182,123, 68,
+ 91, 93, 86,108,155,239, 90, 88,100, 59,137,120,104, 99, 3,157,147, 44, 3, 5, 27,221,148,185,178,131,234, 71, 20, 10, 14,142,
+ 20,216,104,202, 69,159,237, 94, 64, 69, 75,148,210, 68,217,176, 44, 75,163,165,133,176,109,186,187, 61,116,165,142,176,125,102,
+166,170,124,226,193, 53,166, 27, 53, 10,117, 69, 81, 72,170,137, 66, 74, 23,183, 92,199, 22, 9,223,254,125,111,226, 27,127,255,
+ 32, 11,213, 2,139,215, 44,115,230,149, 51,244, 62,254, 24,233,191,187, 27,217,235,153,115, 68, 74,236,171,122,203, 65,122, 2,
+249,111,219,125,115,147,173,206, 87,163, 58, 77, 65,132,232,126, 23, 81,111, 26,245, 47,206,192, 49,132, 70,187,214, 64,245,187,
+224, 58,208, 78, 76,213, 41,114,132, 13, 86,153,198,182, 61,132,130,226,242, 50, 23, 63,248, 1,190,249, 27,127, 72, 54, 85,230,
+214, 91,238,226, 61, 39, 63, 78, 39, 76,200, 50,141, 99,131,101, 73,106,158, 69,201,178,113,165, 32, 22,166,169,207,182, 28,220,
+ 68,163,226, 62, 83,149, 6, 54,154,118,183, 71,146,105, 98,165, 81,169,185,136,244,250,129,113,168,231, 34,148, 84,154, 88, 37,
+166, 12, 75,152,202,112, 41,161, 82,172,210,235,133,249, 74, 38, 35, 77, 37, 97,148,209,235, 67,156, 8,102,202,101,226, 65, 66,
+ 18, 37,160, 53,177, 18,230,210,137,166, 27,135,164, 74,241, 63, 63,250, 23, 52,234, 83,236,223,183,196, 93,119,222, 78,140,230,
+ 19,159,253,140,105,216,204,221,244,104,114,147, 93,150,128, 93, 32,237,108, 98, 21, 74, 72,203, 37, 13, 3,236,114,141,164,211,
+161,187,125,133,198,210, 2,189, 43, 29,166,175, 63,129, 95,242,233,188,248, 25,104,239, 80,105, 8, 90, 79, 61,197,244,190, 38,
+ 76, 29,131, 23,254,142,153, 91,111,226,153,143,254, 5,213,197, 3,156,168,183,120,238,233, 43, 20,122,139, 52, 78,220,137,165,
+ 46, 16,105,141,210,146,141, 48, 99,163,157, 50,211,240,233,165, 41,150,208,156,120,237,173,244, 90, 45,202, 83, 51, 36,131,129,
+201,234, 23, 74, 72,233, 19,110,175, 81,152,219,143,138, 18, 52, 22,105,216,198,173,214, 81,169, 66,165, 49, 78,209, 80,131,210,
+ 48,196,178,109,116,166, 41, 52,166,209,105,132,219,152,102,245,201,167,176, 93, 69,161, 49,139,101, 91,100,113, 72,150, 68,120,
+149, 34,253,214, 30,105,212,167,177,188, 66,210, 11,137,195, 0, 28,155, 66,177,132, 16, 1,115, 43, 43, 92,122,229, 12, 65,175,
+ 79,146, 68,180,183, 2, 28,171, 79,127,111, 11,215, 45, 48, 59, 63, 67,154, 54,233,236,172, 51, 24, 64,117,110,133,242,212, 2,
+133, 66,137,213,211, 79, 81,154, 94,164, 88,157,167, 49,187,132, 87,111,112,236,219,191,139, 52,142,200,162,132, 65,123,151,222,
+246, 14,181,153, 5,202, 83,101,250,107,155,172,157,190,200,220,177,107,168,212,235,148,166,106, 8,157,145,102, 10,219,118,137,
+ 6, 29, 74,110,133, 88, 64,183,189, 67,146, 83,223,162, 12, 44,199, 34,201, 50,126,239,125,255,153,167,255,219,251, 81, 94,133,
+ 21,209,103,234,246, 59, 16,210,198, 82,235, 60,241,216, 21,132,101,110,210, 89,106, 36, 40, 91,152,105,209,206,192,138, 51, 68,
+ 18, 80, 22,146,146,101,254,248,128,173, 13, 89, 78,163, 13, 61, 65,169, 49, 65, 74, 77, 28,100, 67,136, 60, 54, 94,125, 25, 84,
+ 70,188,119, 33, 63,216,245,104,199,107, 36,228,124, 23,127, 21, 63,118,130, 67, 51, 68,148, 42, 51,211,203,145, 25, 45,159,124,
+149, 30, 41,181,195, 97,143,137,189, 43,121, 17,141,214,102,223,165,244,196,238,117,130,128, 37,135, 46,238, 76,231,197,110, 35,
+151,218,196,154,127,130,152, 38,198, 18,188,200,229,248,161, 44,174,153,104, 64,155,160,174,105, 61,194,219, 24, 51,225, 68, 52,
+ 76, 79,168, 28,122, 66,113, 24,250, 11, 70,164,186, 28, 50, 55, 84, 71,134, 7,250,200,213, 46, 38,238, 5, 19, 85,179, 82, 72,
+195, 15,200,115,226,210,146, 19, 77,109,122, 28,213, 67,129,146,104,219,206, 47, 12,217,196, 46, 91,143, 92,249,194, 50,211,222,
+ 72, 14,159, 48,189,201,252, 53,209,122,226,226,164, 39, 46, 93, 90, 33,176, 70,200, 88,178, 92, 41, 24,195, 11, 70,153,241,145,
+ 36, 59, 68, 18,234,241,223, 82, 76, 92,178,212, 4,169,110,130,132, 39,164,141,206, 50, 22,223,251, 35,236, 62,250, 44,141,202,
+ 9, 54, 95,120,134, 83,207,236,113,230, 75, 87,216,104, 39,188,243,254,121,230,111,180,144,207,126,141,202,161,155,145,149, 42,
+ 90,122,166, 8,198,109,208,239, 94, 36, 76, 37,211,251,230, 72,194,140, 32, 52, 19,238,160, 51,160,181,219,229,197, 65,159,219,
+239, 90, 32,234, 71, 36, 10,226, 32, 37, 73, 21,137,109,211,221,139,232,116, 19, 94,221,234,115,166, 27,115,166, 27, 83,240, 92,
+238, 60, 50,207, 76,173, 74,173,232,211,172,215, 40,149, 74,212, 42,198,183, 99, 57,198, 7, 17, 70, 33,105, 26,209,235,247,216,
+109,237,113,105,109,151,167, 46,108,176,140,228, 7, 14, 92,203,195,107, 87, 8, 8,105, 69, 25,115,197,140,118, 98,211,143, 67,
+210, 52, 99,170, 94, 50,114,175,214, 68, 66, 18, 42, 77, 24,103, 72,223,193, 74,205,155, 33,180, 70,184, 30, 23,174,188,202,204,
+ 98, 3,219,115,217,217,220,224,231,127,233,167,249,243, 63,250, 16, 63,120,223, 77,172,118, 58,248,243, 83,216, 89,132,140, 3,
+180,157,241,109,111,253,118, 62,245, 15,255,194, 84, 28,179,120,226, 58,206, 94, 94,227,229, 83, 47,114,207,131,179,116,223,114,
+132,218, 32, 15, 98, 11, 57,118,222,230,192, 35,109,139, 28,192,146,127, 94,149, 50,239,191, 54, 7,187,182,108, 56,119, 18, 44,
+219,124,222, 51,141,178,243,221,123,166,241, 74, 85,178,221, 29,212,252, 12,233,160,143, 93,208,104,140, 1, 84,197, 25, 58, 78,
+ 96,186, 70,113,121,153,111,189,249,123,216,248,214,203, 76, 93, 51,207, 77,135,143,243,103,189,231, 9,147,212,244,203,231,251,
+115, 35,115, 27,108,178, 37, 36,174, 48,175,151,133,160, 90,144, 20, 60,159,106,109,150,181,244, 18,133,204,165, 21,165,244,226,
+140,212,102,244,123,225, 72,115,225,206,253,150,164,153, 34, 82,130, 72,155,233,190,234,248, 20,203, 77,130,222, 38,105,144, 17,
+ 7,130, 32, 81, 12, 66, 65,191,175,241,109,155,130, 91,160,223,137, 73, 50, 77,162,243, 97, 68, 24,159, 84,152, 25,130,221,181,
+215, 92,203,254,125,251, 88,152,155, 37,137, 66,206, 94,190,156,175,156,134,170,158,185,144, 27, 75,161,229,160,194, 54,118,117,
+218,212,238,165, 9,168,140,116, 16,144,134, 61, 26,139,166,226,211, 42,248, 72,167, 64,187,171, 72,171, 55,179,243,240, 23,240,
+143, 46,243,202,223,126,154,198,161, 69,226,147, 95, 71,150, 23,232,156,251, 23,142,188,237, 77, 60,250, 23,159, 98,249, 61,247,
+113,227,254,253,124,237,179, 39,233,159,127,140, 98,185,192,238,222, 14,221,205,148, 56, 85,188,161, 82,162,213, 14, 72,116,200,
+ 29,183, 28, 67,105, 40,148,107,164, 73, 4,253, 30, 78,209, 80,226, 84,166,176, 11, 21,146,126, 31,203,245, 73, 7, 1, 94,173,
+153,203,130, 10,219,247,205,154, 38, 10,112,252, 18,189,173,117,138, 83, 85, 52, 25,178, 82,165,119,229, 50,182, 99,211, 92,217,
+ 79,208,105,227, 58, 30,231, 31,127,156,198, 82, 3,116, 9, 21,103, 88,150,197,206,165,243,236,156, 89, 99,238,224, 18,245,133,
+253,172,158, 58,137,214,154, 43,167,206, 35, 85,196,204,252, 62,162, 32, 32, 41, 41, 26, 51, 51, 44,223,113, 43,187, 23,119,184,
+124,230, 44, 58,203,176,236, 2,197,114, 17,157,180,232,237, 72,108, 15, 14,222,118, 31, 89, 78,198,218, 58,127,146,238,250, 69,
+252,230, 28, 74, 89, 84,230,167, 89, 62,113, 39,165, 74,149, 36,142, 56,245,240,147, 92,120,254, 57, 86,110, 56, 65, 18,165, 76,
+ 47, 78,209,222,222, 5,160, 58,211, 64,105,141, 99,151,205,112,105, 73, 26,243, 43,230, 63,231,168, 68, 75, 72,254,228,247, 62,
+ 68,114,230, 91,236,217, 14, 79, 61,242, 60,191,245,241, 63, 65,207, 47,147,156,254,103,220,195,111,230,211, 31,255, 13,148, 54,
+152, 88, 68,222, 18,164, 5,142, 6, 79,152, 28,122, 73, 11,106,182,196, 71,226,102,198,100, 35,243,135,164,237,150, 72,163,158,
+153,203,242, 73, 89, 90, 2,149,234, 17,108, 2,161, 17,110, 21,167, 58, 79,214,221, 25,159,111,195,195, 80,142, 11,100,134,146,
+248,228,126, 92,140, 26,144, 24,237,114,133, 30,138,245, 10,153,229,166,175, 97, 20, 70,138,145, 36, 60,202,186, 14,243,215,249,
+ 87,204,178,177,140, 62, 2,202, 24,125,121,228,224, 30,221, 71, 84, 46,197,231, 49, 21,161,135, 82,182,188,218,193, 45, 52, 58,
+205, 15,201, 97,123,221,200,141, 61, 54,248, 9,173,134,202,114, 46,241,235,113,129,133, 96, 44, 55,139,113, 27,218,240,159,105,
+196,196, 20,170,209,105,190,130, 24,114,180, 70, 69, 45, 50,143, 15,229,146, 92,146,215,157,142, 88,248, 98,228, 43, 27, 54,213,
+ 13, 39,122, 35, 59, 26, 21, 3, 1, 58,234,161, 99, 53,234,202,213,249,164,111,126,223,134, 6,181,177, 84, 63, 60,188,181, 34,
+ 39,179,141, 95, 39, 61,241,158,140, 82,105,217,152, 85,128, 52,123, 72, 3,154, 25, 67,124, 70, 7,251,196, 14,126,210,168,167,
+134, 55,191,225, 6,103,152,163,183,229, 68,140, 82, 49,247,131, 63, 67,177,228, 83,252,225,187,233, 60,252, 49,178,126,135,157,
+118,194,233, 78,198, 55, 90, 25,207,127,238, 50, 63,250,106,151,187,223,161, 16,197, 50,238,212, 62,180,116, 72, 6, 3,176, 75,
+164, 74,144, 96, 19,247, 6,216,165, 50, 73,148, 18,132, 10,219,119,217,237,197, 52,171, 37, 6,221,144, 65,144,152,135,121, 40,
+216,222, 28,208,238,197, 60,115,177,207,229, 32,226,100, 39,101, 43,202,184,117,121,134, 27,246,205, 50,219,168,177, 48, 51,203,
+220,210, 34,141,169, 89, 10, 85,115,160, 59,174, 71,154,166, 36, 73, 66,220, 31, 16, 70,125, 6,253, 30, 51, 51,109,154,141, 45,
+ 54,167, 27, 92, 90,221, 97,243,226, 6,247,206, 47,242,200,214, 26, 21, 55, 35, 73, 97,179, 23, 50,229, 25,179, 90,166, 52,174,
+ 99,145,101, 18,105, 11,186, 89, 74, 21,153, 19,206, 64, 91, 18,105,217, 72,203,103, 47,106, 51, 43, 4,210,118,233, 7, 61, 54,
+ 47, 92,224,221, 63,253, 62,254,254, 35,127,197,253,119, 30,101,187,221,103, 81,218, 72, 97, 35,138,130,222,214, 26,191,249, 59,
+191,192,207,252,218, 7,233,126,234,243, 84,139, 5,240, 11,124,225,171, 95,227,157,149, 42,187,247,217, 84, 6,166, 17,112, 24,
+ 37, 27,117, 44, 8,129, 22, 78, 46,196,229,151,123,149,229,229, 69, 26,188, 50,250,217,199, 16,229,138, 41, 54, 26,245, 54, 64,
+166,205, 80, 19,111, 94, 38,142,250,168, 44,193,169, 79,163,211,148, 44, 85, 72, 39,195,153,173,179,251,247,159,227,153, 15,124,
+152, 66,179,206,192,119,184,126,118,129,203,215, 78,243,216,227, 95, 50,145, 71, 33, 70,166, 94,157,235,136,105,170, 40,250, 18,
+ 71, 88,164,194, 72,228, 37,199,166,106,107,156,104,139, 41, 95,227,227, 16, 43, 77,156, 14,239,235, 25,142, 52, 83,186,200,164,
+ 49, 75, 10, 53, 68, 30, 16, 41,141, 11,244,163,136,240,242, 6, 73, 63, 67,133, 6, 46,211,141, 4,189,208, 12, 16, 65,148,112,
+105,107, 23, 21,155,108,125, 38,140,202,130,206,167,245,252, 25,121,229,220, 57,214,207,159, 51,141,139, 82,211,205, 52, 73, 78,
+ 5, 29, 54, 87,106,192,214,241,128,108,176,135, 93, 44,161,146, 1, 42,236, 35,221, 34, 72, 72, 7, 61,210, 48,194,118,205,101,
+185, 52,179, 72,235,210, 57, 44, 15,202,135, 78,208,218, 93,229,190,159,253, 97, 62,254,107, 31,227, 77,247,220,138, 78, 19,236,
+163,247, 83,219,247,207, 60,255,229,167,184,229,125,239,195, 46,245,176,117,200,103,158,111,113,251,225, 38,211,186,195,180,101,
+110, 20,243,243, 13,164,157,210, 10, 67,250,253, 30,119,222,127, 15,221,110, 23, 95,153, 78,111,183, 81, 34, 9, 7,184,165, 10,
+ 58, 73,176,202,101, 6,123,171, 8, 89,198, 45,186, 99,215,114,238,186, 20, 82, 97,151, 43,168, 36, 67,135, 41, 94,173,201,230,
+139, 47, 83,168, 27,134,115,121,126,150,221,243, 23, 41, 47, 52, 9,251, 3, 74,245, 42,110,161, 70, 58, 24,224,150, 37, 97, 27,
+138,165, 34,254,177, 35, 84, 23,103,120,245,241,103,233,111,174,113,240,174,155,232,109,183, 73,147,152,181,111,125,139,149,227,
+135,105,206, 79,211,217,221,225,217,175, 60,200,171, 79,175,226,198, 91, 28,127,235,107,200,130, 34,131,110, 8, 66,224,121, 18,
+183, 60,139, 82, 41,131,141, 43, 68, 73,128,237,250, 44,158,184,139, 56,138, 89,184,238, 6, 44,203,226,226,183,158,198,241, 75,
+ 28,186,235, 14,166, 14, 44,113,236,254,123,144,104,250,237, 14,157,221, 22,245,185, 38, 89,150, 97,123, 30,225,222,158, 1, 96,
+168, 10,153,180,169, 52,167, 41,148,171,164,237, 54,223,254,218,251,120,207, 79,254, 34, 47,125,228,247, 16,126, 13, 90, 17,239,
+255,252,167, 9, 55,159, 71,189,120, 10,237, 20,248,234, 63,125,156,110,175, 67,150, 51,122, 70,174,238, 12, 92, 75, 80, 6,202,
+ 8, 42, 66, 80,194, 28,234,150,144,166,170, 85, 9,252,230, 10,182, 95, 34,220, 57, 79, 22,116, 71,210,244,176,206, 80,107,198,
+ 57,226,168, 69,180,125,154, 44,236,230,230,173, 9,186, 24,227,138,182, 76,233,124,167,207,168, 95,152, 97,165,171, 30,146,153,
+212,232,128, 54,207,117,149,223,208,213,132, 73,100,120, 72,112, 85,179, 24,121,173,162, 16, 18, 50, 70,140,115,173, 53, 89,110,
+ 2,203,134, 66, 94,222, 2,101,217,140, 27,201,180,201,120,139, 92,110,159, 88, 42,143, 91,231,134, 19,177,252, 55, 2, 99,254,
+218,100, 10, 44,103,194,131, 48,148,207,197, 24,137, 58, 50,167,137, 49,144,111,168, 98, 12,249, 56,195,152,152,210,250,106, 94,
+250,208, 40,168,229,168,211, 89,140,202,106,134,101,104, 26,169, 76,188, 72, 41, 51, 45,139,209,190, 58,207,176,231,239,157, 16,
+ 58,135,253, 8, 84,156, 50,146, 57,254,173,108, 62,220,153,142,250,107,245, 40, 13, 49,146,206, 71,123,246,252,224,158,168,218,
+ 53,167,187,152, 32, 0, 50,118,218, 15,123,191,198, 18, 77,190,226,209, 87,193, 11,196,176, 68, 36, 39,220,233, 9,117,196,157,
+191,150,202, 93,175,135, 44, 35, 91,125,133,157,103,158,229,241,135, 55,248,244,133, 14,155,177,102, 79,105, 46, 13,224,177, 71,
+118,249, 47,235, 79,241,195, 63, 91,197,233,244,137,250,109,236,218, 2,221,205,117, 50,219, 99,111,171, 69,213,243,136, 90, 45,
+ 90, 23,175, 16,201, 34, 81, 47, 32, 65, 18,105,193,238,192, 98,119,179, 79,150, 9,206,172,118, 73,210,148,135, 46,118,120,165,
+155,208,116, 28,246,226,140,123,175,157,227,230, 35,251, 88,154,155,103,105,113,153,133,229,125,148, 26, 13,188,106, 21,207, 51,
+ 40, 83,105,217,104,161, 73, 6, 33, 89, 28, 17, 12,122,244,219,109,122,237, 10,182, 95,192,247,125,138,174,195, 86,173,204, 75,
+ 39, 87,185,167, 57,207,191,238, 94, 97,198,183,105, 7, 9,221, 56,165, 28, 90,248,126, 66,165,228, 96,101, 26,207,150,116,251,
+154,204,210, 6,180, 50,230, 53,147,101,154,173,176,199,145, 84,161,165,164,213,237, 81,235, 23,168,164, 9, 63,250,255,252, 60,
+ 31,253,131, 15,242,198,219,175,167, 32, 36, 83,117, 27, 41, 37,118, 65, 82,168, 20,249,197, 31,122, 51,127,244,201, 47,242,122,
+191, 64,140,162,234, 56, 60,240,192, 3,188, 85,190,149,157,215,239,167, 26, 58,230, 96,183,204, 1,175,100,222, 22,168, 53,200,
+156,147,154, 95,230, 76, 84, 57, 67,183, 46, 65,187, 11,197, 10,194,245, 70, 62, 27,149,195,105,132,235, 17,109,111, 34,202,154,
+191,122,219,251, 40,215, 74, 56,229, 34, 5,219,161, 27, 39,244, 90, 29, 60,149,112,221,242, 10,210,245, 56,222,104, 82,184,233,
+122,254,224,185, 79, 97, 33,176,108,105, 46, 16, 82,160, 50, 65,166, 76,225,150,231, 74,108,105, 83,244,108,100,146, 17, 89, 80,
+116, 44,170,158, 71,217, 43, 82, 84,138, 29, 45,105,245, 83, 66, 11, 28, 27,226, 68, 97, 75,129, 47, 53,210,134, 32,213, 57,223,
+ 3, 50,105,120,239, 90, 65, 26, 43,210, 48, 34, 11, 5,189,129,162, 31, 64,144, 64, 26,155, 65,195, 64,106, 82, 92, 41, 13,203,
+ 64,154,222, 2, 71, 26, 21, 32,199, 74,225,153, 64, 11, 97,254, 71, 43,131,250, 54, 9, 90,195,146,183, 16, 88,191,253, 59,191,
+246,219,194,114,140, 99, 52,127,218,233,200, 20,132,216,158,131,237, 58, 72,171,128,229,186,132,187,121,179, 89,169,140,237, 56,
+116,182,186,180,119, 99,238,123,239,189,212,222,252, 43, 4, 15,127, 8,239,200, 27,232,190,252, 16,225,246, 54, 91, 15,126, 5,
+ 93,154, 37, 9, 35,118,207,174,114,101,125,143,247,252,192,173,124,249,185, 45,110,157, 46, 97, 85,170,236,180,251,196,177,226,
+250, 67, 75,172, 28, 92,193, 45, 86, 40, 79, 79,147,244, 91, 56,165, 26,150,229, 96, 21, 10, 56,165, 26, 89, 16,225,150,202, 72,
+203,194, 43, 85, 16,150, 67,150, 4, 8, 36,118,193,199, 46, 84, 9,118,119,240,106, 37, 44,175, 76,220,238, 98, 73,137,202, 50,
+252,106,141, 52, 78,112,203, 30, 2,151,206,234, 42,221,237, 85,202,179, 13,194, 94,136, 78, 51,202,179, 83,232,252,161,184,187,
+182, 70,119,125,135,230,190, 89, 90, 87,182,105,173,175, 82, 46,149,185,253,123,223,134,237, 87,121,229,209,231, 89, 57,182, 2,
+177,195,226,202, 12,197,233,107,185,248,252, 51, 88,133, 2,171,175, 94,164, 49, 87, 37,232, 37,168, 44, 66, 10, 69,177, 57,139,
+235, 85,168, 46, 45, 83,158, 91,100,230,218, 67,132,221, 46, 90,105, 22,174, 63, 70,109,110,150,104, 16,128, 22,236, 92,184,194,
+233, 71, 31, 99,249,248,113,106, 51, 77,180,178,145,182,139,227, 90,120,133, 2,174, 95, 48,102,142,216, 92,207, 14, 31,187,153,
+215, 31, 58,194, 93,111,255, 97, 30,249,245,159, 37,138, 50,250,238, 62,190,227,183,126, 21,101, 39,120,251,111,193,154,154,166,
+181,113,133, 63,251,240,159, 16, 27,144, 20, 89, 30,181,178,181,160, 96, 9,166,132, 96, 74, 74, 42, 88,121, 54,210,198, 21, 50,
+ 47, 9,147,185, 1, 41, 54,249,206,168, 99,118, 96,121,206, 89,101,195, 98,152,241, 67, 67,163,200,162, 62, 74,167,185, 52, 45,
+ 70,251,100, 61,177,111, 21, 98,156, 95,159, 76,181,141, 6, 49,205,213,217,229, 17,244, 77, 92,213, 20, 38, 70, 18,242,120, 42,
+ 24, 70,211,134,110,243,161,155, 78, 11, 61,226,213, 15, 39, 1, 41,100,222, 96, 38, 71,138,239, 85, 44,107, 57,177, 54,144,114,
+ 36,253, 15,139, 95,134, 59,242,209,225, 55,113,190, 15,115,239,195,159,121,116, 74,235,113,204,108, 36, 85,171,137,184,159, 24,
+ 99, 55,135, 40, 90, 70,188,118, 57, 62,192,196,184,198,117,248,255,211, 66,143, 86, 3,106,212,147, 35, 17,210,194, 46, 86, 81,
+ 73, 56,118,210,231,223,159, 30, 81, 97,204,109, 64, 13,247,250, 8,180,206,198,239,153, 20,100, 57, 8, 10, 97,176,154, 99,249,
+155,209,251,141, 54,208, 14,105, 89, 35,167,254, 85,105,134, 73,131,220,200,136,164,242,248, 97,110,122, 27,197,238,245,168,227,
+102, 88,222, 49,132,219,140, 98,111,163,136,160,249,227, 52,103,169,223,114, 7,225,133,151,145, 8,190,250,167,127,205,103, 94,
+110,113, 57,214,108, 37, 38,115,177, 29, 42,222,118,253, 60, 55,190,254, 54,254,246,211, 79,240,191,255,250, 49,102, 85,159,172,
+183,195,250,234, 46,131,141, 77,194, 94, 72, 18,199, 88, 58, 99,175, 27,208,221,222,101,103,163, 71, 63, 81, 12,194,148, 94,183,
+199,149,141,128,179, 91,125,158, 89,235,240,212,122,192,185, 64,209,180, 45, 6,169,192,118, 37,223,115,247,245,172,236,219,199,
+ 53,135, 14,179,124,248, 16,213,153, 57,202, 83,211,184,133, 42,205,185, 25,102,151,103,169, 54, 74, 72,219, 67, 99,225, 20, 10,
+216,158,131,101, 25,168,144, 37,165, 49, 51,162,208,105,140, 93, 45,177,182,213,225,136, 95,226, 82,216,195,181, 37,105,126, 25,
+174,184, 14, 66,153, 67,167, 27,105, 6, 81,194,156, 16,148, 29,155,122,209,199, 47, 23,177,107, 85,148, 87,229,155, 39,159,231,
+134, 91,239, 4,101,115,230,236, 43, 36, 81,159,162,239,227, 21, 60, 94,247,221,223,203, 23, 62,247, 0,213,178, 67,213,113,177,
+135,108,245, 56,225,218, 19,199,104,157,187,192, 11,235, 59,204,187,150,137,195, 74,201,171,167, 78,113, 34,173,211, 95, 40, 34,
+ 10,158,145,251, 39, 46,187, 66,143,213, 23,200,119,252,105,130, 46,213, 80,127,243,127,144,141, 6,194,245,176,139,101,148,237,
+ 34, 29, 7, 97, 91, 40, 45, 40, 46,174,208, 59,253, 10,238,194, 62,174,252,205,103,137, 43, 69,162, 52,163,110, 89, 68,105, 70,
+169,104, 83, 42, 22,232,100,138, 69, 97,227, 31,157,227,211,123, 15,211,139, 82,131,126,213, 57, 61, 78,107,146,252, 51,104, 33,
+169,149,125,106,158, 75,197,181, 71,213,205,190, 45,153, 46, 55,153,153, 93,130, 44, 99, 48, 8,217,139, 19,130,212, 68,231, 68,
+238, 24, 42,122, 46, 40, 69,154,131,155, 44, 71, 96, 91,138, 74,217, 56,235,117, 44, 72, 34, 65, 47,144,180, 3, 77, 16,107,130,
+216,168,118,230, 64, 7,199,113, 40,122, 46, 89,102,204,143,158, 20,248,210, 60,151,133, 4,199,177,177, 48,190,169, 12, 72,101,
+142,160, 21,134, 90, 39, 1, 71, 8, 92, 41,177,222,255, 27,191,248,219, 66, 90,134,174,164,149,137, 16,216,142,217,175,150,154,
+121, 76,199, 66, 88,146,160,211, 38,238,237, 33, 93,143,181,211,175, 50,125, 96,129,126, 63,229,220,183,214,241,218,207,114,242,
+193, 47, 18, 93,126,217, 84, 37,118, 59,220,242,190,247, 98,245, 46,224,215, 10,156,126,113,149,207,158, 15,241,251, 1, 42, 81,
+196,245,230,232,119, 59,140, 34,126,244, 71,223,129, 87,110,224,248, 22, 94,181, 9, 73, 64,101,126, 5,165, 83, 44,199,193, 46,
+ 86, 8,219,187,120,149, 50, 78,161, 48,186,237, 59,126, 1,165, 18,195,124, 23,166, 97,200,169, 77, 19,119, 91,164, 42, 38,108,
+ 13, 40,214,171,248,211,139,156,251,250,195, 52, 87,230,233,237,236,208,223,218,197, 18, 26,183, 88, 68,136,132, 52, 73,168,204,
+206,209,186,180, 74,208,238, 17,118,219, 84,107,117,132, 82,180,214, 54, 57,120,203,245,236,191,237,102,206, 61,243, 18,171,175,
+156,230,248,235,239, 32, 28, 36, 12,250,138, 44,234, 81, 46, 23,184,230,198, 19, 20, 43, 85,102, 22, 86, 72,130, 14, 94,209,194,
+182, 93,252, 82, 19,167, 88,199,118, 37, 65,123,143,120,123,141, 36, 52,173, 72,142,239, 35, 29,139, 98,173,167,112, 97, 8, 0,
+ 0, 32, 0, 73, 68, 65, 84, 65,161, 94, 33,142, 34,150,142, 28, 98,233,134, 99,172,157, 62,141,214, 22,210,146,216,190,100,227,
+236,101, 16,208,111,181,241,202, 37,132,101,118,145,205,133,101, 30,251,192,175, 18,124,243, 1,206, 94,220,227,208,253,239,224,
+216,237, 11,216, 43,199,177,202,243, 36,171,223,196,146, 14,191,254,171,191, 64, 42,242, 67,201, 50,135,158,173, 48, 96, 25, 91,
+ 50,141,164,110, 91, 84,133,160,108,217,184, 58,111,116, 18,134,197, 45,133, 48, 17,146,184, 99, 30,240,154, 17,176, 1,157,147,
+227,198, 96,178,177,139, 93, 79, 78,173,122,116,238, 12,255,202,148,185,221,170,220,220, 38,198, 9,101,115,112,143, 40,174, 98,
+244,176,151, 19, 92,119,131,105, 29,243,229, 39,129, 52,227, 28,253,208, 60, 37, 38,128,113,227,157,245, 48, 95, 43,135,211,229,
+ 4,192, 37, 23,226,141, 75, 61,151, 20,196, 48,119, 63, 52,236,253, 91,231,126,238, 48,214,185,107,125,136,239, 50,107,107, 49,
+193,159, 31,127, 79,195,181,197,196, 45,101,204,144, 23,147,223,141,202, 31,244,250,170, 76,249,176,137,110, 24,249, 27, 87,220,
+230,165, 23,150,121, 29,220,153,163, 88,149, 37,116,184,103,222,207,225,235, 60,188, 36,169, 49,147,123,248,122,146,141,205,134,
+195,206,116,203,146,227, 4,129,190, 58,195,110, 78,222, 28, 34, 50,148, 14,244,152, 40, 55,250,186, 19, 73,135,225,101, 70,228,
+178,236, 24,176,163, 38,112,189, 19, 62, 74, 49,217, 35, 48, 94, 5,136,145, 59, 89, 18,239,109,225, 87,109,118,207,156,167,126,
+195,173,244,158,125,136, 51, 23,219,156, 26, 36,196, 26, 86, 7,138,223,125,215, 61,252,220, 47,254, 4,181,233,121,110,190,251,
+ 53,188,230,190,187,121,228,233,115,124,229,225, 83, 68,237,144,118, 59,164,191, 23,176,111,169,102,202, 88,178,140,238,238,128,
+193,222, 0, 59,131,146,128, 44,206,144, 90,178,177, 51,192, 65,208,142, 51,227,113,145,176, 23,165,188,237,142,107, 56,122,237,
+ 10,251, 87,174,101,113,229, 26,106,179,243, 20,155, 77,188, 74,157,185,253,211,124,238,243,103,248,143,191,247, 34,207,159, 47,
+ 34, 6,125,238,126,221, 10,189, 94,130,109,155, 67, 70, 10,200,210,108, 20,221,203,146,132,120, 16,144, 22,124,218,107,123, 32,
+ 5, 59, 81,200,116,209, 37, 78, 83,202,182, 77, 16,165,163,207, 83, 18, 39,148, 21,212, 29,155,122,177, 64,161, 81, 69,150,203,
+196,118,129, 39,206,191,194,177, 99, 55, 98,251, 37, 94,126,254, 5, 6,131, 14,181, 74, 25,223, 47,160, 84,202,107,223,250,118,
+158,126,252, 41,210,193, 30,115,205, 6, 90,155,202,220,176,219,229,245,111,127, 11,159,254,199,127, 49,180, 73, 91, 82, 16,146,
+ 29,165,121,225,149, 87,184, 46,112,240, 60,143,120,190,136, 37,205, 37, 99, 24,137, 28, 70, 80, 81,166, 22, 91, 23, 74,232, 7,
+ 63,143,104,237,129,239, 99,121, 5,172, 82,133, 76, 72, 44,219, 54,205,156, 8,252,198, 60,189,243,167,112, 15, 30,229,235,127,
+250,231, 20,202, 46,190,208, 12,178, 20,169, 96,177, 92,193,206, 52, 43,169,228,142, 15,255, 15, 62,243,212, 95,146,196,218, 76,
+206,185,123, 51, 82,138, 68,235,145,105,214,177, 36, 85,215,102,218,119,168, 22,124,124,203, 2,101, 98,189,245, 98, 1, 59,139,
+233, 15,250,116,194,132,189, 48, 37,206,212, 8, 82,227, 57, 54,174,237, 16, 70, 9, 41, 26,219, 54,171, 53,199, 23, 20,220, 60,
+138, 20,155, 42,213,118, 79, 27,198, 64,170, 71, 10, 84,152,239, 64,155,229, 18, 69,215, 35, 8, 34, 44,204, 97,238,143, 34,180,
+ 54,182,235,208,207,155, 18,135, 9,153,100, 72,225,205,237, 11, 14, 2, 87, 88, 88,239,255,205, 95,250,237, 44, 26, 96, 21, 74,
+102, 39,150, 4, 6,173, 87,240,137, 59,123,100, 73, 64,212,109, 19,180,118,113, 92,135, 66, 99,154,213,231,190,197,190, 99, 71,
+ 80, 74, 96,219, 80,155,219,207,246, 70,204, 64, 84,177,183, 95,228,236,115,231,232, 81,166, 32, 52, 86,121,138,176, 53,224,145,
+ 39, 46,115,172,104,241,244,118,132, 55, 61,205, 94,167, 71,173,232, 18,102,154,155,143,236,227,198, 59,111,163, 80, 41, 81,158,
+ 89, 64,232,140,202,226, 62,178, 52, 69, 8,133, 83, 40, 99, 57, 30, 58,202,112,170,101,242,132,246,104, 18, 83,113,136,223,156,
+ 53,149,133,221, 61, 86,159,125, 18, 21,133, 88, 50, 99,234,198,155, 81, 97,200,149,103, 95,160, 62,215, 36,232, 4,144, 12,168,
+ 46,204,225, 22,171,212,246,237, 39, 9,193,150, 54, 27,167, 95,102,250,208, 33,118, 46,110,224,184,130, 65,208, 65,219, 54,142,
+237, 50,117,205, 1, 54, 78,158,195,182, 5,243, 7, 15,243,202, 55, 31,199,241,108,108, 87, 83,155,159,193,169,212,233,236, 5,
+132,131, 62, 41, 80,170,206, 16,116, 59,164, 97, 23,171, 80,102,250,218,131,244,215,215,192,177,240,106,211,184,165, 2,213,233,
+ 69,146, 56, 36,234, 7, 88,158, 67,101,106,138,114,189, 74,208,235,112,241, 27,207,113,224,206, 91,104,111,110,225, 20,125,250,
+ 59,187, 84,154, 83,168, 44,163,220,108,144, 69, 9,142,107,161,180,133,101,105,162,141, 11,124,226, 51,223,224,190,183,191,133,
+197,107,160,242,198,159, 64,122, 21,146,206, 11, 88, 86,133, 63,255,227,247,179,186,189, 67, 42, 76,237,170,204,165, 93, 71, 8,
+106, 82, 50, 37, 5, 77,219,166, 44, 5, 37,203,194,149,134, 66,101,137, 97,235,152, 28, 73,236,140, 8,116,114, 60,145, 78, 72,
+234, 67, 23,230,164, 11,126, 2, 36, 55,246,142,141,176,173, 19, 69,103,140,255,203,232,128,158, 96,181,203,225,196,110, 89, 57,
+207, 89,140,158, 19,163,129, 58,159,162,173,188,187,154, 28, 42, 99,184,230, 98,244,192, 31, 30, 46,150, 61, 38,161,141, 90,219,
+ 70,113,182,201,137,126, 2, 40, 35,204,207, 41,175,162,159,137,171,212,129,209, 58, 98, 52, 60,231,187,123,235,106,150,174, 30,
+ 65,235, 39,242,251,114,108,180,211,136, 17,179,131,188, 88,102, 4,120,203, 21,134,177,124, 63,254,250, 66,202,171, 74,102,204,
+206, 29,132, 93,130,164,135, 10,118,199,253,242, 35,236,171, 24, 25,226,132, 37, 71,230, 62,105,203, 9,182,192,132,218,144,199,
+ 5, 5, 99, 0,205, 88,185,144,232, 44,127,120,139, 49, 60,102,136, 3, 21, 67,138,215,100,155,223, 36,142, 23,113,149,201,106,
+120, 97, 48, 49,124, 61,193,146, 23, 87,173,117,134,255,254,225, 71,172,127,242, 21,138, 69, 23, 89,107,208,152, 74,185,240,248,
+ 73,158,107, 69,236, 4, 25,191,244,131,247,242,203,191,251,235, 68,177,198, 47,213,241, 43,117,108,183,200,107,223,120, 47, 55,
+ 28,191,150,226,229,151,184,249,216, 12,199,239, 60,202,129,227,203,148,188,148,154, 29, 83, 47, 73,230,106, 22,149,220, 61,189,
+111,190,194, 92,205,165, 34, 4, 85,105, 26, 13,215,195,148, 48, 51, 27,134,239,188,247, 56,251,151,246, 51,181,176, 64,115,105,
+ 31,165,122, 19,219, 47,177,239,224, 18,223,249, 19, 15,177,112,203,221,252,192,119,220,200,187,126,232, 24,127,241,245, 46,255,
+240,169, 23,120,247,143, 92,207,160, 23,154,181,143,210,100,105, 76,154, 42,146, 56, 34, 73, 82,146, 36, 38, 9, 66,172, 90,157,
+210,110,143,245, 44, 4,165,153,175,120, 20,124, 7, 33, 52,165,130, 79,119, 16,162, 99,133,175,160,233, 88,148, 92, 7,191, 84,
+192, 42, 86,112,106, 13, 30,122,249, 5, 14,236, 95,166,210,156, 97,245,210, 37, 86, 55, 46, 83,112, 44,138,190, 71,161, 84, 34,
+142, 34, 78,220,123, 31,187,177,226,220,179, 79,177,111,118,198,172,129, 92,135,176,211,225,221,239,253, 33, 62,250,153, 47, 81,
+ 68,225, 89,146, 4, 8,133,195, 75,231,206,210, 62,121,145, 67,161,143, 93, 43,145,212,139, 40,161, 16, 89, 78,233,203, 20,110,
+181,142, 44,248,196, 95,251, 26,242,217,231, 16,165, 26, 20, 60,236, 98,209, 0,195, 44,137,116,236, 17, 17,209,241, 75,244, 46,
+156,193,159, 95,225, 11, 31,254, 75, 18, 32,214, 25,237, 32,166, 31, 71, 68,113,194,205, 55,221,200,107, 62,250, 97, 78, 5, 87,
+120,230,209, 47, 19,101, 70, 61,180, 44, 73,148,154, 10,213, 40,205, 35, 99, 66, 82,242, 44,166,138, 30, 11, 37,159,170,227, 80,
+118, 92,124,203,198,150,146,146,109, 33,226,132, 56, 78,217, 14, 98,118,131,136, 40, 85, 72,219, 39,206,160, 31,198, 4,113, 66,
+152, 41,178, 33,250, 90, 8, 28,199, 12, 42, 58,129,116, 32,105, 15, 20,189, 88, 19,132, 57, 31, 35,197,124, 15, 57, 49,210, 76,
+244, 9, 74,101, 70,210, 23, 96, 73, 77,164, 5,177, 82, 36, 42, 35,201, 49,181, 82,152,202,236, 88,129,146, 99, 78,133, 35, 36,
+101,199,194,214, 42,195,242, 43,100, 65, 7,233,186, 88,126,201, 76, 25,202, 76, 36,221,181, 43,148, 26, 83, 88, 69, 15, 97, 57,
+196,253, 30,251,111,189,157,112,111,151,213,211,103, 57,116,247,173,244,183,123,132,231, 47,210,143,225,228,165, 57,110, 62,177,
+204, 35, 15,124,129, 96,163,197,197,213, 14,219, 3,193,169,150,102,126,102,138,165,154,164,219,143,152,170,248,248,174, 77,205,
+119,184,227,238,219,113,107, 21, 10,229, 58,126,125, 10,199,177, 77,245, 30, 25,150,231, 33,165, 75, 18, 15,240,103,102,140, 76,
+ 72,140,229, 21,201,194, 30,110,165,137,229, 87, 8,247,118, 81,153, 98,176,181,205,202,205,183, 27,252,159, 87,226,252, 87,190,
+204,226,137,155,208, 73, 31,167, 84,167, 82,109, 32,132,131,214,154,126,186,203,246,217,115, 8, 33, 89,125,249, 12, 71,239,187,
+157,221, 75,155,172,157,185,192,212,156, 13,194, 37,234,238, 49,184,178,201,161,123,111,161,208,168,162,132, 77,103,175,205,161,
+ 59,238,164,181,182,129, 86, 1,189,110,159,160,183, 75, 99,102,154, 44,117, 80,105, 66, 24,246, 40, 53,151,144,150, 77, 26,245,
+217, 57,245, 18,197, 70,141,222,214, 58,193,206, 6, 73,177, 65,210,218,163,121,195,113, 28,191, 0, 90,241,248, 39,255,142, 82,
+ 99,138, 82,189,202,242,107,110,227,149,175, 61,204,129, 91,111,229,242, 75, 47,115,240,246,155, 9, 58, 3, 42, 83, 77,218, 91,
+ 91, 84,155, 13,227,232,182, 83,116,166, 57,248,227,255, 47,203,127,248, 97,102, 22, 37,205,119,254,127,232, 96,139,157, 71,254,
+ 28,213, 78,248,179, 79,125,142,173,214, 54, 73,238,240,214,218,212,121, 75,192,145,134,114,100, 99, 50,234,174, 16,216,194, 48,
+156,229,100, 85,169, 52, 15,224, 97,236, 74, 78, 72,159,198,245,153,203,203, 19,112,239, 49, 80,110, 28,115,146,195,226, 20, 61,
+161,163,107, 38,204,115,249,180, 47,115,185, 86,101,227,105,108,130,209,110, 21,124,172, 98, 13,111,122,142,242,177,219,177,171,
+ 13,188,185,125, 72,199, 99,112,233, 52,253,147,207, 16,173, 95, 34,219,221, 32, 13,251, 99,142,187, 99, 27,134,183, 26,246,170,
+155,134, 40, 33,228, 85,212, 58,149,154, 73,116,184, 50, 96, 66, 49, 24, 85,132, 90,121, 22,126, 88,249, 34, 38, 32, 53,249,164,
+ 41,135,166,175,161,100,142,206, 39,233, 9,127, 65,254,191,139,188,142,110,216, 76, 54,220,219,139, 9,179,217,144,109,143, 53,
+142,112, 11,105, 12,139,195,237,250, 8,194, 35, 84,190,107, 27, 82,239, 50, 4,146,116,239,188,233,132,215, 99, 87, 59,202,236,
+ 25,181, 54,230,186,225,207, 32,212,144, 13,111,141,100,121,133, 54,134,201,202, 28, 42,238,160,226,192,212,172,146,229, 20, 63,
+157,151,248,100, 38,254,150,141,107,218, 38,248, 53,249,171,161,198,171,152,188,132,103, 8,145, 25, 94, 94, 64,143,118,242, 67,
+137, 95, 77, 24, 33,135, 81,128,177,106, 33,198, 18,188, 48, 92,250, 96,125,141,185,155,222, 64,124,246,171, 8,105, 26,231,246,
+ 77, 85,248,221,191,254, 8, 27, 39, 79, 81,108,204,162,148,196, 70,226,186,187,252,218, 31, 63,141, 85, 63,206, 47, 28, 94,225,
+134,183,221,138, 40,151, 8, 46,156, 66,167,109,186,219, 45,194,126,198,234,165, 62, 8, 73,146,251, 28,164,237,178,116, 77, 19,
+107,173, 7,190, 71,217,247,248,234,122,155, 78, 6,113,172,168,206, 77, 83,153,155,199,111, 52,112,170, 53,188,122,131, 87, 78,
+247,137,166, 14,146,158,127,128,183,189,231, 23,168, 87,102,120,250,212, 75,252,230, 7,215,121,240,211,143,113,231, 27,111,160,
+175, 53,110, 92,196, 45,148,113,156, 62,174,237, 98,219, 22,182,235,226,251, 46, 90,165,180, 44,135,253,110,153, 64, 12, 40, 90,
+ 30,113,152,129,212,116, 6,177,185, 88,164, 25, 33,146,190,210,196,121, 91, 26,105,138, 4,162, 48, 34, 78, 2,148,202, 88,152,
+ 94,226,201,231,158,160,221, 27,208,233,180,113,253, 2,181, 89,151,254,222, 54,135, 78,220, 76,239,208, 17, 86, 31,253, 34, 11,
+115,139,200, 36, 4,199,103,243,220,171,124,244, 35, 31,224,143, 62,240, 63,120,249,212, 69,102,171, 37, 44,173, 73, 28,159,245,
+189, 54,127,246,137, 79,115,205, 23, 27,220,116,253, 81, 22,239, 60,142, 62,186,140,108,214,136,211,136,175,255,215, 63,224,235,
+ 15, 62,195,111,254,248, 91,200, 42, 53,132, 43,145, 74, 32, 44,199, 88,216,180,147,127,222,141,199, 35,222,221, 70, 58, 54,165,
+ 70,131,223,250,252,223,115,230, 99,127,197,110,171, 69,169, 82,102,106,121, 63,229,230, 52,229,125, 11,176,127,153,191,251,157,
+ 31,164, 27,165, 88,210,194,150, 38,110,150, 14,125, 54,249,239,172,196, 16, 53,125, 75, 26, 34,155,109, 83,116, 29, 74,150, 38,
+201, 50, 60,199, 70, 73, 69, 63, 54,159,169, 76, 11, 82,173, 9,163,144, 94,152,152, 4, 74,106,250,209, 73, 20, 41,224, 88, 26,
+ 39,134, 1, 18, 39, 3, 18, 8, 83, 65,185, 88, 37,205, 2,194, 48, 52,149,224, 35,150,188, 34,142, 35,108, 9,110,222,141, 30,
+229,151,249, 36, 47,185, 74,148,194,205, 73,117, 38,154,104, 68,128, 97,216, 71,106, 3,185,241,132,192, 22,110, 25,157,132, 88,
+213,105,116,154, 17,119,182,201,210,216,236,108, 28,143,198,242, 65, 44,199,163,115,249, 60,138,144, 98,189,206,246,171,103, 76,
+219, 80,255, 10,110,241,141,188,240,252,195, 36,131, 14,199,110,187,141, 27,239,184,157, 23,159,124,158,180,121,144, 45,183, 64,
+227, 90, 69,213,114, 40,174,111,177,214,234, 34,201,184,118,186,130,237,120, 20, 10, 14,126,193,227,200,237,183, 35, 61,135, 66,
+ 99, 6,149, 13,160,208,196,171,214,209,137, 2, 71,160,194, 24,215, 47, 24, 44, 97,148,228, 15,175, 20,183, 62, 75, 58,232,162,
+146, 20, 41, 5,131,237, 61,234,251,151, 16,149, 26,131,115, 23, 73,122, 23, 57,240,186,251, 57,245,207, 95,100,255,109,199,113,
+138, 21, 58, 87,214,232,236,110, 82,105,206,146,244, 3, 44,219,198,107, 52,105,206,245, 64, 11, 54,207,175, 51,183, 52,197,226,
+177,131,188,252,208,147,172,220,184,159,198,189,247,146, 12,224,149, 71,159, 65,235, 14,142,231,209,217, 9,232,237, 92, 97,223,
+161,131,212,166,102,169,148, 61,164,128, 80,151,120,233, 95,254,137, 82, 83, 35,132,135,112, 28,108,223,165, 58,181,136,112, 11,
+ 76,223,112, 27,126,189, 78,119,117, 21,167, 88,129, 36,161,187,189, 71,156,198, 92,119,255,253, 20,234, 85, 30,255,212, 39, 88,
+ 59,247, 42,199,223,240, 29, 92,124,241, 69,246,221,112,140, 51, 79, 62,195,193, 59,110,165,223,233, 82,108, 54, 25,116,187,248,
+149, 50,150,101,163,165,192,183,109,190,251,119,127,153,194,177, 59,105, 63,253,113, 8, 35,178,160,202,255,252,228,255,166,219,
+217, 38, 27,230,174,179,220,219, 38,133,201, 86,106,193, 68, 61, 54,182, 48, 76,119,169, 20, 82,218, 19,135,179,190,202,189, 62,
+ 54,114,141,161, 95,150, 87, 66,197,253, 9, 74,249,216,185,109, 74, 99,198,173, 97, 66,140,161, 34,210, 54,117,149,195, 9, 81,
+ 90, 22,118,125, 6,171, 84,196,155,221,143, 59,181,128, 55, 53,139, 59,183, 76,233,186, 19,248,243,203,216,229,170,249, 97, 76,
+213,219, 48,223, 6, 2,166,120, 67,190,176, 50, 25,147, 36,136,136, 86, 47,177,251,208,231,216,125,248,243,164,237,173,145,201,
+ 18, 38, 46, 24,122, 88, 65,171,243, 82, 6, 61, 74,228,128,200,205,101,185, 98,192, 24,228, 98, 14,157,252, 23,123, 66, 98, 54,
+ 80,150,137,104,158,154,184,233,104,125, 85, 41,141,152,236, 52,151, 19,109,102,195,111,112,178,210, 85, 12, 75,114,196,200,105,
+ 43, 25,187,203,199, 57,118, 49, 81, 80, 51, 94, 19, 24, 63,192,132,169, 77,233, 9,222, 59,163, 55,116, 88, 28, 99,184,254, 19,
+ 76,118, 13,194, 41, 99, 87, 23,136,119, 99, 80,131,156, 29, 63,198,184,106,161, 12, 11, 60,159,224,149,210,227, 11,136,154,200,
+208,231, 74,129, 82,106,244,207,196, 8,187,155,211,239,242,150,174,255,139, 29, 63,250, 62,175,222,217,142,243,133, 67,206,189,
+133, 59, 87, 39,217,184, 72, 32,230,216,215, 44, 50, 27,236,241, 15, 47,126,145,238,230, 38,126,185,142, 86,198, 57,122,246,197,
+243,188,255, 51,125,222,126,255, 61,216, 69,201,210,160,130, 53,127, 24,221, 95,163,119,241, 50, 73, 63,162,183,218,103,115, 45,
+ 32, 72, 53,169,176,217,222,139,113, 54, 67, 22, 14, 52,112, 60,143,185,165, 41,170,245,140,242,118,151,138,103,241,196, 70,143,
+175,126,254, 81,138, 39,183, 88, 40,121,200, 12, 92,199,197,241, 11, 36,190,207,125,131, 2,143,127,249, 52, 63,118,231,113, 62,
+253,248, 11,124,229,203, 95,227,248,173,119,176,214,122, 24,175,218, 32,232, 5,200,156, 47,110, 73,129,176, 13,193, 80, 72,137,
+229, 88,164,105,159,226,190,105,156,243,171,180, 52,108, 12, 34, 74,182,249, 29, 12,226,140, 72,231,201, 17, 9,177, 82, 38,214,
+ 21,133, 16,135,184,105,194,177,107,174, 97,245,210, 69,174,127,205, 27,153, 89, 88, 32, 19, 16,164, 9,123,221, 14,213,106,153,
+160,221, 50,107, 49, 75, 82,244, 60,156,239,254, 49,182,191,240, 9,166, 27, 83, 56,169,194,118, 28,214, 79,189,196,127,250,143,
+239,230,139,159,251, 50,127,245,165,199, 56,210, 40, 83, 20,208, 78, 5,243,149, 34,253, 56,224,129, 71,159,160,241,232, 19,164,
+ 65, 76, 31,232, 0, 33,240,147,223,117, 55,118,115, 26,157, 68,134, 33,239,251, 72,219, 38, 75, 53,218,181,242,196, 71,138,237,
+149, 72,130, 14,210,117,232,189,252, 28,181,215,189,141, 67,175,158,100,237,197,151, 17,174,109, 94, 23,203,194,159, 95, 96,163,
+179, 65,107, 16, 96,185, 21, 42,181, 25,162,222, 38,105,210, 39,201, 76,125,170, 49,108,154, 9,215,206,125, 34,113,222,118,232,
+ 9, 11,219,151, 57, 59, 2, 34, 29,227, 90,150,201,254, 11,179, 46, 12,162,212, 60,125,180,194,119, 11, 52,170, 21,182,246,118,
+ 9,147, 4,165,192,181, 36,105,100,224, 54, 82,131, 37, 92, 74,126,133,221,189, 1,105,206, 20, 25,154, 87,173, 33, 48, 82,152,
+ 46,119, 5, 68, 10,243,125, 10,176, 20,184,150,105,189, 36, 71,195,107,105, 8,149, 50, 87,236, 44, 76,114,201,149,121, 25, 12,
+210, 34,235,238, 16,118,246, 40,206, 44,146,109, 95,161,184,120, 16, 29,244, 9, 90,155, 12, 86, 47,209,220,127, 13, 42,142,136,
+ 6,125,108,199, 38,106, 13,184,243,221, 63,199,233,175,126,137,195, 55,157,160, 60,187,192, 75, 95,123, 4,207,179, 57,127,230,
+ 28,175,127,253,237, 60,246,205, 39, 89, 56,188,159,147, 47, 95, 34,138, 19, 28,173,120,211, 61,183,113,126,117, 11,219,177,200,
+178,152,163, 55, 30,197,171,148,241,234, 83,168, 48,160,216,156,193,114,124,210,104,128,215, 88, 32,238,108,226, 84,234, 70,214,
+176,108,164,239, 16,182,182,240,171, 83, 6, 5,232, 21, 32,235,163,177,241,138, 69,220,153,101,210,246, 14,197,169, 6,122,170,
+193,185,135, 30, 98,233,198, 99, 88,210,225,212, 87, 31,194, 41,216,204, 93,187, 15, 45, 28, 46,189,248, 44,251,174,191,142,184,
+215,197,171,149,105,173,111,225,217, 22,139, 71,143,242,236, 87,190,193,183,125,223, 91,232,172,181, 89,127,229, 85, 18, 37, 89,
+ 90, 90,196, 41, 45, 51,232,182,144, 42,101,121,101,129,185,163, 7, 57,247,252, 75, 44,221,120, 19,173,181,109,202, 21,135, 55,
+252,135,159, 97,247,213,231,136,130, 61, 44,207,197,178,109,226, 20,236, 82, 17, 97,219,196,221, 62, 89,150,210, 58,247, 10,243,
+ 71,142,179,114,199,225,252, 16,201,216,189,116,133,123,222,251,227, 68,131, 1, 89, 24,113,228,238,111,163,179,179,199,210, 13,
+ 71,233,181,218, 20,170, 53, 44,169,209,126,193, 20,216,104, 65, 26,132,120, 37,159,226,205,119, 18,159,250, 6,193,238, 26,181,
+187,127,144, 15,254,254,143, 33,195,128, 76, 10,132,101,136, 71, 89, 62,113, 26,239, 83,142, 72,196, 72,237,182, 28, 17,154, 71,
+156,112, 67, 80,203,109,150, 67, 51, 23, 99, 63,210,240, 28, 40, 44, 28,167,114,236, 38, 90,207,127,133,120,253,202, 24, 17, 59,
+220,140,170,241, 67, 89,144, 31,228,105,134, 64, 99, 23, 74, 76,189,241,157, 76,221,251, 86, 74, 71,175,199, 46, 54, 16, 34, 5,
+ 29, 95,181,139, 55,185,171, 20, 21, 13, 80,123,189,252,240, 48, 11, 37,145, 35,219,180, 54,225,123,157,154,130,148,168, 59, 32,
+137, 83, 44,191, 72,243, 45, 63,194,220, 59,222,135, 44,148,217,248,236,255, 98,253,179,127, 62,150,247,135, 23,148, 33,139, 37,
+151,158,135, 45,118, 6,124,146, 31,228,154,188, 1, 78,142, 50,209,114,248,179, 9, 3,118, 17, 35,211,215,248, 92,214,232, 81,
+ 52, 14,105, 25, 71,253, 40,122,173,199,134,238,188,126, 84, 58,121,169,204,112,228, 31,154,202,165,145,220,135,204,245, 17, 19,
+ 94, 48,230,167, 51,110, 61, 19, 82,130, 53, 62,228, 71, 63,203,232,114, 54,169, 93, 15,213,139, 33,230, 90,142, 46, 26,228,180,
+ 53, 33, 64, 37, 3,162,141,211,160, 34, 99,152, 28,102,221,135,147, 75, 94, 18,163,242, 94,116, 41,134, 19,127, 94, 30,147, 95,
+ 84,192,152,222,132, 37, 39,204, 83, 19,126, 3, 49,222,209,143,217,219,121,181,174,148,230,114, 38,255, 77, 53, 32, 19,166,140,
+ 97,107, 93, 40, 80,131, 54, 89, 97,134,163, 55, 76,243,158,218, 60,165,197, 35, 12,182,174, 32,181, 32,205,160, 54,211,224,109,
+255,238, 9,126,249, 7,106,252,236,111,255, 20, 63, 80,105,243,190,143,253, 39, 82,233,210,122,233,121,130,173, 14,209, 78,140,
+ 95,240,176, 85,128,159,192,197,221, 62, 47,183, 98,106, 69,135,230,194, 2,210, 17,108, 95,218,102, 99,183, 79,165,224,113, 96,
+166,196,226, 84,145,245, 86,159, 43,221,117,206,119, 44,250, 9,220,208,172,113,235,220, 33,230,103,102,185, 17, 65,225,214,251,
+208, 74,240,254, 59, 94,199,218, 71,255,132,195, 90, 33, 45,151,127,125,224,175,169,222,125, 11,206,177,107, 80,158, 71,226,228,
+141,123,113,146,215, 28,107, 28,203, 6, 7, 92,203,161, 42,108, 28,161, 89,235,197,148, 93, 7, 87, 66,106, 65, 81, 72, 82,173,
+ 73,149,166,159,101, 12,186, 17,165, 48, 36,236,237,114,255,241, 59,248,212, 55,191,140, 37, 5,245,153, 38, 39,142, 29,227,202,
+197,243,148,125,151,237,214, 14,142, 95,192,143,139,168, 82, 1,165, 51,210,126,155,210,119,190,139,221, 7, 62, 78,179, 92, 67,
+164, 14,150,231,177,187,126,153,251,222,116, 55,119,223,115, 27,191,243,193,143,114,170, 61,224,230,169, 10, 61, 45,137, 51, 69,
+106, 59, 8,169,185,235,219,110,228,139, 15, 63,205,116,169,200,247,188,237, 62, 22, 87,150, 72,162, 0,167, 90, 6,215, 50, 0,
+ 32,219, 1,225,230,207,125, 43,255,168, 72,210, 65,128,148,146,184,211,129, 74, 25,103,118, 26,231, 66, 9, 81,240,113, 42,101,
+ 42,203,251,176,111,186,137, 15,253,252,155, 9, 83, 77,181,232,129, 80, 36, 73, 68,152,170,209,129,106,196, 46,243,252,179,164,
+ 32,136, 50, 2,215, 68,202,164, 4,207,118,176,133, 67,150,197, 40, 97, 14,244,162,237,224, 88,210,192,183,108,129,157,106, 18,
+ 5, 37,207, 65, 43, 77,146,100,230,235, 74, 65, 22,155,242, 28, 43, 53,112,156, 36,138, 89,223,218, 32,136, 98,226,156,175,161,
+ 39, 38,109,165,135, 81, 54,147, 6,210,194, 32,191,237,137,178,168, 52,111,207, 12, 51, 67,142,211, 35,211,161,153,210,101,126,
+176,219, 89, 48, 64,186, 14, 96, 81,154,154,165,183,122,158,210,210,126,218, 23,206,208,190,244, 42,139,215,159, 64, 54,155,108,
+159,127,149,168,189, 67,109,113, 63,169,210, 20,166,170,116, 55,214, 89,188,254,102,122, 59,219,156,125,230, 89, 26,115,117,206,
+ 61,119,146, 91,238,190,133,213,139,107, 28,188,118, 31,245,217, 37, 42,231,247, 32,147,220,116,253, 1,206,110,172,177,111,126,
+154,205,237, 62, 85,207,231,166,239,120, 19, 86,161,140, 91,170, 98, 53,103, 80, 74, 99,249, 5, 44, 52, 73,167,133,180,108,178,
+168,143, 93,110,130, 74, 8,219,219, 56,149, 10, 72,155,214,169,231,168,237, 91,161,183,187,134,101,121, 84,150, 87, 72,218,219,
+156,127,242, 81, 42,205, 41,122, 91, 91,236,191,249, 56, 94,101,138, 51,143, 60, 70,125,170,201,204,117,215,128, 93,226,137, 79,
+126,142,235,238, 57, 70, 18, 68,196,225, 46,210,171,144, 69, 49,149,133, 6, 59,107,187, 28,186,229, 24,216, 54, 81, 52,160,185,
+255, 16,113, 18,144, 70, 49,253,118, 66,175,181,137,180, 99,234,251, 87,120,242,159, 31,166, 49,227,242,244, 23,254, 9,187,228,
+ 35, 16, 52,231,150, 40, 54,150,169, 52,150,185,248,210,163, 56, 5,135, 66,165,129,235, 85,136, 58, 29,220, 82,137,169, 67, 71,
+ 40,207,207,115,242,171, 95,102,251,236,181,212,151,247,161,194,152,250,202, 62,178, 52,163, 80, 42,146,120, 30, 47,125,245,235,
+ 76,173,172, 48,208, 25, 94,177,200,238,229, 43,212,230,102,145, 5,223, 76,215, 42,197,171,148,208, 89, 74,229,232,189,156,126,
+236, 95,169,220,255,179,252,202,143,223, 71,217, 30,230,172,117,190,127, 49,123, 28, 75,230,196,198,212, 48,131, 11, 57,254,213,
+202,121,206,214,196,196,165,134,128,153,201, 93,171, 26,231,150,205, 65,230, 96, 23,235, 56,245,121,132,182,242,157,114,190, 11,
+150,218,100,144,243, 3,102,216,209,109, 21,202, 76,191,225,123, 89,126,239,127,198,169, 55, 65,245, 77,145,134, 86,136,116, 55,
+ 47, 78,183, 25, 85,175,169, 20,146,132, 44,138, 80, 73, 66, 50, 8,200,146, 20,157,101,249,164,102, 33,164,129,217, 27,254,116,
+136,202,210, 60, 43,110, 99,107,135,104,144,128,236,161,213, 54, 83,239,248, 15,204,127,223, 79,241,236,187,239,200,167,243, 9,
+163,219,208,121, 61,140,197,101,122,180,167, 23,185,188,109, 24,171, 58,175, 40,205,247,186, 74,140, 90,170,212, 68,198,126, 20,
+ 33, 19, 98, 20, 83,211,169,154,112,115,231,191,184, 74, 95, 21, 75, 83,153,249, 62,172, 97, 76,107,184,143,103, 12,221, 49,189,
+228,150,137, 5,145, 23,172, 40, 19,191, 19,142,217,231, 26,151,184,206, 73,140,122, 36,199, 15,191,158,161,203,137, 81,197,170,
+ 30, 26, 14,149, 50,149,167,195,226, 22,244,136,224, 38,116,140,206, 18, 19,152,201, 17,187, 6,131,171, 70,149,174,134, 86, 39,
+242,140,186, 24,209,255,180,206,167,142,201, 13, 76,166,175, 54, 4,202, 9,190,126,166, 48, 27, 80, 61,230,233, 15, 99,108,250,
+ 42,204,224, 24,212, 59, 44,177, 65, 35, 11, 21,154,223,243,211,200, 82,137, 76, 59, 92,190,210,227,135,254,248,163,132,123,107,
+196, 58, 37,222,235,163,131,152,189,127,248, 60,159,186,225, 10,197, 39,182,120,224,206,253,124,219, 15,191,150,116,250, 48,173,
+199,255,133,237,231,206,176,115,170, 77,173,225,210,109,117,233,117, 98, 46,238, 37,124,107, 59,164, 86,242, 56, 48, 87, 97,230,
+218, 37,194,214, 14,155, 91,125,206,182, 6, 12,146, 62, 71,166,139, 52,202, 30,199,246, 55,185,209,181, 73,146,140, 51, 87, 90,
+144,181,249,199,167,190,201, 32,214, 28,157,174, 33,180,195,173, 71, 15,226,123, 69,202, 71, 14,144,102, 26,169, 52, 78, 63, 96,
+239,203,143,208,251,196, 63,163,164,166, 95,116,105, 45,212,232,215,125,118,163, 62, 36,230,243,223, 15, 35, 44,207,102,133, 50,
+ 47, 7, 45,124, 33, 17,150, 77, 39, 78, 64,105, 74,185, 32, 19, 8, 77,172, 20,253, 56,161,210,110, 83, 40,149, 56,184,255, 8,
+ 49,130,168,215,193, 45, 10,110, 58,126, 23, 47,191,242, 18,181,160, 68, 16,198,116,247, 90, 20,138, 62,126, 92, 36,179,108,211,
+106,215,235, 80,248,206,119,209,250,210, 39,153,118,235,232, 52,195,114, 37,253,110, 23,203,178,249,131, 15,252, 10,171,103, 47,
+242,167, 31,251, 7,182,183,219,212,242,251,242,134,148, 60,249,236, 73,126,234,231,222, 75,117,118,150,176,189, 71, 36, 4,110,
+185,132,112, 29,243,112,178, 29,147,116, 44, 56,166,197, 80,106,195,131, 79, 35, 84,100, 84,161,164,187, 3, 59, 27,216, 11, 75,
+ 56,165,151, 16,197, 50, 94,181,129,187,176, 72, 80, 44,176,185,181,141, 18,154,118,183, 69, 26,236, 97, 9, 99,142, 75,242,223,
+107,203, 54,209, 58, 91, 8, 35,201, 59, 30, 89,170, 70, 23,111, 71,216, 8,105,126, 86, 71, 74,124, 97, 81,114,108, 42,142,197,
+174,144,216, 90,140, 46,148,189,126,159, 84,245,208, 90, 99, 11,137,163,193,209,130,178,180, 40, 74,129,163, 37,142, 11,123, 97,
+ 58,242,129,196,106, 2, 1,109,153,153,201, 32, 32, 12,190, 89,105,176,109, 49, 4, 60, 18,100,195,120,174, 38, 19,210,176, 69,
+242,223, 21,215, 38, 55, 24, 11,124, 91, 96,171,184,135,116,234, 72,207, 39,139, 6,120,181, 41,200, 20,142,101,177,120,227,109,
+196,189, 61,138,139,135, 9,182,118, 41, 45, 31, 36, 9,251, 20, 74, 21,130,189,132, 44, 25,176,183,211, 39,106,109, 50,232,172,
+163,212, 20,123,219, 87,168, 79, 31,197,241, 93,102, 23,230, 25,116, 82, 42,205, 26, 51, 11, 85,188, 66,149, 90, 99,134, 84, 43,
+150, 92,159,133,107, 86,240,107, 83,184,149, 6,105, 20, 34,165,133,180, 52,194,175, 17,111, 95,196,109, 46,229, 57, 86, 7, 21,
+247,145,182,141, 87,109, 34,252, 18, 89,111,143,250,129, 67,108,190,244, 34, 83, 7, 86,232,172,158, 5,181,159, 75,143, 63,206,
+129, 91, 78, 16,135, 1,179,135,142, 16,246,218, 92,124,234, 9, 28, 55,197,169, 54,136,162, 4,221,223, 99,233,208, 97,226,126,
+ 68, 18, 68, 36, 42, 65,102,130,176, 51,192, 45, 25,146,150, 87,159,229,242,211, 47,176,215,106,241,220,215, 31,224,134,187,238,
+ 97,237,244, 38,157,206, 42,213,114,141,253, 71, 14,243,228, 23, 31,101,122,214, 71,227,112,224,186,107,113, 75, 53,206,189,120,
+150,147,143, 61,204,129, 91,111, 96,122,225, 6,174, 57,126, 39,189,237, 85,122,253, 93,122,187, 23, 40,213,230, 24, 4, 3, 58,
+ 27,107,184,149, 50, 39,222,254,253,196,131, 62,151,158,120, 2,219,245,169,237, 95, 98,231,194, 57,144, 54, 11, 7,175,225,134,
+ 55,190,222, 76,241,185, 4,101,229, 19, 77, 18,101, 56,174, 36, 85, 70, 46,215, 8, 99,152,187,238, 53,252,247,159,188,207,236,
+197,213,248, 33,173,148,145,223, 44, 97, 10, 92,108, 45,240,129,130, 45, 40, 8,129, 39,229,168, 85, 73, 49,222, 33, 15, 31,216,
+ 66, 14, 39,193, 28,154, 34,141, 60, 45, 37,100, 42,161,123,246, 49,130,181, 51, 36,189,213,220,240,164, 70,117,165, 90, 41,164,
+107,163,211,148,226,242, 81, 14,252,244,111,210,184,243,245,102, 18,207, 2,116,180, 99,196, 99,219, 67,216,230,130, 57, 26, 35,
+ 85, 98, 92, 37,105, 74, 22,132,132,221, 14,105, 16, 16,247,243, 67, 93,107,146, 40, 54, 10,178,235,225, 88, 78, 94,147,104,154,
+226,178, 52, 70, 91, 26, 71, 15, 76, 12,202,114,112, 42, 21,146, 40,163, 56, 53,203,209,255,246,183,188,244, 95,222,153, 79,183,
+106, 92,224, 61,196,191,218,198,148,153, 42, 53, 50, 6,106, 53,198,146, 42,198,197, 36,195, 83, 41,203,193, 41, 67, 36,106,150,
+169,177,180,207,213, 60,247, 28,113,135, 86,227, 62,100, 24, 79,184,228,101, 61, 98, 20, 9,188,186,232, 70, 43,140,171, 56,255,
+247,169, 92, 66, 17,150, 89, 9, 24,227,159, 26, 93,170,204,222,124,236, 34, 39, 79, 67,104, 97, 46, 2, 74,231,187,148,225,215,
+207, 1, 59, 74,229,197, 45,106, 72, 4, 51, 95, 79, 13, 47, 13, 19,116,188,145,217,223, 45, 33,156, 34, 42,234,152,247,113,164,
+255,235,171,144,238,227,197,224, 88,148, 25,245,170,103, 67, 27,161, 30, 27,243,180, 2,219, 50,148, 65,165,242, 90, 87, 43, 55,
+209,169, 17, 89, 15,165, 81,150,241, 22, 56, 86, 66,251,210,121,236,114,145,226,194, 18, 89,201, 33,125,254, 28,197, 75,109,252,
+176,111, 58, 37,194,152,197,170, 67,151, 1,119,253,200, 29,100, 86,157,172,179, 75,166, 92, 58, 27, 1,237,118, 66, 22,107, 54,
+119, 66,122,169,166, 29,164,220,121,160,193,226,193,121, 14,220,123, 15,171,143,126,147,199,159, 56, 75, 63,131, 78,170, 9, 82,
+197,233,157, 62, 83,221,144,112, 16,177, 48,223,192,111, 20,185,229,248,126,210, 36,225,104, 48,160,189,221, 35, 82, 25,253, 36,
+229, 11,223,122,130,189, 56,195, 67, 51, 85, 40, 49, 83,174,176, 80,157,166,233, 87,104,204,215,233,197, 17, 89, 16,210, 60,121,
+153,166, 18,148, 4,188, 72,200,158, 39,233, 71, 9,158,107,177,144,249,164, 25, 20, 11, 6, 81,106, 91,146,118,148,208,180,114,
+ 41, 89,105, 34,173, 73,200,136,227,152, 66, 20,145,181,214,241,181,160,215,235, 32,133, 3, 57, 41, 16,169, 25,244, 7,244, 92,
+ 15,191,181,135,180, 61,138, 8,164,229, 32,109, 80,189, 14,254, 27,191,159,157,231, 30,161, 17,133, 38,115,158,223,177,246,118,
+ 54,169, 78,149,249,221,247,255, 28,113,152,208,221,110,145,165, 9,197,106, 13,183, 94,165,179,177, 69,191,219, 69,250, 30,210,
+ 2, 37, 4,194,115,144,174,141,180, 29, 82, 13,150,227,147,197, 3,200, 64, 75,101,138,101,148,137, 20, 8,199,162,255,244, 55,
+ 40, 52, 23,176,167,155,168, 84, 83, 88,156,199, 57,124,152,191,254,253, 95, 34,203, 89,236,190,149,129,150, 36, 74,145,164,106,
+180, 6, 26,126, 22,147, 76, 33, 44,159, 74,109, 1, 63,235, 34,148,145,195,133,206,176,148, 70,145,230,196, 57, 11, 79, 66,193,
+ 54,248, 91, 45, 52,105,190, 94,211, 40,108,242,201,218,177,145, 2,202,150,100,214,181, 41, 72, 11, 91, 10,156, 72, 16,196, 96,
+ 9, 53,138,254, 78,170, 91,153, 82,164,142,157,195,179,200,159,171,230,179,175,164,113,186, 15,239,207, 74,155,221,189,145,222,
+ 13,129,206,206, 76,119,123,217, 18,216,118,161, 76,218,221,197, 46,213,200,130, 62, 78,181, 74, 22,133, 8,203,124,241,226,210,
+ 33, 58,231,207, 48,104,111,163, 69,140, 74, 67,234,251,143, 32, 44, 73,105,106,145, 87,191,254, 41, 14,222,121, 23,205,125,251,
+121,252,179,127,207,107,223,250, 54,158,127,228,113, 10,190,199,225,187,239,229,155,255,248,101,138,149, 10,205,153, 26, 74,165,
+ 68, 65, 68,173, 81, 38, 25, 4, 28,190,255,141,216,190,103,202,224,171, 21,210, 94, 15,175, 57, 75,188,183,142, 83,107,146,133,
+ 93,164, 99,163, 6,187,200, 82,141,184,189,141, 59,189, 72,214,221,165,191,187,141,235,187,204, 30, 60, 74,208,110,209, 60,124,
+130,104,119,139,165, 19,199,137,131,128, 44,138, 8,217, 34,234, 71,168, 36,164, 80, 41,211,219,222, 38, 28,108, 80,168, 31, 32,
+ 37, 66,119, 83,226,168,143,237,122,132,131, 46,182,107, 83,172, 52,136,250, 1, 59, 87,214,233,239,238,162,195,152,239,248,241,
+159,100,231,210, 58, 91,235,231, 41,184, 9,215,220,116,136, 87,159, 59,203,226,242, 44, 43,199,143,224,120, 37, 90,187,219,156,
+126,225, 50,113,247, 18,135,111,184,141,222,218,121, 86,219, 59,184,181, 5, 26, 51,215, 50,213,156,165, 56, 51, 15,182,139, 91,
+ 40, 18,236,237,208,186,112,153, 96,253, 49,220,114,133, 27,191,251, 29, 35, 46,114,169, 94, 37, 14, 19, 46, 60,247, 10,211, 7,
+246,225,149,203,216,150,100,253,194, 37,166, 87, 14, 16,246,218, 56,110, 17, 33, 4,105, 20,210,110,117,152, 90,154, 39,203, 82,
+ 35,101, 23,138,184, 90, 35,226,152, 52, 71, 23, 74,161, 17,169,217,205,216, 8, 74, 66, 24, 12, 44,130,138,176,240, 1,207,202,
+163, 79, 98, 88, 67,104,242,220, 74,168,225,233, 50,118,186, 79,164, 83,164, 4,149, 69,164,253, 43,230, 67, 41, 4,146,220,109,
+ 46, 37,144, 81, 58,116,156, 27,126,239,111,112,106, 77, 16, 49, 90, 13, 16, 58, 5, 44,132,107,131,244, 70, 83,157,121,240,135,
+166,205, 41,137,200, 6, 3,130,214, 30, 81,191, 67, 50, 24, 48,216,235, 18,135, 17, 89,146, 97,185, 30,210,241,205, 1,155, 23,
+104,184,165, 10,210,114,205, 21, 88,130,148, 46,105,148, 16, 71, 17,118, 65,226,230,113, 48,173, 20,229,235,110,193,169,214, 73,
+186,221, 60,167,174,199, 50,121, 94,145, 58, 97,245, 27,215,133, 78, 72,225,195, 95,236, 49,115, 69, 95, 69, 61,147, 66, 76,144,
+209,204, 65,175, 50,179,159, 87, 74,231, 44,133, 97, 47,123,142,195,157,204,160, 51,238,110, 31, 50,237, 71,190, 5, 57,118,228,
+143,200,122,195,204,118,158, 38, 94,148,182, 0, 0, 32, 0, 73, 68, 65, 84,251, 31, 70, 0,133, 45,242,238,232, 9,170,156,158,
+196,251, 90,198, 68, 42,195,252, 50, 48, 70,180, 10, 41,141,199,197, 26,198,215, 38,156,234, 19,169, 6,195, 30, 6, 97, 91,216,
+229, 25,132,244,136,163,214,168, 79,110,212,164, 49,145,130,208, 66,152,254,137, 92,209,144,185,173, 95,107, 53,194,200, 94,149,
+150, 0, 84,146,230,251,242, 92,103,207, 84,206,131,103,196,205, 39, 87, 12, 74,203, 7,200,220, 10,193,238, 73, 94,252,218,191,
+ 18, 70, 5, 74,223,236,192,110,192,160,219, 33, 88,223, 36,237,247,217,217, 60,135,187,208,229,134,127,255, 58,100,253, 58,186,
+143,127,158,213,135, 78, 50,243,134,183,114,252,189, 77,158,253,131,143, 49,232, 68, 28, 58, 84, 99,167,163, 57, 58, 87,167,180,
+188,128,223,156,162,115,246,121,158,121,236, 52,157, 68,179, 25,102, 68,128, 43, 5,145,134, 86,170, 73,219, 17,171,157, 45, 22,
+ 42, 22, 11,139, 53, 26,115, 85,170,251,102,152, 93, 89, 4, 20,105,183,207,237, 82,112,241,244, 26,189, 40,101,189, 29,177, 30,
+236,114,106,119,131,110,168,216,215,172,114,164,218, 64,196, 62,194,178,232,235, 4, 29, 37, 28,201, 44,156, 64,114, 37, 9, 57,
+163, 98,254,127,174,222, 52, 88,210,243, 60,207,187,222,229, 91,123, 63,251, 58, 11,102, 0,204, 96, 39,192, 5, 20, 69, 10, 36,
+ 37, 89,178,181,132, 74,201,137,229,216,177, 85,113, 82, 86, 41, 37,197, 81, 92,145,108,171,168, 42, 39,182, 99, 87, 28,197,150,
+146,170, 84, 24, 45,137,164,148, 98, 75,138, 40,201,218, 40, 71, 92, 32, 18, 32, 8,112, 6,192, 96,128,217,231,236, 75,247,233,
+245, 91,223, 55, 63,222,175,251, 28,240, 7, 10, 63,230,116,159,211,221, 95,127,207,251, 60,207,125, 95,247,112, 50,102, 49,246,
+ 25, 23,134, 36, 79, 65, 86,177,156, 56, 96,201,176, 48, 28,231, 5, 65,146, 17, 78, 82,194,241,136,188,204,241,148, 34, 75, 38,
+168, 0,252, 90,131,245,197, 14,147,180, 32, 12, 44,195,209,144, 48, 12, 8,106, 53, 60,207,195,247,131, 74,152,169,177,163, 17,
+241, 83, 31,163,247,222,107,180,122, 71,120, 97,195,105, 89,180,132, 82,208,239,118,221,180, 41,244, 80, 86,147,149, 25,121,255,
+ 4, 85,139, 16,165,165, 44, 75,215,141, 70, 1,194,211,200,192,195, 42,141,177,106, 70,172, 68,148, 88, 35, 40,139,212, 5,196,
+228, 37, 82, 8,186,119,110,144,117, 79,220,232, 93,122,120,139, 11,164,205, 54,175,252,249, 31, 32, 5,248,158, 27,103,167, 69,
+193,168, 52,213,206,220,206, 26,134,180,176,160, 12, 73,158,211,235,238,211,140, 64,132,117, 55, 97,212, 62,210,175, 83,142,187,
+ 32,138,217, 97, 49, 47, 45, 70,216,153,199,220, 86,235, 49, 91,117,238,198, 24,151,200, 38, 4, 53, 79,209,212, 10,140, 96, 50,
+155, 52, 85,247, 78, 97, 65, 41,103, 85, 44, 93,211, 19, 4, 62, 38,207, 48,198,162,113,104, 88,161, 44, 69, 53, 24, 44, 43,236,
+114, 57, 43,238,110, 45,167,112,122,139, 80, 56, 75,161,250,217,159,254,137,207,234,198,156,139,210, 11, 99, 16,110,228,161,188,
+208,141,189,131,136,163,247,222,166,185,188,140, 31, 71,180, 46, 63,199,195,175,191,140,176, 9,147,193, 24, 83, 22,164,201,128,
+147,253, 99, 46, 62,247, 12,119,175,223,100,126,109,145,205, 43,151,184,246,242, 43,180,230,154,204,175,172,226, 5, 62, 42,140,
+104, 52, 27,212,219, 45,218, 43,171,204, 93,122, 2, 21,213, 49, 38, 71,232, 0, 29,198,206,115,172, 60,132, 95,119,192,147,178,
+ 64,214,231, 17, 22, 84,220, 38, 57,218, 5,155,163,164, 36, 92,222,196, 26,139,142, 35, 76, 94,144,143, 39,152, 34,163,182,126,
+ 1,155,150,236,223,122,143,189,247,110,176,114,233, 34,214,122,140,246,247,217,120,250, 89,110,189,252, 21,180, 42,152, 12, 6,
+248, 97, 72, 58,204, 16,162, 96, 60,236, 49,232,117, 17, 66,226,121, 33, 18,193,226,197, 53,142,182, 14,184,245,250, 77, 86,215,
+ 58,156,123,252, 18,147,193, 24, 85,230, 92,121,233, 19,100,133,229,104,247, 0,147, 65,103,174, 77,173,174, 88,188,124,145,205,
+231,190,157,246,194, 5, 36,138, 60, 77, 40,139, 28, 73, 53,238, 25,244, 17, 90, 19, 47,204,211,190,112,158,213, 39,174,184, 11,
+ 38,153,176,115,243, 54,126,232,225,199,117,242,108, 66, 16,199,188,251,197,175,112,252, 96,155, 11, 47, 60,203, 55,255,221, 31,
+179,120,249, 17,210, 52,193, 10,240,195, 24, 63,138, 40,210, 12,233,249, 44,111, 60,194,171,191,250, 63,210, 16, 18,109, 28,139,
+115,108, 33, 85,150,162,218,109,215,164,160,109, 37, 75, 90, 80, 19,210,165,176,121,158, 75,139,138,231, 9,218, 43, 80,100, 88,
+ 91, 84,187, 90,183,107, 63, 43,146,179,211,172,115,121,134, 53,110, 5,168,138, 79, 94,117, 82,193,242, 38, 47,252,210,151,216,
+248,171,255, 5, 50,136,176,228,136,170, 0, 34,170,113,155,240,192,122,213,137,161,132,236,132,178,223, 39, 63, 62,100,180,189,
+ 69,111,103,139,238,206, 22,131,253, 67,250, 7,199,156, 28, 31,145, 12,135,244,187, 93,198,195, 1, 69, 81, 80, 22, 22, 35,148,
+219, 65, 11, 5, 90, 83,228, 5, 69, 97, 16, 94, 64, 89, 22,228, 89, 74,212,153, 35,170,213,241,155, 53,130, 90, 92,237,211, 21,
+131,111,126,217,129, 86,180,156, 37,167,217, 51, 42,252,105, 1,158, 46,107,103, 74,107,123,170,184,158, 38,189,113, 22,172, 83,
+217,200,190, 53,233,102,150,206, 86, 77, 94,164,112, 74,122, 41,229,108, 52, 61,195,220,138,211,238, 98,170,115,152, 86,185, 89,
+176,206, 20,184, 35,171,169,193, 44,203,186,226,198,155,211, 2,239, 52,133, 6, 85,141,212, 69,117, 82, 83,186,229,118,253,101,
+250,254, 76,244,170, 88, 75,229,222, 27,161,164,187, 17,201, 51, 2,182, 74, 0, 57,101,210, 11,161, 1,141, 77, 78,176,249,164,
+ 98,243, 87,113,180,149, 13, 77, 40, 57, 59, 44, 57,224, 79,117, 0,210,114,118,221,205, 66,130,102, 4, 62,113,202, 24,224, 12,
+169, 72,158,217,215,203, 42,192,166,154, 68,204,127,234, 51,228,227, 17,131,131, 35,146,131, 99,190,251,135,127,142,114,114,143,
+ 98,114, 66, 81,166, 28, 93,251, 38,135,199, 47,163,194, 45,174,252,216,143, 98, 11,159,236,214,203,236,125,241,235,100, 39, 99,
+130, 90, 78,124,249, 57, 22, 30, 95,163,115,105,153,104,169, 78,251,252, 10,181,243, 27, 40,237,147,116,187,220,191,181,207, 48,
+117, 19,165,162,116,234,229,145,177,164, 70,146, 20,134, 80, 8,188, 64,146,230,134, 52,205,201,250, 35,119, 96, 77, 7, 46, 29,
+178, 30,162, 60, 31, 95,150,212, 2, 65, 67, 9, 86,231, 99,214, 58,117, 66, 41,216, 31,166,188,113,124, 68,183,232, 51,204, 50,
+ 36, 18,137, 34,142, 60,114,105,241,101,192,146,181,172,214,154,104,207, 82,144, 19,249,154,195, 73, 78,102, 45,243, 90,161,164,
+219, 31, 99, 33, 23,130,204,237,209,168, 55, 34,250, 6,106, 43, 75,120,129, 71,150, 20,212, 25, 80,211,130,222, 40,197,247, 53,
+158,114, 66,194, 32, 12, 80, 74,163,124,207, 29, 80,181, 70, 2,254,234,121, 82,169,177,123,119,208, 81, 92, 45,173,197,140,143,
+160,148,114,247, 4, 79, 35,148,231,238, 41,158, 70,120, 10,161, 61,164,246, 80,158, 70,104,237, 30, 90,111, 99,172,160,200,199,
+152,100,130,205, 18,202,116,132,244,125,151,200, 89, 93, 11,201,176,135, 49, 80, 91, 89,197,187,120,137,163,116,200, 87, 62,255,
+127, 16, 42, 73,224, 73,198,185,101, 84,148,140,115, 67, 82, 77,240, 50,131, 67,173, 78,187, 93, 99,241,108,201,114, 45, 96, 46,
+244,137, 61,143, 90,123, 29, 21, 45, 82, 78, 78, 40,138,140, 36,207, 57,201, 50,246,199, 41,221,164, 32, 47, 75, 50, 99, 40, 13,
+206,106,118, 38,201, 49, 80,146,134,167, 88, 12, 61,154,202,113,252, 71,153,225, 36, 55, 36,198, 86,143,113,233,112, 66, 57,167,
+141, 11,110, 54,120,210,226, 41, 80,194,237,201,207, 38,224,216,106,167, 62,213,139, 40, 41,208, 72, 98, 37,104, 42,201,188,239,
+177,236,123,104, 25,213,177,165,101,124,176,141, 16, 37,218,175,225,215,155,149, 13,200,146, 13,123, 80,102, 68,157, 14,186,189,
+204,201,123,111,211, 90, 94,165,185,113,158,238,157,123,120, 8,214,174, 60,197,219, 95,248, 99,236, 82,135,141, 39, 30, 39, 25,
+ 12, 56,218, 61,100,113,113,129,250,226, 50,195,147, 1,221,157,125,214, 47, 95, 32, 27,141,105, 44, 47,210,121,228,113,172,201,
+177,194, 67,199, 77, 39,132,201, 51,247,117, 13, 27,228,131, 67,116,216, 68,132,173,234, 38, 35,201,142, 30, 96,179, 20,127,229,
+ 60,121,239,208, 37, 48, 77, 70, 72, 13,119, 95,254, 50,243, 23,207,131, 73, 57,122,117,155,163,155,183, 89,121,100,149, 39, 62,
+245, 41,142,239,111,179,117,253,117, 46,126,248, 35,220,121,229, 53, 54,159,184,138, 10,155,220,253,250, 53,118,239,188,201,210,
+250,227,236, 62,220,194,215,146,165,139,143,224,215,235,156,236,247,145, 10,238,189,117,155,124,220,229,242,179, 79, 83,155, 95,
+ 99,210,237,227,251,117,154,107, 23,216,187,247,128,225,241, 17, 74, 7, 28,238, 30,144, 79, 44,147,222, 77,194, 78,135,247,174,
+221,198, 11, 98,188, 40,162, 72, 83,194, 70,135, 64,199,248,243, 75,168, 32, 32, 57,233, 67, 89,112,124,239, 30,175,253,250, 47,
+163,194,136, 39,190,251,135,216,120,234, 42,215,255,228, 11,172, 94,126,156,230,194, 34, 69,154,242,212,119,125,146,116,156,112,
+243, 43,175,176,249,252, 51,148, 89,202,112,175,203,226,133, 77, 74, 83,186,105,135,246, 42,207,178,229,153,143,126, 55, 91, 95,
+250, 61,172,146,238,116,106, 44,148,206,111,238, 41,119,243,109,104, 65, 67,104, 98, 41,136,173,196, 71,160,173, 70,215, 26,196,
+ 43, 23, 25, 38,125, 76, 62,174,106,131,156,237,127,207,218,202,222,223, 72, 86,133,176, 74, 41, 83,192,227,255,248,151,152,255,
+216, 95,170,244, 90, 6, 65,138,176, 57,179, 52, 22, 33,193,106, 87,200,205, 8,202,148,108,127,159,254,254, 46,201, 96,200,240,
+164,199,168,219, 37, 73,146,106,164, 13,121,146, 82,100,133,139, 70,204,156,157, 47, 73, 83,124,191, 65,216,236, 16,197, 49,121,
+158,147,231, 41, 20, 96, 68,233,224, 54, 90, 34,149, 36,172,215,177, 24,106,237, 86, 53,221,207,153,255,228,103,184,255,185,127,
+226, 94, 67,201,204,147, 46,236,169, 74,118, 26,128,129, 21,213,244, 66,204,210,222,166,244,178,233, 78, 89,202, 41,250,210,141,
+126, 69,149,176,118, 90,134, 78,189,236, 83,120,155,235,147, 43,124,234,172,243, 20, 51, 60,234,217,136, 89,123, 54,145,236,172,
+184, 14,183,173,154,118,224,167, 54, 50,135,144,116,135, 20, 57, 59,132,157,242,218, 93,247, 92,100,125, 39, 76,154,198,175, 86,
+ 46, 9,183,255,113, 40, 89, 33,220,254, 94, 10,135,217,244, 91,231, 40,179, 1, 34,233,206,110, 64, 14,219,154, 97,211,163, 25,
+ 43, 94, 78, 17,190, 51, 2,158, 99,230, 79, 83,248,166,169,111, 83, 19,238, 12, 53, 59,227,254,115,154, 34,119, 86,228, 94, 69,
+198,114,118,170, 96,170,160,122,156,245, 81,135, 62,101,173,195,222,221, 63,226, 35, 47,252, 48, 54,185,139,148,146,189,123,215,
+233, 63,124,157,224,188,225,201, 79,126, 15,178,181, 14, 40,198,175,255, 33, 39,119,183,144,145, 38,140, 3, 14, 94,123,139,250,
+179,159, 32,122,228, 42,241,227,207,147,110,221, 97,176,119,200,248,248,132,236,164, 79, 16, 47, 81, 15, 7,104,113, 68,203,151,
+180,227,128,187,189, 9,135,169,165, 95,173,171, 10, 5,157, 90,192,113,127,140,231, 7,200, 40,100,175, 59, 97, 53,158, 99, 50,
+ 24,131, 53, 52,150,219,120,161, 69,107,143,218,124,157,180, 55,161,204, 74,106,235, 13, 86,218, 25,253, 81,200,113, 82,242,214,
+225, 9,115,126, 31,141, 71,195, 52,240, 77, 64, 61,212, 20, 72,250,105, 78, 18, 24,140,112,132, 49, 9,100,165, 37,179,134, 88,
+104,252,202,207,172, 42,208,210,168,204,217,126,112,143, 15,175, 95,224,149,173,187, 60, 90,187, 74,115,169,193,157,111,148,180,
+ 26, 53,162,208,103,111, 48,198, 24, 67,150,103, 76,198, 67, 71, 25, 21, 18, 29,213,240, 61, 13,194, 77,212,188,149,243, 36,141,
+ 37,204,141, 47, 83,143,106,148, 56, 55,138, 27,158,148,110, 71,173,165,187,134,166,200,216,106,180,237, 52, 52, 78,196, 70, 16,
+ 35,130,192, 57,155,138,156,201,220, 10,163, 68,178,126,245, 73,196,141, 63, 39,235,117, 17,181, 26,210, 56, 40,154, 49, 37, 50,
+240,208, 43,171,220,251,210,239, 83, 26,208,190,165, 40, 97, 82,150,244,179,146,194, 88,242, 42, 15,192, 84,190,117,107,166,131,
+ 65,199,111,207,138,146,188, 40, 41, 75, 75, 54,238,161,199, 35, 76, 49,193, 88,247, 92,101,169, 40,166,194, 79, 37,240, 50,137,
+ 17, 46,121,176,180,167,238, 32, 91, 97,175,157, 5, 85,186,144, 44, 89,169,224,173, 75,197,244, 4,100,249,153,239, 70, 21,136,
+ 16, 74,133,172,194,167, 60, 33,201,173, 33, 85,130, 36, 55, 20,103,181, 34,210,209, 90, 84, 21,213, 26, 42, 69,203, 19, 68, 82,
+162,126,234,239,254,245,207,102,195, 46,245,249, 21,188,206, 18,101,150,114,255,245,151,161, 40,137, 58, 11,140, 15,247,152,187,
+248, 24,202, 15,200, 71, 67, 70,135, 7,156,236, 61, 32,108,182,232,239,239,210,217, 56, 71,127,127,151,243, 31,248, 48,163,238,
+128,254,209, 30,202, 15, 9,162, 58,210,247, 73, 39, 35,194, 56,162,209,104,209, 90, 89,164,190,188,134, 84,154,104, 97,197,217,
+151,116,128,212, 1, 66, 71, 8,114,132, 14,201,199,125,146,253, 59, 4, 11,143, 96,178, 30, 82, 8,138,201, 0,207,171,225,205,
+ 47,210,123,239, 6, 65,179,142,181, 37,163,227, 67, 14,110,220,228,220, 7, 63, 72,214,235,211,219,217, 35, 8,224,252, 7,158,
+199,143, 91, 36,131, 1,163,131, 35, 54,159,126,186, 2, 3, 40,210,241,144,162, 40,184,246,197,107, 60,246,236, 26,209,252,121,
+ 30,126,243, 22,207,125,207, 39, 40, 82, 75,145, 25,144, 5,111,191,250, 14,129, 26,209, 94, 90,166,187,191,205,164, 63,230,224,
+254, 61,178,116, 72,255,168,203,222,237,247,168, 55,107,188,253,202, 53,218,173, 38,158,158,176,178,186, 65,153,103, 80, 72,146,
+241, 24,145,236,209, 94, 90,192,147, 49,199, 15,222,102,116,176,199,241,189,119,105,173, 94,192,175,215, 88,125,236, 81, 46,190,
+248, 49,100, 16,225, 71,154,221, 27,239, 49,127,225, 2,111,254,225,231, 89,127,226,105,172, 2, 63, 12, 65,120, 44, 94,216, 32,
+108, 52, 56,184,187,205,226,197, 13,132,167, 9, 60,207,141, 86,171,142,172, 52, 37,171, 87,159,231,206,239,124,206,133, 10, 88,
+ 75, 42,220,255,141, 0, 45, 4, 53, 37,233, 72, 69, 83, 74, 26, 82, 17, 75,133,150,210,105, 84,130,128, 98,124, 66,222, 63, 60,
+221, 45,219,211,253,238,217, 6, 73,169, 83, 18,218,180, 51, 18,194,210,122,242, 67,124,232, 55, 94, 37, 62,119,185, 26, 3,231,
+136, 98,186, 87, 21,103,186, 64, 9,101, 74,217, 63, 36,217,223,102,235, 27,175,114,247,218, 53,246,238,223,227,112,103,135,254,
+ 73,143, 36, 25, 83, 20, 57,166, 40, 40,203,156, 50,203, 41,173, 65, 10, 75,146,100, 40, 63,164, 44,115, 71,166, 50,133,131, 98,
+120,202,197,211,122, 18, 47,168,163,124,141,146,130,176,217,193, 15, 3,252,118,135, 40,212, 8,237, 97, 45,232,184,206,206,111,
+254,194,108, 44,103,167,101,253,125,158,123, 7,191,152,122,233,173, 53,103, 58,246,111,129,235, 76,165,227, 46, 20,242,116,220,
+ 93,165,165,205,108,111,213,238,221, 78, 73,104,138, 89, 62,186, 16, 2, 43, 79,129, 45, 82, 77,179,194,207,196, 87,138,179,130,
+178, 83,175,255,116, 5, 34,206,226,104,207,240, 2,164, 60, 19,105, 58,245,135, 83,249,228,121, 63,187, 93, 76, 5,127,211, 53,
+195,244,103, 37, 8,175,137,215,218,192, 76,142, 48,101,114, 58,189,168, 16,188, 24, 51, 27, 57, 74, 33, 42,206,254,140, 11, 55,
+ 59, 16, 58,177,229,116,236, 62, 29,118,152, 51,180,184, 25,228, 0, 59, 61, 53,158,233,218,167,186, 4,170,164,193,105, 68,171,
+ 16,150,112, 99,157,246,115, 31, 39, 75, 51,142,110,190,197,202,198, 83,136,180,207,123,127,242, 91, 12,186,175,176,241,209,101,
+ 86,190,231,251, 80,139,151,176, 71,239, 48,126,247, 13,134,119,239,114,248, 78,151,198,249, 14,197, 56,103,238,137, 11, 4,237,
+ 21,100,220,194, 78, 18,138,110,159,124, 84,146, 77, 36,195,221,156, 47,253,246,203, 60,126,126,158, 34, 29, 50, 26,101, 36,133,
+ 65,121, 30, 74,128, 39, 44, 65,224,161,148,102, 56, 76,136,180,100,121, 62,166, 63, 46,104,180, 98,198,227,148,192, 55, 4,161,
+ 66,218,156,120,177, 93,101,129, 23,212, 23, 27,132,157, 22, 65,172, 9,180,162, 28,165,132, 18,174, 46,183,200,114,203, 82, 67,
+129, 54, 28,164, 9,131,204, 81,213,186, 54, 99,161, 1, 77,237, 70,193,161,167, 25, 23, 5,117,165,232,248, 26, 95, 56,251,107,
+224, 73,180,146,248,210, 21,198, 16,195,237,193,136,185,165,121,130, 56,230,238,245,215,241, 61,133,239,105, 90,161,207, 40, 45,
+240, 3,133, 86,218,113, 12, 4,248,129, 95,225,128,181,227,135,148, 37,218,147,168, 71,174, 50,216,219, 38,200,199,136, 32, 56,
+189,166,165, 64, 8,215,173, 75,173,176, 72,183,234,243,181,251,198,121,218, 77,128,234, 45,132, 21,228,113,200,176,179,136,149,
+138,180,223, 39,104,175,208,252,232,247,225, 47, 46, 99,183,223,115,209,218, 90,129,146,212, 87, 47,226, 63,122,149,207,255,202,
+191, 96,251,238, 77,180,148,140, 51,195, 40, 47,153, 20,182, 2,208,184,245, 85,110, 64, 73,229,152, 10, 37,196,158, 36, 86,146,
+ 80, 75, 58,190,166, 30,250,104, 91, 98,243, 20,112, 63,159,203,136, 50, 94, 96,191,223,103,144,164, 46,155, 66,224,248,241,211,
+240, 21,156,226, 61, 86,130,118,224,177, 90,139,168, 43, 15,139,229, 36, 41,220,225,194, 90,114, 99,201,172, 19,198, 9,225,158,
+167,230, 41, 98,165,137,148,197,147,130,154,148,196,213, 89, 53,183,150,242,204,100, 14, 33, 48, 2,148,117,174,165, 72, 10, 22,
+ 3,197,178,231,209,212, 26,245, 51, 63,249,119, 62,219,216,120,134,253,183, 95, 65,218,156,209,222, 46, 11,155,231,136, 23,151,
+208, 65,136, 53, 6, 29,197,152,210,210,189,123,143,209,209, 33, 43,143, 95,198,175,181,241,107, 13,186,247,238,208, 92,223, 96,
+120,124, 76,127,239, 0,207,211, 68,205, 8,161,125, 38,195, 33,113,171, 73,125,161,205,240,168, 71,125,101,137,108, 52,164,189,
+121,209,125,209,131, 90, 37,248, 49,148,195, 19,100, 24,131, 80,216,113,159,104,101,141,236,248, 16, 97,114, 6,219,119, 8,154,
+ 77,250,219,119, 8,231, 86, 33,205,208,157, 5, 6,119,111, 18,119,154, 12,119,142,153,187,250, 4,249,201, 9,113,163, 65,231,
+194, 35, 8,169,145,126,200,241,253, 7, 72, 79,115,112,119,139,195,251,119,232,237, 30,186,125,173, 84,136, 20,154, 75, 49,195,
+147,130,116,116,130, 48, 5,147,108,136,231, 69,108,189,187, 71, 35,130, 39, 62,249, 18,255,238,151, 62,207, 51, 31,187,128, 31,
+205,177,188,185,134, 36, 96,255,206, 45,206, 93,189,192,238,182,101,243,156, 98, 50,177, 14, 55,184,186, 64,158, 73,202,178,164,
+221, 9,169, 45,204,147,229, 30,245,205,199,169, 47,172, 35,188,128,197,139, 87, 72,122,199,244,182,238,211,221,221,165,181,186,
+ 73,103,101, 25, 21,248,180,215, 54,144,158,100,126,243, 34, 15,223,250, 38,115,235,231, 72,135, 19, 12, 41,199,247, 30,210,152,
+159, 67, 5,158,227,239, 43, 53,179,250,228, 89, 89,249,189, 45, 65,163,195,173, 95,251,151, 88, 3,185,132,212,194,184, 18, 48,
+ 73, 4, 53, 37,104, 90, 73, 75, 40, 34, 4, 30,138,176, 54,135, 40, 11, 68, 54,118, 90,134,105,172,165, 16, 72,169,102,241,154,
+ 51, 69,183,168, 20,205, 51,175,177,187, 33,159,251, 91, 63,197,227, 63,243,175, 79, 71,165,229, 0,178,209, 25,236,105,101, 99,
+ 26, 15,201,123,123,108,191,254, 26,183, 94,123,149,251,111,189,201,241,193, 1,233,120, 76,154,101,110, 85, 92,173, 15, 76,149,
+122,160,181, 66, 88,139, 18, 2, 37,221,151,217,148, 6,173, 53,198, 22, 20, 89,138,177,101,133,254,117,163, 97, 37, 36, 58,240,
+ 81, 65, 72, 88,171, 97,181,166,227, 91,202,183,175,161,214, 54,144, 90, 99,173,229,228,181, 47,146, 29,110, 79,229,109,174,187,
+158, 6,180,216,211, 92,117, 91, 85, 78,113,182,168,114,246,165, 85,143,153, 69,142,158, 90,179,196, 25, 13,130,157,122,196,171,
+ 93,249,251,246,241,226,108, 39, 95,165,176,153, 51, 25, 38, 83,204,140,176, 51,235,215, 20, 22,115, 26,228,114,186, 87,159, 37,
+197, 33, 16, 94,224, 34,115,229, 41,142,117,250, 58,102,190,123,113,198, 73, 40, 78, 19,182,102, 51,192,170, 91, 16, 38,165,152,
+116,177,197,176,186,169,155,234,181,159,241,192, 35, 78,163,118,207, 38,181,157,129, 9,113,150,127, 48,133, 25,205,108,106,118,
+182,134, 48,165, 57,197, 6,203,111, 57, 97, 86,215,182, 21,118,182, 32, 17,128,142, 2, 26, 31,248, 56, 50,108, 80,230, 67, 22,
+ 23,150,216,254,210,175,162,162,123,172,127,228,131, 52, 94,248, 56,102,210, 71, 80, 80, 28, 29, 50,217,223,119,113,173, 69, 6,
+147,140,193,195, 62, 81,251, 89, 38,247,187, 52, 31,121, 12,123, 82, 98,242, 22,121,226,243,205,255,247,139,188,241,229,183,248,
+228, 75, 87, 56,238,238,113,243,222, 17, 71, 73, 73, 90, 77, 31, 66, 79,184,204,140,188,192,179, 37,101, 97,152,111,187,107, 51,
+110, 5, 20, 69, 78,103,121, 17, 83,102,204,173,181, 41,210,140,230,249, 11, 88,105, 9,219, 13, 68,105,208, 81, 72,109,101, 13,
+ 89,142,208, 90, 18,215, 2,138,194, 82,100, 5,213,154,151, 88, 27,106,177, 69,123, 14,204, 21, 87,186,135,208, 83,164,101,137,
+174, 14, 86,115,113, 64, 40, 37, 94, 85,204,125, 95, 19,123,154, 88, 43, 94,239, 77,152,251,192, 21, 22, 22,231,216,187,119,143,
+189,219,183,104,212, 99, 60, 79,161,165,163,203, 25, 36, 82,187,236, 0, 91, 58,225,168,246,131,138, 98,168,170,245, 12,216, 52,
+135,185,101,210,246, 42,102,247, 14,158, 22,224, 5, 14, 53, 44, 65,248,142,229, 46,164, 67,144,219,202,179,149,151, 37,214,143,
+136,154,115,100,245,136,174, 41,209,198,197,106,155,162, 36, 79, 82,234,173, 22,165, 12,105,126,251,247, 19, 54, 66,134,247,111,
+ 49,216, 59,102,227, 63,253, 49, 0,254,232, 55,126,145,222,225, 14,194,194,164, 40, 25,100,134,172,180,192,233,168, 28, 41, 9,
+252,144, 52, 75,241,181, 99,188,251,190, 36,214, 30,115,113, 64,221,243, 8,148, 66,226, 4,162,105,150,147,251, 77,250, 89,193,
+238,241, 46,198, 24,124,229, 81, 15,124,202,162,112,158,243,234,240,174,133,160, 30, 72,230,194,128,245,102, 11,191,204,176,165,
+ 97, 84, 88,210,210,184,172, 0, 99, 49, 86,184, 73,134, 83, 21,209,110,214, 88,109,206, 35,242, 33, 30,142,251, 46,133,194,106,
+205,184, 52, 51,206,188,154, 81, 51,221,222, 94, 33,168, 43,201,162,214,204,123,138,134,167, 81,159,253,217,159,250,108,145,116,
+177,101, 65,125, 97,137, 50, 77, 65, 88,130,133, 11,236, 95,127,133,198,234, 58, 71, 55,111, 80,150, 9,131,157, 29, 22,206, 47,
+ 83, 63,247, 52,111,253,222,111,179,125,227,117,148,231, 97,198, 3, 22, 31,127,146,241,241, 9,173,149, 21,172,129,157,119,223,
+101,245,242, 5,198, 39,125,252, 56,102,225,194, 69,132, 16, 68,115,139,232,184, 6, 74,161,162, 38,229,168,143, 12,155,238, 6,
+229, 69,148,201, 8, 29,215,193, 42, 84, 24, 97,139,156,104, 97,141,180, 63, 32,106, 55,145, 94,132,110,181,217,127,237,235,196,
+243,115,110, 47, 83, 26,162,229, 85,202, 36, 99,235,250,117,218,155,107, 36,131, 49,239,124,233, 47,200,250, 71,132,245,144,241,
+ 96, 76, 28, 6, 12,142,143,104,180, 27, 68,173, 58,249, 4,194, 72, 49, 56, 58,161,181,208, 32, 77, 75, 58,139, 13,130,230, 28,
+ 90, 40, 54,159,126,156,111,252,209,171,188,240,177, 39, 89,127,246,195, 20, 89,201,238,189, 29,238,221,188, 75,179, 41,104,204,
+157,163,187,181, 69,107,190,197,160,123,136,149, 22, 73, 73,239,240,128,214,114, 11,191, 94, 35,207, 36, 81,115, 5,101, 11,182,
+175,125,141,254,222, 13, 6, 7,199, 60,242,209, 79,209,222,220,100,235,218, 43, 4,181, 22,249, 36, 97,251,173,119,104,174, 44,
+ 16, 55, 26,196,173, 38,163,238, 9,221,123, 15,121,235, 11, 95,224,241,111,255, 24,227,193, 0, 63,170,161,195,128, 34, 51,232,
+106,247, 56,153, 56, 60,100,158, 21,168, 40, 64, 43,201,209,181,175, 50,218,189, 71,102, 44, 35,229,138,187, 5,180,128, 16, 73,
+ 75, 72, 26, 66, 17, 11, 69,224,215, 8,162, 14,214, 76,170,252,108, 59,131,151,156,197,165, 79, 39,177,114,118,219,172,110,184,
+202,229, 54, 63,250, 15,126,129,245, 31,250,209, 74,189, 60,192, 78, 14,177,121, 62,235, 6,177,134,114, 60, 98,178,191, 77,247,
+238,109,182,111,222,100,247,193,125, 38,227,145,219, 69,102, 25,101,158, 33,172,179, 34,153,178,196,243, 20,121, 81,128, 45, 41,
+138,156,210,148,212,163,128,164, 44, 41, 77,201,168,215, 69,135,117,130, 40,162,168, 40, 89,158, 31,225,249, 30,194,243,209, 81,
+ 4, 64, 16,213, 16, 65, 72,156,244,225,230, 55,241,151,214,144,139, 75,179,132,191, 50,207,233,191,242,103, 78, 41, 62,197,189,
+ 86,122,129,233, 72,119,134, 36,149,156,137, 60, 61, 83,236,166, 34,174,106,173,207, 20,178, 51, 27,191,159, 13,115, 57,203, 87,
+ 63,131,215,157,238,166,167, 59,242,105,188,170, 18,239, 3,203, 76,177,183,150,138,238,103,207, 28, 50, 92, 42, 13, 50,104, 84,
+ 94,255,170,183,151,142,206,104, 77,126, 42,218, 57,243, 1,139, 51,175, 71, 40, 89,101,183, 11, 48,242, 52, 22,246,253,211,126,
+231, 76, 96,106,189, 63, 45,224, 83, 40,207,244, 26,154, 22,225,217,241, 66,201, 83,133,251, 20,192, 83,169,251,165, 58, 19,254,
+161,228,153, 20, 64,197, 41, 58,206,173,116,102,172,248,138,150,232, 62, 31,229,222, 87,229,209,254,142, 31,161,246,220, 75,152,
+116, 68,122,124,128,121,243, 75,216,248,136,246,229, 75,132,235,231,156, 48,137,128,124,251, 14,233,254, 3,108, 50, 97,114,208,
+ 71, 71,138,178, 40,104,159, 95,160,126,126,137,225,253,140, 27,191,254, 5, 66, 95,177,123,231, 33,127,252, 11,191,201,242,188,
+ 96,113,197,242,213,111,190,203, 56, 73, 25, 76, 74,226,154, 71, 97,220, 65, 58,181, 2, 91,150,196,194, 18, 41, 65,187, 25,177,
+220, 9,136,162, 0,169, 4,121,110, 24,246, 83, 55,113, 42, 38, 8,105, 73, 71, 3,226, 86, 19,237,215,177,210,160,252, 16, 91,
+166, 88, 83, 82, 38, 41, 58, 12,153, 12, 19,234, 53,207, 29,218,243,146,126, 82,226, 11,156, 6,166, 44, 81, 74,146,100,153, 11,
+247, 16, 48, 31,249,244,210,130, 21,207,195, 87,174, 96,212,124, 69,224,121, 60,148,146,219, 43, 29,158,248,244,139,212,195,144,
+127,243, 27,191,131, 60, 57,100,126,177, 77, 45, 14,136,234, 13,116, 37,246, 10,226, 54,121,153,187,216, 96, 33, 81,190,154,165,
+227, 10, 81,117,236,211,233, 78,197, 17, 40, 22,207,147, 10, 5,189, 61,180, 0, 17, 71,160, 93,103, 47,167,102, 15, 37, 72,138,
+ 2,171, 3, 26,107, 23, 25,248,138,126, 62,113, 17,169, 2,138, 60,199,162,171, 41,145, 70,123, 30, 73,247,152,249,103, 62, 72,
+231, 67, 47,177,252,210,247,204,172, 98,119,111,188,206,189,119,174, 33,112, 57,228, 89,225,242,205,157, 63,221, 98,133, 98,105,
+105,133, 86,187,197,104, 60, 64, 25, 23, 87,237, 41, 73,203,211, 44,134, 1,205, 32,196,151,202,161, 91,171, 85,219,120, 56, 96,
+239,248,144,180, 40,240,149,164,221,108, 83, 15, 2, 38,201,132,194,184,231, 23,184, 66,219, 9,124,174,158,187,204,230,226, 26,
+ 50, 29,129, 49,140,139,130,110, 90,208,203, 74, 70,165,197, 15,154,188,176,241, 2, 63,244,237,127,141,255,228,211,159,225,197,
+181,143,178, 17, 63,193, 83,143,126, 39,123,135, 55,144,197,136, 90,163, 69,161, 4,105,146, 97,113,205,140, 16, 2,173,221,247,
+ 85, 33,240, 17,204,121,138,165,192,163,237,105,106, 90,185,216, 86,165, 36, 81,107,158, 34, 75,193, 26,162,185, 21,210,195,109,
+226,249, 69, 78,118, 14,128,146,246,185,203,120, 94,141,160,217,226,240,237,215,241,131,152,149, 71, 54,241,162, 58, 94,173,198,
+ 55,127,255,247,217,124,234, 81,182,223,125,151,168, 22,178,249,228, 85,210, 52, 39, 8,125,230, 47, 93, 37,237,247, 41,210, 4,
+ 79,187,177,167,210, 62, 38,155,160,235,109, 76, 50, 68,214,218, 80,184, 96, 22,119,101, 4, 20,131,125,167,202, 47,114,124, 95,
+161,226,121, 76, 54, 33, 57, 62, 98,241,202, 21,118,223,248, 6,107, 47,126, 27,181,204,114,120,237, 85, 14, 31,108,177,184,185,
+198,164,215,229,250, 31,253, 49,235, 87,174, 16, 4, 43,188,241,133, 47,209, 88,210,216,246, 42,243,235,235,236,223,191,195,130,
+202,232,108,174,147, 28, 13, 17,162, 4, 60,154,243,117,154,171,143,208,219,222, 39, 47, 18, 14, 31,236,241,216, 11,143,211, 90,
+ 95,228,238,235,239,112,239,230,219,100, 19, 73, 58,220,229, 3,159,248,110,182,222,217, 37,170, 67,191, 63, 32,140, 98,198,253,
+ 30,225,230, 42, 94,212,164, 62,215,153,249,145,203,172,143, 53, 33, 79,126,223, 15, 35,131, 26,197,184,207,221, 47,254, 17,173,
+ 11,143,178,120,254,113,134,199,199,172, 63,121,133,214,104,137,225, 65, 15,177,164,176,101,206,197,231, 63, 0,192,230,115, 79,
+147, 37, 57,139,231, 55, 57,217, 59,164, 62,191, 64, 16, 85, 59,168,204, 34,173, 65,133, 17,161, 86, 46, 21,171, 44,121,226,111,
+255, 52,219,111,124,177, 58, 11, 22,104,227,138,185,181, 22,173,221,126,199, 17,208, 4,148, 99,210,193, 54,210, 22,136,105, 82,
+ 31,118, 22,220, 80,230,133, 99,133, 76,215,150, 85,199,110,167, 5,198, 88,174,252,179, 95,103,225,195, 47, 97,108,129,152,236,
+185,226,160,156, 69, 5, 33,161, 72, 33, 47,200, 70, 3, 70,135,135, 28,110,239,208, 59,216,167, 44, 10,108,158, 83, 20, 57,121,
+ 81, 58, 79,184,112,214,178, 73,146,162,211,148,143,125,248,131, 52, 58,115,200,241, 8,211,159, 56,213,123,123, 14,121,233, 42,
+121,123,158,131, 91,111,243,181,223,252, 55,248,181,208,217, 61,242, 9,134, 26,100, 41, 70, 73,132,246,241,155, 77,130,209, 49,
+234,238, 13,104,118, 80, 65, 12,121,138,245,124,108, 94, 48,255,109,223,195,189, 95,248,135,216,202,143,110,166, 81,115,114, 42,
+246, 23,167, 5,187,218,119,155,217,254,253,244,192, 99,103,190,107, 78,227, 69,229,116, 74,124, 6,226, 82,217, 13,169,252,232,
+ 74,156, 73,133, 59, 99,216,158,118,243,166,180, 51,193,158, 59, 48,152, 74, 33,238, 64, 56,214, 0, 74,206,246,228, 42,158,195,
+107,159, 39, 63,186,131, 73,186, 85,231,158, 82,154,108,246,188,198, 58,134,128,153,230,196,207, 94,139, 58,205, 66, 47, 45, 66,
+249, 24,147, 51, 37,229,184, 75,164, 74, 99,155, 41,238, 45,198, 8, 78,227,237,220,223, 42, 85,224,132,176,213,126,213,177,239,
+ 29,104,105,170, 81, 64,186,247,114, 10,193,177,198,204,208,186,148,103,243,122,237, 76,160, 57,243,222, 79, 83,220,166, 7, 49,
+ 83,233, 55,164, 32, 94,217, 36,126,250, 99, 48, 62, 36, 79, 70,232,228, 16, 61,215, 37, 90,186, 68, 49, 73, 40,114,141, 85,117,
+ 14,255,252,183,104,172, 95, 64, 6, 13,132, 13,240,130, 35,132, 23,160,124, 65, 54, 25, 51,120,112, 29,191, 85,242,216,127,252,
+ 12,247,255,244,109,182,223,237,243, 93,127,243, 50, 95,253,211,111,176,211,205, 41, 61,197, 73, 90, 80, 6,154,222, 40,119,176,
+ 18, 91, 82,243, 20,120, 2,133, 98, 96, 21, 53, 9, 73, 90, 66,154, 48,206, 74,254,228,225, 24, 48, 92,238, 4, 60, 60, 86,124,
+224,114,147,213,185,144,225,225, 17,126,109,136,144, 10, 47,148, 4,205, 57,138,100, 66, 99,173, 73, 89, 40,250,199, 71,100, 35,
+ 67,187,237,209, 29,166, 88, 5, 99,107,209, 82,162,181,160, 63, 73, 17, 8,146,162,164, 89, 11, 72,139,130, 70,228,243,236,147,
+ 11,172,198,138,219, 38,162, 27, 53, 72,227,136,197, 40,164, 53, 72,248,220,255,244,203,220, 62, 74,248,204,167,159,166,217,174,
+227, 73,137,231,251, 40,169,144, 97,132, 23, 73, 50, 27,146,110,237, 35,215,234, 40,223, 35, 29,141,220,244,170,116,105,141,178,
+ 44, 81,158,135,180,194, 77,192,140, 0,147, 99, 90,115, 76, 22, 86, 92,156,237,254, 3,130,100,140, 23, 70,206, 46,106, 53,227,
+195, 62,162,179,132,141, 58, 28,235,130,178,204,156,120,190,116,150, 69, 59, 77, 63,195, 50,233, 62,116,135,191,194, 50, 58, 58,
+166, 54, 63, 71, 81,148,238,224, 1,116,218,115, 4,202,185, 46,181,144,248,194, 98,148,164,200, 12, 82,192,252,210, 34,115,173,
+ 57,182,118,239,145,231,238,179,210, 21,159,223,171,214, 81,194,150, 88,171, 48,198, 77, 35,203,188, 64, 80, 34, 37,172, 47,156,
+ 35, 41, 50, 14,142,247,201,147, 9,145,150,179, 48, 36,137, 37,212,138, 11,171,231, 88, 90, 88,165, 24,239,163, 61,141, 10,214,
+216,104, 47,242,216,194,179, 60,114,233, 81,100,161, 56,218, 57, 96, 56, 72, 57,218,219,231, 88,245,137,163, 6,163,254, 14, 39,
+ 59,199,252,165, 79,253, 87,204,207, 55,248,191,127,231, 31,209,239, 15,170,104,233,234,171, 80,233,102,164, 4,105,160,230,185,
+ 78,189,174,192, 87,202,117,243,255,240,167,254,238,103,165,246, 73, 78,122, 40, 79,161,149, 66, 55, 58, 12,119,183,104,158,191,
+204,225,245,111,176,246,226, 75, 20,253, 1,147,126,143, 98,124,194,238,205,183,217,124,246,105,218,231, 31,197,148,160,195,136,
+185,213, 85,188,160,134, 48, 5,101,150, 35, 61,133, 23,196,172, 60,253, 44,199, 91,187,236, 92,127,157,206,234, 10,209,252,178,
+219, 13,248, 49, 38, 75,156,232, 32,172, 65, 89,184, 19,182,210,160, 98,204,164,143,106,204, 83, 12,187,238, 48,215,156, 35, 59,
+222, 67,215,155, 88, 11,253,237,251, 52, 86, 86,209, 97, 72,210, 31, 80, 76, 50,206,125,228, 69,118,111,188, 77,127,119,151,203,
+ 47,126, 27, 24,195,209,214, 46,100, 22,115,248,144,230,198, 2,147, 81, 74,232, 69,120, 90, 99,200, 73, 38, 5,163,227, 99,148,
+103,177,182,100,112,120,204,253,183,110,177,176,220,166,181,190, 76,154,101,116,183,247,216,190, 59, 64, 23, 71, 40, 17,176,190,
+ 25,209, 90, 59,207,253,155, 15, 81,118,136,181, 62, 90, 59,193, 78,216,168, 83, 38,134,100, 50,100,112, 50,196, 24,131,145, 62,
+181,185, 85,138, 36,225,248,221,183,208, 81, 76,231,145,199, 24,119,187, 88,161, 72, 71, 93,252, 90, 11, 47,240,241,227,136,193,
+225, 33, 74, 41,164,138, 56,217,223,165,185,184, 80,217,152,132, 11, 41,177,178,138, 18,117,194, 15, 63, 10,157,127,125, 90, 0,
+172, 37,152, 91,228,198,255,249, 47, 73,149, 32,197,160,172, 64,149,206, 42, 21, 35,104,162,168,161,136, 42,216,140, 82,226, 52,
+143, 76, 56,139,213,148,239, 46, 4,239, 71,132, 86,193, 42, 83,165,245, 51,191,248,121,230,158,251, 40,198, 38,136,180, 11,126,
+ 13, 17,212, 29, 12,166,200, 65, 64,126,210, 37, 79, 38,140,246,247, 56,126,184,195,184,223, 39, 75,179, 74,161, 94, 84, 32, 25,
+ 11,148, 76,134, 14, 48,241, 93,159,249,126,174, 62,255, 44, 97,105, 40,143,186,228,147,132, 34,201, 72,135,137, 27, 5, 74,167,
+240,111, 92,190,202,213,239,254,203, 76,142,119,216,186,113,147,184,217,114,187,191,169, 2,127,110,145,150, 73,177,111,189,134,
+141,106,196, 75,171,200,213, 53,103,236,196, 34,189, 0, 25, 68,152, 44,161,127,237,213, 89,199,104,207,128, 88,202,242,212, 83,
+250,173,209,240, 83,255, 62,226,253, 81,171,211,241,183,152,213,186, 51,221,182,169, 34,103,205,153,214,183, 18,184,185,115,128,
+ 56,165,196,205,118,229,167,145,180,239,139,151,253,150,137,246,148, 18,105,243, 17,101,210, 59, 5,248,188,143, 26,247,126,235,
+219, 44, 60,103,250, 59,170,110,123,134, 2,150,166, 66,222, 78,163, 85,191,101,175,125,198, 25,225, 84,241, 18,161, 93, 40,135,
+205,211,211,189,247,244,119,152,179,161, 57,204,184,249,238,117,201,247, 61,159,144,170, 58,196,216, 51, 58,129, 10,242, 83,141,
+ 38,103,147,129,138,204, 39,172, 32,184,240, 36,205,231, 63,137, 48, 99,138, 73,138,188,246,235,168,102, 3, 83,230, 20,131, 62,
+123, 91, 61,186,119,110, 51, 28,166,244,222,121,143,206,165,117,252,133,117,228,229, 79,161,149, 65,170, 9,163, 7,135,148,153,
+ 96,248,240,132,175,253,193,235,156,136,140, 15,126,236,121,190,246,229, 47,113,255,168, 96,144,150,228, 5, 12, 51, 80, 88, 6,
+ 73, 65,164,221, 8, 54,210,146, 64, 73, 78,140,170, 14,109,130,122, 77,115,104, 32,199, 23, 0, 0, 32, 0, 73, 68, 65, 84, 60,
+ 44,248,221,251, 3,234,158,228, 19, 27, 49,207, 95,104,179,218, 82, 8,207,226,135, 62,218,151,152, 36,113, 43, 0, 33,208,161,
+ 79, 52,191,130,240, 60,198, 7,123,180, 86,151, 42, 7,137,160,213,169, 65, 90,224,107,133,242, 53, 7,195,132,113, 94,178,212,
+174, 17,249, 18,223, 19,152,188,164, 95, 88,158, 88,171,179,208,138, 89,244, 13, 23,188,130,243,102,204, 47,125,254, 21,254,232,
+ 43,111, 18, 7, 18,223, 87, 92, 90,234,208,170,135, 21,194,187,134, 31, 69,132,245,182,139,220,142,234,228,233,136,165,222, 14,
+157,249, 6, 38,172, 57, 11, 98,133, 71, 46,138,220, 29,110,181,118,247,189,162,192, 72,167, 49,177, 88, 74,161, 40, 23,214, 72,
+ 91,203, 76,226, 22, 99, 47, 34,245, 66,204,202, 6,114,101, 21, 81,243, 29,141,173, 44, 93,206,120,145, 99, 74,131,201, 12, 74,
+187, 67,112, 89, 22, 96,170,247,197,143,241, 27,117, 60,223,101,121, 80,228,220,248,234,159,178,127,235,117,154,190,118, 28,244,
+ 42,162, 52, 53,110, 12, 95,148, 37,135,199, 71, 28,245, 71, 8, 43,136,125, 15,129,165, 17, 72, 22, 34,159,133,192,167,174, 53,
+129,214, 40, 85,209, 26,133,164, 40, 75,210,172, 32,208,210,137,200,203,148, 70,123,142,110,146,209, 79, 75,178,194, 29, 36, 67,
+ 33,249,207,127,226,167,249,190,191,242,227, 92,124,246,123,169,197, 47, 18, 54,175,114,238,209, 15,243,200, 83,143, 48,233,229,
+228,137, 96,119,235,152,238,241, 17,145,223, 33,235, 91,182,222,221,166, 63,114,150,241,253, 59, 7,236,239, 30,242,228,227,223,
+201,230,242, 21, 30,244,110, 48, 46,114, 23,237, 90,245, 97,190,112,187,244, 57, 79,179,236,123,204,123,154,166,246,240,164, 69,
+ 75, 79,161,226, 6,229,222, 67,252,214, 38,200,144, 98,212,199,175,185, 78,102,243,197,143, 67,105, 41,243, 49,229, 36,161,182,
+186,204,194,218, 5,164, 23,208, 63, 60, 96,255,157, 27,228, 73, 2, 24,180,167,137, 91, 29,218,171,235,120,177, 59,137,149,165,
+ 33, 57,222, 99,243,233,171, 68,139,171, 8,237,185,147, 80,158, 32,131,176,234,127, 20,144, 99,139, 2,225,197, 96, 50,100,220,
+198,166, 67,135,129, 21,146,108,255, 1, 94,107,145,180, 55,100,176,115, 7, 51, 30, 17, 61,250, 56,197,104,130, 31, 69, 72, 45,
+121,248,213,175, 50,218,222,230,210,167, 63,206,193, 59,119, 41,210,148,160, 22,176,118,229, 60,194, 94,196,228, 9,254,124, 78,
+ 54,129, 81,255, 24, 63, 47, 17, 6, 22,214,150, 93, 16,189, 47,233,119, 7, 60,246,161,199,241,235,203,236,189,251, 46,245,185,
+ 58,195,147, 49,118,210,167,190,216, 68, 17,176,118,229, 2,183,190,126,147,108,208,197,171, 27, 4, 33,141, 86,131,122, 39, 34,
+ 29, 38,120, 81, 72,153,105,210, 65,159,163,209, 45, 26,115,171,212,151, 47,176,254,244, 83, 40,241, 52,101, 81,114,120,239, 62,
+173,141, 13,130, 90, 76, 50, 88,100,176,127, 64,212,168,163,116,128, 45, 74, 60, 63,158,141, 54, 15,239,111,209, 94,154, 99,231,
+221, 59,172, 63,249, 4,147,193, 9,121, 63, 33,174,207,225,215, 60,246,239, 60,100,233,226, 6,195,163, 94,117, 56,208, 88,165,
+ 88,184,250, 65,142,223,122,133, 80, 40, 66, 97, 40,181, 32, 1, 2, 43,221,110,109, 86, 49, 78,239,148,114,154,103,173, 92,199,
+ 52, 29,105, 26, 99, 92,225,159,218, 84,170, 74,117,229, 31,253,175,180,175, 62,143,201, 7, 8,155, 64,216,170,212,210, 25,102,
+ 60, 0, 41, 41,251, 3,134,199, 71,152, 52,225,224,254, 67,250,199,199,140,135,125,138, 18,138,116,130, 45, 45, 69,150,160,148,
+226,164, 59,224, 67, 47,189,200,163, 31,255, 54,184,123, 23,115,251,144, 50,113, 99,249, 50,205, 73, 71, 35,242,172,196, 71,225,
+117, 18,132, 30, 32,187, 71,216,122,131,103,126,240,175,241,216, 39,255, 50, 95,252,220,255,194,176,127, 66, 51,136,201,133,100,
+ 49, 16,120, 59,119, 73,194,186,139,145,213, 62, 52, 26,174,186, 20, 5,214,142,177, 42,224,220,223,254,111,217,255,147,255,135,
+188,119, 52,195, 69, 90, 91,113,221,171, 34,235,196,216, 83,123,155,173,188,250,167,162,180,153,242,124,218,176,150,165, 83,252,
+170, 10,194, 51,165,186,205,242,219,205, 25,129,221,105,140,226,105, 10,171,251, 61,166, 0,229,201, 25,102,247,116,133,111,103,
+135, 46, 91, 26,108,181,215, 52,147, 1, 38, 25,184,241,245, 25,143,183, 19,235,169,170, 3,183,223,226,181, 59,189, 22,166, 68,
+ 57,103, 15,203,103, 99, 25,107,156,237,207, 22,230, 52,164,198,158,218,237, 78, 45,126,110,231,110,146, 12,200,171,157,187, 61,
+179, 62, 56,203,181, 63, 21, 12, 88,170, 48, 23,113,122,112,177,101,121, 6,144,127, 54,231,190, 34,225,201,234,239,154,101, 7,
+ 72, 84,115,142,250, 99, 47,224, 53,125,242, 99,200,222,250, 19,188, 0,242,188,192,164,130,227,126,136,231, 11,110,191,249, 14,
+ 91,183, 14,248,195, 55,186,252,252,149, 13, 66, 83,146,223,252, 11,100,216,164, 40, 67,196,220, 18,227,157, 67,240, 21,163, 97,
+193,181,131, 29,158, 92,223,161, 20,150,126, 82, 98, 44,140,178,146,113,105, 89, 16,146, 64, 11,226,192, 89,254,188, 80, 82, 34,
+240,139,130, 56, 10,200,242,130,193,216,240,103, 91, 3, 30,105, 5,204,105,193, 70,199,195, 11, 44,173, 86,232, 86, 72,121, 78,
+153, 27,252,192, 7, 83, 56, 65,232, 73, 15,161, 53,198, 58,219,153, 64,145, 13, 70, 24, 33, 17, 5,212, 27, 30, 40,141, 82, 62,
+187,189, 20, 45, 36,105,101,100, 54,182, 36, 14, 60,242,209,152,163, 73,193, 5,225, 8,116,198,228, 8, 3, 63,240,244, 50,159,
+ 27, 37,164,133, 64,107, 15, 95, 75, 26,205, 22,126,228,227,199,117,119, 95,148,150,218,242, 6,253,222, 8,132,207, 32,135,205,
+193, 1,243,131, 3, 70,243,155,140,189,134, 91,133, 72, 67,153, 87,238, 10,173, 29,251, 95, 56, 48,144, 82,194, 1,102, 76,225,
+198,245,158, 70, 6, 53,164,210,120,161,143, 45,115,164,242, 40, 75, 67, 89,150, 20, 89, 89,133, 31,149, 85, 84,180,116,239,135,
+ 20,100,201, 0, 93, 20, 12, 15,183,208,113, 72,103,115,195,137,222,246,182, 24,237,220,102, 49,114,185,239, 77, 93,226, 75,152,
+ 20,166,186,252, 5,163, 81, 66, 90, 58,144, 82, 28,213,152,111,183, 25, 84,141,163, 22, 98,102,183, 21,213, 36, 76, 9, 80, 24,
+ 66, 37,153, 11,125,114,147, 82,146, 33,226, 6,182,185,132,232, 13, 41,203, 33,182, 2,120,157, 63,119,129,103, 54, 94,226,104,
+111,159,147,123, 39,236,239,110, 97,169,193, 80,209,125,227,132,116, 56,226,221, 55,238,177,120,174,193,194,194, 10, 15,223, 59,
+228,246,193, 3,164,167,144, 24, 26,145, 79,232,121,196, 65,147,238,222,128,250,194, 42,127,227,123,127,158,255,253,247,254, 30,
+253, 97, 23, 20,232,106,133, 82, 71,177,160, 21, 45, 1, 17, 2,101, 12,210, 74,212,207,253,220,207,124,118,240,240, 46,141,213,
+ 85,242, 65, 15, 85,107,146, 28,238, 17,117,230, 40,178,140,221,183,175,115,239,155, 95,199, 26, 67,109,110,158,228,228, 24, 99,
+ 75,154,107, 27, 28,188,253, 22,139,143, 92, 34,110,213,169, 53, 91,120, 97,200,168,123,132,246, 4,241,226, 18, 97,107,129,193,
+206, 14,243,151, 30, 3,161, 80,126,128,144,202,141,243,138, 28,169, 29,120,198,205, 31, 53,152,188, 42,234, 37,229,100,128, 45,
+ 82,172,201, 73,123, 93,194,249, 5, 80, 13,122,183,175,211,222, 56, 71,109,121, 13,225, 5, 12,247,246,185,245,149, 47,178,124,
+229, 81,210,126,202,155, 95,124,153,181,203,203, 24, 35,185,119,237, 29,172, 77, 56, 57, 60, 96, 60,238, 97,132,198,100, 2,108,
+ 65,103,117,149,213, 43, 87,137, 91, 11,140, 6, 19,116,168, 9,234,243, 92,127,249, 85, 26,157,144,254,193, 17, 81,173,201,209,
+126,143,251,215,111,176,180, 22,178,124,126,147,184, 51, 79,150, 20,148,121,128,192,178,254,216, 26,158, 8, 80,113, 68, 54,154,
+208, 94,233, 32,253, 22,153,173,145,140, 38,120,162, 68, 43,205, 99, 47,253, 32,227,163, 3,190,250,185,159,231,220,135,190, 3,
+161, 37, 39,219, 15,240,227, 6, 32,209,190,239, 10,155,246, 93, 65,181, 37,121,154,209, 89, 89, 38, 25, 78,248,242,175,253, 50,
+ 27, 79, 61,203,238, 59, 55,153, 63,183, 73,216,104,114,244, 96, 11, 29,170, 74, 21,108,136,106, 53, 55, 26, 5,140,144, 68,237,
+ 5,238,254,217,111,161, 45, 68, 72, 2,225,178,215,106, 8,154, 72, 98, 79,163,109,149,151,110, 79,187, 62, 99, 79, 45, 81,211,
+105,170,115,160,156,102,157, 75, 41,120,236,167,255, 21,203,159,254, 15, 48,217,145, 11, 83,208, 53,119, 91, 46, 50,202,113, 31,
+147,141, 41,198, 99, 70, 7,251,116, 31,110,209,219,217,229,164,219,101, 50, 28,144,167, 46,102, 16,235, 40, 14, 38,207,233, 29,
+ 28,243, 87,255,155, 31,103,105,121, 1,123,247, 46,101,175, 79, 49, 78, 40,211, 9,197,120, 76,210,239,147,244, 71,206,243,175,
+ 20, 18,225,252,173, 82,129,167, 65,107,180, 20, 92,250,216,167,216,220, 88,101, 41,142,216, 60,191, 65, 20,250,160,124,172, 41,
+241,107,117,252,249, 5, 88, 94,134, 60,131, 52,135,178, 68,148, 5, 86,106, 86,127,240, 71,217,250,191,254,231,106,226, 97,206,
+236,177,229,183, 36,167,217, 89, 33,158,254,147,197,204,114,190,237, 20,114, 49,131,184,216, 25,180,103, 42, 98,179, 51, 14,191,
+156,137,228,206, 90,204,166,145,177, 0, 74,139, 89, 7, 47,196, 41,209,206, 89,212, 42,152,141, 18,239, 43,134, 83,247,194, 44,
+191,173,234,208,103,235, 1,233,246,236,214,184, 27,231,116,156,125,154,167,251,173,227,136, 83,240,208, 44,222,117,170,160, 63,
+ 67,147,155, 21,118, 99,177,166,152,117,247,179,100,186, 51, 42,247, 41,184, 99, 86,236,207, 68,239,218, 51, 89,235,103, 61,234,
+239,143,186, 61, 37, 29,206,108,127, 66, 16,110, 92,166,253,237,255, 33, 58,176,228,199,135,248,251,127,128,209, 62,101, 2,147,
+ 44,224,104,239,152,253, 59,119,185,125,125,151,126, 46,216, 78, 12,143,119, 2, 86,175,172,144, 15,114,172,176,148,101, 70,113,
+212,101, 50,204, 25, 30,229,244,146,146, 91,253,146,149, 50,100, 72,202, 32,117,215, 71, 93, 43,140,181,120,190, 98,119,236, 10,
+188,212,138, 48,210, 20, 66, 16, 6, 26,173, 20,195,204,240,141,189, 17,155,173,128, 64,192,188, 47, 88,105,251, 52, 90, 53,218,
+235, 43,104, 95, 98,179, 20,173, 5,126,232, 52, 69,121, 50,118,152, 96,156, 72, 80,135, 49, 38, 47,208,113,132,146,146,193,113,
+223,129,101, 82,203,131,221, 30,135,227, 20, 93,217,157, 22,219, 1,218, 66,127,152,208,207, 13,151, 22,107, 44,215, 43, 30, 68,
+ 37,176,253,139,251, 61,222, 60, 28, 83,243,125, 86, 59, 53, 94,120,246, 81, 60,207,167,222,158,115, 34, 54,107,112,188,202,146,
+ 32,106, 98,172, 97,110,116,136,231,149,206,159, 62,233, 83, 63,222,166,174, 64,205,173, 80,106, 69,153, 23, 20, 89,142,168,214,
+119, 82, 41,132,144,213,244,209,119,223, 93, 37,240,124,207, 77, 32,165,116, 60, 7,137,211,205,148,134,162, 40, 93, 93,208,218,
+233, 97,108,225,166,186,158,118,143, 49, 57, 89, 54,193,243, 34, 26, 43,171,236,253,254,175, 16,174,156,227,107,191,245,139,212,
+ 76, 70,211, 87, 40, 33, 72, 75,195,241,184, 32, 49,206,218, 87,154, 18, 91, 13,130,148,150,164, 69, 6, 38,163,230, 41,230, 3,
+205, 66, 61,164,238,105,103,251,147, 46,199,141,210, 93,203,158,168, 48,201, 24, 38, 89,201,118,183,199,110,127,200, 48,117,174,
+ 30, 37,225, 95,252,196,111, 50, 26,116, 25,110, 39,164,233,132,230, 66,135,251,215,238,161,180,162,123,216, 39, 25, 37,100,233,
+132, 48,142,104,207,197, 52, 91, 33,251,123,123,116,179,251,172, 52,226,202,209,100,217,222,217,194,179,154, 60, 43,233,141,123,
+124,226,153,255,136,215,222,253, 93,148,118, 8,218, 88, 73,230,148,100,197, 83,116, 2, 77, 67, 73, 60, 33, 29, 50,118,118, 26,
+151, 26,175,181, 68, 49, 56, 65,120, 30, 22, 69,153, 78, 72,142, 15,169,139,132,181,199, 46, 83, 91, 88,160, 54,183, 68,123,237,
+ 28,119,191,250, 23, 44, 92,190,204,184,119,204, 96,247,128,160,217,100,184,119,192,220,198, 57, 26, 43, 27, 72,237,147,244,143,
+ 49,249,132,164,119,136,244, 3, 84, 16, 84, 95, 80,131,210, 10,107, 10,215, 1,232,200,221, 88,131, 6, 54, 79, 49,217, 0, 21,
+197, 14,130, 19, 55,137, 58, 75,216,210,208,125,251, 21, 22,158,120, 6, 83,228,116,239,190, 75,247,230,235, 8, 81,114,249,163,
+ 31,103,116,120,196,123,175,190,193, 11,159,254, 48,173,245, 43,220,122,229, 13,154,205, 26,243,171,203,140,246, 79, 72,118,182,
+208, 50, 97,225,226, 34, 27, 31,120,158,198,202, 26,251,247,182,217,121,247, 22,113,163, 70,109,113,149, 91,111, 63,164,233, 71,
+ 68, 81,131,249,181, 22,199,187, 99, 70,135, 7, 60,243,226,211, 44,157,223, 36,153, 88,118,110,223,161,119,212, 69,202,140,245,
+203,171,100,185, 79,175,223,163,183,187,205,198,179, 79,128,110,227, 47, 62, 78,122,124, 64, 35, 28,208, 94,232,176,254,204,167,
+185,249,167,127,200,171,191,242,207, 89,126,226,105,254,240,159,253,125,234,237, 54, 91,215, 94,195,143,106, 40, 45,200, 39, 99,
+146,225,132, 60, 75,209,158, 79,212,104, 51,216,223, 35, 25,141,153, 91, 95,166,181,180,132, 45, 44,233,120,226, 10,254,104, 80,
+ 9, 82, 44, 73,119, 72, 84,171,147,167, 5,189,157,125,138, 44, 71,150, 5, 75, 31,124,137,166, 23, 48, 39, 60,218,202,167,141,
+ 98,222, 42,234, 82, 19, 42,133, 42, 29,228, 64, 84,102,137,153,239,220,156,142,126,165,100, 54, 38,157, 58,163,148,148,108,254,
+205,191,199,242,119,254, 16,166,232, 34,188, 58,136,154, 43, 92,249, 24, 51, 25, 80,142,135, 36,253, 33,163,131,125,142,238,223,
+163,183, 87, 21,244,209,128, 60,207, 92, 80, 66, 89,146, 37,185,179, 34, 41,143,191,241,207,255,123,252,193, 9,230,238, 3,202,
+222,128,114, 48,161, 28, 13,201,122, 39, 36,199, 93, 38, 39, 61, 76,145,186,155,133,181, 20,227, 33,233,238, 14,249,206, 67,216,
+221,133,145,139,194, 36,155,224, 9, 73,208,104, 32,194, 24, 58,115,168, 40, 34,136,107,232, 90, 13, 86,150, 92, 81, 56,238,186,
+199,140,135,208,237, 34, 6, 39, 72,223,231,145,159,252, 31,192, 26,164,117, 68, 57,107,157, 2,223, 20,229, 44, 12,110, 26,254,
+ 34,236, 41,222, 73, 76, 49,166,102,250, 30, 58,203,204, 52,168,196,150,149,163, 96, 90, 96,167, 49,234,165,157,237,139,167,161,
+ 48,179, 84,182,234, 96, 49,253, 55,107,237,108,223,109,166,191,219,158,218,193,172,117,147, 0,236,140,247, 59,243,123,219,106,
+ 47,111,170, 85,129,244, 22, 8,230,175,160,195, 22, 84, 33, 44,152,234,231,102,221,205,105, 24,222,236,191,234,176, 55,195,182,
+ 22,230, 52,233,206, 48, 59, 72,204, 20,240,150,247,173, 45, 40,221,107,112,175,123, 10,197, 19, 51,205,221, 12,151, 53, 77,186,
+ 19,103,108,107,179,247,204, 84,253,192,212,239, 62,189,118, 29, 94, 52,220,184,130,191,186,234,118,145, 91,175, 98,181,162, 40,
+ 27,140,109,196,193,206, 33,201,201,128,254,225, 8,221,108,224,251,138,143,174,197,200, 34,227,198,239,126, 13, 99, 18,138, 44,
+ 67, 9,203,240, 40, 33,203,224,176,155,112, 52, 54, 24, 43, 56,232,141,169,231,117,246,135, 9, 90,107,110,157,164,172,182,125,
+118, 78, 50, 46, 46, 4, 14,161,108, 45,251,189,132, 44, 43,120,120, 56,225, 75,183,123,220, 57,201, 88,108, 4,228,133, 33, 43,
+ 12,151,151, 99, 58, 11, 13, 60, 95, 32, 60, 5,126, 68,216,233, 32,181,118,169,128,217, 4,178,130, 98, 56, 66, 9, 15, 63,110,
+224, 69, 49,126,179,129,174,133,179,192, 35, 99, 4,129,182,212,125, 65, 39, 84,164,133,161, 59,201, 25, 39, 37,190, 47,241,124,
+ 73, 45,244,153,175,233, 10, 77,102, 40,242, 2,107, 5,191,125,227,136,197, 32, 96, 99,161,197,243, 79,158, 39,110, 54,136,234,
+209,108, 2,228,249, 62, 58, 8,145, 74,163,149,225,193,245,111, 18,215, 34, 76,225,174,179,105,210,152, 61,216, 34,124,253,255,
+ 99,238,157,175,179,232, 91, 58, 75,115,120,145, 79,153,103, 36,163, 1, 69,158, 97, 41,157,152, 15, 55,237, 49,184,157,185, 41,
+ 75,138, 34, 37,155, 36, 20, 69,225,174, 79, 83,160,125,143, 70,123,209,161, 87,125,237, 86,180,214, 56,232, 74, 28, 18,132, 2,
+ 47,242,120,240,202,203,116,191,244, 5,228,252, 42, 38, 29, 16, 43, 69, 40, 20,129,148, 8,227, 14,130, 74, 88,116, 5,108,169,
+152, 59,164,105, 74,146,140,157,234,168, 48,228,165, 33,207, 10,138,124, 22,161,230, 38,208,210,249,202,125, 37,171,104,106,133,
+176, 5,201,120, 4,198,141,240, 3,101,249,175,255,206, 63,161, 40, 74,138,220, 98,201, 57,217, 75, 8, 26, 13, 86, 30,217, 68,
+123, 62, 71, 15, 15,201,179,140,122,179, 65,187, 21,145, 76,142,120,237, 27,111,210, 75, 13,176,194,131,129, 96,187,215,163, 59,
+206, 57,127,245, 28,194,247, 25, 39, 35,212,164,100,103,255, 30,223,255,226,223, 39,176,174, 75,143,133, 96, 94,107, 26, 74, 17,
+ 9,137,135,112,161, 73, 70,160,126,230,167,126,236,179, 94,224,163, 26,171, 60,252,242,159,208,185,124,213, 65, 55,202, 2,161,
+ 52, 65, 20,179,244,196,115,136,176,206,248,240,144,225,209, 30,201,112, 76,222,239,209, 63,216,161,223, 61,113, 70,249, 48,196,
+ 98,136,230, 90,248, 81,141,254,238, 54,218,247, 81,218,195,150, 57, 97,103,201, 41,117, 85, 8, 69,130, 8,106, 80,100, 8, 47,
+194,230, 35,178,222, 30,202,143,201,123,123,168, 90, 11, 12,148,201, 8,148,100,184,119, 23,105, 75, 26, 23, 63,200, 96,235,182,
+251, 96,181, 79,235,209,103,233,221,187,199,171,191,243,111, 89,190,180,129,200, 82, 54, 63,242, 34,183, 95,126,133, 90,189,198,
+226,197,115,236,223,123,128,239, 7,120, 97,140, 14, 74,154,107,231,120,248,206, 77,142,183,119, 81,218, 77, 15,122,189, 99,238,
+ 94,191,195,193,187,223,224,219,127,228,251,153,244, 83,252,120,142,187,215,222,100,105, 99,142,160, 22,177,115,103,151,210,100,
+140,142, 6, 52, 23,157, 34,116,119,235,136,163, 7,119, 88,185,176, 78, 50, 73, 49, 54,101,212,155,160,205,152,214, 82,131,168,
+181, 66,251,210, 71, 72,135, 19,134,219,175, 49,255,216, 11, 92,250,196, 15,112,112,251, 58, 81,125, 25,169, 53,111,252,193,191,
+229,234,119,124,154,173,235,215, 9,234, 77, 38,131, 1, 97,189,134, 23,132, 28,220,121, 23,173, 67,164, 80, 44, 63,246, 56,251,
+247,238,114,245, 19,223,198,201,254, 62, 71, 15,247,144,158,156, 49,193,157, 98, 86, 99,203,140,162, 44,240,131, 24,237,107,118,
+255,240, 55, 81,227, 17,190, 16, 46,152, 64, 57, 64,129,143, 66, 9, 39,242,144,246,253,106,238,169,231,125,150,206,101, 69,117,
+210,118, 5, 98,225,147, 63,192,229,255,242, 31, 99,242, 99,132,174, 33, 68, 0, 34,133,164, 75, 49, 28,144, 14, 78,232,239,237,
+210,219,218,162,183,189,203,104, 52,100, 60, 26, 51, 25, 12, 41,171, 34,121,202,246, 46,200,135, 41, 63,248,223,253, 44,188,125,
+ 13,115,216,163, 24, 14, 41, 39, 19,242,225,128,180,223,103,210, 27,146,167, 19,119, 77, 10,129, 20, 18, 79,107,108,150,145, 15,
+251,244,183,238, 98, 7, 99,194,197, 5, 8,131, 74,152,151,159,250,199,106,117,228,120,130, 73,134,168,160,134,188,112, 17,178,
+ 28,187,179, 77,121,124,136,244, 35, 24, 15,177,189, 46, 54, 12,104, 60,245, 33,246,254,224,215, 41,198,195, 42,159,220,206,130,
+ 77,167,156,102,113,166,141,181,239, 27, 39,115, 38,200,229,253, 49,160, 2, 49,227,235,219, 51,140,231, 41, 29,235,253,196,180,
+ 51,227,233,106, 8, 63, 67,211,136,211,224, 25, 41,167, 67, 0,241,190,128, 20,135, 96,172,194, 93,228, 25, 82,144, 61, 5, 5,
+233,134, 83,255, 23,163,221,169,145,254,125,203,121, 59, 93,199,156,161,217,185, 83, 94, 37, 0, 52,230, 76,103, 95, 37,212,153,
+211,132, 58,196, 89,235,218,169, 72,144,106,210, 35,181,152,237,214,167,135,253,233,123, 45, 43, 47,180,168, 80,187,167, 10,121,
+102,180,191,217,182, 64,156,177, 12, 10,139,191,176, 74,235, 67,223, 75,184,190, 70,222,235, 82, 92,251, 85,100,220, 32,235, 15,
+217,127,112, 64, 58,201,233,238, 30, 50,238, 77, 80,166, 96,117, 41, 98,161, 41,104,118, 60,130,133, 38,195,189, 49, 38, 53,244,
+183, 78,232,110, 15,200, 75, 56,233,166,188,186, 59,230,197, 15, 60,198,185,143, 61,141,127,229, 18, 58, 31,243,230,219, 15,153,
+111, 5,236, 14, 11,186,105, 73,164, 64,107, 69, 89, 88,134, 89,137, 18,130,135,227,146,229, 78,140, 39, 93,100,167,167, 37,155,
+ 45,159,139,155,117,226,249, 54, 74, 25,194, 86, 27, 63,170, 99, 61, 69,216,106, 98,134, 3,188,168,133,212, 6,225,105,116, 16,
+ 83,102, 9, 69, 50, 38,157,140,145,218,167, 72, 83, 76,146, 83, 20, 25,227, 65,142,181,134, 97,238, 70,239, 75,117,159, 86,205,
+169,209,251,227, 12, 63,246,121,126,185,142,174, 62,131, 81,110,249,249,175,110, 97,138, 18,169, 36, 31,126,234, 18,235,231,214,
+137, 26, 45,234,157, 14,158,214,232,192,195,243, 67,194,206, 60,113,103, 1,191,222, 70, 39, 93,214,203, 30,153,177, 85, 17, 49,
+167,224, 41,107,177, 89,138,216,191,135,188,247, 14,209,240,128,120,105, 25,175,214, 64,248,158,235,224, 75,231, 96, 41,242, 18,
+ 91,228, 24,225, 86, 89,133, 41, 41, 10,215, 69,219, 34,199,139,107, 68,237, 5,178,241, 9,166,152, 32,164,193, 11, 3,215, 12,
+ 74,152,244, 79, 56,220,122,200,193,237,155, 68,181, 38,106,251, 30,222, 83, 47,240,205,223,249,223,104,104, 85,177,216,161,155,
+228,244, 51,195, 56, 47, 41,171, 3,173,113, 8, 5, 23,136,165, 4, 30,146,186,175,152,211,154,197, 40,160,166,149, 83,191,139,
+ 51,185, 14, 74,161,116, 72,150, 77, 40,172,211, 78, 28, 21, 32,116, 76,154,140,241,148,228, 71,190,243, 39, 73,242,132, 34, 21,
+100,227, 33,155,207,174,178,253,102, 31, 41, 36, 7, 7, 7, 44,172, 52, 73, 79, 82,246,118, 14,208,254,132,183,175, 31,113,109,
+247,144, 79,127,104,135, 70,123,192,176,216, 97,175, 91, 48, 24, 75,190,114,227, 27,220,207, 95,227,217,213,143,178,191,183, 71,
+189,214,164,214, 92, 70,137, 46,197, 96,135,182, 84, 44,123,146, 78, 88,163, 89,111, 33, 43,235,162,210, 2,245,211, 63,249,163,
+159, 13,154,115,236, 92,123,133,149,103,159,103,124,180,143,246,124,178,113,159,100, 48,196, 74,129,210, 62,199,119,110,226,213,
+106, 72,229, 1,150,122,103,158,230,194, 2, 11, 27, 27,196,173, 22,233, 56,113,251, 18, 37,241,235, 29,154,235,231, 56,124,247,
+ 29, 22, 30,125, 2, 29, 53, 42,240,139,196,154, 2,233,249,167, 40, 77,169, 41, 78, 14,240,219,115,152, 44, 67,135, 77, 76,158,
+ 56, 47,100, 62, 66,121, 17, 65,163,131,244, 20, 7,239,188, 65,173,213,196,111, 52,177, 6,246,174,191,202,245,207,255, 25, 31,
+255, 91, 63,132, 80,154, 90,187,195,173,191,248,170, 75, 84,203, 18, 78, 14,247, 8,107, 77,252, 90,157, 90,187, 73, 92,107, 51,
+ 30, 28, 51, 60,232,115,114,124,192,100, 52,226,250,203,175, 82,164, 93,222,249,250,117,190,243,135, 94,228,104, 39,165,179,214,
+225,193,219,123,116, 58, 17, 11,155,235,220,190,177,195,225,253, 55, 56,127,229, 50,101, 2,205,229, 14,219,119,118,105,196, 30,
+151, 95,120,150,131,135,125,154,205,136,218,194, 18,217, 36,101,112,210, 39, 55, 49,195,147, 9,135,183, 94, 35,235,109, 19, 47,
+ 94,228,202,119,253, 0,152,146,133, 75, 79,240,141,223,250, 21, 62,248,195,127,157,238,221, 59,188,251,239,191,200,179,159,249,
+ 12, 15,222,120,149,249,245,243,220,125,253, 27,132, 81,157, 60,207, 43,171,142,196, 15, 66,230,206,109,114,124,255, 33, 11,231,
+ 54,220,205, 43, 8,232,237,236, 51,191,185,234, 4,103, 89, 73, 84,143,193,106,146, 65, 31,161, 61,194, 48,166,255,218,159, 33,
+ 10,131, 39, 37, 26,137,178, 10, 37,156,175,222,225, 65,245, 41,235, 76,128, 49, 37, 90,169,106,183, 36,145, 82,224, 55,214, 16,
+218,195,171, 71, 60,247,175, 63,239, 10,186,215, 64, 8, 31,203, 24,210, 1,217,241, 49,147,238, 17, 39, 59, 59,140,142, 14,233,
+ 29, 30, 49, 25, 15,201,210, 9,101,150, 83,148, 37,101, 89, 98,203, 2, 42, 66, 85, 45, 8,248, 43, 63,247, 15,224,141, 87,177,
+189, 97, 85,208,199,228,253, 33,105,175, 71,218, 63,193, 20, 5, 20,185, 43, 92,133,193,230, 19, 55, 53, 48,134,116,216, 35, 79,
+ 71, 36,163, 30, 50, 43, 9, 86, 54, 32,208,144,164,144,101, 14, 67, 27,134,160, 61,202,131,125,116, 24, 32,215,207,195,225, 33,
+101,247,136,116,235, 33, 55,254,233, 63, 97,252,202,171, 4,245, 24,127, 97, 30,163, 20,171,159,249,207,120,248,107,255,234, 76,
+ 90, 29,179,244, 54, 23, 71, 91, 21,146,233, 78,187,114, 12, 8, 59,197,180, 86,163,111,121,182,216, 58,182,187, 43, 92,178, 82,
+123,159,197,193,158,254,236, 84,120, 55, 85,214, 78,193, 46,103, 93,104,162, 82,141, 79, 11,182, 61,205, 45, 61, 21,186,137, 51,
+145,169,149,128,175,138,119,161, 76, 70,148,227, 67,132, 41, 78,189,239,179, 83,201,116,164,125,122,224,152, 6,175, 8,115,170,
+202,183,156, 25,171, 59, 39,221, 76, 36, 56, 93, 29, 76,255, 96,123,230,125,152, 30, 68,100,229,111,159, 30,104, 68,149, 54,101,
+ 75, 51,123, 13, 51,191,253, 25, 12,239, 76, 10, 50,221,119,136,233, 33, 71,160, 26,115,180, 94,252, 62,188,154, 79,126,114, 72,
+254,246,239, 67, 28,113,244,112,151, 65,119, 68,154,102, 12, 15, 78, 40,203,146,149,115,243, 68,117, 77,115, 46,162, 53, 23, 35,
+132,102,247,221, 99, 70, 71,125, 90,155, 77,172, 45, 24, 14, 75,114, 32,247, 91,124,255,207,252, 56,209,230, 26,178, 94, 99,253,
+185,231,184,242,161,171,244, 15, 15, 25, 15,199,212,180,224,126, 63,231,222, 48,163,192, 34, 61, 15, 35,160, 21,249,156, 36, 41,
+131,180,164, 17, 40, 86,155, 1,143, 44,215,240,125,141,212, 78,215, 17, 47, 47,163,180, 71, 62, 30, 81,228, 41, 94, 92,171,240,
+187, 2, 91, 22,104, 63, 36, 27,118,145,158,143, 80,154, 52, 43, 0, 73, 50, 28,211, 63, 30, 3,150,113,102,104,250,146,166,175,
+ 8, 35,143,249, 88,147,102, 37,239, 28, 39, 60,182,212,224, 92,211, 67, 43,201,155, 7, 41,159,253,247,119,153, 36, 5,245, 32,
+224, 7, 95,250, 48, 75, 27, 27,120,194, 18,215, 98,130, 90,157,168, 53, 7, 66, 98,202, 2, 29,132,132,141, 57,188,168,206,228,
+164,207, 98,189, 32, 27, 12,206,196,253,150,213,122, 71, 85,215,170, 99, 68,152, 36,197,108,223,230,255, 39,235,205,191, 36, 75,
+239,242,206,207,123,247,123, 99,143,220,215,170,202, 90,187, 90, 85,213,251,162,214,214,218, 90,107,131, 64,131, 25,195,193, 24,
+105,102,108, 60, 22,155, 48,231,128,193, 26,251,224, 25, 97,207, 97,236,115,134, 49, 96,192,204,193, 99, 4, 70, 8,109, 52,146,
+ 90, 75, 75,234,150,122, 95,106, 95,178, 42,247, 53, 50,246,136,187,190,239,252,112,111, 68,100,219,127, 64,102,101, 86,222,184,
+239,251,125,190,207,243,124,244,205,235,152, 27,203, 56,189,125,138,229, 50, 70, 46,143, 93, 44,166,255, 63, 73,146,249, 32,116,
+ 12, 75,199,241, 92, 92, 55, 71, 24,245,120,253,185, 47,112,251,149,111,227, 20,198,169,109,110, 81,223,217, 98,235,246, 50,123,
+183,111, 17,244,251,184,133, 18,110,121,156,138,151, 71,107,214,185, 19,117, 88,127,225,105,138, 86,106,248,142,165,228,160, 31,
+211,149, 58,113, 34, 73,148, 36,136, 21,177, 74, 5, 11, 33, 82,165,210,182, 52,114,134, 70,201,177,152,112, 61,114,134,129,173,
+155,232,218,232,146,109,186,147, 96,228, 8,252, 22,113,146,208,141, 5, 78,245, 40,249,226, 4, 23,142, 63,198,147, 15,255, 50,
+ 55,175,172,208, 63,104,224, 22,139, 24,186, 65, 80, 87,228,202, 54,219,171, 7,105,203,101, 47,102,237,246, 22,243, 75,147,236,
+110,183,184,124,103,151,223,251,219,143,113,230,177, 71,185,239,189,239,224, 29, 79, 60,194,227,239, 58,194,125,247,187, 36,189,
+ 58,127,248,252,101, 26,157, 91, 76, 89,199, 88,223, 94,133,216,224,241,247,124,130, 59, 23,255, 11,227,166,206,152,105, 82,173,
+ 78,227,218, 69,132,223, 28,174, 4,245,223,250,245, 79,125,102,247,198, 69,186,187, 53,198, 78,158,164,185,124, 13, 97, 89,120,
+149, 9,246,175, 95,198, 43,231,216,120,237, 21,170, 11,179,108, 92,186,200,237,215, 95, 70, 83, 33,110,121,156,214,206, 38,221,
+131, 90,154,161,211,109,204,188, 75,229,244,189, 4,141,125,162,126,159,242,226, 9,174,127,251,105, 38, 78,156, 68,169, 36,125,
+225, 9,145,186, 89,179,134,174, 36,232,164, 5, 6,154,137,102,229, 16,186,133, 72, 66,100, 18,165, 89, 89,187,204,193,181, 87,
+177, 61,143,252,204, 28,134, 87,198,111, 28,176,123,245, 50,243,247,220,143,165, 41,202, 71, 23, 8, 58, 33,183, 95,124,145,198,
+250, 26,186,104,145, 43, 78,211,173,173, 81, 91,190,195,216, 98,145,194,212, 28,237,122,139,126, 43,228,230,149, 91,236, 44, 95,
+102,102, 97,142,205, 91, 53,146,246, 26, 15,188,253, 2,222,228, 41, 26, 91,171,140, 47, 29,103,127,117,157,241,185, 9,174,188,
+124,139,176,182, 73,101, 12, 42,115, 11,216,185, 50, 55,223,184, 78,210,111, 48,115,234, 8,181,173, 3, 38, 22,102,176,189, 34,
+245,189, 26,221,102, 31,191,219, 39,108,238,144,244,219,180, 26, 77,172, 98,145,211,239,251,113,116, 77,176,119,123,141,177,197,
+ 25,194,190,100,235,202, 21,238,253,209, 31,195, 27,155, 33,137, 66,138,147, 83,200, 56,166, 52, 57,193,246,181, 27,204,223,115,
+158,230,230, 38,253,102,147,201,227, 71,105,109,111,146,190,127, 19, 52, 77, 67,211, 12, 44,199,193, 27,171,208,218,218,198,176,
+ 45, 12,215, 33, 14,186,216,165, 18,221,189, 61, 74,199, 78,178,246,151,127,136,150,229,177,211, 22,247, 36, 59, 68,180,116, 31,
+173,101,135,133,166,167,134, 56, 67, 31, 94, 38, 6, 47,120, 73,130, 12,187, 60,252, 23, 47, 35,244, 62,194,240, 16, 88, 40, 2,
+146,198, 14,157,141, 85,122,141, 26,141,221,125,154,187,251,116, 90, 45, 2, 63, 72,225, 58,137, 76, 95,220, 50, 73,169, 90,137,
+164,215,237,115,108,118,158,199,126,233,151,225,181, 31,162,106, 13,162, 78,135,164,215, 33,104,182,240, 15, 26, 68,221, 54,178,
+ 31, 34,131,104,196,103,151, 17,132, 9, 68, 33, 97,175, 71,228,119,209, 45, 29,195,180,240, 59, 13, 28, 51,143, 49, 49, 5, 82,
+ 34, 59,157, 84,198, 46, 87,210,195,164,151, 66, 98,180,185, 5, 26,127,242,199,124,239,231, 63,205, 43,159,251, 2,173,131, 6,
+235,203,183,217,252,202,183,176,191,253,109, 10,247,188, 5, 99,233, 36,113,179, 65,235,242, 43,135,135,205, 76,113, 86, 12, 2,
+102,106,144, 77, 23, 35,128,202,168, 94, 78,140, 0, 48,140,106, 94, 7, 99,167, 28, 24,235, 6, 52, 52,149,161,152, 6,133, 44,
+ 89,167, 58, 98,176,239, 62, 68, 68, 19,135,138, 99,134,135,166, 24,242,208, 15,145,236,179,131, 87, 28,114,206, 51,228,207, 15,
+254, 89, 41, 71, 40,221,129, 1,110, 0, 71, 81, 74, 12,191,126,196,176,207,158,143,195,178,122,170,197,141,126, 62,245,230, 22,
+194, 33,122,245,240,207, 51,136,174, 9, 45,253, 25, 6, 74,198, 0,154,195,168,122,115,196, 73, 31,229,255, 68,118,163, 16,140,
+190,135, 61,181, 64,233,161, 15,163, 27, 33, 50, 12,233,191,242,119, 96, 41,246,239,212, 8, 98, 65,216,245, 81, 10, 76, 13,188,
+162,129,174,235,232, 42,192, 0,188,177, 28,126,163,199,254,158, 79,107,183,203,234, 74,159, 40, 78,216,235, 73, 78,222,127,146,
+249,199,222, 69,212,237,141, 76,131,186,193,137,119, 62,206,198,203,175, 48,230,194,137,233, 60,167,166,242,204, 85,139,140,121,
+ 90, 90,144, 36, 83, 26,162, 46, 52, 22,171, 57,138,142,134,231,166, 89, 70,203,214,241,138, 30, 7,119, 86, 17, 90,156,238,159,
+181,148,244,167, 9, 32, 17,132,157,110, 42, 93, 11, 29,195,205,147, 72, 69,212,233,209,111,180,232, 55,122,132,126, 52,236,214,
+ 47,228, 77, 12, 67, 67, 87,138, 56, 81,116,253,132,213,110,194,163,139, 69,166, 43, 14,127,240,210, 14,223, 89,235, 82,180,109,
+ 44, 29,206, 47,205,145,119, 13, 92,219,160, 52, 62,134,101,154,233, 69, 52, 9,144,113,152, 81,211, 44,204, 66,137, 94,109, 31,
+199,210,177,140,144,222,214,206,240,178,155, 38,113,178,238, 0, 41, 65, 31, 1,139,132, 38, 72,226, 4,165, 18,146, 94,135,112,
+253, 22,114,249, 34,234,198,235,104,235, 87,209, 54,174, 98,236,173,145,108, 94,161,121,249, 57, 86, 95,122,154, 23,190,251, 69,
+ 94,120,225,235,236,108,222,198,213, 96,108,238, 46,162, 56,198,208, 83,165, 75,211, 52,220, 98, 9,195,205, 81,154, 63, 69,240,
+204,151,201, 29,189,139,207,253,231,207,226,169,136,188, 97, 96,106,130, 32, 86,212,125, 73, 63, 81,132,113, 72, 55, 82,132, 50,
+ 99, 96,100,162,147,134,192, 18, 26, 5, 75, 99, 58, 95, 98,204,245,168, 84,166,113,115,101, 84,208, 29, 90, 73,164, 18,132,189,
+ 70,234,241, 74, 4,230,216, 81,204,252, 52,170,215,101,105,230, 35,188,246,194, 27, 20, 10, 37,208, 97,243,234, 38,165,241, 50,
+166,229,208,239, 69,180, 27, 61,226,110,196,246,157, 61,252,176,143,102,134,188,118,121,147,223,252,211,247, 83,154, 59,146,158,
+131, 73, 76,216,237,226,135, 49,113, 16,115,223,163, 15,240,196,133, 37,126,231,139,223,225,109,115,119,147,179, 43, 36,232,244,
+187, 77, 78,189,229, 73,226,245,167, 41,154, 6,182,110,129,223, 65,197,254,112,211,166,255,234,207,255,204,103,170,199,207, 50,
+118,252, 36,237,245, 53,138, 11,139,172,191,244, 3, 18, 5, 83, 39,206, 18,135, 1,149,217, 57,116,203, 67,200,132, 19, 15, 62,
+ 66,229,200, 18,219,151,222, 64,119, 60,114,227, 19,233, 75,186,177,207,212,133, 7,184,250,165,191, 97,242,204,105,146, 48,162,
+189,181,202,204, 91,222,146, 86,188, 22,198,144, 65, 15,205,118,135, 70,156,164,215, 64,152, 14,194,180,144, 9,244,118,110, 99,
+122, 57,100, 20,160,123, 69, 52,187, 74,119, 99,153,210,252, 44,122, 97,156,164,211,225,218,183,190,193,214,245,215, 56,241,240,
+163, 68, 65,148, 70,171, 12,135,171, 79,127,139,233,227,199, 48,117,131, 99, 15,191,141,253,219,171,156,121,252, 29,204,221,245,
+ 0,227, 39,238,166,190,177, 67, 20,198, 52,182,235,176,219,225,196,169, 41,188,201, 9,130,221, 46, 51,139, 21,142, 60,120, 31,
+ 65, 71, 49,123,234, 20,123,107,219, 40, 41, 89,189,181,134,163,133,228, 74, 30, 71,206,223, 75,123,191,203,250,237, 85,108, 25,
+ 99,121, 58, 81,208,103,127,103, 5, 43,231,177,179,177,207,206,218, 6,145,191,207,236,145,105, 44,183,192,228,217,199,152, 92,
+186, 64,109,117,149, 36, 8, 57, 88,221,166, 83,223, 99,108,225, 24,249,169,113, 76,199,163,182,178,193,220,217,147, 68, 97,196,
+254,234, 29, 52,221,196,116, 29,114, 99, 85, 76,199,196, 43, 87,104,239,239, 19,247, 35,202, 71, 23,113, 11,121, 52, 76,182,174,
+223, 96,251,234, 13,166, 79, 46, 17,246,251,180,246, 14,168,204,206,209,219,220, 66, 25, 6,142,231, 96,123, 30,154,237,177,254,
+231,255,119, 42,149,102,221,217,186,174,167,205, 95, 25, 82, 85, 37,153,225, 42, 78,208, 13, 99,100,154,139, 85, 58,121, 1, 66,
+197,156,252,149,127, 75,241,244,105, 16, 58, 66, 56, 40, 18,146,230, 38,141,149,101,234,107, 27,212,247,246,210,189,121,175, 67,
+ 24, 4,196,161,159,101,144,229,208,236,164,107,130, 86,167,195,163, 15,220,195,233,159,249, 36, 92,250, 1,106,239,128,168,217,
+ 33,233,116,240,235,117,124, 63, 76,119,112, 81,140,150,196, 68,221, 46,186,105,164,238,239, 48, 36,234,244, 82,158,122,191,151,
+174, 80, 12, 11,205, 49,176, 60, 23,191,221, 36, 63,189, 0,158,131,106,119, 82,199,121,185, 12,182,141,136,211, 58,217,110,125,
+159,111,126,228,239, 81,171,120, 84,114, 57,238, 95, 58, 67, 59,232,176, 34,251,212,187,125,106,255,233, 47, 24, 51, 19,166,127,
+241, 55, 89,251,211,255, 43,221, 51,139, 17,184,101, 24, 9, 59, 60, 40,102,210,250,176, 42,117, 56,160, 14,118,202, 42,155,222,
+197,208,212,165, 29,154, 92,165, 84,188,169,158, 69,140,128, 49,131, 23,144, 58,100,178, 19,135, 48,174,169,177,114, 48,176,106,
+ 8, 61,159,237, 91, 51,198,251, 97, 89, 61,131,174, 28, 46,192,145,114, 16, 95, 60, 92,189, 58,248, 58, 49,146,211, 7,215, 1,
+205, 70,232, 78, 74, 86,203, 80,173,163,134, 55,134,207,153, 56,124,241, 24,200,238, 67, 68,219, 40,171, 55,194,201, 50, 58, 44,
+130,139,136, 0, 0, 32, 0, 73, 68, 65, 84,168,179, 62,248, 65,249,206, 32,113, 49,116,208, 15, 11, 1,228,208, 19, 2,233,100,
+111, 86,166, 41,220,247, 78,116, 67,161, 91, 14,254,230, 50,253,230, 6,126, 87,209,237,135, 4,109, 63,237,217, 46, 57,136, 68,
+165,135,151, 70,106,220, 82, 9,150, 99,224, 86, 43, 88, 57, 11,221, 54, 48,138, 30, 86, 62, 71,115,127, 31, 67,139, 41, 46, 30,
+ 71,166,187, 8,250,245, 58, 23, 63,247,103,140, 79,186, 76, 46,205, 83,156, 24, 99,230,244,113,102,239, 62, 78,117,172, 72,193,
+ 54,176,117,157,188,109, 80,114, 76, 60, 71,167, 90,117,201,149,115, 68,126,128, 83,204, 17,246,250,152,174, 77,208, 9,240, 59,
+109, 12, 59, 45,150, 73,194, 84, 82,151, 73, 72, 18,197, 24,142,135,210, 12,146, 80, 34,209,209,221, 28,253, 70,139, 36, 78,208,
+205, 84, 89,179, 61, 11,164,194, 72, 9,170,236,116, 34,148,105, 99, 42,193,255,254,252, 54,187,173, 16, 67, 40,234, 61,159,163,
+211, 19,204, 85, 11,204,204, 77, 83, 40, 22,112, 60, 15,183, 84,193,178,109,164, 82,232,186,158,149, 93,229,176, 28,151,160,219,
+ 99,188,168, 19, 55,182,137,235, 7, 35, 15,142,202, 90,100,212,200,152, 57,120,134,147, 88,142, 60, 17, 3, 14, 69,150,120,144,
+ 65,128, 10,122,196,157, 38, 65,187, 65,232,247,104,245,125,218, 42,166, 27,198,104, 89,179,218,236,201, 71, 8,250,221,116,101,
+163,137, 84, 49,116, 61, 44,211,164,114,244, 44,221,167,191,200,226,199,254, 1, 79,253,245, 31, 48,102, 89, 20,244, 20, 59, 29,
+ 39,138, 94, 24,211, 11, 34, 90,145,164,151, 12,160, 46, 35,115,171,161,137, 20,192, 98,104, 76, 57, 6, 37, 77,226,234, 58,102,
+226, 35,146, 48,101, 41,160, 82,150,123, 18,129,210,211,250,237, 56,198,111,238,178,178, 49,198, 43,175, 94,225,174, 15,174,241,
+248,199,223,206,149,167,246, 9,101,143,201,217,113,208, 4,221,122, 72,183,221,102,111,101,155, 90,167,129,109,232, 52,155, 1,
+103,223, 99,243,214,143, 63,153, 94, 94,227,144, 36, 14,144, 74,162,226,152, 4, 69, 24,132,140, 77, 77,241,225,243, 39,248,163,
+ 47,124,151,211,147,199,232,251, 1,248,130,233,227, 11, 56, 42,193,104,223,198, 72, 34, 68,226,103, 43,211,244,111, 96, 56,165,
+ 50,194,202, 17, 55,246,112,242, 46,253, 90,157,169, 83,119,177,123,253, 13,220,156, 75,237,214, 77, 22, 30,124,132,205,215, 94,
+ 99,242,196, 81,122,205, 38,189,253, 61,138, 19,227, 20,103,230, 56, 88, 93, 37,234,245,152,187,247, 1,154,183,151, 57,246,232,
+195, 4,141, 58,118,121, 28,183, 84,161,223,170,227,150,203,196,221, 54,186,109,167,110, 88, 51, 71,210,111,142, 98, 67, 88, 36,
+157, 13,114,147,115, 4,205, 3,172, 82, 25, 52, 11,229, 55, 82, 7,164,233, 16,181, 90,220,126,238, 89, 38,230,102,169, 44,222,
+143, 94,157,225,230,215,190, 70,105,122,130,231,255,242,175,120,203,187, 31,101,251,242, 13,102,207,156,100,245,149, 75, 76,157,
+ 62,138, 89, 24, 99,229,165,203,172,126,245, 34,174,103, 83,223,222, 5, 91, 82, 58, 51, 78, 32, 33,175, 27, 28,125,240, 60, 73,
+208,166,189,219,194,200,151,217,184,185, 74,183,213,164, 89,235,160,197, 61,156,138,205,248,226, 34, 91, 43,219, 92,124,238, 69,
+ 30,249,224,195,196, 93, 23,219,149,212,107, 17, 11, 75, 5, 20, 6,177, 47,113, 36,156,126,244, 2,205,253, 16, 97, 79, 32,123,
+109,132,105, 80,153, 90, 96,237,181,151,137,227,136, 56,236,163,155, 30,149,249, 89,202,147, 99,152,182,205,218,197, 43,204,156,
+ 56, 65, 18, 70,180, 54,182,104, 30,108,115,254, 3, 31, 98,127,101,141,210,212, 4,147, 75, 75,212, 55,182, 72, 46, 94,199, 42,
+ 58, 40,191, 75, 28,166,101, 52,175, 61,245,117, 22, 46,156,195,246, 60,110,191,248, 60,205,205, 26,119, 61,254,104, 26,111,115,
+ 93,132, 46, 40,222,117, 47,237, 43, 47, 35, 85, 74, 68, 84, 34, 53, 55,141,202, 64, 52, 52, 5, 50,155,188, 68, 38,229, 10, 51,
+173,136, 69,128, 85,169, 50,253,196,143,163,100, 27, 77, 43,161, 84,159, 96,127,133,221,203,151,233, 53,154,244, 58,109,250, 81,
+132, 74, 36, 73, 28,167,196, 49,203, 64,134,169,185,101, 32,175,182,155, 45, 62,250,193,247,227, 62,246, 94,184,249, 34,236, 30,
+ 16, 55, 59,196,237, 22,129, 76, 8,247,246, 17,175, 94,198, 88,222,100,125,175,193,213,126,128,117,100,150, 40,150,196,181, 38,
+ 75,199,166,153, 58,179,128,233, 24,217,207, 45,211,246,170, 36,141,192, 72,191, 75,239,250,117,188,123, 46,164, 83, 82,183,141,
+ 30, 70, 96,187,224,229, 16, 81, 68,239,198, 85, 90, 69, 15,219, 48, 24,119, 61, 10,213, 41,142,180,155,236, 70, 1,243,165,113,
+174,170, 45, 42,255,241,207,153,219,171,113,238,119,255,130,215, 63,245, 99,164,229,203,153,204, 61,112,133,101, 19,102,106,216,
+146,195, 70, 56, 45, 59,113,213,155, 86, 26,153, 52, 63,112, 27, 14,138,223,196,168,169, 78,161,134, 85,175,135,209,110,137, 28,
+ 29,106,195,154,216,129, 15, 66,100,102,188,108,106,178,138,147,232,206, 20, 81,235, 6, 50,236,101, 81, 58,134,198, 59, 53,168,
+ 0, 83,135, 47, 36,163,230, 60,153,229,231,211,226,161,140,237,158, 72, 72,196, 48,202,103,152, 70,250, 77,165, 28, 85,201, 30,
+166,213, 13,255,141,180, 9, 79, 73,144, 42,201, 46, 7, 35,167,127,122, 39, 73,208, 50,133, 72,100, 13, 98,131,110,252,209,110,
+ 62,203,198, 75, 9,186, 62,220,173,203, 68, 13,235,113,213,176,247, 61,129,230, 58,154,229,131,150, 67,245,235, 56,167,238,165,
+245,229,103, 16, 86, 9,132, 70,126,162, 76,208,241,137,163,152,176,211, 69, 55, 0,105, 98,154, 17,253, 86, 31,211,214,209,133,
+201,244,131, 15, 49,107, 87,232,212, 27, 72,203,193,239,251,180, 55, 55, 89,126,234,175,209,221, 66,150,197, 55, 56,253,182, 71,
+ 9, 58,109,132, 80,196,113,136, 87,172, 16, 52, 26,228,242, 57, 90,236,224,104,138, 78, 44,209,101,146, 78,186,166, 65,216,233,
+ 99,154, 38,221,122, 27,149,196,148,167,198,176, 11, 58, 81, 47,224, 96,117, 23,219,243,176,139, 54,166,174,163, 59, 69,132,140,
+ 80, 82, 96,122, 69,116, 23,194,122,139,218,202, 38, 65, 18, 35,116, 65, 20,164, 49,173,126, 55, 4,161, 17, 69,138,141, 90,159,
+134,150,163,157, 36,252,187,215,183,152,176, 12,198,115, 46,154,109,241,224,220, 12,243, 83,101, 22,102,199,176, 77, 19,195, 48,
+176,189, 28,118,161,152,118, 94,244, 90,232, 78,234,176, 55,242, 37,208, 76,208, 76,156,178,141,127, 77,162,226, 4,161,235,233,
+223, 64,211, 51,246,130,202,158,145,244,221, 18,199, 25,211, 94,101,172, 0, 93, 79, 13,209,114, 20,123, 28,122, 64, 18, 69, 24,
+167,123,239, 48,202,192, 60, 9, 72,191,143,145, 52,211,181,145, 76, 99,211,134, 97,227,150,202,233,179,216,216, 65, 34,216, 55,
+ 5,229,252, 24,166, 30,163, 9,137, 46, 4,102, 22, 51,211, 52, 72, 80,196, 3,243, 37,105,177,141, 97,100, 26, 79,102,238,140,
+101,132,134,133, 12,123, 72,149,174, 18, 52,109, 80, 58,165, 48, 13, 7,211,174,146,180, 15,112,251, 61,156,156,195,255,244,226,
+151,168,111,220,198, 45,151, 80,178,193,221, 31,221,225,198, 51, 26,221,102, 23,199,134, 40, 80,105,177,146, 16, 52,131, 26,152,
+ 69,198,143, 86,249,201,127,122,142,111, 92,120,136, 99,191,250,115, 28,251,251,159, 68, 4,221, 84, 69, 53,140,212,135,166, 98,
+162, 56,225,220,219, 30,197,182,191,204,106,103,131,179,211,231,105, 52,247,216,221,107, 48,125,230,227,176,243, 44,154, 10, 51,
+209, 76,165,103, 37, 2,253, 95,254,171,223,248, 76,216,105,162,100,130,233,149,208, 77,131,168,219,102,230,252,253,108, 93,124,
+149,185,243,247,176,250,202, 75, 28,121,240, 17,182,111, 92, 71,201,136,177, 99, 39,208, 29,151,246,246, 46,110,169, 68,117,113,
+145,110,109, 31,205, 48, 83, 87,170,110,208,221, 89,199, 44, 86, 82,105, 43, 87, 34,233, 53,209,109, 23, 25, 6, 8,211, 38,110,
+237, 99,150,171, 96,148,144,189, 3,140, 92, 33, 53, 66, 17,163,121,229, 52,231, 44, 65,168, 0,163, 80,101,237, 7,223,101,242,
+216, 2,149,211,231,192,180,217,191,244, 58, 55,159,251, 1,157,230, 46, 39,238, 59, 75,208,245,153, 61,123, 23,245,237,125,146,
+ 56,192,205, 23,185,246,236,247,232,214, 91,228, 44,157,124,185, 72,228,199,116, 54,151,113,221,144,177,153,227, 68,177, 79,236,
+ 39,228, 43, 5, 4, 26,171, 55,110,226,119, 59,248,221, 30,150,161,152, 57, 58, 67,161, 58, 78,109, 99, 31,191,151, 80,118,250,
+ 28,185,255, 62,148,114,104, 55, 3,226,160, 67,113, 98,154,181,171,183, 40,143,229,153, 63,117,140,110, 59, 96,125,101,135, 78,
+125,139,168,239,163, 91, 14, 97,107, 27, 79,235,225, 57, 17,174, 17,210,220,222,193,118,203, 4,237, 14, 94,181, 76, 99,125, 3,
+171,144,103,234,216,113, 90,245, 26,211, 39, 79, 33,163, 16,191,221, 35, 9, 35, 10,213, 34,205,237, 93, 38,142, 31,101,127,101,
+149,245,107,183, 56,251,248,187,184,253,226, 11, 44, 61,240, 16,203, 47,190,128,227,229, 49, 92,135,210,204, 52,182,103,147, 68,
+ 65, 86,249,234,226,142,143, 81,251,238,151, 17, 3, 89, 76,141,250,188, 53, 61,165,136,104, 12,202, 64,178,252,181, 32,195,224,
+106, 8,153,112,230, 95,252, 17,206,204, 24, 2, 15,232, 19,215,183,232,239,237,209,222,221,165,213,168,227,199, 50,251, 96,203,
+116,186, 8, 99,146, 40, 26, 26,104, 64, 35, 10,250, 60,249, 83,127, 31,243,194, 91, 97,229, 53,216,216, 34,106, 52,137,162,144,
+ 96,255, 0,249, 23, 95,196,185,181,138,234,244,184,217,234,113, 45, 10, 73, 12,147,104,175,137,236,180, 73,116,141,221,122,143,
+ 59, 87, 55, 89,126,245, 54, 99,147, 30,229,249, 41,164, 6,154, 99,160, 25, 54,186,109, 17,244,125,114, 83, 25,167,186,219,197,
+ 40,148, 32,151, 26, 51,241, 3, 26,175,189,196,141,191,121,138,234,241, 5, 22,159,120,156,194, 71, 63,128,102, 8,186,215,110,
+177,126,103,133,133,201, 25,110,180,118,168,172,237, 49,177,184,196,254,222, 13,194,102, 99,100,214,226,112, 55, 58, 25,220,229,
+112,133,238,161, 3,157, 81,212, 10,161,208, 7,253,239,255, 93,231,251,168,180,134, 55,247,216, 28, 42,102, 25, 57,231,135, 65,
+248, 97, 58, 44,251,225, 52, 19,149,116,145, 65, 35,147,245, 15,187,247,134, 11,246, 33, 26, 54,245, 8, 28,186, 36,104,226,112,
+172,157, 81,183,204,232,194, 34,147, 24,149, 68, 67,243,220, 48,206, 55,216,109, 31,202,217,143,242,252,218,161, 60,251,232, 98,
+ 35,134,185,248, 55,121,234, 70,168, 85,109, 4,190, 17,186,137,183,248, 32,154, 83, 37,238,236, 28, 90, 51,140,190, 94,106,130,
+130,102, 83,124,248,221, 96, 59,136,184,139, 86,154,229,224,217, 47,128,230, 17,107,130, 40, 76,144, 97, 64,236, 71,105, 46, 60,
+ 78, 21,131,118, 39, 98,127,187, 79,208, 11,233,238,117, 48,117,133,158,183,211,100, 80,177,138,166, 36,197,249,227, 20,103, 22,
+ 40, 76, 47,224, 78, 76,144, 31,155,194,111,236, 98,154, 58, 65,183, 69,127,107,143,206,238, 6,171,151,239,224, 55,234,220,188,
+186, 73, 16, 68, 84,199, 60, 44, 75,224, 90, 2, 37, 36, 73, 16,160,105,130, 56, 74,200,143, 21, 49, 45,155, 94,167, 71,175,222,
+ 70, 51, 13,176, 45,164,210,136,253, 24,175, 90, 37, 17, 6, 8,145,121,103, 98,194, 86,135,126,187, 67,167,222, 39, 8,211, 92,
+119,156, 72,100,172,232,250, 49,107,141,136, 85, 63, 61, 36,110,212, 26,228,116, 29,221, 52,177,109,155, 35, 99,101,166, 10, 14,
+211,149, 18, 94, 33, 79,113,108,140,226,196, 20,186,101, 18,118,154,200,216,199,176,109,116,195,196, 46,141, 99,230, 11, 68,189,
+ 30, 65,171,129,109, 72, 52, 97, 17,108,175,164,135,247,144, 81, 46,135, 38,206,244,243, 46,135,207,153,200,226,146, 74, 42, 72,
+ 36, 74,207, 98, 10, 89, 91, 92, 34, 37,145, 74,232,199,146,118, 18,211, 8, 99, 18,169,200, 25,130,130, 97, 82,191,125,133,163,
+ 15,189,155,253,189, 61, 44,215,195, 45,149,176,220, 60,222,196, 44,230,234, 45,198, 22, 22,249,253,255,247,119,161,181,207,152,
+ 46,241, 52, 29, 93, 66, 40,161, 17,197,236,246, 34, 14,252,152,126,146, 22,201, 40,169,134,157, 79,186, 72, 33, 44, 21,199,102,
+204,113,169,218, 6,121, 35, 35,220,105, 3,180,241, 0,125, 28,167, 67, 80,210,197,208, 36, 73,228,243,209, 79,125,130,243,143,
+188, 31, 37,187, 8,173,192,212,201, 18,107, 47,220,198,113,115,128, 65, 16, 41,252, 32,102,127,239, 0, 63,150,148,244, 42,199,
+198, 95, 98,251, 87,127,155,251, 30, 45,240,229, 63,252, 14,213,251,150, 40, 46, 46, 16, 6,221, 52,167,175, 84,134, 97, 54,240,
+253,136, 7,239, 91,226, 43, 95,185,194,233,233, 57,132, 81,192,175,213, 16,142,205,244,241, 7,137,215,158,201,230, 11, 49,252,
+108, 25,181,155,151, 49,189, 34,157,189,109,220,177, 73,108, 47,135, 83,153,228,242, 83, 95,226,232, 67,247,177,117,233, 18,199,
+ 30,125, 27,203,223,251, 46,147, 75,199,208,109,135,205, 75,151,210,138,188, 66,158,252,228, 36,119, 94,124,142, 19,239,127,146,
+254,246, 54,110,117,140,176,211,166,114,236, 20, 73, 18,161, 59, 78, 42,167,187,121,146,160,143, 94,168,226,239,108,224, 76, 76,
+ 1, 22,168, 36,205,171,235, 58, 36, 17,122,105,142,168,185,141, 48, 44, 14,150,175, 51,121,230, 60,219, 47,125,151,197, 7, 31,
+ 68,179, 61,214, 94,122,150,184,219, 70,232, 54, 83, 71,142,146,171,122, 84, 22,151, 8,122, 1, 55,127,248, 50,249, 74,158, 92,
+165,202,234,197,107,148,199, 39,104, 54, 91,168, 72,103,229,230, 77,246,214,235, 88,166, 32, 55,121,140, 78,187,205,236,201, 19,
+ 52,118, 26,180, 27, 93, 14,182,106, 88,150, 34,137, 34,242,174, 70,101,118, 6,116,131, 78,187, 79, 4, 40,233,115,226,209,183,
+209,220, 62, 32,146, 54,157,102,139,241,233, 10,175, 60,243, 60, 83,243, 5, 44, 71,167, 94,111,177,177,188,131,169,251, 8, 36,
+ 73,239,128, 27,207,188,202,196,226, 12, 70,126, 18,167,112, 20, 75,104, 52, 47, 61, 75,125,251, 14, 39,223,250, 30, 58, 7,117,
+ 38, 79,157,230,213,175,126,129, 7,159,252, 73, 10,213, 18,142,231, 80,219,216,102,108,118,134,157,229, 91,248,205, 26,147,199,
+142,243,234,151,159,226,200,125,247, 50,121,244, 40,245,213, 21,206,190,255, 67,236, 45, 95,227,216,125,247,177,119,103,141, 19,
+ 15, 93,200, 58,203, 61, 0,122,141, 30,185,178,160,120,247, 67, 67,201, 85,104,218,144,221, 77,118,131, 70, 42,132,153, 54, 43,
+ 33,147, 52,114,168,167,190, 7,123, 98,138,242,125,111,165,124,239, 91, 81,170,135, 32,128,160,139, 76, 98,226,192, 79, 95,138,
+ 41,183, 19,169, 18, 84,146, 32,227, 8, 41,227,108,194,147,196, 36, 20, 76,135,247,254,244, 79,195,194,113,168,223,130,237, 93,
+226, 70,139, 4, 65,248,253, 31, 98,189,244, 58, 98,122,130,168,222,226,249,155, 91,236, 36, 33,158, 97, 51,147, 47, 98, 78, 58,
+220,220,221,102,171, 86, 39, 78, 18, 22, 78, 30, 99,254,222, 51,220,238,244, 41,117,218,216,133, 82, 90, 57, 42, 99, 52, 32, 9,
+218,132,219,219,152,149, 50, 50,240, 81,173, 38, 98, 98, 18,242, 69,216,217,165,252, 35, 63,193,143,124,224, 71, 40, 78,207, 97,
+152, 38, 26, 80,120,242, 71,153,249,157,223, 33,172,237,242,195,191,247, 19,140,109,215,184,104,237, 49,247,119,223,229,194,207,
+127,150, 31,254,214, 79, 14, 73,160,104, 3, 65, 88,141, 78,160,172,125, 79, 14, 36,194,172,225, 44,237,125, 31, 72,142,138, 68,
+105, 41,254, 81, 30,222, 55,171, 55,153,211,222,156,199, 30,185,231, 15,231,207, 7,198,183, 97,145, 93,102,234,145,253,122,182,
+135,207,246,219,242,144, 69,237,240,164, 63, 4,206, 64, 18,143,186,229,101, 34,209, 76, 15, 52,137, 10,195, 97,148, 14,237,208,
+215, 25,114,132, 50,207,234,116,133,161, 15,227,108, 42,115,183, 15, 12,110,169,111,240, 77, 55,151, 67, 61,249,114,120, 59, 26,
+ 24, 2, 71, 90,253,200, 85,173,233,105, 90, 90,137,180,195, 97,232,104, 80,135,194,244, 34,109,117, 11,252, 0,101, 89,105,231,
+133,222, 70,151,138,137,247,124,130,155,127,245,123,136,194, 56, 42,140, 81,104, 88,158,147, 78,235,253,136, 94, 61, 76, 35, 88,
+ 8, 26,205, 4,207,134, 91,175,222, 97,166,221, 71, 24,130, 48, 78,200,205, 47,210, 15,214,169, 28, 59,131,225,120,136, 88,161,
+100,130,110, 26, 52,110, 94,163,223,108,113,176,215, 99,245, 78, 13,165, 67,161,101, 83,169,184, 68, 97, 72, 28,248,184,142, 69,
+ 97,204,163,211,234,225, 84, 43, 8,221,196,182, 29,140,106, 21,133, 98,236,196, 20, 36, 49,221,237, 59, 8,153,224,148, 39, 56,
+184,115,139,131,237, 61, 44, 77, 79, 85, 77,173,135,223,236,226,119,124,250, 97,140, 64, 16,199,138, 36,150, 68, 49,180, 3,201,
+ 78, 23, 86, 98,157,253, 94,196,238,254, 30, 5,199,161,154,115, 88, 44,231,169,120, 14, 11, 83,101, 74,197, 60, 57,215,165, 56,
+ 54,150,173,250, 44,132, 76, 11, 96, 84,166,170,152,249, 74, 10,112, 49,108,162, 32, 78,243,244,147, 30,245,253, 21,100, 20,167,
+127,219, 65, 66, 97, 16, 69,204,128, 58, 42, 73,147, 17, 74,142,168,126,168, 44,201, 16,142,250, 27,148,148,200, 12,135,154, 5,
+ 46, 81, 89,212, 22, 5,186, 82,136, 36, 98,253,226,247, 56,241,224,123, 9, 99, 73, 55, 12,184,254,210,247,136, 54,183,184,186,
+179,193,205,205, 85, 38, 60,157, 99, 57, 7,195,116,208, 85,202, 9, 16,154, 65, 18,245, 9,135,109,196,105,123,102,160,146, 33,
+231, 72,144, 30,224,182,235,224, 21, 74,200,184, 59,170,109, 84,105,203,168,146, 58,194, 72,123, 2,146,168,141, 46,192, 49, 12,
+188,169, 57,222,251,179,191,129, 34,129,216,228, 95, 47,204,243,173, 86,151, 71,239,125, 27,239,124,252,231,112, 93, 19, 41, 67,
+226,160,139, 55,229, 83,197,164, 99, 56,120, 79,125,149, 47, 45, 88,252,155,103, 27,124,106,204,160,126,176,199,156, 38, 82,152,
+153, 0,221, 74, 65, 49,138,180,217,243,196,253,119, 99,235,223,160, 17, 65,222,233,161, 57, 41, 12,231, 64,159, 96,233,209, 15,
+112,240,194,215, 82, 15,107, 6,150, 49,220, 82,133,176,215,161, 48, 49, 67,107,103,157,158, 46,232, 55,155, 76,159, 92,194,244,
+198,152, 58,237,177,119,237, 42,229,233, 73, 26,219,155,184, 94, 30,195, 16,216,213, 50,213,165,187, 88,123,254, 89,142,222,255,
+ 16, 59,175,191,204,250,229,215,152, 60,122, 20, 33, 96,242,196,221,232,142, 11, 2,194,118, 3,187, 50,153,202,122,177,194, 46,
+151, 51,110,117,144,238, 86, 98,159,164,211,198, 26, 95, 36,172,109, 18, 52,183,176,139,227, 76,156, 62,141,127,176,203,216,209,
+227,200, 36,225,245,191,254, 43,250, 7,187,204,157, 61, 65,191,213,162, 56, 85,101,226,196,113,154, 59,251,236,222,188,205,248,
+194, 12,232, 58,245,213, 45,132,101,240,204, 87,190,197,252,130,134,229, 46,208, 57, 56,128, 56,100,233,244,113, 44,153, 96,150,
+199,121,227,249, 23, 73,194,144,234,228,100, 54,149, 87,240, 59,125,186,205, 54,190, 31,209,239, 54,105,180, 34,186,187,107,156,
+ 56,183, 68,179,209,196, 48,109,250,173, 62,197,130, 77, 47,180,177,157, 10,165,170,134, 97, 58, 52, 15, 20,115,115, 46, 66, 47,
+209,106,119,113, 39,143,114,238,158,247,176,118,229, 69, 54,175,191, 65,113,108, 28,183, 56,197,185,143,253, 35, 46,127,235, 11,
+188,254,181,167, 56,254,240,195, 56,185, 60,253,250, 1, 43,175,190,134,233,234,236,223, 90,163,182,185, 66,216, 62,141, 91,204,
+241,198,183,158,230,130, 93, 98,236,200, 34, 50, 12, 48, 45,151,149,231,191,207, 61,243, 71, 24,159, 61,142,148, 29,220, 98,142,
+214,222, 1,245,213, 93,198,143,205,162, 89, 38, 42, 10, 48,242, 51,232,134,192, 42,143, 17,182,234, 56,197, 69,208, 53,162,250,
+ 90,202, 56,214,245, 76, 54, 86, 24,133, 34,229,115, 15, 50,254,246, 15,144, 95, 60,137, 53, 62,133,140,125, 48,243, 40, 25, 32,
+146, 0,132, 1,186,129, 64, 16,118,187,105,113,142,174, 19, 51, 32, 71, 73,164,130, 56, 74, 15,216, 94, 20,112,124,106,138,115,
+ 63,242,163, 48, 54, 13,126, 3, 54,183,145,141, 38,210, 50,241,127,255, 79,112,226, 24,230,167,241, 27, 13, 94,184,178, 74,207,
+177, 80,173,144,192, 17, 92,186,190,204,226,217,227,204,190,253, 1,238,255,240, 7, 88,124,255, 71, 49, 11, 21,180, 76,101,144,
+150,195,222,255,246,243,105, 65,132, 74, 64,197,104,166, 67,111,103,157, 98,169,132,140, 2,162,131, 61,172,165, 19, 8,195, 70,
+121, 46,118, 33, 79, 99,245, 22, 34,142,200, 85,199, 49, 28, 7, 35,243,122,152,213, 9,222,254,141,111,179,247,181, 47,115,249,
+227,255, 51,205,160,205,228,151,190,131, 83,158,166,127,176,157,190,180,146,180,255, 92, 74, 53, 50,158,137, 17,229, 20,117,248,
+180, 85,135,118,197, 98,120, 16,101,131,122, 86,232,124,216, 80,167, 14, 69,180, 50, 70,123,246, 82, 28, 77, 24,217,222, 82, 31,
+ 53,217,201,172,152, 95, 12, 77, 75, 35, 93, 93,101, 7,164,200,170, 98, 7,165, 55, 50, 86,195, 3, 49, 53,202,165, 47,112,205,
+ 42,145,244,246,210,159, 83,170,225,126,127, 40, 24, 36, 98, 88, 66,131,150,150,232, 16,201, 65,230, 14,221,114, 82,185, 86,118,
+ 16,137, 68,105, 3,162,223, 64, 41,146, 35,102,125,246,179, 13,248,243,106, 72,117,147,135, 10,104, 64, 70, 9, 66, 83,248,171,
+ 47,164, 50,163, 76,227, 73, 3, 8,141,166,143,214, 19, 9, 33,228,167,210, 70, 70,153, 66,103, 74, 15,124,148,252, 15,190, 76,
+ 55,144,152,194, 68, 15,211,158, 4,163, 23, 18, 4,208,172,247,176,149, 6,161,194, 18, 2,221,214, 41, 20,114,172, 93,217,166,
+ 48,150,167,217,106,163,173, 54,152,190,123,137,168, 83, 71, 24, 22, 81, 20,145,244,186,216,249, 42, 70,190,140, 30, 73,220,138,
+206,249,233, 50, 81, 63,164,215,234, 97,186, 22, 38, 80,153,157, 68,115, 11,180,118,119, 41,204, 79, 19,197, 49,238,196, 20,134,
+227, 98,231, 10,152,150,139,110,234,132,173, 3,242, 39, 30,162, 91, 91, 39, 22, 6,238,220, 9,130,102,131,214, 65,157,126,187,
+141,101, 66,212,143,210,142,135,104,208, 87, 32,233, 7,146, 68,193,118,104,178, 44, 13,252, 36, 98,162,148,231,212, 84, 21, 75,
+ 55,176, 76, 13, 83, 41,202,158, 65,177,144,163, 88, 46, 99, 26, 34, 77, 28,153, 38, 78,169, 76,212,109,163,180, 16,195, 45,129,
+ 46, 80, 73,132, 85,152, 34,236,245, 48,115, 57,170,229, 18,230,108, 14,255,107,119, 16,104,200, 36, 73,159, 17, 61,205,144, 11,
+ 93, 31,169, 49,195, 34,133,193,229, 82,189,217,240,152,173,102,146,204, 4, 42,101, 58,201,203, 56, 91, 17, 42,129, 35, 5,150,
+145, 62, 3,183, 95,122,142,111,124,251, 59,108,246, 99, 90,113,202, 71, 87,164,117,169, 69, 91,199, 82, 2, 83,165, 59,114, 93,
+ 8, 52, 43, 79,161, 48,137,222, 14, 81,173,126, 42,108, 33,233,135,217, 36,156, 93, 11,141,172, 90, 56,104,183,233,170, 24,189,
+232, 66, 2,137,144,104, 50, 53, 15, 11,211, 68,201,136, 20,175,160,178,181,143,198,217,223,252, 19,164, 76, 16,154,198,191, 40,
+205,241,179,247, 24, 76,237, 91, 20, 91, 87, 17, 94,137,208,247, 49, 29, 19,229,107, 28,236,245, 25, 47,107, 28,220,218,226,238,
+121,193, 71,175,134,124,238,161, 60, 79,189,208,225,215,238,191,143,216,247, 73, 6, 13, 77, 34,206, 8,148,169,153,166, 83,111,
+243,240,219,103,217,191,209, 70, 68, 6,186,159, 80,157,240,217,221,232,113,230, 71,127, 25,227,202, 75,196,157, 90,182,190, 3,
+163,119,176,141, 34,193,202,151,144, 97,200,244,185,123, 72,252, 0, 33, 18,100, 28, 19,245, 2,250,141, 6, 73,212,102,238, 45,
+ 15, 82, 95, 91,165,182,182,193,233,119, 62,198, 75,159,255,255,120,228,103,255, 23,118, 94,125, 17,175, 92,230,220, 59,223,133,
+ 48,109,204,177, 89,130,253,109,146,200, 71, 88, 30,134,153, 78,225, 8, 19, 65,130, 18, 2, 25,251,168, 56, 38, 14,250,105,158,
+221,205, 17,119,218, 8, 13, 10, 75,231,136,155,181,204, 40, 18, 83, 91, 93,227,250,115, 47, 48, 54,237, 49,118,250, 40,150, 11,
+249,241,121, 52,225,176,121,245, 58,237,253, 58, 94,193,197, 41, 21,217,190,181,198,157,235,183,217,186,179,204, 93,199,171,156,
+121,223, 19,188,248,149,103, 56, 50, 63,193,196,241, 83, 52,155, 29, 94,123,237, 10,187,119,190,205,244, 92,158, 35,119,157,195,
+205,121, 40,211,224,242, 43, 23,145, 81,135,137,217, 89,122,245,132,229,107, 55,153, 42,107,220,243,142, 71,104, 55,218,196, 81,
+182, 79,141, 67,252, 68,163,177, 85, 99,122, 82, 49,117,236, 2,175,125,239, 18,133, 2,180,250,130,176, 31, 81, 61,114,154,214,
+206, 30,187, 23,255, 12, 69,159,114, 57, 71, 18,117,217, 91,123,131,215,158,249, 34, 31,251,167,255, 26,103,124,138, 31,252,249,
+ 31,115,242,225,199,185,247,195, 31,231,250,179,223,229,216,133,251,169,173,110, 32,208,217, 91,187,197,221,239,120, 31,110, 33,
+199,254,198, 58, 83, 75, 71,232, 54, 58,108, 92,191, 72, 28,197,108,191,241, 18, 74, 56,148,143, 76,227,183,186,116,246,182,232,
+182,218,200,219, 49, 42, 17, 32, 66,138,243, 51,104,152,228,207, 61, 72,251,229, 87, 40, 44, 61, 76,220,171,145,116,118, 80,177,
+143,233, 21,168, 60,244,118,142,254,236, 47, 35,195, 48,189,153,155, 22, 74,165, 21,174, 2,133, 89,174,160,226,198, 0,162, 14,
+129, 79,220,239, 17, 54, 91,144, 36,217, 7, 38,165,113, 75, 37, 73,178, 73,168,213,233,114,238,212,113, 78,127,228, 35,144,175,
+164,148,133,205, 21,212,238, 62,137, 97,210,255, 63,255, 61, 94,177,136, 40,231,145, 93,159,151,175,172,210, 16, 26, 42,231,113,
+123,121,147, 39,254,199,143,114,230,147,159,196, 91, 56, 74,210,235,145,244,251,132,245,125,146, 94, 23,195,113,211,120,143,144,
+ 76,127,230,255, 97,231, 55,126, 14,189, 80, 0, 20,166,109, 16,182,235, 72,223, 71, 24, 14,113,191,135,213,105, 65,105, 12,149,
+243,134, 13,107, 42, 78,136,195, 16,195,177,178,233, 68, 31, 26,250, 38,222,255, 17, 30,122,234,115,172,253,195, 95,165,157, 47,
+114,225,236,199,120,246,123,191,151, 85,168,103,116,133,108,215,139, 54,138,165, 41,169,210, 56, 19,135, 90,210, 6, 49,173,204,
+ 25, 44,178,136,217, 64, 60,214,244, 97,226,125, 48,220,167, 59,237, 1,181,141, 55, 31, 96, 3,231,120, 90,167,122,104, 15,173,
+105,233, 33,171,178, 93,251,208,178,159,154,186,164,212,208,180, 84,137, 81,135,164,248, 84,182, 23,160,153,216, 19,103,209,237,
+ 28,253,205, 22, 42,238, 49, 80, 82,133,174,161, 68,202,160, 38, 67,226,106, 98, 84, 4,131,174,129,202, 36,203,252, 36, 40, 73,
+212,236,140, 34, 3,100,232,186,204,175, 33,213, 96,197, 35, 70, 57,124,141, 12,224,145,153,247,244, 65,156, 45,243, 32, 72,137,
+166,194,244,128,208, 51, 71,126, 42, 69,164,128, 24,153, 86,196,106, 99, 99, 32,204, 44,171,111,164,129,229,164,207,226,199,126,
+133, 55,254,253, 47, 34, 75, 83, 40, 37, 73, 98, 69, 24, 74,186,189,136, 72,104,248,237,148,124,168,123, 58, 84, 42, 88, 37,143,
+ 9, 91,167,189,219,167,180, 56, 71,109,167,193,218,149, 53,142, 22, 39,104,238,214,208,188, 98,122, 25,209,192,174,204,160,156,
+ 42,218, 88, 23,250,109, 10,139, 37,170,154,137,146,138, 68,234, 68, 73,140,142, 64, 86, 12, 52,215,193,144,138,110,167, 79,201,
+ 43, 17, 71, 18,153,244, 73, 58, 17, 73, 24, 35,194, 6,154, 59, 78, 20,133,224, 90,168,196,196,118,170,180, 86,111,211,108,164,
+145,207, 36,142,211,169, 51,129,126,164,216,232,166,135,153,143,194, 18, 9, 5,207, 74,127,125,161, 81,201, 89, 56,186,206,252,
+252, 52,158,231,144,132, 1,142,231, 80,168, 20,177, 92, 27, 33, 4, 97,191,141,102, 8,116, 59,135, 97,187,104,166,141,176,108,
+100, 28, 16, 7, 1,154, 97, 35, 12,157,254,126,135,176,213, 4, 45,243, 90, 32,136, 51, 67,153,166,228,161, 90, 98, 45,189, 96,
+ 11, 61,125,238, 7, 20, 66, 70,135,190,202,194,226,105,107, 93, 58,105,106, 8, 44, 77,160, 39, 10, 93, 79,205, 95,177, 2, 41,
+ 35, 18,153, 62, 35,102,134,148,208, 18,129,101, 11, 28, 4, 57, 67,199,214,116,172,236, 50, 33,136,233, 30,108, 17, 5,157,180,
+249, 78,131,110,148, 41, 70,135, 10, 34, 7, 45,141, 58, 2, 91, 31, 60,167, 50, 53,138,154,138, 68, 37,136, 56, 64,104, 18, 97,
+230, 73,226, 48, 83,184, 18,116,215, 69, 33, 57,184,254, 2, 83, 68,252,215, 61,197,175,111, 36,228,180, 3,190,212, 9, 80,102,
+140,138,116, 86, 87, 54,184,211,221,102, 99, 31, 74,249, 51,188,186,162,168,127,250, 12,191,255, 31,174,114,215,135, 31, 97,226,
+244,121, 26,107,215,211, 24,167, 16, 72,165, 33,101, 66, 18,167,202,106,191,235, 51,119,108,140,155,175,246, 41,229,102, 16,178,
+207,205, 55, 94,231,216,185, 7, 88,190,180,193, 35,191,245,103,188,254,207, 62, 52, 20,183,244,223,252,245, 95,252, 12,113,130,
+ 55, 57, 3,177,143, 55,123, 55, 7,215,223, 32, 63,179,200,234, 43, 47,209,218, 89,103,252,232, 34, 99,139,167,104,111,175, 99,
+216, 38,149,185, 41,132,225, 48,123,234, 12,151,190,254,119,228,138, 22,229,249, 19,180,246,182,112,203, 19, 36,126,151,160,211,
+192, 29,155, 32,108,212,176, 10, 85, 64, 67,169, 40,189,145, 5, 29,244,252, 68, 42,249, 69,126,154, 23, 44, 84, 73, 58, 45,208,
+ 98,132,102,112,237,107,127,131,166,195,197,111, 62,141,101,105, 76,204,205,112,226,173,239,194,116, 11,244,235,109, 58,141, 61,
+100, 44,233, 53, 59,120, 37,143,177,133, 69, 90,251, 7, 92,250,246,243,232,116, 88, 60, 90,230,174,247, 62,193,242,203, 87,152,
+ 60, 58,135,145, 31,231,245, 23, 46,242,205,191,251, 14, 57,217,231,252,249, 37,166,143, 30, 35,137, 4,141,221,117,246,182,118,
+ 41, 23, 61, 74, 99,101,130,126,196,198,237, 45,206,158, 61,194,244,201, 19,188,254,253, 23,232,244,246,179, 78,147,152,126, 63,
+162,117,208,195,214,118, 57,114,239, 61, 92,127,249, 26, 66,196,180,106, 53,188,162,135, 87, 61, 70,237,246, 27, 40,127,131, 32,
+ 9,208, 77, 19,221, 46,160,219, 85, 12,195,195, 52, 52, 94,251,214,223, 50,187,116, 31, 75, 15, 62,194,197,111,127,141, 82,117,
+146,118, 99,151,137,133, 99,212, 54,214, 40,142,205,208,109,109,177,246,250, 37, 38,143,157,102,243,230, 21,170, 83, 41,255,123,
+127,117, 21,221, 50,185,243,234, 15,232, 52, 34,138, 5,155, 36,214,120,227,153,239,161,128,234,244, 4,166,235, 96,218, 54, 94,
+121,156,208,111, 83, 60,114,130,189,111,252, 87,226,222, 1,225,193, 29,236,106,149,179,191,254,187,204,255,248, 63,164,116,254,
+ 97,148,166,208, 61, 15,161,155,105, 95,185,105, 98,184, 30,154,233,130, 33, 33,232,129, 93,130,160, 69,220,105, 81,191,115,155,
+230,126,141,110,167,131, 31,250, 4,126, 64, 18, 37,233,190, 85, 38,116,186,125, 30,189,247, 12, 75, 31,122, 18,188, 66,218, 26,
+184,117, 13,117,107,133, 88,105,244,254,195, 31,225,149, 61, 52,215, 65,118, 3,174, 95,186,205,102, 39,164, 99,233,212, 54,118,
+248,165,245,139,204,191,239, 9,226, 94,143,164,211, 70, 70, 81,106, 92, 49,237,244, 48, 55, 82, 2,156,208, 77,136,122,120, 15,
+ 63, 78,247, 27, 95, 68,203,121,104,166,133, 76, 20,134, 91, 68, 51,116,226, 56,194,202,229, 17,165,234,112, 42,236,236,111, 99,
+216, 46,134,101, 99, 88, 54, 66, 51,135, 69, 42, 3,247,186,185,120, 4,231,158, 83,244, 62,255,119, 4,221, 22,133,179, 23,168,
+111, 92,229, 77,245, 48, 3, 96,203,224,224,210,196,155,202, 87,134, 9, 44,109,244, 53,135, 25, 40,111, 42,172, 25, 58,205,213,
+112,194, 30,192, 91,180,161,187,124, 32, 81,171,161, 47,252,240, 20,164,105, 34,243, 76, 28, 82, 14,132,134, 89, 94,194,112,139,
+ 36,126,253, 77,104,221,129,139, 92, 8, 3,103,234, 46,204,226, 28,193,222, 45,226,238,110,214, 82, 55, 50,189, 41,161,165,117,
+157,111, 94,248,103,174, 53, 53,148,239, 85, 18,147,244,106,217,238, 92,164,159,115,165,165, 17,186,172,214, 86, 28,186, 83, 12,
+ 23, 13,135, 98,111, 35, 78,252,168,150,120, 96, 90, 26, 24,253,100,118, 9,210,117,145,101,242, 5, 82,104, 24, 81, 72,245, 67,
+ 63,149,254,110, 81,144, 42, 56,137,196, 44,140, 33,194,128,229,231,159, 37,138, 53,250, 45,159,218,110, 7, 63,129,110,164,129,
+101, 98,219, 22, 94, 57,143, 55, 49,142, 81,158,193,154, 57,134, 87, 41, 98,229, 10, 76,156, 58, 67,110, 97, 9, 41,108,122, 93,
+159,110,171, 15,186, 67,125,191, 65,167,211, 67,105, 22,186, 83, 6,221, 68,233, 14,126,164, 82, 22,183, 31, 33, 52,131, 88,232,
+196, 81,136, 83, 40,165,127, 43,195, 36,242,125,116,161,240, 10, 21, 66, 63,192, 15, 98,122,245, 58, 43, 55,215, 56, 56,104,162,
+ 37,146,107, 55,214,104,180,125,158,189,180,197,114, 61,228,210, 65, 76,221, 23,108,118, 36,187,161, 96, 59,208,233, 9,131, 62,
+ 38,166,105,224, 90, 6, 5,219,102,190, 90,160, 90,112,152, 26,171, 48, 62, 94, 37, 95,112,169, 78, 78, 80,157,157,194,205,121,
+ 56,249, 60,185, 74, 5,195, 50, 17, 50,101,157,203, 48,133,165,232,186,131, 83,153, 72, 47,241, 82,146, 43, 21, 49, 84, 31, 33,
+ 34,218,175,189, 74,212,235, 29,154,186, 15,251, 35, 6,237,127, 73,214, 64,152, 12, 27, 12,149,208,210,203,115,198, 84, 80,153,
+ 28, 47, 73, 47,194,137, 84,116,101, 12,138,180,242, 84, 3, 79,164, 61,250,253, 68,210,136, 99,250, 82, 17,196,233,179, 98,153,
+ 96, 11,141,138,169, 51,227, 90, 76, 88, 6,121,211,192, 53, 52, 18, 63, 36,136,122,180,195,132,126,156, 16, 36,138,110, 44, 9,
+149, 34, 81,163,202,107, 67, 23,120,186,160,106, 27, 76,185, 38, 37,203,192,213,116, 12, 93, 75,219, 54,181,140, 94, 40, 5,154,
+102, 64, 28, 32,116, 29,103,234, 8, 19,239,253,137, 52,106,232,119,249,227,127,247, 31,249,236,175, 61,204,221,119,246,249, 71,
+ 99,138,218,145, 15,224,234, 26,141,122,151,102,237,128, 86,175,141,103,120, 36, 73,194,196,194, 1,191,240,185,235,124,252,215,
+254, 87, 62,246,217,223,166,183,187, 74, 18,135, 68, 65, 68, 18, 71, 64, 66,228,135, 41,240, 74, 66, 20,129, 72, 34,110,189,220,
+165,152,203,113,208,110, 83,116,171, 68,161, 32, 10,250,148, 38, 79, 48,123,223, 60, 7, 63,252, 38, 66,215, 49, 84,216,165, 56,
+179,128,110,151, 40, 45,156,166, 95, 91, 67,119,108,234,235,183, 89, 60,119,129,131,219,215, 40, 30, 61, 71,103,237, 38,160, 97,
+121, 30, 65,183, 79,243,230,117,226,192,231,248,249,243,228,151,206,112,243,233,191,229,232, 61,231, 8,251, 93,146, 40,196, 45,
+148,169,223,188, 76,117,233,174,244,182,231,251, 88,133, 18, 42,232,163,231,170, 16, 7,217,164, 20,224, 76,157, 32,110,238,160,
+100,136, 85, 61,198,238,203,223,231,236, 7,158,100,229,135,223,231,193, 39, 63,196,171, 95,253, 54, 71,206,123, 52,118,119, 88,
+125,233, 21, 12,221,164,223, 92, 35,191,112,130, 94,175, 67, 20, 88, 52,106,151, 48, 12,131,249, 19, 39,233, 30, 44, 51,115,242,
+ 52,183, 95, 75, 97, 51,237,102,139,229,139,119,232, 52, 14,248,209, 39,223,134,155, 47,163, 57, 22,134,237,209,174,183,113,242,
+ 37,194,126, 31,221, 50,136, 67,197,254,214, 62,167,239,154,162, 50,183,192,235,207, 93, 66, 71,103,126,118,150,110,183,207,214,
+214, 50,182, 81,194, 54,116,202, 51,227,172, 95, 91,166,215,233,210,239, 52,153,156, 41,144, 72,141,230,173, 87,169, 76, 85,105,
+213, 65,225, 99,229, 92,122,126,132, 69,156,146,165,128,137,165,187,120,238,243,127,196,253, 79,252, 15, 44,222,117, 47,107, 87,
+ 95, 71,215, 5,175,127,231,107,140, 79, 29,197,239,182, 16,216,212,247,239,224,150,198, 65, 41, 94,127,230, 59,156,127,219,219,
+ 89,186,112, 31, 43, 87, 94,229,206,218, 62,227, 93,131, 91,175,125,159,249,165, 11,140, 45,206, 97,217, 6,149,106,149,158,159,
+130,110,130,214, 46, 50,129,226,252,113,164, 12,153,255,192, 71, 40, 61,240, 46,140,188,139, 48, 12,148, 16,232,174,155, 82,189,
+178,162, 9,188,252,136,241,103,228,161,187, 5,118, 30,136,137, 59, 45,218, 59,155,180,247,246,211, 14,119,165,136,130,136, 56,
+ 78, 15,116,153, 36,244,250,125,222,254,200, 5,166,223,249,190,212,117,174,123,224,239,195,157,117,226, 40,161,255,215, 95,192,
+ 69, 34, 28, 23,217, 9,184,125,249, 14,161, 40,208, 10, 15, 48,198,114,252,194,237, 54,173,149,215,160,219, 69,183,173,116,178,
+ 20,122, 38, 57,235, 41,125, 77, 79, 51,247,172,230, 80,152, 0, 0, 32, 0, 73, 68, 65, 84,154,161, 35, 52, 29,173, 48,142,115,
+254, 62,226,173, 53,100, 20,162, 99,224,239,108,225,205,204,164, 44,129,102, 10,109,192,176,209, 84, 48,220,235, 42,153,100,197,
+ 42,113,250,189,133, 64,249,109,132, 91, 4, 32,247,246,119,176, 63,255,251,184,125,193,252,220, 61,220,122,225,175,145, 50,149,
+198,135, 56,214, 33,155,252,240, 36, 34, 14,237, 18, 25,230,136,213,160, 70, 54,155,168,117, 93,203,224, 42, 34,107,106, 27,165,
+200, 7,231, 41, 42,221,193,167, 94,179,108,159,174,254,155,166,183,236,224,147,177, 76, 39, 92, 57,180,144,165, 28,251,126, 13,
+165,226,204,173,156,213,208, 26,163, 26, 91, 21,199,132,205,109,162,230, 22, 73,175,150,113,172,147, 81,157,109, 42,184,102, 78,
+252,244,135, 17, 70, 22, 61, 83,114, 88, 70, 35, 4,168,200,199, 26, 91, 32,246,155,168,208, 79,187,250,197, 64,133,144, 89,132,
+ 45, 61,164,213,127,123,176, 15, 14,244, 67,221,239,114,176, 87,215, 70, 94, 16, 50,114,157, 18,234, 16,237, 53, 85, 61,244,249,
+ 5,192, 66,169,110, 74, 10, 28, 16,220,194,144,234,189,239,165,244,252,119,217,221,217,195,111,133,180,252,132, 86, 47,164,214,
+ 3, 76,157,106,209,102,226,228, 17,244,124, 21,105,121,196, 65,140, 81, 57, 66,208,106, 18,246, 99,122,221, 38,186,233, 18,163,
+163,116,141, 48, 8,211, 88,165, 72, 35,174,189,198, 1,213,201,113,116,219, 78, 65, 32,165, 73,250,237, 38,189,126,144,130, 56,
+188, 28, 66, 73,122,173, 14,126, 16, 98, 89, 6,223,127,238, 34,126, 4, 55,214,247,232, 39, 9,145, 74, 13,101,251,189,136,188,
+109, 96, 8,145,162, 72,133,192, 64,195, 49, 4, 13,116, 76,221,164,160,107, 40, 36,227,249, 28,113, 28,147,115, 44,114,182,137,
+169,107,228, 60,151, 66,222,163, 90, 44, 80,154,153,198, 45,228, 65, 74,108,199,194, 45,229,177, 44, 11,205,180, 49,108, 11, 25,
+249, 72, 33,208,140, 8,221,114,176,171,227,152,110, 14,132,134, 95,175,163,229, 99,114,227, 21, 58,155, 27,196,190, 63, 52,135,
+166,207, 91,250, 89, 28,182, 23,102, 8,220,193, 69, 86, 12,203,148,146,145, 77, 68,201,108,167,157,209,255,148,194, 52, 12,236,
+ 72,195,212, 33, 38,229,156, 91,217,141, 87,136,148,128,102, 32,177,132, 64,211,193, 54,210,140,121,209,214, 41, 26,105, 43,156,
+ 45,180, 33,135, 93, 83, 2, 71, 8,114,198,224, 3, 50,242,169, 72,149,118,181, 91, 66,203,238,163,153,172,158,128,148, 6,104,
+ 86, 42,173, 75, 57,186,128, 70,221,244,226,153, 68, 76,255,216, 63,206,146, 27, 80, 88,120, 11,255,228,119, 62,205,187,255,217,
+191,229, 46, 3,190, 19,195,167,207,174,114,234,253,111,165,182,125,135,114,174,194,108,212, 39,142, 19,106,157,144, 83,191,245,
+ 9,190,254,213, 31, 39,108,214,104,111,222, 66, 38, 41,231, 35,138,251, 72, 9,177, 31, 16,249, 62, 65,144,178, 79, 18,108, 58,
+141, 38,186,230,160, 44,147,241, 66, 30,175, 92, 38,110, 6, 4,185, 60,237, 70,159,252,209,247, 99,143,253, 1,113,115, 23,163,
+219,232,162,153,251,208, 11, 9, 58, 7, 52,182,247, 17,244,200,149, 39,105,109,239, 96, 88, 14,171,207, 62, 69,109,109,135, 35,
+ 23, 78, 97,184, 37,154,155,251, 88,174,199,220,249, 7, 73,146,132,253,203,175,178,120,254, 30,154,187, 59,184,133, 60,150,227,
+224, 55,107, 84,151,238, 66, 41, 13, 21,251,232,166,145, 46,190, 52, 45, 53, 4,196, 61,100, 20,225, 76,157,162,113,227, 69,108,
+ 47,135, 59,115, 12,127,247, 54,197,185, 73,234, 43, 43,204,190,229, 2, 43, 47,189, 76,197, 49,112,244, 22,205,173, 29,102, 78,
+ 29,101,231,230, 42, 78,113,138,203,223,252, 27, 30,253,248, 79,179,246,198, 77, 52, 29,122, 82,209,172,245,176, 53,141,253,237,
+253,108,247, 97,178,183,182, 69,169,234,113,225,161,211, 88,133, 50,126,207, 7,169,216, 89,223,165,215,106,145, 47, 56, 20,198,
+198,145,194,224,206,181,155,204, 31,153,166,178,176,200,229,151,111, 96,153, 33,199, 47,156, 99,127,175,195,173,171, 43,156, 58,
+ 61,201, 65,179, 15,154, 34, 10, 20, 59, 91,187,168, 68,113,228,196, 34,181,237, 3, 66,185, 75,161,156,163,219, 11, 64, 68, 76,
+206,206,211,106,133,104,102, 30,165,192,112,114,216, 78,145,221,181, 59, 44,158,126,132,215,159,249, 38, 71,206,158, 67,211, 45,
+188, 92,153,239,127,245, 15,249,200, 63,248, 52, 7, 43,215, 9,163, 22,134,101,145, 47, 22,105,237,239,210,106,236,178,113,237,
+ 42,249, 74,133,110,189,133, 0,114,197, 60,211, 75, 15,161, 11,147, 92,161,192,230,173, 91,252,151,223,251, 93, 62,254,137, 95,
+160, 50,158,195,171, 76,113,176,181,143,101,107,156,253,151,127,128,158, 43, 98,122, 94, 26, 3, 51, 12, 52,219, 29, 18,190,140,
+ 92, 41,213,182, 80,169,100,153,106,212,233, 75,219,176, 32,242,105,111,109,208,171,215,210, 28,186,148, 68, 81,156, 18,212,162,
+ 36, 61,208,123, 62, 23,206,157, 96,250,241, 39,192,176, 65,119,211,197,241,234, 50,178,213, 38, 90, 93,199,184,177,130,113,250,
+ 8,221,181, 77,154,187, 77, 26,137, 69, 83,118, 57,254,158,135,121,199,231,190, 66,251,206,235,104,186,129,212, 70,125,243,106,
+224, 45,215, 70, 68, 57, 49,176,119, 43,144,157, 6,197, 31,249, 57,246,126,251, 83,104,150,131,238, 88, 68, 65,139,216, 47,129,
+ 82, 36,221, 46, 70, 28, 33, 12, 51, 45,253,112,210, 15,109,218,233, 46,145, 38, 4,187,155,252, 31,159,254, 55,108,134, 19, 24,
+202,231, 87, 62,245,126, 78, 60,246, 54, 22,254,243,159,210,124,242, 19,116,151,151, 57,246,246,159,100,249,187,127,142, 76, 4,
+ 66,207,246,204,131,222,245,193,139, 67, 2,250,200, 85, 39, 68,182, 47, 84, 35, 3,157,200, 38,229, 1, 42, 52,165,175,137, 44,
+170, 37,135, 19,188, 20, 98, 72,130,147, 89,163,218, 64, 94, 31,148,214, 12,246,244, 50,251, 94,114, 96, 82, 82, 67,180, 57, 73,
+191, 5,196,163,124, 56, 3,230,187, 24,186,203,147, 94, 3,149,132,153,131, 93, 27, 88,231,135,253,222,130,236,247,205, 84, 1,
+149,225, 38,211,223,119,132, 98,213,157, 18, 70,126, 38,189,204,247, 58, 35,191,193, 97, 70,124, 70,188, 27, 85,195, 29, 70,207,
+ 13,186,169, 14,101,246,147,129, 77, 64,140, 82, 7, 50,147,239,135, 24, 98, 45,155,234,117, 32, 91,167,104, 90, 58,109, 10,133,
+144, 18,169,153,156,124,223, 79,112,240,185, 63, 32, 33, 34, 76, 36,189, 48,161,229,199, 76,184, 69, 22,142,206, 33,240,168,239,
+246,169, 55,118,105,119,122, 92,120,240, 45,204, 28, 63, 65,109,115,149,146,151,103,127,107,135,126,171,201, 55,127,120, 13,199,
+ 50,121,241,214, 14,237, 32, 38,103,233,108,181, 2, 10,158,149,150,136, 72,197,241,201, 18, 66, 9, 30, 58, 62, 67, 20,165,127,
+ 87,191, 31,209, 10, 35, 58,189,128,118, 16, 18,100,238,239, 36, 99, 9,152,134,192, 48, 77,102,139,233, 69, 86, 67, 97,234, 58,
+142,161,163,235, 58,101,207,165,215,239,163,235, 26,158,101, 50,110,154,140, 87,138, 88,134,142,155,169, 13,149,241, 42,186, 16,
+228, 74,249,180,172,165,144, 67,202, 8,167, 88,192, 52,245, 97, 28, 81,215,181, 52,105,164,178,149,145,151, 67, 8, 3,221,182,
+ 83,213, 78, 37,216,158,135,151, 55, 16,142, 75,251,218, 10, 73,167,151,254,223, 27,163, 72,166,146, 41,127, 64,101, 49,229,244,
+ 25,214, 56, 76,238, 25, 40, 49, 41,198, 56, 77, 42, 12, 46,116,166, 18, 36, 73, 76, 65,211, 81,104,105,252, 76,168,116,101,161,
+ 43, 28, 36,142,174,147,179, 36,177, 84,233,222, 92,165,145, 53, 75,128,171,235,216, 42, 61,228, 69,146, 62,142,186, 18,152,153,
+100,149,168, 84, 9,136, 37, 67, 95, 74,222,245,152, 29, 27, 39,236,214,137,101,156,246,196,107, 38,110,113, 18,225,183, 17, 42,
+204,178,223,135,153,196,217,103,213, 48,179,207,184, 64,197, 13,238,255,165, 95,225,107, 63,243, 73, 86, 95,250, 91,222,255,249,
+ 23, 88,188,251, 2,141,237, 14,149, 35, 99, 52, 27, 45, 42, 90, 9, 25, 24, 84,171, 61,190,251,251, 29,106, 87,126,143,179,239,
+ 61,133, 68, 67, 42, 69,208,143,233,181,122, 72, 32, 14, 66,186,157, 54,237, 70,151, 40,182, 81, 74, 35,214, 99, 98, 76,252, 94,
+ 64, 37,159, 32,163, 58, 19, 75,169,210,188,119,103, 13,161, 29, 99,233,151, 63,207,181,127,254, 24,134, 91,200,145,155, 63, 67,
+227,246, 13, 10, 19, 51,236, 47,223,161, 50, 61,137,229, 89,172, 94,188,204,145, 11,247, 51, 86, 44, 49,121,236, 56,206,228, 34,
+151,191,242, 55, 88,182,206,244, 93,119,209,109,214, 56, 88,185, 67,101,110,150,218,202, 50, 99,139, 71,216,187,115,147,137,227,
+ 39,176, 11, 5, 48, 28,164,223,131, 68,161,123,185,180, 76,196, 42, 16,182,235, 88,197, 49,116, 91,176,119,233,135,140,159, 56,
+ 65,127,103, 3,146,152,253,229,155, 20,198,198, 40, 45, 30, 99,247,218, 37,170,243,179, 20, 31,184,159,176,219,101,172, 20,177,
+125,235, 54, 74,104,108,221,184,201, 19,159,252, 57,186, 93, 7, 55,151, 39, 78, 20,205,221,109, 98, 25,145, 68, 62,158, 76, 49,
+127,123,155,219,148,202,121,230, 79, 29, 39, 78, 52, 26,181, 22,126,183, 77, 20,197, 4,221, 62,227,243,179,196,113,204,141,107,
+ 55, 81, 97,192,220,252, 4,149,133, 57,126,248,245,151, 49,180, 38,103,238, 63,199,234,202, 62,175, 60,251, 34,239,126,226, 97,
+238,220,222,135,168,206,196,201,147,220,188,180, 73, 16,111,114,236,248, 49, 14,106,109, 14,246,235, 20, 42, 58, 97,162,227,119,
+ 58,228, 10, 46,251, 59,125,172,194, 52,126,163, 69,109,235, 13,102,142, 61, 64,113,226, 56,157,102,157,110,179, 5, 90, 66,125,
+111,151,184,223, 68,159,115,176,243, 54,181,205, 53,252, 94, 23,153, 36,248,189, 46, 63,248,198, 87,120,248, 61, 31,166, 89,223,
+231,251, 95,255, 10,154,237,113,246,236, 61,152,150, 73,191,223,162,118,113,157,243, 23,142,209,218,214, 56,121,239,189, 8, 1,
+ 59, 43, 55,216, 94, 53, 57,247,104,129,169,241, 24,213,220,196,174,142,167,209, 34, 1,194,178,209,109, 39,117, 19,203, 4,189,
+ 88, 97, 8,207, 30, 4,168, 49, 33,106, 34,204, 28, 32, 9, 15,210,151,153,223,234, 18,248, 62, 50,145,196,129, 79,146, 12,242,
+212,146,217,241, 50, 39,159,252, 56,152, 38,104, 54, 2, 23,213,184,130,218,220, 33,146,144,252,229,231,113, 79, 30, 65,250, 62,
+215,223,184,195,118, 0,228, 29,124, 19, 62,240,185,175,208,219,184,132,102,165, 5, 26,233, 78,245, 80,149, 27, 90, 38,179,234,
+195, 61,172,208, 4,194,208, 81,210, 0,211,194, 57,127, 47,201,214, 58,154,230,161, 37, 9, 73,191,151, 50, 44,122, 93,232,182,
+161, 84, 77, 95,242,186,142,140,211, 11,137, 76, 34, 12,179,196, 39,127,230,159, 99, 29,121,148,159,250,169, 39, 89, 88,154,224,
+149,231, 95,231,160,246,183, 60,244,228, 7, 49,127,236,113,196, 11,111, 48, 55,123,158,101,245,231,169,137, 77, 13,220,110,135,
+ 38,205, 36,203,102, 43,145, 21,196, 41,148, 54, 34,171, 13, 95,126,234, 48, 90, 85, 12,177,173, 90,214,222, 54,136,147, 13,121,
+230, 66,141,250,230, 85,230, 70, 23, 98,120, 97, 56,108,198, 31,100,122, 53,109,212,210,166,146, 40, 91, 13,100,121,250,225,169,
+ 56, 90, 11,168, 36, 96,144,131, 27, 68,144,148, 38,134, 43,132,100,128, 68,205,166,247, 52,170, 62, 56,216,229, 48, 7,159,248,
+ 29,250, 91, 55, 80,113, 55,141, 58,101,117,175, 82,100, 83,153,174,141, 76,112,195,156,126,122, 40,171, 67,148,183, 33,183,126,
+160,100, 12,208,183,186, 24,225,107, 17, 67,165, 64,161,136,147,212,205, 76,212, 67, 25,102, 58, 39,170,236, 96,143, 37, 26, 33,
+185,153, 35,188,229, 61, 63,206,237,151,158, 67,119,118, 41,244, 98,238, 46, 86,209,132, 96,188, 92,162,185,215,100,125,115,143,
+253,182,207, 78,187,199,211,207, 93,101,166,154,195,146,224, 39, 49, 81, 44, 65, 51, 88,237, 4, 4,137,196, 52, 52,102, 11, 14,
+ 57, 67,231, 72,222,195, 48, 13,116,180, 84, 53,208, 77,138,174,139,136, 20,158,145,114,191,157,156, 78, 41,231, 18,151, 19, 90,
+ 45,159,131,110,151,118,146, 50,185, 53,160, 96,167,211,163,165,219,196, 73,186,231, 55, 53,157,130,107, 81,114, 29,250, 81,194,
+ 76,201,163, 31, 68,184,150,201,248, 88,133,124,161,128, 33, 37,229,169, 49, 44,199, 65, 70, 49,229,201,137,116,165,150, 17,206,
+ 76,203,204,228,241, 24, 72,136,251,109,146,160,135,153, 43,160, 91, 22, 8, 13,221, 76,189, 42,186,227,161, 84, 66,123,107, 3,
+ 79, 11,112,139, 83,244,250,109, 58, 87, 95, 76,149, 51, 77,101,208,162, 67,151,188,236, 82, 53,128, 22,169, 44,226, 33,196, 40,
+105, 65,114,232,226, 54,168, 6, 86, 18, 37,193, 80, 2, 79, 75, 63,227, 81, 28, 15, 99,161, 73, 34,112,117, 69, 94, 19,180, 16,
+ 96,164,189,236,150,158,186,228, 83,150,133,196,208, 4,154,144,195,139,144, 20, 18,137,164, 31, 43,130,129,169, 53,187, 76,107,
+ 40, 92,215, 38, 33, 38, 14, 66, 52, 87, 67, 34,137, 67,159,208,111, 97, 4,221,148,117,161,143,146, 39, 42, 78, 50,213, 64,207,
+ 10,146, 4, 16, 33,147,128,160,118, 64,103,239, 6,223,249,163,171,216,253,199, 56,245,143, 79,242,131,255,116,149,220,148, 71,
+113, 54, 36, 94, 55,184,190,125,135,199, 30,123, 11,245,131, 58,203,207, 79,241,236, 95,174,227, 21, 35,112,125, 98,115, 23,221,
+ 12,232,199, 17, 81,146,208,110,152,216,133, 62,179, 83,112,208,242,112,250,103, 57, 53,239, 81,239, 7,236,117, 12,142, 29, 29,
+163,211,185, 73,113,252, 94, 52,161,209,222,111,179,229, 25,156,250,213,207,162,255,171,223,254,205,207,200, 56, 98,229,229, 31,
+ 96,231,115, 88,182,131, 91,173,226, 22, 42, 40,191,135, 91, 78,141, 19, 66, 55,185,254,173,111,210,105,213, 40, 77, 78,224, 20,
+ 75,244, 14, 14,200,143, 79,176,242,234, 43,204,156, 57, 69,115,115,131,242,236, 12, 50, 8,113, 38,103, 81,113, 72,216,239, 96,
+229,138, 4,157, 58,134,155, 75,247, 53,150, 3, 73, 72,212,110, 96,234,169,123,210,158, 60,198,181,167,191,204,226,189,247, 32,
+ 12,139,245, 23,158,197, 41,120, 84,142,156, 96,235,141,215, 80, 73,196,234, 27, 87, 9, 90,251,244, 26, 93,238,126,252, 62,148,
+ 49,198,193,202, 26,181,237, 93,214,151, 87, 88,189,122,133,137,156,228,254, 15,126,144,246, 65,135,213,171,203, 20,171,130,227,
+231, 30,160,223,243,105, 55, 90,116,219, 29,118, 54,119,137,194, 54,221,102, 29, 41, 67,106,219, 93, 10, 78,194,189,239,126, 39,
+177,178,248,193,211,207, 83, 45, 88,156,126,224, 44,173,253, 54,107,119,154, 92, 56,183,192,242,237, 45,106, 91,155, 44,221,189,
+192,237,235, 91,180,235,219, 44, 45, 77,147,160,179,186,188,141,107, 43,226, 40,194,239,116, 9,162, 62, 97, 40,137,149,160,125,
+208,162,219,220, 69,211, 29,252, 86, 11,195, 40,160, 52, 65,179,182,131,229,184,196,126,143,205,245, 13, 12,195,192, 48, 13,110,
+ 95,191,202,252,145,227,244,123, 45,116, 12,182,247, 55,217,186,157,130,105,166,102,231, 9,251, 29,238,172, 44,179,116,226, 12,
+141,218, 46,154,238,178,189,189, 67, 99,191,206,214,237,155,156,125,228,173,172,222,184,197,217,179,243, 76, 47,150,177, 11, 85,
+204, 66, 33,157,240, 12, 3,205,113,208,172,148,152, 39,116, 13, 61, 95, 30,141,116, 34, 27, 23, 18,153, 78,218, 81, 15, 12, 7,
+213,107,210,222, 90,167,185,185, 69,189,182, 79,175,219, 35, 12,125,162, 1,189, 76, 41,108, 1,239,252, 39, 63,159, 74,238,154,
+ 1, 42, 7,180,225,202,235,196,205, 46,193, 51,223,193,234,116,209,139, 46,173,149, 77,110, 6,138,104,172,196,238,250, 54, 63,
+189,186, 78,127,231, 26, 66, 51, 80, 66,207,164,112, 61, 59,115,180,116, 66, 19,105,219, 88,122,176, 15,112,141,122,186, 95,243,
+242, 8,161,112,238,186,159,214, 83,159,231,255, 39,235, 61,131, 37,205,238,243,190,223, 9,111,232,183,211,237,155,230,134,201,
+ 51, 59,187, 0, 22, 11,236, 46,136, 68, 1, 32, 64, 2,140, 32, 9,138, 42, 6,155,146, 37,154,148, 69, 37, 75,162, 44,127,177,
+ 68,149,100,203,102,149, 75,150,168, 18, 85,182, 40,209, 2, 45, 75, 44,217,148, 64, 73, 96, 0, 19,210, 2,139,197, 98,243,238,
+236,196, 59,115,115,232,219,249,205,231,248,195,121,187,251, 14,141,170, 45,236,236,204,237,219,115,187,251,156,127,120,158,223,
+163, 91, 11,168,192,167,204,113, 34, 46, 45,240,155, 11,136,246,162, 91,129, 20, 41,217,164,143,144, 26,191,217,230, 91,191,241,
+239,248,213, 63,218,226, 47,255,217,159,100,115,221, 80,247, 51,222,251,129,235,124,237,165,251, 92,187,176, 72,237,195, 31, 34,
+253, 87,191,129, 94,104,208,141, 15,201, 6,199, 51,155,215, 76,121,115,102, 87, 46,206,120, 71,167, 98,183,105, 84,168,197, 62,
+ 18, 70, 50,139, 75,149, 60,178,163,180,149, 50,247,236,159,155,118,167,226, 76, 87, 59, 83,224,203, 41,209,198,177,229,177,246,
+ 81,101, 62,103,172, 98,103,147, 91,166, 88,214,105,202,197, 20, 14,115,182,184, 56, 99,208,151,179, 85,195,116,186, 32,207,240,
+ 8, 42,207,114,145, 32, 40,206,160, 93,237,188,126,152, 21, 33,213,252, 69,137, 51,124,249, 71, 9,116,238,247, 31, 65,200,207,
+ 39, 13, 83,255,112,181,111,119,211, 16, 75,235,218, 53,234,207,124,175, 59,120,243,164,138,110,243, 33,143,177, 42,192,166, 57,
+182, 40,208,170, 73,212, 92, 68, 9,197,202,242, 34,239,250,224, 51, 68,117, 31,109, 45,245,208, 39,242, 20,139,205,128, 31,250,
+200,147, 92, 88,105,241,216,197, 69, 86, 27, 53,214, 87, 58, 52, 61,201,123,206,119,216,108, 6,108, 54, 2,214,162,144,165, 70,
+141,205, 78,131,205, 78,131, 86, 20, 80,247, 3, 86, 58, 13, 90,181,136,165, 78,139,122,224,225,107,141, 53,165, 67,210,250,154,
+186, 47, 73,139,130,181,118,157, 80, 73, 22, 66,143,102,232,211, 14,124, 34,223,167, 17,120, 44,215, 35, 30,191,112,142, 70, 84,
+ 99,169,221, 98,109,185, 67,179, 94,103,161, 17,113,225,252, 58,126, 16,176,180,186, 68,179,211, 36,234,116,104,180,219,212, 59,
+ 11, 14,247, 92,102, 40,111, 10, 68, 42, 17,149,237, 84,106,133,246,125,116, 24, 34,148,135,148, 10, 29,212,240, 90, 29,130,122,
+199, 5, 37,109, 63,164,222,233,208,106, 9, 84, 51,164,251,149,151, 24,189,254, 85,108, 94,206, 2,153,108,117, 92, 8, 33,102,
+ 60, 5, 23,128,226,156, 14, 51, 6,194, 60,214,207,125, 84,206,190, 39,171,162, 85, 75,137, 18,211, 92,115,139,146, 10, 97,220,
+ 10,168, 4, 98, 99, 72, 75, 75, 77, 73, 58,129, 19,198,105, 33,104,106, 77, 39,208,212,149, 64, 27, 23,153,154, 23,150,164, 40,
+ 57,141, 11, 14,179,130,126,110, 24,229,150,114, 26, 60, 3,148,121, 78,154, 76, 8,165,165,169, 21, 43,129,162,233, 41,106, 38,
+199,211,174, 40,195, 74,164,223,192, 22, 41,194, 90, 39, 36, 22, 30, 11, 31,254, 94,130,115, 29, 76, 50,161,204, 14,216,250,242,
+203,124,249,151,238, 48,220, 91,229, 29,127,162,205,209,237,152,254,201, 33,135,119,142, 57, 62,200,168,249,112,255,232,128,225,
+142,129, 60,192,212, 6, 28,246, 78,233,103, 9,253, 1,220,218,143,233, 29, 53,121,115,119, 72,220,111,115, 26,167, 20,227, 22,
+223,124,107, 66, 49, 58,199,149, 27,151,168, 47, 42, 30,220,223, 33, 43, 11,242, 33, 12,187, 57, 23, 31,191, 76,173, 81,103, 52,
+ 26, 96, 75,201,234,187,159, 65,253,197,159,248,254, 95,144, 66, 83, 76,134,232, 80, 51, 25, 12, 93,176,213,242, 38,182,200,105,
+ 92,122,156,157,151, 94, 98,210, 61, 33, 29,140,184,250,204,123,200,226, 17,217, 36,197,154,130,248,244,148, 11, 79, 62, 9, 66,
+ 50, 62, 57,166,113,110,141,176,115,142,209,254, 67,252,230, 18,118,220, 67,212,218,136,108,132,240, 27,152,204,141,110,164, 86,
+ 8, 99,241, 91, 11, 72, 63,164, 72, 39,172, 92,187,142,201, 74, 94,254,205,223,224,234, 7,222, 71, 58,236,209,223,221,163,177,
+188,140,240, 66, 76,146, 80, 20,146,248,112,135,171, 31,253, 8,233, 40,225,104,107,143,124, 28,179,114,110,137,167, 63,242, 97,
+ 46,126,240,227,220,121,241,117,162, 86,196,198,229,199, 88, 92, 90,197,104, 77, 81, 26,210,113,194,225,206, 1,109,223, 39,242,
+ 60,162,134, 70, 6, 33,218,131,139, 79, 60,206,246,214, 46, 59,119,183, 81, 69,204,165,119, 93,165,123,112,202,238,246, 62,161,
+ 7,189,193, 9,233, 32,229,210,213,101,122, 39,167,132,158,226,169,111,123, 22,107, 61,110,190,177,139, 20, 3,150,150,218,180,
+ 23, 86,217,222, 58, 37, 25, 14, 25,199, 19,226,225,128, 34, 27,146,230, 5, 66, 90,148, 23,144,229, 3,242, 60, 69, 8, 75, 26,
+143,233, 15,199,180, 90, 75,156, 28,238, 17,250,117,142, 14,143, 40,227, 9, 39, 71,135,188,241,230,107,180,219,231,184,125,231,
+ 37,150, 23,214,185,121,251, 13,174, 93,123, 7,121,150,114,120,184,207,147,239,125,150, 23, 94,124, 14,145, 21, 44, 44,157,163,
+ 22,213,216,186,117,135,143,125,242, 25,214,174, 93, 70, 4,181, 74,221,109,144, 58, 64,250,161,179, 46, 89,231,135, 20,181,214,
+153, 91,193, 58,107,152,148,149,154,185,172,102,180,134,228,248,128,209,254, 62, 39, 59, 59, 76, 70, 19,138,220, 85,148, 38, 47,
+ 16, 72,134,195, 49,159,254, 75, 63, 3,209,130, 59, 64,173, 70, 8, 15,122,183, 41,111,221, 39, 75, 19,204,191,249,247, 4, 23,
+215, 41, 6, 67, 94,127,249, 62, 59,131, 33,111,189,253,128,255,102,235, 69,108, 62, 60,163, 26,179,238, 66,151, 46, 39, 64, 84,
+ 1, 42, 98, 30, 65,230, 40, 86, 66,128, 41, 16,131, 46,191,240,211,255, 45,127,247, 31,124,150,209,131,251,124,251, 99, 11, 20,
+194,160, 61,159, 34,201, 17,158,143, 16, 18,237, 7,168,181,243,110, 13,226, 7,140, 14,183, 17,202,163,179,121,153, 31,251,177,
+ 63,199,147,207,124,128, 31,251,153,239,229, 95,255,147, 95,230, 7,254,139, 31,161, 57, 56,225,251,126,230,207,241,251,159,251,
+ 26, 79,190,247, 26,147,131,135,232,251,251,132, 87,174,115,124,251, 27, 85,119, 45,230,177,167,213,197,236,238, 59, 87,229,255,
+255, 82,196,206, 52, 42,178,202,254,118, 93,171,249, 99, 0, 26, 59,219, 81,207,137,109,211,223,171,212,235, 21, 18,110,230,109,
+ 63,131,172,181,143, 36,182,157,177, 18, 85, 8, 87, 42, 44,108,165, 90,154,251,208, 43, 21,242,236,192,174,246,219,198,216, 25,
+ 2,214,206,160, 50,211,219, 94, 59,111,123, 53,198, 21, 66, 84,164,183, 63, 6,198,153, 38, 94, 73,129, 8, 34,188,198, 34,228,
+153,219, 93, 50,231,221, 51, 77,162, 19,243, 90,115,110,249, 19,103, 92,127,103,146,237,170,167,163,181, 36,188,241, 1, 26, 79,
+126,104,150, 2,232,212,118, 18,164, 66,218,156, 60,158,144,199,110, 66, 83, 76, 6,180, 22,106,172, 94, 88,195,150, 37,202, 15,
+176,101, 73, 88,243,168,215, 35, 46, 95, 89,101, 97, 99,157,197,213, 69,116, 16,112,254,202, 38,171,203,109, 86,151, 91, 44, 54,
+ 3, 22, 26, 53,150, 91, 17, 23, 46, 45,179,210,172,209,168,105,234, 81, 72,189, 22,112,110,177, 69,189, 22,208,136, 28,244,197,
+215, 30, 69,150,224, 41,137,167, 37, 89,146, 16,133, 62,157, 86,192,242, 66,139, 72, 10,218,245,128,186,239,187, 14,188, 29,177,
+177,178,200,242, 98,147,213,181,117, 22,151,151,169,213,106, 52,154,117, 2, 79,179,188,177,202,194,234, 18,245,102, 19,237,121,
+ 52, 23,151,241, 61, 7,153,209,190,118,232, 80, 79, 35, 17, 46, 64, 5,129, 41, 10,130, 86, 19,229, 59,184,140,210, 1, 58,170,
+ 35,181,135, 14,107,248,173, 37,188,122,147,163, 87, 94,192,196, 99, 58,155,155, 68, 13, 40,242, 33,135,191,245,235,228,167,125,
+231,132, 48,115,130,226,108, 10, 85,218,185,206,227,145,178,140, 57, 6,121, 54, 36, 50,206, 53,129, 91, 47, 9,241,104,146,160,
+170,114,204,133, 20,213, 69, 12, 73,233, 86, 6, 13, 37,232, 4,154, 80,184,241,122, 67, 43, 22, 3,143, 80,106,116, 53, 89,202,
+141,227,188,247,139,130,163,196, 48, 46, 93, 65, 96,177, 21,226, 87,160,112,141, 72, 36, 37, 11, 90,177,228, 41, 58,202, 35, 84,
+ 46,229,205,150,224,213,151,169,173, 94,197,100, 9, 38,139, 17,198, 2, 5,157,143,252, 32,193, 90,141,120,119,135,255,240,243,
+ 95,229, 11,255,234, 24,169, 36,141,134, 96,117, 77, 17,179, 72,214, 63,118,159,181, 50,195, 76, 20, 39,113,215,217, 37,165,226,
+244,164,160, 30,182, 17, 72, 50, 51,161, 29, 44,128,134,205,232, 28, 37, 9,163,114, 68, 47,237, 81,144, 80,211,109,108,156,113,
+251,246, 14,232, 26, 45,189, 72,171, 86,163, 22, 45,115,237,233, 13,234,203,117,202, 73,201, 96, 56, 32,233,129, 94,188,112,145,
+201, 96, 72,123,253, 2, 97,187,205,253, 23, 62,199,230,103,126,156,187, 47, 60,199,226,250, 58, 15,190,254,101,122,135,123,180,
+151,155, 44, 93,185, 68,111,119,159,214,114,135,104,245, 28, 20,110, 15,178,127,235, 13,206, 63,245, 1,214,223,253, 94,138, 52,
+ 99,116,176,141, 95, 11, 41,227,145,203, 69, 79, 99,132,242, 16, 18,210,211, 19,106,171,107,238, 98,247, 3,240, 66,226,195,251,
+120, 81,155,222,246, 93, 14,239,222,227,169,239,254, 4,111,253,209,115, 60,249,221,159, 32,233, 13, 56,221, 59, 98,251,230, 91,
+132, 53,197,210,210, 26,239,252,115,127, 22,252,136,131,219,175, 49,238,245, 56,255,248,101,148, 31,112,122,220,229,246,235,191,
+ 67, 84,143,240,234, 75, 46, 57, 14,201,112,175, 75,150,197,216,220,178,113,249, 2,194,211,152, 92,112,180,117,139,206,178,194,
+ 15, 60, 94,125,254,155,140, 79, 71, 52,154,138,206, 98,135, 60, 25, 19,143, 39, 68, 53,159,120, 52, 98,253,194, 58,229,186,192,
+164, 5,173, 78, 13, 99, 37,119, 31, 60, 96,208, 29,209, 63, 61,230,189,223,118, 9,165,155,228,153, 96,125, 99,157,195,195, 46,
+ 39,167, 39,148,229,136, 56,147, 28,159,244,136,116, 70,107,233, 42,136, 4,165, 61, 70,195, 33, 65, 24,185,149, 95,225, 49, 24,
+109, 83,150,146,188,136,185,191,179,141,148, 1,146,152,237,189, 93, 58,157, 54,175,222,124, 25,165, 20,127,240, 71,191,205,234,
+218, 6,199,221, 46,195,223,249, 77, 30,187,244, 14,254,159,223,250,119,188, 55,181, 92,187,116,129, 31,254,169,239, 69,132, 53,
+240, 3,180,167, 49, 69,137,174,133, 8,165, 92,220,229,116, 90, 18,134,243, 52, 14, 97,157, 61, 77, 77, 59, 60, 5, 36, 32, 61,
+204,228, 20,140,101,120,116,204,168,215,195,106,207,121, 42,129,194, 88, 10, 83,240,157,223,243, 81,104,175,128,246,171,177,148,
+198,210,135,237, 93,231, 91,255,221,223, 35, 56,191,140,205, 11, 6,187,199, 60,156,100, 12,211,130,239,249,155,127,154,112,245,
+ 50,121,119,123, 14, 87,153, 18,239,164,194, 8,235,134, 7,210,161, 70,231,163, 59, 7,169,240,149,229,187,190,251,103,249, 19,
+ 63,252, 87,248,212,227,134,175,188,125,135,201,173,151,249,235, 63,244,110,242,194, 9, 19,109,158, 99, 3,143,244,228, 24,109,
+ 10, 16,218,121,106, 5,216, 34,195,154,130,214,226,227, 44, 52, 45,167, 91,119,248,103,191,246,207, 1,248,239,255,201, 63,229,
+ 67,159,252, 56,225,194, 37, 6, 71,199,116,254,210, 95, 96,248, 95,254, 28,157, 27, 79,187,231, 81,117,204,211, 11,231, 17, 7,
+153,176,206,207, 45,167, 23,225, 20,196, 98,103, 22, 55, 99,173,139, 57,126, 36,162,148, 71,212,236,115, 53,248,153,240,146,105,
+155, 62,179,126, 49, 91, 69,184,125,250,163,105,104,179,245,197,217, 8,214,202,151, 46, 85, 88, 9,232,242,106,114, 35,230, 52,
+ 60,229, 70,241,101,105, 17, 82, 35, 85,128, 41, 38,149, 13, 79,205,118,140,186,185,142,240, 2,242,254,125, 68,153, 87, 75,124,
+ 59, 63,240,109,101, 1, 84,211, 36, 13,133,215, 88, 67,232,128, 98,116,122,166, 88,179,143, 68, 0, 79,215, 64,182, 52,179,233,
+194,156,222,231,126,182, 74,200,106,202, 48, 5,232, 88, 84,180, 52, 53,209, 87,223,207,175,126, 64,185, 11,140,242, 35,188, 32,
+192,143,106, 44, 95,190, 68, 49,236, 81, 95, 59,135, 16, 37,249, 36,198, 22, 57, 66,182,240,163, 16,164,162, 72, 29, 5,179,190,
+180, 64, 89,150,110, 76, 95,150,140,122, 3, 58, 69, 65,150,228,148,105,134,177, 80,230, 25,105,156,145, 23, 78, 15, 97,173, 2,
+235,172,121, 6,131, 18, 1,201, 36,165,217,140, 96,173,141,148, 30, 69, 81, 96, 41, 89,106,183,200,203,210,249,166,243,140, 90,
+ 88,163,179,186, 10, 88,194,122, 11, 47, 12, 40,203,204,189,174, 69,129, 10, 2,164, 84, 4,145,143, 45, 74,130,102,132,146,146,
+ 98, 50, 4,163,144,158,166, 76, 83,172,180,100,131, 83,106,157, 37,231, 76,200, 98,252, 90, 29,139, 65,121, 1, 66, 40,116,173,
+134,174, 53,240,106, 13,108, 81,224, 71, 13,130, 70,141, 48, 2, 25,212, 48, 73,128, 45, 42, 63,121, 81,206, 35,131,172,197,170,
+ 51,204,227, 89, 78,130,153,227,145, 43,125,132, 53, 85,143, 48,195, 44, 75,103, 45, 44, 43,199,201,116,127, 93, 41,241,167, 70,
+ 16, 89,217,206, 26, 90, 83, 90, 8,113,123,116,163, 33, 85,134,154, 84,120, 8,199, 84, 80, 18,100, 13,202,161,203,174,168,130,
+123,106, 66,208,212, 2, 83, 74, 74, 99, 92,173, 87,173,111,252,138, 49,239,219, 42,147,188,218,191,251,158,194,152,148,228,100,
+139, 34,238,207, 37, 31, 70,114,250,245,231,248,237,127,252, 18, 55,191, 50,162,177,146,210, 90, 78,193, 36,172, 60,246, 52, 94,
+ 35,226,233,252, 47,240, 92,244, 63,145,142,250, 68, 13,205,233,164,199,165,165, 21,188,154, 32,233, 11, 34, 45, 25,103, 41, 4,
+ 37,202,106,222,249,228, 18,223,252,198, 14,169, 63,166, 93, 91,162,155, 28,209,241, 87,216, 88,188,198, 82,171,197,189,221, 29,
+ 54,151,158, 96, 16,247,184,124,227, 34,175,189,249, 69, 30,219,248, 32, 91, 47,191,200, 51, 63,252, 41,186, 15,250,104,161,232,
+ 29, 14,208,147,193,144,164,223,197, 26,143,173, 87, 94, 98,113,125, 21,147,231, 36,221, 19, 14,135, 61,252, 70,139,229,181,101,
+ 22, 54,207,243,240,213,215, 88,190,116,153,201,112,200,194, 99,239,230,237, 47,252, 14,195,222, 33,207,254,232, 79,114,122,251,
+109, 26,171,231, 56,188,245, 42,235,239,124, 47,113,191,135,202, 19,106,171,151,153, 28,237, 81, 91,232, 48, 57,222,199,111, 52,
+ 40, 83, 39, 34, 75,250,110,116, 28, 45,180, 57,188,115,151,198, 66, 29, 79, 90,116,212,226,242,123,222, 69, 50,140, 57,184,123,
+143,173, 87,222, 98,227,218, 58, 79,252,224,143,146,119, 7,116,183,183,121,240,250,171,132, 81,131,139, 55, 46,225,181, 23,185,
+253,194,203, 20,233,136,122,179, 65,158,166, 12,143, 79, 64, 5, 12, 7, 67,108,158,210, 59,233,146,142,187, 72,191, 65,232,151,
+ 4,181, 14, 11, 43,231,200, 40,217,221,218,101,117,181,193,187,159,126,154, 36,206, 72,178,132,126,127, 72,156, 22, 12, 78,251,
+ 76,198,251,148,118,200,185,205,203,108,239,158,178,253,224,109, 54,214, 58, 40,173, 24, 14, 83,206,111, 54,192, 70, 12,227, 49,
+147,126, 70,145, 25,178, 44, 39, 73, 50,242,162,192,148, 49, 87, 47, 52, 80,202,103,107,111, 27,229, 55,240, 68, 73, 20, 54,221,
+170, 47,239,115,243,238,155,116,218,154,135,187,175,179,126,174, 77, 18,231,244,123, 59,156, 63,127,157,237,157,155, 44, 54,159,
+ 96, 60,121,147, 86, 99,145,254,100,196,228,222,109,122,147,132,183,146, 33, 55,239,239,114,227,234, 83, 60,220,191,197,223,254,
+197,191,201, 56,203,209, 81,232,198,204,121,142, 14,195,106, 60,236,186, 21,237, 5,110, 68,206,153,228,171,178,156,207, 57,221,
+ 73,232,108,136,249,136, 50, 75,137,123, 39,196,131, 62, 88,220, 62, 93, 73,242,212, 89, 20, 67,237,179,244,238,167,156,109,109,
+230,163, 42,161,191,135, 57,238, 82,228, 25,188,245, 54,226,210, 38,229,120,204,205,123,135,168,166,143, 25,142,120,255, 47,254,
+115,178,211, 59,213,184,190,116, 22, 40,233,158,171,148, 26,137,117,148,186,233,206,214,184, 21,129, 53,146,176, 25,240,255,254,
+226, 63,230,195,159,254,243,124,236,253,143,113,233,156,207,119,159,174,240,197, 55, 46, 97, 70,175, 96,234,139,120, 90,146, 22,
+ 25,182, 12, 40,226, 17,244,123,136,206, 50, 82,249, 72,161, 48, 66, 66,105,232, 15, 15, 9,228,101,174,190,251,221, 28, 14,122,
+179, 14,227,151,254,183,127,200,255,248, 47,126,135,222,193, 22,173,149,101,228, 51,239, 66, 25,129,108, 46,144,143,122,206, 75,
+ 62,189,160,167,105,105,103,104,113, 98, 10,118, 17,103,236,108, 22, 76,165,157,159,118,178,162,178,127,207, 95, 19,135, 86, 45,
+167,226, 55,139, 67,249, 82,221,151,213, 40, 94, 41, 49,167,211, 21,211, 34, 96,122, 57,139, 51, 5,135, 83,247,206, 46,218,234,
+185, 26,172, 43,108, 68,165,111, 47,166, 59,248, 51, 54, 61, 11,210,107, 99,172,193,152, 49, 66, 74,138,202, 35, 79, 97, 17,233,
+ 0, 59,201,177,133, 43, 12,164,117,143, 43, 42,221,128,208,129,123, 47, 25, 23,240, 99,115, 67, 25,143, 48,197, 49,182,200,220,
+225,110,108, 69, 38, 19,238,189, 56,163,244,149,103, 84,246, 83,202,142,152,141,232,203, 98,186,111,175,238,113,164, 3,223, 96,
+221, 46,221, 15, 33,141, 93,183, 46, 37,232,208,229,132,183,219, 52,180, 19,241,146, 47, 3, 25,101,156,224,213,234,116,174, 52,
+ 40,227, 9,104,141,181, 5,170,222, 64, 55,154,144,142, 40,146,196,233, 49,132, 4, 95, 98,165,199,164,223, 39, 29, 78,220,197,
+ 93,134,232, 70, 78, 54,206, 0,229,114, 76,112, 35,247, 34, 78,240,235, 17,237,118, 8,198,115, 3, 19, 37,104, 46, 45, 80,164,
+ 73, 53, 22,118,197,166,146, 18,229, 5,120, 65,132,212, 10, 47, 10,208,126,132, 45,221,238,219, 20, 37, 74, 74,172,176, 40,207,
+131,192, 67,216, 18,229,215, 28,205, 50, 79,145, 86, 34,130, 0,147, 37, 72,169, 41,134,189,202,190,169, 81,202, 3,233,118,195,
+202,247, 80, 97, 29,191,189, 68,127,235, 14, 90,123,248,245, 6,205,134, 64,105, 87, 60,244,191,246, 42,233,241, 81,149,178,103,
+231, 16, 68, 41,177, 69,129,240,228, 44,159, 88,216, 41, 76,168,186,100,237, 52, 53, 87,206,180, 23,211,194,210,158,161, 33, 98,
+203, 10, 13,236, 62, 15,211,211, 72, 75, 65,205, 74, 39,156,149,146, 64, 73, 60,233, 82,239,146,194,224, 43, 65, 32, 92,231,237,
+215, 86, 80,181,101,138,242, 54,158, 25, 18, 74, 65,199, 19, 8,235,126, 86, 9, 37, 69, 41, 80,202,137,240,180, 21, 4, 82,208,
+ 82,130,154, 18,104, 3,138,210,101, 97,148, 5,118,210,115, 86,202, 42,192, 71,135,171,116, 55,255, 60, 47,125,254, 46,253,227,
+ 1, 23,158,108,209, 63,200,169, 7, 37, 75, 43,239,227,219,159,253, 71,116, 38, 47,146,141, 66, 62,181,248,211,252,171, 87,191,
+139, 35,241,105,174,174,105, 14, 7,135, 52,194,136,123,219,247, 56,223,190,128, 73, 50, 78, 71, 49, 27,231,150,121,245,230,235,
+124,250, 83,223,207,103, 63,255,219,188, 99,105, 21, 79, 55,232, 4, 75,156,246,247,152,140,186, 92, 88, 95,133,124,204, 56, 61,
+162,187, 27, 35,133,226,153, 79,222,224,149, 47,188,198,221,231,111,227,121, 17,214, 64,212,140,144,101,150,177,114,253, 9,198,
+189, 30,139,231, 86,105, 44,175, 80,140,251, 52, 23, 23, 56,247,216, 53, 86, 47, 95,160,181,126,129, 44,205,104, 44, 46, 18, 52,
+ 91, 44, 94,112, 89,233,227,238, 33,207,254,200, 79, 50,216,190, 79,216,106,241,224, 91, 47,176,114,241, 18,170,190, 72,210, 61,
+ 33,108,118, 40, 38,167,132,205, 22, 50,172,147, 15,187,232,214, 18,131,221, 45,138,116, 66, 17, 15, 72,250, 39, 16, 46,115,122,
+255, 30, 65,179,195,218, 59,222,197,209,219,183,105,158,191, 66, 62, 30, 81,111, 52,120,250, 19, 31,231,218, 7, 63, 68,188,183,
+205,238, 27,111,240,210,239,253, 1, 81, 75,210, 89, 95, 33, 45, 4,111,191,248, 26, 39,251,219,116, 86, 59,104,173,233,172,174,
+162,188, 26, 15,223,222,225,171,159,255, 67, 94,253,202, 87,104,120,134, 11,151,174,225, 41,201,202,198, 85, 38, 73,201,193,209,
+ 62,119, 94,125, 21,145,245, 89,218, 92,228,193,246, 30,247,238, 63,224,237, 87, 95,225,244, 96,159,219,111,190,137, 77,143,185,
+116,233, 26, 69, 82,146, 38, 99,122,199,167,124,199,199,190,157, 75, 87,159, 32, 43, 34,146,201,152,102,103,129,126,191,207,225,
+246, 9,133,153,128, 54,212, 26, 30,151, 54,214,233,212,151,105,132,109,210, 84, 48,154,228,216, 66, 16,169,128,162, 44, 72,242,
+148, 97,156, 32,181,160, 55, 58, 33,141, 3, 60,134,236, 31,158,114,127,103, 11, 35, 20,175,188,245, 22, 81,205,227,171, 47,191,
+202, 82, 59, 98,231,228,132,192,243,232,142, 99, 2, 79,179,208, 12,121,241,222,109,110, 92,239, 47,154,189, 0, 0, 32, 0, 73,
+ 68, 65, 84, 90,224, 95,254,250,103, 25,231, 14,166,130,117,112, 21, 21, 56, 4,175,144, 18,169,117,213,161, 7, 21, 83, 80,205,
+213, 85, 74, 87, 55,133, 7, 4, 78,218, 90,164, 96, 11,146,227, 35, 78,238,111, 49,158, 76,156,122,212, 66,145, 22, 20, 73, 66,
+ 60,202,248,196, 39, 63, 4, 65,139, 89,110,168, 21, 64, 6, 7, 7,148,227, 9,249,214, 22,202,211, 8, 83,178,243,198,125,134,
+ 11, 11,244, 30, 28,242, 39,255,227,175, 98,178,163,234, 16,102,166, 94,118,103,133,235,166,133,212, 8,237,205,199,240,179, 74,
+ 58, 71,249, 30,255,240,223,253, 30, 31,126,255, 19, 92,222, 12,248,197, 95,248,171,124,230,207,252, 20, 55,174, 7, 12, 83,131,
+205,115,164, 18, 72,139, 99, 78,219, 18,115,122, 50,223, 51, 75,144, 24,208,154, 82, 22,188,113,171,203,157,123,111,241,153,239,
+251, 30,119,152,120, 48, 49, 17, 23, 46,249,124,235,185, 55,157, 74,247,199, 63,131,217,218, 38, 90,220,152, 43,208,153,101,178,
+ 58, 30,246,153,101,183,153, 38, 87, 85,207,123,218,129, 78,215,199,211,238,211, 78,211,171,230, 16,249,121, 62,250, 25,194,170,
+ 41,237,124, 84,125,134,139,238,186,250, 51,217,234,198, 96,138,178,250,190,165,155,184, 32,153,166,166, 58, 47,177,193, 22,147,
+249, 1,107, 77,117, 24,155, 71, 70,164, 22, 67,153, 14, 40,211,211, 89,126,246,252, 47, 96, 41, 39, 93, 76, 58,170,130, 88,230,
+148, 58,191,115, 25, 85, 91, 65,183, 54,145,126,228, 30,215, 26,164, 52, 20,227, 67,108,230, 32, 38,214,148,211, 24,152,185, 15,
+157, 57,124,126,214,196, 25,215,177, 79,167, 9, 83, 0,151,157, 22,146,194, 34,253, 26, 50,219,155, 23, 1, 83, 49,160, 80,160,
+130,153, 24, 76, 5, 33,209,242, 42, 65,187, 67,184,236, 52, 39,254,210, 2,181,197, 22, 94, 43, 34, 88, 94, 34, 88,108, 83, 91,
+ 92,160,182,208,196, 15, 20,210,215,120,141, 8,169, 93,108,177,174, 57, 91,104, 16, 53,168,119,154, 4,205, 8, 29,248, 4, 97,
+ 64,212,106, 82,107,214,240,107, 1,126,168,241, 61, 77, 80,215,212, 91, 53, 60,237, 17, 68,154,168, 85, 35, 12, 20,194,196,132,
+ 97,141, 90, 20, 17, 69,154,122,163, 69, 45,138,104, 84,143, 17, 70, 33,126,224,187,100,178, 70,147,176,214,192,247, 53,186, 86,
+195, 15,125,119, 57,121, 26, 41, 36, 38, 75,240,107,110,188, 46,176, 40,173, 8,155,109, 60,223, 67, 7,117,148,246,241,194, 16,
+169, 60,116,212, 64, 69, 53,164, 23,226, 69, 77,148, 95, 39, 27,141, 73, 7, 67,130, 64, 16,117, 26,248, 81,192,224,104,196,233,
+243,191, 77, 57, 73, 49, 69, 81, 37,174, 85, 93,123,233,222,203, 54,183,149, 61,114, 42,144,155,231, 24, 88,203,140, 36, 56,207,
+ 21,102,134,133,157, 90, 25,167,238, 17,169, 42,113, 36,142,104, 40, 75,240, 4, 52,180,162,165, 20, 13,169,136,164, 36,148,130,
+150, 22,212,112, 34, 59,167, 27, 72,201, 71,187,136, 60, 38, 64,208,242, 20,107,190,102,197, 87, 52,181,164, 38, 36,129,114,123,
+251, 0,129, 47, 32, 16,174, 91,215, 21, 83,193, 90,233, 66, 10,167,211,175,233,223,213, 90, 98,235,241,246, 27, 47, 33, 2,133,
+212, 5,129,239,179,180,209,164, 29, 61,195,143,254,181,191,202,226,141,111, 98,174, 10,204,149,152,236,114,206,103,158,253, 60,
+ 31, 82,255,128,123,221,101,162, 32,224,246,221,109,150,162,115, 36,105, 12,228,172, 54, 86,144,101, 72, 22,215,121,233,197, 55,
+ 88,240, 22,120,227,248, 38, 53,161, 73,138, 4, 99, 5,158, 47,105, 46, 23, 68, 65, 6,101,201,131,195, 99,124,219,230,197, 47,
+252, 1,101,174, 73, 99,159,163,237, 9,158, 14,156, 6,238,100,251, 1, 97,107, 1,207,211, 52,150,154, 68, 75,107,236,188,246,
+ 34,155,239,126, 31,101, 26, 83,100, 49,183,190,254, 53,214, 46, 95,101,245,198,117,186, 91,135,228,241, 9,216,144,119,126,244,
+ 35, 12, 30,220,169,198,186, 26,223,247, 9,150, 54, 41, 38,125,106,157, 37,144, 30,194,228, 8,229, 81,164, 57, 65, 84,195,228,
+ 41,237,141,139,140,142,118,137, 22,150, 81,181, 54,253, 7, 55, 89,189,126, 17,155,167, 32, 44,181, 86,147, 50,203,200,146,156,
+120, 18, 99,165,100,239,185,219,100,233,144, 65, 55,101,121,173,201,210,230, 69, 78,247,142,232, 29,141,185,245,226,171,124,232,
+ 59,159,166,209, 89,165,119,124,202,112, 56, 98, 50, 78, 56,222,235,226,201,130,143,126,247,119,145, 22,134, 87, 95,124,141,181,
+245,101, 30,222,219, 34, 30,229,116, 79,118,184,126,227, 34,237,214, 10, 55, 95,190,141,201, 18, 40, 97, 99, 99,131, 7,187, 61,
+ 66, 74, 46, 94,127, 7,119,238, 60,228,198, 99,215, 72,146,156,203,143,109,114,235,222, 67, 70,131, 35,106, 94,139,181,181,101,
+ 70,227, 4,207,143,232,159,198,100, 73, 78, 88, 15,137, 99, 67, 81, 88,116, 93, 98,100,141,221,195, 30, 74,122, 44,175, 44,147,
+100, 57, 81, 36,209,218,112,212, 27, 98, 10, 15,137,101,175,123, 72,171,222, 36,207, 6, 32, 82, 14,123, 6, 45, 37,195,137, 38,
+244, 83,142,251, 6, 97, 71,244, 70,117,154, 53,159,221,254, 8,133,229,175,253,228,247,241,211,127,227,175,208, 31,246, 80, 94,
+ 48,143, 57,245, 61,247,218, 72,229, 20,163, 65, 4,126, 80, 45,181,196, 31, 83,101, 9,119,153,207,198,182, 67,151, 92, 52, 26,
+209,123,184,197,225,238, 30,147,241,132,210, 24,183, 79, 79, 50,148,214, 44,157, 91, 32, 88, 89,129, 90,219, 97, 57,167, 99,207,
+124, 2,195, 1, 70,121, 20,255,241,183, 8, 54, 86, 73,211,148,109, 36,233, 96,128,108, 71,172,125,252, 71,221,200,214,130, 65,
+ 84,217,226,194,117,209,158, 3,203, 24,227,118,205,170,116,161, 21,115,101,152, 0, 47,226,252,245,247,208,207,250,236, 28,222,
+229, 87,126,231,247, 64,194, 15,255,216, 79,241,224, 63,254, 26,181,155, 95, 71,214, 27, 72, 79,186,241,178,209,100, 7,187,212,
+174, 62,238, 46,237, 90, 68, 62, 78, 73,199, 61,126,252, 83,223,229,236, 88,221, 19,126,233, 87,255, 37,207,125,253,157, 76,134,
+125,254,246,223,248,235,220,187,185,199, 36, 27, 0,224,111,108, 16, 23, 57,171, 79,127,156,209,246,155, 21, 88, 67,204, 70,115,
+ 74,206,148,111, 21, 32,115, 74, 67,171, 4,104,218,193, 52,164,146, 85,184, 69,149,126, 86, 58, 75,145,157,134,170,152,105, 26,
+ 92,181, 31, 47,173,179,208,137,185,178,125,122,201, 97,166,223, 99,170, 40,158, 14, 90,166,246,175, 0,175,177, 9,241, 9, 38,
+ 31,206, 4, 77, 83, 27,221, 52,135, 89,206,211, 51,221,101, 56,251,143,184, 34,205, 90,202, 82,204, 71,169, 98,254,156,157, 38,
+ 64,162,180, 27, 53,171, 90, 19, 21, 45, 81, 38, 3, 76,210,163, 76,123,143,132,181,204,140, 69, 83,157,192, 89,180,173, 57, 99,
+ 89,156, 82,119,203,202,102, 87,169,253, 43, 82,253, 60,242,179,194,214,230,217,128,162,168,129,244,221, 79, 46,205,193,171, 57,
+ 4, 89,149,185,169,188,128,168,179, 68,158,197,120,190,196, 38,125,192, 67, 26, 87,148, 42, 99, 48, 69,230, 8, 4, 70, 80,230,
+ 49, 22,133,244, 3,202,188,112,214,184,178, 4,165, 81,214,128, 39, 17,198, 81, 24, 75, 85, 34,141,161, 20, 25, 2,137, 31, 10,
+132,118,157,191,197, 77, 16,164,239,158,131, 49, 22, 67, 6, 72,194,118,141, 44, 78,221,138, 69, 24,180, 23,184, 9, 91,165,189,
+ 80,218,115,132, 53, 21, 96,202, 2, 79, 54, 16,194,204,200,121,166, 40, 80,158, 87, 77,179, 50,130,122,131,124, 60, 66, 9, 39,
+ 68,148, 94, 29,237,249,238,253,225,251, 72,169, 80,158,143, 12,235, 40,237,161,181, 7,214,224,213, 35, 70,183, 95,230,252,119,
+126, 7, 74, 37, 24,165, 24,223,126, 64,178,191, 85,161,253,207, 20,167, 83,101,251, 60,127, 21,107, 42,210,159, 41,177, 56,194,
+223,236, 76,153, 65,104,102,161, 1,213,142,154, 25,226,116,170,217, 96, 38, 43,169, 66,144,140,112,171, 2,155,186, 98,186, 90,
+183, 88,161,102, 66, 61, 41,160, 24,159,206,136,117, 90, 10, 26, 82, 82,104, 69,146,151, 52,164, 32, 20,144, 85,190,255,192, 10,
+106, 66, 18, 2, 53, 36,190,117,105,149, 82,134,142,171, 80,230, 51, 81,157,168,246, 0, 81,179, 67,139, 38,201, 56,197,243,224,
+220,165, 69,198,221,152,235,159,124,158,193,151,123, 68,151,150, 16, 97, 76,124,152, 80,148,150,188, 99,169, 7,219,188,251,225,
+207,240,133,250,223,167, 69, 64, 24,120,140,226, 2, 99, 36,131,226,132, 5,211,100,152, 14, 57,236, 55, 89, 8,154,100,102,192,
+114,184,202, 48, 31,177, 20,118, 56,154,156,112,255,230,128,239,253,228, 71,121,251,193, 31,242,142, 43,239,229,254,246,155, 36,
+195, 77,130,150,166,179,236,115,241,169,107,244,238, 31,177,125,247, 1,210, 87,134,253,219,175, 19,117, 22,201,211,148,231, 63,
+247,239, 89,186,124,129, 36,142,233, 29, 28,145,197, 57,107,151, 46,160, 66,205,209,189,123,116, 31,222,103,243,217,143, 48, 60,
+222,229,222, 55,191, 78,180,224,240,178,187,175,189,194,226,197, 11,228,163, 30, 73,239,132,176,179, 76,124,122,226,170,122, 44,
+201,241, 54,126,163, 67,239,206, 27,160,124,234,203,171, 72, 93, 67,133, 33, 39,111,191, 73,231,250,147, 12,186, 61, 48, 5, 7,
+247,182, 56,185,247, 22, 69, 26, 19, 70, 53, 14,182,182, 72, 70, 35, 60,173,169, 5,150,205, 39, 30,163,183,115, 76, 60, 78,201,
+146,132,103, 63,252, 12,181,206, 57,118,183, 15,232,117, 15, 73,243,130,227,189, 3,164, 72,248,142,239,249, 14, 70,147,130,155,
+175,222, 38, 12, 52,195,193,128,241,104,196,225,254, 54,215,175,159,103,249,220, 5,238, 61,216, 39, 27,101, 44, 46,173,178,114,
+254, 34,167,147,132,227,131, 3, 30,127,199, 19,252,209,239,127,139,100,114,200, 36, 31,114,120,212,229,230,205,219,188,250,226,
+ 75,188,227,241, 43,180,151, 22,216,218, 58, 66,251,138,126,191,207,198,198, 18, 11,237, 53, 6,221, 2, 83,133, 44, 36,113, 66,
+ 82,140,105, 52, 37, 65,173, 36, 41,198, 96, 83, 38,241,144,163,227, 99, 14,142,250,196, 89,134,210,130,193,100,196,214,209, 14,
+253,137, 32,240, 66, 90,145, 32,206, 82, 14,123, 3,162, 40,224,206,222, 30,237,198, 2,227,180,203,254,233,152,201, 36,225,211,
+ 31,123, 31, 63,253,215,126,158, 97, 50, 70,121,190, 35, 28, 89,131,212, 10, 89,117,184, 40,137, 14, 35,135, 96, 18,242, 12,237,
+163, 60,163,137, 14,206, 36,128, 85, 93,102, 50, 97,114,116,192,209,238, 62,201,104,140,181, 78,221,159,199, 25,217, 36,166, 63,
+204,120,223, 83, 87, 32,108,184,112, 30,230,254,106,226, 62,101,119, 64,145, 36,168,106, 15,185,245,210,219,236, 30,118,153,236,
+159,240,125,191,254,127, 80,166,135,142, 50, 53,181,183, 88, 23,106, 32, 61,141,212,161, 19,179,120, 33, 74, 5, 72,165,167,210,
+239,234, 18,177, 8, 60,182,247,118, 73, 6, 5,126, 1, 27,237,186, 11,127,202, 82,158,223, 61,114,227, 59, 37,241,124,141,148,
+ 10,169, 21,249,176,239, 70,190, 64, 99,113,141,178, 72,232,239,108,243, 23,255,246, 95,231,111,254,239, 95, 66,141, 6,220,254,
+198, 87,249,210,115, 95,225,104,208,167,168,213,249,214, 87,111,177,185,177, 52,107,162,139,122, 72,163,179, 49,255, 49, 90,123,
+ 54,115,101,118,129,115,134, 8, 55, 75, 84,155,238,126,103, 66, 56, 49, 35,110,157, 21, 21, 77,249,241,114,122, 96,202, 71,133,
+ 97,211, 29,253, 76,140, 54, 37,176,137,105, 80, 70,197,166, 55,128,201,200,227, 46,182,116, 97, 21,166,156,122,196, 57,147,202,
+ 34, 64,132, 51,246,235,116,180,234,242,218, 67,144, 53,183, 31,158,222,247,230, 44, 24,166, 18,190, 86, 93, 13,214, 82,198, 61,
+146,163,215, 49,105,151, 98,114, 92, 93,144,118,214,169, 77,113,176, 98,250, 94, 43,167,171, 9, 59,243,161,159,209, 77, 50, 3,
+ 17,159, 13,194, 17, 98, 86,196,136, 74,236,231, 41, 77, 49, 56,153,251,241,253,192,141,243,109,233,254, 62,210,145,227,168,208,
+212, 66,129,244,106,168,176,142,246,131,217,244, 69,105, 55, 25, 50,121,142, 41, 74,242,225,128,124, 60, 1, 99,201,199, 67,242,
+ 36,195,230, 41,214, 24,202,188,160, 72, 83,138, 52,195,152,188,218,213,186,203, 89, 42,141,192, 58, 91, 90,224,161, 61, 73, 16,
+ 5,136, 34,135, 34, 70,121,154,112,161,141,223, 90, 64,107,229,236,112,210,128,114,186, 5, 97, 92,116,177, 84,202, 93,206, 82,
+160,180, 70, 74,131, 84,158,163, 85, 74, 77,216,106,163,180,231, 82, 21,133,194,164, 49,126,189,142,214, 1, 90,106, 23, 92,228,
+ 7, 72,237,163,148,143,242, 66, 4, 10, 47,168,161,163, 22,165,129,248,104, 15, 19,167,172, 93, 94, 67,133, 18, 21,212, 25, 29,
+158,208,123,225, 15, 41, 51, 59,183,106, 87,175, 49,214,206, 94, 83, 51, 29,183, 87,179,118, 81,101, 11,219,162,172,112,176,198,
+ 77,177,108, 21,251,236,246, 18,179,130, 88, 88,241,200,180,136,210, 86,239,127,137, 68,160, 5,168,178, 32,172, 18,216, 60, 37,
+ 81,149,125, 81, 85,175,191, 48,174, 0, 18,182,226,191,151,130, 64,184,238, 60,210,138,186,148,212,180,131,247, 4, 66,208,240,
+ 37, 77, 45,232,120,138,154,150, 46,153,205, 74, 52, 32,170, 24,211, 89, 1,105,220,122,170, 24,222,163,179,180, 78,107,177,198,
+197,199, 55, 64,198,156,123,252, 41, 78,190,254,143,216,122,213,231,155,255,188,207, 27,255, 58, 39, 62, 82,140,239, 73,198,135,
+ 2, 93, 23,132, 53,195,183, 23,255,152, 19,209,100, 84, 28,179, 88,111, 34,149,101, 41,106, 16,231, 7,248, 66, 49, 72, 15, 16,
+ 54, 33,146, 10,137,101, 49,168,227,107, 69,232,123,104,227,243, 59,159,255, 26,161,182,212, 90, 30, 55,158,184,129, 31,122, 68,
+ 30,220,121,169,203,214,203, 47,114,239,245,111, 16,202, 6,178,190,188, 65, 45,240, 41, 76,206,222,157,219,172, 46, 47, 18,181,
+151,185,249,165,223,231,214,243,191,207,219,207,127,137,250,202, 58,219,175,188,196,194,250, 42, 23,158,126, 15, 59,223,250, 6,
+203, 87, 46,112,229,253, 31,102,210,239,179,247,246,155,108,188,235, 73,250, 59, 15,176, 69, 66,173,189, 64,255,225,109,138,116,
+136,242, 92, 12,168,242, 53,101,105,104, 44,173, 96,243,216, 89,166,172, 33, 27, 13,185,240,109,239, 35,237,245,217,254,198,115,
+132,231,206,227,105,195,218, 59,159, 33, 30,197,188,254,141, 23,168,133, 30,203, 23, 54,144,126,157,230,210, 34,167,251, 39, 28,
+239,239, 18, 15, 7,228,217,128,113,214,103,255,193, 67, 76, 62, 38,140,154,236,222,222,230,100,103,151,199,158, 56, 71,111, 56,
+230,230, 27,183,200, 38, 3,194, 90,141,209, 32,231,228,240,152,243, 27, 45, 22,207,173,243,240,222, 46, 38,203,105, 47, 45,178,
+183,127,204,221,187,183, 57,220,187,205,179,223,246, 4,183,183, 79,104,132, 17, 42, 86, 28,236,238,211,235, 30,177, 82,247,249,
+204,143,252, 0, 59,251, 67, 30,110,239,209,106, 71,108,223, 63,194,146, 34, 66, 67, 78, 74,107, 41, 34,168, 7, 51, 2, 86,111,
+ 16,115,210,239, 51,152,164,148,185,117, 73, 67,169, 33, 43, 53,141, 70,224, 62, 16,198,146,151,150,243,157, 14,135,167, 93, 16,
+146,253,222,128,220, 20,148,214, 50,137, 83,172,205, 57, 56, 77,232,212, 35,186,147, 17,223,249,190, 27,252,220,223,250,121,134,
+241, 8,165,221,207, 25, 3, 82,121, 72,165,145, 90, 59, 92,123, 16,129, 23, 86,135,244,244, 84, 52,103,180,169,254, 35, 23,186,
+165, 4, 99,200, 7, 39, 12,142,142, 24,245,251, 88,235,148, 37, 69, 90,144,103, 57, 22, 75, 43,144,116, 54,215,161,177,228,192,
+ 38, 83, 11, 19, 22,122,167,148,113, 74,185,127,128, 18, 2,155,103,156,140, 51, 68, 45,224,176, 52,172,126,199, 15, 97,146, 81,
+ 53,146, 59,179,202, 23, 56,244,171, 23, 32, 84,224,118,237,202, 67,106, 15,132,118, 99, 58,227, 72,105,233,240,128,159,248,240,
+ 53, 94,125,243, 33,227, 96,131,102, 61,156, 61,212,246,201, 41,248, 62,104,133,244, 61,119,233, 88, 67, 17,143,161,215,197, 0,
+126,189, 67, 89,166,148, 69,134,242, 61,190,254,127,255, 45, 30,255,254,159,231,205,175,223,229,239,253,157, 95,230, 63,252,235,
+223,228,240,225,132,207,255,238, 23,121,239,159,120,255,236,177,131, 63,245,189, 52,147,234,242, 59,131,156, 20,149, 16, 72,158,
+233,102,166,163, 59, 83,216,217, 24,210,150,243,217,123, 89,184,139,215,148,213,101,126,166, 91,177, 8,202,194, 9, 2,221,158,
+114, 10,161,153, 50,215,231, 88,117, 83, 86,151,237,153,112, 55,201,124,252, 89, 38,125, 23,138, 82,233,126, 85,224,160, 60, 83,
+131,131,210,129,187, 8, 13,179,128, 23,119, 96, 75, 84,208, 68,183, 86, 64,202,202, 23, 62,247,143, 99, 28, 34,214,150,102,230,
+134,156,174, 24, 76, 50,193, 20,238,242,118,145,204,210, 29,222,165,117,251, 94, 30,153,198, 86,135,191, 75,211,154,142,120,197,
+180,101, 51,213,142,220, 50,255,181, 57, 75, 38, 18,243,237,133, 45,220,202, 1,121,198,139,207, 28,134, 34, 85,165,161, 43, 17,
+ 94,132,240,220,133, 41,180, 43,252,132,114,239, 57, 83, 58,141,129, 83,137,107,202,120, 76, 54, 26, 97,173, 68,228, 19, 76,154,
+145, 77, 38,148,133,197, 20,105,101,183, 20, 40,191, 62,211, 1, 80, 58,123,159,181, 37,148, 25,214,148,152,220, 56,173, 0, 78,
+ 4, 40, 40, 33, 29,224,249, 10, 37,133, 99,145, 91,139,244,156, 50, 92, 5, 30, 74, 41,164,113, 4, 51,165, 21, 74,251, 40,207,
+125,198, 29, 53,207, 67,122,202, 77,112,108,230,214, 3,202, 71,133, 53,132,112,206, 23,165,157,255, 92,215,106,168, 90, 13, 85,
+115,118, 54,132, 34,235,159,112,244,234, 11,120,229,132,230,133, 77,148, 53,216,122,131,209, 27, 15,152,220,127,203, 13,132,242,
+114,246,249, 19,118,154,123,239, 86, 52,114,106,101, 44, 93,102,136, 53,165,155, 36, 80,197,173,150, 78, 20,234,206,253,233,216,
+190,116, 29,125, 21,225, 42,166,209,197, 85, 17, 96,171,115,113, 38, 1, 49, 6,129,197, 87, 2,105, 45,170, 82,186, 43, 33, 81,
+ 83, 87, 70,233, 50, 6,166, 26, 13, 97, 44, 90, 64, 36, 21,117,173, 9, 42, 50, 93,164, 5, 53, 41,104,123,146, 5, 45,105, 40,
+129,175, 60, 60,191, 70, 89,164,149,112,212, 48,253,112, 90,220,243, 52,147, 17,235,107, 33,231, 46, 94, 36, 29, 37, 68,205,203,
+ 92,255,248,191,224,225,243, 32, 85,193,234, 85,193,210, 26,200,216, 21,223,158, 22, 68,107,150,122,203,178, 33,182, 97,244,101,
+210,216,227,100,116,132, 45, 11,164,244, 8,131, 37,180, 16,148, 20, 72,169, 89,111, 95,116,239, 71, 21, 18,248, 62, 43, 81, 7,
+173, 3, 58,205, 69,218,225, 18,175,189,241, 26, 15,239, 28, 48, 30,116,105, 93, 94,160, 30, 88,238,189,116,196,224,180, 73,191,
+223, 67,142, 78, 79,201,211,156,193,238, 93,206, 63,241, 14, 54,159,121, 22, 89, 91, 32,238,119,121,199,251,191,157,201,233,125,
+162, 78,147,245,199,222,137,246,235, 72,165,209,126, 72,145,150, 20,121,194,248,164,143, 31,120, 32, 33, 90, 90,197, 91, 58,207,
+131,151, 94, 2,147,185, 16, 0, 63, 98,184,191,227, 70,219,184,136,207,108, 56,100,120,180,135, 80, 26,169,125,176,146,254,238,
+ 3,158,250,201, 63,195,201,157,219, 92,120,239,251,120,251,203, 95,226,238, 43,175,243,228,251,158,100,243, 93, 79,241,224,205,
+155,244,142,118, 93,164,232,233,152,163,135, 15,217,187,253, 54,146, 2,223,247, 8,194,144,162, 16,156,118,123,140,198, 19, 54,
+ 46,175, 49, 24, 38, 28,108, 31, 80,230, 49,157,213, 14,131,209,132,227,227,125, 54, 87,155,172,159, 63,207,105,119, 72,183,219,
+ 67,251,146, 7, 91, 15,216,223,223,229,237, 91, 91, 44, 45,250, 28, 28, 29, 18, 15, 39,156,191,222,162,151, 55,248,214, 55,223,
+226,226,230, 18, 65,167,197,151,158,251, 38, 39,199,123, 8, 27, 83,148,240,214,157, 3, 30,220,217,226,181, 23, 94,225,230,107,
+111,242,202,139,175,113,239,214, 45,146,108,196,120,226,178,119, 61, 37, 49,101,129, 16, 25, 69, 57,198,215,128, 52, 52, 35,143,
+ 97,146,176,223,139, 89,106, 42,222,218,237,114,101, 99,153, 52, 31,163,181,166, 63, 25, 59, 88,130, 84, 44, 54, 61,238,239,239,
+178,125, 50,230,131,143, 95,228,239,252,226, 63,224,180,127,234,192, 17,148, 46,187, 94,123, 72, 41,221,193,100,140,139, 84,245,
+107, 21,241,235,172,201, 68,254,177,255,159,142,214, 12,144,130,133,164,223,115,235,143, 60, 67,106,237,208,133,113,140, 64, 50,
+202, 44, 63,244,195,159,160,204, 75,240,235,238,107, 28, 15, 9,202, 24,142,143, 41,129,226,222,109,212, 66,157,193,206, 17,251,
+ 89, 78, 60, 74,248,224,207,254,168,203, 38, 62, 19,160, 50,237,190,165,144,179, 96, 21,161,106,243,220,112,165,170, 67,162,196,
+ 88,247,225, 30,157,246,249,238, 31,253, 24,175,188,244, 28,186,118,145,191,247,247,255, 30,190,118, 95,123,237,198,187, 24, 21,
+214,209,171,148,116,235,126, 41,145, 90,144,239,108, 33,161,234,204, 28,143,186,251,240, 14, 79,127,234,227, 60,255,235,255, 11,
+255,246,247, 95,229,213, 91, 71,252,234,191,253, 42, 95,124,254,109,126,246, 51,239,161,181,178,228,158,103, 89,162, 31,123, 12,
+ 37,170, 66,131,185, 63,219,206,254,157,185,231,218,158, 77,106,179,115, 84,172,120,116, 31, 62,235,142,197,217, 78,232, 76,247,
+ 94,133,186,216,169,226,216, 90,231,100, 56,155,129, 42,170, 67,205,216, 71,126,166,204,227, 91,220,104, 60,234, 16, 44, 63,134,
+172, 45, 86,187,123, 40,139,152,178, 24,131,156,238,189,153,121,206,139,241, 33,217,201,125, 23,175, 91,150,213,110,188,234,172,
+149, 87, 37,253,217, 89,232,138, 19,246, 25,164,112, 90, 2, 49,125, 30,214, 84,200,223,106,242, 32,253,185, 24,111, 10, 40,145,
+ 85,218, 92,117, 96,219, 10,179, 38,228,244,159, 41, 11,190,234,206, 77, 37,202,156,190, 6,101, 73,113,122,136, 73, 97,198,210,
+ 53,166,210,109, 76,187,245,194,177, 15,180,155, 10,161, 20,194, 11, 17,211,240, 17, 41, 41,211,216,141,216,189, 0,171, 52,101,
+154, 80, 36, 25,249,104, 72, 54, 74,176,105, 73, 58, 30, 99,226, 12,210, 20,144,148,121, 1, 57,148,147, 33, 54, 47, 16, 86, 57,
+150,183, 45,192, 20, 46, 49,112,120, 68,214, 63,162, 52,105, 69, 93,171, 80,193, 89, 82, 81, 30, 37,168,105,150,183, 69, 6, 62,
+ 74, 73,215,169,123, 94, 53,242,150,200,208,119,159,111, 91,186, 81,177,201,145, 72,100, 16,162,148,135, 14,130,202, 26,106, 80,
+126,228,162, 98,181,231,192, 50, 65, 13,229,135,120,245,246,236,253,118,242,214,235,152,222, 30,139, 23, 22, 81,190,135,149,146,
+193,173, 83, 78,191,250,219,148,113, 86,193,101,196, 89,243, 68, 37, 12,156,221,123,179, 59,112,206,127, 63, 3,245,175, 58,245,
+153, 79,220, 86, 66,209,242,204,251, 29, 42, 77, 74,245,125,166, 19,169,234,247,148,116, 30,116,183,235,150, 21, 70, 89, 56, 42,
+164, 49, 8, 97, 43,250, 98, 89,233, 9, 4, 82, 90,148,148,180,151, 46,176,180,184, 65, 77, 86, 1, 48, 72,218, 90,178, 32, 37,
+ 77, 37,241,149,162,181,246, 24,205,245, 27,136, 10,195, 76, 57, 95, 83,201,105,238,130, 41,184,241, 67,223, 65, 24,106, 86, 47,
+173, 96,226, 18,191,248,207,188,231,113,205,250, 69,193,249, 15,182,136, 22,157,160,111,150, 80,156, 89, 58,215, 74,108,164,248,
+169,206,151,216,203, 20,185, 21,148,129, 33, 10,107, 24, 3,107,245,243,180,194, 21, 10, 50,186,227, 46, 74,212,200,243,156, 66,
+ 23,108,108, 92,224,252,133, 85,154, 77, 31, 21, 6,108, 54, 58,164, 22, 50,147,176,245,205, 29,118,183,183,104,132, 17,107, 23,
+ 42, 60,241,207,253,196,247,255, 66,220,139,105, 47, 55, 80,126,141,230,230, 69,190,246,107,159,229,169,239,252, 40,175,125,241,
+ 75,188,247, 99,207, 16,158,123, 55, 90,195,214, 43,175, 85,192,249,140,131,155,119, 89,127,231,227, 12,247,247,169,181, 90, 20,
+233,144,124, 18,187,142, 36,233, 19, 45, 46, 16, 54, 22, 49, 69,129, 23,248, 72, 41, 24, 29,239,226,215, 34,226, 65,159,230,202,
+ 50,166, 44,185,247,226, 11,180, 22, 23, 8,106, 17,111,124,225,247, 88,186,116,158,221, 55,223,192, 22, 41,231,175, 95, 97,249,
+250,227,220,122,238, 27, 4, 94,192,242,230, 26, 89,146, 49,232,141,200,178,132,230,194, 34,101, 54,160,189,188,206, 96, 48,100,
+ 50, 24, 96,109,140,239, 9,178, 60, 99, 60, 28,226,133, 30,218,243, 56,222, 63, 98, 50,234,115,249,202, 5, 22,206,109, 48, 28,
+198,116, 79, 6,100,113,193,238,206, 67, 60, 41, 25, 76, 6,108, 46,181,104, 55, 58, 12, 38, 41,199, 39, 9,233,120,159, 78,167,
+205,249,149, 85,114, 36, 59, 15, 15, 25,246, 79,241,149,161,209, 92, 96, 56,201,105,215, 61, 54,207,157,103,105,101, 25,223,143,
+104,182, 23,176,192,112, 28,147,102, 57, 39,195,132,211, 81,140, 16,150, 73,106,208, 66,178,115,116,202, 97,175, 79,111, 52,166,
+ 55, 46, 8,125,205,106,167,201,131,147, 99,178, 76,177,185,210, 98,231,120, 68,179, 38, 56, 29,166, 36,121, 65, 51,170,113,121,
+181, 77,119, 20,243,111,254,205,175,208,237, 30,227, 55, 90, 78, 21, 45, 36,210,243,171,202, 93,185,177,159,175,209, 65, 29, 2,
+ 61,111,233,230, 33,222,103, 46,117,111,222,169,139, 24,202, 18,147, 77, 24,239, 62, 36, 27, 77,208,126, 64,150, 21,140,187,125,
+242, 44,163,212, 33, 63,240, 35,223,133,182, 37, 94,163, 9,171,143, 65, 49,172, 44,113, 62,100, 99,204,131,251,228,113, 70,249,
+249,223,197,175,135,220,189,181,205,113, 90,176,123,208,231, 71,254,211,231,176,121,143,179,128, 52,119, 34,184, 29,174,242,124,
+ 80, 81,181,239, 53, 80,102, 96, 5,121, 60,166,200,139,170,122,119,193, 32,231, 46, 93,226,255,252,165,127, 68, 41, 27, 92,190,
+124,158, 31,255,248,199,248,239,254,242,159,231,155,111,220,103,225,244,132,115,107, 77,172,212,238,125, 89,105, 63,202, 56, 33,
+184,250, 4, 0,195,195,135,149, 32,172,196,148, 57, 87,159,125, 63, 63,245,167,191,159, 31,250,216, 19,124,226,253, 79,240, 35,
+ 63,241, 81,174, 62,243,212,236,178,198, 90,240, 60,228,115, 47,178,127,244, 38,229,120, 80,213, 29, 98, 6,102, 49, 22,215, 49,
+ 61,202,154,155, 57, 7,173, 16,143,236, 33,207,210, 86, 4,103,144,169, 21,185,109,122,193,157,149, 64, 60, 10,126, 97,238,229,
+159, 5,202,156,249,154,202, 7, 63, 45, 64,132,210,144,141, 41,227,211, 89,119, 60,141,134,157, 62,190,169, 14,204,210,156, 25,
+233,159, 37,217, 76,159,138,196,117,161, 98,214, 48, 59, 39, 64, 21,183, 58,205,220,150,106, 74, 29,171, 38, 27, 58, 66,213, 90,
+ 20, 89, 90, 81,238,206,216,223,236,163,210, 9,161,107, 8,191,137, 41,146,234,219,139, 51,113,178,184, 44,247, 51,170,126, 25,
+ 4,180, 63,240,131,200, 64,131,205,207, 76,166, 20,152,100,254,107, 83, 49,255, 77,230, 46,221,120, 88, 37,193, 25,103, 21,204,
+ 75, 76,158,145, 15,251,228,147, 9,101,146, 58, 61, 68, 37,210, 43,115,151,203,173,181,194,148,149,228, 75,234,170,160, 18, 78,
+164,106, 12,182, 18,151,229, 89, 94, 77, 70,242, 89, 17, 34,181,194, 15,235,206, 50,232,251, 8, 33,208,202,175,116, 74, 18, 47,
+136, 80,126,205,217,127,165, 68,105,175,162,227,185,224, 43,237,121, 46, 80, 44,112,105,107,202,243, 93,247,170, 52, 82, 41, 84,
+232, 68,129, 82,107,164,212,232, 32,116,191, 14,107, 72,229, 83,196, 99,132, 16, 28,124,241, 63,177,126,121,153,246,213, 43, 96,
+ 10,116,115,153,135,191,254, 89, 70,183, 95,113,194,212,194,204,223,159, 83,173,198, 84, 9, 63, 47, 45, 43, 59,167, 56,115,220,
+ 8, 39, 58,179,115,206,192,108,216, 98,206, 56, 23,170, 98,151,234,194, 22,178, 90,237, 76, 33, 67, 21, 37,113, 6, 28,170,254,
+151,231,174, 0,180, 66, 84,107, 37, 59, 43, 4, 76,233,138,122, 83, 26, 10, 96, 52, 30, 49,201, 83, 74, 11,145, 20,116, 60, 77,
+ 91, 75, 58, 90, 17, 41,137,167, 52,118,220,167,204,198,160, 61,164,174,187,247,198,244, 57,217,146,115, 63,248, 95,113,188,227,
+177,112,126,145,172, 27,179,250,108,130,250,131,207,178,254,129, 5, 26,151,107,228, 61,131, 31, 4, 76, 30,164,120, 13,129,201,
+ 36,202,119,140, 10,191,237,166,179, 79,202,151,185,169, 62,205,242,226,128, 56,206, 48,185,162,222,177,140,147,140, 65, 50,224,
+218,242,117,148,148, 28,199, 39,104,219,160,200, 4,147, 73, 12,170, 96, 56, 73,184,116,249, 60,199,199, 99, 60,105, 80, 42, 98,
+146,156, 82, 11, 23,169,181, 26,164,189, 9,178,181,216, 96, 97,115,133,246,230, 37, 22,175, 61,193,233,131,135, 60,249,241,143,
+146, 38,150,199,222,251, 20,173, 11, 31,230,185,255,235, 87, 24, 28, 29,176,126,237, 18,163,211, 17, 89,239,136,181,235, 55,152,
+116,247,168, 45, 45, 81, 22,150, 90,107, 5, 29,106, 78,183,110,179,116,229, 42, 97, 99,145,116,124,138,181,134,162,200,145, 94,
+141,160,214, 0,173,209,202, 33, 69, 81,146,209,193, 54, 82,123,188,250,251, 95, 96,251,245,175, 83, 95, 88,164,127,124, 76,103,
+227, 60, 69,150,178,253,250,235, 78,220,210,136, 56,218,221, 39,203,114, 78,118, 14,161,136, 29, 10,208, 90,122,221, 46,241, 96,
+194,237, 55, 94, 99,239,206, 77,250, 39,219,152,210,208,239,245,201,226, 9,251, 15,183,201,211, 24,223,143, 72,242, 33,131,225,
+144,211,211, 49, 69, 94, 50, 26, 15,240, 60,205,113,127,200,100,156,177,188,218,102,247,120, 72,239,120, 72,146,118, 49, 86, 51,
+ 28, 29, 83, 91,108,240,214,237, 29,132, 76,105, 55,235,248, 65,147,131,147, 1,221,211, 46,168, 49,189,248,148,251, 15,119,184,
+253,224, 33,111,222,126,147, 36,233,145,231, 57, 39,195,152,227,193,144,193, 36, 33,203,115,164, 76,184,127,116,130,212, 1,151,
+215,207, 81, 15,106, 32, 33,240, 5,111,108, 29,243,228,249,117,122,241,152,222,104,200,201,104, 72,228,251, 85, 96, 68,206,113,
+ 63,225,245, 7,135,252,231, 95,255,101,142,186,135,248,205,166, 27, 49, 73,129,244,220,248,205, 17,155, 36,194, 83,104, 63,132,
+ 90,240,232,229,113,166,247,155, 94,234,243, 0,141, 24, 76,129, 45, 74,204,100,128,174, 69, 68,205, 58, 97,189, 78, 16, 4, 88,
+156,114,248,234, 19,239, 96,105,165,131, 65, 58, 95, 58,198, 29,142,211, 50,125,220,199, 12,199,152, 60, 67,164, 25,217, 32,102,
+127,152, 96,148, 70, 47,212,240,151,207,185, 14,172,156,239,219,168, 14,194,105, 87, 37,102, 19, 4, 85, 5,197,100, 21,171,189,
+122,126,101,137, 84,138,222,209, 9,159,251,205,127,198,231,127,227,151,185,243,246,152,111,220,201,216,186,117,202, 43,175,237,
+243,123,111, 62,196,247,148, 19,159, 85,182, 61,129,165, 24,143,176,201, 24,128,168,221,161,204, 38,148, 69, 70, 60,232, 51, 60,
+220,174, 64, 72, 55,184,252,190,247,160,107, 17, 38,207,102, 86,156,169, 40,212, 6,154,149,239,252, 76, 5,104,145,179,187,168,
+180,206,159,108,170,110,220, 84,170, 94, 91, 81,219,138,105, 60,173,177,148,213,138,120,122, 89, 26, 4, 69,233,168, 87, 69,105,
+ 42, 33, 21,238,207, 78,143, 78, 49, 15,106, 41,193, 29, 90, 83, 49,153,113,193, 47,102,166, 43,158,198,225, 86, 7,106,133,103,
+ 45,211, 33,233,248, 16, 83, 45,178,173,156,107,214,103,125,189,156, 3,108,236, 25, 74,222, 25,183,163,155, 20,216, 98, 30,143,
+202, 25,146,158,177,143,164,185,153,114,102,222,171,158,108, 65, 49,233,129,205,171,141,144, 2,229, 87, 7,248,153,100, 59, 9,
+ 82, 71, 72, 47,154, 7,131, 84,147,130,105, 23,111, 77,181,175,157,238,228,211, 9,148,105, 5, 0, 58, 75,252, 49,143,234, 8,
+164,196,154,172,122, 86,210,173, 7,170, 2, 70,215,154,136,208,173,198,100,208, 66,122, 62,218,247, 9,130, 8, 41, 61,132,242,
+240,234, 77,188, 48,194,106, 15, 25,212,240,194, 58, 74, 72,132,242, 80, 94, 8, 40, 74,227, 58,120, 83,150,179,207, 25, 82, 66,
+ 89,160,132,197,175, 71,174,187,242,125,164,210, 40,175,230,132,108,202, 9,195,100, 16,162,131,208,253, 60,202, 2,169, 61, 20,
+162, 2, 51, 89,144,218,185, 59,166,235, 12, 83,186,243, 64, 42,164,246,209,129,143,242,125,148, 31, 84,103,132,135,208, 62, 66,
+249, 72,165, 40,147, 9,195,157, 7,116, 86, 27,180, 46, 94,160, 76,135,232, 86,135,201, 16, 38, 59,183,177,101, 94, 77, 47,166,
+175,225,124, 26,244, 8, 73,105,166,115, 17, 51, 77,136,177,204,246,232,143,134, 29,205,127, 57, 61, 50,140,177,243,199,159, 10,
+ 17,171,120, 94, 41, 57, 83, 84, 87,143, 91, 26,135, 45,158,110,100,170,169,199, 20, 74, 53, 77, 32,156,217,209,226, 49, 94, 25,
+211,246,148,131,252,104, 69,167,218,167,135, 74,224, 97, 49, 19,167,255,144, 10,252,112,137,218,242, 53,164,174,185,201, 81, 53,
+113, 58,247,241,191, 68,247,254, 9,201,192,210, 88,252, 8,151, 63,249, 11,180,195,182, 43,236, 82,129,215,241,176,189, 24,191,
+229, 10, 90, 45, 65,120, 22,213,112,217, 88,141,205,146,118, 52,161,158,127,133,102,115,145,123, 7, 59, 20,118, 76,154, 27,180,
+ 9,200, 76, 65, 81, 72, 10,155, 19,232, 6,237, 70, 64,115, 65, 83,230,138,100, 0,101,110,216,217, 61,230,220, 66,128,239,215,
+176, 36, 88, 91, 32, 67,159,120, 60,225,112,239,109,116,125,249, 2,195,253,125,252,198, 18,249,120,140, 45, 10,103,189, 74, 39,
+ 20, 70,241,194,231,126,131,149,245, 53,186,187, 59,152,245, 13,234,245,136, 98, 60, 65, 4,146,225, 97,151, 90,179, 73, 99,109,
+157,201,104,200,164, 59, 96,233,226, 5,164, 10,217,126,229,121, 54,222,245,148,211, 76, 29,109,147,215, 59,180, 86, 55,201, 77,
+ 78,184,176, 76,220,239, 67,232,115,254,241,199, 57,188,245, 22,215,191,237, 3,156,191, 24,113,112,119,139,181,203,231,233,238,
+ 60, 36,140,106,244,143,186, 24, 91, 50, 58,156,208, 92,168, 99,140, 34,140,106, 4,141, 54,199,123,123,152,162, 79,152, 27,142,
+ 30,118, 1, 67,103,113,141,135,119, 31, 34, 57, 69, 9,205,176,127, 66,163,222, 96, 56, 73,185,127,111,139, 39,116, 7, 63,108,
+ 81, 22, 41,241, 36, 1,145,146,149, 48,142, 83,164, 44, 72,108,193, 56,201, 25, 13, 19,142, 78,122, 92, 92, 95,231,206,253, 1,
+245,230, 30,218, 26,138, 60, 99, 97,105,209, 37,249, 76, 50, 90,117, 77,145,193,209,209, 41, 71,253, 30,203,109,143,141,213, 5,
+250,227,146, 52,117, 59,176,139, 43, 45,198,105, 65,119,148, 32,164, 79,205,179, 60, 60,238, 50,152,132,156,235, 4,152,177,161,
+230,107,114, 51,228,104,152,178,177,228,179,223, 75,185,126,110, 25,223, 11, 80,114,192,165,181, 21,126,235, 91, 55,249,226,175,
+254,207, 12, 7,167,120,141, 14,194, 42,164, 31, 33,131,192,249, 68,139,178,250,208,148,110, 71,234,135,103, 46,112,121,166, 67,
+159, 3, 60,132,240,170,174,200,141,207,203, 65, 15,213,104, 96,138,156,160,217,162,136, 19,204, 73,143, 44, 77, 41,133,100, 97,
+229, 34,223,246,201, 15,144,220,121, 11, 17, 4,176,176, 10,196,204,149, 78, 6,226, 24,147,102,152, 52, 65,154,146,222, 65,151,
+211,188, 32, 87,138,133,197,229,217,233, 63,179,177, 76, 43,114, 28, 3,154, 34,193,202,176,130,173,184,253,126, 58,232, 98,138,
+ 12,155,231, 24, 36,210, 72,172, 41,241,163, 54, 69, 30,243,197, 47,252, 26,159,249,244,127,205,246,164,206,173, 39, 63,196,107,
+111,223,228,103,255,226, 7, 72, 78, 78, 97,101,205,217,100,170,139, 66,136, 18,115,176,135,184,116,157,214,198, 53,186,247,111,
+186, 92, 2,161,200, 77, 7,173,189,233,189, 69, 57, 60,165, 28, 12, 80, 89, 9,187,135,152,147, 35,204,209, 9,114,119,151,203,
+ 31,253, 32,197,245,111,112,176,243, 26, 54, 25,186, 12,102, 49,183,178,185, 75,130,153,221,108, 38,103, 96,122,224,184, 87,203,
+ 24,167, 2,158, 70, 82, 10, 43,102,123,122,206,106, 26,229, 25, 76,156,181,213,184,211,130, 22,179, 3,241,172,254, 81,136,121,
+ 49,103,140,169,148,248, 98,198,167, 55, 85, 90,220,180,197,158, 90,196,230,174, 52, 15, 33,138,249,174,218, 80,105,221,197,204,
+ 78, 55, 99, 5,153,106, 44,170,166, 20, 60, 89, 17,235, 92,145, 57,237,212,197,116, 74, 97,114,103, 65, 19, 2,164,166,118,254,
+ 89,116,125,129,241,157,175, 64, 57,158, 99, 96,173,168,132,118, 2,165,230,225, 57,238, 15,200, 89,218,151,172, 48,183, 6,200,
+ 78,246, 41,198,125,116,187, 89, 85, 5,211,106,203,141,201, 41,178,170, 48, 40, 16,214, 21, 62,174,224,113,157,189,244,163,170,
+ 43, 52,168, 90, 11,226, 9,202, 15, 17,194,171, 82,186, 10, 40, 10, 20, 26,148, 68, 76, 38,149, 7, 31,164, 95, 67,151, 5, 70,
+104,242, 81, 31, 76,233, 52, 45,182, 64,123, 53, 84,160,137, 15, 15, 80, 81,132,210, 10, 45, 20, 74, 75,247,119, 17,211, 2,219,
+ 67,120,145,222,125,159, 9, 0, 0, 32, 0, 73, 68, 65, 84,227, 52, 40,207, 5, 1, 97, 42, 77,137,219,197, 43, 63,152,129, 93,
+148, 31,206,114, 18,164,175,177,133, 68,120, 26,165,124,132,244, 93, 84,177,116,151,190, 10, 35,132, 12,176,165,161,180,134,184,
+219,165,255,246, 75,188,243, 19, 31,195,107, 53, 40,147, 9, 34, 92,160,247,149, 47, 82,156,236,187,215,144,121, 42,224,148, 2,
+ 39,148,172, 68,109,103, 46,235, 41,252,168, 42,106,197, 12, 34, 84,189,111,102, 81,190,213, 62, 94,201, 10,159, 60,125, 91, 59,
+237,137, 67,106, 84,222,242,210,204,164, 16, 83,251,156, 96,110,122,112,155, 27, 51, 39, 38,154,194, 77, 83,166,106,123,107,144,
+ 22, 52, 37,117, 33,105, 89, 75,233,107, 66, 37,104, 9, 65, 4,132, 21, 97, 83,148,153, 43, 10, 12,152, 50, 35,235,237, 80, 22,
+177, 3, 28, 89,193,202,167,126,130,221,175,221, 33,137,123,120,222, 34,106,237, 4,113,107, 7,239, 74,131, 98, 98,176,190,198,
+116, 45, 54,115, 92, 8, 1, 8, 31, 60, 35,200,115,139,167, 5, 54, 0,213,241,248,232,224,183,121,110,248, 93, 28,166,123, 92,
+238, 60,198, 78,119, 7,159,144,122, 80,103,152, 13, 41, 69, 70,123,161,134,240, 74, 10, 12,190,134,113, 92, 18, 5, 77, 76,110,
+ 41,253, 4,169,234,244, 71,125, 90,245, 26,194,194,189,219, 47,112,225,202,187,209, 73,239,128,165,171, 87, 72, 70, 67,246,111,
+223,161,136, 99,151,119, 17, 68, 36,189, 46,231, 54,206,177,251,224, 54,173,133, 6, 34,175, 59,108, 94,227, 34,227,238, 14,235,
+239,122,150,209,225, 14,119,158,255, 34,235, 55, 30, 39,108, 53,168,111, 92,229,224,229, 23,216,124,234, 89, 76,150, 80,152,132,
+198,230, 99,100,189, 67, 70, 39,123,248,245, 38, 40, 73,119,231, 33, 69, 58, 98,245,242, 21,150,175, 95,225,222,215,191,194,181,
+ 79,252, 48,119,191,252, 28, 43, 23,215,153, 12, 39, 20,185, 96, 50, 25,162, 80,100, 89, 66, 28,131,144,117,250,221, 83,242,131,
+ 30,253,211, 33,151,111,156, 35, 25,149,196,227, 49, 23,175, 92,160,127,210,101,253,252, 58,147,100, 66, 94, 38, 96, 45, 74, 75,
+246,143, 78,176,197,132, 60,109,177,247,224, 33,165,209,156,246,251, 68,161,143, 18,146,238, 40, 99,185, 85,144, 76, 18,151,221,
+173, 45, 11,173, 38,163, 84,176,180,188, 68,146, 40,106,141, 8, 37,235, 12, 70, 46, 69,231,225,193, 1, 23, 55, 22,232, 15, 83,
+130, 80,209, 41,107, 72,173, 56,233, 23,156, 14, 39, 12,227,132,178,204,104,212,124,178,178, 36, 45, 37,113, 42,104,213,107,120,
+122, 76,111,156,209,136, 20,105, 81, 80,148,130,165,118,147, 55,238,238,114,253, 92, 68,127,104, 8, 60, 9, 70,179,178, 84,103,
+235,116,194,175,254, 15, 63,199,181,239,249,113,108, 20,161,164,130,244, 16,122,125, 24,143,160,151,186,139, 53, 90,128, 75,215,
+ 65,228, 85,138,144,225,145, 83,121, 70, 46, 19,179,177,187,181, 14, 6, 68, 90, 41,122,105,185,241,177,242, 65,107,146, 52,101,
+ 48, 24,177,184,126,129,115,171, 23, 81, 20, 20,149, 58,203, 54,218,136, 60,169, 30, 87, 67, 81,192,160,135,201,115,202,209, 24,
+ 81, 20, 78, 20,164, 20,133, 49,252,192, 63,251,251,148, 19, 7,177, 48, 51, 53,180,156, 69,106, 90,105, 41,178, 24,237,215,156,
+ 33, 44,207, 40,147,161, 19, 36,149,165, 75, 83,178, 10, 51,141, 4,181,160,148, 79,102, 12,191,245,165,207,177,251,234,107, 28,
+ 60,216,229,198,179,127,138,198,133, 43,156,254,211,191, 75,176,184, 92,141, 94, 93, 39, 33, 61, 77,190,243,144,240,210,117,132,
+ 31, 34, 27,117,100, 1,227, 23,191,193,254,183,126,133,131, 47,124,145,252,164, 79, 62,152, 80, 88,195,106,216,164,211,106, 17,
+ 54, 23,232, 44, 45, 34, 60,143, 36,153,176,186,123,204,227, 31,250,147,220,168,255, 25, 94,248,220,255, 74,127,247,214, 60, 51,
+125,202, 67,159,225,206,221, 33,163,245, 60,177,202, 24,135, 91,145,103, 4,140, 98,182,143, 7, 83, 89,218,148, 39,102, 35, 93,
+236, 92,133, 44,254,152, 23,120,150,254, 86,117,203,166,202, 87,159,122,129, 93,163,122,102,164, 41,166, 8,215,234,170,158,125,
+ 49,232,218, 50, 94,235, 60,249,233, 61,138,180, 63, 39,204, 85, 3,212,105,128, 10, 82, 84,130,121,119,144,138,170,235,146,213,
+216, 93, 76, 17, 59,118, 30, 29,235,158, 71, 89, 21, 88, 2, 97, 12,164, 67, 10, 83,128,205,102, 7,249, 52, 8,198,101,170,187,
+ 75,193, 9,203,166, 99,222,121,203,103,101,229,105, 22,130,194, 66,118,120,139,112,227,124,245, 30, 79,171, 49,170,116,122,143,
+ 51,133,149,149, 10, 33, 66,108, 22,187,176, 29, 63, 68,232, 26,178, 72, 81, 81, 27,170, 68, 71, 91,100, 72,223, 93,188, 38, 77,
+209,174,194,192,228, 57,214, 15, 17,227,145,155,202,196, 99,172, 9,176,201, 24,169, 61, 74,155, 80,243, 61, 74, 35,241,106, 1,
+182,200,241,234,117,188,168, 1,121,138,174,213,145,210,175,152, 77,174,211,148, 97,221,189, 39, 80,136, 50,115, 83, 12, 23,169,
+ 86,197,125,106,140,117,246, 73,199,118,112, 83, 10, 29,132,110,114, 33,132,203,235,144, 10,161, 20,202,247, 29,239,189,178,176,
+217,210,184, 85,214,160,135, 41, 50, 58,109, 15,127,105,133, 50, 27,162,106, 77, 70,123, 19, 6,175, 60,135, 41, 11, 55, 81,157,
+199,236, 85,162,119, 59,131, 39,157,213,107, 76,167,109,103,187,234,105,128,212,180, 64,179, 21, 93,208, 37, 67,150,110, 21,117,
+ 38, 99, 96,234,118,112,200,217,114,110,187,156,193,157,204,108, 63, 36,230,190, 55,151, 12,119, 70,196,103,167,159,133, 18,148,
+176, 40, 1,129, 20,116,124,129, 44, 20,190,128,150, 86,248,149,220,198, 83,103,147, 3, 13, 69,124,236,186,124,139,227,100,148,
+ 5, 27,159,250, 27,188,246, 31,254,144,168,189,134, 8, 59,180, 46,253, 22,188, 92,184,105, 79, 46,177, 99,131,236, 14, 49,227,
+ 2, 59, 17,168, 69, 73,218,119, 25,238,218, 23, 20, 6, 68, 41, 40,253,146,149, 85, 72,239,126, 22,169, 55, 25, 23, 41, 30,138,
+126,218, 67, 74, 69,230,101,110,147,169,224,100, 18,211, 12, 36, 73,238,206, 80, 99, 50,162,176,197, 81, 55, 65,216, 46,185,201,
+232,246, 51,210, 98,151,115,139, 79, 48, 56, 62, 68,119,206, 95,163, 40, 75,250,123,123, 80,102, 52,150,150,232,237,237, 34,114,
+ 67,125,161, 77,173,209,228,198,234, 42, 94,212,224,230,151,127,151, 75, 79,159, 35,137, 71, 52, 87, 54,185,253,194,243, 8,202,
+255,143,175, 55, 15,182, 45,203,235, 58, 63,107,173,189,247,153,207,157,223,156,249, 94,190,247,114,172,202,154, 11,173,162,168,
+ 98, 40, 64,170, 40,198,102,114, 64,233,208,198,182, 91,109, 20, 67,180,181,187,137,208,144,104, 21, 27, 9, 67,237, 70,176, 1,
+ 81,161,105,170, 81, 40,192, 34,145,130, 42,107, 34,179,200,204,202,204,247,242,229,155,239,124,239,185,103,222,211, 26,250,143,
+181,246, 62,231,166,134, 47, 34, 35, 94,228,187,247,140,123,175,223,239,247,253,125, 7, 54, 47, 93, 97,253,226, 21,100,179,195,
+240,254, 61,226, 94,151, 50,205,144,194,161,186,109,108,150,209,232,173,145, 14,247,201,173, 32,105,197,140,143,247, 56,255,216,
+ 21, 84, 20, 49, 59, 57, 6, 52,118, 50,166,152,205,184,253,194, 11,172,109,173,114,243,139,175,163,146, 25,101,158, 33,163,132,
+ 56,110,145,230, 25,195,225,140, 78, 67,115,246,204, 26, 78, 11,156,130,110,167, 73, 89,106, 26,157, 46,227,241, 36,144,118, 10,
+ 58,205, 21,182,247, 14,137,148,229,145, 75,231, 16,178,131,179,146,225,100,134,196,145,230,142,210,164, 92,189,176,193,225,193,
+ 17,175,126,249, 14,105, 89,178,181,182,198, 74,175,197,108, 86,176,186,210,160,191,190, 74,207, 9,238,222,221,166,200, 13,202,
+149, 92, 59,115,129,151,110,236, 50, 60, 62,230,210,133,132,205,173, 51, 62, 32,193, 20, 52, 86, 87,185,116, 86,210,136, 20,243,
+194,144,229,154,251,123, 3, 14,134,115,180,107,114,113,115,141, 59, 7, 3, 16,109,238, 29, 28,210,116,154,107, 87,207,241,111,
+127,245,231,120,199, 7,191, 30, 21, 37,252,151,254,184,249,125,120,112, 11, 70, 99,152,164,216,121,134,214,218,235,173,231,115,
+230,163, 41,113,167,205,218,187,222, 71,242,214,167, 64, 5,109,119,229,181, 42,195,169,237, 18,207, 18,245,179,141, 63,184,202,
+140,114, 62, 71,246,253,222,186, 44,102, 28,221,187,207,232,248,132, 50,215,156, 93,191,200,245,119, 63,134, 62, 57,174,153,197,
+ 34,234,131, 61, 89, 18, 74,151,144,121,119, 44, 59,207,144,206, 75,115,140,181,188,177, 55,164,117,245, 42,102, 58,172,163, 84,
+ 61,108,237, 89, 54,206, 56,140,149,144,249,201,200, 23, 55, 67, 62, 26, 81,140,199, 88,165,160,221, 70, 52,187, 16,183,188,254,
+190,209, 34,201,230, 40,231, 40, 70, 25,231, 30,127,154, 11,207, 60,139,201, 11,204,100,234, 39, 23,163,195,242, 87,251,134, 77,
+ 42,242,227,125, 26,198,123, 40, 60,255,177, 31, 96, 54,152, 51,193, 96,155, 17,237,110,155, 82, 66,178,209, 35,182,130,161, 82,
+172,172,118,105,182, 91,168,213, 85, 84,220,162,217, 72, 80, 43,125,220, 96,132,179,154,103, 62,244,167,248,236,191,254, 95, 78,
+ 29,108, 66, 46,123, 96,123,210,152,117,139, 3,172, 42,164,206,217,154, 53,238,130,221,102,101,157, 90, 29,112,126, 95,233,106,
+ 77,183, 88,142, 43,173,236, 93,235,131,215,213,222,236,182,182, 79, 93,172,238, 79, 65,159,114, 33,138,112,110,241,220, 81,163,
+239, 63, 47, 61,247,133,119,105, 50,170, 14,233,154,159, 39, 69, 45,207,115,117,130,220,146,234, 44,236, 95,109,165,193,167, 94,
+198,135,207,201,144, 29,188,178,120, 33, 1,240, 81,145,194,106, 11, 97,202,151, 98,169, 41, 49,212,121,236,214,121, 59,208,202,
+231, 32, 82, 2,123,112, 19,196, 55, 6, 18, 93, 8,163,183, 62,169,174, 10,119, 65, 42, 68,228, 29,236,156,247,173, 70,181,218,
+126,106, 78,218, 80, 24,112, 99,140,209, 68,221, 53,191, 27,151, 10,215,104,251,231, 45,141, 79, 58, 12, 30,250,121,154,161, 74,
+139,158,207,124,200,145,106,208,238,218, 0,153,227,237,169, 29, 52,251, 27, 62,203, 94,249, 6, 19,169,192,104, 95,208,101, 32,
+239, 85,106, 1, 21,227,138,204, 59, 44,138,216,107,228,109,137,117, 58, 16,223,124,240,145, 39,146,122, 11, 94, 41, 99, 47, 97,
+ 21,139,152, 93, 25, 37, 72,229, 73,114,217,201, 17,217,201, 9,227,123, 55, 56,119,237, 18,205,205,107,216,124,134,140, 90,152,
+184,199,254,255,243, 47,153,222,124,209,167,146,185, 5,146,230,163, 73, 67,147, 22, 26, 68,196,194,223,223, 5, 35, 37, 31, 47,
+188, 36,193,172, 17,167,165,239,191,206, 50, 8,153,236, 98,105,221, 19, 60, 24,150, 67, 98, 8,196, 79, 17, 44,164, 45, 11,251,
+ 99, 91,153,221,224, 35, 86, 43,162,158,148,146,128,245, 17, 57, 17, 8,154,146, 40,242,175,169, 33, 33, 10,114, 57,225, 92,208,
+212,251,166,201, 91, 39, 7,110,140, 19,180, 47, 63, 3,162,164,217,239, 34, 38, 83,116,118,141,118,255,187, 48, 89,215, 51,248,
+ 51, 7,165,193,102,142, 98,236,112, 29, 73,126,100, 81, 45,144, 69,165,133, 13, 19,252,138, 32,159, 73,190, 97,245, 75,220, 25,
+125, 20,237,246,105,198, 45, 12,142, 65,126, 64,170,215,233, 52, 91,232, 18, 98,213,192, 24,111, 55, 25,197,138,121,166,153,206,
+167, 88,147,115,113,237, 60,227,124, 66,102, 4,243,244,128,245,245, 51,116, 59, 87,136,172,179, 28,222,127,192,209,206, 14,102,
+ 62, 67,207,103,172,157, 89,199, 26,199,195, 91,183, 88, 63,115, 6, 99, 36, 14,205,197,199,159,101,176,243,128,222,122,151,193,
+238, 1, 82,103,156,123,226,113,186, 91, 23, 56,186,123,143,214,106,143,249,104, 68,118,178, 71,255, 93,239, 11,223,152, 33, 75,
+ 83, 14,111,191,202,245,247,125,136,227, 59,183, 80, 73,159, 78,167,131,192,145,207,198,168,182, 98,235,242,101,178,217, 20, 99,
+ 10,148,115,244,206, 93, 96,118,248, 69,158,252,202,183,176,123,235, 14, 82,164, 52, 91,109,102,227, 25,189, 94,204,153,179, 91,
+ 28, 13,142, 41,180,164, 44, 50, 90,189, 54,233,124, 76,220,236, 80,150, 22,107, 82, 54,214,207,241,252,139,183, 16,110,198,149,
+ 75,155, 88, 18, 28, 49,105, 58,195,160,105, 40,197,221,251,187,156,221,234,209,223,216,228,109,239,255, 10,222,246,161,175, 97,
+235,177, 39,232,172,108,144,180,186,252,215,254,184, 32,225,114,165,102,116,239, 53, 62,249,111,254, 21,159,255,244,103,185,191,
+127, 68, 20, 39,204, 75,135,146, 5,253, 78,131,193, 56,197,170, 38,143, 95,218, 98, 48,153, 49,156,150,236, 28, 76, 24,100,134,
+ 79,252,198, 47,243,236, 7, 62, 76, 28,199, 75, 44,244, 60,144,157, 18, 95,120,167,247, 96,247, 33, 12,167, 48, 75,209,227, 25,
+229,124, 70, 49,153,145,229, 57,243,241,140, 34, 47,152,207,114,178,194,177,178, 63,164,255,197, 47,112,225,235,190, 26,217, 85,
+139,168, 77,109,160,213,129,222,150,215,235, 58,237, 91,227, 66, 99,116, 73, 57,157,208,194, 82, 24,195,108,111,159,233,104,140,
+ 46, 11, 26,205, 14,205,181, 45,162,166,194,142, 74,136, 85,240, 41, 21, 1,246, 15, 21,194, 20,216,162,192,105,141,203,115, 76,
+166,217, 29,207, 40,130,112,174,209,223,196,148, 35, 47, 85,171, 72, 54,198, 31,200,206, 58,208, 37,102, 62,247, 38,119,189, 62,
+ 78, 72,116, 36,112,217,156,217,107,175,145, 63,247,251,228, 47,191,193,225,112,202,248,120, 64,164, 28,147,105, 70,233, 28, 9,
+144, 89,203,197, 78, 31, 37, 4,162,221,162,181,177,194,123,255,193, 15, 97,243, 18, 89, 10,127,163, 70, 2,147,167,112,176, 11,
+231, 31,229,145, 31,248,110,254,227, 79,252, 12,221,110,215,171,245, 13,244, 84,132,179,112,109,101,221,167, 68,105, 77, 62,155,
+209,156, 78, 73,206,245, 73,186, 29,172, 80, 20,135,123,196,221,199,232,180, 87, 16, 50,198,153,178, 46,216,110, 57, 84,204, 6,
+ 35,154, 96, 86, 99,141, 79,124, 90,196,134, 46,254,205, 35,173, 11, 98, 25,136, 90, 63,109,194,244, 93, 27,204, 86,196, 51,150,
+163, 76, 43,226, 92,120,174,234, 97,151,136, 73, 66, 8,191, 19,175, 16,147, 96, 98, 83,181, 32,249,232,126,152, 30,117, 45,153,
+243,251,224, 0,167, 42,177,228, 0, 23, 16,210,165,148,174,234,185, 22,104,130, 69, 18, 14,235, 72,214,211,254,194, 54,193,121,
+109,176,168,204,104,252,174,188, 78,119, 83, 11, 70,180,239, 9,156, 47,226, 44, 8,126,126,207, 12, 86, 27,180, 92, 15, 31,132,
+ 62,125,211, 70,173, 96, 71,236,173,136,133,179, 88,167, 1,133,108,182,145,237, 13,191,255, 70, 34, 68,138,176,150,168,237,176,
+101,134,144,125,191,191, 15, 81,161,178,200,189,101,108, 89,250, 98, 47, 98,156, 76,176,206,219,232,198, 42, 33,233,119,209, 89,
+129,108,196, 56, 43,176,145, 14,171, 16,237,249, 40, 85, 18, 97,216,131,139, 72,121,181, 73,210,198,149,153, 15,203,137,146, 69,
+230, 18, 14,131, 9,142,206,129, 50, 40, 37, 82,248,180, 75,121,202,129,209,223,163, 66,197,168,164,237, 53,249, 81,194,236, 96,
+135,236,232,144,163, 87, 94,230,177,103,175, 16,181, 54,188, 31,124,255, 44,135,159,254, 2,147,151, 63,143, 73,103, 11, 20,164,
+170,147,214, 46,154,169,160,228,168,190, 15, 91, 17, 46,229, 82,138,158,117,167,214, 69, 34,246, 77,154,168,194,131,156, 79, 19,
+172,213, 17, 85,183,105,141, 79, 95, 52,186, 54,184, 9,164,148,192, 29,177,245, 78,191,110, 46, 23, 36,251,250, 90,175,221, 29,
+181,231, 25, 68, 97, 71, 31,203,160,103,199,145, 52, 59,160, 11,148, 12,215, 27,206,123, 13, 72,207,182, 23, 72, 48, 37, 79,252,
+229,159, 98,116, 56,164, 72,231, 68,137,196,154,231,137,229, 33,101,218,240,239,115,174,209, 7, 37,101, 10,195, 99, 71, 91, 88,
+178,210,209,108,122,178,169,201, 89,132, 34, 73,135,234, 90,244,177,224, 35,173,159,226, 51,238,251,217,104,206,152, 12,115, 36,
+ 17, 89,121,194, 74,183,133, 19,134,149,149,136, 44,205,105, 42,133,112, 77, 30,166,247, 57,223,191, 64,171,221,102,144, 78, 88,
+219, 76,176, 7, 5, 78,181,185,247,240, 37,218,205, 51, 68,147,227,125,142, 31,220,163,219, 86, 60,242, 21, 31, 98,176,253,128,
+163,135,251,196, 13,199,250, 90,159, 39, 62,252, 81,182,159,255, 28,243,163, 93,202, 50, 71,185, 28, 87,182,233,109,173,210, 63,
+243, 52,186,200,217,125,253, 53,138,201,152,205,235, 79,114,227,243,159,163,215,142,152,143,199,100,195, 3,154,107,103, 49,105,
+134, 48, 57,233,224, 8,149, 68,228,211, 49,249,108,204,124, 24,211, 92,237, 17, 33, 72, 39, 51,198,119,238, 48, 29, 28,208,238,
+119, 24,239, 30,176,117,121, 11,129,165,221,109,211,233,109, 48, 60, 30,161, 53,180,186, 77, 6,195, 9, 71, 59, 59, 52, 59,138,
+102,167, 69, 18,173, 50, 63,201, 49,227, 25,141, 56,166,217, 89,229,104, 48, 1,173,185,242,232, 25,180,141, 72, 90, 61, 14, 14,
+238, 49, 30,205, 65, 42,222,255,237,223,202, 95,253, 83, 63, 72,119,245,236,155,138,181, 5,155,227,202,147, 37,182,142, 12, 48,
+ 88, 96,204, 22, 25,166, 44, 67,225,154, 17, 27,203,199,254,228,159,229, 59,255,194, 95, 97, 50, 62,225, 83,191,250,175,248, 63,
+127,242,103, 80,157, 21,102, 5, 36,113,151, 68,193,241,116, 76, 59,105,241,112,247,144,127,253,111,254, 57, 31,250,206,239, 95,
+ 42,228,206, 79,205, 66,128, 75,252, 65, 93, 30,194,221, 27,112, 56,132,233,156, 98, 58, 37, 31,142,200, 39, 19,230,227,169, 39,
+ 93, 25, 13,210, 31, 80,177,116,232,200, 49, 57, 57, 33,203, 50,242,223,252, 36, 23,223,249, 12, 81, 51, 10,122, 98,237,223, 67,
+249,101,178,147, 19, 58,223,240,237,200,196, 65,153, 97,102, 19, 47, 57,209, 37, 58,159, 51, 59, 25, 82,230, 57,243,217,156,179,
+ 87,159,165,213,239,162,164,173,111, 42,143, 14,235,165, 29,172,246,251,244,201, 20,107, 45,122, 58,193,164, 41,119,198, 41, 70,
+ 42,230,145, 34, 89,105, 51, 63, 24,133,100, 7, 31, 12, 97,139, 18,103, 44,106,243, 44,210, 89, 92, 89,112,244,137,127,199,228,
+ 55, 62,201,237,231,190, 72, 54,158, 48,205, 13,101, 44, 41,155, 77,154,237, 6,177,140, 88, 89,237,145,105,205, 74,175,143, 49,
+134,141,118,207,231, 43, 55,218, 68, 2, 82,231, 24,236, 29, 81,236,236, 19,109,109,248,131, 80,121,173,172,104, 72,244,206, 54,
+242,236, 5,158,253,161, 31,225, 23,127,236,159, 35, 58, 77, 26, 78,146, 40,104, 11, 65, 94, 20,236,140,135,172,196, 13,214,186,
+ 43, 28,151, 25,173,121, 74,199, 1, 86,225,242, 25,170,213,195,108,111, 35, 46, 94, 34,105,118,201, 38, 39,254,250, 17, 21,129,
+206,213, 0,165, 13, 7, 97,149, 35,141,181, 75,100,180, 42, 91,122, 73, 3, 46,150,161,117,106, 95,245,186,136, 85,123,238,200,
+ 79, 59,200,208,180, 40,185,224, 76, 84,177,239, 85,113,183, 11,150,178, 43, 23, 59,239, 10,213,116,181,254,184, 92,164,182,133,
+ 67,176,202,128,175, 3, 97,168, 96, 84, 79,254,243, 59,210,144,181, 18,200,110,214, 56,164, 53, 33,104, 35,188, 24,183,120,207,
+ 86, 19,228, 91,149, 95,252, 34, 4,167,242,251, 23, 75,159,129, 56, 5, 53, 44,233,171,170,166, 36,184,140, 37,171,231, 65,152,
+ 83,146,205, 48,178,250, 14, 37,138,193,148,160, 34, 92,225,247,231,241,218, 69,223, 64, 33, 49, 90, 35,172, 67, 53, 12, 14,141,
+140,155,193,217,207, 34,172, 69, 68, 77,156, 41,176,186, 68,168, 18,167, 34,148,118, 68, 40,223, 20, 68, 49, 46,216,180, 58,102,
+ 1, 50,215, 62,145, 78,167,136,164,133,209, 37, 82, 8,100,164, 64,135, 73,215,250, 73, 81, 4, 69, 6, 50, 66, 54, 34,255, 60,
+ 1,159,142,227, 6, 78,250,215,226, 81, 26,133,140,125,184, 11, 42,242,236,118,165, 16, 81, 28,222,114,140,108, 52,145,145,194,
+106, 67,122, 50, 98,240,234,139,136,249, 49,205, 94, 11,135,193,166, 94, 42, 58,187,243, 42,249,104,232,137,158,118,129,248,200,
+ 10, 38,183, 11,169,100,229, 96, 88, 59,250,202,197, 30,155,240,119, 89,135, 12,121,191,122,127,205,138,192,167, 88,254,125, 87,
+ 27, 51,185,224,187, 94, 95, 37,225,121,156, 10,188, 33,231, 39,242,197, 26,170,202, 93,247,166, 91, 38,228,158, 83, 25, 28,133,
+ 24,216,234,250,137,131, 87,178,168,155,186, 18,107, 23,121, 2, 46,240, 76,108,144, 4,182,214, 47,162, 83,197,108,103, 66, 54,
+155,179,126,246,173,156,127,239, 63,129,121,130, 56, 46, 48,218, 49, 63,246,141,222,116, 4,174, 16,228,115,139,206,160,140, 67,
+ 80, 91,238,208, 86,120, 94,177,116, 20, 25,152, 6,244, 79,118, 56, 41, 30,208,113, 9, 69, 89, 98,173,166,223, 94,161,215, 77,
+ 40,180, 64,246, 74,244, 36, 2,233,104, 10, 67, 36, 21,177,106, 17, 91,135, 70, 51, 58, 40,200,116,193,168, 56,160,223,124,140,
+ 11,103,207, 16,169,168, 73,171,213,164,187,181,198,231,126,245,227, 60,241,174,119,177,182,181,194,249,103,223,197,189,207,254,
+ 62, 47,255,230,191,163,213, 95,231,194, 91,222,195,193,237,215,104,116, 87, 61,116,209,233, 49,120,248,128, 7,175,190, 74,171,
+165,120,230,107,191,129,227, 91, 55, 40,103, 99,158,250,232,159,224,198,167,158, 99,243,242, 35, 72, 64, 91,205,153,235, 79, 51,
+ 62,218, 37,110,182, 57,217,217,161,221,235, 49, 57, 57,100,235,177,199,120,248,218,171,148,218,177,186,177, 66,158, 78, 56,127,
+237, 41,238,189,250, 50,143,188,229, 26,233,120, 70,210,106,115, 50,154, 81,102, 41, 89, 58,163, 44, 11, 14, 30,236, 48,207, 50,
+138, 82,241,250,205, 91,188,247,171,190,154, 78,103,133,147,193, 1, 73,175,195, 92,195,112,120,204,227, 79, 92,196, 32, 24, 30,
+141,249,252,239,253, 14,255,253, 95,253,111,249,240,159,249, 97,218,253,245, 83,157, 94,109,186, 98, 50, 47,131,145, 45,136,187,
+ 11, 98,153, 9,255,102, 76, 96,104, 75,100,164,112, 46, 33,234,180,136,140,195,229, 5,217,100, 0,243, 57, 95,243,117,255, 13,
+ 95,243,145,239,227,159,254,189, 31,229,255,251,181, 79,146,180, 18, 74, 3, 69, 86,240,182,119, 62,205, 11, 47, 12,222,244,252,
+ 65,227, 45, 60,243,219,137, 12,183,127, 19, 30,108,195,100,134,158,229,164,163, 17,211,163, 1,101,150,249, 16,142,124,142, 53,
+ 26, 37, 21, 6, 11,133, 65, 90, 65, 19,201,180, 48,216, 56,102,184,187,135, 82,142,213,243, 91, 65,247,107,176,133,161,204,230,
+ 12, 15, 78, 24,255,246,255,204,123,127,226,239, 83, 78,119, 49, 69,225,117,190,121, 70, 62, 58,241,211, 70,171,237,253,162, 27,
+ 45,148, 48, 96,148,135, 33,133,196, 10,179,216,211, 87, 44,176, 44,197, 21,198,239,219,181, 97,146, 26,178,234,190,237,123, 3,
+ 28,107,140,191,153,140, 65,108,158, 69, 21, 25,233,206, 30,111,252,200, 15,242,218, 39, 62,141, 53,150,125,237,136,251, 77,186,
+237, 54,110,125,149,178,240,164,195,190,138, 73,130,225,196,102,171, 75, 98, 45, 42,137,233, 70, 13,156, 16,204,203,156,181, 86,
+151, 66,103,160, 75,250, 43, 29,166, 55,110,179,126,225,108,152, 6, 45, 46,142, 80, 74,145,239, 63,160, 35,254, 40,157, 51, 23,
+105,118, 26, 72, 4,185,179,222, 13, 48, 48,126, 27,218,114, 51, 31,241,142, 70,131,149,164, 73,107,165,143,213,154,241,157, 47,
+ 19,119, 59,116, 31,125, 28,157,231,196,101,201,218,211,127,132,157,207,255,122,176,211, 20, 65, 71, 28, 60, 83,194, 33,100,157,
+ 91,178, 54,119,245,100, 33,100,197,105,175,184, 68, 34, 88,195,134,130, 92,123,157, 11, 8, 54,179, 11,175,149, 10,154,244,255,
+110,172,173, 73, 74, 85,226,153, 49,214, 19,177,146, 46,182,152,248,129,187,114,169, 91, 50,151, 95, 40,143,170, 67,217, 87,105,
+ 83,101, 99,191, 57,160,189, 98,156,171, 69,118,124,189,234,116, 65,202, 22,174,111,129,172,194,183,131,253,175, 8,135,177, 67,
+196, 21,218, 96, 23,145,235,209,194,227,157, 32,219,172,156,100,221,178,197,130,240,148, 9, 47, 91,119, 24, 44,178,213, 89, 80,
+171,165,242,247, 46, 81,120,125,145,191,215, 84,140,203, 83,176,150,168,127,214,219,201, 6,147, 19, 5, 96, 98,172,107,161,180,
+129, 68, 5,229,133, 37,110, 52,253, 61, 64,130,206, 51,191,211,181, 32, 27, 26, 17, 12,126, 80, 81,200, 5, 23, 68,173, 14, 56,
+129,108, 72, 68, 38,112, 58,242,201,114,145,183,254,197, 73,172,176,222, 74, 66, 74,239,158, 88, 53,121,161,169,145,210,235,215,
+133, 19, 97, 34,151, 88,157, 6, 66, 92,208,176, 11,130,172,213, 59, 71, 10, 25,249, 53,158,192,179,222,165, 68,167, 41, 69, 54,
+ 39,219,187,203,163,207, 60,130,179, 57,196, 45,162, 78,147,249,209,140,114, 52, 90,152,250, 24,106,215,192, 42,126,200,177, 68,
+144,100,169,201,171,215, 64,178, 18,177,215,114,245,106, 37, 84, 53,148,117, 84,113,128,212,101, 8,125,161,146, 43, 26, 27, 84,
+ 11,126,125,101,140,169,175,123, 92,149,137,224,234, 35,199, 46,157,225,222, 99,158,218,146, 86,224,155, 15,169,146,112,191,149,
+ 97,104,243,196, 60,167,211, 83,187,252, 74, 69, 43,165,244, 28, 7, 44, 87,126,224, 71,217,123,229, 30,141,118,147,254,214, 22,
+ 73,127, 21, 97,143, 96, 38, 41, 83, 40,103, 97, 53, 36, 64, 68,142,194,128, 29, 67,158, 57, 68, 11,108,211, 23,113,153, 64, 57,
+113,152, 22,148,198,107,252,167, 78,241,177,198, 47,241,235,217,223, 32,118,175,208,146, 93,214,250, 61,226,182,197,229,142, 94,
+175, 69, 46, 35,144,154,155,251,175,113,101,227, 73, 86,215, 27,108, 31,108,243,200, 35, 23, 57,217, 46, 24, 20, 35,250,205, 45,
+114,123,200,253, 7, 19,162,217,201, 9,179,201,156,209,225, 46,151,159,120,156,249,116,202,232,248, 16, 77,196,100,156, 18,185,
+ 25, 91, 79, 63,206, 27, 47,252, 1,145, 82,244,215, 87,201,178, 49,118, 56, 32, 29, 79,184,246,246,119,144,158, 28, 32, 84,194,
+246, 27,247,120,231,215,125,152,123,207,127,142, 66,107,230,131, 1,113,107, 5, 99, 53,199, 15,246,105,118,219,216, 50, 39,155,
+167,156,125,228, 60,195,131, 3,159,205,158,105, 92, 57, 97,227,202, 59, 56,217, 59,102, 58, 60, 96,125,235, 28, 89,154, 50,157,
+102,204,230,115,142,119,119,176,102, 74,167,187,129, 84,130,149,181, 21,204,177,225,100, 52,163,211,217,224,112,247, 22,157,230,
+ 22,237, 94, 23, 43, 27,164,179, 25,221,126, 27, 84,204,205,151, 95,229, 3, 31,251, 40, 63,250, 43,191,249,159, 21,242,218, 69,
+205,229,160, 51, 80, 77,132,234,122, 7, 53,140,207, 99,118,102, 49,165,251, 48,110,159,227,157, 36,136,164,225, 25,174,137,130,
+ 78,151,104,109,157,150,144, 32, 98,116, 54,227,175,253,139, 95,226,207,238,222, 97,251,245, 47,113,184,243,144,141, 11, 87,121,
+219, 7, 63,186,152, 66,132, 8,238, 87, 32, 68,240,109,183, 67,184,253, 10, 12,198,184,105,202,252,214, 29,202, 79,255, 39,216,
+ 63, 64,142,198,100,163,148,195, 84,211,126,230, 50,103,190,226, 89,210,225,208, 95,132,185, 65,137,136,164,215,193, 72, 72,179,
+140,168,149, 48, 27, 79, 61,170, 96, 45,113, 28, 97,203,146,147,221, 99,242, 44, 39, 63, 58,198,205, 6, 94,122,152,166, 52,214,
+ 54, 48,243, 49,113,183, 79,123,101, 78,145,149, 52,226, 4,235, 20, 91,103,187, 80,206,192, 88,108, 89, 32, 91, 93,223,117,227,
+ 29,161, 48, 6,210,185, 15,125, 72,115,136, 34,202, 82, 47, 73, 95, 36, 46,203,112, 73,130,236,244,176,119, 95,167,252,241,159,
+228,225,191,250, 4,251,101, 73,188,214,231,145,115,155, 72, 33,216, 42, 75,102,165,227, 76,220, 96,160,115,246,165, 67,161, 88,
+141, 99,250,113,147,212,149,196, 56,166,182,160, 85, 40,166, 46,103,150,231,116,146,132,163,217,136, 22,160,165, 32, 78, 26, 28,
+127,225, 85, 54,191,254,171,252, 62,189, 98, 95,199, 49,229,100, 6,147, 1,244, 55,120,242,173,215,216,127,237, 30, 68,130,212,
+ 64,230, 28, 13, 45,136, 59, 77, 34, 35, 24,102, 51,154, 14,138,209,128,217,209, 54,142,136,205, 75, 87, 16,171,125,226, 76, 99,
+165, 64,149,182,214,231, 46, 75,174, 93,248,139, 11, 19,172, 13, 17,143,203,228,160,229,162,186, 72, 97, 13,123,241, 69,220,121,
+ 77,242,170, 98, 89, 79,217,241,213, 59,109,113,106,186,175,224,206,164,115,142,184,123,142,236,248, 70,136, 80, 93,250,185, 80,
+128, 23,145,171,139, 36, 76,191,111, 20,117, 3,178,248,165, 90,148, 95,191,120,161,100,125, 64,218,165,245, 65,197,198,175,244,
+201, 82, 46,246,253,158,212,231, 97, 73,112, 88, 23, 14,244, 58,195,157,234,131,171, 35, 63,157, 19,196,221, 75,136, 72,160, 39,
+ 15,113,186,218,215, 58, 18, 33,188,119,187,168,113,227,160,142, 84,149,166,193, 23,118,227, 85, 27,170,221,247, 97, 47, 4, 52,
+ 78,133,223,137, 98, 36, 22, 33,122,158, 80,151,207, 17,173,134,111,189, 34,131,213,222,231,221, 57, 65,212, 78,208,101,233,245,
+224,141, 4, 85,104,159,162,102, 28, 74, 52, 3,255, 36,241,153,220,137,196,217, 18, 33,155,254, 53,139, 64,120, 83,141, 64,253,
+240, 68, 93, 17, 41, 63,133, 86, 59, 14,235,188, 57, 16, 22, 33, 20, 34,138,124,193,143, 26, 72,233, 3,153,162,184,137,136,124,
+152,139, 76, 26,254,103, 80, 72, 25,121,178,105,145,225,102, 35,174,191,231,113,214,174, 63, 29,138, 91, 3,173, 20,179,215,191,
+236, 45,118, 27, 45, 92, 58,175, 17, 30, 74, 23,246,209, 98, 97,161, 16, 38,113,183,236,217,143, 91,124, 15,238, 77, 10,218, 37,
+ 82, 71,213, 32,178,212,148,214, 4,185, 42,207, 32,100,167, 91,107,130, 90, 34, 40, 74,150, 72,162, 78, 46,249, 92,212,182,203,
+225, 62, 67, 98,169,130,101, 26, 52, 87, 46, 82, 76,143, 48,197,120,233, 51,117, 85,176, 92,205, 13,144,149,236, 48,240, 19, 84,
+163, 77,123,235,157, 60,184,241, 18, 78, 59, 86, 47,157, 97,186, 7,205,238, 46, 28,196,252,250, 47, 77,153,247, 5, 61, 11, 42,
+134,196, 65,187,233,175,178, 86,199, 81,104, 15, 14,198, 93,152, 28, 58, 92, 95, 48,219,119, 56,233, 48, 2,140,112,180, 69, 65,
+146,126, 28,215,124, 47, 43,113,147,194,150,136,121, 68,163, 89, 96,242, 14,131,116, 64,175,209,231,124,251, 81, 58, 23, 75,138,
+227,152,157,209, 49,173,102, 15,109, 28,173,200,123, 20,196, 46, 97,170,167, 68, 59,175,223,231,236,229,117, 58, 43,215,185,241,
+153,207,242,216, 59,223, 66, 58, 16,232,201, 49, 34,146,244,214,207,115,244,240, 33,217,116,192,123,190,245, 59,121,240,165,151,
+217,184,112, 9,135,226,224,230,107, 40,145,211, 63,115,145,147,237,123, 52,154,138, 60, 45,136,227,132,213,213, 14,243,241,128,
+ 44,203, 57,247,248, 51,236,188,250, 7,156,187,254, 44,113, 35,161, 44, 10,134,251,187, 56,225, 72, 7, 71, 30, 50, 41, 29,217,
+108,194,225,254, 17,235,151, 54,153, 12, 82,198,131, 33, 70,107,178,241,148, 70,172, 72, 58,107, 76,166, 5,206, 25,138, 60, 35,
+ 77, 83,239, 5,162, 58,164,243,140,213,190,192,186, 6,243,249,156,102, 75,113,116,239,132,139,215,175,242,227, 63,249, 5,111,
+210, 96,171, 27, 95,212, 59, 29,132,169,111,110,226,190,159,146, 93, 17,236, 13,203,197,169,104, 75,223,233, 39,141,224,172,218,
+ 90, 50,111, 81, 65, 87, 93, 29, 57,133,215,209,235,148,236,193, 46, 73,158,114,253,234, 51,188,245,131,223,190,144,234,212, 5,
+221,158,118,117,155,221,129,219,119,161, 48,228,159,254, 12,249,175,253, 22,210, 65, 89,148,220, 59, 24,242,198,116,202,200, 88,
+ 30,230,134,246,127,124, 30,254,211,139,252,201, 63,243,205,158,156, 99, 5, 73, 59, 66, 0,253,245, 46,243,189,153, 39,188,165,
+ 25,206,104,202,194,144, 68, 18,103, 52,243,201, 24, 93, 20, 12,179,140,241, 43,175,208,186,180,133, 53, 37, 81, 4, 18, 69,103,
+243, 60, 46, 32, 11,205,241, 58, 82, 40, 26, 61,133, 57,206,188,159,179,113,225,166,177,190,241, 49,193, 36,166, 44, 60, 27, 55,
+ 18,168,102, 66,174,245, 66, 53, 5,216,110, 31,247,227,127,159,227,159,249, 56, 69,145,179,250,232, 5,206, 60,117,153,104, 48,
+225,164, 40, 72,139,146,169,182, 12,203,130,193,201,140,225,217, 53,208,154,153,117,116,149,224, 36,205, 72,164, 68, 10,193, 56,
+203,152, 22, 5,170,165,120, 48,153,211,140, 37, 81, 20,113, 50, 57, 97,173,187, 66, 34, 21, 78, 8, 38, 71, 83, 31,215, 42, 43,
+120,214,239, 94,137, 20,246,193, 61,196,211,107,124,203,207,253, 60,255,251, 19,239,226,226,198, 10,189, 72,144, 4,104,142, 34,
+103, 43, 82,148,121, 70,167,183,202, 96, 58,225,226,163, 87, 41,243,130,236, 96,223, 91,110, 54,123, 68,165,161,181,126,142, 90,
+161,227,150, 78,181, 55,235,181, 69, 85,216,100,109,131,105,171, 53,239,146,127,124, 77,178,171, 32,116,199, 34,153,108,233, 57,
+106, 88,159,197, 78,126,137,144, 92, 19,149,172, 45,201, 71,219,152,114, 30,206,172,211,177,176,184,211, 36,168, 90, 22, 36, 23,
+ 59,235,122,105, 94,189, 58,177, 56, 20,165,148,254,241,194,228, 94,161, 4,213,195, 27,227,234, 9,212,218, 42, 31, 94,176,100,
+ 51,239,185, 0,149,198,189,114,215, 11,171,165,197, 58,193, 17, 53, 55,105, 94,124, 39,102,118, 76,121,178,131,136,108,125,220,
+ 11, 37, 48,163,253,128, 34,133, 72, 95,169,168,131,230,101,236,239,103, 39, 16, 73,219, 19,231, 68, 20, 92,231,148,103,202, 43,
+175,255,182,206, 67,237, 56,235,155,140, 72, 66,169,113, 50, 70, 38, 17,182,152, 17, 53,219,152,178, 12,133, 89, 16, 55,123, 32,
+115,255, 90, 35,176, 58, 15,209,179, 37, 81,163,129, 41,114, 80, 77,207, 39,140,188,220,206, 26, 27, 82, 9, 5, 22, 19,214, 16,
+ 50, 72, 12,189,101,155, 80,193, 92, 42, 72,202,148,108,249,124, 7, 17, 8,119,206,161,154,173,128,248, 72,100,210,244, 82, 63,
+229, 13,113,204,124,194,224,193, 29, 18,155,114,246,237,239, 64,245,124,179,162, 58, 43,100,199, 99, 70, 47,124,138, 98,184, 15,
+ 21,212, 95,249,250, 75, 25,120,177,129,255, 33, 22,150,190,190,184,219,186, 42,214, 18,206, 10,209,145, 94,127,238, 97,245,165,
+ 66,190, 84, 76,141,181, 11,181,132,240,147,186,171,136,107, 98, 97, 62, 83,173,164,150,159,195,201, 69,152, 82,245,122, 43, 41,
+101, 61,253,235,156, 98,122,132, 43,167, 75,167,180, 88,200,240, 2, 73, 84, 73, 81,199, 39,135, 11,150,205,175,252, 14, 6,219,
+135,244,207,246, 41, 38, 25,131,219, 59, 36,157,117,172, 59,196,190, 40,249,199, 59,142,223,253,137, 53,238,254,251, 9,251, 99,
+199,116,106, 25,167, 94,144,180,253,170, 96, 92, 64,167, 3, 89, 9,239,123, 70,176,158, 67,124, 65,112,247,174, 96, 56,176,236,
+ 13, 45, 43, 74,241,145,222,203,252,108,246,181,108, 53,189,186, 39, 79,115,250,107, 61, 70,131, 41,137,108,112,247,228, 54, 23,
+251,151,120,241,229,187, 88,155,146,153, 49,179,201, 37,156,212,116, 26,125,166,197,196, 7,243,216, 46,209,245,119,191,149,147,
+253, 61,246,238, 62, 96,243,220, 25,132,106,208, 88,221, 34,155, 12, 56,184,125,147,205,243, 31, 36, 59, 25,114,254,242, 21,246,
+ 94,123, 17,213,136, 40,117,196,225,189, 91, 92,125,247,251,152,156, 28, 49, 58, 56,160, 72,199, 60,242,244,179,236,190,126,147,
+ 98,158,113,246,234,121,164, 74,152, 12,142,200,211, 25, 27,231, 47, 51, 62,220, 99, 54, 74,208, 69,202,201,222, 33, 43,107, 91,
+104, 99, 56,222,185,199, 59, 62,252, 97,242,201, 16,155, 77,136, 27, 9,195,227,135, 88, 93, 82,102, 25, 42, 17, 32, 91,228,185,
+102,120,180,143,177, 41,137,106,250, 44,239,118, 66,158, 23, 36, 70,144,151,150, 44, 47, 41,242, 57,217, 60,227, 71,126,225,227,
+116, 86,207,132,194, 73,189,147,242,215,171,241,251,107,157,131,106, 33, 84, 3,231, 74,156,208,193,197, 76, 19, 22,148, 33,154,
+ 52, 9, 87, 97,128,240, 92,180, 56, 12,193, 55, 2, 54,199,229, 41, 78,107,172,209,228,227, 49,217,104,204,202,227,207, 18,183,
+186,225,117,232, 55,249,173,203, 69, 72,199,209, 43,240,198,125,202,189,125,210,127,246, 83,222, 15, 56, 74,120,248, 96,143,123,
+179, 57, 15,140,229,100, 86, 48,153,101,220,210,134,205, 72,113,177,211,226, 71,254,143, 95,228, 7,191,241,221, 92,125,242, 49,
+ 76, 44,137,218, 49,178,211, 66, 74,111,176,211,176, 80,104,135, 46, 10,100,105,201,102, 41,197,120, 66,212,148, 68, 17, 28,124,
+246,121, 46,127,247, 71,200,199, 19, 58, 23, 46,162,226,216,203,123,226, 6,249, 52, 37,105,245,233,116, 87,253,116,149,229,152,
+172,192, 5, 18, 20,182,244, 5, 93, 56, 40,203,160,108,243, 97, 24,113,171,205, 88, 27,148,138, 24,204,115,190,235,210, 6,179,
+119,191, 31, 29, 69,180,174,158,135,225,148,241,108,142,117, 48, 46, 74,102,218, 11,172, 87, 34, 65,175,213,227,226,215,127, 13,
+ 47,253,202,175, 19,117,154,172,136,136,173, 40,225,124,111,111,211, 5,170, 0, 0, 32, 0, 73, 68, 65, 84,133,181,102,135,172,
+204,137,162,216,231,214, 59,216, 72,188, 71,126, 44, 96,173,213, 36,182, 37, 58, 47, 33, 82, 76, 71, 83,156,246,251, 90, 41,164,
+215,203, 10,129,106,196,232,253,109,146,167,223, 78,255,242,117, 54,128,149, 68, 65, 97,105, 39,138,195,194, 91,184,108,196, 13,
+206,116,250,116,186,235,236, 77,142,217,127,112,151,254,234, 38,205,118, 23, 61,155,135, 73,117,147,249,112,175,222,151, 59, 22,
+209,169,117, 94,138, 19, 53,187,124,113,248, 44,236, 99,173, 91,212,157,101, 24,219,167,182,217,197,164, 36,150,131, 98, 22, 78,
+106,174,138,159, 20, 11,168,190,102,211, 11, 48,179, 99,223, 0, 4, 45,121,165,115,246,201,112,178,246,171,151, 65,138,230, 4,
+111, 66, 3, 64,196, 45, 95, 96, 93,177,100,137, 91,189, 38, 87, 67,247,226, 20, 18,230,187, 18, 33, 65, 42, 21,108,126, 67,209,
+103,161,147,175, 80,128, 58, 66,214, 85,187,220,160, 73,175,137,120, 2,103,166,100,219, 95,196,228, 19,164, 50,254,243, 80,213,
+113,236,130, 34, 35,174, 48,100,127,223, 46, 91, 36,219, 48, 90, 9, 9, 50,248, 57,168,200,163, 77, 34, 2, 97, 16,113, 18,184,
+ 4,206, 75, 53,163, 40, 32, 33,222,224, 68, 88,135,136, 26, 88,109,112, 90,215,158,236, 86,167,126, 32,136, 98, 98,149, 80, 90,
+141,195, 17, 37, 45,116, 54,243,246,182, 14, 74,147, 19,137, 6, 68,222, 48, 72, 96, 17, 86,121,129,138,242,134, 39, 62,133, 77,
+ 6,178,152, 70,132,215,234,139,118,132,144,222,125,206,255, 12,200, 70, 19, 91,228,126,146,151,193,105, 79, 69,100,131, 99,166,
+ 59, 15,152, 61,188,205,229,235, 23,145,237,166,103,255,203, 22,170,211, 71,223, 59, 36,223,223, 70, 79,102, 62,159, 32, 88,192,
+214,237,184, 89,114,137, 11,146,204, 5,183, 66,212,205,172, 88,114, 61,172,164,141, 50, 56, 28,186,176, 91,175, 84, 15,149, 98,
+ 98,217,122, 81,132,198, 87,197, 50,144,234,130,226, 59,100, 34, 72, 1, 90,219,133,210,194, 44,149,104,203,130, 88,233, 22,255,
+ 79, 10,129,205,125, 58,161, 91, 74,133, 19, 66,248,115, 65, 46,124, 33,188,210,196, 6,146,161,227,236, 7,127, 8,215,204,216,
+123,238, 46,237,110,143, 98,110, 72, 26,146,120,148,243,167,126,232,136, 95,251,196, 38,233,254,132,100, 83,162,134,150, 86, 91,
+ 16, 43,193,234,170,101,107, 5,118, 30, 6, 53, 98, 36,184,241, 26,164,202,115,139,159,120, 12,250, 23, 5, 87,159, 16,148,115,
+139, 56,144,188, 39,253,121,138,254, 95, 64,234, 57, 38, 41, 73,244, 42, 55,183,223, 64, 83,208, 80, 9, 39,233,128,205,228, 60,
+ 37, 51, 82,189,206,225,236, 33,155,253,139,148,186,160,211,104, 80,154,148,203,103, 19,162,157,215, 95,199, 9,135, 18, 2, 27,
+ 55, 57,126,176,205,241,206, 61,122,103,206,115,237,173, 79,179,121,245, 73,246,127,231,183,144,113,139,166,115, 36,173, 22,243,
+241, 9, 43, 91, 91, 76, 78,142, 40,211, 49,221,181, 51,244,174, 63,206, 31, 62,247, 28,143, 60,241, 40, 81, 35,166,152,251,100,
+174, 34, 77, 57,122,227, 53,180, 49, 20, 89, 70,171,219,101,180,255,144,254,218, 6,131,147, 99,202, 50,229,202, 83, 79, 98,202,
+156, 44, 45, 57,243,216, 21,118,110,189,129,206,230, 56, 33, 57, 57,188, 79,212,136, 49,185, 96,176,119,192,238,206, 49,237, 46,
+108,172, 55,137,155, 49,198, 8, 76,145, 35,104, 51, 29,205,121,253,245, 59, 92,127,230, 26, 63,242, 47,127,109,105, 42,150, 75,
+ 94,194, 38, 16,104, 76, 32,204,116,194,207,149, 1, 51, 12,112,187,245, 25,212,254, 78,241,233, 97,126,113, 39,151,226, 42,157,
+151,112, 97, 64,231,152,249, 28, 61,159, 82,166, 57,147,189, 29,214,159,126, 23,155,151,223, 26, 30, 63,171, 13, 96, 42, 19,139,
+122, 21, 32, 44,238,193, 11,240,240,128,244,133, 23, 48,191,240, 75, 52,174, 92, 98,239,229, 59,188,124, 52,228,190,117,156,236,
+ 31,211,232,119,120,207,119,124, 61,215,190,229,163, 52,182,206,178,253,252, 31,240,137, 31,255,103,156, 59,180,252,219, 79, 62,
+207,223,122,235,117, 68, 28,211,104, 55,145,173,132, 70, 51, 38, 51, 14, 25, 71, 20,101,137,203, 11,114, 93,112,238,242,117,110,
+237,221,199,234, 38,205, 68,240,202, 39,127,143, 71,190,253,195,152, 60, 67,182, 87,144, 88, 76,153,227, 76, 65, 89, 20, 52,154,
+107,180,207,108, 34,173,198,232,194, 79, 92, 78, 19,171, 40,232,127,131,107, 84, 89,128, 51, 65,210,101, 17,205, 4, 41, 37,155,
+137,228, 35, 79, 61,134,179,142,251, 7, 67, 10,109,136,142,198, 76,108, 73, 39,137,233,136, 24,103,141,119,136, 18,208,238,245,
+ 33,157,177,247,241,223,224,201, 51, 27,180,156,164,223,108,114,166,217,246,174,108,229,156,134,146, 40,233,136, 20, 68,182,164,
+ 20,150, 36,142, 56,153,142,233, 52, 26,204,129,121,150,209,235,247, 3,177,207, 64,164,234,180, 51,148, 66, 89,129,158,141, 73,
+166, 67, 84,127,131, 39,190,237,107,121,249,183, 63,141,139, 34, 26,153,165,196,242, 88,171,195, 88, 23,172, 21, 5, 73,187,205,
+197, 70, 35,200,149,164, 87,110,116, 58,184,201,148,150,146,164, 39,251, 53, 17,204, 5,150,184, 19,193,172,165, 58, 15,141, 91,
+ 76, 30,194,213, 82,160,138,186, 81,177,230,149, 18, 75,135,156,173,137,106, 82, 44,249,252,188, 25,218,100, 41, 58,181, 78,109,
+171, 14,209, 80, 84, 3,223,184, 78,134,115,162,222,241,215, 43,242,106,122,183, 75, 29, 68,128,128,125,104, 77,177,152,132,164,
+ 55,255,192,202,154, 25,191,188,107, 71, 84, 50, 36,223,104, 56, 25,161,162, 38, 78,143,107,151, 53, 39, 23,208,173,215,174,203,
+133,141,110, 48,203, 65, 46,244,208,214, 90, 76, 49,247, 59,229, 83,105,110,254, 83, 54, 22,138,237,155, 64,236, 97,238, 26, 38,
+178,222,144, 73, 23, 1, 26, 16,126,143,110,141, 47,240,214, 6, 34,157, 14,111,204,135, 11, 89,157, 7, 71, 62,143,130,121,243,
+ 26,129,211,101, 40,126, 22,231,180, 15, 71,113, 51, 31,166,146, 68,128,242,196,183,184,225,247,184, 70, 19, 37, 49, 70,128,213,
+ 5, 74,120, 29,185, 51, 6, 37, 84, 88, 49,232, 32,113, 20, 64, 85,176,109, 45,215,243, 10, 4, 21,172,118, 19, 84,212,240, 95,
+131,140,194,100,175,124, 32, 78,156,132,230, 82,122,110,203,206,125,230, 7, 15, 73, 15,119,105,191,251, 42, 50, 78,112,170, 69,
+212, 89,167, 40, 12,102, 50, 68,182,251,216,244, 94, 29, 38,180,168,212,226,148,223,160,117,167,221,228,172, 59,221,188, 89, 28,
+178,130,228, 77,128,159,116,224,148,104,235,155,202, 48,121, 59,177, 36,139,115,149, 36,205,213,211,186, 53, 11, 46,138, 16, 34,
+160, 61, 44, 60,225,171,166, 32, 16,237,170,230,178,134,229, 23, 1,137,167, 44,103, 43,195, 90, 47, 5,117,167,222,170, 16, 94,
+230,184,254,254,143,176,255,250, 3, 86,175,173,176,178,117,150,230,106,147,249,104, 76,154,221,227,230,191,216, 98,208,222,161,
+125,117,131, 98,156, 19, 53,188,182,188,114,103, 52,165, 64,173,192,121, 13,243, 28,146,134,100,171,227,232,172,249,158,113,119,
+219,145, 25,159,225,222,237, 9,100,228,120,195, 94,230, 92, 54, 71,107,201,246,254,152,241,241, 61,148, 76,208,214,178,218,218,
+100, 86,100, 88, 44, 45,213, 37, 18,134, 76, 37, 36, 56, 10, 83, 48,183, 57,202, 54,200,138,146,104,116,240,144,222,218, 42,187,
+219, 59,108,157, 93, 99, 58,119,108, 61,114, 13, 83, 78,201,178,130, 91,159,251, 2,198,192,193, 27, 95,226,201,175,250, 99, 12,
+238, 63, 36,207,114, 86,206,172,146,142,166,180,186, 45, 78,134, 39,104, 20,107,231,207,242,198,141, 59, 92,127,251, 51, 12, 14,
+ 70,108,246, 26,116, 86, 55,152,142,142,152,142,166, 72,233,232,244,218, 52,155, 45, 92,121,196,240, 56, 71,158, 63,143, 60, 60,
+ 33,205,115,116, 97,216,191,123,151,102,183,205,124, 56, 64,196,138,102,171,231, 89,163,194,209,217,232,179,145, 58,110,221,122,
+131, 78,167, 67,174,231, 8, 27,209, 91,105,211,104,247,249,242, 75,175,243,225,239,253,110,190,227, 47,255,237, 80,112, 23, 80,
+187,255,178,181, 47,194, 38,236,200, 85,107, 65,166, 17,194,195,199, 85, 39,175,226,128,138, 71, 1, 94, 95,100,100, 19,244,152,
+ 30,186, 47, 48,211, 9,122, 62,161, 72,115,138,201,132,124, 62,229,252, 31,249, 48, 82,169, 0,229,155, 37,255,233, 70, 45,211,
+240, 47,209,194,253,231,113,247,247,152,255,135,223,198,253,222,103,104, 60,113,141, 59,159,127,153,207, 31,141, 56,152,102,116,
+214, 58,252,224,231,126,131,141,119,189,159,114, 58,164, 28, 28, 81, 22, 5, 79,124,211,199,120,235,247,124, 63,247, 62,247,105,
+254,202,183,124, 63,163,233,156, 51, 87,183,252,174, 95, 41,154,205,132,116,152,122,152,181,112,193,162, 87,112,248,234,151, 88,
+ 89,105,161,115,131, 81,146,221,225,136, 50,205, 60,227, 87, 70, 94,230,230, 44,229, 60,163,200, 50,186,235,171, 52,187,109, 48,
+ 3,108, 90,153,243, 8,159, 3, 96,116,216, 89, 6, 34,139,241,236,245,106,189,209,139, 99, 86, 87,123,160, 34, 38,195, 49, 9,
+222, 43,251, 32,205,185, 51,203,217,136, 45,205,134, 33,234,244, 24,140,199,100,165,230,104, 50,101, 29, 71,222,237, 48,158,229,
+180,162,136,145,118, 12,202,146, 97,154,145, 26,195,106, 28,115,182,211,227,254,248,132,139,253, 53,172,140, 57,204, 50,164,240,
+113,181,194, 41, 10, 39, 17, 90, 83,160, 60,107, 86, 9,124,134,163, 87, 51,200,196,179,129,221,206,125,108,119,133,111,248,169,
+255,155,231, 54, 31, 97,101, 45,162, 21, 50,150, 75, 99,233,202, 6,205,102, 19,213,110, 83,142, 70,104, 87, 34, 10, 71,220, 72,
+208,217,140, 36, 89,197,106,195,100,247,206,226, 10,177, 75, 68,239,192,128,175,190,243,138, 20, 87, 77,175,181,229,230,146,251,
+187, 11,251, 69, 33,133, 15,177,112,139,168, 83,106, 93,176, 91,218,133, 47, 29,118, 65,223,107,195, 80, 89, 17,136,148, 13,150,
+176,206, 45,183, 1, 56, 20, 2,111,108, 33,107,141,188, 59,109, 77, 47, 18, 68,156,224, 76,182,176, 91, 93,134,252,195, 94,216,
+ 97,234, 93,118, 61,101,201,197,132, 23,247,206,129, 0, 61,154,156,210,204, 35, 2,107, 95, 44,199,182, 85,139, 78, 7, 70,212,
+100, 56, 41,229,127,193, 85,127, 73,238, 38, 28,150, 78,176,247, 92,172, 48, 80, 73,136, 97, 13, 31,112,212, 8,175,109, 89, 31,
+111,169,157,114,108, 96,159, 71, 14, 71, 89,179,241, 92,184,230,253, 32, 96, 65, 58,156,213, 1,158,174, 24,233, 49,182, 40,188,
+155,155,181, 40,153,120,227, 24, 21, 3, 51, 40,115,164,106,224, 2,228, 46,133,159,230, 93,109,176, 18, 66,141,130, 33,141, 95,
+205,120,180, 66,169,200,207,234, 42, 66,196, 17, 82, 38,222, 90, 86, 72,191,190,168,185, 3, 62,215,188,152, 76,152,238,110, 51,
+186,115,139, 78,148, 18,173,120, 3, 26,213,221,164, 44, 83,230,119,247, 41,199, 67,116, 58,173, 75,183,173, 34,255, 42,205, 97,
+213,148, 45, 93, 19, 50, 56,199, 45,172,139,235,211,182, 46,210,149, 75,164, 39,131,202, 69,188,174, 93, 90,221, 84,247,136,240,
+ 44,117, 21,121, 73, 96,101,102,180, 28,146,228,236, 50, 4, 95,221, 59, 11, 34,202,169,134, 68,138,211,230, 10,222,177,231,148,
+ 12,174,138,119,117,110,129,132, 85, 32,216,149,239,248, 91,188,241,249, 93,212,182, 67, 59, 67,115, 61,225,202,187,175,242,226,
+111,126,134, 89,255,143,178,217,248, 18,194, 21,200, 86,147,120, 69, 99,157,161,204, 65,233,202, 34, 87, 64, 34,188,148, 23,137,
+ 83,142,124, 12,169, 51,232, 92, 16,197,158, 41, 63, 31, 42, 26,194,113, 44, 62, 64,119,122,130, 18, 93,206,182,207, 50,179, 51,
+ 18,209,160, 33, 59, 28,207,143,233,197, 29,226,168, 65,164, 4,186,176, 72, 4, 90, 65, 34, 18,178,116,194,253,249, 45, 86,178,
+ 53,162, 86,171,137, 53, 17,231, 30,189,130, 46, 13,227,189,155,232,233,128, 11, 79, 62, 75,153,101,236,221,123,141, 44,179, 60,
+241,150,107, 28,222,124, 17,151,172, 83, 22, 57, 58,106,113,254,153, 11,244,210, 17,230,206, 13,236,100,198,217, 7,175,115,117,
+173,135,184,253, 58, 27, 39, 3,246,174, 60,205, 81,154, 33,102, 25,141,222, 38,227,221, 87,145, 23, 47, 99,242, 33,206,244,105,
+247, 91, 76, 7,187, 88, 35,145, 19, 69,127,107,139,205, 71, 47, 51,216,190,141, 65, 82,140,118,232,172, 93,163, 76, 39,126, 66,
+182,176,249,200, 58,173,110,131,135,219,219,140,134, 25,231, 46,172, 83,228,142, 23, 94,120,137, 31,254, 71,255,136,167, 62,240,
+205, 11, 39, 45,183, 76,132, 11, 5,189,158,192, 85, 24,167,244,162,160,139, 37, 99, 12, 33,192,197,167, 77, 20,170, 61, 56,198,
+ 59,176,233,130,114, 56,160, 72, 51,138,241,152,124, 50,197,152,146, 75, 95,249,141,225,226,200, 67,122, 25, 1, 10,108, 46, 17,
+227,194, 18,117,247,101,236,157, 29,230,191,243, 28,252,254,103, 73,174, 94, 96,255,165, 27,220, 73, 83,110,236, 15,248,190,191,
+255,215,120,203, 15,255, 93,210,221, 91, 76,239,220,192, 41, 85,107, 66,117, 81,146,239,109,179,246,232,101,254,249,243,159, 98,
+247, 39,127,140,139,141, 38, 78,249,174, 61,110,196, 40,229, 11, 44, 74, 97,245, 12,135,226, 19,255,246,151,153, 25,201,126,169,
+121,170,223,225,250,219,159,197,100, 57,182,200, 65, 54, 64,103, 76,118, 31,178,253,250, 45,102,105, 70,191,209,244,233, 81,101,
+177,136, 95, 12,211, 42,101,233,161,201,224,105,109,141,193,100,121, 72,250,146,108,158, 89,161,183,210,241,210,184, 44,103,152,
+151,140,178,146, 88, 41,214,227,152, 8,104,162, 24, 37,138,168,211, 34, 63,246,114,154,151, 78,198, 52, 58, 77, 34,165, 56, 46,
+194,202, 34,131, 50,220,178, 3,163,185,157,207,105, 75,201,170, 41, 72,203,146, 73, 94,176,209,106,115,148,101,100,214, 82, 88,
+203,181, 70,130,138, 37,148,166,158,100,144,145,159,218,181, 69, 68, 10,125,116, 68,252,164,160,185,113,150,203,143, 93,160, 28,
+ 77,201,173, 33,146,130,177,214,108,246, 59,172,196, 9,147,195, 61,164, 74,232,109, 93, 12, 55,190, 37,234,246,145,205, 4, 17,
+ 41,138,108,242, 38, 35, 3, 63, 33, 87, 44, 92, 23,164, 60, 62,246, 64, 46, 65,156, 62,174,181,102,156, 71,114, 41,209,141, 83,
+ 41,122, 34,200,139,108,181,243,174, 77,249,196,169, 61,190,151, 7,201, 0, 55, 6,168, 91,136, 83,153,216, 66, 73, 28,130,214,
+198, 53,112,150,252,228,246, 41, 8,221, 85,134, 49, 42,162,117,225, 25,132, 74, 72,183, 95,168, 7,248, 83, 68,120, 33,176, 86,
+215,135,125,101,149,235,161, 90, 89,147,245,116,122,132, 45,230,245, 62,191,142,135,181,161, 1, 9,154,126, 23, 38, 63,161,150,
+104,214, 54, 4,127,176,164, 26,168, 62, 51, 37, 49,149, 2, 32, 22,184, 44,199,217, 24, 33,231,139, 49, 77, 73,127,173,186, 16,
+ 60,164, 18,127,223,171,200,195,184, 50, 10,200, 91,208, 9, 74,127, 22, 8, 20,184, 34, 92,223,101, 56, 31,140, 39,160,225, 48,
+ 58, 13,217, 0, 1,133,113,133,127, 63, 81, 32,183, 25,237,137,118, 81,140,211,165,215,157, 55, 59, 1,214,207,252,121, 36, 67,
+ 66, 28, 32,156, 65, 56,133, 80,139,148, 59,240,209,176,194, 74,255,184, 34,132, 54,201, 8,217,108,162,100,236,175,111, 21, 33,
+149,195, 73,137, 41,189,228,110,186,255,128,114,116, 76, 49,216,229,250,135,222,225,213, 12, 46, 38,146, 9,217,241, 14,227, 87,
+ 95, 32,219,223, 70,207, 83,156,168,140, 95,100,240, 86,119,245,103, 95,147, 56, 67, 15,100,150, 60,255, 43,148,200,138, 83,194,
+ 96, 20,139, 92,129,138,149,230, 25,253,174,118,168,171,174,163, 42,225,207, 4,249,217, 50,171,221, 45, 53,190, 21, 9,211,123,
+ 48, 44,252,252,157, 13,141,108,125,223,248,179,194, 4,155,218,224, 78,179, 88, 27, 4,249,156, 19,182,118,181,243,170, 30, 65,
+ 99,101,131, 34,135,246, 86,131,241,195, 49,235,143,175,112,124,247,136,181,115,109,162,120,133,230,209,103,248,206,175, 11,231,
+159,237,208, 88,203,136,100, 73, 90, 58,156, 22,136, 72,208,110,193,120, 71, 96,170, 70,195,129,206,253,181, 93,102,160,172,207,
+111,111, 68,142,251,197, 58, 13, 49,103,148,206,120,246,202,163,232, 76,161,102, 6, 84,139, 8,137,148,138,205,213, 21, 52,134,
+118,212, 34,158, 77,217, 25, 13,209, 69, 19, 71, 70, 28, 39,116,146, 51, 76,139,125,162,210, 25,186, 20,244, 86,207,112,114,184,
+207,219, 62,248, 65, 26,107,125,112,138, 47,254,198, 39, 88,219, 56,195,185, 71,187,140, 6,115,214,207,183,137, 55, 46,113, 38,
+ 73,177,191,246,113,182, 63,249,187,188, 60,204, 81,207, 92,193,116,122,136,205, 51, 20,247, 30, 96,157,166, 57,155,113,254, 51,
+159,229,189, 23,207,241,202,147,111,227, 68,103,244,215,207, 49, 60, 28, 16, 69, 49,153,206, 40,139, 28, 33, 99, 30,222,252, 50,
+ 87,222,246, 30, 30,188,246, 10,235, 23, 30,163,221,223,160, 56, 62, 36,207, 5,173,114,130, 45,225,230, 11,175,176,119,176,203,
+249,243, 49,253,173,115,116,251, 13,202,178, 75, 94, 58, 30,222,223,229,127,248, 59, 63,198, 83, 31,248,230,218, 20, 97,193, 31,
+174, 98, 25, 43, 41, 90, 35,156, 68,202,239,212,145,225, 38,143, 3,244,238, 22,208, 28, 22, 33,162,197,206,219,185, 96,167, 58,
+193, 21, 37,233,224,152,124, 58,161, 76,115,140,209, 76, 15, 15,121,226, 99,223, 27, 46,233, 12,244,212,187, 14, 36,171, 64, 28,
+ 30, 35, 11,240,127, 4,131,155,184, 47,223, 32,123,240, 0,247,220,239,209,186,126,133,253,155,247,185, 49, 51,124,234,246, 30,
+127,253,203,255,145,254, 83,239,100,254,224, 85,127, 32,199,145,159,238, 42,159,103,233, 3, 81,116, 81,224,230, 41,143,254,165,
+191, 1,255,225, 23,161,213,244, 33, 56, 81,132,104, 38, 36,205, 6, 46,245,190,198,247,238, 62,228, 53, 7,131, 89,202,230, 74,
+135, 23,178,156,189,223,253, 12, 31,200,178, 32, 27,211, 20,135, 59, 28,223,185, 31,220,184, 4, 82, 40,146, 24, 72, 11,116, 86,
+ 96,180, 65, 74,111, 38,130, 46, 22,120,176,181, 88, 93,250, 3,217,249, 28,227,232,194, 57,196,120,196,124, 52, 99, 48, 47,185,
+ 57, 79,131,206,180,196, 80,249,213,148,136,147, 33, 89,112,159,203, 71, 83,222,254,109,127,140,226, 15,254,144,219, 39, 67, 90,
+ 81, 68, 23, 69, 87,249, 27, 46, 51,150, 86,146, 48,213,154,134, 16, 60,210,238,243,242,201, 17,189,134,143, 82, 61,211,104, 83,
+ 58, 71,233, 28,177,148, 24,133,151, 32, 69,137, 63,145,226,216,127,191,145, 64, 25,133,153,158, 16, 15,246,177,107,231,248,139,
+175,188,202, 15,181, 86,120,242,226, 22,211,249,156,220, 26,114,109,216,158, 79, 97, 50,230,242,218, 38,197, 60,245, 82, 36, 33,
+ 64,101,168,102,131, 89, 62,198,148,101, 24, 8, 68, 61,100,214,198, 29,161, 40, 75, 65, 13, 39, 46, 35,231,166, 42,196,149,142,
+ 61, 68, 79, 11, 81,201,145, 93,125,240, 88, 81,249,185, 7, 35,157,144,195, 46,171, 29,122,216,133,219, 55,193,242, 34,172, 2,
+164, 12,100, 50,227, 95, 79, 57, 63,198,217, 18, 19,252,231,121,211,107,113, 70, 83,142,247,188,243,154,209,139,130, 30,194,131,
+252,196,164, 79, 53,192, 44, 65,249, 42, 90, 16,170,108, 62, 11,172, 99,129, 16, 17,136, 38, 48,175,247,153, 34,200,162,194,229,
+180,208,237, 87,178,191,208,184,212,125,247,146, 99, 94, 64,114,253, 96,159, 79,113, 54,171,173,109, 43,215,182, 96, 80, 31, 20,
+ 44,118, 65, 98, 80,106,137, 37,223, 8,127, 15, 68, 62, 99, 60, 33,171,242,120,168, 44,117,147, 38,182, 24, 47, 30,190,244,193,
+ 74, 86, 91,132, 43, 3, 42,163,124, 47,145, 77,188, 1, 76, 8,187,145,194,251, 61,136,184, 21,210,231,132, 71,201, 66,210,161,
+ 80,194, 55,101,194,235,204,177, 2, 25, 69, 97, 37,144,212,104,128,140, 61, 4, 47,100,228, 97,229, 56,241,234, 20, 7,229,100,
+ 72, 62, 30, 49, 63,216, 6,151,114,225,202, 58, 43,151,175,250,166,178,185,142,166,160, 24,166, 76,111,252, 39,202,169,241,205,
+ 84,133, 84, 84,234,138, 37,104,154,165, 41,187,190,122,237, 50,241,145, 58,202,119,153, 91,178,140,228,171,138,253, 30,184, 31,
+181,121,141, 91,106,210,170,137,188, 62,119,171, 2, 29, 26,225,165, 72, 97, 28,167,118,242, 81, 80, 85, 84,215,158, 91,206,164,
+180,167,165,107, 24, 87,251, 44, 32, 93,205, 93,145, 42, 66, 24, 77,163,219, 98,180,125,130,146,138,193,173, 33, 70,231, 28,189,
+242, 26, 78, 23,232,179, 63,204,123,187,223,143,222,209, 8, 17, 97,202, 6, 91, 87,114,134, 47, 24,162,196,231, 49,228,218,175,
+181,179, 19, 40,123, 14, 81, 64,158, 11, 82, 45,136,157,192,150,146,182, 42, 57, 22,231,249,173,217, 55,240,150,205, 13, 30,140,
+ 15,233,175,182,184,123,103, 64,183,223,165, 52, 26,155, 43,114,230,156,187,250, 8,119,182,111,178,126,225, 26,249,109, 80,170,
+ 69,167,145, 48,205, 10,230,122,204,172, 60,102,179,251, 24,209,165,107, 79,176,254,232,117,246,111,191,129, 83, 13,238,190,242,
+ 26,207,124,240,171,216,191,247,144,115, 23,183,184,254, 71, 62,200, 43,207,253, 14,105,156,242,246,198, 25,242,231,126,129, 87,
+ 95,122,133,131,169,165,247,141,223,200,133,175,248, 26,202, 50, 34, 61,222,165,211,105, 48, 60, 60, 96,125,107,141,233,164,160,
+113,245, 49, 62,243, 59,159,228,209, 95,249,127,137,174, 60, 73,244, 61,223,204,237,223,253, 52, 73, 75,146, 52,219,228,101,193,
+252,232, 33, 81,179,199,157, 63,252, 2,231,174, 61, 73, 49, 31,241,240,230, 45, 54, 46,158,167,209,233,115,114,112, 68,145, 69,
+ 88, 89, 82, 72,197,104, 92, 82,202,125, 86, 86,206,177,121,118,133,223,255,189, 63,228,111,254,228,143,243,182,175,251,246, 83,
+144,187,171,152,217,149,123,148, 41,194,132, 94, 65,109, 69,229,242, 81,121, 21,134,130,174,170,203,227,212,132,238,170,223, 41,
+ 51,108,154, 83,206,199,228,163, 17,217,108,134,206,114,198,187,251, 60,245,157,127,124, 81,208,203, 33,228, 25,196,141,176,223,
+140, 60, 20, 47,138, 64,137, 29,195,141,215, 41,140,163,252,233,159,167,245,228,101,238,127,233, 85, 94, 59,153,115,251,246, 46,
+255,235,240, 54, 81,156,144,239, 63, 88, 16,115, 2,132, 36,157,195, 10,137,147,193, 15, 59,116,130,163, 89, 78,171,215,171,209,
+ 75,233, 28,104, 11,145,103,229, 22,179,148,247,255,249, 31,224, 3,127,235,135, 25,126,249, 5,254,175,255,241,175,113, 51,181,
+ 28, 25,195,224,179,159, 37,186,116, 9,138, 49,195,253, 61,140, 46, 72,154,109,172, 61, 65, 38, 13, 34,229,176, 69,134, 41,116,
+ 40,220,213,231,170,161,212, 16, 71, 62, 47, 59,176,159,227,181, 30,174,116,180,214,123, 76,239, 60, 96,102, 44,115, 99,120,180,
+ 21, 99,157, 36,213,154,150,148,104, 7, 67,109,112,113,196, 74,156,176,159,102, 92,217, 88,225,165, 95,249, 13,146, 94,139,110,
+ 20, 49,214,150, 92, 57, 70,218,223,244,165,181, 52, 10,131,116, 18,148, 34, 66,208, 79, 18, 86, 26, 93,134,217,148,161,206, 73,
+173,245, 70, 45, 22,222,253, 77,239, 69, 31, 15, 80, 91, 21,252,106,125,252,104,168,188,214,148,184,135, 15, 16, 27,231,136,154,
+ 45,254,202, 39,254, 13,127,231,155,190,151,235,171, 29,214, 58, 29, 86,218,109,134,217, 12, 1,236,165, 83, 54, 7, 59,196,113,
+ 76,103,243, 28,178,209,160,177,190,193,151, 95,252, 77, 63,181, 85,192,248,178,189,230, 18, 78,236, 76,181,184,115, 11, 61,119,
+ 48,119, 89,252,140, 11,123,210,255, 44,109, 21,107,189,143,181,179, 14, 25,203,122,130, 17,203, 58,246,112,216,185,101,131,152,
+ 42,199, 71, 56,140, 94,154,128, 36, 20,243, 17, 74,152,224,209,190, 48,225, 48, 1, 10,117,214,161,167, 3,239,113, 45,150, 14,
+108, 83, 89,225, 46,217,193, 46, 75,245,170, 44, 14,107,130,115,218, 34,208, 67, 32, 72, 86,175, 16,119,206,145, 29,126, 9,167,
+103,117,250,156,172, 28,233,196,194,181, 78,212,112,237, 2,137,168, 10,189, 13,174, 58,145,148,245,122,193,215,106,189,208, 21,
+214,112,186,215,123,123, 40, 61, 15, 59,244, 42, 10, 76,159, 86, 44, 4, 36,207,185,210,103,173, 7, 85,140,168,173,128, 13, 34,
+ 86,200, 82, 98,101, 28,144,192, 48, 89, 91,227,139, 71,236,139,135,138,171,253,120,112,190,179, 37, 50, 94, 4,185, 0, 72,171,
+125,166, 65, 21,227,171, 2, 82, 24,156,230,164,140,252, 36, 30, 71,254,186,137, 98, 47,101, 85, 73,237,238, 38,156,192,169, 24,
+178,140,124, 52,100,124,255, 54,229,244,132,134, 40, 56,251,236, 51,158, 29, 31,175,160, 26, 17,227,123,251,228,123, 15,209,243,
+130,226,104,175, 78,210,115,213,117,235, 76, 8,147,113,117,146, 90,125, 29,134,244,192, 40, 92,203, 53,209,210,248,162, 91, 41,
+ 29, 85,197, 73, 10,176,188,177,118,201,133,206, 45,174,123,170, 70,216,157,138, 6,172,224,118, 92,152,202,151,236, 16, 22,222,
+ 67, 11,248, 93, 27, 91,255,127, 17,248,144, 98,201, 82,182,234,170,189, 82, 35, 40, 26,196, 34, 89,144,192,236,183,121, 6,133,
+ 37,105, 52, 49,197,140,184,189, 66,147, 38,197,124, 74, 57,154,179,254,244, 87,208,254, 98, 7,189,215,195,150, 57,236, 27,122,
+ 61, 69,220, 48,152,202, 97, 81,251, 41,189,204, 2, 49,213, 9,138,212, 81,196,146, 21, 97,152,202,132,159,207,190,149,121,126,
+137,149,104,155, 94,167,141, 24,245, 25, 28,204, 17,141,146,102,175,197,228,160,164,223,145,152,163,146, 7,183, 14, 72, 75, 56,
+112, 3,134,147,130, 86,220,166,112, 26, 21, 9,122,226, 44,163, 50, 71, 88,131,204,115,199, 23, 62,241, 9,110,124,230, 51, 76,
+ 14,118, 16,162, 96,188,115, 15,231, 36,103,175, 63,195,254,221,135, 60,245,177,143,240,149, 77,203,171,255,240, 31,242, 7,251,
+ 19,220,135,191,149,179, 63,240,231,217,122,215, 7,153, 31, 30, 51,188,247, 42, 78,151, 20,165, 37,138, 91, 88,217, 4, 25, 49,
+220,222,102,229,226, 85,142,254,252, 95, 38,251,210, 23,225,183, 62,133,232,173,145,207, 14, 17, 81,140, 53,138,246,202, 22, 73,
+179,197,206,253, 61, 76, 62,197,148, 26, 21, 21, 28, 61,188,237,153,162,113,204,206,253,187,158, 41, 42, 21,187,131, 41,206, 26,
+166,179, 57,247,239,220,227,175,255,196, 63, 56, 85,208,235,189, 90,237,250,107, 66,225,142,253,127,213,212,238, 22, 68, 30,170,
+124, 99, 89,217,169,198, 75,251,185,165,130,174, 51,138,195, 61,102,135,123, 12,183,183,153, 15,135,216,162,100, 62, 25,179,245,
+246,119, 18, 53, 90, 30,114, 47,134, 48, 29, 67, 81, 4, 19,133, 70,176,148,157, 46,158,243,222, 13,116,102,152,255,244, 79,211,
+184,116,142,193,107,247,184, 59, 76,121,120,123,151,255,110,116,151, 40, 73, 48,243,153,159, 32, 2, 91,155, 40, 70, 68, 18, 39,
+131,195,221, 18, 14,170,243, 18, 61, 56, 98,250,228,123,144,211, 9, 78,151,120,106,159,243,110, 99, 97,129, 85, 74,199,116,127,
+143,185,106,243, 87,127,229, 23,121,186, 37,152,118, 59,252,189, 31,253, 9,214, 46, 61, 10,186,192, 26, 71,103,125,213,103, 64,
+231, 37,173,254, 10, 82, 79,177, 89, 73, 89, 20,148,185,198,164, 57,170,213,129, 60, 95, 72,218,132,223,249,137,102, 3,217,235,
+163,250, 61,244, 96,196, 78,154,241,198,112,198,217, 78,194, 73,110, 56,201, 11,134,165,225, 97, 81,114,172, 53, 7, 90,179,175,
+ 45,163, 60, 39,199,241, 70,154,113,229,169,199,200,157, 99, 98, 44, 78, 64,110, 29,169,117,204,140, 69, 59,193,106,220,224,106,
+183,207,149,238, 26,119,230, 83,218, 42, 38,211,154,113, 81, 50, 42, 75, 86,163,132,110,146,144, 22, 5,107, 23,207, 98,103, 41,
+ 20,165,135,220,195,212, 43, 2,156, 27, 69,138,114,251, 30,236,111, 3,240,216, 31,251, 14,254,233,209, 3,222,247,109,223, 68,
+223, 56,218,165, 37,154,149,184,113, 70,156, 90,116,225, 16,153, 65, 21,150, 70,183, 3,243,130,243,127,238, 47,122,201, 92,181,
+ 23,117, 75,218,219,170,160, 90,183, 32,245, 84,225, 17,225,132,172, 6,164,138,180,179,144,143, 45, 14,217, 26, 68, 90, 98,182,
+ 87,174, 95,206, 45,195,148,139, 6, 65, 4, 75, 90,177,228,209, 45, 68, 21,221, 89,101,192,155, 48, 25,157,246,112,168, 38,127,
+ 63, 57,229,161, 88,185,165, 44,117,175, 93,183,122,241,252, 53, 81,174,154,188,148, 96,177, 0, 93,138,104, 21, 2, 91,102, 20,
+179,135, 88,147, 5,151,178, 5,172, 47,165, 92, 50, 41, 9,166, 38,132,105, 95,219,186,105,112, 97,167, 90,229,216, 99, 12, 14,
+139, 30,222,247, 38, 38,182,130,210, 61,193,172,142,235,115, 58,164,178,121,207,119,191, 7,177, 11,202,180, 11, 77,129, 13, 76,
+232, 64,128, 18,213,148,143,171,247,243, 54,188, 24, 83,204,195,227,134,247,173, 68, 77,188, 21, 81,236, 7, 11,103,131, 10, 64,
+ 34, 85, 99,209,185,201,168,230, 33, 84, 48, 58, 72, 68,220,244,197, 59, 10, 25,235,177, 87,225, 40, 21,123, 59, 88, 21,251,239,
+ 82,121,120,222,225,124,240, 71,153,162,103, 51,230,131, 3,210,147, 67, 54, 46,109,210, 62,115, 14, 23,121,147,165,217,241, 33,
+243,219, 55,153,220,124,145,242,228,152,114, 60,193,230,153,191, 76,173, 91,242,106,115,181, 77,176,245,195, 60,165,117,104,187,
+200,181,215, 14,202, 80, 76,171, 72,225, 16,219,224, 77, 86, 74,187,152,154, 43, 55, 68, 23,108,147,195,189, 96, 43, 20,164, 34,
+188, 73, 78,121,196,187,165,101,126,229,117, 96,157, 55,137,178, 46,252, 23,158, 88, 84,247,151, 89,250,123,136, 62,174,238, 35,
+ 83, 25,217,132,235,198, 45,201, 64,133,115,216, 60, 69, 8, 75,212,108, 49, 61,153, 34, 98,139, 41,189,226,163,187,185,193,209,
+253, 67,210,254,117,138, 61,135, 62, 82,148, 99,139,217,139,104, 70, 18, 51, 17,216, 20,204, 56,132, 17, 42, 71,150, 57,138,194,
+ 97, 21, 36,218,242,235,246, 3,252,204,236, 59,176,162,164,231,246,184,212,123,140, 89,225,249, 58,211, 60,197, 24,195,254,158,
+ 65, 27, 9,165,247, 33, 24, 14, 51,166, 19,205,254, 65,138,138,161, 21, 75,110, 28,190,196,195,201, 29, 70,122,202,133,238, 89,
+ 82, 61, 34,154, 14,142, 56,119, 97,131, 71, 63,250,205,152,116,226, 13, 73, 38, 99,242,163,251,236,140,199,188,229, 43,159, 97,
+246,179, 63,206,239,254,246, 23, 89,249,214,111, 33,215,150,220, 20,216,189, 59,176,118,201, 67,145,214,144,143, 7,204,142,119,
+233,172,175,177,251,198,235, 12,119,239,179,126,238, 12,142, 24,179, 95,146,254,233,239,101,246,119,255, 41,238, 47,252, 0,101,
+233,176,165, 38, 73,154, 62,143,216, 10,206, 94,186,204,157, 23, 95,224,194,147,207, 18,119, 26, 28,223,124,200,163,207,172, 48,
+ 25,231,164, 69, 70,170, 61,203,252,120, 92,112,165,212,108, 31, 30,113,237,233,183,241,206,175,255, 78,156, 43, 16, 34, 57,253,
+229,139,210, 51,179,133,162, 22,132, 58,177,216,153, 85, 84, 93, 91,165, 67, 68, 32, 34,196, 41,233, 75,245, 39,135,116, 74,113,
+ 50, 32,155, 76, 40,103, 25,174,208,100,227, 49,243,188, 96, 54, 56,225,169,111,249,227,158, 76,147, 30,194,201,145,127,220, 78,
+ 27,162, 38, 2,133, 51, 71,190,248, 37, 61, 24,110,227,238, 60, 36,189,255,144,228,228,132,172,209,224, 15, 31, 28,240,198,253,
+ 67,254,196, 75,191, 67,210,106,163,167,147, 5,110, 36, 36, 82,200, 96,212,228,189,146,173,211,254,159,140,163,217,237,208, 72,
+ 34,244,172,205,254,116,198, 90,184,249, 85, 98,136,227,188,150,193,171, 56, 70,117,187,232,241,148, 86,191,199,235,183,238,242,
+183,255,253,207,242,125, 31,250, 94,110, 76, 44,131,135,247, 88,123,252,154,247, 53,207, 11,134,249, 1, 18,104,118, 87,136,220,
+ 14, 38, 43, 40,231, 5,198,106,132, 41,144,205, 38, 20, 33,161, 77,137, 5,251,182,219,242,198, 29, 77, 69,212,110,112,245,220,
+ 58,147,135, 71,124,234,112,124,202,148,101, 25,118,211, 97, 74,107, 4,206,192,157,251, 59,196, 81, 68,137, 35, 15,185,226, 74,
+ 10, 46,198, 77,180,133, 39,251,155, 28,101, 51, 30, 76,134,204, 49, 52,149,162,163, 18,154, 81,132,212,154,189,188,160, 27, 41,
+ 30,187,118, 30,185,178,234, 15,218, 72,249,168, 76, 25, 33,172,241,121,226,218, 32,210,194,195,142,111,220,192, 53, 18, 88,221,
+ 34, 94, 63,195, 87,255,204, 47,224,246,246, 96,120,130,213,101, 96,107,135, 9, 41,137,188, 0, 53, 78,176,206,177,213,237,157,
+214,203,214,210,111,199, 82,234, 69,125,176,185, 55,193,239, 34, 16,133,234,157,119, 40,196,146,101,159, 23,183,208,146, 59,177,
+ 20,238,178, 84,208,101,216, 87,214, 10,141, 69,241,173,246,148, 66, 46, 69,105, 86, 63, 90,113, 80,224,148,118, 93, 10,150,246,
+141, 11,159, 17,177,212,180,136, 72, 44,189, 7,111, 3, 90,219,120, 7, 89, 18,129,229, 46,234,180, 56,131,158, 62, 12,108,110,
+183,240,248,182,224,162,197, 69, 82,155,240, 24, 91, 39,122, 85,169,109,213,155,151,145,168,173, 71,145, 18, 21, 26, 94, 87, 69,
+173,170,224,247, 94,145,238,170, 47, 71,186,176,134, 51, 11,200,164,134,117,151, 36,173, 38,156, 17,200,154, 14,230,172, 9, 89,
+240, 30,249,177, 70,163,148,194,226,157,222,164,140, 48, 69,225, 93,241,150,209, 62, 23, 54,205, 81, 28, 32,238,200, 55, 44,198,
+248,181, 80, 80,128, 8, 21,123,227, 24, 41,145, 66, 5,232, 93, 32,226, 24,169,188,107,156,138,226,176, 67,151,254,123, 87,177,
+ 47,144,133,166,152,140,201,198, 3,138,233,132,200,229,180,250, 43,136, 56,193,210, 66,207,198, 76,111,190,196,252,246, 29,242,
+221,123,148,211, 25,198, 58, 92, 94,134,107,204, 83, 39,117,224,124, 88,231,208,222,125,130,200,128, 97, 97, 68,148,227,136,131,
+198, 60, 51,126,116, 81,161,105,118, 54, 0,120,206,219, 27, 83,179,221,253, 4, 91, 27,208,212,158, 13, 11,210,114, 69,130,171,
+214, 54, 98,121,183,238, 22,236,247,106, 5, 83,223,111,102, 49,145,187, 37,102,124,245,249, 87, 54,180,111,246, 89,168,155,230,
+ 74,138, 23, 9,202,116, 68,210,117, 36,205, 30,182,144,180,207,173, 32,163,136,131,123,187,204, 70, 95,226,222,234,159,230,202,
+244, 31,211,109,207, 73,167,138, 50,135,142,141, 56,153, 25,116,100, 60, 63, 33, 5,237,252,103, 41,173, 64, 72,203,111,159,249,
+ 17, 46,232,148,193,254,171, 92,232, 93,227,100, 54,231, 36,155,178,213,238, 34,109,196,246,104,159,102,210,102,163,233, 61, 80,
+ 84,226,144, 22,218,205, 38, 77, 90,200,100,204,209,120,128, 18, 9,177,106,146,235, 57,171,205,156, 76,107,148,108, 32,147,102,
+131, 52, 53,220,121,225,121,222,120,241, 85,238,191,250, 26,123,119, 31,144,166, 37,111,253,240,123, 56,248,223,254, 6, 47,127,
+233, 53, 58, 31,253,102,102, 81, 11,155,206,201, 78,118,232,174,156,225,232,254, 13,156, 43,152, 13, 15,152, 79, 14, 88,189,112,
+ 9,169,154,148, 90,211, 93,221, 4, 23, 81,228,115,230,179, 41,114,255,144,213,159,248, 81,230,255,228,103,105, 94,184, 70, 62,
+159,130,181,140, 7, 7,168, 40, 97,227,252, 25,186,155,107,140,142, 15, 72, 84,139,254,217,117, 70,251,123, 56, 96,109,173, 67,
+ 44, 12,115,157,179,218,111, 32, 68, 76,123,101,149,191,244, 79,126, 14,107,211, 37,169, 88,229, 6,164,125, 65,175,181, 66,225,
+104, 20,122, 41,120,164,172,195, 3, 60,254, 18, 5,136,220, 45,177, 45, 45,206,206,160,152,163,231,115,242,241,132,114, 54,103,
+126,114,204,244,100, 72, 94,148,204, 15, 15,121,215, 31,255, 51,254,177,230,187,176,183, 7,243,212,119,232, 73, 12,244,112,118,
+ 2, 69, 26,240,160, 28,182,239,147,151, 80,254,210, 47, 67,191,199,203, 95,190,199, 40,203,120,255,223,252,115,172,190,245, 43,
+209,243,233, 2,116, 13,204, 98, 91,225, 72, 21, 68, 21,188,151, 91,171, 43,188,248,220,115,124,245, 71,254, 18, 95,251, 93,255,
+ 19,179,193, 9,244, 86,113,210,161,164, 34, 78, 34,175, 21, 77, 98, 84,156, 96,180,195, 88, 31,123,185,178,210,229,249,219, 67,
+126,232,219,222, 71,137,224,227,255,226, 95,163, 58,125, 84,148,160,117,137, 46, 75,162, 86, 15,213,106, 64, 49,195,100, 37,233,
+120, 78, 49,247,118,178, 34,105,122, 52, 66,235,133, 91,172, 84,200, 86,203,147, 65,210,156,168,239, 37,131, 23, 90, 13,122,177,
+242, 61,212, 18,196, 40, 68,165, 13, 16, 20,118,161,123, 86, 81, 84, 45, 80,124,207, 16,138,213, 73, 89, 48,178, 57,191,127,176,
+205, 75,163, 1,251, 58,231,184, 44, 56,202,114,146,176,131, 44,177, 88, 9,145,118,188,235,123,190, 5, 45, 21,162,223, 71, 8,
+ 79, 44,242, 46, 89, 6, 49,155, 35,210,153,159, 10,138, 2, 59, 25,193,246, 61, 24, 28,122, 95,122,103,224,236, 89, 56,119, 6,
+217,111, 19,157, 59,131, 58,179,137,220, 88,133,126, 31, 26, 13,232,118,145, 43,171,168,102,155,111,248,131,111,242,237,196, 0,
+ 0, 32, 0, 73, 68, 65, 84, 33,155,239,251,112, 96,250,138, 37,237,197,178, 4,200,249, 3,116,217, 44, 99,121,106, 95,134,205,
+ 43,121,142,228,212,142,218, 46, 77, 34,203,116,221,186,248,202, 37,153,206,114, 7,181,120, 9,117,225, 22,203,108,120, 81, 41,
+ 56,151, 80,170,165,223,115,246,180, 73, 88,253,218,173,245,211,141, 91,144,142,107,157,156, 76,144,255, 63, 93,111, 30, 37, 89,
+118,215,119,126,238,189,239,189,216, 51,114,173,172,234,170,234,234, 77,106,169,105,181, 22,104, 75, 72, 72, 66,128, 5, 6,219,
+224, 1, 45, 72, 24,121, 60,172,246, 0,182,135,193,216,230, 48, 11, 94,176,199, 11, 54, 48,246, 88,216, 99,123, 12,104,192, 30,
+140,125, 96, 0, 33, 22,129, 16, 13,162, 37,181,122,175,174, 53, 43, 43,247,216,227,173,119,153, 63,238,125, 17, 81, 61,166,207,
+233,211, 75,101, 85, 84,101,188,184,247,183,124,191,159,111, 99,109, 49,178,240,227,212, 37,114,207, 89,235,119,155,245,239, 33,
+ 48,205, 23, 65, 48,178, 78,129, 99,177,222,169,187, 53,161,150,220, 61, 23, 38, 1, 98, 33,206,115,216,217,204, 23,235,193,234,
+134, 82,139,156,248, 69,155, 86, 7,115, 47,140,206, 53,236,101,121, 62,184, 69, 82, 72,232,212,173,198,133,243, 99,233,173, 87,
+161,115, 14,197, 80, 28,213,187,135, 16, 33,106,254, 43,205,130,197, 86, 19, 31,169,170,181, 95, 81, 72,225, 11,227,184,225,153,
+237,210, 51, 31, 68, 32,197,169, 40,241, 63,150, 52, 17, 42, 66, 68, 13,144, 49, 66,198, 33, 29,205, 97,116,201,236,238, 30,211,
+187,183,145,213,140, 86, 2, 81,183,227,135, 22,105,202,240,217,223, 39,125,229, 11,164, 55,159, 65,159, 29, 97, 42,131,115, 2,
+227,108,208, 13,121,175,120,169,125, 71,174, 29, 84,193, 21,154, 89, 71,110, 44,153,131,153,241,248,216,153, 49,140, 52, 76,181,
+ 35, 55,190, 56,205, 42, 71,105,253, 25,229,132,160, 48, 33,139,209,201,133,162,221,217,208, 93,215, 22,182,176,186, 16,225,124,
+ 19,193, 62,103, 3,111,222, 90,135,113,206,115, 14,194,103, 64,155, 21,116,109, 93, 40,175, 6, 2,185,165, 47,125, 1, 51, 10,
+239,167, 93,164, 25, 46, 3, 94,252,151,249,103,232,228,133, 87,152, 29, 77,112, 34,166,187,211,161, 42, 11,102,147, 1,219, 15,
+ 94, 64, 79, 83,102,233, 69, 94,236,253,115,126,254,185,239, 34, 31,119,104,152,130, 68,196,180,144, 20,195,136,116,232,161, 51,
+ 14, 40,140, 36,146,134, 95,144,223, 74,115,126,157, 52, 45, 56,215,189,140,209,130, 78,187, 75,171,211,224,206,224,140,145,153,
+210, 80, 13,154,162, 69,183, 39, 25,100, 99, 78,134, 99, 54,122,231,124,200, 13,142,193, 36,103, 82,140, 24, 22, 35, 98,169, 72,
+162, 22,115, 93, 81,153,146,194,102,200,108, 50, 67, 74,152, 13,142,153, 28,239,115,238,210,121,154,173, 54, 79,252,233,175,228,
+248,123,190,139,253, 70,151,249,229,215, 51, 23, 5,170, 42,184,240,192, 21,186, 59, 15,145,229,154,249,228,152, 70,187,205,100,
+ 56, 97,118, 54, 97,255,217, 79, 34,147, 22,107, 27,155,172,157,219, 69, 91, 75, 20,197,244, 54,183,233,108,159,103,120, 60, 97,
+253,235,223,206,244,149,151,176,182, 66, 59,139,206, 11,210,201, 8, 21, 9, 58,253, 11, 8, 17,115,188,119,155,254,230, 54, 85,
+ 41,176,101, 73,187,155,112,249,202,101, 30, 58,183, 69,167,221, 97, 56,154,241,247,126,225,183,125,154,142, 32,248,190, 87, 78,
+ 46, 91, 45,241,149, 50,136,162,156, 89, 98,140,116,232, 46,117, 16,202, 41,229,211,208, 22,135, 91, 77,122,203,124,112, 75,158,
+ 81,140,134, 20, 89,202,124, 48, 66, 27,139, 54,154, 50, 77,233, 93,126,128, 70,103, 13,167, 15,225,246,109, 63,118,215,149, 31,
+187,199, 1,106, 81,141,234, 86, 25, 6,119,177,251, 71,100, 55,110, 16,151, 37,119,174,221,225, 8, 56, 43, 43,222,252,119,126,
+ 18, 61,217, 91,185, 10, 22,143,120, 16,162,185,133, 15,185, 70, 40,166, 39, 71,124,203,255,244,179,188,227, 29,239,229,253, 95,
+247, 97,222,254,237,127, 23,217,235,226,170,202,163, 34,163,216, 83,168,156,247,243,175,111,111,176,185,185, 73,187,215, 71,107,
+139, 46, 50, 30,122,255, 55,211,199,241,107,159,123, 14, 98, 69,149,165,139,244,171, 40,110,121, 26, 95,145, 98,117,201,104, 56,
+ 69,151, 94,131,110,198, 3,116, 16,199, 17, 70,157,178,209,196,197, 49,214, 25,156, 46, 97,125,147,217,217,132,212,216,197,200,
+ 77, 59,139,113,222, 36, 84,177,224, 71,160,195, 30,215,214,106,113,159,168, 78,163, 78, 88, 66,144, 58,139, 14,190, 2, 33, 4,
+ 70, 56, 26, 82,209, 75, 98, 42,107,209, 66,114, 50,159,115,174,211,226, 27,255,183,191, 78,213,136,137,250,235, 68,253, 13,228,
+122,215, 95, 16,217, 12,178, 20, 97, 28, 66,123,176,136,108, 68, 94,252,166, 20, 20, 51, 24,159, 66, 58,129,217,153,143,123,189,
+255, 17,216,217,133,254, 58,116,187,208,108,222, 51, 86,174, 73, 88, 95,242,147,255, 33, 92, 30, 43,221,195, 61,166,222,101, 72,
+133, 91, 90,127, 23,113,169, 43, 32,212, 37, 96,198, 44,213,191,222,114, 38,238,217, 45,215, 60,108, 27,118,201,190,203, 95,130,
+105,220,202, 11,249,213, 67,144, 67,132,200,209,186, 59,175,147,173, 22, 95, 47, 91, 72, 17,175,208,191,220,171,126,159, 43,222,
+229,250, 64,174,151,174,198,119,191, 73,239, 2,113,239, 60, 46, 92,164,181,103,216, 11,255,150,234,118, 81,143,109,130, 58,206,
+ 89,235,213,244,206,135, 7, 57,233,150,118,105, 89,179,191,221,114,173, 33,237, 61,138, 41,151, 79,188, 40, 79, 36,203, 66,190,
+ 30, 21, 44, 61,112,161,138,176, 43, 70,253, 32,124,112,225, 89,168, 75,203,197,239, 13,255, 92,219, 16, 22, 35,213, 10, 80, 42,
+200,185, 84,248,181,149,100, 69,121,232, 39, 69,216, 96,237,242,147, 9, 81, 39,149,169, 16,203, 41,149,199,190,170, 8,169, 66,
+218, 90,236,121, 15,170,209,242,209,170,113,130,140,252, 88,222, 23,102, 14,153, 52,125,103,170, 13,122, 54,103,122,116,151, 98,
+116, 68,171,225,216,121,232, 50, 81, 18, 97,116,196,228,250, 51, 76,127,247,183, 72,175, 94,167, 56, 58,161, 74, 51,180,214, 94,
+ 31, 96,125,129,141,133,204, 56,180,129,202, 89,114, 39, 40,181, 35,119, 48, 46, 44,163, 82,144,250, 33, 23,103,133,101,160, 35,
+230,218, 39,213, 74,231, 24,229,134,212, 90, 52,160,141, 99, 86, 90, 74, 43,168,140, 69, 56, 67,165,125,204,242, 98,228,237,238,
+205, 66,192,248,149,161,199, 75, 4, 5,123,229, 22,105,135,216,149,245,149, 91,137,231,168,137,222,193,223,142, 93, 89,117,213,
+ 63, 47, 4, 27,213,150, 58,159,107,224,252, 57, 22,124,242, 14,137,209, 16, 87, 16,199,130,181, 11, 93,170, 50, 99,116,109, 64,
+146, 52, 40,166,115, 26,155,231,201, 38, 99,154,106, 78, 71, 74,126,121,240, 67,252,206,254, 59,233,183,115,154,145,162,165, 36,
+177,147,100, 90, 98,157,163, 43, 43,126,197,189,143,158,201, 25, 78,115, 14, 50, 79, 84, 93,235, 53,144,192,124, 58,163,172, 50,
+250,170,131, 16,146, 97,126,202,209,208, 7, 95, 13,203, 51,110, 14,175, 17,183, 45, 81, 35,103, 61,217, 33, 51, 37,218, 85, 68,
+170, 65, 67, 53, 40,203,148, 65, 53,164, 23,109, 17,201, 40, 38,157,150,116,155,130,164,177, 1, 68,180,238,219, 70,125,226, 23,
+ 56,185,120,145,193, 76,240,150,111,122, 31,179,227, 99, 78, 14,238,112,124,247,128, 40,150,168,164,143,214, 17,101,122,194,229,
+ 71,223, 68, 58, 59, 69,207, 15,200, 38,199, 56, 39,152, 15,207,152,143, 79,112,186, 64, 53,123,180, 90, 45,140,145,240,240,235,
+ 72, 38, 39,148,198,210, 74, 34, 82, 33,169,170,156,227, 59, 55,217,185,255, 81,210,193, 85,122,231, 47, 50, 60, 58, 36,238,118,
+184,254,252, 13,156, 48,108,239,236,240,123,207,222, 97,255,112,159, 79,223, 61, 9,159,201,114, 65,102, 91, 50,221,115,127, 89,
+ 71,201,146, 61,185, 24,213,213, 59, 65,185, 28,199, 69, 75,124,228,226,160,196,128,205,112,197, 28,167, 13,243,131, 3,178,209,
+144,114,158,146,167,115,102,195, 49,218, 88,198, 39, 39,188,247, 91,190, 3,231, 70,176,119,155,242,244,152,168,211,241, 85,186,
+ 16,144,172,129, 29,251, 79,138, 12,246,149,189,219,148,165, 65,255,250,199,145, 73,204,254,112,198,254,157, 19,190,237,214,139,
+216,236,208, 95,252,149,246, 73, 65,118, 5, 34,142,103, 76,251, 7,212,248, 17, 81,172,248,220,167, 62, 71,178,213, 99,167,183,
+207, 63,250, 55,255,132,191,248,190,191,192,207,253,210, 39,249,240, 87,191,131, 60, 77,137, 34,229, 43,197,188, 32,105,183,120,
+211,123, 62, 64,236, 26,124,237,155, 46,243, 3,127,243,123, 41,175,221,100,214, 59, 71,188,209,229,214,254, 25,122, 58,163,156,
+142, 65, 91,180,174,144,194,231, 50,187,116,142, 78,115,210, 73,138,164, 98,243,220, 54, 78,231,126,127, 7, 8,163, 49, 54,120,
+193,133,196, 26, 48,243, 12,241,200,253, 76,178,140,125, 3,153, 3, 77, 64, 71, 90,238,217,117,173, 30,141, 46, 28,168,149,214,
+139,145,180, 14, 51,178,134,144,232, 32, 90,110,202,152,150,148, 16, 43,186, 81,194,104, 58,103,110, 45, 31,248,240, 55,240,200,
+ 87,124, 57,217,224,148,168,217, 36,238,118,161,221, 66,198, 13, 95,112, 69,145, 95, 27, 56,139,104, 37,190, 27, 82,254,240,164,
+202,160, 12, 8,224, 60,245,207,202,100,128,171, 12,244,214,161,179,238,163,107,165,128, 42, 95, 90,100, 16, 94, 8,133,227,161,
+143,124, 47,215,254,245,143, 45, 81,154, 11,192, 76,189,196, 91,250,114,107,134,110,221,217,215, 98, 54,108,216,103,202, 90,231,
+ 85, 91,204,194, 35, 17,116,138, 94, 30,237, 22, 35,239,122,108,191, 8,115,177, 75,184,199, 98,151, 29, 88,219, 50,144,186,144,
+ 75,116,113,221, 5,251,164, 55,139, 53,101, 40, 20,150,247,160,170,253,188,171, 25, 10, 74, 44,212,231, 70, 59, 84,228, 95,212,
+148, 83,116,122,138,208, 85,240, 90, 47,119,231,206, 2, 81,195,167,104,185,124,197, 10, 96,131, 8, 80,172, 68,121,174,120,137,
+ 87,192, 57, 78,248, 46, 79, 70, 50,176,227,125,177,203,112,184, 68,196,214,137, 47,194, 6,229, 90, 30, 46,251, 87, 45, 83,169,
+131, 95,130, 66,126,209,185,135, 51, 68,151,158, 70,104,204,194,130,230,172,246, 98, 55,235, 47,250, 69, 71,238,252,196,193,217,
+202,211, 42, 77,137,160, 25,146, 9, 45, 18,231, 51, 0,162, 40, 4,150,196,200, 72, 98,141,244,190,245, 40,246, 83, 6, 25,194,
+ 69,164, 31,187, 35, 37, 50,110, 46,118, 46, 34,124,222,106,237,133, 46, 50,138,201, 25, 39, 47, 60, 67, 54, 60,230,202,123,191,
+148,245, 7, 46, 99,136, 81, 89,206,217,111,254, 58,233,221, 67, 42, 43, 48,165,166,168, 12, 6, 71, 4,164,198, 63,115, 26,239,
+ 28,201, 67, 23,108,156,163,114,130, 76,107,166, 70, 18,227,104, 57,199,160,242,160,160, 68, 58, 26,194,161,132, 99,162, 29,218,
+ 65, 59, 86, 72,231, 72,129, 36,146,180,140,246,207,180,132, 56, 76,114,106, 0, 82,141, 64, 86, 11,221, 66,248,118, 91,139, 18,
+ 98,225, 2,113,206, 46,179, 98,220,210, 9, 97,141, 11,104,124,183,120,254,234,134,221,216,101, 84,172, 39,200, 89,191,158,145,
+ 75, 7, 7, 43,209,189,117, 2,157, 0,230, 7,175,208,126,243, 59, 57,189, 53, 32,150, 29,218,235,125,162,110,204,252,100,196,
+133,203,151, 41,244,140,195,235,123,184,246, 38,151,214,166,220,189,246,165,252,235,171,175,225,235,207,253, 91, 92,101,144,153,
+ 47, 46,158,173,214,120,165,241, 77,116,149, 36,161,100, 54, 29,224,162, 38,182,178,156,142,231,104,235,208,206,209,137, 55, 41,
+141, 38,145, 45,182,251,231,184, 59,191, 78, 85,105,148,104, 16,203,132,163,201, 17, 45,149,176,182,158,208,155,110,210,105,182,
+209,182,192, 10, 69,166, 51,242,106, 70,149, 84, 68,186, 42,137, 99,191,227,216,186,124,137,171,207, 93,229, 29,253, 51,110,124,
+246, 5,246,174, 29,242,224, 95,248, 46,110,124,246, 25,140, 51,148,233,140,116, 62,198, 84, 51,182,207, 53,104,174,157, 99, 62,
+ 56,161,187,187,137, 74, 58, 76, 6,138,102,145, 83, 25,131,140,155,172,237, 92,100, 58, 60,165, 44,114,182, 46, 92,225,232,230,
+117,100, 35,194, 9,133,208, 37,185,153, 17, 53,122, 76,142,239, 32, 68,139, 59, 47,127,134,118,255, 28, 2, 71, 85, 85, 52, 58,
+ 27,108,157,219,224,183,159,122,158,183,175,175,113,251,248,140,127,252,209,127, 65,220,238, 7, 24,132, 12,187,244, 90, 41, 91,
+121,170,153, 82,161, 67,183, 43,192,236,101,202,143, 87,185, 74, 79,151, 66,222,211,165, 47, 12,209,186,192,230, 5,249,104, 64,
+ 62,155, 80,165, 25,233,120,138,214, 21, 42, 74,184,251,202, 75,124,205, 15,253,109, 28, 41, 76, 78, 73,159,125,137, 10, 67,167,
+217,240,218,151, 94,207,131,102,202, 65,120,189, 4, 70,199,216,147, 33,249, 96, 76,124,116,202, 81, 90, 48,140, 21,235,143, 61,
+ 68,231,226, 67,152,217,221, 48,254, 90,218, 70,132, 88,142, 27,151, 29,186,197,104,223,229, 68, 18,156,182,124,230,153, 47, 48,
+ 41, 74,126,227,227,191, 64,245,166, 47,230,207, 55, 19,136,114,100, 35,241, 29,163,112, 24, 33,121,203,155,223,198, 27,206, 93,
+228,115, 55,134,252,201,247,255, 85, 62,241, 31,127,130,155,215,110,241,208,151, 60,198, 51, 31,255, 3,102,227, 51, 76,165,177,
+101, 69, 57,155,145,172,111,250,103,190,200,189, 24,207, 56,138,193,152,246,187,222,136,158, 77,137,218, 29, 68,164, 48, 69, 30,
+196, 72,145,247,126, 23, 62, 64,166,121,223,121,118,118,182,152,141,166, 20,186, 68, 91, 77,110, 5,107,210,167,140, 13,131, 26,
+ 86,134, 4, 57, 39, 4,133,214, 92,220,236,115,245,120, 64, 34, 34, 76, 29,244, 1, 52,164, 36,145, 18, 45,252,184,112, 52, 43,
+152, 59,205,195, 23,206,241,238,111,255, 70,174,188,253,237,148,227, 17, 69, 54, 69, 52, 19,212, 90, 15, 90, 13, 84, 28, 35,156,
+197, 89,131,203, 52,162,209,244,223,208,178, 66,226,173,104,228,133, 95,157,184,145,239,196, 27, 45,207,250,143,154, 32, 13,228,
+ 83,200,231,222,223, 28, 41,104,173, 65,171,227,133, 84,245,144, 72,107,238,127,223,183,115,253,255,252,177,149,144, 22,127,128,
+219,250,253, 12,150,183,122, 55, 94, 11,235,164, 88, 38, 8,212,135, 77,157, 59,110,107, 85,121, 16,191, 9,185, 20,163,201, 85,
+ 79,124,109,125, 91, 85,195,175,136,239,236,170, 82, 94,213, 69,111,200,182,119,122, 69,169,111,125, 38,130, 91,209,143,213, 19,
+137,208,169,203,240,226, 14,159, 82,230,240, 73, 92, 11,166,183,113,184,108,176, 56,165,197,202, 30,211,135,179, 68, 52,187, 23,
+177,213, 4, 83,100, 11,251,218, 66, 3, 16,246,243,224, 16,166,214, 28, 56, 95,208, 32, 16, 81, 40,124,165,247, 64, 91, 43, 80,
+202,249,125,181,179,168,110,127,105, 75,195,132,253,121,181, 92,199, 57,179,244,191, 59, 29,196,180, 44,213,242,248, 24, 98, 84,
+ 12,104,172, 41, 80,180,177, 43,251,124, 17, 10, 3, 41,193, 56,187,248,222, 58,194,254,220, 89, 48,213, 2,217, 42,163,196, 39,
+ 44, 74,223,133, 99,212, 82,120, 79,132,140, 37, 66,196,136,164, 17,166, 45,126,159, 46, 98, 5, 81,228,105,123, 81,178, 16,215,
+ 9, 17,138, 31, 7, 46,207, 40,135,103,100,131, 83,142,174,223, 96,107,163, 69,123,107,195, 23,156, 70, 50,120,234, 87,201,142,
+ 78,200,210, 28,129,196, 58, 75,101,172,119,210, 56,199,180, 50, 62, 6, 55,140,219,199,149, 35,150, 10,227,252,106,236,160,240,
+151, 99, 39,130,125,173,252, 36,214, 25, 58, 18,180,115, 52, 66, 97,186,214,140, 73,181, 37,195,227,109,219,214, 96,176,254,162,
+ 87,146, 50,168,230, 5,203,124,131, 26,166,228,140, 67,135, 9, 83,141,140,173,173,110,198,172,248,211,196,146,192, 88, 63,235,
+ 11,142, 83, 16,126,152, 48, 25, 92, 21, 96, 10, 88,132,105, 81,107,117,130,192,112,193, 33,139,252,123,155,157,190,130, 27,188,
+145,214, 90,139, 42,183,100,243,156,236,176, 96,125,119,131,168, 39,153,239, 23, 92,127,110,143,118,187, 75,243, 74,204,100,146,
+243,230,119, 62,206,175,126,246,239,115,107,246, 18,167,233,103,201,229, 38,136, 14,102,118,141,203,151, 31,166,105,251,164,185,
+ 38,165,192, 10,135, 84, 77, 58,145,196, 25, 73,110, 11,122,241, 58,169, 59,230,206,120,192,176, 60,193, 57,199,249,238,195, 40,
+ 20,174,204,233,237,182,120,241,246, 11, 24,167,104, 42,112, 82,163, 92,143, 68, 68,100,206,145,149, 19,164,148,146,233,240,148,
+115, 15, 60,200,217,222, 1,143,188,229,181,156,252,231, 95,227,206,167,191, 64,245,192,163, 84,211, 33,163,211, 35, 48, 51,156,
+148, 68, 78,145, 52,186,148, 85, 70,163, 41, 49, 52, 24,223,221,103,116,188, 71,164, 4, 85, 85, 49, 31,157, 16, 9, 65,153,166,
+224, 44,189,126,143,241,217,152,162,156, 19,197,146,181,254, 14,103,135,135, 52, 58, 29, 58,107, 91,148,186,201,246,197, 93, 30,
+121,226,237,236, 94,126,136,233,112,200,185, 43, 87,176,214,209,221,218,100,107,103,155, 95,253,244,139,124,239,119,188,143,247,
+188,239, 47,134, 29,151, 14,116,182,149,238,206,133,157,185,138, 87,148,239, 53,187, 56,252,152, 11, 94,213, 56, 89, 26, 96, 87,
+137, 84,162, 2, 93, 97,117, 73, 62, 26, 80, 76, 39,164,103, 3, 38,131, 33, 70,107,170, 34,231,116,111,143,139, 79,188,145,184,
+145,224,138, 1,246,197,151,185,123,227, 22, 74,134,200,192, 40,134,230, 58,184,233,130,178,134,173,224,206, 30, 58, 47, 40,158,
+249, 60, 69, 89,241,242,201,136, 23, 94, 57,228,131,191,249, 27,152,244,174,183,182,216, 21,174, 50, 94,212,181,200, 24,118,190,
+ 19,176,206, 51,201,103,227, 41,175,123,219,147, 28,157, 78,121,236, 77, 79, 2, 80,154,130,184,181,238, 71,225, 81,180,176,186,
+ 52,146, 6,162,191,193,122,115,192, 63,253,216, 63,197, 76, 63,195,163,175,123,146,159,248, 39, 63, 65, 94, 20,124,207, 95,251,
+171, 28, 3, 71,207,127,142,164,215, 35,238,180,124,151,219,104, 34,112,152, 52,167, 42, 60, 53,107, 62,158, 19,117,123,216,162,
+192,150,117,192, 75, 16, 22,233, 18,100,228, 83,223,202,130,252,240,128,238, 7,190, 22, 51,246,150,165,221, 56, 66, 8,152, 88,
+ 75, 34, 5,141,176, 83, 63,211,134,115,219, 27, 56, 33,104, 37, 9,173, 70,226,253, 11, 66,162, 84,140, 74, 18,156,129,227,225,
+140,211,209, 20, 25, 43, 30,125,236, 33,190,227,199,127,152,191,254,211, 63,193,251,255,197, 63,224,252, 27,159, 96,126,122,140,
+ 46,115, 92,233,195,101,148, 20, 62,154, 82,250,104, 92, 17, 53, 60,214, 52,157, 65, 54, 67, 8,227,105,101,186,246, 95,105,159,
+ 7, 80,204, 97, 54,132,201, 0, 38,167, 65, 19, 33, 32, 73,252,248,125,109, 29, 90,237, 48, 50, 44, 23,133,165, 84, 17,173,221,
+139,136, 40,241, 99,214, 21,143,184,116, 98, 49, 92, 23,175,166,161,213,187,238, 48, 58, 92,118, 35, 43,232,215,133, 26,190, 54,
+190, 47,247,241,203,103, 70,220,219,149,175,236,160,173, 91, 2, 58, 22,162, 82,213,160,177,118, 9, 25,183, 61,204,102, 69, 97,
+236,244,202, 18,189,198,235,174, 32, 66,157, 91, 90,187,109, 29,247, 90, 91,137,140,187,183,203,173, 39, 12,214,147,176,252,158,
+220, 97,202,177,239,228, 87,180, 0,245,142, 92,170, 14,201,198,195,200,184, 29, 94, 63, 28,255,193,162, 73, 16,253,201,208,172,
+202, 88, 64,188, 70,114,223, 91,137,183, 31,245, 41,130,181, 76, 62,192,130, 22,209,171,126, 41, 31, 56,240, 85,189,204, 95, 10,
+ 7, 66,208,146,183,145,234,240,158, 41,239, 2, 8,121,245,206,104,191, 11, 55,218, 7,186,196,145,167,189, 69,181, 50,213,143,
+231,157,211, 33, 5,174,118,229,132,231, 65,169, 48,162,247,164,191, 5,131, 60,138, 80, 81,140, 84,177, 47, 70,163, 6, 34,106,
+ 16, 37, 77,132,168, 99, 86, 61,135, 2,153,120, 95,191,146, 84, 89,198,252,112,159,233,193,190,199,156,110,247,104,174,173, 83,
+229, 37,197,213, 47,176,247,171,159, 96, 60,155,249,166,192,106,210,202,199,241, 58,163, 57,211, 48, 49,144, 26, 40,157, 99, 88,
+ 89, 6, 21,156, 84,142,153,113, 92,157, 87,156, 20,134, 51,237,216,171, 20, 39,133,101,174, 29,211,210,176,159, 27,198, 90, 48,
+214, 2, 27, 55,184,155, 26,142, 75,203,221,194,112, 86, 90, 10,227,208, 50, 34,115,146,105,229, 69,177,165,118, 56,225,155, 47,
+129, 92, 12, 85, 23,151,116, 88,187,212,158,116,171, 77,216,189,135, 49,186, 14,251,112,107, 23,217,239,218, 44,105,132, 54, 60,
+228,214, 45, 87, 75,181,214, 66,212, 19,219,122,251,130, 13,181,157, 93, 60,163,206, 57,202,193, 62,122,158, 50, 57, 30, 50, 62,
+ 61, 67,103, 57,243,209,144,211, 59, 35,210,233,148,225,241,152,254,214, 38,155,151,250,156,220, 41, 88, 91,111, 80,100, 57,179,
+225,243, 92,234, 39,244,154,219,124,217,165, 39,104,186, 17,177,106,211, 86, 29, 78,139, 19,214,215,214,233, 55, 54,216,237,239,
+144, 68,254,117,215,215,219,116,154,125,214, 55, 21, 69, 94, 48,215, 35,206,183, 31,164,153,108, 48, 46,206, 88, 75,186, 24,231,
+184,115, 56,100,174,231,148,100,140,210, 25,121, 94, 49,200, 15,153, 84, 19, 10, 91,145,217, 12, 41,165, 96,251,252, 46,147, 73,
+202,104, 56, 98,247,250,231,152, 76, 13,229,253,151,216,120,248, 49,110,127,246,147,236, 94,185, 66, 85, 66, 44, 37, 90, 40, 26,
+205, 22,198,148, 56, 93, 98,180,166,181,181, 78,171,211, 33,238,244,136, 90, 29, 84,188,198,108, 52,160,200,135, 8,149,160,162,
+ 38,131,131, 35, 78,247,174, 18, 69, 17,233,124, 68,153, 71,156,222,125,133,102,183,197,238,165,115,244,207, 93, 68,170,152,147,
+189,219,116,250,187, 28,190,252, 57,144, 62,209,232, 79,191,247, 77,188,124,103,196,127,251,163,255,202, 11,198, 48, 94, 65,186,
+ 18,134,130,208,126, 28, 42,227, 48,114,179,203,133,139, 9, 42,247,170, 10, 22,150,120,225,125,172,131, 30, 22,164, 56,157, 98,
+179, 57,213,217, 25,249,104,200,252,244,140,114,150, 97,139,156,233,104,200,124, 56, 97,124,124,202, 27,254,204, 55,224,210,155,
+136,195,125, 14, 63,127,149, 70, 84, 33, 35, 31,248, 71,171, 1,113, 15,202, 52,236,227, 52,140,206,112,131, 17, 58, 45,112, 55,
+111,178, 55, 73,153, 71, 9, 59, 15, 93,164,177,117, 95,176, 39,153,133,136, 67, 32, 80, 73, 76,212,108,250, 76,100,192, 25,159,
+ 65,110,141,245,241,166,214,209,237,245, 89,151, 3,100,212,231,139, 95,115,137,243, 91,155,104, 93, 65,171,137,108, 38,222,114,
+133,127, 80, 90,187, 59,252,171,159,255,101,134,243,156,255,242,135, 79,115,229,178,227, 95,126,226,243,236,236,108, 50, 27,204,
+125,237, 83,105,146,102,155,164,221,245,137,122,147,153,199, 40, 90,141,177,150, 86,183, 73,210,235,224, 76,233,119,171, 58, 96,
+ 97,171,210, 95,238, 58,120, 95, 98,127, 88, 69,107,107,180, 46, 95,100,231,173,143,115,115,154,113,228,180, 79,182,196,113, 22,
+246,174,221, 70, 66, 91, 9, 14,206,134, 97,106,105, 56, 62, 25,176,214,106, 50,205, 50,198,163, 49,107, 81,196, 59,191,244, 13,
+252,157,255,244, 47,249,209, 95,253, 25,126,224,167,255, 57, 95,245,125,223,137,181,150,244,244,132,233,245, 27, 84,211, 49,174,
+210, 8,107,137, 59, 77, 90, 91, 91,200, 70,211,119,183,205, 54,162,213,242, 41,114, 73, 3,209, 95, 71,172,111,250,203,121,107,
+ 11, 46, 92,240,162,184,126, 31, 26, 9, 52,154, 94,232, 24, 75,127,145, 55, 19,223,185,199,161, 75,151,126,180, 43, 84, 8,213,
+168,153, 6,225, 98,250,138, 95,123,201,239, 64,131, 5,186,214,134,173, 50,168,239,189, 29,195,255,179, 43,187,227, 87,137,221,
+156, 91,238,208,107,177,156,183, 27, 5,107, 91,224,101, 47,172,108,139, 76,235,165, 74,248, 30, 68,157,117, 56,157, 83,101,103,
+216,106,182, 68,180,134, 67,213,213,118,186,112,104,186,213, 37,104,168, 66,252,254,183,137, 84, 18,171,189, 59,192,106, 27, 16,
+173,254, 80, 94, 96, 70, 23,187,126, 23, 46,119,141,201, 78,124, 12,173,168, 51,215, 89, 76, 39,146,222, 5, 90,151,159, 68, 53,
+183,239,141,155,115,118, 33,140, 91,134,131,248, 14, 63, 94,191, 68,231,209, 47, 39,217,188,226, 47, 63, 86,130,215,157,243,148,
+ 72, 39, 22, 26, 21,108, 8,112, 34, 0,116,236, 61,100,149,122,159,192, 98, 76, 98,204, 82, 64, 23,148,239, 68, 50,140,226, 3,
+149,174, 38,227, 24, 63, 17, 20,206,226,170,124, 65, 92, 20, 50, 10,171,153,160,132, 87, 10, 21,171,176,194,137,124,209, 18, 69,
+126, 93,132,244,151,186, 16,158,170, 41,133,183,183, 57,231,255, 41, 5,182,210, 56, 99,152,220,189,201,232,224, 22,167,215, 94,
+100,247,252, 6, 59, 15,221,135,106, 70,224, 36, 39,191,242, 43,140,202,138,162,212,104, 13,198,250,177,118,161, 45,169, 17, 28,
+230,142,153, 22,148, 22,166, 5, 28,102,142,195,194,113, 82,192, 89, 41, 24, 86,112, 90,193, 64, 11, 70,165, 33,183, 48,169, 12,
+ 7,153,101,104, 4,131, 10,230, 72,110, 79, 43,142,114,195,141,185,229, 40,183, 68, 2, 6, 21,156,150,142, 65,105, 49, 62,117,
+134,184,209, 68,198,141,133,235,194, 46, 36, 79, 50, 20, 90,203, 65, 43,245,145,191, 98,167, 52,182, 22, 94,250,169,142, 49,203,
+209,187,209,193, 66,103,184,183, 64,174, 87,126, 65, 33,239,140,143,125,181,193, 91,191, 96,204, 7,159, 91, 49, 59, 64, 87, 5,
+210,101,100,147, 49,189,115, 59,180,187, 13,210,225,136,253,231,110, 97,243, 53,214,183, 34, 70,135, 57,113,210,224,190, 7, 30,
+ 32,157, 57, 46, 92,184, 66,164, 18, 46,116,174,240,204,241,179, 60,121,254,109, 8, 33,121,241,240, 38,179,172, 96,111,116, 11,
+156,226,116, 62,160,210,142,215, 63,122,133,219,195,155,180, 99,201,100,236, 39,158,145,104,130,112, 52, 68, 66, 83,182, 40,163,
+ 49, 46,136, 62,155,209, 26,137,104, 49,175, 38,156,229, 67,198,197,136,220,122, 91,104, 81,205,136,230,195, 17,150,146, 13,169,
+136, 26, 22,119,253, 42,217,149,251, 56,184, 61,231,145,104,206,249,215,191,133, 60, 27, 19, 69, 49,179,233, 16,128,249,104,204,
+218,214, 57,172,140, 56,187,246, 5, 58, 27, 27,196,237,117,166, 39,135, 36, 73,129,148, 9,243, 98,132, 64,210,238, 54,136,146,
+ 46,157,254,156,164,247, 4, 85,225,237, 31,107, 59, 27, 8,167,121,229, 15, 63, 69,119,189,131,140, 19,206,246,143, 89, 63,223,
+163,217,218,192,153, 71, 57,255,240,253,188,242,251, 39, 28,220, 61,230,233, 91, 47,172,236,189,245, 74,202, 89, 8, 99,113,185,
+255, 80,214,164, 40, 25,170,113,173,253, 56, 94,231,225, 67,212,168,231,149, 11,202,219, 2,106,168,167,216,108, 78,126,118, 74,
+ 57, 25, 81, 76,166,100,195, 49,121,158, 51, 57, 27, 80,166, 25, 89, 94,162, 90,109,226,102, 7,119,116, 13,119, 60, 0, 59,163,
+187,222, 36,138, 35,111,159,234,111,121, 27,156, 14, 8, 85, 93,193,108,140, 45, 43,140, 53,152, 87,110,114,152,149,188,124,251,
+148,239,249,194,199, 49,233, 1,117,254,166,183, 64,249, 17, 91,212,232,120,107, 88, 92, 80,230, 41,198,106,172,118, 88, 99,208,
+218,139,136,142, 14,142,249,216,143,253, 0, 95,249,151,254, 25,127,243,195,239,231,116,118,194, 11, 95,120, 30, 26,109, 80, 21,
+210,129,180,142, 88, 10, 6,121,202,198,214, 6,195, 51,255, 62, 78,143,238, 82, 88, 73,145,231, 40, 21,115,165,211, 34,203, 74,
+154,189, 14,197, 28,146,102,139,108, 86, 34,149,247, 6, 87,179, 28, 87,149,188,237,187,191,149,217,205, 23,188,133,167,142,105,
+ 84, 10, 97, 53, 46, 28, 98,245,114,204,132, 46,245,177,111,255, 16,119, 78, 70,124,242,233,151,217,221, 88, 67,104,237, 45, 51,
+ 64,153,229, 30, 98, 17, 69,196,145,224,228,108,202,204,102,172, 95,220,225,251,255,242,135,184,244,206,119, 33,123, 93,168, 12,
+229,225, 1,213,193, 62, 70, 91,204,124,238, 63,192,202,239, 7,101, 20,211,236,181,137, 54,251,222,207,171, 36,178,221, 65, 36,
+ 9, 20, 25,194, 25,232,118,124,119,164, 34,104,182,189,231,102,225,109, 9, 38,112,229,188,167,184, 38,208, 9,233,187,187, 36,
+246, 43, 27,153, 4, 33,213,255,127,183, 92,179,201,147,254, 6,127,234,211, 7,252,234,123, 30,164, 28,156,133,128,151, 37,188,
+195, 45, 80, 43, 44, 49, 87, 78, 44, 50,162,235, 47, 18,242, 85, 17,170,118,105, 43,115,247, 34,208, 61,122,150,101,246,116,205,
+200,174,219,109, 33, 86, 71,241,203, 9,180,201,198, 97,212,201,226,207,180,188,183, 87, 80,160,181, 88,179, 30,143, 74,137,106,
+248, 66,190, 24,222, 9, 59,252, 37,114,211, 45,128,109,129,120,167,124,191,107,141, 63,144,101, 0,219, 44,244,107,218, 45, 45,
+ 71,198,146, 15,110,162,179, 33,182, 24, 44,199, 26, 43, 81,176,181,189,192,139, 20,125, 81,174, 7,183,153,255,209,255,131, 16,
+ 51,132,138,194, 74, 33,196, 38, 47,216, 21,181, 58,207, 46, 5,180, 78,135, 11,158,101,103,175,171,229, 24, 37, 92,230, 86,107,
+156,213, 88, 93,134,105,199, 10,121,174, 14, 13,178, 6,103,117,104,248,125,252,171,211, 21, 52, 59,184,106,142,136, 19,132, 93,
+126,102,188,190,194, 23,134, 50,105, 32,163,166,127,147,149, 12,220,119,129, 12,141,136, 11,196, 29,161,130,231,222, 58, 84, 34,
+200, 7,167,164, 71, 7,204,238,238, 51, 63,186,203, 67,143,236,208,221,222,193,170, 4,187,119,149,195, 59,119,253,221,232,156,
+167,174, 25, 75,105, 33, 71, 48,170, 96,164, 5, 13,225, 72, 12, 28,151,134,253,220, 81, 72,197,154,132,204, 10,206, 42, 48, 72,
+140, 49,172,197,146,185, 54, 84,198, 98,156, 68,148,142,221, 38,220, 73, 13,149,241,128, 31,101, 45, 15,183, 21, 7,153, 65, 73,
+201,134, 16,172, 53,154,148,214,130,106, 32, 99,133,174, 74,138,188,164, 29, 75,140, 80, 40,103, 22, 41,110,245,196,196,185,149,
+162,116, 37,244, 72,226,215, 49,102, 17,243, 26, 46,240, 85, 98,114,189,134, 10, 99, 44, 19,232,131,254,249, 93, 73,112, 89,181,
+120, 44,108,155, 10, 83, 76, 57,217,123,133,238,230, 58,187, 23,238,231,228,246, 45,102,131, 17,142, 22,194,197, 56, 41,104,174,
+197,112, 34,232,239,238,144, 21,103,172,245,183,233,180, 13,141, 19,197,236,214,148, 52, 43,248,100,246,123,108,198, 91, 30,228,
+ 99,155,236, 36, 13,172,116,140,230, 51, 94,115,223, 38,163,236, 14, 61,177,195, 75,103, 47,242,240,230,107, 88,211, 59, 88, 55,
+162, 33, 91,184,216, 43,141,142,199, 3,156,136,136,149, 33,145, 77,206,138,187, 8,169,232, 38, 93,210,106,134,197,210,109,173,
+113, 60, 59, 34,210, 85,138,138, 37, 39,123,123, 60,241, 37,143, 50,253,195,223,160,106,172, 49,161, 65, 20, 75,116,225,200,103,
+103,172,237,220,207,201,193, 13, 54,118,119,153,158,230, 68,177, 36,205,231,236,190,230, 77,168,184,135,171, 74,132,140, 40,210,
+ 49, 66,118,168,202, 25,231,175, 60,236, 63, 27,198,210,108, 38,168, 42,226,232,250,139,108, 93,186, 72,156, 40, 38,163, 25,136,
+136,116, 60, 65,235,107, 52,154,107, 56,109, 25, 30, 95,167,209,220,102,126,114,136, 54,142, 55,188,245,203,233,110, 95, 9,171,
+190,114, 17, 14,224,156, 94,142,212,180,198, 73, 25,132, 42, 33, 53,202, 84,200, 36, 9,169,107, 26, 27, 88,205,175, 26,122,134,
+238,102,142,203,230, 84,227, 33, 8, 71, 62,157,146,142,134,228, 89, 70, 85,100,100,243,148,201,104,202,254,237, 67, 62,248, 63,
+255, 15, 56,119, 2, 2,210,179, 51, 98, 89,208,234, 95, 34,185,116,209,139,168, 90,235, 80,205,150,229,103, 89,194,104,228, 35,
+ 89,243,140,179,233,148,145,136,152,173,183,188,133,109,122,199, 11,120, 66,181, 47,148, 66, 37, 13,136,155, 8, 98,156, 48, 11,
+ 64,131,181, 14,171,181, 87,108,106,135, 49,154, 7, 30,127, 51,255,228,219,191,146, 31,248,232,127, 38,142, 28, 63,250,161,175,
+ 12, 64, 29,175,184,141,140, 34,233,180,248,228, 31, 62,207,251,222,251, 21,252,222,239,254, 14,113, 20,179,254,218, 39,113,159,
+124, 25,139, 34, 77, 51,190,250, 79, 60,142, 81, 2,149, 52,144,149,247,243,219,162, 66, 70,202,119, 24, 74,176,182,187,133,153,
+157,133,224, 23, 19,198,185, 22,165, 75, 28,126, 74, 98,240, 86, 21, 33, 21,178,213,192,100, 5,103,175, 92,229,189, 63,248,221,
+188,238, 83,127,192, 71,255,217,199,112, 64,187, 21, 19, 43, 69,105, 52,179,212,171,245,183, 46,238,240,221, 63,249,195, 92,248,
+202,175,242, 83,143,219, 55, 49,131, 51,202,227, 99, 76, 61,230,199, 97, 10,179, 98, 55, 22,168,126,143,102,191, 79,180,190,230,
+111,146, 36, 70,196, 49,194, 24, 47,138, 11, 93, 58,113, 2,237,182,191,156,107,117,117,200,174, 70,135, 21, 77, 21,198,177, 54,
+ 8,172, 36,254,251,105, 90,158, 33, 31,133, 61,171,248,175, 49, 13,150,151,188,213,134,175,248,165,231,248,127,191,116, 55,164,
+110,173,248,194, 87,125,226,171,162,157, 32,254, 90, 96,221, 88, 54,208,110, 65,211,122,213,197, 22, 14,167, 69,148,106,160, 15,
+214, 83,100, 33,253, 78,191, 78,255, 18, 65,179,177,160,118,173,126, 26,106,198,182,100, 9, 1,113, 43,211,234,149,236, 87,103,
+ 13, 58, 61,193,204,142,253,235,215, 62,116, 41,150, 97, 42, 43,145,156,245, 72,212,143,139, 3,251,189, 22,233,173,128,148, 68,
+224, 30, 8, 89, 97,138,211, 48, 69, 11, 74,113,181, 48,251, 47,118,247,184, 90,123, 2,152, 57,197,248, 37,146,173,139,120, 89,
+230,171,246,232,139,194,198,188, 74, 36,183,226,142,177,218,191,191, 90,251,226, 79,251,213,215,226, 89, 89, 88,164, 86, 86,119,
+145, 79,100,115, 1, 21, 44,132,242, 52,201,240, 57,146, 42,246, 84, 58,159,230,227, 57,238, 66, 97,133,244, 95,139,167,214, 73,
+ 17,123,209,166,138,253, 69,238, 25,187,203,209,188, 16,254,123, 38,189,135,221, 58,135,114, 80,205,230, 76,142,238, 50,220,187,
+133,208, 5,189,139,231,104,238,236, 32, 42,203,209,111,253, 38, 99,109,208, 40,176,144, 75,135, 2, 10, 43,152, 88,201,153,113,
+164,193, 75,237,172,225,110, 1,103,218,103, 55,116,163,136,253,180, 36,181, 96,133,165,173, 20,185,245, 92,220,180,244,239, 31,
+198,113,144, 25, 42,227, 66,214,186,102, 59,145, 92,207, 12, 13, 9,187, 77, 73, 33, 18, 14, 11,195,197,110,147,172,210,204,171,
+138, 78,179, 65, 65, 65, 43,106, 33, 93, 21, 38,145, 2, 33,188, 59,102,153,252,230, 22,122,162, 58,176,104, 17,198, 18,186,118,
+ 23,220, 49,118, 21,205,108,150, 5,169,149,110,137,171,117,158,238, 38, 36,203,162,218,214,209,189,126, 34, 37, 4,136, 98,136,
+204,115, 78,110,158,240,192, 23, 95, 98,112,247, 22,107,219, 23, 48, 85,131,114,158, 50,156,222,164,215,219,161,211, 45, 56,188,
+125, 13, 51, 75, 24,244,198, 92,188,178, 77,107, 67, 97,110, 37,236, 54,119, 41, 44, 24, 52,157,100,141, 68, 38, 40,169,188, 14,
+162, 41, 56, 57, 27, 51,154, 38, 8, 21,115,127,251, 1,158, 61,250, 60,137,104,209,136, 27,228,100, 52, 27,142, 92,151,164,105,
+ 65,225,206, 80, 82,177,219,219,161, 76, 13,109,149, 96, 85, 78,228, 32,142, 44,211,124,130,177,218,171,223,173, 54,104, 28,173,
+ 59, 55,185, 57,207,153, 12, 13, 27,187,187, 88, 45,153, 79,166,204, 7, 71,116, 55, 46,176,117,225, 65, 42, 61,231,129, 39,158,
+ 36,207,115,154,125,159, 68, 51, 62,218,199,150, 99,162,198, 14,147,241, 45,182,239,219, 66,235,152,107,159,123,138,238, 70, 31,
+109, 59, 20,179, 83,146,102, 7, 23, 25,162,214, 58,150, 41, 18, 31, 46,219,232,172,211, 94,219, 66, 42, 65, 49, 78,121,237,219,
+191,154,215,191,231, 27, 81, 8,144, 49, 81,170,153,189,248, 2, 58,105,209,220, 90,163,217,223,244,222, 79, 87, 33,132,196,234,
+ 18, 25,247,144, 40,178,241,128, 60, 51,244,207,245, 73,141,225,198, 31,237, 51, 60, 58,226,202,253,155,220,255,216, 5,255,225,
+149, 18, 92, 99,197,238,147, 66,158, 82, 78,198, 88,227,152,159,156,144, 78, 38,148, 69, 69, 54,159, 51, 29,142,153, 12, 71, 76,
+179,130, 89,150,113,238, 53,175,129,219,207, 67, 81,144, 30,141,232,238,108, 19,109,108,194,230, 14, 52, 59, 94, 89, 91,156,250,
+137,129, 9, 73,110,147, 25, 38,207, 48,195, 33,119, 38, 57, 87, 71, 5,223,243,203,255, 7,118,126, 16,170,207, 42, 8,144, 44,
+ 82, 6, 82, 20,113, 24,127,250, 92,121, 93,250,175, 49,206,121,133,111,200, 7, 30, 31, 13,248,186,111,254, 48,239,126,207, 87,
+112,231,234, 53,222,248,230, 55, 80, 12,247, 66, 84,164, 66,160,105, 52,218,252,230, 31, 61,205,180,213,229, 59, 62,240,223,241,
+249, 87,238,240, 7, 79,125,134,215,158,247,163,176,217,254, 17,223,240, 77,223, 64,119,115,139, 42, 47, 49, 69,137, 46, 74,100,
+163,177, 8,149,168,138, 42,136, 29, 92,122, 0, 0, 32, 0, 73, 68, 65, 84,228,126, 91, 4, 22, 39, 5,214, 84, 8, 35, 3, 24,
+196, 75,178,157, 54, 40,165,112,107, 29, 16, 17,102,150, 18,183,187,204,207,142, 56,255,198,215,241, 35, 63,247, 79, 25,222,188,
+197, 75, 79, 63,195,232,100, 64,255,194, 46,111,122,255,159, 35,121,240, 97,212,206, 6,204, 82,152, 5, 42, 95,158, 5,106,154,
+ 87, 26, 91, 33, 16, 78, 34,187, 9, 66,117, 81, 66, 34, 27, 9,178,219, 65,182,154, 30,239,219, 80, 75,178, 77,179, 13, 73, 4,
+ 89, 10, 91,219,254, 50, 95, 68,235, 6, 42,159,209,190,240,178,222,150,231,163, 62, 37,162, 17,121, 4,174,168, 15,119,159,145,
+237,109, 86,161,187, 19,138, 63,238, 47, 25, 69,200, 72,177,249,230,119, 48,120,250, 83,172, 28, 33,225,110, 8, 98,161, 90, 9,
+191,240,200, 46,100,105,129, 80,183,162,248, 94,180, 37,110, 65,149,171, 59,112,183,218,166,220, 67,158, 11, 59,220, 16, 4, 35,
+ 86,132,151, 50, 68,163, 10,249,170, 92,152, 21,136, 7,117, 6,251, 10,113, 75,212,140,237, 58, 68, 35, 8,206, 68, 36, 67,110,
+246, 74, 81, 80,231,190,175,230,193, 47,216,242, 43,187,114,177,196, 74,136,149,200,215,213,144,153, 90, 24,231, 45, 74, 34,100,
+193,215,223, 85, 25, 14,102, 67,180,118,238, 85,194, 56,177, 82, 25,217,165,109,205,133,244,181,192,174, 95,136,219,156, 12, 8,
+ 89,235,167,120, 53,216, 92, 46, 71, 36, 74,197,104,242,112,105, 71, 88,225, 1, 89,126,250, 30,242,207,133,243, 99, 83, 34,108,
+ 62,241,163,116, 41, 3, 28, 5,143, 41, 85, 98, 97,189, 21,113,228,173,106,113, 12, 72,100,210,240, 94,110, 17,172,183,194,131,
+187, 80,114, 97, 35,180, 78,131, 41,201,166, 41,147,211, 33, 59, 91, 77,214,207, 95, 64,117,186,228,183, 95,225,230, 75, 55, 65,
+ 72,178,210,250, 12, 38,167, 16,218, 48,183, 48,118, 17, 67, 99, 49,206,144,107,203, 28, 56,171,124,182,124,106, 28, 51, 43, 24,
+235,101, 46,122,101, 93, 32,202, 89, 50,163,193, 42, 58,177,160,116,144,133,253,182, 2, 14,115,203, 90, 18,145, 72,201, 73,105,
+153, 84, 25, 23,218, 9,221,180,100, 32,224,254,205, 13,238,142,207,216,109,183,112, 72,210,178,164, 19,199, 56, 28, 85,101,151,
+ 44,255,176, 23, 55,214, 5,244,129,183,142, 58, 81,131,255,220, 66, 26,165, 67,224,145, 9, 32,122,183, 8,148,113, 24, 27,224,
+ 70, 42, 40, 27,196,146,105, 47,101,205, 97, 16, 11,203,167,195,161, 44,200, 27,255, 5, 46,126, 45,197,244, 4,135,224,210, 99,
+143,240,210,239, 61, 75,163,181, 70,207, 73,250,219,125,142, 15, 78,232,117,250,156, 76,206,136, 39,125,110,189,120,130,165, 96,
+158,101,108,182,207,113,107,116,147,181,230, 22,243,114,206,133,173, 45,198,197,156, 75,235,151,120,230,240,105, 58, 81,135,162,
+172,208,102, 78, 33, 35,238,107, 95,228,110,118, 23,105, 37, 89, 53, 67,170, 6,251,227, 67, 18,213,194, 24, 75, 97, 75,174,158,
+ 93,245,128, 32,213, 70,216,138, 66, 87,100, 26,230,213,156,205,214, 26, 81,127,231, 2,167,123, 87,113, 8,116, 46, 40,207,198,
+100,133, 98,237,145, 47, 34,157, 77, 17, 38, 99,253,194,253, 72, 37,201,103, 99,250,231,238, 35,157,156, 32,162, 53,142,238, 60,
+207,214,133,215,146,205,134,180,123,125,132, 44, 81, 81, 23, 41,124,149,183,126,225, 97,158,251,244,111,243,214,175,251, 83, 68,
+234, 1,140,213, 40,249, 58,202,249,140,168,211,167,245, 80,159,178,172, 48,233, 41, 27,231, 47, 99,178,130, 63,251,131,255, 43,
+110,124,130, 61, 57,165, 56,153,144,231, 57,229,108,202,236,238, 62,131, 59,251,236,221,216,231,206,225, 30,111,255,208, 7,120,
+242, 35, 31,193,216, 12, 21,245,248,201,191,241,253,252,247, 63,250,207, 22, 7,234,102,171,207,143,255,195,143,242, 85,127,238,
+189,188,112,237,144,255,244,209,143,179,177,214,225,235,191,238,173,188,225,109, 15,175,140,239, 52, 84, 21, 58, 79,169,178, 57,
+217,104,196,244,232,132,170, 40, 24, 28,159,144,207, 50,198,147, 9, 71,167, 35,166,211,156, 47,253, 51,239,134,217, 9, 12, 78,
+ 49,163, 49,211,233,132,237,251,239, 67, 60,250,152,255, 5,219,155, 96,166,203,174,207,104,152, 77,188, 72,203, 57,138,147, 51,
+166,214,145,106,195,246,235, 31,167, 26,159, 5, 63,187,194, 58, 47, 92, 65,104,148, 46, 22,115,215,249,201, 1,101, 81,224,140,
+197,212,187, 59,150,161, 25, 50,138,152,158, 13,177, 50,230,210, 23,189, 1, 55, 57,195, 6,235,143,104, 40, 84, 21, 51,159,156,
+242, 35,223,251, 17,254,199, 31,251, 41,126,248,167, 62, 70,154, 13,121,227,229, 45,254,237,143,255, 93, 78, 79, 6,168, 88, 50,
+ 27, 77,104,108, 93, 36, 61,221,167,200, 74,102,147, 9, 70,247,253, 37, 39,124, 58,148, 73,203,133, 20, 75,212,169, 37,214, 96,
+173, 68, 26, 9,202,225, 74,159,134,167, 26, 13, 76,101,208,206, 17,117,155,232, 44,199,148, 37,250,240, 46,253, 71, 30,228,109,
+ 95,250, 36,116,186,126,111,173,141,247,132, 87, 51,127,113, 86,165,255,127,210, 23, 12, 36,209, 2, 31, 42,146,132,168,217, 70,
+181, 19,100,175,231,119,222,245, 37, 94,119, 95, 73,228, 47,240,102,203, 95, 76, 91,219,190,107, 50,198, 95,228, 58,236, 79,203,
+ 18,170, 42, 76, 96,195, 36, 64,197, 97, 17, 30,123,255,250, 98,255,106, 87, 46, 87,113,239,104,250,143,233,216,157,181,188,254,
+175,252, 47,124,234, 35, 95,181, 80,128,175,166, 65,214, 49,145,171,169, 85,171, 2, 95, 87,147,218, 2, 42,213,173,118,231, 11,
+ 62,186, 91,228,167,223,147,232, 38, 86,224, 44, 43, 23,162, 14, 5, 65,221,213,187, 16,175,229,156, 67, 68, 98, 57,186,151, 43,
+171, 2,227, 22, 68, 83, 63, 42,183, 75,166,188,172, 71,150,222,243, 43,194,191,215, 19,135,149,134,107, 1, 79, 18, 53, 4,238,
+ 30,194,158, 64, 96,125,112, 71, 24,227,215, 63, 55,224,227,239, 9,155,169, 45,127,117,242,151,179, 14,167,252,247,184,249,218,
+183,174,232,106,228,202,200,195,132,136,229,200,179,223, 23,157, 90, 21, 38, 47,181,141,173,244,144,153,218,143, 30, 98,153, 93,
+ 80, 7, 58,235, 64,185, 0,124, 1, 39,165, 79, 97,171,147,214, 88,102,197,251,245,128, 55, 81, 59, 87,225,156, 95, 17, 10,229,
+188,160, 82,128, 83, 17,182,210,200,164,137,140, 19,111,119, 11,188,120,225,156, 79,121, 19, 18,153,180,125, 70,123,179,237,167,
+149, 70,163,179, 20,157, 77,209,233,132, 70, 83,210, 91,107,210,218,222,162,156,206, 57,249,196,199,153, 91,235, 25,228, 64,105,
+125,153,111,156,247,162, 79,165, 34,119,142,188,244,221,105, 26, 60,229, 38,112,211,167,198,209,105, 40,138,176, 50, 49,120, 97,
+226,188, 52,126,205,164,252,133, 91,104, 71,101, 44,218,250, 16,147, 94,236,225, 81, 51,237,104, 40, 73, 51,145,164,165,225,101,
+109,121,100,123,157,155,227, 9, 93, 1, 66, 53, 72,203, 41, 45,233, 29, 42, 86, 87, 72, 21,176,177,194, 97, 92, 40,220, 22, 41,
+170,110,165,220,125,149, 22, 51,252,152, 91,224,225,188, 79, 94,174, 76,144,124, 26, 96,237, 20,185,103,216,178,140,148,149, 53,
+171,221, 34,230,119,104, 48,231,120,239, 54, 55, 94,185,197,198,133,243,172,223,215,230,248,230,148,110,167,199,205,107,175,208,
+235,239,176,113, 97,155,225,209, 4, 71, 73,145, 90,140,171,216,234,156,103, 90, 12, 72, 84,155,118,220, 98,127,118, 72, 99,199,
+226,246, 74,142,103,135,220,215,190,196,141,233, 30, 13, 41,105, 69,107,164,213,132, 88,181,145, 78, 50,175,198, 72,183,201,222,
+240, 54, 82, 40, 74, 91, 44,158,231, 66,231, 20, 38,199, 4,159,233,102,171,203, 81, 58, 64, 2, 7,105, 74,132,176,116,214,183,
+153, 76,142, 81, 58,103,247,221,239, 96,114,253,144,207, 61,243, 28, 79,254,153,119, 99,123,125,178,201, 16,161, 98,162,164, 65,
+158,141,104,180,250,100,195, 19,122,235,155,140, 79,206, 22,201, 77,186, 76, 17, 56,202,172, 96,109,235, 28,167,123,207,241,250,
+ 39,223,130,201, 50,226,110,143,241,225, 1,211,163, 61,218,219, 91,172,239, 92,194, 20, 21,210,166, 20,182,193,175,255,187,159,
+226, 71,126,251, 6,213,179,191,139,109, 94,196,174,245,176, 73, 3,125,122, 76,158,143,152, 78, 14, 24,102,135,204,220, 25, 83,
+155,242,143,127,232,111,240,227,111,124,140,254,149,199,233,108, 38,252,196, 95,250,111,152,255,209, 47, 81,161,200,211,138,239,
+254,107, 63,200,135,255,242,251,249,206,223,250, 46,190,231, 7,191,143,163,225,235,185,241,210,203,252, 95,191,248, 20,127,105,
+247, 34,247,237, 64,163,219, 5, 87,226,178, 25, 38,205, 40,198, 99,102,167, 39,204, 67, 80,203,116, 56,196, 26,199,232,116,132,
+ 20,130, 34,157,241,158,143,124, 8,119,227, 69, 68,119, 13,115,114,198,252,108,140,120,211, 55,120, 49, 94,171,239, 61,195,179,
+249,210, 31,171, 53,174, 40, 60,175,185,219, 69,207,102, 12,141, 37,105, 40, 26, 59,231, 73, 15,246,253, 89,163,226, 0,245, 16,
+216,170, 68,151,133,247,106, 86, 37,249, 44,197, 86,149,111,158,130, 32, 10,183, 4,140,184,176,195, 22, 14, 92,146,208,190,123,
+136, 56,183,133,204, 43, 76,240,122, 8, 44,107,247,237,242,239,254,213, 63, 34,159,122,159,125,163,221,229,224,246, 62, 56,136,
+226, 24,180, 96,173,219, 99,114,253, 57,242, 60, 16,179,176, 56, 25,227,148,103,164,151,185, 31, 89,187, 0,206,192, 46, 71,177,
+ 88, 25,226, 12, 29, 24,135,108,199, 88, 33,176, 81,132,117, 94,245, 42,211, 28,164, 67, 87, 57,242,236, 12, 57, 25,122, 29, 66,
+ 20,249,147,187, 44, 61, 79, 94,107,108,161,253,152,177,233, 67,108, 84,187,141,136, 27,168, 78, 27,177,181,233,187,112, 25, 14,
+ 92, 93, 43,152,165,255,181, 34,229,237,104, 88,127,129,231,185, 63,208, 43,227,131,118, 42,141,203, 11, 31, 73, 91,195, 41,164,
+ 0, 27,252,201, 86, 66, 85, 96,164,143,178,148,194,122, 41, 71, 85, 95,250,226,143, 29,191,223, 11, 13,179,172,189,246,113,255,
+190, 10,183, 12,159,144, 43, 0, 12,199, 34,217, 78, 4, 17, 97, 77, 49,245,151,163,191,176,101,232,124,157, 93, 38,182, 73, 81,
+243,221,173,247,150,135, 17,124,125,233,249,166, 69,248,142,176,134, 99,138, 37,148,131,149,255,246,171,227,240,218, 43,126,114,
+ 17, 70,221,214,218, 37,218, 51,128,104,144, 75,100,104, 29,232,226, 66,235,228,139, 18,235, 61,244,181,103, 30,135,138, 85,216,
+143,122,223,249, 82,215, 18, 18,215, 2,184, 71,170,101,102,182, 39,181,249,175,151, 98, 5,133, 91, 31,224,138, 48, 77,240,191,
+ 94,247, 13, 95,185,164,146, 16,133,253,185, 93,130,104,106, 91, 2,209, 50, 6,153, 87,137, 8,131,112,209, 25,179,146, 30, 82,
+239,209, 53,206,133,128, 40,173, 67,224,155,231,217,135,144,123,164,178, 1, 10, 84,103,180, 7, 88,140, 82, 11,109,133, 71,222,
+250, 81,188,104, 68,193,170, 23,225,242, 50,200,134, 34,132, 48,225,235,253, 4,164,134,208,212,197, 12,214, 49,190,123,199,127,
+ 70,162, 22,155,151,118,112, 82, 97,246,111,242,194,103,175,162,149, 68, 35, 40, 12, 20,214, 75, 67, 82, 35,201, 44,164, 66,144,
+ 25, 75,170, 29,145, 18, 76, 87,191, 21,210,227,112, 35, 33, 40,173, 37,137, 21,121,169, 57,201, 42,186,177, 36, 81,146,210,248,
+201, 97,110, 12,165,177, 68, 66,208, 75, 20,137,242,207,223,184,178, 52,180, 97,144, 91,218, 81,196,253,107, 29,110,143, 82,214,
+ 99,193, 90,167,131,182, 22, 25,181,188, 46,198,250, 25,120, 85, 21, 68, 98, 73,132,139,164,183,179,217, 5, 47,126,249, 25,169,
+183,169,245,143, 45, 88, 68,245,103, 34, 88,225,132,112, 44, 82,124, 67,202, 95, 93, 68,219, 90,203,225, 21, 65,190,128, 85, 75,
+107, 92,103,239, 23,121,165,249, 46,146,164,195,248,248, 20, 20, 12,143, 71,116, 94,247, 0,229,116,196,157,131,148,141, 43,125,
+154,253,132,209,105,225,237,119, 90, 17, 17,211, 78, 98,182, 57,207,172,156,241,248,246, 27, 72,135,115,142,198, 19,206,109,107,
+ 78, 71, 51, 18, 25,177,209,220, 97,174,103, 36, 81,194,126,122, 3,109, 13,145, 84, 84, 84, 68,170, 73, 66,147,169, 29, 16, 9,
+133, 20,138, 76,196, 56,145, 50,213, 19, 58,170,203,233,108,202,184, 26, 33, 69, 68,105,115,162, 50,203,144, 74,177,126,254, 1,
+236,157,103,153,255,222,103, 40,146, 22,219,231, 47,147,103, 19,108, 41, 73, 58,109,138,108, 20, 44,104, 27, 76,207,134,148,229,
+156,181,222, 54, 39,123, 55,144,170, 68, 87, 5, 22,239,215,204,102,115,138,116,192,230,165,199, 56,124,229, 51,152,202,241,236,
+167,159,226,209, 47,126, 11,173,173, 93,122,235, 61,202, 44,227,217, 79, 61,205,246, 37,193,133,135,222,194, 95,249,233,143,227,
+ 14,158,163,210,107,180,182, 55, 72,243, 57,213,233, 41,246,240,152,249,243, 95,224,244,230, 45,174,189,114,149, 27,195, 17,175,
+ 12, 38,124,243,159,124, 39, 27,175,121, 35, 81,183,203,205,159,255, 49,250, 15, 62,200, 28,129,108,247,232,236,110,243, 31,159,
+122,154, 23,127,241, 23,120,236,207,125,144, 86,191,197, 55,126,224, 91,184,126,173, 69, 58,159,241,244, 83,159,229,103, 62,241,
+191,243,183, 62,250, 51,144, 77,201,135, 67, 76,150, 50, 57, 57, 33, 61, 27, 83,102, 57,179,225,152, 50, 43,217, 63, 60,229,228,
+116, 4, 18,222,241,222,183,195,141, 47,192,193, 33,174,215, 37, 31,207, 88,123,221, 67,144,116,252,165,210,108,249, 11,166, 40,
+ 86, 76,145, 26,225, 4,170,223,198,206, 75,214,222,252, 36, 15,253,135,143,243, 23,111, 63,197,228,218,139,136,164, 17, 14, 12,
+237,225, 50,132,232, 78,151, 98,180,241,123,116,237, 60,253, 75,219,112,134,201, 96, 39,170, 99, 18, 61,169, 9,103, 16,214, 18,
+105,239,213,151,202,160,164,192, 6,218,153,148,130,209, 96, 64, 54, 73,209,186,194,152,129,231, 49,227, 80, 42,162,213,104,210,
+223, 90,227,120, 58, 7, 41,233,111,244, 57,218,159,123,206,185,140,136, 98,133, 46,131,131,192,134, 81,101,164, 22, 31, 30,231,
+156,191, 52, 1,226,200,119,129,149, 93,118,139, 42,194, 68,150, 40,105, 98,165,194, 86, 21, 74, 54,160, 44, 3, 26, 86, 45,172,
+ 68,214, 10,172,148,158,136,215,237, 17, 41,229,149,234, 27,155, 75, 59,162,241, 83, 22,226, 38,184,102,136,133,138,189,165,200,
+ 90, 63,114,183,214,219,236,242, 28, 74,237,139,172,154,138,102,188,125,177, 78,117,176, 70,163,171,202, 39, 77, 57,223, 51,198,
+205, 18,213, 41, 17,113,139,184,239, 85,201, 43,196,149, 63,246, 46, 95,168,225,149, 34,138,218,196,107, 27,148,163, 97,128,142,
+112, 79, 71,190,104,248,133, 8,197,146, 88, 92,166, 53,188,102, 65,153, 51,203,188,232,250, 94,114, 33, 66,213,213, 59,245, 90,
+140,182,218, 5,215, 99,251,112,153, 47, 2, 99, 88,205, 48, 15, 16,153,123,181,122, 65,108,180,196,212,222, 43, 80,115,139,149,
+164, 87,173, 7, 91,102, 61,117, 55, 43, 19,132,197,248,116, 37,223, 58, 20,132, 66,250, 65,169,173,252, 5,173,132,196, 86,225,
+146,175, 11, 7,229, 95, 72,212,129,107,209, 50,151,123, 25,199,234, 95,173,113,223, 3,247, 38,228, 81, 99, 95, 11, 16,141, 48,
+118, 23,254,159, 11, 49,164, 88,241,232,233,229,191,139,197, 22, 61,160,106,125, 36,177,179,122,193,178,194,130,171, 50,159,254,
+ 85, 71,210,106,207,255,246, 5,149,245, 58, 1,194,101, 92, 3, 81, 8,208, 35, 43, 86,242, 19, 98, 47,180,245,118, 20,255,254,
+135,142, 93, 42,181,208, 43,200, 40, 98,126,118, 74,220, 72, 48,211, 17,229,120,140, 43,230,172,237,238,224,170,138,179,167, 62,
+205,200,122, 34,227,188,114, 20, 78, 82, 57, 75,101, 64, 19, 49, 9,214,178,188,178, 84,120, 53,124,105,161,157, 68,164, 69, 69,
+183, 17, 17, 1, 89,101,233,181, 98, 38,185,102, 84,104,146, 72,210,140, 35,140,117, 84,214, 50, 41,189, 77,184, 23, 73, 90,177,
+ 66, 74,201,172,212, 94, 20,231, 96,230,160, 21, 43, 58, 82, 50,169,204,226,153,239,196,134,180,208,108,181, 19,132,131, 70,179,
+ 65, 62, 27,227,240, 65, 48, 50,248,222,107,103,165, 16,254,226,247,110, 28,223,212,152,160, 19,145, 44,221, 30,181,199, 93, 5,
+122,156,146,171, 92,135,149, 52,196, 5, 18,121,153, 78, 87,183,239, 54,232, 3, 34, 41,137,219, 23, 40, 77,147, 68,194,173,155,
+ 87,137,163, 22, 81, 44,185,246,244, 53, 46,191,238, 10, 55, 95,184,197,237,231,166,172,111, 52,185, 59, 60, 96,187,117,129, 36,
+138,169,108, 65, 20,181,169,178, 41,231,186,231,232,181,218, 92, 61, 57,230,202,198, 5,158, 59,122,158,102,220, 98, 93,173, 83,
+ 70, 67,210,124,194,102,123,141,110,209,231,180,186,131,118, 9,214,141,105,169,136,185, 24,210, 80, 17,133,201, 24,229, 35,226,
+ 72,145, 22,217, 98, 21,150,155, 2, 37, 19,156,209, 24, 83, 33, 77, 85,162,136, 56,184,118, 13, 57,205, 24, 94, 63,225,129,115,
+155,220,124,233, 6,141,214, 58,211, 89,206,241,141,103,232,109,157,167,209, 94,103,120,114, 6,202,210,110,245, 72, 7, 35,122,
+155,107,168,164,233,119, 48,147, 49, 81,220,164, 42, 38, 24, 36,210,142,136, 90,219,216,106,200,165,215, 60,196,254, 75,207,210,
+104, 75,242,172,100, 54, 58,225,161,199, 47, 35,101,151,225,237, 23,216,186,244, 8,163,207, 62, 67,235,254,203,232,170,128,201,
+140,252,165,107, 28, 62,245,251,220,121,233, 21, 62,251,204,203,252,254,173, 35,158,186, 51, 96,239,120,198,151,189,255,131, 60,
+249,216, 91,248,135,239,251, 50,110, 94,127,153,131,235,183,200, 39, 83,239, 44, 85, 48,220,187,203, 83,127,249,131,124,240,130,
+226,223,127,236,223,147, 78, 14,217,217,222,224,190,203, 15,240,153,143,255, 60,235,253, 62,217,245,231, 60, 84, 69, 23, 76,143,
+143,168,102,115,230,179, 9, 69, 81,112,122,120,202,243,175,220,226,238,241, 25, 42,130,114,150,243, 21, 31,250,122,236,254, 29,
+210,131, 67,242, 91,183,152, 31,159,113,241,139,159, 8,187,214,134,223,215,148,249, 34,169,137,176,139,115,177,132,102, 27,167,
+ 29,218,106, 30,123,224, 34,207,190,241,203,113, 59, 91, 84,211, 49, 85, 58, 69,151,153,231,173,151, 5,166,204,208,101,133,173,
+ 74,140,174, 48,186,240, 96,150,192,102,118,214,248, 52,170,224,145,117,206, 82,101, 25,241,214, 14,195,223,252, 21, 84,183,231,
+245,131,113,128, 85,216, 80,165,134,135, 58, 74, 98,159,242,132, 92,228, 12, 75,225,169, 70,204,167,100,211, 9, 73,163, 65,210,
+106, 81,164,211,144, 86,232, 80,177,164, 42, 53, 85,154, 47,226, 39, 87, 34, 71, 66,214,113, 56,254,234, 44,238,197,235,198,136,
+ 70, 11,209,106, 33,122, 93,108,156, 64,162,112,173, 6, 86, 70,184, 72,225,162,196, 23, 70,205, 6,178,213, 36,218,222, 70, 94,
+186,140,120,232, 65,120,221,227,240,192,195,208,237,133,203,192,248,215,104, 52,252,223,173, 70, 8, 88, 9,201, 91,217,204,191,
+ 23,233, 12, 38, 51,152,167,216, 34, 71,151, 26, 83, 86, 56, 93, 98,139, 18,157,166,148,211, 9,217,100, 68,122, 54,160, 24,142,
+201, 38, 19,178,233,140, 98,158, 82,204,198,148,179, 9,182, 44,176,198,132, 34, 65, 47,146,188,238,133, 22,189,234, 66,175,163,
+ 67, 3, 84,102, 57, 79, 95, 13,104, 97,249,172,120, 78, 37, 14,187,180,223,184, 85,155,217, 42,135,221, 45,253,183,238, 85,123,
+245, 21, 65,158,171, 71,146,172, 16,252,238,217, 17,172,196, 12,200,165, 18,216, 11,178,196, 50, 62, 97, 53, 28,190,222,103,174,
+ 40,221,197, 74,222,118,125, 24, 47, 46, 68, 37, 22,136,218,218,206,182,240,235,215,138,102,231, 67,107,235,139,123,153,191, 80,
+ 23, 33, 75, 4,173, 53,238,222,220,237,216, 23, 23, 62,115, 69, 18,239,190,198, 11,209,176, 1, 40,227, 49,168, 11,124,180,211,
+247,238,214,235, 64,116, 17,135, 46, 62,120,215,195, 40,222,233,106, 37,129,200,248, 98,218, 89,156,214, 56,157, 7,199,141, 47,
+ 22, 69,146, 44, 68,112, 34, 82, 8,153, 4, 66,173,170,201, 58, 75,210,160,138,189, 18, 94,197,136,196,139,227,234,157,177, 16,
+ 50,140,152, 3,119,195,225,225, 51, 82, 97,138, 2,148, 68, 41,137,144, 80,206,102, 76,143, 14, 80,145, 64, 24,235, 45,113,211,
+ 33,195, 91,119,169,132,244,195, 41, 39, 60,209,209, 41, 78, 43, 1,113, 68,102, 5,149,119,130, 3,206, 3,157,128, 88, 9,148,
+ 16,196, 2, 26,145,164,211,136,208,218,175,254,180,133,139,221,132,134, 16,228,149, 33,215,134, 94,162,216,108, 69,180, 27, 49,
+149,129, 73,161,201,141,199,188, 74,130,109, 95,192, 76,107, 78,178,140,147, 52,227, 44,173,184, 58,158,147, 11,255,251, 40, 80,
+ 12,211,140, 82, 40,156, 74, 32,104,138,164,106, 32,101,200,140,176,254,121,169, 81,198,118,213,126,184, 80,200, 47, 81,199,102,
+ 37,179,120, 73,175, 92,113,158,172,232, 53,234,211,204,215,164, 33, 73, 79,248,102, 74,173, 63,194, 99, 95,244, 14, 82, 55,229,
+ 92,191,205,243, 55, 95, 4, 45,177,241,140, 63,250,244,231,216,184, 20,113, 50,191,203,100,150,210,111,244,112,210, 50,171, 10,
+246,166,215, 57,156,220,194, 34, 25,228, 3,116,231,152,245,181, 38,163,236,148,146,220, 35,116,197, 1,103,147, 83,250,237,152,
+211,236,132,211,242, 24, 41, 91, 88,171, 17, 56,114,166,148, 85, 70, 97,166,104, 91, 48, 46,207, 56, 74, 79,177,206, 82,154,130,
+169,158, 82, 5,230,180, 20,138,202, 89,162,217,208,155,234,155,189, 14,179,129, 64, 61,126, 63,167,198,146,116,122,204,166, 19,
+ 98, 37, 48, 66, 50,184,245, 50,141,254, 46, 73, 34, 40,178, 20,129,101,255,165,103,217,186,255, 62,242,249,136,206,218, 38,145,
+136, 16, 18, 42,157,129,104, 50, 62,190,203,206,133,139,228,105,151,184, 33,217,186,252, 8,174,180,204,167,167,116,183,118,153,
+156,222, 97,235,226,131,156,238, 93,245, 86,185,163, 9,235, 73,131,106,239, 46,217,205, 59,220,250,244,239,114,182,119,131,105,
+154,243,194,193, 25, 47,140, 39,180,154, 13,186,237,132,195,178,207,103,111,191,204, 7, 30, 95, 99,255,230, 30,113,119,157, 70,
+191, 79,247,202,107,152,238, 93,103, 94,182, 72,183,224, 99, 95,128,190, 56,225, 19,191,254, 59,188,229,173, 95,195, 89, 10, 31,
+253,215,255,156, 23,238, 92,231, 31,124,219, 71,120,219, 23,191,149,215,189,245,113, 68,175, 67,239,242, 67, 76, 39, 41,251,215,
+ 94,226,165, 23, 95,166,181,217, 71,209,100,146,101,188,238,205,143, 32,231, 99,104,247,104, 93, 80,100,131, 1,121,154, 99,187,
+ 61, 95,101,199, 17,152,194,119,233,206,103, 20, 46,124,193, 34,194,234, 20,107, 43,162,107, 47, 35,139, 41,235,189, 38, 7,239,
+254, 70,182,126,237,103,177,183,239, 32, 59, 29,136,194,110, 55, 88,171,108, 61,162, 12, 20,188,186,131,164,102, 34, 91,111,111,
+179, 89, 74,227,252,125, 60,251, 3,223,207, 75,159,250, 35,206,253,173,111,227,202,187,222,229,213,255, 34, 70,200, 10, 41,240,
+ 35,253, 70, 28, 72, 78, 22,225,108,136,237,116, 24,173, 17,198,226,242, 12, 83, 25, 58,253, 46,196, 13,146,102, 68, 85,134,160,
+150, 58, 22,209,249, 49,178, 92,216,127, 2,235, 60,164,152, 73,165, 60, 50, 54, 4,210,248,145,173, 32,106,198,184, 74, 34, 90,
+ 94,188, 38,164, 66, 54,125,162, 91,212,246,137,103, 72,225, 69,105, 81, 4,221, 53,239, 13,143,130, 82,189,242, 99,121, 4,126,
+134, 40,228, 82,229, 98,131,126,161,204,161,200, 96, 58,135,217,204,255,217,202,202, 91,239,194, 62, 91, 23,165, 7,134, 24,139,
+169,252, 42, 1,107,194,127,107,108,101,124,151,222,106, 83, 21,254,242, 74,218,221,176,143,175,115, 37, 3, 75, 61,176, 18,254,
+107,234,119, 55,155, 32,218, 93,223,112, 5, 98,154, 91, 97,161, 72,193,138,112,109,165,235,116,120, 76,112,232,209,189, 32, 42,
+168,214, 9,226,184,122, 87, 29, 52, 93,102,201,210,172, 67,207,238, 25,173,215,161, 21,132,247, 77,172,122,228,101,184, 72,238,
+217, 61,251, 46,167, 62, 20,197, 34,219,244,222, 96, 23, 27, 82,197, 22,197,128,242, 57,227, 43,243,120, 86, 34,179,131, 6,196,
+219,215, 68,180,140,198, 18, 44, 11, 53, 33, 86,208,236,181,175, 61,164,124,121,229,248, 82,208,167,154,155, 88,151, 33, 85, 17,
+188,240,154,205,175,253,190,197,196,167,142, 90, 22,171,217,176, 11,122,207,189, 69,205, 50,204,197,250,145,187,144, 1, 6,164,
+125,231, 45, 20,198,152,165, 87,111, 97,177,243, 69,128,167,198, 73,164, 82, 88,161, 16, 90,250, 11,182, 38,245,213, 34, 60, 43,
+188,160, 79,184,133, 61,205,163,121,189,174, 70, 58,131, 12,211,131, 5, 61, 14,139,211,126, 31, 47,132,243, 42,251, 56, 33,233,
+116,152, 28,221, 33, 43, 75,210,241,152, 43,175,221,161,209,223, 34, 59,218,231,100, 86, 96, 81, 20, 56,230,218, 82, 74, 73, 20,
+197, 20,149,163, 20, 17, 22,131, 14,116, 0, 21,169, 69,184,137, 18,146, 86, 92, 71,221, 66, 39,137, 40,141,161,212,134, 43,253,
+ 38,177,148,100, 84,228,198,208,111, 70,228,218,127, 47, 51,109,130,130,193,209, 75,212, 50, 51, 29, 47,176,203,173,163,112, 14,
+109, 29, 36,130,216, 74,102,133,215,184,216,134, 96, 51, 73, 88,143, 37,202,106,154,145,247,249, 23, 69,142,214,118, 65, 88,174,
+141, 10,139, 28,245,224,250,112,117,114,224, 74,177, 42, 86, 92, 38,171, 25, 67,220,155,113, 20,214,239, 53, 45, 49,172,188, 2,
+ 94, 22, 7,231,158,252, 42,158,254,204, 9,187, 27, 91, 60,253,242,211, 72,169, 56, 60, 61,224,190,139,231,184,212,234, 50,216,
+155,208,109,198,156,140, 79, 57,191,118,129,146, 25,155,231,123,156, 93,135, 70, 35,102,156,142, 56, 43,142, 40, 15, 54,112,149,
+101, 80,206, 41,117, 65,212,156,161,138,132,204,206,168,102, 57, 39,243, 9,141,168, 69,166,231,180, 84,147,202,165,160, 65, 59,
+195,221,233, 49, 56,168,156,161, 52, 25,177,146, 20, 90,211,138, 19, 4, 21, 70, 84,148, 53,249,220, 89, 15, 51, 25,221,184, 78,
+235,171,223,205,253,207,190, 76,222,104,240,216,249, 38,179,179, 33,221,205, 62,136, 45,140, 43,169,138, 9,186,204,104,117,214,
+ 41,210,130,141, 75,247,209,104,119,104,118,214,177,149,163, 44,231,200,188,203,228,108,204,206,149, 29,142,111,237,211,236, 14,
+233,110,236,146, 52, 55,153, 12,166, 76, 15,175,178,125,229, 10, 14, 69,123,253, 28, 88,203, 99,239,252, 26,108, 62, 36,217,185,
+ 8,101, 78,126, 58,226,238,211,159,101,112, 50, 96,154,101,236,141,166, 12,203,130,172,210, 76,202,130,191,253,129, 15,242, 83,
+ 63,247, 75, 60,152,192,241,100,138,222, 19,116,183,182,105,245,214,176,191,255, 27, 72,213, 97,247,225, 39, 56,219,252, 19,252,
+232,163,159,231,103,204, 19,220,185,117, 72,210,123,158,119,189,253,113, 94, 28, 31,112,119,127,196,159,255,251,255,146,203, 79,
+ 60, 76,188,242, 6,223,247,214,247,240, 37,192,123, 7, 39,252,221,111,249, 86,230,243, 57,198, 90, 62,252,157, 31,192,124,254,
+115,168,221, 93,100,163, 67, 99, 83, 16,175, 85, 36,189, 62, 20, 97, 84, 55, 43,252,152, 79, 91,127, 40,135, 67, 72,103,115,152,
+205, 17, 78, 96, 7,103,116, 47,158,131,193, 20, 51, 50, 28,127,217, 55,177,246,111,254, 30,241,246, 38, 98, 52, 10, 29,191, 12,
+126,111,150,144, 10,235,194,120, 93, 4,167,156,195, 22,133,247,124, 54, 26,252,220,123,222,203, 90, 35, 98,237,194, 6,255,247,
+207,254, 10, 63,244,103,191, 30,115,122,230, 31,230, 88,162, 98,133,212, 6,147,168,240, 0,175,140, 63,157, 65, 23, 21,107,253,
+ 14, 85, 81,178,182,189, 73,231,220, 57,140, 21, 68,113,228, 47,196,164, 5,162, 68,151,245,132,160,134,110,172,124, 88,234,147,
+ 91, 9,132, 86,139,241,165,140,226, 5,133, 43, 74,154,168, 36, 65, 37, 9, 50,248,190,101, 20,249, 14, 93, 37, 75,184, 75,187,
+179,100,247,231, 83, 47,154,187,231, 54, 9,159,212, 34,243, 95, 83,148, 30, 62, 84,105,152, 76,176,101,133, 77,115,156,112, 84,
+243,148, 50,203,112,214, 83, 96,116, 81,121, 97,116, 80, 50, 43,165, 48,198,171,222,141,241, 17,171, 78, 72,172,174,136, 34,181,
+136,180, 92, 28,202,212,133,150, 89, 26,190, 95,221,169,223,185, 13,157, 30,206, 26,170,249, 28, 91,102,247,228,140,227,196, 2,
+120, 33,156, 93,168,225, 17, 46,188,239,158,233,238, 86,253,229,181, 42,222, 9,132,114,139, 46,218, 31, 92, 98, 49,210,182, 97,
+ 55, 88,119,208, 82,137, 16,142, 97,125, 76,234,202,253, 37,213, 42,212, 35,236,244,195,228,102,209,129,215,162,203,154, 45, 47,
+ 87,252,236, 44,253,226, 30,232, 97, 3,143,124,165,243, 95,168,216,195,234,160,170,131, 92,196,189, 63, 87,134, 92, 22, 89,119,
+226, 75, 49, 32, 34, 20, 50, 17, 11, 53,180,138,194, 26, 66,168, 32, 78,247, 47,210,125,226, 93,248,176, 80,185, 28,187, 59,231,
+ 71,239, 53, 3,126,113,233, 23,222,173,178, 96,196,251,157,185, 80,202,231,177,107,141,171, 10,255,157,137,226,149, 56,103,229,
+197,111, 97,244, 47,149,192,234,192,153, 8, 23,180,139, 20,194, 69, 62, 48, 72,249,239,157, 53, 25,113,179, 7, 42, 70, 38, 13,
+ 28, 42,112,230,141,255, 6,184, 42, 8, 22, 67,212,106, 20,121,178, 31,222,207,174,211, 12,149, 52,112,206, 81,149, 37, 73,103,
+141,108, 52,192,204,230, 88,163, 73,250,235, 36,253, 13, 78,126,251, 55,104,196, 49, 69,102, 73, 34,137, 17,146, 84, 59, 90, 74,
+ 34,132,229, 44,215,200, 40, 66, 25, 19,224, 63,126, 63,175,132, 67, 69,138, 72,107, 98,229,255,108, 74, 9,250,205,132,105,174,
+233, 55,125,146,229,225, 84,179,221, 78, 48, 22,182,154, 17,198, 25,122, 66,161,132, 47, 26, 11,227,200, 42, 75,105,125,215, 46,
+125, 29, 67, 67, 73, 34, 33, 49, 14, 82, 99, 57,152,103, 92, 94,107,251,145,186,112,164,101,137, 18, 80, 86, 26,105, 42,156,173,
+130, 81,193,221, 19,141, 84,135, 29, 45,215, 76,203, 26,203,203, 20,195, 12,177,174,235,196, 50,138,184,166, 19,218,160,150, 95,
+ 72, 51, 88, 41, 4,156, 23,148, 70, 74,112,124,144,147, 52, 18, 94,190,181, 71, 83,180,233,118, 36,243,114,196, 31,190,112,200,
+206,198, 14, 27,221, 54,103,217, 25, 13,209,230,230,240, 54,165, 26,240,112,231, 60,183,103,119,216,181,231, 56,206,206,120,160,
+115,153, 27,195, 61,118, 91,235, 76,138, 33,153,206,200,210,148, 88,120,254,192,116,182, 79, 35,234, 80, 21,158,243,146,153,156,
+ 72,106,166,186,164, 29, 65, 34,125,228,121,105, 50,180,179, 76,179, 10, 37, 20, 78, 91, 42,163,177,133,159,187,106,103,137,148,
+ 4,155,192,214,133,243, 28,221,218, 99,242,210, 29,204, 96, 72,235,145, 71, 25,220, 25,210,234, 40,226, 40, 33,138,219,224, 44,
+113,179,203,240,240,132,179, 59, 47,114,254,161, 7,144, 81, 66, 57,159, 97,172,160,211,239, 97,157,160,127,238, 62,108, 81,210,
+238,172, 49,184,123,151,141,139,175,161, 42, 44,197,124, 64, 89, 76, 72,218,109,146,246, 54,201,100,202,225,237,231,120,104,253,
+109, 20,147,129,135,126, 88,199,228,115,127,200, 44,157, 49, 76,125, 64,199,184, 52, 20, 70,147,196, 17,178,178,140,218, 45, 14,
+175,222,162,219, 78,120,230,104,204,238, 44,167,219,122,153, 86, 43,226,116,111,143,167,159,125,153,159,255,229,167, 88,123,236,
+107,120,235, 55,124, 27, 63,252,224,255,199,215,155,135,219,121,221,245,189,159,181,214, 59,236,241,236, 51, 75, 71,131, 37,121,
+146,226, 33,142, 29,103, 32, 36, 77,194, 12, 33, 55, 12, 33,185, 52, 4, 66,128, 2,133,134,161, 64,128, 66, 9, 5, 2,148, 66,
+105, 33,109,161,132,249, 50, 93,232, 45,195,101, 10, 16, 39,220,140,144,216,177,157, 56,150, 45, 89,211,209,145,206,180,231,253,
+ 78,107,232, 31,107,237, 65,208,139,159, 71,126,100, 89,218,103,159,173,247,125,215,111,248,126, 63,223, 38, 91,171, 13, 30,254,
+130, 87,226,146, 26,127,242,219,127, 70, 81, 20, 60,240,210, 23,209,239,142,105,183, 83,116, 94, 80,159, 12, 16,209, 16,150, 26,
+180, 86, 79,240,206, 63,253, 51,254,240, 39,126,144,254,115,151,144,221,125, 70, 85, 69,109, 48, 36,138, 20, 81, 20, 77, 31, 23,
+254, 33, 63,201,102,156,103,103, 42,112, 33, 76,194,104,236,112, 12, 69,142,152,100,208,108,177,127,233, 58, 73,171,137, 80,146,
+229,173,101,170, 55,125, 23,213,125,183,211,248,129,183, 17,109, 29, 71,143, 38,216,209,192,143, 98,101,228, 71,239,214,224, 74,
+141,209,214,243,160, 91,109,100,163,197,213, 63,248, 93,254,246,167,222,205,198,198, 50, 29, 33,248, 64, 63,227,159,221,123, 7,
+ 84, 30, 10, 35,140, 63,253, 84, 28,225,134, 19,226,141, 21, 76,222,157, 61,213,189,231,221,146,143,199,156,186,231,118,140,133,
+230,218, 10, 73,171, 67, 85, 22,184,170,192,150, 26,181,188,142,123,246, 25, 84, 44,201,123, 19,210, 86, 52, 59,208,230, 64, 77,
+ 19,132, 61, 17, 82,249, 66, 68, 42,133, 75,107, 68,137, 66,160, 80,177, 64,198, 53,207, 15,136,253,152, 93, 70,177,239,204,229,
+ 20,229, 41,252, 97,109,244,173,170,243,105,110,187, 79,105,240,249,211,163,161, 23,215, 5, 96, 9,186, 64,231, 37,174, 42,113,
+ 86,163,243,146, 98, 48,162,202, 50,191,127, 19,194,219,207,117,232,242, 17,152,105,180,237,108, 68,237,191,158,169, 42,162,180,
+ 65, 20, 71, 1,166, 18,172,108,102, 81,116,245,255,243,207,230, 49, 68,226,163, 62,111, 60,242,167,183, 50,212,103,249, 66, 33,
+ 13,112,177,163, 88,240,163,207,136,165,130, 5, 49,155,152, 5,190, 76,243,218,221,148,143,174,196, 45, 41,100,211,208, 20,235,
+220,156,179, 97, 66,103, 30, 20,197, 86, 51,203, 59,159,109, 23,229, 66,209, 68,176,183,201,133,233,130,195, 39,220, 45, 40,138,
+103,226, 60,231, 64, 59,127,249,235,176,134, 49, 94, 43,160,166, 54, 56, 53,215, 8, 76,233, 93,179,188, 37,233, 47, 1, 27, 42,
+ 10, 37,231, 10,114,107, 29, 24, 57,243,233,251,213, 67,215, 23,149, 10,176,146,218,169,251, 16,210,122,114, 28,229, 2,112,102,
+ 65, 8, 63, 3,198,216, 57, 50,214, 84,158,117,175,226,192,111,159, 11, 9,173, 45, 17, 34,194,149,102, 14,181,178, 97,183,110,
+188,128, 85, 37, 45, 28, 5, 66, 58,156, 86, 56,109,144, 50,242,121,242, 98,154, 55, 56,125, 61,135, 20,102,193,129, 35,131,192,
+112, 62,202, 17, 73,125,129,132,167,231,218, 3,231, 16,170, 49, 31,255, 75,168, 47,175, 19,199,146,124, 84,160,226, 24,198, 3,
+134,219, 55,232,149, 26, 43, 35,191, 47,151,142,220, 69,232,202, 18,167, 9,185,182, 68, 18, 98, 68,200, 50,247,215,131, 18, 30,
+ 48,227,163,142,161,158, 42, 98, 41,208, 56,142,182, 19,234,113,196, 48, 47,103, 87,126, 35,241,154,154,186,138,200,141, 97, 92,
+106,202, 80,116,233, 48,234,169, 69,130, 56, 92, 95,169, 18, 24,103,200,180,191,224,163, 52,226, 48,171,136, 5,228, 38,102, 45,
+ 86,180, 2,176,221,184,202,251,214, 3,105,208, 5,218,219, 44,161,109, 97, 26, 53, 29,175, 79, 47, 90, 37,230,178,159,169,222,
+196,136,133, 24,231,233,118,244, 22,184, 83, 16,150, 34,194,202, 32,194,104, 77,169, 35,138,162,139, 41, 7, 28, 89, 63,202,167,
+ 47, 92,100,167, 24, 19,197, 17,189,237, 17,141,184,201, 65,126,200,177,246,109, 12,139, 1,153, 45,248,205,143,125,138,251,150,
+ 79,241, 76,247, 34,107,245, 37,174,101,215, 24,150, 61,238, 94, 57,193, 39, 14, 62, 21, 4,121, 48, 98, 68, 74, 68,110, 10,172,
+179, 36,145, 79,246, 76, 4, 12,245,152,126, 49,228, 96, 82, 81,186,138,202, 24,140,211, 62, 91, 37, 76, 63,141,177, 84, 97,245,
+227,107, 24, 73, 20,213,234, 36,173, 14,229,224,144, 43,195, 49, 15,189,250,126, 50,149,160, 79,220,142,123,246, 6,186,214, 66,
+132,253, 72,146,166, 68,178,134,147,251, 28,189,243, 12, 73, 99,131,253,203, 79,209, 57,122,156, 90,125,153,170,208, 12, 15, 15,
+ 80, 82,120,224, 76, 93,209, 62,245, 60,250,123,123,228,131, 93,214, 78,220,201,201,123,238,231,242,227, 79,240,212,163,127,201,
+201, 19,171,188,228,141, 95,195,185, 87,126, 57,253,203,159,196,140,115,202,113,206,120,255,128, 43, 79, 62,197,225,120,192,193,
+254, 33,131, 50,103, 80,148,196, 74,208,232, 28,225,129, 7, 31,224,145,103,119, 73,149,100,167, 63,164,159, 21,108, 31, 60,193,
+111,252,197,223, 51, 78,143,241,186, 47,123, 51,223,245, 31,190,131,123,206,110,208, 73, 43,218,107,203,172,222,113, 39,221,222,
+136, 63,255,173,247,240,161, 79, 94,225,101, 15,223, 71, 90,143,113,198,144,141,115,100,145, 33, 6, 87,161,101,161,170,225, 84,
+142,115, 9,175,251,222, 31, 97,231, 55,222,137, 25,143,105,108, 30, 69, 74, 65,209,237, 98,178,146,165, 19, 71,125,119, 56, 21,
+194,184, 0,159,176,102, 94, 78,230, 25, 54,207,124,245, 20, 75,210,187,110,193,120,236,186, 0, 0, 32, 0, 73, 68, 65, 84,231,
+230,239,254, 9, 13,235,168,199, 49,101, 81, 48, 92,170,179,243,201,231, 40, 63,231, 45,172,109,172,176,249,165,175,162,246,217,
+175, 32, 58,117, 26,217,244,140,117,132,194,150,154, 98, 60, 98,124,254, 89, 14,254,239, 63,228,153,247,254, 61,153,181,140, 86,
+150,200,242,146,103, 5,244, 39, 57,175,249,234,255,147,236,224, 0, 89,171,251,231, 69,161, 17, 88,186,215,118,184,240, 7,191,
+199,139,222,254, 93, 20, 87,175, 99,180,193, 24,131,173, 42,116, 89, 82,140, 15, 81,241, 41,154,235,235,168, 90,221,143, 55, 99,
+201,112,231, 10,107,119, 63,196,232,195,143,208,238, 52,217, 62,127,157,187, 94,124,123,248,182, 13, 50,142,112, 24,223,149, 76,
+ 91,192,192,232, 86, 82,162, 34,137, 74, 18,127,115,138,200, 19,222,162,196,251,203,147,122,160,186, 45,140,209,179,114, 14, 22,
+ 55,118,154,118, 17,252,193,118, 54,214,245,128, 29,129,155, 76,176, 69,233,247,101,149, 14, 65, 28,134,170,204, 41,122, 3,116,
+145,161,203,210,247,175, 50,128,102, 8, 73, 91, 82,205, 19,212,132, 64, 88,235, 59, 52,225,225, 70,126,191,237,102,118,153, 91,
+128, 37,206,254,111,187,116, 0,145, 68, 33, 56, 2, 62,253,159,255, 45, 22,129, 13,233,116, 76, 21,238, 51,248,203, 66,224,234,
+ 84, 28, 55, 13,242, 17,139,196, 26, 66,124,173, 8,135,158, 8,231,123, 16, 13, 89, 23,114,161,153, 91,215,194, 81,162,194,193,
+ 61,221, 47,206, 4, 93, 11, 84, 60,187, 0,163, 89,100,219, 76,235, 8,177,112, 6,185,185, 64, 58,124, 54, 83,245,114, 72,156,
+179,115,213,252,220,202, 23,188,233,193, 90, 39,167, 80,153, 89,252,219, 12,153,227, 99,131, 67, 11,229, 66,170,220, 52,254,213,
+ 91,251, 2,149, 78,250,244, 54, 41, 36, 66, 89, 58, 47,123,227, 34, 40, 63, 28,232,225,157,171,152,121,230,173,157,171, 1, 77,
+ 1, 85,129,195, 34,226, 26, 78, 23, 51, 69,188, 51, 57, 18,111, 87,171,198,125,100, 92,247,201,107, 81,226,247,238, 42,242,207,
+128,164,229,143,237,170, 64, 36, 49,198, 22,193,153, 81,120, 44,236,116,237,226, 34,172,214,200, 40, 37, 80,240,195,161, 31, 68,
+132,214,204,175,161,176,135,183,101, 17, 10,175, 96,159, 11,145,214,214, 58,140,113,168,122, 13, 83, 20, 8, 83,146,245, 71,216,
+201,132, 73,111, 68,174,167,133,176,194, 25, 65, 81, 84,244,181,165, 29, 37,224,160,172, 12,113, 44,105, 36, 49,218, 24,198,133,
+247,213, 79,180, 37,150, 98, 6, 8,170,165, 10,133,163, 59, 49, 12,243,146,103, 14,199, 28,105,213,168, 41, 73, 86,105, 98, 33,
+136, 35,191,207,157,186, 54, 34, 37,168, 41, 57, 35, 46, 24,235,125,228,131,210,160,132, 36, 17, 6,129, 99,162,253,232,219, 24,
+195, 70, 77, 35, 19, 73,229, 52,202, 86, 36,104, 18,233,119,251, 46,172,149, 28,238, 22,160,145,148,129,237, 62,195, 48,135,221,
+249,172,250, 20, 11,181,147,152,137, 79,253,170,200,139,225,212, 2, 29,194, 3, 1,189,232, 78, 37, 45,162,219,223,196,181,107,
+ 87,232,222,232,114,249,234, 33, 71,214, 45,203,109, 47,180, 60, 63,188,201,158,174,184,187,125,156,220, 76,120,114,255,105,182,
+106,109, 70, 85, 73, 39,142,120,162,247, 44, 27,201, 38,221,226,128,161,169,184,163,189,204,249,193, 83,172,197, 75, 92,201,111,
+ 18, 9,133,115,130, 74,120,135,203,196,102,148,165, 14, 86, 80, 67,169, 43, 74,167,209, 70, 83,216,146, 72, 56,148,242,137,121,
+214, 58,132,172, 16, 83, 43,116,104,172,192, 17, 57, 32, 27,244, 64, 43,170, 68, 48, 41, 43,246,175,108,147,212,234,108,156, 62,
+193,222,238,136,113,211, 11,178,138,137,164,209, 89,103,121,115, 11, 93,120,117,118,218, 94,101,220,219, 39, 45, 75,132,104, 16,
+215, 83,116,153, 35,165, 64, 53, 36,181,198, 10,217,184,162,177,182, 70,150,229, 60,247,222,191,230,255,120,251,143,240,198, 59,
+ 94,112,203,195,176, 42,251,228,189, 67,204, 96, 64,111,152, 49, 28, 15,233, 29,118,153, 88,203,165,222,136,205,102, 13, 45,224,
+ 35,187,187, 52,151, 82,218, 43,235,220, 28, 25, 12, 57,215,171, 9, 63,246,182,111,231,181,223,248, 54,146, 68, 17, 71, 5,163,
+254,136,126,111, 72, 73,141,246,201, 19,244, 7, 99, 46, 62,126,158,229,186,224,193,187, 55, 57,186,182,140,176, 37,217,104,194,
+ 48,207,104, 79, 6,180,237, 5, 88,189, 23,198, 35, 40, 13,178,115,198,167,228,188,241,109,240,200,239, 64,187, 1,237, 37,210,
+ 56,166,251,196, 69, 58,175,120, 0,198, 19,175, 4, 17,248,177,180,214, 97,206,104, 65, 87,232,241, 48,124, 22,117, 76, 94,145,
+ 30,221, 32,115, 48, 44, 42, 70,189, 9, 53, 41, 88,170,199,196,245,132,201,198, 18,187, 10,250,191,251,151,216, 95,248,127,136,
+ 87,188,160,108,255,112,192,110, 85,177, 12, 68,206,145, 72,129,109, 55,232,119,218,116,139,146, 65,169, 61,244, 54, 82, 60,124,
+114,139,250,242, 42, 21, 2,167, 60,100, 98,202,175,190,237,246,187,121,231,247,255, 59,142,189,248, 65, 86, 30,120,152, 73,111,
+132, 45, 11,116,165,105,180,106, 28, 94,185,204,243, 62,251,179, 64, 58,226,102,155,114,212, 39,109,164,244,175,239,176,113,231,
+ 41,132, 84, 94,120,110,133,199,101,138,185,154,218, 25,188, 71,125,225, 0, 82,113,130,177, 6, 21, 53,124, 28,173,246,118, 48,
+ 31,124, 17,251, 81,123, 28,133, 49,189,245, 35,246,105,239,175, 75, 31, 93, 25,120,230, 82, 4, 4, 41, 18,148, 64,143,198,179,
+192, 17, 33, 5,182,204,209, 89,225, 71,204, 74, 80, 78,114,202, 81, 31,147, 23, 88, 93, 98, 75,237, 35, 57,162,200,163,119, 69,
+ 24, 97, 91,139,139, 21,210, 5,245,172,243,176, 17, 57,245,177, 6,181,143,147,206,227,111, 23, 15,115, 59,133, 89,252,227,125,
+250,212,206, 38, 34, 69,213,235,205, 14, 25, 33,194, 3, 8, 55, 31,185,179,216, 96,139, 91,226, 73,165,243, 15, 40, 25,162, 62,
+ 23, 23,130, 83, 70,186, 91, 32,156, 79,107, 0,187,128, 83, 21,179, 67, 59, 8,211, 66,170,153, 8,103,158, 13,175, 51,141,158,
+ 12,122, 48, 66, 72,152,255,117,237,110, 25,221,207, 87,208, 33,198, 85,204,167, 1, 98, 65, 77, 44, 52, 16,205,225, 57, 78,134,
+105, 67,168,217,166,224,152, 41, 38,150,120,170,213, 80,200,116, 3,103,199, 56, 61, 14, 62,125, 49, 83,146,251,142,213,175, 64,
+166, 54, 56,172,163,245,208, 23, 45, 88,217,220, 2, 52, 38,154, 23,223, 51, 36,112, 8,224, 54,193, 90,103, 23,132,159, 50,242,
+ 5,162, 13,172,246,217,247,171,103,108, 6, 33, 20, 78, 9,148, 51,254,112, 87,137,215, 93,136,224,146, 48,102,238, 62,176,115,
+ 65,164,191,204, 42, 36,177, 47,214, 45, 97,183, 46, 17, 70, 5,141,138,197, 57, 63,157,179, 86, 35,130, 93,212,123,211,141, 47,
+224,164, 68, 56,131, 43, 11,207,133, 16,130,214,114, 11,138, 9, 66, 42, 42, 11,149, 19, 72, 33, 73, 34, 5,202,162, 43,199, 40,
+ 43, 64,137, 16,207,224,104,165, 49,227,202, 97, 38,150, 72, 74,143,122,181,130, 72, 40,180, 55, 31, 16, 71,146,205,102,202,167,
+246, 70,156,234,212, 56,177,220,160, 55,174, 40,181, 65, 59, 40,171, 18,171,125, 6,123, 25, 0, 78, 94, 32,234,175, 20,141, 69,
+135,172,115,132, 13,162, 61, 75,174, 29,101,170, 80, 73,194,164, 48,140,157,162,150, 72,150, 27,117, 98,107, 16,182, 2, 91,249,
+189,121,136, 28,182, 83, 74,156,155, 23,198,114, 86, 24, 65, 36, 4,122,150,238,182,224,128,112,211,214, 93,206,215, 65,161,192,
+150, 66, 32,164,194, 90, 75,218, 57,194,218,171,191,149,157, 27, 41,227,124, 64,205,246,232,246,174,243,188, 83,183, 83,230, 17,
+ 39, 78,172,178,115,179,207, 75,206, 62,143,237,253, 62,191,251,236, 71,233, 87, 19, 16, 17,253,114,192,233,230, 73,127,201,197,
+130,189,114,159,187, 91,199,185, 52,222,161, 19, 43,210,200, 81, 34, 48,182, 34,145, 17,145, 18, 20, 38,199, 57, 67,102, 10,154,
+202, 48, 40, 50, 34,169,208,182, 10, 79, 67,175,251, 41,173, 65, 27, 59, 43,250,116, 32, 35, 10, 4,149, 53,179,130, 38,202, 6,
+ 61,146, 36,165,146, 57,182,148,196,175,126, 21,247, 28,222, 96,188,115,192,176,236,226,154, 45,170, 68, 18,199,117,146,218, 50,
+ 68,222,214, 20,165, 41, 7, 23,182, 73,234, 19,234,173, 13,172,213,104, 3,217, 96,224,171,221,162, 79,123,125, 9,235, 34,138,
+236, 38, 73, 45,230, 21,111,254,118, 58, 91,103,124,184,105, 85,248,221,149,113,168, 52, 37,138, 35,138,124, 76,118, 99,151,253,
+237, 29,114,173, 73,155, 13, 14, 15,187,108, 53,106, 44,181, 83, 62,252,236, 21,254,228, 23,254, 11,159,250,244, 14,247,223,113,
+140,139,103, 31,230,205, 95,248, 48,111,252,174, 31,196, 53, 20,213,184,139, 41,115,118, 46,222,160,215, 47, 72, 91,109,150, 87,
+150, 57,236,246,201,187,125, 46, 95,188, 64,163, 94,227,182,141, 22, 27, 29,199,104, 48, 33,191,177, 79,111,231, 6,207,151,123,
+208,220,135,218, 50, 90,198,216, 44, 35,121,232, 56, 66, 36,144,180,112, 71, 79,248, 11, 99, 52,128, 40, 33, 43, 52, 43, 83, 14,
+167,158, 70,187,150, 97,222,233, 51,150,201, 51, 92, 81, 16,175, 44,251,155,124,255, 0,171,225,254,175,123, 61,191,244, 99,191,
+204,177,147,171, 28,228, 21, 3, 99, 25,219,156,150,148,104,107, 41, 99, 73,235, 72,135, 78,171,197, 40,203, 72,215,154,136,220,
+112,224, 28, 43, 82,112,169,172, 56, 40, 12, 53,105,168, 43,197,122,228,200,140, 99, 60, 28,241,205,239,252, 30, 38,251, 7, 36,
+107,171,126, 84,133, 67, 88, 75,163,209, 96,112,208,227,243,215,219,252,234,191,249, 25,190,242,251,191,133,206, 61,247, 51, 25,
+ 14, 25,246, 7,156, 58,125,146,209,213, 29,108, 49, 33,105,180, 17, 82,161,179,130,201, 36,163, 49, 25, 67,156,160, 90, 45,234,
+195, 49,253,113, 6, 34,116,157,206, 34,173,131, 40, 4, 41, 74,159,107, 45,241,187,113,101,133, 31,181, 43,229, 71,173,137, 79,
+159, 34, 73, 67, 39, 51, 29,105, 87,254,146,212, 65, 93, 28,194,119, 92,248,255,179,206, 54, 73,160,178, 62, 29,174,172,188, 64,
+204,248, 74, 95, 32,112, 85, 69, 62,202, 48,217, 4, 61, 30, 98, 70, 99,116, 49,241,161, 13, 14,100, 18, 17, 37, 13, 84,163,134,
+178,201, 44, 23,219, 38,113,208, 64,132, 49,188,240, 10, 96,127,215,155, 57, 26,116,202,181,159, 5,114,252, 19,224, 25,103, 25,
+ 93,185,228,195, 60,102,152, 88, 49,239, 18,103, 96,153, 48, 98,118,142,230,177,219, 89,125,254, 11, 89,125,225,139,193, 88, 6,
+ 23,159,162,251,233, 79,145,109, 95,160,234, 30,248,215, 80, 10,129,153, 13, 44, 36,115,111,183, 53,115, 15,187,176, 11, 94,110,
+ 21,210,204, 4, 51,207,248,236,207,203,169,181, 44, 60,229, 2, 74,118, 22,129, 26,102,152, 51,203, 92,152, 18,139,208,109,223,
+114,136, 79,159,162,194, 34, 2,212,221,153,133,213,128, 37, 0, 98,110, 5,127,120,133,187,244,163,123, 5, 34,174,145,172,223,
+141, 25, 95,163,234,143,103,120, 88, 59, 21, 2, 42, 22, 96, 61,222, 58,152, 28, 61,131,170,165,248,199,102,216,167,187,248,214,
+ 50,196, 11, 2,194, 23,173,194, 24, 93,123,149,186,208, 11, 39,128,156,165,170,121, 4,172,245,177,169,214,121,130,101,210,242,
+157,189, 0, 23,213,231, 7,184,138,230,161, 81,206,161,162, 20, 67, 25, 10,223,114, 70, 2, 52, 70, 35, 93,224, 14, 84, 5, 42,
+109,250, 34, 25, 60, 77, 78,120, 94,188,119,146, 68, 30,195,173, 36, 34,173,133,240, 39, 13,198, 33,226, 4,149, 38,216,170,160,
+221, 73,169,183,155,184, 84,210, 47, 52,101, 40,150, 70,218,209,110,198, 48, 42, 61,137, 78, 64, 77,137,128,153,118,164, 9, 68,
+ 70,134,201,143, 37,175, 44, 73, 61, 33,142, 4,163, 66,163, 90, 49,251,131,156, 84, 41,106,145,100,185,150,210,172, 71, 92,233,
+231,236, 79, 42,142,119, 82,138, 10,198, 78, 19, 43, 15,136,242,246, 56, 67, 21, 10,212, 41, 56, 47, 81, 94, 43, 36,164, 32, 22,
+146, 84,249,146,174,176, 22, 35, 19,100,164, 16,210,226,116,137,146, 80,234, 10, 25, 2,174, 92, 40,132,221,130,208, 77,178,112,
+ 95, 45, 28,246, 50, 92, 96,206,134,200, 94, 49,159, 20,205, 24, 1,179,169, 84,132,192, 82, 91, 57, 70,243,249, 95, 67,175,172,
+241,220,197, 30, 42,142, 40, 51,203,181,139, 59, 28, 89, 62,194,242,122,139,235, 59,251, 40, 89,167,158, 26,210,180,197,241,141,
+101,254,205,209,231,113,225,234,179, 92,232,109,115,126,188,205,163,131,167, 40, 74, 67, 28, 69,212,101,141,139,227,109,140, 43,
+185, 58, 57,240,133,183,179, 76, 76, 73,129,183,165,149, 78,147, 72,133, 20,142,189,108,132,113,142, 68, 74, 10, 91,145, 42, 69,
+102, 12,101,101,169, 48,180,226, 4,237, 44, 58, 40,252,149, 20,196,194,147,251,150,146,134,143,195, 45,179, 17,227,222, 77,146,
+ 90,135,102, 99,137, 79,156,191, 66,231,215,254,128,214, 23, 62,204,234,139,158,199,166, 75,136,182,111,114, 37, 54,136,202,114,
+241, 35,239,231,220,203, 95,137, 74,218, 44,109,172, 80, 91,218,162,202, 53, 69, 54, 32, 77, 19,180,171, 51,190,121,131, 56,133,
+246,250,253,244,111,238,115,223,171,191,140,187, 94,254,154,217,216,177, 40, 11,138,220, 43,196,227, 8,204,164, 32, 74,235,216,
+186, 96,210,239, 83, 91, 91,102,120,233, 2, 67,173,217,155,100,156, 94,170,179,223, 27,240, 5, 95,250, 90, 58,155,199,185,187,
+209,225,249,169,224, 45, 95,251,235,168, 78,155, 97,111,143,131,139, 93, 70,253, 1,163, 97, 69,189,179, 74,220, 74,152,228, 5,
+131, 73,142,156,140,217,190,112,141,189,131, 33, 7,227,125,206, 28,107,163,145,236,236,116,185,116,237, 58, 87,119,122,220,251,
+ 57, 91, 56, 21, 51,122,246, 41, 92, 99,137,228,200, 41, 24,236, 65,231,184,127,223,205, 21,191,251,213,134,254,223, 61,198,250,
+131,231, 32, 27,207,163, 19, 69,136,239,180,129, 36,167, 43, 76, 54, 65,198, 10, 81,107, 82, 29, 28, 32,106, 41,206, 22,172,189,
+248, 33,222,252,195,138,119,255,216, 47, 35, 74,195, 94, 44,104,198, 49, 69,228, 11,250,178,240, 54, 19,121,216,163,210,254, 48,
+ 26, 78,253,151, 73,132, 22,126, 76, 55,168, 44, 55, 74, 67, 34, 5,159,113,223,157,124,245, 15,252,107,138,241,144,100,101, 25,
+153,166, 94,224,147, 21, 48,201,169, 73,193,240, 96,143, 19,247,223,205,248, 19,159,230, 23,223,249, 46,190,250,219,191,142,244,
+204, 93, 84,147,156,254,206, 21,198,227, 17, 66,196,200, 56, 66,231, 99,178,238, 1,198, 56,118, 47, 60,197,217,242, 53,190,195,
+142, 36,131,131, 49,213, 48, 71,182, 26,126, 71,171, 75, 80, 53, 31, 60, 1, 62,105, 42,246, 2, 51, 17, 9,159, 93, 30, 62, 39,
+169, 34, 68,156,250, 7, 95,165,131, 61,202,120,236,173, 94, 80, 30, 91,237, 5,135,110,190,199,118,214,226, 38, 25, 14,139, 45,
+253, 68,164,202, 60, 62,215,134,177,165, 45,114,108,158, 97,242, 9,186,219,163,220, 63,164,218,239, 81,105,131,106, 55, 81,173,
+ 22,172,134,131, 47,149, 62,147, 27,188, 42, 63, 18,184, 50,128,125,148,158, 31, 8,129, 79, 62, 79,233,181,243, 93,243, 63,241,
+143,140, 34, 62,241, 67,223,228,209,182,210,239, 89,231,142,238,233,174,219,139,147,134,173, 35,252,230,190,229,198, 83, 7,152,
+ 79,254, 5, 95,124,209,240,166,239,252, 54,142,191,252,117,164, 67,120,238,202, 1, 71, 4,156,232, 12, 57,255,239,191,149,241,
+149, 11,179,192,149,233, 30, 92,132,113,253,148, 64, 71,232, 96,253,200, 59, 28,204,204, 19,135,229, 66,182,186,239,118,152, 45,
+246, 23, 49,173, 44,168,224, 67, 21,177,208,169,251, 52, 55,233,220,188, 75,183,204,137,117, 1, 49, 43, 3, 52,103,166,233,159,
+ 2,103,172,152, 5,189, 76,255, 45, 16, 8, 59, 33,191,249, 40,194, 22, 11,224,154, 69, 78,126, 96,127,199,114,166, 44, 95,255,
+178,119, 4,222,187,143, 94,118, 97, 23,187, 16,121, 51, 29, 61,248,209,185, 84, 80, 45,134,241, 24,132,174, 22, 57,190, 88, 36,
+206, 86,216, 42, 40,104, 84,132,164, 54, 67, 4,169,184, 22,162, 65, 43,255,185, 68, 9,174,200, 17, 88,111, 61,139,162,217,251,
+115, 1, 57,235,117,105,222,199,142,211,179,252, 4,144,222, 57,128, 15,169,178, 65,101, 31,165, 41,149, 46,102,176, 33, 39, 5,
+174, 50,144, 68, 20,253, 67,170, 73,134, 84, 17,122,156,131,174, 40,246, 15, 25,143, 75,114, 20,218, 58, 38, 82, 82, 71,144, 70,
+138, 82,130,214,150, 72,121, 81, 91,101,172, 79, 60, 11,163,231,178,244,211,171,188, 40,193, 70, 84,149,225,202,225,152, 84, 73,
+206, 31, 12,169, 44, 12,243,130,188, 76, 57,179,210, 96,171, 25,163, 29,140,179,138, 72, 66,169, 45, 89,165,201, 45,212, 35, 95,
+ 60, 21,214,206, 70,228,133,241, 48, 25,140,195, 8,141,182, 18, 37,194,116, 64,151,212,141, 34, 21,150,178,178,148, 78,147,134,
+221,143,156,130,118,132,155, 14,154, 66, 81,231,110, 49, 46, 76,119,205, 83,125,138, 96,158, 49, 32,165,152, 23,152,224,139, 78,
+ 28,141,229, 99,172,125,230,183,112, 56,132,231,174,238,121,154,160,128, 74,143, 24,246,187, 28,223, 92,103,235,220, 42, 55, 47,
+ 14,216,186,237, 4,137,108,160, 26, 29,138,209, 16,131,100,167,119,192,185, 7,239,225,206,226, 46, 30,222, 27,145,226,216, 31,
+246,121,102,255, 2,143,236, 61,205,118,214,167, 48,150,152, 9,157,180,134, 82, 30,221,173, 3, 79, 63,215,134, 67, 83, 98,173,
+ 65, 74, 69,170, 20, 19,171,137,132, 96,179,150, 18,219,132, 87,158,219, 68,152, 58,227, 73,201,176,212, 24, 4, 78, 73,246,243,
+130,155,121,159,145,246,230,196,227,173, 51, 68,197,184,192,138, 26,169,148,140,199,125,114, 33,121,233, 15,124, 29,246,137,167,
+ 41, 62,249, 81,220,131,175,166,115,230, 12,199, 14,110,178, 61,233,115,230, 5, 47, 66, 23, 26, 40,104,174,174, 50, 58,232,209,
+191,254, 12,171,167,110, 99,112,120, 19,168, 88, 61,121, 6,107, 38, 76,186,187,124,222,183,253,248, 44, 58, 52,171,124,238,176,
+ 49, 62, 14,213, 26, 67, 81, 57,170, 66,211, 72,155, 68,171, 53,110,124,242, 73, 26,141, 38,119,157, 56,194,222,238, 13,206, 45,
+111,241,200,149,235,152,213, 45,190,241,219,223,206,206,238, 14,173,163, 27,196,245,132,237, 27,123,232, 75, 87, 24,246,199, 20,
+149,161,214, 92, 34, 93,170,211,237, 29,112,216, 29,178,185,190, 70,119,239,128,222,225, 33, 7,251, 93,174,119,135, 92,185,177,
+ 71,167,190,201,126,191,224, 35, 79, 62,199,249,103,158,161,187,115,153, 63,187,222,230, 11, 95,190,133, 56,113,138,216, 88, 38,
+ 7,123, 44, 35,168, 63,224, 15,117,115,254, 9, 92,103,157,201,246, 13,198, 2, 58, 27,235,222, 62,165,148, 63,208,197,162,101,
+197,143,187,165,144,136,122, 11,147,103,216, 60,247, 21,172,209,216,188,224,216,231,188,146, 31,252,202, 55,248,208,154,238,144,
+189, 39,158, 68, 40, 69,125,109,157,165,141, 53,212,164,242, 93,139,115,184,202, 50,220,221,131, 34,103,251,217, 11,116,247,123,
+ 16, 69,108,221,113,154, 99,119,222, 65,173,213, 34, 90,234, 80,228, 19,162,213, 53,127,227,231, 57,228, 5, 20, 57,145,177, 84,
+163, 1,201,225, 30,175,254,201,159,227,195, 47,126, 25,175, 62,182,206,239,252,236,187,121,205,155,223,192, 93, 95,244,185,252,
+231,239,252,126,190,249,123,222, 66,229, 28,137, 49,184,162, 96, 60,232,163, 77,197,164,187,195,228,176,143, 72,235, 36,233,152,
+ 40, 85,216,188, 32,106,213,112, 81,132, 19, 18, 41,195,142, 87, 41,132, 10,177,145, 74, 33,100,140,140,124,144,133, 19,218, 7,
+193, 40,233, 71,155,206,120,239,247, 52, 50,212, 4, 91,218,244, 80,178, 94,167, 96,243, 2, 83, 25,172,213,184,224,151,245,124,
+144,138, 42,203,144, 66,249,145,164,211,216, 73,134, 29, 15, 40,119,119, 41,119,246,169,122,125,156,246,202,229, 42,235,134,156,
+110, 15,238, 64, 42,164,244, 15,104, 34,131,179,106,230,163,198,201, 89,212,232,148,243,230, 57,219,206,219,141,166,251,254,127,
+130, 36,151,237,109,211,253,196, 71, 80,105,157,120,117, 19,226, 6,205,227,167,153, 28, 14,145, 82,177,247,212,163,212, 19,201,
+119, 63,126,147,107,250, 26,167, 54,150, 89,111,166, 92,233,102,252,204,255,252, 45, 62,240,177,199,248,161,159,124, 7, 71, 86,
+215,184,124,169,224,201,254,144,222,225, 1, 47,122,243,175,241, 89,175, 58,197, 51,239,252,102,110, 60,242, 39, 11, 7,112, 16,
+ 18,205,215,231, 76,237,209, 56, 49, 87,159,107, 55, 35,255,201,160,222,118, 97, 98, 48,101,176, 76, 31,150, 98, 58,207, 55,206,
+115,221,157, 67,204,152,235, 83,203,226,124,226,237,228,130,130,120,250, 62,172, 91,200,120,247, 34,187, 25,254, 75,122,180,108,
+ 20,135,174,123,150,240,230,192, 14,103,107,111, 25,205,237, 70,211,215, 83, 42, 20, 43, 66, 34,155,171, 52,206, 61, 28, 2,159,
+220,194,225,206, 92, 20, 55, 5, 6,133,145, 46,214,132, 67,116,238, 13,116,186,240,157,177, 89,132,207, 72, 16,202,111,249, 85,
+144, 83, 11, 9,198, 95,147,200,200,179,223,141, 3,157, 97,116, 53,179,117,138,194, 66, 36,176,149,241,143, 7,227,176,145, 35,
+ 10, 33, 66, 70,107,226,122, 43, 48,200, 35,156,244,110, 19, 27,190, 47, 39, 45, 82,251,229,177,197,122,241,102,173,134,197,139,
+ 92, 69, 90, 39,219,223, 1,107,137, 27, 9, 81, 42,201, 46, 95, 36, 15, 96,164, 10,168, 42, 75,175,176,172,180,107, 76,122,222,
+133, 97,140,161,211, 72, 25,230, 21,121,128, 23,201,160, 53, 81, 82, 80,139, 36,251,147,146, 90,164, 48,165, 97, 96, 43,122,133,
+161,157, 72,180,129,237, 94,198,206, 32,167, 21, 43, 54, 59, 77, 42,231, 80, 82,178,148, 40, 26,177,162,151,107, 70,165,246, 35,
+120, 55, 93, 22, 57, 74,231,131,168,148, 16, 36,210, 23,136, 54,128,177,198, 37, 92,177, 21, 35, 5, 43,177,163, 35,131,112, 82,
+204,147,254,102,102, 10, 57, 95, 4,137, 32,174, 20,145,215,149,168, 16, 59, 60, 53, 21,204,177,175, 65,172,233,252,239,169,175,
+157,100,227,101,223,196,225,176, 98,104, 37,251,215,187, 24,107, 88, 61,186, 68,189,153,240,216,223, 62,193,198,250, 18,141,206,
+ 50,166,172,177,116, 36,161, 86,111,208,187,153,177,212,105, 80,182, 87,105, 52, 37, 85,166,217,219,185, 65, 81,106,164, 45,121,
+110,127,159,227, 39, 78,241,210,141,101, 30, 58,243, 18, 18, 7, 55, 6,135, 92,175,174,240, 87,151,159,224,234,160,135,148,146,
+134,138, 89, 77,235,220,222,108,178, 25,183, 57,190,180,201,122,125, 25,107, 13, 7,163, 33,107,205, 54,105, 11,122,195, 49,245,
+ 52,225,198, 65,143, 36,105,208,138, 29,207,246, 14,137,180, 98, 47, 27,147,198, 45,180,200,105,171,136,213,250,105, 34,149,214,
+ 16, 86,115,184,125,157,110,175,199,145,163, 91, 60,146,103,156,155,140,217, 60,121,140,242,111,255, 18,115,230, 78,142,223,251,
+ 50,250,143,127,144, 82, 9, 38,131, 46,131,131, 79,113,228,204, 61, 44,173,175,210,218,120, 25, 85,214, 99,253,248, 50,221,189,
+ 27,104, 51,228,200,169,123,121,248,203,190,117, 86, 77, 77,138,146,178,208, 20, 89,137,174, 42,162, 88,129,182, 68,145, 64, 73,
+ 77,111,208,162,117,100,133,157,143, 61,197,206,206,132,194,122, 72,194, 7,174,221,160,185,121,138,175,250, 23, 95,207,216,228,
+196,157,101, 42, 20,105,189, 78,167, 35,217,126, 46,135,180,198,210, 82,141,209,104,204, 96, 52,166,127, 56,224,250, 94,223,123,
+234, 15, 45,127,247,228,121,142,172,172, 80,100,125,122,221,155,252,245, 71,246,185,227,196, 17,234,162,224, 96,251, 57,234, 42,
+227, 39, 63,118,141, 7,143, 88,148,117,196,181, 58, 34, 78, 40, 75,203,201,187, 95,140, 77,154,252,250,119,255, 87,190,250, 87,
+127,156,246,169, 99,180, 95,112, 15,140,250,129, 57, 30, 45,220,248, 83,210, 90,160,188, 9,129,209, 6,221, 31, 6,180,170, 68,
+196, 49,209,234,138,159,121,222,188, 65,179, 86,131, 83, 43,116, 78,159,246,213,183,177,208,235, 97,179, 46,165,241,234,109, 93,
+104,210,118, 27,219,104,114,250, 5, 29,110,171,140, 7, 91,196, 10, 42,141, 30, 14, 17,113, 68, 92,171,133, 67,209,248,135,117,
+ 44, 16, 81, 29,161, 53,205,219,142, 19,111,172,147,191,255, 47,121,235, 47,253, 44,191,254,245,223,206,195, 71, 86,248,179,223,
+248, 61, 54, 30,253, 4, 15, 55, 90,168, 86, 29, 65, 9,174,134, 72, 83,172, 54,152,202,144, 68,142,253,243,207,176,182,126, 28,
+181,179,139, 41, 13, 66, 89, 92,101,144,169,242,221,139, 84,168,216,195, 52,100, 82,247, 62,116,231, 61,187, 34,242,163, 72, 39,
+ 67, 32,134, 46,189,109,204,122,175,188, 11, 7,187,127,200, 78,187,114,131,201,114,108, 89, 98,139, 10, 93,230, 94, 8, 63,243,
+251, 18,124,241,194,119, 82,206, 98,198, 19,220,100,136, 25,140,176,253,204,199, 57, 52, 86,144,169, 34,105,181,137,234, 9,149,
+177,200, 68,249,236,239, 48, 5,240,118,163,208,186, 58,231, 21,229, 34, 4, 64, 44, 60, 60,188,194, 86,254, 3,114,203, 63, 26,
+188,251,137, 74,164,200,158,254, 4,247,124,247,187, 56,184,182,203,205, 75,151,217,217,221,229,218, 83,187, 12,199, 19,158, 61,
+184, 73,146, 46,241,103,159,190,198, 91, 94,250,124,126,230, 39,127, 24,217, 92, 65, 38, 49, 66, 68, 60,242,190,255,143,207,254,
+250,239,228,191,191,235, 23,248,150,111,249,122, 78,180, 98, 30,185,178,207,243,207,222, 78,191,183,203,239,253,222,144,151,127,
+251,187,249,188,239,235,241, 55,175,123, 0, 83,228, 11, 8,216,169,117, 39,104, 29,166,239,105,138,162, 93,196,194,134, 46,102,
+218,149, 79, 61,241,146,233,231, 49, 79, 68,115,102,225,207, 46, 44, 42,167, 10,250,233,131, 86,168,105, 22,246,212, 87, 46, 22,
+124,231,204, 56,237, 8,129, 12,114, 49,103,167,194,192,121,231, 37, 3, 17, 76,170, 91,131, 92, 84, 34, 49,198,205,240,185, 66,
+ 56,150, 95,241,166, 25, 55, 96,190,192, 22,115, 11,192,244, 30,181,102, 38,138,196,234,105, 30,172, 47,204,103, 45, 96,216,157,
+ 75,137,140, 19, 76, 85,122,145,188,209,222,182,102,181,167,190, 9, 17,212,240, 18,135, 9,201,132, 17, 72,139,209,165,239,238,
+141, 15, 62, 18, 82,225, 68,229,215, 83, 74,225,148,242, 91, 29,225, 97, 41, 82,197,190,192,136, 20,166, 44,252, 90, 43,173,225,
+202, 18, 45, 53, 42, 78,166,251, 14,144, 9,174, 44,177,177, 68,232, 18, 85, 75, 65,197, 52,218, 49,205,213, 85,246,254,254, 81,
+ 34, 97,209, 66, 33, 36,228,133, 65, 24, 71, 77, 73, 90,141,132, 81,158, 19, 71,138, 81, 86, 96,172,223,151,207,102, 26,129,162,
+ 86,134, 9, 70,105, 12,147, 80,116,215, 99,197,168,244, 12,135, 78, 44, 16, 66,177,147,105, 46,143,122,156, 94,105, 97,170,138,
+ 49, 16, 73, 65, 43,150, 40, 17,209,203, 43, 42,227,166,112, 94,106,193,255, 58,195, 70, 79,157,133, 64,238, 28, 74, 67, 75, 56,
+198, 62,175,138,166,128,250, 20,223,176,248, 87, 57, 93,249, 4, 65,165, 80,120,119, 75, 56,180, 9, 78, 12, 43,131, 49, 34, 16,
+230,156,244, 60,136,135,223,246,110, 62,245,232,115, 92,190, 62,166,204, 44,234,176,164,210, 35, 90,203, 13,164,148,236, 93,238,
+161,164,229,200,169, 83,232,178,164,202,156,119,237, 68, 13,154, 43, 9,147,193,128,173,179, 91, 28, 92, 61,100,251,194, 5, 92,
+165, 88, 90,235,112, 80, 56,238,190,227, 54,150,214, 91, 52, 59,138,107,207,237,225, 74,203,102, 35,166,186,226,248, 87, 15,189,
+ 12,164,166, 24, 86,116,150, 26, 92, 59,220,231,206,187,215, 57,255,169, 93, 80, 21,157,173, 26,174,140, 16,106,204,206,160,143,
+ 28, 59,164, 90,193, 85, 41,133, 53, 92, 31, 14, 88,173,173,114,119,103,131,237,108,151, 35, 13,201,197,201, 54,210,149,156, 89,
+123, 53,131,106, 66, 52, 25, 31,210,108, 29,197,202, 33,155, 39, 78,210,219,189,206, 53, 35, 57,123,114,157, 39,222,253, 39,156,
+124,203,107, 57,254, 69,175,163,251,129,247,113,239,201,179,124,250,230, 53, 76, 26,177,122,226, 46,134, 7,219,148,147, 62, 42,
+ 78, 73,219,171, 88, 36,157,245, 85, 54, 78,221,203,185, 87,127, 5,206, 57,186,131, 9,217, 56,167,158, 74,198,227,146, 86, 43,
+161, 44,253,158, 50,173,123,232, 66, 49, 49, 76, 38, 25, 89,121,134,214,201, 79,210,188,126,133,131,155, 61,164, 84,220,249, 25,
+159,205,179,251,154, 23,188,244,126, 14,179, 18,153, 38,140, 6, 99,226,162, 68,138, 8, 13, 68,145, 67, 23, 37,101, 53, 70,202,
+156,173, 35, 41, 31,122, 98,207, 91, 90,148, 98,216, 31, 48,234, 31,242,216, 19, 79,177,185,210,160, 55, 46, 24,142, 70,232, 73,
+198,234, 82,139, 81,175, 75, 15,120,235,255,251, 36,191,240, 26,139, 56,210,160,117,242, 52,217,246, 69,196,100,200, 71,254,237,
+191,229,171,127,246, 95, 19,103,125,116,149, 19, 9, 59,139, 85,117, 73, 26,238,132,169,224,107, 33, 64, 34,142,176, 89,134,213,
+ 21, 42,138,112, 81,140, 76,107,200, 78,123,134,166,116, 82,133,216, 79,227, 51,223, 39,149,183,175, 53,154, 72,145, 19,201, 8,
+149, 56, 72, 35,255,170,193,106, 19, 53, 26,168, 70, 72,124, 10,147, 2,161, 66,135, 81, 26,168, 74,175, 70,119, 22,213,106, 34,
+147,148,218,210, 10,160, 88, 63,125, 55, 47,122,227,159,243,193,223,253,115, 30, 62,185,198, 31, 93,185,198, 43,163, 26,227, 43,
+ 55,125,124,109,200,145,182, 14,210, 90,130,137, 12,187,231, 31,101,253, 85,255, 12,241,228,199,188,115,207, 74,162,162, 68, 52,
+ 91,200, 72,161, 66,103, 46, 3,123,221,227, 48,167,231,158, 12, 65, 22,126, 76,105,221,188,155,117,214,191, 87,111,133,210,158,
+113, 95,149,152,188, 66, 23, 5,182,242,224,152,169,218,121,209, 23,110,157, 9,208, 62,135, 43,114,156, 46,113,113, 3, 26, 22,
+181,169,136,140, 69, 68, 49,170, 86, 71, 53,235, 8, 83, 81, 7,116,150, 83,185,128,139, 53, 37,200,186,239,114, 3,157,207,119,
+131, 54, 32, 97,131,245, 77, 42, 16, 33,220,101, 58,135,175, 55,254,183, 7,250,116, 71,252,161,223,255, 99,158, 59,127, 13,153,
+ 56, 6,186, 98, 52, 25,113,181,219, 99, 55,203, 56,204, 51, 62,121,245, 6,239,252,146,207,228,159,191,229,205,108,239,238,209,
+ 58,162,136, 92,155,193,254,117, 30,123,251,119,243, 7, 15, 39,124,245,135, 63,200, 75, 94,241, 50,238,187,227, 20,198, 70,252,
+205,123, 63,194,233,115,103, 57,113,246, 40,105,170,168,109,110,242, 69, 31,218,225, 67,111,251, 10,246, 63,240, 87, 51,165,249,
+172,193, 14, 7,178,196,211,231,164, 10,108, 25,175,110,155,251,117, 23,130, 86,230, 72,218, 41, 78, 54, 40,209,197, 20,155, 46,
+ 22, 24,239,211,115,113,145, 54, 39, 8, 89,170,222,191, 29, 58,164,233,252,120, 74,241, 18,211,181,134, 12,187, 81,225, 31,254,
+216,169,170,125, 30, 74, 99, 29,243,208, 27, 49, 21, 78,250, 76,118,107, 45,237,151,188, 62,184, 36,236, 2,116, 71,131, 75,110,
+245, 46,217,194,127, 19,118,150,181, 25, 10, 6, 21,166, 11,118,161, 75, 23, 65, 91,229, 49,182, 84,101,248,121, 28, 44,124,190,
+131,183,166, 64, 8,239,224,112,120,162,155,173, 12,186, 42,188, 0,211,132,240, 35, 33, 23,132,149, 97, 90, 98, 12, 70, 23, 33,
+192, 68,250, 41, 86,158,249, 80,151, 50,243, 69,150,246, 66, 60,103, 43,168, 45, 5, 17, 86, 4, 56,186,207, 93,228,226,251,222,
+139, 41,199, 36,245, 58,113, 35, 97,220,237, 49,182,142,102, 36,153, 84,146, 90,236, 40,180,134, 88, 81,139, 99,162, 72, 50, 28,
+103, 44,213, 98,198,149,166,168, 12,145, 12, 49, 41,161, 40,170,130,224,179,212,150, 68, 10,250,149, 33,215,126, 58,147, 42, 65,
+229, 4,185,246,228,187,205,118,130,115,176,181,178,196,181,110,159, 81, 97,102,250,141, 86, 45,102,156,235, 96,189,156,138, 32,
+ 37,105,152,188, 68,210,175,125, 42, 7,165,131, 84,192, 64, 7,179, 2,248,164,180,112,203, 41,235, 80, 74,204, 60,234,206, 57,
+ 98,233,141,180, 83,106,227,212,192, 40,220, 66,182,122,112, 34, 78,215, 85,103,191,226,109,156,127,242, 18,249, 56, 98,233, 72,
+141,124,100, 24,119, 71, 68,113,141,221,107,125, 58,171, 37,147,193,144, 59,159,119, 23,147,126,159,230,202, 50,235,103, 54, 57,
+184, 56,164, 24,107,156, 21, 52,150, 86,217,191,176,207,104, 52,160,185,122,156, 19,103,182, 80,105,201, 90,239, 24,231,159, 60,
+143,209, 21,135, 59,138, 60,155, 96,156,132, 82,176,177,185,193,133,107, 87,184,227,212, 81,150, 55,235,236,223,232,114,229,224,
+ 38,141,231, 18,242,210,208,106,214,217,187, 92, 34,100,201,141, 97,151,165,165,148,213,149,132,114, 20,113,163,219,231, 70, 62,
+224,174,213,219, 56,200, 14,209,194, 67,141,182,179,125, 98,167,121,213,201,215,114, 51, 43, 88, 74,214,136, 6,189, 30, 78, 53,
+121,230,233,139,220,251,192, 41,150,143, 30,167, 93, 22,188,111, 80,242,166,159,254, 30,220,214, 73, 62,246,109,223,193,185,239,
+251, 94,104, 44,113,223,198, 26,127,247,145,143, 80,196, 5,237,229, 99, 12,122,219, 36,174, 66,119, 51, 58, 71,206, 96,227, 77,
+206,189,234,245,104,107,216,219, 31,208, 61, 24,145, 38, 17, 84, 33, 9, 8, 77, 61, 73, 65, 56,198,227,194,251, 1,157, 65,151,
+ 37,214, 90,186,171, 47, 39,127,240, 14,218,119, 14,104,201,132,131,253, 3, 30, 90,118,200,118,147,196,193,112, 98,200,171,156,
+201,245, 17, 50, 74,208,249,132, 98, 82, 80, 26,195,254, 65,159, 27, 55,119, 57,127,237,128,165, 86,131,188, 28,241,201,103,119,
+176, 85,193,184, 42,168,181,106,152, 42, 71,233,130,222,225, 77,180, 83,180,154, 41,166, 92,103, 83,246,216, 27,245,120,195,251,
+ 7,252,187, 47,251, 28, 70,127,243, 55, 28, 22,130,131, 71,222,202,235, 91, 9,241,242,231, 50,217,126,206,251, 64, 99, 31, 62,
+162, 76, 16,124,153,234, 86, 34, 74,128, 54,152,202,251,172,163,122, 13, 89,171,249,174,176, 86,131, 56,193, 69, 65,253, 45, 85,
+240,242, 26, 92, 81,131,184, 4,215, 70, 58,129, 84, 49,241, 34,107,220,186,144, 15, 62, 37,171,137, 25,226, 82, 40, 21, 30,232,
+ 50, 0, 92,162,160, 50,118,115,235,142, 21,144,214,112,163,125,190,248, 55,126,159,115, 95,254,219,252,252, 27,190,129,213, 52,
+226,209, 70,202, 23,252,202,123, 16,223,243,118,232,238,123,232,131,117, 40,169,208,166,226,240,218, 69,172,250, 66,164,130,164,
+ 38, 57,184, 62,230,196,221,117,164,242,169,105, 72,133,136,164,255,108,144, 51, 88,139, 23,128,105,108,145,123,207,254,140,197,
+ 24,192, 30,186,194, 21, 30,135,107, 75,127,144,235,178,240,234,122,235, 66,218,221, 60,117,204,137,249, 3, 90,104,129,147, 97,
+116,175, 34,207,209,215, 26,153,214,145,113, 50,139,207,116, 82, 98,176,136, 56,198,140, 39,200, 72,226, 74, 21,168, 97, 14,106,
+202, 11,136, 76,229,105,126, 1, 87,234, 45, 69, 11,169,108, 74,249,208,148,112,200, 11,149, 44,168,221, 93,240, 82, 91,250,187,
+219,252,245,187,126,149,215,255,252, 47,242,139,111,253, 42, 70, 7,123,236,220,216,230,218,225,128,237,113,206,213,113,206,137,
+229, 21, 94,124,108,153,251,206,220,198,133,103,158,225,200, 93,119, 97,141,161,214,170,243,115,111,249, 17, 62,231,117, 45, 94,
+254,203,125,206, 54,224,189,127,251,126, 78, 31,125, 3,171, 53, 73,243,182, 77, 70,147, 49,231,182,154,212,133,224, 19,151, 5,
+ 23, 63,252,113, 94,248,230, 31,166,247,241, 15, 96,242,108, 70,132,147, 98,193, 2, 36,189,240,111,150, 3, 62, 77,181,114,183,
+142, 49,157,155,219,132,164, 18,225,165, 22,114,206,167,214,110, 59, 23,216, 17,246,155, 11, 73,227,225,225,189, 80,228,216, 57,
+150, 83, 50, 71,193, 10, 57,127, 31, 42,158, 94,207, 50, 36,174, 5,183,128, 5, 25,232,110, 18,225,159,218, 11, 73,115,233,233,
+ 23, 16,175,157,192,185, 17, 66, 24, 15,147,177,121,168,175,245,172,128,156,237,213,103,211, 30,237, 51,205,157, 70,218,153,185,
+206, 95,103, 81,140,171,138, 25, 19, 94, 68, 53,108,158, 99,171, 50,164,167, 37,193,238, 24, 32, 55,210, 97,116,225, 69,157, 85,
+229, 63,150,108, 20,240,176, 2, 75,132, 80, 17,214,250,213,143, 53, 26,167, 53, 50,138, 61,215, 34,146, 8,107,188,141,114,218,
+101, 86,149,183, 30, 90,129, 49, 21, 74,198,216,170,196,165, 77, 76, 85, 33,156,101,220, 61,224,224,202, 85, 82,105,216,184,239,
+ 36,221,167,158,162, 55,240,137,115,186,210,164, 50,193, 68,145, 71,217, 23, 37,170, 22, 35, 42,168,199, 49,145, 18,164, 90, 81,
+ 88, 67, 30,166, 48, 38,180,194, 54,220,115, 82, 64,101, 45,101, 56, 80, 3, 37,192,239,198,149, 96, 57,137, 89,174,215,105,165,
+ 9,113,146,240,226, 59,215,120,252,226, 37,118,179,210, 75, 21,173,161, 30, 43, 74, 99,209,193,218, 38,132,165, 52,222,187,206,
+ 64,133,124, 0, 0, 32, 0, 73, 68, 65, 84,238, 28, 68, 66,134,195,216, 49,177,142, 36, 72, 29, 12,130, 84, 8,164,199,230, 7,
+107,219,130, 53, 82, 44,136, 55,109,128,209, 44, 58, 49,166,197,235,172, 85, 87,196,141, 58,162,113, 47,113, 62,192, 13, 53,221,
+235, 37,181,182, 35,203,198,172,109,181,216, 58,115,130,195,189, 46,107, 71, 78,161, 75,205,218,230, 49,210, 90,139,241, 94, 69,
+231,228, 38,147,221, 33, 85,165,169, 74,197,242,177,219,200, 46, 62,131,173, 52, 87,206,111,211, 94, 90, 66,169,152,229,205, 19,
+108,108, 52,153, 12, 10,246,119, 98, 58, 91, 41, 34,214,148, 99,104,181,150,120,230,252, 85, 38, 58,167,157, 46,113, 91,103,139,
+222,112,194,198,122,135,178,212, 52,150, 28,245,250, 50,133,214,236,116,187,212, 88, 70, 87, 21, 74,212,184,107,233, 52,224, 24,
+150, 3,138,202,177,159,103, 44, 71,142,135,182, 94,199,176,170,144,148,212,136,137,202,194, 80,140, 71, 36,181, 22,189, 94, 70,
+164, 44,141,118,131, 88,165,188,231,143,255,130,211,151,118,184,253,141,175,161,105, 51,116,225,200, 91, 75,188,228,133, 15,242,
+247, 31,255, 40, 69, 49,166,189,188,133, 21,150, 70,107,141,193,254, 77, 62,251,155,127,140, 82,107,250,195, 17,187,219, 55,169,
+215,107, 40,235,152, 76, 42,242, 73, 73, 99,109,137, 40,130, 97, 63, 15,247,166, 35,207, 43, 76,128,209,235,108, 72,156, 68,180,
+ 55,150,105,164, 49,245, 68,240,188,123,238,240,157,252, 56,163,187, 63, 96, 56, 30,121,226,143,174, 24, 77, 74, 31, 34, 51,201,
+233, 13, 51,158,124,238, 6,182, 28,211,235,245,217, 61,136, 25,101, 99, 38,163, 9,121, 54,194,106, 67,166, 4,251,131, 9,105,
+173, 70,165, 75, 42,145,224,132, 35, 51, 17,159,251,138,175,225,173,159,117, 39,255,227,255,250,175, 60,252,194, 23,178,251,220,
+ 53,234,249,132, 87,124,207, 55,145, 95,189,132,177,190,107, 52,210,143,241,234,203,203, 62,241,107, 74,223,176,198,123, 97,173,
+ 7,161, 40, 21, 33, 83,137,104,119,112, 81,120, 18,198,137,207, 87, 78,147, 89,136, 6, 40,136, 44, 46,173,135,238, 33, 28,198,
+ 85,229, 15,112,227,115,217,133,244, 54, 53,226, 38, 68,211,177,182, 13, 62, 84, 59,135,147, 24,227, 59,127,107, 64, 79,227, 41,
+ 67, 44,216, 56,247,140,233,103, 30,227,206, 23, 62,204,127, 50, 25, 79,252,220, 79,240,235,111,255,113,126,186, 56,228, 55,222,
+255, 65,162,135,239, 67,137,132,164, 81, 11,170,114,112,122, 76, 81,106,162,180,230,109,110,135, 61, 78,218,101,172,177, 40,235,
+ 17,150,222,178,164, 17,178,156,141, 56,173,212, 88,230,156,250,121,116,231,252, 48, 55, 69,137, 41,125,134,187, 49, 85,128,122,
+ 4, 16,141,156,166, 98, 5,107,144, 83,254,251,181,122,142,126, 50, 94,105, 46,164,223,157, 11,169, 60, 81,142,128, 94,117, 38,
+216, 87, 44,198,106, 52, 96,148,240,153,239,214, 97,202, 18, 21, 55,102,113,140,126,141, 16, 7, 27,152, 87,215, 11,229, 95,215,
+151,252,254,128,135,197, 49,180,152,249,191,255,231, 79,253, 56,210,165,124,240,151,126,147, 55,253,251,159,230,155, 31,184,159,
+ 27,192, 94,169,233, 21, 21, 75,181, 58,159,188,177,199,119,188,244, 44,207, 92,190,204,243, 86, 87,200,134,125, 84, 28,177, 55,
+ 30,242,170,175,253, 82,222,243, 35,239,224,237,231,234,236, 21,240, 23, 23, 46, 82,142,123, 92,187, 52, 70,173, 29,229, 5,247,
+220, 77,173, 22,243,251,191,253, 62,126,237, 63,125, 39,181,193, 37, 62,122,152,241,146, 99,235,252,192,241,153, 61,119,182, 77,
+118,139,201, 86, 11,200,216,105, 40,134, 12, 29,243, 52, 89,205,163, 61, 23, 66, 94,108,136, 81,117,254,247,218, 50, 80,227,194,
+200,197, 46,236,238,103,201,129,102,186, 7,159, 10,249,230,234,100, 23,152,239, 50,140,199,167,133,135,213, 46, 56,207,252, 74,
+192,105, 17, 6, 37, 30,210, 35,165,167,102, 89,227, 41,137,126,130,238,104, 61,244,197, 64, 21,118,233, 11, 28, 80, 91,205, 15,
+113,100, 80, 78,121,239,184,239,170,213,108,131,226,215, 62,218,127,237, 40, 9,140,113,231,139, 72,194,107, 9, 48,122,130,136,
+ 82, 63,189, 80, 9, 70, 23,254, 62, 20, 18, 87,100,161, 64,183,152, 60,243, 52,193, 34, 3, 43, 80,181,166,159, 36, 9, 31, 82,
+100,170, 2, 81,105, 68,195,239,211,197,116,106, 37,101,112,225, 73,255,107,186, 64, 70, 41,200, 8,213,234,120, 59,105, 57, 65,
+168, 24, 51, 24,161,164,164,204,198,104,109,168,213, 18,134, 31,122,156,126,229,139, 85, 17, 37,104,237,197, 14,173, 36, 69, 43,
+ 73, 85,150, 56,225,136, 99, 65, 36, 37,214,249, 66,187,210, 6,107, 28,198,120,253,103,101,236,212, 52, 65, 97,230, 3,111, 41,
+ 5,145, 16, 52,106, 94,208,181,214,172,179,181,218,225,200,218, 42,107,157, 21, 78,158, 62,197,221, 71, 54,248,163, 15,255, 61,
+215,243,146, 88, 64,161,141,247, 78, 71,114, 6,245, 81,211,226, 47, 32,100,173,117,212,149, 96, 57, 17,172,199,138, 78,228,104,
+135,191,186, 72,121,172,181, 13,133,170, 10,186, 6,107,195,106,198,205,181,141, 11, 89,132, 88, 17,190,206,116,192,103, 53,247,
+127,195,143,176,115,121,128,139, 18,210,142,164,234, 27,198,189,156, 40,174,177,119,229,144,237, 11,215, 88, 94, 91,103,237,220,
+ 49, 76,233,169,125,113, 35, 69,198, 13, 92, 1,189,131, 67,150,150, 55,168, 92, 73,218, 20, 68,212, 32,177, 72,231,168, 47,215,
+105,172, 75,184, 98,217,221,238,145,103, 3,138,145, 99,247,146,225,216,185,117, 90, 13,201,232, 80,179,220,222,224,244,102,155,
+245,147,109,178,195,146, 71, 63,241, 52,166,148, 92,218,189,206,169,181, 19, 12,134, 25, 59,195, 30, 43,141, 13,198,147, 9,251,
+213,128,219, 86,155, 52,235,203,124,250,242, 51,220,156, 12,144, 98, 64,172,114,238, 95,125, 41,121, 89, 98,170, 62,206, 84, 40,
+ 85, 39, 58, 56, 24, 98,172,100, 82,104,174, 93,217, 99, 60, 41, 57,178, 28,113,244,212,109,220,108,173,178,186, 89,240,188,151,
+127, 22,215,126,244,135,168,127,213,215,179,182,188,204,248,176,224, 37,159,255, 37, 60,250,193,247,115,233,234,167, 56,113,231,
+253, 12,246,118,120,213, 55,189,131,172, 40, 40,171,130,108, 48, 36, 77,107,232,178,100, 92, 84, 36,161,233,233,247,135,196,177,
+ 66,196, 2,165, 45,165,177, 8, 97, 81,145, 63,236, 90,237, 58,181, 68,209, 61,236, 99,132,131, 90,157,214,230, 26,195,225,152,
+157,221, 30, 7,221, 46,131,193,136,122, 45,101, 56,202, 73, 19,135,116,146,189,110,151,231,174,237, 51,201,114,106,162,228,142,
+ 83, 71,248,216, 99,207, 80, 25, 77, 82,175,129,140,201,178,140, 66, 66, 18, 69,228,147, 49, 74,197,216, 74,179,177,118,132,215,
+189,230, 53,124,230, 3, 39,184,248,222,255, 78,189,179,201,229, 27, 7,196,105,157, 77,233, 48,151,175, 80,184, 2,116,137,170,
+ 53,112,147, 17, 66,249,209, 63, 69,129, 18, 62,156,193,155, 4,195,147, 43,173,249, 10, 63, 78,124, 68,104, 80,178,186, 40,116,
+230, 34,160, 71,171, 18,116, 17, 60,177, 22,202,106, 30, 26, 34,196,220,138, 83, 75,253, 78, 58, 12, 87,157, 49, 48, 30, 67, 89,
+ 32,180,159, 8, 56, 29,230, 86, 82, 5, 69,173, 67, 37,113, 32,113,133,196, 40,169,112,148, 96, 71,136,120, 4, 7, 7,220,255,
+133,175,227,167,190,245,123,121,242, 39,126,148, 15,252,143, 63,228,243, 63,227,133, 56, 99,144, 72,226, 36,246,112, 6, 11,195,
+253,125, 54,154, 77,210,218, 16,147,151,232,108,140,176,210,135,172, 52,234, 8, 93,133, 67, 84,207,118,207, 66,120,150,187, 51,
+ 83, 40,143,127,239,214,104, 76,158, 99,242, 18, 83,149,232,170, 12,106,224, 41, 60,213,112,107,250,136,223,201,139,105,152,139,
+155, 67, 79, 32, 36,109,169,128, 86,181, 65,192,101,237, 45,235,111, 87,105,132, 82,225,225, 32,253,238, 55,196,200, 98,116, 64,
+127, 26, 68, 20,205, 58,253,106, 50,161,182,188,238, 5, 82,211,157, 38,206,255,157,222, 98, 97, 51, 84,253, 46, 7,191,250,107,
+124,237, 79,255, 23,222,241,218,215,146, 77,198, 36,117,193,227,123,125, 76,163, 65,191,170, 24, 25,195, 74, 84, 99,185, 22,241,
+244, 94,159, 70, 43, 97,112,243, 6,173,122,138,210, 21,173,141, 45, 62,227,203,223,200,133,167, 47,241,137,223,250, 45, 46,200,
+ 58, 95,248,138,135, 57,126,242, 12,175,107,103,156,125,248, 69,212, 86, 59,168,180, 78,241,204,111,242,219,223,242,121,156,251,
+174,159,226,217, 79, 61,198, 93,247,190,152,222, 70,147, 78,228, 66, 92, 41,225, 32, 14,226,178, 41,124, 67,120, 18,157, 92, 64,
+100,138,127,208, 89,179, 16,185,234, 66,177, 56,157, 96,203, 25,176,134,224,120,152, 69,100, 48, 93, 77,139,104, 14,174,145, 98,
+129,255,110,167, 7,124, 24,216,155,224,127, 23,115,127,188, 23, 54, 5,103,194,212, 2, 24,136, 55, 86, 76,209,182, 30,218, 40,
+163,136,100,243,204, 34,124, 62, 88,213,170,185, 15,157,192,159,189,133,209, 31,242,207, 77,128, 21,217,160,151, 8,133,251, 60,
+ 58,207, 67,143,172,246, 33, 64, 82,133,140,135, 56,153,125,131,118,202, 89,144, 18,103,236, 12, 53,108, 60,223,212, 23, 83, 85,
+133, 49, 5,194, 73, 4,222,174,134,148,200, 90, 13, 21,165, 65,207, 80,161,162,122,192,159,250,201,165, 4, 34,229,131,153, 76,
+ 81, 16, 55, 58, 62, 73, 80,151,104, 99,184,249,196, 71, 41, 39, 57,235,155, 29,184,118,131,107, 87,119, 81,105,141,200, 57,164,
+ 17, 51,228,176,136, 36, 18, 75,187, 85,103,191, 59,198, 9, 63, 21, 74, 19,137,205, 29,147,202, 80,153,208,143, 56,139,118,222,
+ 79, 31, 71,146, 76,251,251, 45,146,130, 72, 72, 34, 33, 56,218,106,177,181,182, 76,103,169, 77, 4, 36, 66,178,180,178,140,238,
+119, 89, 46, 38,188,225,142, 77,222,123,249, 38,143, 13, 75, 64,160,177, 72, 51,189,206, 66,138, 26, 98,150, 71, 16, 11, 65, 59,
+130, 37, 5, 74,122,246,125, 34, 5,117,101,145,206,206, 60, 35, 22, 23,120, 2,204,220, 54,102, 65, 35,178,176, 63, 10,147,169,
+185, 87, 93, 41,129,213, 29,172, 24, 48,234, 22, 88, 13,221,131, 30,235, 91, 29,180, 81,140, 14, 71,172,108,172,114,255,171, 31,
+ 96,255,185, 30, 73,189, 78,173,185,140, 48, 22,109, 36, 69,175, 75,107,227, 8,181, 86, 74,107,181, 77,119,123,143,214,198, 10,
+203, 91, 13,174,127,250, 38,221,235, 7, 92,123,122,204,250,209, 35, 12,118,246,169,116,194,137,123, 79,146, 23, 57,163,189, 28,
+235, 12,157,227, 9, 71, 79,158,101,247,250, 30,159,250,208, 13,162,216, 80, 79,154,164,105,202,125,207, 59,202, 74,235,118, 30,
+127,236,227, 12,116,159,150,173,179,210, 86,220,230, 58,184,178,206,123, 47, 63,142, 17, 57,235,201, 42,205,122,198,241,250,195,
+ 12,114, 77,167,166,168,201,117,218,174,194, 88, 71,116,125,119,200, 94,127,196,241,205,117,250, 3,201,246, 32,231, 96, 92,177,
+180,182,196, 49, 10,222,255,216,227,220,251, 23,127,196, 97, 5,247,175, 55,184,241,219,191,204,250, 87,254, 11,108, 89,242,226,
+207,252, 12,142, 93,220,226, 3, 31,251, 16,159,255,214,239, 70,196, 41,121,127,128,146,130,254,160,164,221, 72, 72,155,117,174,
+ 93, 29,177,180,222,225,198,246, 14,203,203,203, 12,251, 35, 84,146, 96,157, 69, 77,211,115, 98, 71, 82, 75,176,122,137, 76,143,
+216,188,173, 69, 62, 28, 50,214, 19,182,175, 29, 80,107, 88,140,201,217,223,239,162,141, 37,142, 45,189,222, 33,135,195,156, 73,
+ 62,225,218,141, 30,207, 63,119,140,253,253, 93, 38,149,230,177, 39,159,197,106, 77,156, 40,170,162,162, 42, 43, 70,101, 73,108,
+ 42, 70,227, 49,245,102,139, 92,107,138, 42,225,182,211,119,115,112,254,175,160,190,196,179,215, 51,210, 90, 74, 26, 71,228,101,
+197,237,199,214, 25,149, 67, 12,130,168,172,112, 41, 8,109,193, 85,216,108,130,172, 55, 16, 42,153,119,111, 42,242,248,210, 40,
+241,135, 89, 90,247,191,110,140, 31,185, 11,229, 61,217,206,122,138, 85, 17,104, 86,101,229, 45, 94,211, 7,138,153,211,160,132,
+ 13, 1, 14,218,115,229,167,198, 79,107, 13,110,146,227,240,202, 88,132, 66,198, 17, 34, 82,190,162, 55, 96,171,224,153, 15, 72,
+ 48, 23,172, 37, 32, 49,227, 2,161, 20,217,126, 23,158,126,134,123,191,246,173,156, 43, 52, 38, 31,120,114,150,128, 72, 73,140,
+ 18, 68,105,196,193,181,231, 56,122,100,139, 36,218, 99,104, 29, 85, 86, 33,236, 4, 91,149,144,110,134,179,214,219,155,166, 7,
+160,144,210, 7,192, 24,131, 11,135,190,173, 42, 76, 89,162,243, 18, 83,100, 94, 1,175,253,225,234,152,251,194,255,145, 24,205,
+ 77,161,114, 34,136,217,172,199,120, 47,122,144, 93, 16,207, 97,231,145,152, 24,132, 51, 88, 17, 66,114, 98,137,116, 50,144,155,
+252, 4, 67, 23,133, 31,129,162, 60,111,219, 90,202,108, 68,218,234,132,115,197, 45, 4,160, 40,239, 76, 24,143,124,241, 86,139,
+ 40,174, 92,231,189, 95,252, 50,154,119,157,229,232,203, 94,201,119,255,183,255,198,179, 31,255, 59,222,244, 37,111,160,189,214,
+102,123, 82, 82, 58,136,163,152,237, 94,159,219,151, 27,124,114,167,203,199,174,236, 50,121,239,147,232, 40, 66, 9,193, 70, 51,
+225,115, 31, 56,203, 90, 59,230,117,255,241, 87, 56,123,249, 16, 55, 28,210,223, 29,112,246, 69,207, 71,233, 9,233,238, 62,157,
+149,152,183,191,235, 87,102,171,137, 59,239,121, 1,223,244,207, 95,203,239,255,229,159,242,245,167, 18, 95,224,136, 57,120, 70,
+202, 91,125,225, 98,202, 90, 23,255, 32,162,117,145, 95,111, 93,216,179,223,154,140, 17, 88, 45,179,244,190,153, 55,125,170, 80,
+ 14,157,186,138,230,248,205,233,199, 54,227,189, 59, 79,244,154,174, 2,230,177,169,254, 32,183,214, 6, 98,216,212, 6,103, 23,
+144,158, 30, 73, 44,156, 64, 24, 77,253,142,135,111, 77,231,112, 14,138,161,255, 90,105,228,211,215,204,116,109, 35,230, 74,190,
+169,193,110, 1,224,227,172,246, 99,232,106,154,128, 56,245,243,251,238, 80,197,117, 76, 85, 66, 62, 66,166,190,176, 51,101,142,
+ 84, 94, 20,106,180,198, 21, 19,108, 49,133, 35, 73,116,145, 19,213, 82,176,150,114, 60, 68, 70, 53,172,169, 72,219,171,190,144,
+173,169, 48,137, 83, 56, 83, 5,171,163,247, 13, 90,109,189,168, 83,150, 88, 83, 33, 84,226,167, 9, 42, 66, 10, 71,247,202,101,
+ 26, 75,109,226, 52,161,113,246, 44,201, 71, 31,165, 20, 2, 17, 75,156,148,180, 99, 73,149, 27,180,241, 41,139, 96,104,181, 18,
+246, 14,199,140, 68, 78,187,158, 32,201, 1, 73,105, 42, 4,144,107, 19, 70,241,142,194,194, 72, 27,164,244, 35,242,122, 20,113,
+180, 93,103,125,169, 73,187,158,178,181,212,166,222,108,176,186,190,129,233,118,145,229,152,164,154,208, 74, 99, 94,119,122,157,
+232,185, 27,124,108,104,209, 86,204,238,163, 56,136,229,100, 64,223,166, 82,210, 80,158, 11,111, 5, 36, 82,176,164, 4, 41, 6,
+ 51,141, 64, 14,133,104, 20,180, 22,206,205, 45,152,254, 58, 20,179, 75,203,134,241,252,220,214,230,245, 15,214, 9,234, 27,203,
+140,159,221,163,213,110,114,229,233,235, 72,149,160, 11, 65,125, 53,226,206,251, 55,233,172,111, 49,184, 94,208,217, 88,225,250,
+ 51, 55,184,253,197, 71,216,191,112, 72, 92,151, 52,150,155, 56, 85,195,149, 5,195,110, 31, 83, 56,138, 98,200,100, 82,178,180,
+ 92, 99,119,251, 10,197,208,177,111,186,116,142,109, 82,142, 75,174, 62,113,133,245,179, 71,105, 44,213, 24, 31,104,198, 87, 74,
+174,247,174, 35, 83, 75,107, 67,114,247,185,115, 60,243,161, 43,236,237,239, 97,246, 98, 62, 54,121,132, 88,165,156,105,222, 78,
+226, 98, 30,187,126,158,182, 74,168, 71, 13,234, 74,226,100, 19, 68,143,207, 59,247,165,228,149,228,224,198, 33,157, 99, 9,101,
+183, 73,175,184,201, 65,222, 71,189,228,204,218, 59, 18, 25, 83,218,138,118, 51, 13,142, 34,193, 65,111,200, 67,189,107,220, 47,
+ 51,174,125,252,113, 30,252,209, 31,227,194,127,124, 23, 71, 94,251, 90,244,159,252, 30,209,114, 29,142,156,160,115,215, 61,220,
+253,224, 43,104, 29,187,139, 73, 54,158,141,246,154,205, 6,135, 7, 3,246,110,116, 57,255,233,109, 76,158,241,244,249,155,228,
+ 69, 73,179, 17,133, 84, 47, 77,187,149, 50, 25,103,148,121, 69,149, 23,196,105,204, 82,171, 70,164, 20,195,113,206,229,221, 62,
+177,114,100,163, 30, 31,255,212,101,118, 14,123, 20,197,132,221,195,190, 79, 30,211,154,221,131, 30, 91,107,117,198,227, 49, 69,
+ 81,130, 48, 28,236, 30,250, 17,158,129,126,127,196,184, 40,104, 39,130,122, 12,141, 36, 38,118,154,147, 27, 91,124,197,151,124,
+ 45,205,231,254,144,102,217,229,216,177, 19, 60,126,126,155,229,118, 11,107, 29,147, 73,198, 3, 15,222,201,114,236,253,131, 34,
+140,201,228, 82, 11, 97, 52, 34,174, 17, 55, 91, 62,232, 33, 10,135,121,218,128, 90, 19,146,212,139,232,210,250,156, 52, 38,148,
+143,104,204, 51, 40,114, 92,150,205,172,103,174, 10, 9,111, 85,229,127,132,145, 59,214,122,129, 78, 94, 32, 76,133,203, 10, 76,
+ 85,121, 21,110,165,177,214,160,203,130,162, 55,162, 26, 79,168,170,146, 98,146,227,180, 70,151, 21, 58, 47,200,179,140,114,148,
+ 49,233,142,200, 6, 35,198, 7, 67,202,201, 4, 93, 86,152, 74, 83,105, 77, 85, 85,100,215,182,161, 18, 36, 71, 59, 56, 12,253,
+107,215,152,116,251, 56, 39, 80,113, 66, 62,206, 56,126,251, 25,242,171,151, 24,151,142, 6, 67,156,242,153,198, 46,207,177,210,
+ 43, 98,103,130, 41,230, 4, 54, 91, 85,184,178,192, 86, 26, 29, 34, 79,117, 81, 96,195,154,192,133,244, 44, 55,165, 62, 45,182,
+233,179,159,138,249,106, 98, 10, 75,177,198, 43,151,141,157,199, 42, 6,104,141,179, 6, 43, 76, 56,156, 4,214, 88, 92, 36,253,
+123, 84,254,192,178, 98, 30, 21,235, 2, 33, 67,132, 46, 14,231,136,106, 13, 68,148, 18, 53,151, 16, 81, 76,148, 52,188,161,119,
+ 50,196,149, 25, 34,237,112,240,215,127,202, 31,191,254,179,136, 79,221,198,229,195, 62, 87, 31,121, 63,159,126,236,113,190,225,
+123,126,144,102, 59,101,164, 45,218,249,132,170, 68, 74, 26, 82,112, 48, 14, 1, 69,149, 35, 55,126,146, 34,162, 6, 73,251, 54,
+ 54,142, 61,143,135, 95,253,122,126,254,247,222,195,122, 34,121,240,161,123, 56,118,230, 54,232, 31,114,116,240, 52,107,235,130,
+120,107, 19, 26, 77, 15, 71, 2,170,178,228,181, 95,254, 6,190,241,251,126,148,159,255,173, 71, 40,202, 62,227, 75, 79,135, 21,
+245, 60,176, 69,202,127,208, 57,187, 69,196,109, 0,207,200,160,102, 95, 88, 47, 76,133,110,211,238, 93, 46,248,197,167,145,190,
+ 51, 79,252,180,128, 8, 14, 2,177, 80, 77,204,116,157, 66,204,208,177, 98, 26,193,234,194, 33,238,230,191,119,102,195, 51,132,
+ 73,195,116,155,228, 11,213, 40,109,179,242,249,255, 18, 17,155, 57, 65,206,148, 80,142,110, 85,190, 99, 23,214,100,122,198,253,
+ 71,151, 1, 9, 28,138,101,163, 3,154,182,154,253,121, 27,114, 4, 92, 72, 98,115,186,196,232,114, 6,191, 49,227, 30, 50, 74,
+113,214, 82, 13,122, 56, 99,208, 89,134, 46, 51,108, 85,160, 39,125, 84,220,244, 93,187,209, 68,245, 38,113,163, 73, 92,107,134,
+207,218, 79,178,156, 82, 33,101, 47,172, 36,172, 9,141,130,242,131, 0, 21, 33,107, 45,140,214, 20,251, 55, 24,237, 92,229,137,
+247,189, 15, 81, 85, 8,103, 56,221, 18, 92,126,118, 27,109, 12, 38,170,209,173, 44, 54, 78, 17,186, 66, 75,143, 72,150, 74,160,
+164,228,112,148,205, 2,230,178,202, 50,174, 12, 89,101, 48, 8,178,202,131,156,198,149, 35, 55, 26,231, 36,145,132,165, 52,229,
+182,149, 54,103, 54,214, 56,190,117,132, 51,183,157,162,179,186, 74, 85, 24,138, 97, 15,101, 52,170,223, 99,115,173,131, 46, 10,
+170,124,194,237, 34,231,169, 81,133,137, 34,234,145,164, 19, 73, 82, 41,168, 43,159, 4,183, 20, 71, 52,163,144,238,105, 29,113,
+192,204, 24,135, 47, 78, 66,144,203,108,152, 35, 22,210, 86, 23,221, 30, 82, 44,232,104,255,161,219, 2,148, 84,200, 70,139,162,
+246, 32, 86, 74,110, 94,238,147,180,196, 76, 15,145, 68,138,165,206, 42, 69,158,211, 62,185,194,100,191, 71,109,105,147, 40, 78,
+137,211,148, 81,111,192,225,245, 62,245, 78,157,195,107,187,244,247,250,200, 90,131,165,149, 26,147,126, 78,255,198,117, 38,227,
+130,165,246, 58, 27,167, 54,112, 70,146,212, 18,170,162, 2,227, 88, 90, 95,162,114, 3, 14, 14,135,220,118,199, 17, 46, 62,115,
+ 21, 89, 37, 28, 30,244,105, 29, 23,172,110, 45,209,142,107,244,134, 5, 91,203,109,154,109, 73, 51,109, 51,158, 12,169,165, 53,
+164,176,108, 54,151,184, 52, 60,207,191,250,236,127,201,100,236, 72,235,208,108, 52,153,244, 43, 46, 29, 94, 36, 78, 5,227, 2,
+162, 71,159,219, 71, 41,137,146,126, 76, 51, 44, 43,164,136,120,227, 81, 73,219,142,209, 22, 26,177,229,202, 79,253, 48,186,190,
+129,217,222, 38,189,251,118,246,255,242, 47, 56,114,215, 3, 56, 37,137, 54,206,160,173, 65,235, 16, 88,159, 74,164,117,172,174,
+181,216,223,237,209,136, 37, 89,105, 73,210, 26,203,157, 22,147, 81,206,225,225,132,173,173, 53,118,111, 14,136, 34, 65,150, 85,
+ 51,142,243, 48, 47, 73,227,152,122,163, 78, 75, 25, 70,131, 9, 89, 53,228,163,143, 61, 70,156,182, 57,121,116,153, 60,175, 24,
+ 40, 73, 35, 73, 40, 75,205,179,151,123,228, 69,137, 37,162,168, 74, 42, 39, 40,199, 99,106, 53, 15, 69, 89, 86,130,209,168, 64,
+213, 82,106,245, 6, 34,105, 83, 95,189,131,151, 60,255, 40,255,225, 55, 46,240,138, 23, 61,159,189,131, 46,149, 49, 20, 89, 70,
+ 61,245, 68,165,103, 47, 92,231,220,234,201, 25,177,204, 78, 50,228, 82,219,239,184,106, 41,196,225,199, 52, 19, 50, 74,102,252,
+238, 41,121,108,198,131,215, 85, 80,167, 23, 62,140,161,172,252,129,173,171,144, 6, 21,246,206,102, 14,249, 64, 72,204,116, 36,
+ 31, 0, 44, 54,236,207,157,128,106, 52, 65, 23,165,247,113, 75,137,170, 74, 92, 18,161, 43,131,138,188,168,203,175, 23, 53, 85,
+ 81,162,173,197,148, 6, 61,246, 23,191, 74, 19,100,146, 18, 37, 41, 73, 59,101,220,189, 73,178,179,138,216, 40,137, 19, 69,220,
+106,192, 56, 67,164, 9,189,157, 61,162,173, 59,137,196, 95,147,141, 74,138,245, 26,234,160, 71,180,182,130,201,250, 68,101,129,
+104, 84,176,190,236, 31, 78,113, 4,122,234,239,182,152,188,132, 80, 68,216,162,240, 59, 68,103,231, 96,145, 41, 9,220,253,131,
+108, 68, 37,131, 55,217,132, 24, 80, 21,124,215,198,239,188, 93, 0,199, 8, 47,163,245,138,106, 55,235,222,109,240,147, 59,169,
+252, 94, 15,112, 78,226, 42, 19,148,223, 83, 75,149,195,149, 21, 54,114, 84,147, 1, 56,133,200, 11,162,134,193, 84, 21,202, 5,
+189,194, 36,243,255,189,121,154, 71,222,246, 21,124,226, 61,239,161,185,113,130, 75, 87,247, 56,210, 90,225,119,246,183,249,224,
+223,126,152,211, 27, 45, 42,107, 25, 20,126,148,153, 74, 69, 77, 73,110, 78,114,198, 14, 54,235, 13, 94,114,246, 33,206,156,190,
+139,229,118,135,102,187,193,102, 43,194, 53,155, 60,245,201,199,121,197,217, 99, 60,255,190, 59, 73,155, 53,250, 59,215,120, 32,
+222,166,115,246, 12,118,243, 4,182,214, 36, 94,248,140,226,255,197,213,155, 7,219,150,221,245,125,159, 53,236,233,140,119,126,
+115, 79,106,169,213, 45,169, 37,132, 0,129, 6, 16,177, 24, 92, 54,132,193, 14, 41, 48,132, 50,118, 72,217, 84, 65, 82, 84, 18,
+ 87, 25,112, 18, 87, 57, 9, 6, 59,184, 40, 87, 18, 28, 67,153, 33, 49, 97,176, 83,152, 50,131,176, 53, 32, 52,160,177, 39,117,
+191,238,126,227,125,239,142,103,220,211,154,242,199,218,231,156,219,168,170,235,117,247,187,245,250,222,163,189,215,250, 13,223,
+239,231,155,166, 8, 33,184,126, 99,143, 31,251, 91,223,193,143,254,240, 79,240,161,127,241,211,124,241,127,255, 73,206, 63,245,
+ 71,145,138,214, 61,195,171,174, 59, 94,154, 98,189,229, 89,119,220,235, 72,209, 77,131,238,253, 10, 73,187,242,182,115,129,204,
+181,137,103, 93,165,146,198,121,233,166, 88, 18,106,197,184,239, 84,235,221,178,127,213,161,139, 21,156,198, 11, 54, 12, 79,177,
+ 9,182,233, 4,117,171,203,124, 13,170, 25,109,197,241,125,232, 58,112, 95,131,112, 49,238,216,196,191, 23, 73, 55, 38,240, 49,
+238, 53,180, 85,252,225,117, 26,181, 24,171,233,217,170,248, 14, 22,239,226, 46, 91,136,168,144,119,117,217, 89,216,196, 38,175,
+219,182, 72, 20,166,110, 80, 89, 44,176,189,105, 9, 88,156,105,240,245, 18,231,226,247,101,154,134, 36,203,144, 90, 97,235, 57,
+217, 96, 4,105,130,112, 45, 82, 6,140,239,108,107,136,104,101,171, 43,124,144,232,254, 40, 78,194, 46, 68, 33, 6,231,153,222,
+123,141,217,237,155, 44,231, 11, 46, 63,114,153,172,159,240,240,133,155,156,216,248,156, 39,182, 37, 85, 41,165,115,152, 36, 35,
+ 84, 53, 65,102, 4, 23, 72,180,140, 29, 47,129,243, 69,131,247,129,218, 58,108,103,195, 13, 65,176, 52, 46,130, 50,145, 72, 41,
+ 24,101, 9,123,189, 30,143, 93,222,167,208, 9, 41,146,178, 44, 57, 63, 61,101,180,189,141, 38,193, 47,166,108,239,109, 81,158,
+157,177,172,230,152,197,148, 68, 10,126,248, 74,202,239,156, 88, 94,111, 65,168, 24, 16,147,117,183,174, 39, 96, 58,212,244, 64,
+ 11,164,146, 24, 31, 88, 74, 79,218, 25, 20,122, 74,160,187, 66,210,119,107, 0,191,162, 39,178,225, 50,188,177,246, 23,235,128,
+ 22, 41,163,149, 45,205, 51, 72, 61,119,254,252,156, 98, 91,144, 15, 6,204,155, 26,165,161,181, 22,227, 90,134, 87, 14,176,149,
+160,109, 20,187,143,245,200,198,138,118, 18, 8,141,163, 24,246,105,102, 21,197,120,136,208, 5,253,113, 10, 4,250,195,148,229,
+ 36,103,188,147, 51, 63,171, 81,211,146,230,172, 66, 14, 18,246,110,236, 50,185,119,194,253,231,239,241,229,195,155,124,211,123,
+ 62,200,205,231, 94, 71,164,138, 68, 23,100,105, 66,121, 63, 62,215,179,249,156, 32, 2,119, 78,207,169, 92,201, 40, 29, 33, 69,
+194,121, 61,231,176,188, 79, 79, 41,254,251,111,255,113,150, 50,160, 50,199,108,186, 96, 58, 45, 81,137, 97,111,188,197,201, 98,
+138,150, 18,253, 96,217,208, 75, 52,147,186, 37, 85,208, 79, 18,166,203, 5, 31,122, 92,110,242,148,131, 96,118,231, 14, 7,111,
+ 63, 32, 49, 75, 78,110, 61, 36,219,222,165,126,120,159,252,218,123, 34, 84,160,105,208, 50,198, 26, 90, 19, 72, 82, 9,121,202,
+238, 86, 15,170,130, 59, 15,231, 56, 91,241,199,159, 60,229,175,126,227,147,228,137,224,244,116, 70,175,159, 71,129,115, 7,195,
+240, 93,212, 95,221, 90,132, 78, 25,237,140,248,216,167, 95,162, 92,158,114,126,120,139,225,214, 1,207, 77,206, 56,216, 27,197,
+209, 86,154, 96,237,130, 94, 1, 90, 43,108,211, 34,218,146,173,113, 15, 79,193,116, 58,103,171,151, 83, 86, 93, 85, 83,213, 32,
+ 4,109, 61,231,111,254,224,119,240,123,255,219,127,197, 19, 55, 30, 97,220, 43,232,231, 57, 91, 69, 10,222, 83, 86, 37,214, 88,
+ 62,253,249,175,240, 77,215, 11,122, 87, 15, 64, 73, 68,170, 8,203, 42, 42,169,107,131, 42,204,102,215,170,211,181, 53,171,139,
+ 6,138,104, 72,219, 9,201, 86,167,152,117, 49, 89,204,196,203, 60,254,126,236,224, 67, 7,229,217,112, 16, 99,220,128,171,154,
+ 40, 34, 91,143,244, 26, 92, 83,225,202,154,208,169,120, 69,158, 19,100,129,176, 14, 23, 26,130,211,241,115,117,116,208,255, 56,
+218, 84, 90,198,203,173, 75,218,146, 46,144,228, 25, 66,105,178,193,136,234,228, 1,195, 71,159, 37,248, 47,196,168, 71,149,144,
+245, 6,168,112, 74, 45, 50,242, 68,224,173, 33, 27, 95,166, 33,224, 79, 79,208,123, 7,248, 50,226, 88,243,126,129, 72,195,134,
+194,229,163,253,204,181, 49,241, 45,116, 94,225, 24,148,178, 73, 71, 91,143,215, 47, 72, 9,226,124,211, 95,192,180,134,142,175,
+189,177, 27,209,113,205,131,220,116,241, 32, 98,194,157,119, 4,181,202, 40,151,221, 40, 56,116,207, 90,204,174,247, 29,248,198,
+119, 33, 26,190,174,186,110,211,227,233,108, 75, 86,224, 45, 76, 39, 51,178,254, 14,229,225, 3,126,247,175,125, 11,141,117,100,
+251, 87,104,188, 65,101,125,126,241,181, 59,156,215, 13, 91,131,130,179,218, 32, 69,100,108,251, 16, 11,231, 97,158,115, 88, 26,
+254,254,119,127, 23, 79, 63,245, 52,105, 30,191,183,175,220,121, 72,223,181, 44,252,136,179,123,231,164,162,225,241, 27, 55,176,
+193,240,250,139, 47,243,126,255, 21,178,119, 63,141,237,143,227,129,181,156, 67,190, 5,106,240,134, 78,184, 95, 20,188,237,137,
+109,254,245,111,253,115,158,251,194, 39,248,174, 31,251, 41,228,143,253, 67, 62,254, 3,239,237,106, 28,223,193, 99,186, 93,235,
+ 42,171, 60,128,235, 60,226, 43, 58,221, 42, 52,236,194, 21,222, 57, 16,196, 70,229,190, 98,177,116, 95, 47, 85,135,236,148, 97,
+ 93, 28,188, 97, 61,205, 74, 83, 26,185,249, 43,234, 87,100,185,199,103, 85,136,168, 7,240,110,227, 58, 91,187, 32,173,239,194,
+ 96,162,196, 62,149,174,131,226,248, 77, 70,188,143,228, 55, 42,131, 15, 13,162, 93,118,145,198, 9,194,214, 81,223, 33,117,199,
+111,215,120,215, 70,206,186,109,227,216, 29,139, 68,197, 12, 11,157,225,218, 6,103, 13, 66,200, 53,146, 87, 8, 17, 45,103, 34,
+193,154,146,224, 70,248,122, 17, 59,251, 54,106, 70, 98,113, 18,211, 18,131,157,226, 85, 31,169, 83,146,222, 40,218, 37,189,141,
+144,166,149,197, 46, 68,220, 45,222,163,242, 2,209, 54,168, 36,199, 27, 75, 8, 49,102, 52,116, 88,219,233,221,215,185,251,197,
+ 47, 51,216, 30,211,248,128,152,206, 40,182,123,180,222, 99, 85,198,153,129, 52, 9, 40,165,104, 22, 6,175, 53,153,247,152,110,
+117,146, 37,138,186,117,241,140,239,220, 6,182,123,143, 28,129,210,172,212,238, 81, 29,211,207, 82,180,146,140,243, 34,194,117,
+180,164,109, 34,229,174,156, 76,168, 23,115, 30,221, 26,144, 10, 56, 45,167,180,243, 41,169,138, 5, 72,170,224,123, 14, 20,191,
+250,208,114,212, 58, 82,173,104, 2,164, 33, 32,181,160,144,158, 76, 74,132, 15,140,101, 96, 43,137, 77,216, 64, 16,249,244,248,
+ 72,101,236, 10, 80, 27,181,193,107,129,231,106,120,167,244, 38, 49, 16,113,193,161, 17, 31, 28,116,190,141, 16,125,122,151, 22,
+ 44, 39, 75,174, 60,186, 75,121,214,114,255,245,219, 60,241,212, 35, 56, 19, 39, 37,161,241,164,189, 1, 82, 11,172,145, 88, 11,
+ 78, 74,124, 99,105,130,228,242,227,187,220,126,254, 62,179,163, 37, 66, 11, 76,227, 24,108,141,113,174, 33,205, 60,249, 80,163,
+ 24,208,202, 37,105,218,167,182,134, 80, 25, 46,101,251,124,249,139,207,145,168,148,189,237, 29, 66, 86,210, 98,121,243, 87, 95,
+225, 43, 95,190,135,210,158,190, 30,211,147, 5,173,232,227,172,195,203,150,161,144, 76, 84,194, 79,253,245,159,224,228,236,148,
+ 36,205,152,157, 45,152, 47,150, 88,103,120,254,236, 53,246,251, 59,212,174, 38,208, 67, 91,231,169,132, 99,209, 90, 6,169,198,
+122,199,110,218, 85,212,162, 27,167,117, 38,254,135,207,125, 22,191,152,161, 14,174,225, 31,189,134,104, 26,156,202,112,109, 36,
+ 40,181, 77,217,189,248, 50, 30,168, 2,198, 91,125, 78, 14,193,183, 75, 62,255,229,219, 60,118,109,204,173,215, 15,217,221,237,
+147,230, 3,234, 38,224,154, 24,240, 46,112,164, 72,172,119,221, 7, 26,119, 90,151,247,115, 78,213,144,124,116,149,135,135,183,
+216, 26,247,121,240,218, 17, 72,141,119, 18,171, 20, 7,227, 17,139,243, 19,146, 34,103, 62,175,152, 83,145, 21,125, 22,141, 37,
+ 53, 75, 18, 33, 98,184,136, 12, 12,122, 57,223,252,225, 31,161,254,204,207, 51,220,190,132, 94, 24,170,166,226,165, 87,207,169,
+ 27,195,254,168,199,116, 89,197, 81,177, 8, 28,221, 61,226,250, 32,135,222, 0,185,183, 75,152,205, 8,178,192, 87, 75,154, 96,
+ 72,183, 47,117, 36, 57,223,201,126,163,161, 55,168, 46,125,204,217,206, 66, 35,227, 37,223,182, 81,212, 86, 71,235,150, 51, 45,
+190,110, 8,109,187,137, 89, 5,188,144,235,212, 42,223, 68,164,170,109,106, 92,211, 68,114,218,108, 66, 88, 44,177,203, 22,177,
+ 61, 68, 13,134, 36,163, 45, 40,122,177,166, 80, 17,201,180, 74, 26,139, 74,231, 16,109, 53, 62, 16,180, 68, 10,137,202,162, 50,
+ 95,107, 77, 16, 93, 16,204,164, 70,247, 50,250,227,113, 7,206, 0,169, 21, 77, 89, 35,165, 66, 10, 15,233,101, 84, 58,197,169,
+ 45,218,147, 99,212,214, 54,161,173, 8, 71, 15, 72,246,246,187,145,172,140,222,223,182,163,100, 57,183, 94,234,134, 46, 39,254,
+ 13, 89,201, 65,188,113, 63,122, 49, 40,197, 69,227,106,232, 60,254, 43, 70,123, 88,237, 62,141, 95,239,215,195,202,141, 16,124,
+119,105,117,191, 23, 34,214, 52,172, 2, 34,130,239,184,220, 17, 2,130,214,209, 98,173, 84,204, 43,246, 26,100,142, 49,129,220,
+ 57,116,235,249,216, 63,255, 73,158,255,253,223,103,116,249, 10, 46,120, 26, 82,254,244,116,193, 39, 30,220,161,167, 53, 82, 8,
+170,214,146,104,133,115,142,210,195,126, 47, 99, 90,183,140,250, 35,126,241,251,190,143,108,156, 51,153, 60,224,245,155,115,206,
+231, 53, 3, 37,225,250, 37,110,221,122, 64,235, 12,111,186, 52,230,120,177,228,252,240,132,119,154,135,140,223,172,176,105, 31,
+185,156, 34,149,142,236,240, 98, 7,149,239, 94,240,115,199, 34,103, 32,224,171,158,121,156,201,249, 93,254,143,191,247, 55,248,
+158, 31,250, 73,190,245, 35, 19,254,236,199,190,153,217,243,127,126, 33, 2,125, 19, 28,179, 78, 82, 91, 55,235, 29, 71,207,118,
+194, 53, 21, 46,208, 98,195, 58,151, 58, 92,160,133, 9,177,106,208, 3, 23, 83,106,196,133,100,182, 88,204, 93,208, 28, 10,129,
+ 16, 43,152, 80,183, 11,245,157, 34, 78,132, 24,219,218,165, 24,107,213,133,186,116, 43,147, 56,250, 54, 23, 8,224, 43,161,104,
+178, 65, 55, 59,143,111, 75, 96,134, 28,236, 19,108, 11, 42, 33,216, 26,172, 69,100, 61,130,105,241,190,233, 46,228,121,252, 30,
+117, 15, 87, 77, 8,197, 24,215, 44,240,117, 73,208, 25,202,153,248,238, 42,133, 43,151,241,191,209, 54,216,122,129,107,218, 8,
+156,106, 23, 49, 68,168, 19,114, 6,231,208,189, 1, 2,137, 78,114,116,175,223, 41,221,227, 37,164,178, 2, 93,244,208, 89,142,
+ 53, 38, 82,234,156,143, 1, 49,222,199, 68,183, 14,197,140,247,216,186,225,222, 75,175,240,240,193, 41,193, 7,150,117,195,246,
+163,187,120, 97, 24, 72,201,131,214, 16,178,156, 10, 73, 83, 53, 20,189,148,233,188, 34, 43,114,122,210, 83,182,150, 52,137,147,
+139, 89,235, 72, 47, 84,208, 33,132,136,141,149, 81,104, 38, 16,140,243, 12, 45, 21,189, 52, 97,177, 44,217, 26, 13,105, 91, 71,
+ 89, 47, 89, 44, 75,182,135,125,246,243,132, 93, 44,199, 47,191,136,245,129,180, 40, 16,213,108,109,241,149,222,243, 55, 46, 39,
+124,124,226,120,190,140, 33, 83,121,183, 30, 13, 66, 50, 80,130,221, 20,114,225,217,210,130, 44, 4,180,140,124, 5, 41, 69,236,
+206,187,245,206, 42,137, 57,138, 55, 55, 73,128,157,121, 96,157,186,184, 89, 13,197, 2,179,184,252, 8,217, 32, 33, 75, 18, 70,
+ 55,174, 50, 61,170,200,250, 57,245,210, 49,222,221,165,109, 90,130, 12,140, 30,217,231,181, 79,124,137,222,193,136, 84,194,233,
+221,115,132,128,249,164,101,255,145, 17,147, 7,231,204,206, 30, 80, 20, 99,118, 47,237,146,245, 21,229,121,201,236,161, 97,235,
+218, 8,215,120,154,178,102,247,234,152,151,190,112,139, 94,145, 82,150, 2,227,107,246,246,247, 80, 40,150,101,197,163,111,126,
+148,155, 95,190,195,253,155,103, 44,150, 11, 50, 61, 6,150,204,236, 2, 21, 2,214,183,228,137,224,112, 49,231, 39,191,253,111,
+115,120,122, 68, 81,244, 88,206,151,244,147,140, 48,176, 52, 6, 46,183,123,248,208, 99,222, 30,177, 83, 20,104,227, 3,109,219,
+117, 20, 66, 49, 55,150,247,111,203,120,246, 10,177,238,230,116,140,148,230,244,206, 43, 20,181,192,251,134,237, 31,254, 31,169,
+170, 37,189,188, 96,190,152,179,152,215, 36, 50,224,131,100,123,103,132, 76, 4, 37,142,157,157, 33, 55,111,222,226,109,143, 12,
+ 56,121,112,194,161,182,156,205, 6, 92,191, 17,200,219, 6, 80, 88,231,168, 90,199,206, 32,163,106, 26,236,188,193,122,207,114,
+ 89,209,180,134, 7, 71,199,188,227, 45, 87,249, 98,179,228,248,244, 12,219,206,216,219, 30, 32,244, 16,172,227,244,252,140,233,
+100,130, 63, 79,216,218, 25,177,152, 76, 88,180,150,173,126,206,108,114, 78,210, 31,145,164, 41,198,181,124,240,125,223,201, 19,
+211,223,225,112, 94, 49, 26,245, 89,204, 78,146,225,185,113, 0, 0, 32, 0, 73, 68, 65, 84,208, 66, 48, 84,154,147,208, 32, 37,
+164, 82, 33, 18, 79, 42, 51,238,221, 95,178,125,117, 74,238, 61,114, 16,227, 76,195,116, 14, 89,134, 88, 24, 26,125,134, 74,163,
+ 14, 0,217,237,232, 0,146,110,100,222,217,162,226,152,221,196, 75,217,216,184,135,110, 90,172,181,208,117, 9,161, 67,104,174,
+179,129, 67,204, 31, 86, 33,122, 85,221,108,137,175,150,184,201, 57,246,238, 3,154, 69, 21, 61,218,167, 19,178, 71,174, 32,211,
+ 44,122,233, 67,124, 89, 54,150,176,248,247, 74, 43,186,168,243,152, 85, 44, 21, 42, 77, 80, 73,142,202,114,100,146,162,138, 2,
+ 87, 86,228,131, 29,134, 59, 45,105,175,199,226,124,134,232, 60,247, 33, 73, 34,209, 14,135,244, 1,151, 40,228,206, 46,246,252,
+140, 48, 28,224,141,197, 31, 31, 35,199,195,120,217,120,113,193, 39,188,138,187, 92,113,195,195, 38,150, 60,108, 46,229, 55,252,
+111,213,169,139, 0, 54, 22, 9,200, 8, 0,138, 41,183,241, 82, 70,132,104,237,235, 46,183,149,167,117,173,189,187,112,121,248,
+136, 83,139,159, 67,215,185,199,142,202, 98, 77,139, 74, 10,210,241, 54,164, 5, 89,222,199,182,134, 95,250,151,191,202,239,127,
+254, 37, 14, 46, 93,230,219,126,224,123,152,124,254,203, 60,184, 55,231,213,101, 96, 98,106,118,139,140,210,198,238, 71,119,147,
+167, 84, 43,178, 32, 24,224,120,203, 83, 79,241,214,167,223,202,159, 60,247, 34, 94, 40, 68,210, 35,209, 25,211,243, 83, 70,143,
+ 93,227,181,227, 51,166, 75, 71, 63,109,152,212, 99, 62,243,185, 23, 57,157, 76,248,190,247, 13,168,210, 75, 20,229,130, 16, 28,
+121,154,227, 80,248,182, 69,134, 6, 33,178, 53, 32,101,126,255,140,197,141,109,194,225, 9, 55, 30,191,138,217,247,252,241,111,
+253, 2,239,185,127,151,175,249,185,223,229,249,255,245,239,114,244,145,223,125,131, 39, 27,186,177,235, 10,234, 18, 54,202,117,
+157,116, 49,143, 93,193,181, 22,192,177, 25, 60,173,214, 37, 65,136,152,179,174, 86,214,184,120,191,226, 58,192,140,239, 86, 74,
+146, 55,120,215,133,250, 11, 25,240,221, 40, 53,118, 89, 1,108,236, 24, 67,135,186, 21,158,232,158, 17,129,252,107, 62,176,122,
+ 72, 46,128,159, 76, 39,196, 83, 49,255,192,153,184, 19, 95,158, 34,117,190,254,103, 84, 22, 39, 22,166, 92,123,242,108, 89,162,
+ 18,137,107,107,154,243, 51,146, 65,131, 43,231,248,110,133, 69,162, 35,205, 13, 58,150, 66,156, 16,152,249,180,211, 9,121,156,
+119,113,213, 17, 20,193,148,200, 36, 71, 72,133, 16, 41, 66, 74, 20,160,179, 12, 91, 85,208, 27,196,247, 83, 41,140,137,241,192,
+ 74,107,218,106,129,146,129, 32, 6, 4,211,162,148, 6, 41, 48, 29,152,198, 57, 71,227, 60,163, 94, 2, 72,122,253,148, 36,207,
+232,245, 51,182,140,224,176, 54, 52, 94, 66, 18,133,194,169, 74, 48,198,144, 20, 25,165,105,200, 19,141, 51, 22,213,237,165,165,
+128, 92, 43,106, 27, 87, 90,178,211, 70, 37, 82,162,132, 96, 81, 55,228, 74,241,252,225, 17,239,204,115,178, 92,208, 58,207,168,
+ 87, 32, 77,197,163,163, 33,139,233, 41, 33,237, 49,238, 15, 49,179,135, 17,171,159,166, 96,236, 58, 29,240,253,219,138,167,250,
+158,187, 85,244,162,247, 59, 49,101, 42, 60,133,130,173, 68,146, 74, 80,157, 16, 46,116, 80,153, 24, 58, 40,214, 69,232,134, 58,
+184,153, 20, 73,249, 6, 74,243,122,197,227,125, 20,216,229, 59,215,152, 62, 92,114,120,231,144,183, 62,243, 54, 94,123,245, 22,
+136, 24,141,171, 18, 69, 47, 27,224,109,192,151, 51,208, 67,252,204,113,178,188, 75,146, 15,104,231, 53,215,158,190,132, 78, 53,
+211,123, 21,193,164,132,190,228,238,203, 71,140, 70, 5,147,147, 9, 91,251, 99,206,238,156,226,131,160, 46,107,132, 10,184,202,
+227,146, 40,178, 83,133,164, 89, 56, 46, 61,153,241,196,229,183,242,255,253,246, 71,121,250,137, 71,168, 22,158,201,180,229,234,
+182, 65,107,197,229,100,159,215,206, 94,229,188, 61, 99,106, 26,254,242,179,207,112,124,126,202,214,126,159,201, 98, 78,115, 58,
+163,182,150, 98,164,185,255,234, 49,253,194,114,237,198, 62,215,203,171,252,236,199,126, 22,109, 59,191,104,166, 4,149,179, 88,
+239,249,235,151,244,198,186, 19, 98,164,166, 95, 41, 11,125,160, 60,254, 10, 5, 79, 32,146, 2, 91, 85, 52,245, 34,134, 0, 44,
+ 74,166,141,165,215,239, 99,157,165,173,106, 76,235,144,120,118, 71,125,238, 47,151,124,241,230, 29,244,157,187,188,255, 27,222,
+206,114,145, 67, 94,176,168, 27,148,138, 86,143,211,211, 37, 90, 11,180, 86, 72, 66,212,136,248,192,141,107,151,152,204,206,105,
+173, 97,208, 75, 57,183, 57, 47,222,122,192,168, 63,161,151,233,117,148,163,166, 97,118, 90,145, 36, 9,153,178,228, 26,138,131,
+125,206,102, 19, 48, 5,223,255, 87,254, 10,251,211,223,231,104, 86, 81, 20, 57, 54,120, 70, 69,129,169,107, 78,102,243, 24,103,
+232, 60,227, 97, 15,116,194,142,177,188, 60, 95,112,112,239,152,189, 3, 71, 64,144,110,141,145,222, 19,230,115, 84,154,194,241,
+ 9,236,236, 16,242, 20,237,116, 28, 61, 10, 1,173,137,163, 62, 23,153,229,182,105, 9, 85,213, 93,228, 38, 42,101,173,237,130,
+ 62,136,163,245,245, 24,186,131,156, 4,135, 68,224,156, 35,180, 38,142,237,210, 28, 89, 12, 81, 87, 83,114, 27, 80,137,194,216,
+104,103,112, 77,131,232, 57,164, 74, 17, 50,116,105, 89,172, 36,162, 72,161,241, 2, 20, 18,151,202,168, 34,149, 10,149,165,232,
+193, 16,161, 53, 66, 73,234,243, 51,210,253, 49, 58, 63, 35, 29, 12,112, 39,103, 8, 37,177,198,145,164, 49,121,230,164,106,248,
+211,143,254, 25, 31,126,239, 87,147,100, 26,215,235,211, 46,150,104, 85,195,214, 8,113, 54,137,193, 46, 58, 89,143,112,215, 64,
+151, 85,230,177, 91, 69,195,190, 49, 36,101,149, 46,135,232,148,253,171, 11, 58,184,206, 51,221,169, 96, 87, 9,106,221, 8, 61,
+ 8,214,227,245, 55,254, 21, 29, 78,171,125,232, 74, 40, 21,130,195,117, 88, 95,107, 44,222, 11,210,124,128, 46,118, 24,110, 95,
+ 66,160,249,185,255,235, 55,120,120,126,138,151,146,171,227, 20,219, 46,121,248,192, 50,218, 30, 96, 94, 63, 98, 54,183,156,149,
+ 37,198,249, 24, 86,177, 66, 87, 10, 72,148,164, 31, 44,123,215,159, 68,140,199,124,242, 43,175, 51, 26,141, 25,245,250,204,107,
+203,189, 7,183,184,178,183,197,225,100, 74,235, 51,110, 29, 29,241,216,254, 0, 53,159,241,210,107,175,176,156,156,195,123,158,
+196,171,235,216,122,129,202, 51,172, 0, 91,205, 72,189,239,110,196,232, 51,158, 28,221,225,124, 89,243, 96, 58,231,250,104,192,
+236,248,140, 98,119,196,254, 51, 79,114,243,246,199,240,255,116,201, 87,253, 79,191,204, 23,255,254, 15,115,252,145,223,217, 40,
+211,217,132,167,191, 49, 56,101,147,173, 46, 59,135,133,232, 88,237, 74,117, 35,252, 16, 99, 47, 87,105,108, 82,139,245,129,186,
+138, 83,149, 82,108,132,119,116, 12,122, 45,214, 99,120,239, 34,230, 19, 23, 34,174, 87,172,124,242,171,208,236,176, 14,124,193,
+197, 68, 64, 41, 68,156,178,143,158,216,228,163, 95, 20, 86, 10,129, 76,114, 92, 85,226,189, 33,180,237,230,226, 15, 49,213, 79,
+166, 81, 16,231, 76, 29,131, 88,130,199,204, 30,226,210, 94, 44, 10,125,131,109, 20,206, 52,132, 16, 48, 45,113,149,211,205,119,
+189,141,248, 98,157,230, 88,211, 68,205,140,239, 82, 5,157, 7,225,226, 94, 94, 37, 8, 33, 81,121, 4,205,184,182, 65,234,232,
+254,113,243, 25,161,191, 90, 47, 69, 17,103,219,148,132,214,226, 18,240,211, 83,132, 46, 72,250,163, 88,108,170,148,249,189, 87,
+209, 73, 74, 91,183,212, 82,112,249,145,125,212,114,201,173, 87, 14,241, 46, 48, 30, 13, 32,179, 28,213,142,105,229, 81,105,252,
+188,140, 3,149,196,125,122,180, 20, 10,116,151, 77,159,233, 88,176, 25, 39,186,132,194, 85, 56, 10,180,214,161,165,164,178,150,
+ 55, 95,185,204,210, 24,206,230, 75, 2,241,191,117,105, 48,192,232, 20, 39, 53,151,158,120,132,246,244, 40,118,213,189, 33,182,
+173,227,252,100,181, 16, 23,176,155, 72,118,147,248,234, 59, 65,156, 20,116,239,173,146,155, 33,205,234,189,117, 93,236,110,184,
+112,145, 59, 31,208, 98,163,225,240,126,109, 80,192,119,107, 35,183, 90, 31, 5,129, 37,176,251,214,175,225,214, 39,207,240,198,
+243,250,235,119, 48,181, 65, 37,112,251,244,140, 15,160,201,135, 3,142,239,223,161,158,143, 16, 50,193, 72,203,242,212,112,249,
+ 77, 99, 78,170,150,197, 81,139, 21,115,204,194, 50,186,180,205,226,116,193,104,191,135,115,142,237,131, 45,202,101, 25,215,121,
+222,147,228, 41,243,233, 18, 47, 53,251,143,229,220,123,112,196,245,199,159,226,165,151, 94,224, 43, 95, 57,101,111,112,141,221,
+237,130, 73,125, 70, 95,143, 24, 23, 5, 75,183, 96,231, 74,131,114, 61,182,203, 29, 2,158, 66,215,252,230,103,255, 3, 63,253,
+159,253, 56,147,147, 19, 8,150,198, 47,113, 86,209, 52,134,169, 59, 39, 93, 38,180,175, 28,115,227,201,107,124,251,155,223,135,
+214,221, 15,111,124, 64, 11,201, 65, 79,115,144,138,117,194, 81,232,246, 94,206,116,149,144,140, 74,213,244,237,239,138,112,133,
+186, 69,229,138,182,174,241,206,176,189,221,163,169, 27, 36, 22,103, 60, 58, 13, 72,225,200,251, 41,198, 89,242, 60,229,193,131,
+ 91,220,190,183, 71,109, 12,227,126,159, 52,207,232,247, 10, 90,179, 68, 8,137, 9,130,156,100, 13, 24,185,180,183,195,249,233,
+ 57,231, 70,240,174,103,159,225,232,232, 20,113,251, 22,253, 34, 67,168,148,166, 90,112,116,126, 28,133,118,206,144,101, 41,153,
+212, 40, 5,167,167, 15,185,188,127,192,123,174,239,242,173,239,188,206,209,221,127,143, 43,182,232, 21, 57,130, 40, 66,203,122,
+209, 35,252,228,141, 75,220,185,191, 96,247, 96, 76,211,198,150, 33,104,201, 3,155,225,142,231,156, 15,123,136,172, 36,104, 65,
+ 50,220,194,205,230, 36,219, 59, 72, 12,162,170,160, 95, 96,140,143, 41,101, 29, 63, 60, 52,113,212,238, 77,139, 93, 54,120,211,
+198, 93,137,139,213,124,236, 44, 67,167,118,221,136, 60,164, 88, 39,233,198, 14,214,154,117,154,147,202, 82,188,216, 34,217,150,
+160,227,104, 76, 16,240, 77, 73,217,152, 85, 32,215,102, 15, 42, 55, 50, 80, 33,117, 84, 50, 11,133, 20,186, 11, 93,209,232, 94,
+ 63,142,196,118,118, 89,126,233,139, 24, 15,217,193, 21,146, 60,199, 53, 6,215, 90,164, 78,215,111,143, 18,130,225, 86,159, 82,
+ 42,126,251,207,190,192,254,214,144,247, 60,126,153,162, 87, 96,155,150,242,232, 12,149, 74,116,146, 34,146, 28,153, 38,200, 44,
+141,113,160, 50,238,243,227,178, 61, 38,219, 5, 47,222,144,194,181,190,216, 59, 10, 93,140,145,245,235,228,182,176,206,196,246,
+107,220,172,119,161, 91, 53,116, 74,119,213,165, 89, 5,143,235, 62, 11,223,225, 63,125, 55,118,247, 86,224, 86, 24, 90, 20,217,
+ 96,135,193,248, 50,181,131,127,241,123,127,196,171,231, 37,147,170, 68, 18,104,218,192,118, 95, 51,204, 45,159,189, 19,248, 79,
+159, 25,179, 59,204, 88, 28,149,180, 33,138,119, 50, 9,214, 9, 18, 21,247,247,169,179, 60,246,230,167,112, 91, 99,202,214,177,
+183,183, 67,146, 38,148,109,205,253,243, 51,100,104,153,183, 53, 85, 25,232,229, 22,220,156,233, 60, 58, 37,124, 83,114,188,156,
+114,255,240,148, 43,251, 39,140,149, 32, 29,143,112,198,210,206, 42,242,182, 3, 12, 73, 77,162, 21,251,251,215,248,161,247,190,
+155,231,111,190,196,224, 81,232,169, 62,253,162, 69,246, 91,134,215, 46,113,178,188,197,167,255,187,191,195,215,252,163,127,201,
+151,127,234,135, 56,250,200,239,110, 44,224, 23,214,224,235,177,249,138,228,231, 5, 65,119,251,246,149, 94,193,119, 79,215,202,
+ 37,198, 42,159,190, 43,160,132, 64,200,139,221,245, 38, 68, 38, 90,214,194, 5,233, 68,119,250,202, 85, 32, 7,107,242, 93,167,
+ 83,219,120,232, 87, 73,112,182,219,201,227,129,250, 66,112, 75,135,138, 85, 41,193,214, 4, 95,197,125,113, 83,145,166,219,224,
+108,212,118, 4, 8,174,193,213, 22,148,140, 97, 75, 54, 90, 44, 93, 93, 33,116, 70, 8, 14, 59, 63, 39,116,206, 23, 41, 28,182,
+ 54,168,180,136,207, 84,221, 96,170, 41, 74,236,198,201,155, 45,163, 7,221,117,170,106, 28, 58,209, 4, 21,161, 68, 4,133,146,
+161,203, 94,151,164,233, 8,103,154,142, 41, 16, 21,238,206, 71, 95,189,200,243, 11,105, 38, 27,252,180, 80, 10, 87, 47,153,157,
+157, 99,140, 65,135, 12,103,162, 18,186,108,107,154,218,225,165,166, 81, 25, 89, 38, 25,167, 1,211,122,208,129, 4, 25,153, 2,
+ 62,134,175, 84,198,197, 46, 86,119,140,253,206,141, 96, 99, 6, 77,236,226, 87,121,227, 50,106, 79, 78,102,115,198, 69, 78,166,
+ 53,137,150,148,117, 73,126,229, 17, 78,207, 79,184,254,232,155, 16,206,146, 36, 41, 62,239, 81,150, 75,188,247,248,149,222, 97,
+165, 92,239,214, 95, 74,117,197, 3,113, 79,142, 18, 88, 31,214, 93,125, 16,108,194, 89, 58, 13,135,191, 0, 7, 52,145,103,211,
+ 65,130,196, 58, 1,123, 37,162,148, 93,175, 32, 58, 21,157,241, 57, 87,223,114,137,207,124,250,203,236, 45, 27,134,151, 10,166,
+247, 65, 13,166,244,183,182,169,171, 9,161,113,180,193,145,229, 26,172, 32, 36,146,166, 46,113,203,115,142,143,103, 20,195, 61,
+138,222,128, 52,149, 44,167, 37,139, 73,131, 46, 36, 90, 42, 78,239, 78, 80,153, 38, 9, 9, 62, 83, 20, 38,229,196,223, 7,117,
+153,241, 65,134,208,138,118, 33, 17,164,124,238,179, 47,224, 91, 88,154,192,177,187,203,229, 98,159, 87, 78, 14,121,199,238, 85,
+ 94,187,119,194,162, 93, 82,228,158,220,246, 72, 84,202,253, 91,247, 73,123, 2, 82,195,214, 65,143, 23,159, 59,132, 89,140, 93,
+ 45,219,150,153,121, 13,110, 6, 62,240,236,135, 81,227, 34,253,153,135,203,150,218, 70, 98,211,175,189, 77,163,100,172,148,195,
+ 90,133,189, 34,249,116, 47,163,132,199,254,135, 95,137, 57,175,173,165,156, 47, 49,173,165,223, 75, 40,178, 4,211,212, 32, 21,
+243,201, 28,129,165,109,226, 97, 60, 59,159,114,231,238, 93,238,222,191,131,181,130, 22,199, 78, 63, 35,120, 75,211, 52, 40,225,
+217,217, 42,104, 26, 67,162, 2, 77, 19,253,147, 69,162,144, 66,145,104,143,111, 61,214, 90,150, 38,238,154,166,179, 57,214, 89,
+180, 72,105, 90, 75,154, 14,168, 91,195,188,170, 72,210, 30,223,252,129, 31,226,127,249,137,239, 96,203,220,163,106, 44,105,214,
+163,109,107, 82,169,226,158, 46,215,152,198,163,180, 98,180,219,227,232,172, 98,127,111,132, 74, 82,218,166,197, 91,135, 38,240,
+ 66,229,185,124,246,144,108,127, 59,118,143, 62, 64,150, 97,167,209,218, 16, 92, 76, 36, 66,198, 29, 91, 48, 6,187, 44,241,101,
+141,169, 74,236,178,193,212, 45,206, 24,130,105, 55,124,237,238, 81, 13, 46,114,148,215, 93,165,232,186, 74,235,214,126,225,208,
+ 33, 43, 87,100, 78,143,236,194, 32, 36,182,109, 17, 82, 98, 67, 64,106,133, 44,122, 93, 1,214,189, 36, 74, 33,208, 72, 45,209,
+ 58, 69, 38, 10,169, 19,100,146, 34,147, 12,153, 21,164,195, 1,233,181,235,220,250,103,255,140,108,239, 50,234,145, 45,146, 36,
+ 35, 88, 75,181,172,152,158,157,179,253,196, 51,100,247, 95, 98,114, 86,146,236,239,243,202, 11,159,103,123, 60,166, 55, 28,112,
+167, 50, 28,149, 6, 65, 96,148, 38, 40,161, 98,158,114, 55, 70,113,206,226,155,206, 14,228,162, 43, 32, 4, 79,176, 93, 44,101,
+103, 67, 11,206,227,125,164,136, 69,253,144,143, 23,118, 7,196, 8, 54, 22, 68, 62,128,247, 46, 78, 40, 58,200, 71,112,177,210,
+143, 16,144,248,231,186, 16, 63, 75,135,199,219,128,115, 30,103, 29,174,141, 95, 99,172, 67, 37, 61,138,164,199,253, 7, 39,252,
+230, 23, 94,224,143,158,123, 1, 47, 4,121, 34,153,215,150,195,227, 25, 85, 93,161, 83,201,237,147, 57,253,188,224,250,158,134,
+249,146,101,213,242,202,164,236, 84,225, 18,235, 61,195, 68,145, 42,201, 25,138, 71,223,252, 4, 46, 72,246,183, 6,244,123, 5,
+ 62, 88, 70,125,133,176,150, 73,213,144,165,154,179,249,130,179,233, 4,239, 44,139,186,165,170, 26,188,107,105,234, 40,136,121,
+247,229,130,178,172,201,138, 12, 91, 45, 56,189,245, 58,253, 43,111, 38,219,221,143, 9, 94, 1,102, 15,111,179,223, 10,254,195,
+ 39,254,132,107,227, 17,185,240, 12,119, 34,201, 44,221,218,161,184,180, 79, 59, 57,164,253,242,243, 60,253,247,254, 41,183,126,
+245,159,116,128,150,141,135,125,253,235,122, 82, 39,215,251,117, 17, 54, 22,161,205,215,108,188,192,171,209,168,214,162,139,118,
+ 21,107,194,238, 90,203,215,213, 98, 34,108,138, 56,209,165,200,197, 88, 81,162,115,161,243,174, 9, 41,214,216,130, 24,211, 26,
+214,217,218, 66, 64,255,224,128,226, 29, 31,238, 38, 22, 81, 63,178,214,182,120, 23,117, 42,193,225,154,136, 7,246,214,226,109,
+ 75, 48,150, 96, 91,188,169, 8, 72,130,111,105, 38,167,221,200,222,226,218, 26,145,102, 93,154, 96,183, 42,240, 1,239,109,244,
+163,183, 45,174,169,215,252, 2,103,154,181, 31,218,117,224, 24,180,140, 29,186,206, 16, 90,162,117,142, 72, 83,116,150,198, 31,
+ 47, 43, 34,240, 40,216,117, 24,140, 88, 81,251, 58, 60,178,206,251, 56, 23,213,209,222, 24,170,243, 83,206, 94,253, 10,159,254,
+131,143, 32,180, 38, 79, 21,184,150,235, 59, 3, 68,211,208, 4,143,146,154,172,159, 99,173,235, 38,111,130, 52,203,200, 18, 73,
+154,104,180, 86, 28,159, 46,162,216,205, 6,150,173,193,134, 64,101, 3,141,245, 52,206, 71,106, 91,119, 61,106, 41,216,201,114,
+188, 16, 36, 90, 48,238, 21,148,141,197, 89,203,141, 43, 87,105,172,227,242,213,235,244,139,130,164,169,112,243,115,150, 85, 69,
+ 91, 47,241,166, 93,255,255, 37, 47, 20,101, 43,181,186,238,214, 62,234, 2,162, 56,172, 24,255, 97,227, 98, 93,215,143, 98, 99,
+115,148,114,195,129,127,195,243, 43, 55,105,193,206, 95,208, 28, 95,122, 47,195, 27, 91,188,246,153, 7, 56, 85, 83,164, 57, 47,
+ 29,127,158,239,249,214,111, 67, 13, 83,218, 89,137, 42,122, 36,217, 0,188, 39, 29,244,176, 75,139, 74, 18,202,101, 69,179, 48,
+244,119,247,201,199, 41,121,175,192, 46,151,212,173,199,151,134,214, 26,218,198,224,188, 35,223, 43,232, 13, 50,178, 97,143,118,
+230,185,245,218, 67, 84, 57,224,246,205,123, 4, 37,233,231, 3,102,229,146,253, 43, 57,253,180,143,179, 22,143,231,116,121,204,
+100,210, 50,107,150,156,182,199,236,247,251,156,182,167,164, 18,102,147,138,190, 74,169,171, 37, 15, 95,159, 33,165,103,209,148,
+148,166, 34, 87, 26, 39, 2, 91,186,199, 51,239,185,129,254, 39, 63,250,125,120,231,152,215,130, 15,191,235,113,238,252,159,255,
+115,124, 39,216,228, 34,116,164,128, 56, 25,237,132, 44, 94,167, 88, 99, 48, 85, 75,235, 2,137,148,180,141, 93,151,238,109,217,
+160,165,197,182,129, 60,147, 44,149,164, 95,228,108, 13,122,204, 23,115,158,123,225,121,198,251, 3, 94,186,115,135,183, 94,191,
+138, 9, 10,231, 53,245, 97,203,214,168,160,172, 35, 18, 84,137, 64, 89, 89, 90, 99,200, 84,206, 97,179,164, 50,112,117,103,135,
+147,217,148,195,214,210,203, 82,202,202, 34,101,134,105, 91,156, 3, 45,114,156,213,124,221,215,190,147,219, 95,248, 61, 72, 10,
+124, 57,195, 59, 67,154,166,152,166,197, 89,203,149,253, 61, 22,147, 99,250,163, 1,163,237, 29,182,134, 37,217,160,160,109, 61,
+178,244,180,141, 39, 73, 19,122, 46,229,163,147,148, 15,191,248, 50,234, 93,111,195, 54, 13,109,219,146, 40, 73,123,120, 72,126,
+176,135, 60, 62, 69,247,234, 24,202, 96,163, 37,199,219,208,229,131,119, 9,100, 43,113,182,243, 23, 60,215, 93, 47,226, 76,215,
+ 98,171,120, 40,116, 22,170,176,105,135,226,225, 41,187, 40, 77, 64,120, 71,219, 54,216,186, 34,200, 4,149,234,181,229,103, 5,
+219, 8,178, 19,196, 41, 21,199,223,169, 68,166,189,104,215,145, 9, 34,201, 81,189,130,236,202, 53, 22,159,248, 56, 92,185, 76,
+126,227, 90,140, 40,205,139,232, 57,109, 59,139, 79,146, 96,173, 37,209, 41, 22,131, 70,176,123,229, 82, 20,198, 40,137,183,142,
+135, 77,197,235,231, 11,242,214,240, 88, 46,217,234,231,144,102,209,119, 74,196,112, 74,170, 72,225, 91, 45,194,100, 23,194, 16,
+111, 96,130,176,235,128,156,200, 99, 95,249,210,227,161, 31,156, 32,208,196,174,220, 70, 33,162,239, 70,118,126,133, 47, 93, 51,
+ 99, 58, 17,156,245, 56, 25,119,252,182,109, 49,166, 65,202,130, 17, 45,254,214, 39,169,151, 75,254,205,244, 10,139,164, 96, 80,
+228,136, 32, 72, 20,164, 42,144,105, 71,162, 19,142,207, 27,188,245,204,203, 41, 31,123,121,204,251, 14, 70, 60,126, 54,231, 43,
+167, 25,147,166, 69, 74, 65,162, 52,103,198, 80, 27,199,187,222,249, 44, 58,141,221,219,194,120,148,171, 57,158,198,145,240,225,
+121,201,176, 16, 44,150, 37, 14, 71, 85, 55, 12,115,197,178,110, 57,107,226,110, 63,193,243,235,183,103,124,219, 75,119, 24, 29,
+204, 40,219,154, 98,107,196,217,241, 41, 87,191,250,219,224,228, 24, 70, 91,200,222,144, 98,231, 18, 95,250,252,167,185,220, 75,
+ 73,202, 37,147, 86,147,188,126,194,246,229, 45,194,108,142, 45,114,250,111,126,138,163,207,127,150, 27,159,255, 20,239,253,181,
+ 79,243,241,239,125,251, 38,238, 84,176,206, 51,223,236,184,253,186, 67,218, 92,236, 98, 13,249, 88, 61,143,225, 2, 68,198,117,
+ 28,241,176, 58,176, 87, 25, 56,157,122, 57,248, 21,209,110,163,167,243,157,253,136,213,110, 84, 69,177,156,191, 64, 10, 19,171,
+117,160, 88,217, 16, 65,205, 22,107,245,118,252,230,116, 23, 38, 19,119,230, 36, 61,124, 57,235,184,235,128,107, 8,206,211,150,
+ 75,132, 16,104,157,224,154, 10,153,232, 53,223,192, 17,240,166, 38,204, 44, 66, 42,172, 16,104,157, 18,221,105, 41,182,141, 20,
+ 68, 99, 27,180,210, 81, 49,222, 86,232,193,184,227, 61, 58,130,153, 32, 85, 30,221, 60, 73, 18,223,127, 37,208, 43, 34, 79,103,
+ 21,115,182, 99,165,121, 79, 16,209, 33,162,178,116,157, 40,231, 58,210, 98,168, 5, 94,229,136, 60,167,156, 28,227,132, 98, 80,
+164, 28, 92,218, 33,197, 98,103, 51,188, 82,228,253, 1,203,218,161,165, 98,188,157, 51,169, 28,200, 6,231, 60, 82, 43,132, 22,
+ 12,100, 74, 32,160,144, 24,103, 89, 54,142, 60, 81,204,156,197,134, 64,145,200, 78,107, 18, 47,224, 34,209, 52,206,226, 17,228,
+ 73,194,253,201,148,237,126,159,171,151, 46,177, 8,142,199,246,174, 80,182,150,177,150,148,179, 9,211,249, 12, 91, 45, 9, 38,
+226,153,149, 8, 56,161,112, 4,146,176,166, 87,128,128, 54, 4,212,122, 99,210, 81, 9,229,198,111,177,138,240, 93,173, 84, 54,
+ 23,255, 38, 15, 98,181, 74, 88,233, 52,252, 70,182,211, 5, 7,117,142,133,100,151,231, 62,246, 2,243,102,206,233,236, 33, 47,
+ 30,222,225, 15,239,126,158, 31,255,145, 31,227,244,120,138, 19, 18,133,102,251,137, 33,147,155, 11,178,177, 70,157,120, 22,103,
+231,248, 32, 17, 42, 33, 29, 56,238,190,112,155,247,127,255, 55,114,255,149, 91, 20, 67,205, 98, 49,103,119,235, 18,167,135, 83,
+ 70,251,125,122, 3,205,178, 62,103,127,231, 58,121, 33,240,231,142,251,167, 15, 24, 15,118, 34,109, 48, 64,191,200,176,218, 80,
+183,115, 84,136,164,204, 52,237,209, 56,203, 91, 47,111,241,185,123, 11,206,231,142,105, 99, 89,154,150,151,102,159,226,250,118,
+143,164, 72,201, 70, 30, 97, 19, 42,155, 80,132,140,198, 25,182,146, 1,183, 23,247, 72,255,164,135,250,222,175,127,251,207,136,
+ 32,121,230,171,223,199,244, 55,126,150, 96,234,181, 15,149,117, 37,212, 85,210,132,104,235,234,247,217,249,206, 31,137, 35, 39,
+111,113,198, 49, 95, 44,233,167, 10,103, 12, 77, 85,227,156,165, 72, 53,182,110, 72, 50,133,240, 96,155,138,219,183, 14,121,253,
+222,125, 14, 79,238, 51,204,115, 70,131, 2,231, 45,211, 69, 76, 42, 58, 62, 95, 48,155, 45, 73, 84,130, 8, 49, 31,100,185,168,
+152, 47,150,180,214,177, 92,204,201, 19,133,113,134, 23, 95,187,141,241,158, 69, 99, 80, 50, 86,163, 73,170, 49, 70,144, 38,154,
+237,173, 43,252, 23,223,255,221,148,119, 63, 25,249,201, 93, 22,183, 82,106,157,249, 44, 69, 64,161,233,111, 15,208,105,138, 18,
+ 18, 47, 99, 85,238,234,150,178,169,177, 38, 18,153,108,128,223,123,233, 1, 79,135, 37,195,235, 87, 99,199, 30, 4,206, 27,218,
+233, 2, 15,180,117,133,115, 46,122, 86,109, 84,178,175, 65, 44,235,131,167,243, 68,135, 21,112,197, 93,176,118,109,212, 31, 97,
+165,130,213,157,208,172,139,134,140,236,108, 31,209,165, 93,103,226,133, 36,201,178,216, 1,116, 68, 59,209,205,177,164,210, 72,
+173,145,137, 66,164, 41, 42,203,144,105,142, 42,122,168, 60, 71,102, 5,186, 63, 64, 95,189, 70,123,120, 72, 32,176,243,161, 15,
+226,234,115,116,150,211, 78,166,156,159,156,211, 44,107,174,189,235,235,241,207,127, 2,235,115, 30,158,221, 67, 15,123,228,195,
+ 1, 82,170,245,207,170,165, 36, 79, 83, 92,128, 59,149,225,229,211, 25,199,103, 51,134,193,146,154,128,178,150,224, 28,109,221,
+ 96,171, 26, 91, 86,216,186,198, 54,109,156,198,139,128, 55,113,245,224,157,195,181, 46,146,181,240,184,214,226,140,197, 89, 19,
+225, 57,173,193,182, 46, 2, 55,172,195,154,248,245,214, 88,156,245,216,198,198,176,160,214,208, 54, 13,245, 98, 65,109, 60, 53,
+ 3,220,222, 91,121,242,235,191,141,249, 31,254, 2,214, 24,102, 33,225, 5,185,199,116,217,160,116,130, 74, 82,170,198,114,178,
+ 40, 81, 74,209,239,247, 72,148, 64, 38,154,126, 18,225, 25,247,221, 22,195,158,231,186,140,236,129,101,107,144, 4, 70,219,123,
+ 60,241,248,155,176,210,209, 88,137, 23,129,214, 5,140,135,197,114,201,188,170,104, 28,236, 12,114, 30, 78,231,216,166, 5, 37,
+169,202,138,170,110,176,222,210,203,146,152,160, 21, 44,255,238,214, 57,223,126,173,207,249,233,148,135, 15,206,105,235,154,241,
+104,159, 98,180, 75,178,189,133,201, 10,178, 36,229,231,255,155,191,203,193,112,128, 48,158, 52,120,178, 92, 83, 87,113, 50, 64,
+150,161,139,156,193,141, 71,152,255,249,159,113,229, 47,127, 31, 71,255,254,255,198,204,206,215, 49,166, 23,242, 93,214, 81,174,
+ 23,247,219, 43,117,250, 10, 9,123, 49,183,125, 85, 75,174, 10,255, 21,151,155,117,184,198,198,170, 40, 59,111,250,133,112,183,
+ 11,171,162,149,158,189,187,188, 67,156, 18, 6, 17, 34,178,120,149,202,149, 72, 70,207,126,144,244,153,111,233,198,238, 29,155,
+214, 55, 81,123,209, 86,248,106,134, 55, 77,164, 25,202,128,111,218, 88,164,212, 21, 58, 43, 8, 82,197, 11, 8,240,245,178, 67,
+215, 90, 8, 26,169, 20, 65, 37,248,106, 30,199,232, 34,165,173,170, 56,122,111, 22, 68,101,138,196, 57,135,115,158,172,215, 39,
+ 88,143,243, 45,190,169, 17, 66,161, 84, 74,104, 27,210,254, 8,153,228,232, 44,139, 31,102,146, 70,113, 99, 80,132,142,216,230,
+ 2, 4, 19,153, 19, 58, 45, 98,225,238, 61, 82, 41,116, 49,138, 9,106,222,243,241,223,248, 53,122, 69,142, 82,138, 71,159,126,
+ 11,137,112, 92,223, 46,176,137, 70, 39, 41,122, 52,164, 50,150, 98,123,135,182, 83,225, 75, 64,234,149,114, 44, 48,157, 85,140,
+135, 25,179,101, 67,105, 45,181,245, 36, 90, 98,186, 56, 99,211, 77,191, 6, 89,130, 18,130,210, 56, 70, 69,206,172,110,201,147,
+148,235,151, 15,200,242,148,113,111,128,105, 27,118,181,224,228,222,109, 22,179, 9,178,173,208,174,225,180,149,248,173, 75,156,
+184,130, 44, 47,232,105, 58, 4,111,196,251,226, 60,234,226, 4,231, 47,240, 15, 86,166, 9, 37,228,230, 25, 96, 29, 0,184, 22,
+116,110, 28, 24,188, 97,239,190,202, 77,143, 72,224,130,183,124,215, 15,242,241,223,251,115,110,205, 14, 57,111,231, 28, 53,231,
+252,213,175,122,130,167,159,250, 58, 6,143, 12,169,143, 23, 20, 91, 3,206,110,157,208,219, 30,114,118,111,134,194,163,139, 49,
+109,217,224,129,179, 59, 39,177,161, 49,158,201,221, 51,170,105,195,206,229, 62,231, 15,167, 52,229, 18,211, 64, 89,159,211,239,
+109, 19, 18,143,105, 82, 50, 52,211,170, 98,123, 56, 98,186, 92,112, 88,158,162,181,102, 40,135,124,238,214, 45,106, 91, 97,156,
+ 39, 21, 9, 18, 69,173,102,108,101, 48,200, 10,234, 86, 16, 66, 75,233, 42, 62,117,244, 10, 31,188,241, 12,137,110,104,131,100,
+ 94,214, 56, 95,225,188,199, 57,199,206, 40,193,186, 28,245,183,255,210,215,252,204,162, 18, 60,114,253, 26,139,255,248, 59, 81,
+183, 36, 55,209,194,178, 91, 91,178, 74, 49, 82, 18,149,247, 40, 62,240,221, 72, 5,166,106, 40, 23, 37, 69,166,163, 5,204, 52,
+120, 23,189,136,229, 50,134, 26,164,169,194,180, 13,229,188, 65, 6,199,151, 94,184,201,100,126,194,124, 81,241,216,149, 45, 26,
+ 52,137, 10, 12,123, 41,214, 89, 76,219,178, 40, 75,172,245,164, 90,210,212, 21,129,192,209,201, 57,199, 39,167,156, 78,230,212,
+117,131,237,186,221, 94,146, 81, 20, 41, 73,146, 48,155, 87,241, 48, 17,138, 39, 30,127, 27, 95,123,101, 74, 53,159,160, 18,141,
+ 49,182, 3,100,120, 18,169,129, 8, 98,233, 13, 11,116,150,162,180, 98,107,119,140,173, 13, 4,183, 86,177,122,235,168,170,134,
+170, 53,236,142,135,188,108,122, 52,175,188,200,254, 56, 35,221,218, 5,157, 34,211, 40,130,145, 58, 69, 56,135, 72,147,248,128,
+106,213,237,144, 54, 44,243,181,149,250, 47,252, 26,225, 27,126,125, 82,174,173, 25,155,216,171,238,207, 88, 85,247,118,125, 28,
+202, 52,141, 99, 77,173, 98,168,137,214, 8,165,162,218,182, 91, 95, 72,157,163,242, 28,149,247,144, 89,129,208, 57, 42,235,161,
+178, 12, 85,244,144, 89,130,204, 50,242,189,203,208, 91,162,243, 62, 82, 37,148,231,167,204,142, 78,104,141,224,234,179,239,161,
+253,236,159,176,245,228,179, 60, 88,156,224,131, 35,205,139,181, 92, 58,120,143,179, 22,211, 26,188,181, 49,238, 52, 75,241, 82,
+113,232, 5, 71, 94,112,212,182, 44,171, 6,202,186, 3,241, 24,124,217, 66, 89,225, 23, 75,204,188,194,150, 21,166,170,177, 54,
+142, 38,189, 15,145,164,215, 29,160,190,117, 81,120,232, 34,173,206,183, 45,166,137,225, 48, 77, 83,211,180, 13,229,162,162,110,
+ 3,139,144,114,102,122,204,146, 61,236,240, 6, 77,255, 58,249,206, 21, 6,163, 49,124,228,231,112,229, 2, 33, 37,159,110,119,
+185,107, 36,231,149, 97,216, 75, 25, 23, 5, 6,176,166, 65,137,192,172, 52, 52,198,241, 96,186,160,159, 75,206,203,150, 97, 34,
+120,104,251, 76,250,151, 80, 59, 7, 12,247, 15, 40,118, 14,112,105, 31,124, 25,105,131, 74, 81,154, 8,225,113,206,113,188,104,
+168,235, 26,112,180, 94,196, 73, 89, 85,225, 90,131, 74, 52,141,115, 56,239,177,206,145,136,232,113, 23, 2,254,213, 43,231,108,
+ 59,203,181, 92, 48,153,204,145, 77,131, 74, 70, 76, 6,239,130, 76,211,207, 5,234,193, 43,204, 95,189,201,222, 78, 31, 39, 98,
+104,199,210, 88, 70,189,132,157,235, 87,113,206,144,247,134,216,182,100, 84, 9,210, 55, 61,197,217, 39,255,224, 66, 55,124, 1,
+ 19,208,121,212,130,124,163,226, 24,177, 81, 22,111, 70,170,155,233,158, 92, 7,187,196,157,122,132,243,109,138, 0,121, 33,126,
+ 53, 42,221, 87, 20,187, 78,178,177,154, 26,200, 46,211,190,147,195,203,110,207,186, 34,214, 57,227,185,244,253,255, 53,114,235,
+145, 77,132, 28, 46, 18,229,108, 75,112, 17,131,108,206,239,119,172, 1,179, 70, 58, 59,223,129,100, 68,138,107,107,130,109, 54,
+249,232, 50, 33,152, 26,145,165, 56, 18,100,112,200, 36, 39,136, 52,190,126,237,178,123, 87,193,153,101,231,203,114, 72,153, 18,
+130,237, 10, 32, 25,137,131,180,209,117,210, 27, 35,176, 8,157, 33,132, 70, 41, 21, 93, 34,182, 93,127,226, 90,197, 85,135, 76,
+114,108, 91, 34,117,134,148, 73, 55, 81,139, 63,180, 46,250, 60,124,238,243,188,118,243, 54,185,148, 36,166, 34,147, 48,206, 52,
+173, 74, 49, 73, 70,227, 65,229, 41,174,232,145,246,242, 46,210,214,163,133,196, 58, 67,107, 44,214, 57,182,122, 57,139,186,101,
+ 86, 26, 90,239, 41,148,234,246,210,130,214,123,164,144,235, 36,181, 94,154, 82, 59,199,181,173, 45, 46,237,109,115,121,119,143,
+186,174, 41, 23, 75,250,137,224,193,225, 3,164,173,240,117,137, 12,150, 31,127, 93,115,122,237,125,252,210,115,175,242,233, 42,
+227, 63,150,125, 62,153,188, 27,245,117, 63,200,213,171, 87, 72,207, 94,195,153, 6,169, 58,150,196, 58,229,175, 59,243,214,186,
+142, 77, 96,203,234, 57,187,152,126,204, 27, 58,249,141, 77,147, 55, 80,254,193,155,150,226,209,255,132, 90,204,184,121,243,136,
+211,102,198,237,197,109,138, 12,222,251,212, 7, 25, 28, 36, 52,115, 79,177,155,178, 60, 51, 4, 4, 59,215,182, 57,186,125,206,
+ 96,212,199,122, 34,188,171, 42,153,206,166,184, 54,242,244,241,150,195, 87, 79,169,103, 19, 78,167,150,203, 55,118,121,120,103,
+ 74, 93, 55, 36,233,128, 23, 95,252, 10, 79, 60,253, 56,205,185,229,108, 57, 99,156, 15, 99,192, 89, 88,242,200,165,235,220, 63,
+190,135, 84,146, 94,210,103, 60, 54, 32, 13,109,153,240,112, 81, 98,252,130,214, 90,230,126,137,113, 13,123,201,136, 63,190,247,
+ 89,222,123,227,113,116,175, 36, 75, 82,164,149, 28,213, 83, 70,253, 12,229, 21, 65, 10,244,116,214,146,168, 1, 3,225, 56,234,
+240,132, 17, 88,214, 57, 63, 93, 88, 87,213,161,203,210, 32, 8,130,105, 48,174,193,187,128,116, 13,190,245, 72, 37, 56, 63, 47,
+201,147, 4,111, 27,132, 72,112,120,202,101,141, 18,129,162, 16, 72,235,185,180,119,137,147,217, 67, 78,230, 19, 62,254,153, 47,
+240,174,119, 62,139, 27,142, 73,116,228,110,151,203,134,135,103, 15,233,247,115,118, 6, 79, 51,236,231, 92, 26,123,142, 31, 88,
+110,222,126, 29,231, 12,123, 59, 59,104, 45, 24, 37, 57, 50,192,178,170,105, 77,203,206, 96, 64,217, 54, 56,235,216, 26,141, 81,
+245, 41,214, 6, 92, 89, 33, 21, 36, 42,141,135,166,243, 40, 33,113,222,144,102,105, 20,183,185,120,234,244,250, 57,203,133, 71,
+203,248, 51,229,121, 18, 15, 43, 45, 80, 42, 35,203, 18,142,147, 39,249,215,159,185,199,123, 71,175,243,142, 15,126, 3, 77,136,
+ 36, 40, 79, 64,104, 29, 47,180,174, 26, 13,193, 35,186,177,242,186, 67,239, 50,187, 67, 88,203,142,187, 17, 28, 93, 36,104,231,
+175, 20,157,194, 59,200, 11,123, 76, 25, 47,244, 78,200, 39,147,206,244,219,157,190,241, 32,140,204,119,149,234, 40,130,241, 14,
+ 57, 72,215, 23,184, 72,122,136, 36, 69, 8, 69,208, 18,157,166,208, 90,148, 78,208,143,143,105,103,119, 73, 6, 67,204,226,156,
+242,228, 60, 94, 66, 34, 37,201, 60,166,172,217, 30,140,104,108, 69, 90,228,241,133, 83, 42, 10,240, 66,136,135,120,183,171,246,
+ 54, 80,154, 42,118,186,189, 30,105,150, 17, 4, 76,155,134, 7,214, 96, 91,139,181, 54, 82,247, 86,214,191,224, 80, 38, 96,189,
+ 37,235,148, 82,158,200,236, 49, 54, 90,213, 26,239, 16, 74,241,224,100, 74, 16,146, 36, 73,232,247,122,228,249,128,241,246, 22,
+ 89, 86,144, 13, 51,116,150,199,145,124,211,224,109, 75,189,156,129,159,211, 79, 46,113,245,209, 3,142, 78,239,175,115,194, 79,
+157, 96,214, 24,108,240, 44, 90,199,163,185,100,177,104, 48, 33, 80, 54,150,121,211, 98, 61,236,245, 84,180,221, 40,193,188,170,
+185,178, 51,224,213,135,231, 17,170,209, 56,106, 83,209, 19, 18,211, 41,126,155,170, 98,119, 60,192,250, 16,191,127, 31,153, 3,
+189, 44, 97,178, 44,169,154,134, 97, 47, 99, 54,175, 81, 93,144,142, 39,238, 25,165, 16, 36, 90,225,101,206, 46, 13,191,126,175,
+226, 87,239,182,188,237,177,183,243,206,242,237,124,239,232,221,188,107,208, 99,250, 48,176, 55,114,188,231, 7,254, 22,191,254,
+139,191,194, 83,143, 95, 38, 87,130, 69,235, 41, 50, 73,235, 3,237,217, 4,185,181,141, 55, 53,121, 49, 98,246,240,117,182,191,
+241, 91,215,145,226, 43,121,236, 74,154, 37, 9, 81,236,230, 55, 89,234,161, 27, 24, 17, 88,143,192,161,139, 73,125, 67,199,221,
+125, 77, 71, 94, 93, 9,157,112, 27, 15,188,179, 43,164, 67,247,111,100, 71,160,115, 29, 23,220,117, 86, 38,221,237,209, 59,177,
+221,138, 50, 87, 72,133,126,236, 27, 35,190,149,110,241,238,234,120, 72,137, 40, 84,116,117, 25, 57, 11,222,227,219, 6,239, 74,
+208, 69, 20,197, 89,129, 16, 45, 36, 57,222,182, 8,215,196,224,148,224, 17,197, 0,223,148,247, 51, 43,242, 0, 0, 32, 0, 73,
+ 68, 65, 84,184,242,148,116,235, 10, 33,180,216,118,142, 84, 41, 62,221, 38,132, 25, 82,121,172,139, 50,110,153, 22, 88, 27, 45,
+105, 73, 86, 68,133,123,150, 35,149, 70,137, 64,168, 78,113, 89, 31,105, 82,146,241,238,106, 46,140,171,107, 2, 14,149, 36, 56,
+ 99,144, 42,190, 31, 42,237,227,157, 67, 40, 73,154,102, 52,139, 9,249,246, 85,156,109,217,127,228, 17,158,152,206, 72, 8,140,
+ 15,182,233,185,154,122,182, 64,236, 29, 32,181, 68, 38, 45, 82,100, 40,233, 49,141, 69,106, 69,150,166,216,214,144,231, 57,214,
+149,140, 6, 57, 0,195, 34, 37, 79, 27,218,218,147, 36,146,212, 10, 22,181,237, 68,147, 33, 34,160,133,102,105, 29,151,135,125,
+188,132,189,237, 45, 22,229,146,170,110, 24, 13, 10, 22,101, 69,176, 6,235,106, 82,111,184, 53, 47, 57,216,186,194,107, 15, 95,
+227,210,246, 22, 94, 8,166,243,134,171,201,156,201,228, 30,175,125,213, 95,226,224,253,127,147,131,234, 62,254, 87,126, 20, 95,
+ 70, 43,175, 87,155, 0,107,181,138,243, 85,241, 25,243,221,243,176,210,117,117, 91,181,232,172, 88,101,168,175,116, 29, 29,230,
+ 0, 54, 52, 68,128,147,251, 47,210, 75,251,204,219, 25,231,237, 49,253, 20, 62,117,251, 14, 73,154,115,242,202, 9,229,178,198,
+222, 94,144,102, 61,170,243, 5,253,113,138, 41, 45,173,141,152,218,186,154,147, 13,135,200,153,141,128,154,126, 74,222,207,176,
+117,203,241,137, 97,188, 3, 89,161,169,235, 6, 23, 2, 85,117, 15,242, 25, 7, 55,182,121,249,139,175, 49,220,234, 38,182, 54,
+ 80,132,148,179,163, 51,198,217, 8,227, 13,105, 97, 57,159, 52,188, 50,189, 75, 95,231,221, 61,144,179,176,199, 16, 2, 89,103,
+191,148, 8,126,254,147,127,192, 15, 62,249, 14, 92, 49,164, 63,204,176, 19, 75,226, 37, 58,111,169, 93,133, 92,204, 61, 87,175,
+ 94,142,177,128, 62,172, 43, 35, 79, 84, 34,226,227,235,232,217,188,192,182,106,209,161,197,148,115,218,229, 2,223,214,180,203,
+ 37,245,178, 36, 81,130,197, 98,193,217,241, 57,229,124, 78, 51,155, 50, 59,159,112,118,116,138,173, 43,122, 3,133, 78, 36, 46,
+ 8, 70,189, 49,139,102,193,195,163,135, 24, 91,161, 92, 67,226, 13, 73, 48,236, 14, 50,180,111,185,125,239, 22,141,131,198, 6,
+230,243, 57,119,239,223,225,149,215,239,112,248,240, 1,173,169,113,109,195,178, 42,241, 30,170,170,142, 10,251,172,199,193,214,
+ 22,166,154, 83, 87, 83, 26, 99,162, 32, 86, 38,212, 85,221,165, 42,123,132,247,104, 41,177,101,220,141,123, 23,131, 63, 84,166,
+ 73, 19,137,116, 1,213,212, 76,143, 30, 16,130, 97,123,220,163, 63,140,213,122, 46, 96,103,103,135,127,123,162,249,135,191,244,
+239,104,207,207, 80,213, 18, 83,198, 46,211,151, 21,174,110,240, 77, 25, 33, 51,166,137,159,177, 53,113,234,225,221, 26,186, 18,
+130,141,170,109,225, 34,237, 35,152,168, 8, 55,209,238,230, 59,193,215, 74, 80,227,227, 15, 19,147,151, 86, 12,235,176,202, 48,
+234,192, 46,214,118,116, 58,139,112, 29, 84, 69,201, 40,138, 75,179,216,149,167, 9, 34, 85,200, 52,235,210,202, 60,140,118,241,
+237, 9, 58, 31, 18,116,130,171, 27,170,178,100,114,116,202,240,224, 50,110, 94, 17, 92, 75, 50, 24, 32, 80,104, 17,255, 92,209,
+141, 70,181,142, 68, 44, 73,180,218,101,121,198,176,200,233, 23, 61,180, 78, 16, 50,238, 18,211, 36, 97,212, 43, 24,101, 5,227,
+ 44,103,216, 43,200,211,156, 36,207, 72,210, 2,122, 61,100,111, 64,157,166,204,132, 98,142,230,220,195, 92, 72, 74,169,112, 73,
+ 74, 29, 36, 73,158, 51, 30,244,217, 25, 13, 41,210,132, 97, 47, 69, 5, 79, 38, 2, 50,196,110, 77,117, 46, 10, 99, 13,214, 59,
+ 72, 53,143, 60,253, 12, 39,255,207, 79,111,212, 53, 14, 94, 93,198,150, 96,148,165,236,244, 51, 22,214, 97, 45, 28,140,251,180,
+222, 50,200, 64, 97, 72,117, 39,152, 34,208, 6,207,253,233, 18, 27, 98, 1, 44,148,192, 7, 73,109, 28,198, 58,164,138, 97, 20,
+ 15,206, 23,204,150, 53,247, 39, 11, 4, 80,213, 45,121, 10, 34,120, 50, 25,152,151, 45,222,199, 95,173,139, 41, 99, 85, 19, 45,
+166,169, 12, 36, 26,178, 44,101,183,223,231,201,203, 7, 92, 57,184,206,179,111,126, 20, 77,203,235,183, 94, 96,123, 63, 22,131,
+249,104,136,150,241,125,177, 74, 83,187,184,110,162,137, 34, 68,109, 90,196,108, 25,169,138,211,179,117, 11,190,233,132,226,169,
+ 24,121,241, 93,112,198,106,148,228, 55,221,117,108,199,195,218,246, 42, 69,167, 66, 38, 82,201, 86,255, 62,178,223, 87,161, 49,
+241,207,117, 62, 96, 93, 39, 17, 13,235,236,211, 78, 4, 25, 57, 13,126,101,175, 19, 81,103, 17,124,216, 32, 90, 93,252,126,228,
+155,158,236,226, 98, 67,135,134,237,146,100,124,244,158, 7, 27, 34, 18, 54,184, 8,143, 81, 9, 65,198,110,117,125,209,119,153,
+ 0,222, 11,130, 76,241,214,116,172,121,139, 72, 83,100,222,195, 46,142,240, 62, 38,199, 5,211, 32,180, 66, 39, 25, 42, 43, 80,
+163, 43,136,172,223,217,125, 91,148,146,216,118, 9,193,162,147, 20,213,137,225,100,214, 71, 9,221, 5,192, 52, 17, 56,213,133,
+184,168, 52,141, 66,217, 21, 6,205, 26,112,241,172,176,203, 57,109, 27,227, 93, 77, 83, 33,165,230,242,179, 95, 75,154,231,164,
+ 69, 15,223, 84, 24, 47,145,131, 62, 6,143,151,113,218,166,139, 4,107, 3, 58,145,100, 74,147, 20, 25, 50,209, 36, 66,146,106,
+141,240,129,202, 88,182,199, 57,125, 45, 73, 84,108, 50, 90, 23, 97, 77,161, 91,145,212,214, 83,228,241, 29,159, 52, 13,251,195,
+ 62,101,185,196, 89,203,217,217, 41, 47,223,188,201,225,195, 67, 44,240, 66,155,242, 41,125,192,115, 97, 72, 82,244,240,182,101,
+217, 90,174, 95,122,148,191,243,131,255, 57, 31,122,255,187,105,219, 7,252,155, 95,251,121, 94,251,226, 71, 25, 61,253, 46, 30,
+251, 87,183,216,255,142,255,178,203,213,232, 2,249,194, 10, 74, 20,159, 7,239, 46,192,149,214,248,237, 40,178,147,157,206, 70,
+174,126,211,211,221, 91,221, 63,186,168,241,192, 67, 17,224,225,217,109,238,213, 39,212,182,162, 52,129,134, 22,233, 28,166,106,
+192, 10,150,243, 18,231, 2, 58,113,188,250,133, 91,232,190,198, 54, 21, 65,105,182,119, 47,225,132, 39,235,165, 20, 59,125, 46,
+ 63, 49,192,122,131,151, 45,198, 85,152,202, 50, 63,157,147, 10, 77, 47, 41, 72,208, 96, 83,190,244,209,231,177, 1,202,202,114,
+ 58, 59,198, 73, 71,170, 52,165, 45,217, 29,142, 72,180, 64,120, 79,109, 29,200,192, 40, 41,200,165,164,177, 53, 90, 10,122,170,
+ 96, 91,141,113,222,160,132,166, 39, 83,126,249,149, 47, 49, 59,187,141, 43, 53,151,178, 62, 30,207,237,147, 25,214,120,244,123,
+158,185, 66, 93,157, 80, 77, 35, 13,201,251,139,139,138,104,117, 16,254, 66,208,130, 13, 56, 23,225, 39, 13,146,224, 28, 77,105,
+ 65, 75,172, 9,104,237,169,102, 11, 38,115,195,246,184,136,197,119, 34,105,235, 6,133, 36, 17,150, 39,246, 6,188,210, 31, 80,
+ 55, 13,211,122, 70,145, 73,238,220,127, 64, 89, 90,118,119,182,200,100,224,225,201,156,170,109, 56, 63,159,176,191,179,199,194,
+ 72,250,233,144,183, 92,123, 27,127,237, 59,159,229, 67,207,126, 3, 39,159,253, 18, 63,242,255,254, 22, 87,182,182, 56,158, 85,
+108, 13,135, 36,170, 71,158,102,120, 59,167,169, 39, 8,191, 77,161, 53, 66,203,184,119,207,211,136,146, 69,161, 19,213, 85,124,
+ 54,174, 12, 82,133,109, 29, 74, 18,247,243, 89,130,240,150, 94,162,233, 15, 10,122, 91, 91,209, 71,218, 90,166,211, 10,173, 5,
+ 7, 69, 66,165, 15,248,199,127,240, 18, 31,120,116,155,111,121,207,147, 44,230, 77, 4,211, 52, 13, 65,107, 68,154,197, 29,120,
+199,179, 22,184,181,181, 35,194, 80, 86, 97, 19, 29, 60,197,118,225, 21, 62, 42,226,227, 94, 49, 30, 86, 2,191,169, 64,137,151,
+130, 76,244, 58,213, 73,172,128, 51, 62, 30,116,206, 6,164,202,214, 28,120,180,138,153,239, 73, 26, 5,102, 73, 26,173, 31,206,
+160, 84, 14,201,156, 80, 5,228,120, 4,120,166, 15,238,115,247,245, 91,204, 22, 21,143, 14, 71, 52,119, 95,142, 64,136,225, 8,
+111, 13, 94, 4,130, 9, 72,169,163,239,182,139,139, 12, 42, 65, 75,135,215, 62,174, 73, 8,104, 37,144,137,234,152, 2, 81,224,
+166,210,206,179,228, 37, 74,122,188,181, 52,157,183, 94,152, 54, 98, 91, 69,192, 6, 79, 47, 79, 49,198, 69, 88, 79,136, 28,209,
+188,139,150,157,207,151, 20,189, 30,117,213,146, 36, 5,222, 89, 84, 58, 32,120, 67, 99, 97,177,168, 98,236,170,173,184,118,112,
+149,244,240, 11,204,108,220,225, 11, 21,187, 78,165, 36, 34, 64,191,167, 73,181,162,109, 91,180,140,105, 85,169, 18,216, 46, 26,
+246,124, 58,101,145,101, 92, 30,245, 73,180,192,181,134,198, 58,132,116, 32, 20,153,214, 44,219, 22,213,229, 71,183, 46, 78, 90,
+ 38,139, 37,227, 34, 37,201, 18,188, 77, 56, 58, 43, 17, 34,224,133, 68,227,105,101,212, 19, 96, 34,139, 58,116,226,174, 32, 32,
+ 87, 81, 39,210, 56, 79, 89, 87, 40,233, 41,219,138,207,189,240, 50, 95,247,181,239,102,119, 91, 16, 51, 72, 4,147,202, 49,170,
+ 91, 26,239,184, 60,200,121,252,250, 21,150,213,140,166, 49, 32, 43, 20,130,162,183,141,176, 96,103,103,172, 6, 65,114,227,170,
+140,173,143,164, 11,215, 8,235, 36,179, 85, 42, 91,116,193,108,162, 89,141,139,161, 47,206,121,212, 74,177, 46, 66,215,241,117,
+153,237, 68,214,247, 90,188, 4,107, 5,115,236,176, 68,215,137,123,240, 2,161,233,222, 5, 8,210,175,133,118, 8,129, 84, 80,
+188,229,131,113, 34,133,136,246,175,238,155, 14,182, 2, 31,112,245,140, 96, 27, 68,210,239, 50, 22, 0, 85,196, 8,213,164, 7,
+194, 98,171, 9, 42, 31, 19,154, 37,198, 59,146,254, 22,222, 84,177,104, 70,162,242, 33,118,233,177,205, 98, 61,221,178,203, 83,
+164, 78, 99,102,186,155, 33,147, 12, 97, 61, 42,235, 35,243, 17,162,173,145,201, 16,225,107,132,140,138,124,215,212,232,188,192,
+155, 58,126, 70,105,130, 74,123, 29,115, 33,218, 96,157,235,242,211,139, 30, 50, 40,156,171,226,249, 80,149, 81,204, 90,196,103,
+126,251,250, 13,250,253, 62,229,217, 9,106,184,205,150,136,252, 10,215, 90,194, 48, 1,171,176,203, 5,249,112, 72,179, 88,224,
+140, 69,167, 10,159,106,240,129,204,107,236, 32,199,206, 43, 16,146, 68, 75, 6,137,194, 7,176,193,163, 36,180, 94,144,105, 21,
+ 39, 84,203,134, 31,254,208,123,185, 90, 12,232, 63,243,205,244,190,234,155, 24,188,233, 45,140,242, 5, 31,253,237, 63,228,165,
+ 47, 60, 79, 49,251, 83,252,103, 62,206, 91,191,233,219,249,199,191,252, 57, 30,251,250, 39,241,211,146,175,125,251, 59,120,242,
+205,143,241,155,255,246, 55,249,226, 75, 47,172,197,145, 31,251,210,167,248, 7, 63,247,223,242, 11,255,224,151,248,254,159,250,
+135,236,190,229, 77, 60,255,143,126, 50, 78,106,226, 53,211,105,158,162,214, 64,117,147, 28, 65, 44,156,157,141, 64, 35,239,197,
+154, 60,185,202, 41, 80, 43,234,156,239,136,168, 68,171,228,233, 75,159,160, 85, 79,145, 37,146,198, 75, 90,107,249, 96, 95, 80,
+ 54, 83,130, 22,108,239, 15,121,248,106,137, 23, 21,103,199,135,228,197, 21,210, 94,138,144,142,249,116,138, 36,103,113,188, 96,
+247,202, 1,167,183, 31,160,243, 17,242,255,231,234,189,163,109, 79,207,250,190,207, 91,126,109,183,211,239,185,117,238,189, 51,
+163,233, 51, 26,212, 53, 52, 33, 36,138,132, 36,140, 5, 54, 77,150,192, 33,203, 88,113,192,198, 1,199,216, 75,134,100,101,145,
+ 64,176,157,229,144, 4, 34,123, 17, 69,150,196,162,153, 80, 12, 26, 6,132,122, 27,205, 72, 26,141,238,244,219, 78, 63,187,255,
+234, 91,242,199,251,219,251, 92,249,175,185,107,214,217,229,156,189,223,242, 60,207,247,251,249,250,138,184,215,161,168,142, 89,
+223,234, 49, 25, 21,164,253,140, 36,141,131, 61,219,172,179, 55, 62, 98, 99, 43,163,155,109,114,120,189,228,230,244, 58, 86,192,
+185,141,140,105, 94, 51, 49, 83,214,163, 45,106,115, 76, 87,118,217, 92, 75, 24,206, 37, 55,199, 99,182,178, 53, 74,142,200,115,
+133, 50, 10,141, 66, 74,129,242, 13,191,127,253, 37,190,255,108,143,210,166,236,150,199,120, 28,195, 60, 71,253,200,107,238,123,
+223,249,123, 95,193, 71,126,255,143,185,231, 91,190,153, 52,233, 82,238,220, 96,145,251,176, 88,196,214, 5, 79,225,162,191,150,
+221,118, 23,182, 55, 96, 62,203,151, 60,226,170,174,153,207, 10,234, 58, 8,197, 70,163, 25, 85,211, 16,139, 96, 33,202,167, 19,
+226, 88, 34,140,225,133,157, 17,135,163, 33,214, 22,148, 69,195,198,250,106, 72,230,169, 29, 89,183, 67, 55, 85, 40, 4, 55,246,
+199, 20,211, 35,238,188,237, 28,214, 11,126,238,189, 63,194,111,253,222,127,230,155, 38, 79,226,199, 35,190, 52,115, 68, 73, 68,
+ 95, 74,162,120,133,243,219,103,216,219,127,158,155,187, 59,188,233,161,219,184,180,149,208, 84, 77,107, 7,243,196,113, 28, 18,
+123,218,185,160, 74, 51,226, 78, 6,214,145,245, 59, 20,211,130, 52, 14,126,236,166,169, 1, 79, 36, 21,107,219,167,200, 58, 25,
+ 74,235,176, 41,217,160,200,143, 84,216, 96, 86,178,132, 43,251, 19, 62,243,236, 53, 94,121, 97,157, 88, 42,154, 22,139,234,155,
+128,127, 93, 84, 50,193,146,213,210,230,104,121,206, 33,235, 48,180,222, 23, 10, 16, 33,218, 3, 63,248, 48,195,198, 42, 78,188,
+ 29,173,133, 38, 56, 64,218, 11,128, 12, 63,227,101, 11,124,104,161, 54, 42,138, 81,105, 55,196, 69, 70, 17,190, 14,184, 75, 33,
+130,210, 94,159,190,192,149,199,126,143,205, 59,239, 8,208,151,104,149,233,179,143,243,197, 71,255,134,253,157,125, 86, 55, 79,
+ 81,161,216, 62,120,150,106, 58,103,229,225,111,230,202, 19, 31, 67,122, 25,124,222,214,130, 8,118, 49, 33,130,247, 91, 74,129,
+ 51, 22, 87,215, 97,227, 86, 10,165,212,137,118,160,229, 61, 10, 21, 54,101,215,138, 5, 5, 46,184, 24,156, 11, 7,105,219,120,
+ 50,173,191,223,218, 32,246,168,139,154,198, 89,148,104,173,124,132,131,175,155,118,209,145, 14,227, 13,235,152,141, 39, 88, 17,
+161,101, 67,217,120,238,188,116,145,226,209,127,183,204, 0, 89,200,190, 63,157,119, 41, 92,192,225,198, 58,194, 32,216, 90,233,
+128, 16, 28,207, 43,202,186,161,170, 27,166, 69, 67, 39, 22,116,210, 24,213,182,184,105,115, 11,180, 12,235,228, 56,175, 16,210,
+ 97,105,187, 41, 82, 96, 77, 0,231,148, 85, 67, 28, 9,134,147, 57,117,109,201,210,136,105, 94,147,166,113, 91,221, 7,181,126,
+164, 61,214, 4,134,132,117, 80, 91,135,144, 17,157,238,128, 78,255, 52, 38, 74,121,237,195, 15,242,186, 71, 94,137,238,137,101,
+180,231,103,254,253,127, 64,100, 9, 85,101,217, 74, 18,198, 47,222, 32,202, 18,214,182,214,137, 59, 25,145, 78, 24,156, 57,139,
+144, 3, 14, 62,249,251,228, 47, 62, 29,198,231,126,209,169,243, 45,223,253, 86, 59,218,201, 1,190, 32,144, 45, 4, 74,110, 1,
+106, 21, 33,107,125,145,216,118, 98, 51,106,187, 1,174,181,201,202, 19,171,219,173,204,152,133,250,201,187,214,126, 79, 8,226,
+ 88,206, 73, 23, 78,183,246, 77,157,251,169,223, 68,101, 29,160, 90,120, 29,192, 22, 97,140, 80,230,120, 23,232,142,193, 11, 30,
+ 98, 61,141, 13, 85,184, 51, 53, 94,234, 48,211,110, 67, 76,164,140,218, 10,191, 65, 39,157,208, 69,104, 19,220,108, 57, 15, 20,
+ 69,239,113,166, 14,243,238,184,139, 74, 58,224, 45, 42,235,163,146, 46,190, 46,113,213, 28,153,246, 81, 81,140, 80,129,201, 32,
+163, 24,111,218, 11,164,210, 33,186,151,150,107,186, 60,234,194, 60,221, 85,161,179, 87,205,231,164,171,107,225,162,222, 90, 67,
+165,140, 41,143,118,185,250,133,207,145,246,187, 12, 86, 58, 36, 77, 78, 61,158, 66,154,208,168,164,237,200, 69, 84,147, 17,200,
+160, 37, 40,243, 28,107,108,208, 68,169,136,217,108,142, 80,130,227, 97,206,254,180,164,104, 44,227,198,161, 60,204, 77,232,182,
+ 92,157,148,124,255,203, 95,198, 47,253,236,223,231,204,229,115,244, 78,245,233,187, 25,189,181,237,144, 41,145,118, 57,255,192,
+253,148,118,157,175,154,187,249,133,223,252, 85,158,250,179,255,200,199,175, 92, 35,234,111,115,122,125,192,197, 11,219,252,251,
+ 15,252, 54, 87,119,119,120, 56,129, 95,124,215, 15,240, 19,111,121, 19,111,190,231,110,222,240,240, 55,241, 51,191,254, 75, 12,
+138,211, 60,242, 15,255, 62,199,127,242, 33,236,116,132,211, 41, 19, 43,145,221, 77, 68,127,149,104,176,134,140, 50,180, 56,217,
+ 75,164, 4, 39,195,231,177,152,167,187,246, 59,215, 78, 57,151, 26, 15,215, 90,179,227, 44,227,249,188,203,141,201, 49,147,106,
+130,244,240,217,241,140,159,252,182,119,162, 59,138,114, 18, 48,231,197,116,198,225,141,125, 54, 46,220, 17,236,182,190,102,239,
+197,125,138, 73,205,233,151,157,163,154,143,105, 74,112,214, 50, 63,170, 41,103,115,154,218,146, 37,146,209, 40,199, 56, 67,212,
+173, 88, 57,221,103, 58, 44,152, 53,115,142, 39, 71,232,184, 97,125,181,203,209,209, 52, 0,214,148,224,112, 56, 38,149, 41,185,
+153, 51,175, 10,188,132,105, 94, 50,107,230, 40,233,113, 54,103, 99,160,217,159, 21,104, 41,233,169, 14,145,212,228,182, 96, 16,
+117,185,153, 15,121,248,212, 25,178, 56,226, 32,159,210,137,186,168, 55,221,126,238,125,174, 46,120, 97,127,204,248,224, 69, 46,
+189,234, 17,206,124,235, 27, 25,126,254, 19, 75,244, 99, 16,105,251,165,104, 78, 8, 69,241,245, 39,233,190,230, 13, 24,211,112,
+ 52,156,129,169,153,142, 70, 8,225, 49, 77, 69, 83,228, 84,166, 14,115,189,178,162,105,185,230,145,244,104, 28,197,172,226,165,
+195, 99,106, 87,163,132, 39,209,146,218, 40,234,150, 46,213,237,246, 24,116, 52,231,183, 6, 88, 15, 23,182, 86,233,247, 87,248,
+127,255,224,143,113, 54,226,251,238, 76,201,213, 38,127,120,229, 42,167,251, 61, 78,109,223,197,122, 55,229,139, 95,249, 24,243,
+188, 96, 86,195,187,223,244, 32,216,138, 56, 77,240,214, 34,125,136, 29,148, 90,225, 81,161, 58,147, 2, 37, 2, 85,205, 55,205,
+ 9,208,196,154,224, 41,183, 22, 25, 69, 36,105,140,142,117,104,103,251, 80,213, 89,107,169,202,138, 44,214,104, 37,232,102, 17,
+ 90, 40,254,244,203, 47, 48,159,140,184,107,107, 21, 97, 29, 85, 93, 35, 90,127,186,179, 46, 96, 93, 9, 33, 39,190, 54,173, 27,
+ 52, 28,232,139,252,230,101,182,117,171, 6, 62,249,127,183,228, 63, 47,212, 75,250,132,133,238,252, 2, 51,219, 94, 18, 92,192,
+101, 10,165,145, 73,134, 87, 42, 36,164, 89, 27,126, 77,219,144, 14,182,120,236,253,255, 35,119,127,215, 59, 16,211, 67,228,202,
+ 25,134, 95,251, 52,143,126,228,119,152,142, 39,164, 27,235, 68,120,238,180,115,200, 71,100,167,206,115,100,114,246,110, 60,191,
+ 96,195, 45,161, 16, 74,170,192, 53, 80,234, 4, 32, 35,101, 72, 96, 16, 96, 93, 16,189,185,150, 32,225, 8,213,185,183, 38,100,
+196,183, 65, 47,150,144,197,238,188,167,105, 76,120,140,181, 84, 38, 76,207,188, 49, 88,235,136,180, 38,210,154, 88, 74,250,189,
+ 46,113,156,128, 12,177,153, 42, 74,201,243, 41,181, 75, 16,190, 6,229,233,102, 43,156,250,234, 7,151,153,237,162,189, 0, 73,
+ 4, 95,168,186, 68,177, 34,141, 99,146, 52, 65, 32,233, 38, 17,147,178,166,106, 44,243,170,164,106, 12,131, 94,196,120,150,115,
+122,173,135,245, 65, 49,156, 69,138,218, 6,134, 66,109, 12, 71,227, 25, 66,122,180,146,212,214,161,112,140,166, 5,117,211,208,
+ 56,193,112, 94, 5, 58,161, 16, 20, 77,192, 25,143,242, 50, 84,163,222, 17,171,182,234, 21, 22, 41, 66, 11, 82, 43, 69,164, 99,
+210, 56,230,226,109,247,242,154,123,239,230,155,191,249,155,168,237, 58, 46,246,244, 50,197,181,199, 63,197,199,127,247,247, 25,
+244, 58, 36,145,100, 99, 53,101,109,125,133,149,211,171,168, 52, 37,234,116, 24,108,159,163,185,122,147,245,135, 31,225,197, 15,
+255, 90, 8,222,241, 39,234,115,207,201,124,124,105, 87,111, 55, 78,213,206, 56,151,131,247, 91, 84,242,139,246,209,146, 39, 47,
+110, 9,108, 89,122,212,197, 82,211,230,220,201,236, 29,119, 98, 85, 10,250, 21,185,212,149, 44,159, 79,158, 68,178,166,183,221,
+203,230, 91,222,139,247, 21, 66, 54,225, 65,205, 60, 8, 47,188,199,206,143,176,229, 28, 84,132, 41,167, 88, 17,227,209,152, 98,
+ 26,116, 36,237,172, 56,140,182, 60,194, 24,108, 51, 71,182,226, 80,231, 5,182,152, 34,210, 62,206,217, 16,181, 44,131,216, 52,
+140,207,154,246,119, 48, 64, 72,192,179,249,184,205, 99, 23, 1, 69,107, 27,188,241,168,172, 27,132,118,117, 56,236, 93,157,163,
+180, 38,234,172,181, 74,254, 22,243,210, 94,106, 93, 93, 6,199,135,115,184,186, 65,170, 96, 65,179,141, 65,202, 8,213,233, 51,
+190,126,149,249,222, 14, 73,164, 88,205, 34,142,142, 38, 88,231,240, 73,140, 21, 65, 32, 43,226, 8, 83,228, 1, 3,140,162,152,
+151, 52,117,141,241,130,170, 8,130,185,107,135,115, 26,227,152, 52, 1,207, 52, 51,158,198, 57, 70,149,225,189,111,120, 57, 63,
+250, 67,111,161,194, 18,109,172, 19,111,174,211, 23, 2, 81,121,234,222,105,108,146, 81,140,103, 36,253, 46, 95,252,248,231,249,
+194,147, 47,241,190,255,243,127,225,255,122,255, 31, 82,151, 51,162, 40,226, 19,159,253, 20,227,217,132,135, 98,120,160,175,248,
+129,127,252,223,146,245,186, 88,111, 73,226,132,191,253,154,111,231, 31,253,175,191,200,219,223,246,115, 52,175,251, 59,252,235,
+191,249, 42,143,201,203, 92, 63,243, 58,110,158,122,144,228,117,111, 99,124,231,183, 83,220,255,189,196,223,241,110,146,239,124,
+ 15,219,111,125, 55,151, 94,245, 32,243,171,207, 81,143,143,195, 87,183, 29,251,217,197,197,180, 29, 25, 59,183,200, 49, 17, 20,
+243, 9,205,153,251,248,252,139,207, 98,125, 77,225, 12,195, 58,231,159,252,224, 79, 81,152, 9,147,195, 9,105,111, 64, 81,228,
+140,134, 53, 23,239,187, 64,103,144,113,227,217,107, 36, 73, 15, 83, 87, 8, 41, 48,141, 64,198, 21,213,204, 82, 86,193, 45,166,
+ 35, 73,149, 19, 46,228,221,156,106, 46, 64,151,156,189,184, 65, 49, 44, 57,152, 77,169, 42,195,254, 81, 65,156,120,122, 93,201,
+ 60,175, 24, 87, 35,114, 59,195,217, 0, 6,234,233,140,185, 41,168, 76,206,164,153,144, 27,203,184, 10, 99,195,126, 20,147,196,
+ 53, 17, 17,185,105, 16,194, 82, 88,199,188, 46,176, 70,209,209, 9, 26,133,250,103,111,251,214,247,117,210,136, 59,183, 79,241,
+174,223,250, 67,222,253,234,203,168,222, 38, 81,183,199,228,249,103,151,184,190,112,249, 22,139,152, 7, 92, 83, 33, 46,221, 75,
+ 35, 4,179,233,140,107,251,199, 84,101,193,100, 50,103,158,231, 76, 11,139, 20,142,209,116, 78,130,225,104, 92, 32,176, 8,227,
+208, 26,102,147,156,235,251, 67,202,166,194,121, 71,162, 20, 90, 69,196,145,103, 54, 47,169,139, 25,251,195, 34,204,191,149,226,
+185,221, 3, 14, 14,247,184,182, 55,230,238, 45,197,221,162, 32,142, 50,190, 56,209,156, 93, 91,227,218,181, 23,120,235,229, 57,
+ 31,121,252, 37, 54,186, 25,149, 79,121,251,195,103,218, 69, 39, 72, 98,133,179, 54, 16, 92,101,219,106, 93, 38,249,132,148, 40,
+211, 24,210, 88, 82, 22, 13, 90, 9,162, 56,180,196,180, 86,232, 54, 54, 81,181, 1, 13,182,169, 3,143,186, 53, 93,174,246, 59,
+164, 81, 68,150,104, 86, 59, 49,187,227, 57,143, 61,253, 18, 85, 62,229,142,205,117,164, 16, 84,141,129,198, 4, 30,181,255, 47,
+ 50,129,157, 91, 76,196,195, 38,103, 93,251, 51,139, 42, 93,158,248,206,111,145,205, 47,218,152,190, 13,185, 94, 86,234,237,220,
+222, 57, 31,252,224, 81, 22, 20,192, 77, 0,192, 56, 4,206,212,100,253, 77,254,226, 35,255,134,249,108,194, 67,223,241,157, 28,
+ 61,243, 20,227,171, 79,243,169, 71, 63,202,202,218, 26, 27, 90,114,103, 49,229,188,111,200,203,156, 81,212,229,154, 45, 57,218,
+127, 17,165, 99,124, 85, 47,227, 32,105, 69,150,194,133,249,160,104,189,241, 75, 37,150, 95, 80,226, 92,107, 77,241,237, 97,221,
+ 6,187, 88, 75,211, 82,174,156,117,216,198,224,108,136,106,245,132, 46, 0, 62, 8, 55,235,170, 94,130, 41,180,146,116,123, 61,
+210, 52, 13, 33, 42, 77, 73,146,246,169,138, 60, 8,236, 26, 3,190, 2,169,121, 88, 30, 97,142,174,134,185,112,139, 26, 93,180,
+116,159,168, 58, 20, 78, 44, 85,227,162, 85, 67,119, 99, 77, 85,215,212,117,197,112, 90, 48,203,131,240,175,159, 42,164,212, 24,
+227,104, 92,176,231, 88, 23,230, 98,147,217, 60, 84, 22, 66, 98,172,195,184,112, 80, 5,176, 78,176,223, 41, 37,168,141,193, 25,
+ 19, 14,126, 41, 72,212,162,178,149,232, 72, 18,169, 40,104, 56,210, 40, 40,166, 93,195,109,231,239,225, 91, 94,251, 8,119,220,
+117, 23, 62, 78,192, 23,172,159, 89, 33,139, 4,127,240, 47,127,158,114,116,136, 23,130,245, 52, 37,182, 6,210,136,222,198,128,
+206,202, 42,235,235,235, 36,221, 21,188, 17, 36,151,207,178,255,167, 31,110,233,109, 39,213,242,146,242, 38, 8,109,240,150,236,
+198, 45, 21,208,146,180,235, 69,216, 35, 90, 40,149,184,197,106,180,224,138, 47,158,191,237, 52, 47,193, 32, 50, 4,149,133,116,
+173,197,207,112,194,147, 15,161, 59,126, 1,254, 70, 44,196,131, 90,176,246,198,159,160,123,207, 43,195,188,222, 54, 96,171, 86,
+ 62,111,176,245,124,153,172,214,148, 57,141,177,216,198, 96,138, 9,206,121, 76,219, 53,115,197, 4,154, 50,216,171, 16,168,180,
+131, 45,115, 28, 2, 91,229,173, 42, 91,227,202, 57, 58,235, 35,116, 8, 92,209,217, 32,248,223,171, 25,190,202,113,206,134,110,
+143,142, 16, 50, 66,168, 24, 29, 69, 97, 77,136, 54, 17,176,169,136,186,107, 33, 68,166,237,186, 9, 29,135,131, 63,216,139, 16,
+198,225,156,193,212, 13, 74, 71,152,170, 33,238,117,131,117,216,250,128,164, 22,193, 47,221, 76, 70,204,110,188, 64,119,101, 64,
+ 87, 75,142,142,167,148,101,141, 19, 26,171, 34, 68,146,182,227,174, 24,169, 35,188, 14,196,186,170, 40,113, 45, 86, 88, 74, 65,
+ 81, 89, 6,189, 46,243, 60,240, 70,106,231, 48,222,115,231, 70,159,159,253,241,183, 81, 54, 21,233,234, 74,120,237,201,156,248,
+104, 8, 94,144,187,117,102, 81,134,169, 13, 87,175,143,152, 22, 19,180,172,233,117,215,249,149, 95,253,167,124,234,177,231,120,
+226,107,143, 51,171,231,188,243,129,243,252,221,239,124, 45,239,248,153,127,200, 93,223,252, 70, 14,158,125, 10, 91, 22, 28,222,
+188,201,115,215,111, 96,202, 57, 47, 61, 59,228,221,239,121, 19,127,249,235, 63,207, 61,233, 17,155,253, 20,125,246, 33,158,191,
+182,199, 74,175,203,205,227, 41,147,249,156, 27,123, 67,242,170, 97,214,189,157,205,183,252, 24,247,254,228, 63, 98,243,194, 5,
+142,191,252, 56,166,204, 17, 58, 66,182, 90, 9,191,216, 31,219,241,145,240,142,203,175,248, 62, 62,241,213, 43, 52, 84,236,206,
+102,204,172,225,191,127,215,187, 57,184,113,157, 40,142,136,210,132,124, 56, 35, 78,186,228,195, 9,179,233, 33,179, 81, 65,127,
+101, 13,231, 42,154,162,161,170, 2,249,116, 60, 28,161,123, 37,151,239,185,204,225,205, 67,166,197, 28,173, 98,198,147, 10, 73,
+197,206,126,142,170, 4,207,239,223,192, 88, 67,166, 58,120, 33, 72,164,102, 86,207,192, 70,236, 21,187, 32, 4,141,109,200,162,
+ 4,171, 42,250,113,138, 49,158, 88,166,116, 85, 74,110,114, 26, 91, 81, 56,207, 32,210,188, 52, 31, 81,186,154, 72,106,140,183,
+236,215, 37,155,145, 34,147, 41,113, 87,160,222,243,205, 15,190, 47,235,119, 72,164,230,223,253,197,167,121,243,229, 45,110, 94,
+125,137,187, 30,249, 22,246, 63,251,201,147, 52,171,118,247,243, 16, 50,130,149,162,252,250, 19, 28,157,185, 23,111, 43, 14, 71,
+ 83,174, 29,140,105,140, 35, 86, 1,239,153,104, 71, 93, 55,140,103, 21,117, 93,112, 60,171, 88,233, 40, 34, 12,137,132,227, 81,
+205,172,153, 83,215, 53,101,227,232, 37, 25, 89, 18, 49,159,215,204, 75, 75,166,225,230,225,136,227,225,156, 98, 94,209, 88,195,
+212,193, 63,191, 63,225,233, 43, 59, 92,188,239, 85,252,155,143,126,140,143,126,250,243,252,226, 59,191,133,213, 24,174, 31, 79,
+ 25,230, 13,169,234,240,253,223,254, 48,166,156, 18, 69, 18,211, 24, 18, 37,169,170, 18,225, 28,170, 13, 42, 8,220,117,215, 42,
+252, 5,182,118, 72, 76,235,139, 12,138,110, 79, 8,143,144, 94,130,181, 97, 50,104, 13,243,121, 25,136, 83, 66,162, 22,248, 85,
+ 23, 32, 40,131, 44, 98,189,147,113, 84,214,124,250,249,107, 28, 29,143, 57,149, 37,100, 73,184, 40, 84, 77, 29, 90,115, 50, 84,
+ 13, 46,244,143,218,247,211,182, 63,197,178, 94,106, 45, 28, 39,190, 34, 33, 67, 37,235,221,130,187, 29, 14, 70,219,182,240,173,
+109,130, 83, 65,197,193, 86,101,105,173, 95, 13,206, 88,176,144,246, 55,248,208,111,254, 18,113,156,226, 61,104, 51,231,197,167,
+158,102, 58,158,208,189,122,131, 83,135,187,164,182, 98,223, 10,158, 17,146, 35, 45,153,187, 38, 92, 10,140, 37,142,163,192,131,
+175,131,114,125, 1,139, 8,216,205,118, 54,102,195,223, 82, 72,129, 80, 42,176,209,111, 21,182,220, 66,131,114,173,218,218, 90,
+123,226,225,119,225,177,214,121,132, 10,127,103,103, 45,221,206, 10,221, 78,143, 78,183, 79,191,191, 78,191,223, 39,146, 17,198,
+148,232, 36, 69, 18,225,189,192, 24, 67, 99, 74,140,107,120,208, 29, 33,247,190,178,196,159, 46, 90,197, 11,241,215, 13, 6,204,
+101,192,230,102,113, 76, 22, 37,156, 91,239,208,120,200, 27,203,225,120, 14, 88,230,179,130,178,178,164,177,102,165,147, 96,189,
+199,250,192,231,143,148,164,110, 60,149,105,130, 63,222,153, 86, 96,230,131,205, 69, 11,140,135, 78, 44,176,214, 16, 73, 73,214,
+ 73,192, 89,146, 52, 38, 47, 26,138,218, 46, 79, 63, 41,131,238,163,241, 10,143,103, 99,253, 2,231, 47,220,205,153,237,115,156,
+191,112,134,198, 58, 54, 54,207,145,173, 36,116, 18,193, 71,255,213,175, 32, 98,141, 22,158,110, 71,179,213, 95,199,198,176,182,
+182, 66,191,147,146,245, 87, 40, 94,186,202,197,159,248, 25,190,244,222,239, 9,246, 79,119,171, 83,242, 36,190, 82,180,216,208,
+ 96,183,116,223, 32, 84, 90,180, 57, 23,100, 48,209,218,223, 78,230,152, 45,225, 79, 44,241,135, 97,198,174,196,178,250, 95,166,
+182,181,195, 80,239, 67,222,185, 88,204,217, 57,137,227, 13, 98,187, 64, 17,147,253, 53, 46,253,227, 15,226,125,131,240,121,184,
+ 29,216,166,197, 46, 27,156,105,104,230, 67, 92, 83,225,172,164,153, 77,177, 77,129, 55, 97,116, 99,202, 57,166,152,128, 9,172,
+135, 32,208,171,240, 66, 45, 59,117, 34,138, 67,248, 11, 46, 84,217, 72, 92, 85, 32,116,132, 19, 50, 92,198,141, 1,157,130, 80,
+136, 40, 11, 29, 0,103,240,213,156,186,152,160,162,192,131,192, 59,124, 93, 5,234,220, 34,108, 9,129, 51, 21, 82, 42, 68,156,
+162, 85,180, 28,109,184,178,162,169,114,164,142,105,202, 28,143, 71,199,113,139,181,174, 80,105,135,184,179,194,222, 51, 95,165,
+155,198,116, 6, 43, 92,189,113,192,212, 43,138,105, 65,101, 66,244,171, 16, 42,240, 53,154, 6,157,100,193,110,171,194, 72,172,
+170, 42,156,151,188,176, 59,100, 56,171,104,156,163, 48,142, 72, 41,142,102, 21,191,241,222, 31,194,175, 13,216,184,243,110,180,
+ 4,198, 19,220,124, 74, 36, 37,126, 94, 51, 58,125, 63,199,121,131,242,142,131,209,148,167,159,223,229,169, 47,127,145,126, 54,
+224,244, 29,119,240,182,239,121, 51, 47, 93,217, 33, 47, 29,159,123,230,171,124,247, 35, 15,178,158, 40, 26,107,201,199, 67,166,
+195, 35,158,185,114,133,151,246, 14,217,157,228, 60,246,197, 47,240, 51, 63,251,211,188,255,223,254, 26,155,171, 61, 46,136, 33,
+247,137,235, 92,190,251, 1, 62,241,204, 14, 54,207,177,192, 86, 71, 33, 84,130,119, 13,163,113,206,100,210, 80,110,221,206,189,
+ 63,246,147, 92,124,205, 35,220,252,171, 63,195, 53, 53,173,178,231, 27,146, 5,113,158,217,179, 31,231, 82,106,184,204,156,207,
+204, 4,165,111,248,169,111,123, 19, 59, 55, 71,164,157, 8,175, 43,166, 71, 51, 64,135,200,233,172, 79, 83, 88, 58,171, 41,101,
+ 97, 65, 52, 76, 71, 35,108,109, 73,226,152, 56, 21,140,246,142,217, 61, 24,210,235,117,217,216, 88,101, 62,159, 50,154, 84, 20,
+126,202,222,100, 68,166,250,148,174, 98,179,183, 70,154, 90,134,243, 57,222,122,166,245,152,198, 55, 68, 34, 65, 74,137, 86, 22,
+ 48, 68, 90,208, 75, 36,120, 67, 63, 73,169,173, 33,214, 9, 10,207,176, 42,169, 93,141,113,166,117,145, 8,182,146, 21,166,166,
+ 38,119, 51,206,117, 79,163,222,113,239,229,247,105, 1, 89, 18,241,161,143,125,145,203, 29,205,197,237, 13,182,182, 54, 64,105,
+102,215, 94,106,115,213, 79, 64, 52, 33,135,195, 35, 76, 67,148, 79,184, 26,175, 51,157,231, 24, 99,153,206,115,240,158, 72, 88,
+174, 29,140,153, 22, 53,113, 4,101, 99, 89,141,195,130,238,118, 98,180,247,236, 30, 78,169,157,227,250,193, 1,177,150,100,157,
+152,249,188, 34,234,164,212,198, 82, 91,136,180, 38, 75, 34,182, 86, 82, 58,145,102,179,215,161, 20, 43,188,174,111,249,209,223,
+253,107, 92, 99,121,253,253, 15,241, 61, 15,174, 50, 53,158, 55, 63,116, 7, 7,179,156, 66, 20,124,246,201, 35,222,254,250,203,
+ 33, 49, 71, 10,170,162,194, 87, 5,166,168,130,162, 23, 31, 14,109, 99, 23, 6,218,160, 58,111, 17,166,206,123, 18, 37, 2, 24,
+196,133,195, 86,202, 48,187, 53,214, 34, 77, 19, 16,181, 74, 17, 41, 21,112,165, 22,172,113,212, 13, 84,141,197, 91, 79,162, 34,
+230,141,229,201,253, 17, 79,221, 60, 68,213, 13,107,177, 38, 22, 18,239, 66,218, 18,206,182,182, 29,219,230,140, 47,206,115,185,
+172, 36,219, 20, 20, 78, 58,117,126,153, 67,238, 90, 43, 88,192,160, 26,124,139, 67, 13,105, 82,182,245,143, 91,108,221, 48,216,
+188,141,137, 25,243,187,239,255, 85,186, 89, 39,120,116, 17, 92,127,230, 57, 70,251,251,236, 93,189,206, 80, 73,134,131, 62, 71,
+ 89, 23,211,201,136,164, 68, 52, 97,195,196,186, 0,114,201, 75,148, 53, 40,225, 67,229,220,210,235,148, 8,109,244,197,235, 98,
+204, 45,244,167, 69,245,215,238,159,214,133, 96,151, 22,231, 42, 1,165, 36,170,229,113, 75,165, 90,130, 89,216,208,163, 72,209,
+235,108,144,165, 25,221, 78,151, 88,170, 32, 2,244,193,126,104,189, 65,203,136, 69, 82,235,241,112,138, 18,150,135,242, 23,136,
+230,215, 79, 46, 18,178,245, 70,183,137,122, 66,128,215, 17, 87,155, 20, 99,125,216, 44,179,132, 78, 28,135, 67,198, 58,242, 50,
+231,104, 18,224, 66, 69,109, 16,210,115,126,173,135,113, 96,140, 69, 43, 69,109, 61,105, 44,153,230, 5, 78, 70,152,170, 32, 82,
+130,188, 12,179,192,198,184,240, 61,196, 83,150, 77, 96,128, 43,201,112, 30,208,185,206, 58, 6,221, 44,140, 50,148, 38,175, 26,
+146, 72,161,149, 98,181,191,129,148, 9,235,167, 94,198,160, 63, 96,101,208, 37,206,250, 65,248,183,214,144, 63,255, 20, 87, 63,
+245,121,238,190,243,101, 92, 56,123,142, 83,167,206,178,122,246, 52, 82, 58,206, 92, 56, 71,154,164,204,174,223,100,251,109,127,
+151,175,253,203, 31,193, 84, 69, 16,226,201, 91, 8,146, 66,156,132,226,112, 98, 29, 90, 92, 42,253, 45,168,206,165,205,181, 85,
+191,135,202,136,147, 8,214,165, 87,238, 36,210,117, 33,240, 94, 36,231,249, 19,131,241, 18, 42, 18, 18,115,253,242, 51, 90,196,
+183, 10, 25,114,214,183,222,241,223,209,121,217, 43,240, 62,111, 47,216, 14,202, 41,182,152,225,138, 49,245,236, 24,239, 37,182,
+174,169,198,135, 45, 94, 88, 96, 26, 71, 61, 63, 38,202,214,208,113, 39, 0,162,156, 15,225, 71, 74, 7, 38, 59, 30, 47, 19, 92,
+ 85, 98,203, 28, 91,215,148,199,161,149, 31,245, 86, 48,197,140,252,112,159,102, 50, 10, 30,248,121, 25,214,108, 85,225,133, 32,
+ 78, 58,237,253, 69,225,234, 57,166, 14,157, 66,103, 27,132,107,139, 7,165, 16, 4, 37,189,243,174,165,202,133,238,148, 20, 33,
+ 40, 6,194, 44, 92, 10,133,169,130, 90, 95,224,145, 42,240, 64,170,227, 67,142,159,251, 58,137, 22,172,110,246,184,190, 59, 68,
+197, 26,149,165, 65,124, 53,171, 80,105, 15,157,100, 24,107,169,203, 28,180,194, 58, 71, 62, 43,153,205, 43,106,235,216, 29,231,
+ 56, 15,211,202,128, 16, 36, 58,160,167,127,252,135,222,136,204, 58,248, 42,103,246,252,179,212,243, 57,243,163, 33,126, 58,163,
+172, 36, 87, 2, 12, 54,152, 0, 0, 32, 0, 73, 68, 65, 84,244, 25,242, 38,103, 90, 54,236, 31,142,121,254,218,117,134,199,199,
+ 28, 28, 30,241,224, 3, 15,163, 19,195,246,218, 22,145,169,153, 55, 9,255,251, 31,254, 17,191,243,151,159,225, 84, 49,228,182,
+ 51,155,236,222,184,193,151,159,122,158,167,246,142,169,156,103,119,114,192,223,254,222,255,138,255,251,253,255,154, 78,150,114,
+110,125,133,141,181, 14,217,222,215,120,251,183,191,146,171,209, 41, 58,190, 97, 90, 89,202,170,161, 70,210,139, 21, 81,162,233,
+ 36, 9,199,163,154,102,176,201,253,239,126, 15,171,219,231,217,255,212, 99, 1,159,108,220, 18,102,179,240,182,119,168,249, 90,
+ 25,241,165,220, 81,123,195, 79,188,254,187,216,219, 61,164,211,233,114,120,237,136,193,198, 26,197,124, 78,156,197,140,167,135,
+116,178, 30, 59,215,174,146,245, 51,180,147,140, 14,135,164, 73,138,204, 28,215, 95,220,101, 50, 41,113,210,224,244,156,222,106,
+151,249,145, 33,201, 34, 6,114,149,221,226,144,110,146, 81,211,176,153,174,242,226,209, 46,181,171, 48, 62,112, 0, 42, 91, 48,
+136, 7,237, 69, 87, 48,174,103, 20, 77, 65,211, 88,198, 77,205,106, 87, 6,224,143,210, 68, 45, 16,191,241, 53, 78, 4, 59,116,
+ 79,103,204,108,142, 22, 49,221, 56,225, 48, 31,162,203, 34,231,120,191, 97,181,223,231,238,181, 30, 31,120,242, 37, 94,243,178,
+115,236, 92,189,198,230, 93,247,176,251,201,143,209, 6, 40,161, 90, 21,161,111,161, 16,206, 3,207,125,141,181,222, 22,211,116,
+ 13,237, 44,194, 89,246,143, 27, 92, 47,230,220,106,151,162, 54, 96, 27,110,142,115, 70, 82,112,247,246, 58,154, 20,175, 37,231,
+214, 58, 60,250,149, 27,172,247,123,228, 69, 73, 39,142,200,189,163,152,229,244,186, 25, 43,221,152,173, 65,151,162,108,168,106,
+ 71,183, 63,224, 85,247, 62,196, 71, 63,243, 24,191,254,252,243,216,220,146, 70, 49,239,121,227,253,140,134,215, 80, 8,242, 74,
+242, 19,223,118, 31,222,193,199,158,188,194, 47,255,167,155,252,243,183,110, 50,153, 6,245,115, 97, 61, 62,207, 41, 5, 36, 89,
+140,107,119, 38, 87,213, 1,216,208, 52,161, 69,109, 45,218, 59, 74,171,137, 19, 77,147,151, 97,198,174, 84, 8,208, 0,156,146,
+244,146, 4, 47, 4, 90, 75, 34,227,105,128, 40, 74, 49,149,161,106, 36,211, 42,144,214,156,151,104,103,241, 78,240,137,107, 35,
+254,244,153, 3, 98, 41,120,228,252, 58,247, 93,216,162,179,214, 3, 33,169,218, 12,102,233, 29,210,132,136, 34,169, 84, 72, 91,
+211,106,153,170,181,216, 12, 67, 30,177, 93, 38,150, 45, 54, 68, 47, 66,234, 29,166, 2,209, 96, 99, 79, 22, 39,168,213, 85, 30,
+125,244, 3,236, 94,187, 78, 47, 75,153, 29, 15,233,109,172,227,204,156,186,172,131,168, 79, 70, 80,149,228, 67, 75,175, 91, 19,
+247,250, 52,120,170,170, 70, 56, 79, 89, 5,168,135, 82,138, 81,225,136, 36,196, 81,104, 13,187,210,208, 0, 74,235,246,194,100,
+ 90,159,104,232, 34, 8,130, 72,209, 33, 66,148,165,247,120, 19, 42,217, 88,133, 86,181,104, 99, 51,149,142,113, 24,116, 45, 81,
+202, 98, 27,143,245, 6, 33, 42,164, 72,177,206, 5,197,185, 51, 40, 29, 83,150, 69,104,233,107, 75,213, 52,236,237, 13,121,205,
+195, 47,167,251,153, 15,134,138, 84,139,165,186,214,183, 81, 78, 42,110,233,129,222,115,142, 41,206,245, 40,234, 26,107, 51,108,
+213,160, 87, 66, 56,203, 84,107, 16, 17,177, 18, 28, 87, 53, 74, 88,166,243,138, 89, 94,208,237,116,195, 37,198, 6,220,166,117,
+150,126, 63,229,104, 92,210,160, 41,102, 21,107,221, 56,124,247,128, 44,139,131, 56, 49,210, 84, 69,133, 51,158,126, 39,165, 40,
+ 10,180, 82,204,139,130, 52,138, 41,235,134,110, 26,161,162,144, 83,128,136, 57,179,125, 9,237, 44,167,214,122,156, 58,181, 65,
+111, 16, 81, 55, 57,183, 37, 61,126,246,173,111, 98,115,243, 44, 43,171, 41, 43,253, 85,234,114,196,100,118,196,185,219, 47,160,
+140,101,124, 52,225,129,255,250,159,240,228,207,253, 0,182,154,183,247,155, 5,220, 37, 28,162,238,150,138,124, 73,136, 91,230,
+162,183, 34, 54, 31,196,161, 11,222,103,152, 22,133,128, 14,107,253, 18, 23, 27, 58, 69, 98, 9, 18, 89,140, 92,150,182, 36,121,
+ 75,179,191,173,250,157,109,231,232,162, 85,190,251, 80,136, 47,170, 18,223, 8, 80, 26,239, 10,132,176, 33, 54,181,174, 90,225,
+101, 0, 70, 57,231,168,139, 41,190, 54,120,149, 98,171,144, 77,225,188, 65, 70, 43, 84,211, 17, 50,206,208,113, 23,225, 26,172,
+151,184,186,128,162,164,206,199,148, 71, 55,105,138,138,227,107, 47,178,118,238, 60,229,232, 8, 91, 91, 80, 17,194,215, 12,175,
+237,179,114,102,155,254,169, 77, 38, 7,135,152,162,160,191,117,134,178,152, 19,167, 29,186,107,107,196,131, 77,210,213,245,224,
+222,168,139,176,134, 93, 96,186, 11,161,241,182, 10,114, 25, 33,112,229,148,198,166, 97, 4,104, 29,198, 52,184,198, 33,163, 36,
+172,235,186,164,193, 35,210, 30, 54,159,163,178, 53,116,154,226, 93,131,214, 93,136, 59,244,187, 25,165, 13,234,117, 45,194,243,
+ 28,237,238,227,182,207, 18,119, 6, 28, 31,204, 24, 30,220,160,219, 79,217,221,159,144,164,154, 27,251, 35,114, 43, 80,248, 16,
+161, 42, 21,195, 60, 71, 74, 73,172,192, 9, 75,125,116, 68, 57,155, 83,215, 13,243,107,123, 8, 47,185, 33, 36, 87,138, 43,232,
+149,140,126,111,192,120,156, 51, 29,207,216, 92,137,233,233, 41, 7,215,111, 32,216,100, 88, 10,182,206,156,226,229,119,221, 67,
+ 94, 20, 60,255,245,143,241, 11, 31,121,140,237,255,244,113,222,124,207,121,190,186,115,204,216,120, 4, 18, 7, 28, 29, 13,153,
+ 89,199,238,180,228,218,254, 49,103,215, 82,206,221,121,137,151, 62,246,167,188,247,135,127,152, 95,249,168, 97,154,151,164, 29,
+143,136, 35,234,126,135, 27, 55,199, 76,102, 53,167, 55, 50,108, 28, 51,153, 37,108,124,231,247,240,230, 87, 63,194,159,255,216,
+119,127,195,197,115,161,169,243, 64,105, 91, 0, 18, 2,185, 82,176,178,190,130,138, 90, 59,176,115, 72, 25, 83,231, 57,211,227,
+ 25,106,160, 40,231, 53,105, 50, 34,146, 93,210, 44, 98, 88, 29,113, 97,253, 60,218,121, 26,103, 49,222,177,150,244,152,236, 79,
+152,154, 57,174,178, 24, 17,113, 54,219,194, 41, 88,151,171, 92, 29,221,228,220, 96,131,121, 81,113, 88, 29,161,165,160, 23,247,
+ 64, 86, 8,103, 73,100, 23, 85, 75, 38,102,134,181, 53, 74, 40,246, 70,138,126, 26, 97,124, 73, 47,145,216,185, 38,178, 17,153,
+240, 56,229,169,189,161,171, 58, 24,103, 24, 85, 97, 53,234,114, 62,225,194,153,203,184,166,228,252, 74,198,149,209, 20, 99, 12,
+ 7,251,123,156,218,222, 64,119, 7,152,233,100,217,162, 12,183,240, 96,198, 95,196,220,173, 63,241,215, 76, 55, 47,243,185,238,
+109, 12, 18, 65, 89, 86,124,226,197,156,237,181, 30, 73,154,146,198, 49,101, 3,219,171, 93,148,176, 36,218,129,104,232,117,122,
+ 72, 33,233, 36, 25,171,189, 14, 69,222, 16, 69,154, 78, 20,225,173, 33,159,207,184, 81,206,185,109,115,133,243,253,211,244,179,
+152, 95,254,141,255,153,181,193, 42,167,210, 14,141,242,188,229, 85,175,102, 51,155, 50,105,178, 16,148,226, 12,101, 21,230,228,
+175,191,184,197,237, 87,159, 96, 60,124,132,180, 19, 97,132,196,219,132, 89,221, 64, 93,227,227,184,165,178,121,108,221, 96,203,
+ 28,169,117,128, 23,216, 32,120,138,227, 8, 23, 71, 8, 45,177,243, 18,148, 67,232,160,240,137,149,194,213, 13,198, 4,236,161,
+214, 97,142, 44, 45,168, 88,163,163,136, 52, 54, 88,107,176,206, 81,212,161,253, 39,148,166, 19, 37, 40,173,120,226,184,225,119,
+159,122,130,149, 36,226,161,211, 43,188,252,226, 41,182, 54,122, 33,135, 88,197,120,165, 48, 62, 0,107,100,211, 78,225,149, 10,
+162,178, 54,238, 18, 23,108, 99,222,134, 20,183, 19, 70,114, 32,201, 65,240, 43, 63,191,251, 28,147,175,142,137,163,140,245,173,
+ 45,166,163, 25, 68, 49,179,249,156,195,225,152, 63,255,194,243,124, 97,127, 66,233,190,145,200,212,143, 37,111,127,232, 50,223,
+241,208, 29,108,172, 13, 40,154, 16, 3,171, 8,168, 78, 35, 4, 77, 99,201, 58, 49, 73, 26, 72,122,117, 99,105,106,215,118, 15,
+218,121,187, 7, 41, 27,156, 87,203,168, 69,219, 30,226, 14, 90, 53,190,192,183,214, 50,223,178,224,109,155, 42, 37, 34,139, 47,
+ 61,101,145,147, 68, 10,165, 66,155,209,227, 41,124,137,245,150, 65,214, 97,231,104, 68, 28,119,121,235,247,126, 15,211,223,251,
+ 85,220,226, 96,113,224,164, 88, 6,239,132,196,206, 86,165,237, 4, 93, 97,233, 39, 10, 33, 19,138,186,102,208, 9,255,237,198,
+154, 56, 18, 92, 88,239,145, 23, 57,251,135, 99, 42,231,169, 92,205,254,104,202,165, 52, 35, 81,146,162,117, 51,208,210,206,188,
+ 51,116,210,132,169,117, 28, 76,115,122,113, 68, 28, 69, 24, 99,153, 20, 21,145, 20,164, 73,204,188, 40, 73,156, 71,235, 8,239,
+ 44, 74,180,173,249, 40,232, 48,148,177,164,105,138,138, 83,106,159,176,125,219, 69,164,150,193, 47,111, 12, 89,154,112,253, 79,
+254, 31, 46,174,107,146, 53,197,193,225, 21,170,178, 71,218, 77,217, 58,117,138,170,154, 99,215, 54,217, 92, 95,225,139, 63,253,
+221,203,106, 91, 44, 18,176, 22,155,157,245,220,130, 87, 95,178, 93, 67, 28,106, 27, 87, 32, 79,232,146,178, 85, 22,203,150,245,
+105,141,111, 85,241, 30,225,195,115, 75, 47,240,141, 15,135,187,187, 37,111, 76,156, 84,247, 11,111,178, 91,200, 70, 22, 14,207,
+ 22,164,134, 91, 68,111, 6, 60,114,231,246, 7,192,207,195,251,240, 17,184, 60,164, 32,150, 83,154, 98, 74, 83, 85,184,186,194,
+214, 5,214,120,234,170,192, 87, 53, 78, 8,108, 61,193, 89,129,180, 53, 42,222,164,202,115,118,158,252, 52, 10, 79, 61, 31, 51,
+ 59,156, 50,220, 57, 66, 41, 73,210, 9,249,244,113,175,131,169, 67,194,162,183,161,171,116,248,194, 77,118,174, 92, 67,120, 67,
+ 81,122,226,231,119,112,141,167,179,218, 37,237,198,116, 86, 6,116, 55,183,136, 87, 55,233,174,111,134,125,196,181, 26,142,170,
+ 12,174,162, 40,105,133,125, 96,171,121,104,143, 19, 66, 96,240, 13,166,202,113, 46,176,227, 93, 93, 64,214, 37, 74, 51,148,130,
+ 74, 64,220,233, 34,146,148,102, 62, 35,235,117,200, 71, 51,132, 23,116, 87, 87, 16,211, 41,149,105,248,242,227, 79,176,182,190,
+ 74, 94, 86, 92, 63,152,112,116,101,151, 56,142,201,235,138,163,162, 14, 93, 32, 1, 89, 34, 24, 23, 21,221,172, 67,101,114,254,
+242, 47, 62,201, 27,191,253, 85,220,216,223,195,180, 40,102,135, 33, 90,189,141,191,184, 17,241,196,141, 79,112,251,217,109, 54,
+183,206,179,185, 50,224,116,175,160, 39, 27,198,165,163,154,236,113,184,171, 49,117,197,238,200,240,234, 7,238,224,244,106,198,
+ 23,206,156,225,207, 31,251, 48, 77,221,240, 59, 95,122,129,173, 94, 23, 75, 24, 89, 93,220,190,135,221,171, 47,162,148,160, 65,
+240,236, 81,193,229,221, 9,235, 91, 51,182, 95,123, 15, 79,254,201, 31,241,175,222,245, 30,126,251,211, 37, 85, 81,147,102,125,
+156,245, 52,166,102,116, 56,103,111,199, 98, 81,220,113,231, 89,110,187,176,194,197,211,171,188,253,255,251, 44,127,252,206, 55,
+ 82,207,198,173,126,202, 47,199,130, 99,155,144, 72, 79,227, 13, 47, 61,125,141, 11,119, 62,192, 83,159,121,138,122, 62,164,183,
+210, 39,238,121,154, 92,144, 69, 29, 76,211, 48, 62,218,227,236, 29,247,224, 75, 71,238,142,177,185,164,105, 38, 88, 47, 25,116,
+ 53, 47, 30,239,145,206, 61,162, 86,148,166,162,151,116,153,204,142, 24, 68,171,244, 87, 27,132, 46,201,102,171, 28,229, 99,186,
+ 81,196,154, 90, 97, 92,142,209, 8,140, 51,164,145, 38,175,102,236,151,251,120, 60,169, 78, 88,139, 87, 41, 76,195,246,170,102,
+ 86,193,124, 46, 81,210, 19,171,152,142,140,105, 48, 24, 32,147,154,153, 41, 41,108,201,217,206, 69,212,143, 62,116,225,125,194,
+ 84,244, 87,215,248,248,151,159,229, 51,251, 99,222,113,215,105, 34,173,217, 88, 91, 37, 90,219, 96,242,220, 51, 1,110, 34, 60,
+206,223,194,216,109, 87,167,243,130,181,114,196, 93,211, 27, 28,186,136, 27, 37, 28, 78,167, 92,121,225, 42, 27,169,102,181,223,
+165, 19,135,170,246,252, 90,134,162,161,154, 55,124,238,217,107, 28,143,143, 57,189,222, 39,214, 10,173, 97,173, 27,145, 8, 79,
+ 22, 7, 85,231,197,245,109, 14, 71, 83, 62,241,196, 23,120,244, 11, 95,228,246,179,167, 57,187,190, 66, 20,197,220,127,246, 60,
+ 63,248,200, 25, 70,199,147,144, 89,238, 61,190,174,136,210,148,175, 60,250, 41, 54,234,156,237,151, 63, 64, 41, 67,100, 98,164,
+130,229,200, 25, 75,211, 24,180,112,237,191, 27,132, 9, 76,227, 52,210,116,146, 24,169, 20,101, 94, 6,152,134,177, 68, 42, 84,
+ 49,214,134, 69,168, 84,219,246,109, 69,107, 82, 4,177,157,144,193,170,160,165, 68, 75,129, 84,178,245,154, 43,178, 36, 66,183,
+ 27,121, 22, 71,116,187, 29,214,122, 93, 86,147,132,211, 27,107,168,164,199, 81, 19,113,100, 18,142, 74, 71, 81, 52,152,249, 12,
+ 97,109,192, 94,154, 6, 87, 53,152,178,192, 86, 53,174, 44,177, 85, 73, 83, 20,248,170,229,160,231, 21,182,110,104,170,154,195,
+233,148,157,227,125, 94,216,191,201,193,225, 14, 58, 78,232,118, 59,109, 5,237,168,235,138,131,195, 17, 95,127,113,135, 79,124,
+125,135,207, 30, 76,232, 68,154,126,172,232,196,154, 84, 73, 58, 81, 24, 45,124,238,234, 33,127,248,248,115,252,209,231,190,198,
+150,246,172,196,193,190,100, 93,123,225, 16,237,252,181,157,157,170,118,170,234, 76, 27,141, 42, 66, 57,230,234, 32, 8,180,198,
+226,125,152,157, 91,231, 90,128, 72,123,155,182, 54, 36, 23, 89,131,105,154,165, 15,213, 25, 67,213, 18,215,162, 40,198, 52, 21,
+121, 17,196,148,221, 56,102,247,232,152,127,241,123,143,242,182, 87,190,130, 7, 47,158,167,252,147,255, 35,216,159,148, 92, 98,
+143, 23,226,194,118,178, 17,170, 73, 4,178, 37,144, 29,202, 62, 7,141,167, 50,158, 78,154,132,158,136,148,116,180,226,112, 90,
+ 50,153,207,153, 55, 22, 45, 5,147,217,156,202, 24, 46,172, 15,232,103, 49,133,113,116, 83, 77,217, 24,198,121,195,246, 90,151,
+163,227,201,210, 51, 59,169, 42,172,179, 72,103,137,116,208, 29,152,133,175,219, 59,148, 16, 52,117,128,206, 68,177, 14, 1, 19,
+ 82,145, 38, 17,113,156,176,209, 91,225,206,219, 95, 70,214,233,176,189,190, 70, 22,167,108,111,173,177,117,118,149, 43,191,252,
+ 35,108,187, 49,171,118,206,106, 95,179,114,250, 20,189,126,130,156, 28,208, 60,251, 36,230,169,207, 48,123,250,241,144,225,176,
+ 64,128, 47, 71, 56, 75,254,240, 50, 49,109,209, 38, 95, 84,207,203,244,172,133,231,124, 17,229,238, 79,172,109,139, 4, 54,215,
+ 2, 13, 23,175, 35,244,242, 35, 92,102,101, 11,213, 86,229,183, 42,231, 91,214,247, 55,192,224, 57,177,211, 9, 39, 80,189, 77,
+182,127,248,159,134,139,152, 45,161, 30, 7,120,140, 49,248,186, 12, 28,246,114,134,179,142,166,172,176,141,161,201,115,140,169,
+ 64,165, 33,242, 51,206,240, 50,101,231,241,143,179,255,149,199,217,249,218, 11, 76,118,247, 25,239, 79, 24, 31,140,209, 73, 68,
+ 28,197,237,124,222, 48, 61, 26, 99, 27,152,142,107,106,227, 56, 60,204,137, 34, 21,218,229, 42,198, 24, 79, 89, 90, 38,179,154,
+ 42, 47,145, 8,102, 7,199, 76,118,246,153,238, 92, 99,182,127, 19,149,118,208, 89, 31,233, 13,118, 62, 10,186, 3,213,162,164,
+ 85,180,220, 63,108, 29, 68,180,182,182,173, 85,152, 0,162, 17, 10, 83, 22,161,109,161, 98,116,214, 99,255,107, 95,197,151, 51,
+210,254,128,249,188, 96, 54, 41,200, 86, 6,200, 56,120,232,173, 51, 88, 15, 7,135, 99,174, 31,143,153,215,161,197,126, 84, 20,
+ 28,150, 13, 90, 4,135, 65, 22, 71,228,117, 67, 55, 77,152, 23, 21,185,113,124,252,233,155, 60,251,220, 77, 46,173,101,100, 64,
+185,119,204,243,215,115,126,229,243,207,243, 23,207, 94, 9, 76,117, 21, 99,203, 57, 85,149,115,109,231, 6,222, 89,210, 68,112,
+102, 99, 13, 39, 34,174,239, 28, 6,247,201, 60,231, 21,247,110,114,102,181,203,197, 59,191,157, 79, 62,254, 9, 50,233,152, 86,
+ 13,198, 65, 95,195,229,251,191,131,195,157, 43,220,188,254,117,180,144,244,133,103, 75, 11, 78,173,101,168,213, 21, 78,159,217,
+230,218,231,159,228, 29, 63,247, 15,120,236,111,158,161,219,203, 24,230, 53,137,175, 40, 28,108,118, 21,215,199, 5,227,153, 97,
+ 58,202,201, 75,141, 79, 34, 94,243,174,119,243,236,239,126, 8, 91,149, 75,176,154,247,158,210,105,190, 82,192, 43, 83,201,155,
+ 47,223, 73,173,123, 76, 14, 15, 89, 93, 95, 99,116, 52,225,112,239,128, 51,151,122,220,120,241,144,193,250, 10, 89,154,240,217,
+207, 62,193,202, 74, 76, 61, 83,148,118,198,234,106,143,114,218,144, 14, 98, 38,227,154,178,105,152,149, 13, 91,155, 33, 33, 47,
+209, 93,230,182, 98, 82,229,140,134,129, 63,114,148, 31, 81, 90, 67,105, 75,250,186,199,180, 26, 17,199,146,209,124, 78, 97, 11,
+180, 20,196, 42, 98, 37, 30, 48,172,199,156, 91,233,112, 99, 84,144,106, 65,211,120,166,198,112,170, 23, 81,218, 54,108, 71, 38,
+193, 88,228, 21, 66, 10,122,170,131,126,242,133, 61, 94,125,207, 69,164, 55,196, 74, 98, 1,107, 44,167, 54, 7,120,219,208,221,
+ 88, 63, 89,244,238, 36,108,193,217,176, 9, 43,187, 80, 96, 11,164, 49,188,238,248, 10,175, 7, 26,173,177,235,158, 35, 53,227,
+243, 69,197,169,110,194,186,182,140,166, 51,230, 99, 3, 77,194,225,254, 53, 94,119,199, 25,102, 78, 80,229,115,124, 20, 98,232,
+144, 80, 55, 53, 79,239,236,242,216,240, 43,232, 40,230,182,173, 13,206,108,174, 81, 54,158, 44,201,184,107,208,227,237,175,185,
+204,100,120,136,150,193,251, 92, 55, 53, 81, 28, 51,124,252, 75,188,252, 76, 23,113,249,110,138, 84,145, 24,143,243, 53,213,172,
+106, 75, 2, 67, 62,157,112,124, 16,226,242,174, 31,141,249,171, 23, 14,121, 46,175,200,180, 98, 35,139,120,243, 61,231,249,238,
+135,110, 15,169, 68,135, 99,188,137, 72,147,136,106, 17, 15,218,138, 94, 34,173, 17,206, 81, 91,131, 23, 18, 69, 72, 36, 82,178,
+157,219,162,136, 84,216,188,157,131, 40,210, 8,169, 2,104, 66, 40,162, 36, 38, 75, 18,148,142,232,164, 41, 58,214,196,113, 76,
+146,165, 8,173, 41,156, 96,102, 29,229,108,142,112,150, 78,175, 75,146, 37,216,186, 14, 1, 40,166, 33,233,174,176,191,243,165,
+144, 88, 38, 60, 82, 71,168,246,208, 80, 73,196,170,150, 52,181,165, 28,207,168, 11,141,138, 52, 94, 64,150,165,225, 66,226, 4,
+155,157, 24,129, 64, 73, 22,217,152,203,121,166,117,158, 78,164, 90,207,177,226,195,159,127,134,242, 83, 95,231,199, 95,123, 7,
+175,190,231, 18,214, 41,156, 51,248, 82,162,163, 58,108, 68,237, 99,149,150,237, 38, 30,118,105, 29,183, 21,156,146, 88,111,161,
+109,255,249, 86, 17,239,140, 9, 27,179, 11,227,157, 0,239,104, 15,244,166, 65,120,208, 74, 51, 47,114,180,112,196, 74,242,169,
+103, 94,224, 79,159,122,129,162,177,156, 95, 31,240,173, 23, 54,184,246,232, 7,218,195, 18,180,247,120, 36, 82,182,222, 13,231,
+219, 0, 18,177,212, 36, 32, 29,198, 57, 94, 46, 15,184, 26,109, 51, 42, 43,170, 34, 39,213, 93, 76, 99,136, 35,205,102, 63,230,
+197, 93, 79,170, 37,163,210,210,137, 34,142, 39, 57,135,147, 25, 74, 43,210, 68, 19, 73, 69, 36, 21,153, 14,164, 50, 29, 41,172,
+175, 81,145, 6, 83, 3, 26, 35, 5,186, 85,243,107, 17,210, 80,100, 11,114,209, 89, 76,150, 6,224, 13,173,198,162,170, 66, 55,
+ 33,138, 18, 6,157,136,203, 91, 25,167, 6, 25,107, 43, 17,253,110,135, 76,141, 49,163,131, 32,238,244, 53,234,120, 15,134,187,
+ 44, 44,254, 82,122,236, 45,121,214,194,139, 37,229,109,225, 32, 8,249,232, 18, 47, 61,194,250, 37,143,221,223, 98, 53, 11, 22,
+183,246,125,249,160, 19,147,139,121,252, 34,177,205,180, 62,114, 25, 8,123, 74,137,144,238,216,250,211,229,178, 43, 19, 94,119,
+145,159, 45,110,185, 44, 88, 21, 64, 56,139, 33,188,115, 65, 37, 47,165,167,115,230, 14,100,148, 66,115, 4, 77,129, 43,203,112,
+ 49,169, 26,154, 98, 78, 61, 31, 99,157,160, 41,230, 56, 84, 8, 94, 17, 18, 83, 6,184,148,238,174, 80, 28, 31,113,229,163,127,
+132, 51, 30,215,212,224, 29,121,110, 72,187, 26, 29, 43, 98,229,233,100, 32,117, 66, 36, 61, 99, 91, 19,101,162,181, 79,194,230,
+230, 38,211,163, 41,137,246,116,186, 17,199,141,197,150,134,141, 94, 76,156, 74, 48, 13, 82, 71, 52,198, 32, 43,205,228,230, 49,
+179,195,191, 65,117, 98, 46,191,234, 17, 6,167, 54, 17,173,229,109, 49, 95, 16,113,135,102, 62, 70,232,184,181,248, 85, 72, 84,
+200,144, 88,240,117, 0,124, 77, 61, 62, 32,233,111,161,180,198,213,225,111,108,242, 57, 85, 89,226,134,135,152,198, 32,181, 38,
+209, 9,195,241, 33,211,218, 96, 26, 67,101, 44,227, 58,112,223, 21, 39, 66,196, 97, 94, 6,222, 69, 89,211,248,176,238,210, 84,
+243,213,221, 99, 62,245, 59,135,104,192,246,215,185, 86,212, 36,206,114,113,109,133,110,167,195,214,122,143, 68, 41,134,163, 93,
+198,147, 35, 6,189, 51,224,224,224,104,159,158,235,178,119,120, 64, 57, 47,241, 98,206, 51, 47, 21, 60,116,239, 25, 86, 87, 75,
+182,255,217,111,240, 47,255,167,127,128, 38, 4,130, 85,241, 25,126,240,123,191,159,127,241,171, 63,207,197,126, 15,229, 60,107,
+169,162,163, 60,147, 27, 7,172,108,174,147, 63,120,142,181,188,230,153, 63,250, 32,255,205, 79,255, 29, 62,240,193, 79,115,122,
+189,143, 49, 9,195,253, 67,102, 42, 97, 53, 81,212,249,152, 58,118, 28,238, 29, 49, 25,231,140, 46,109,240,214,223,127,140, 63,
+123,231,155,168,198,199,203,177,210,170, 54,108,197, 17,127,111,107,206,244,197,199,137, 87,239, 8,123,112,127,133,188, 26,178,
+ 58,232,242,229, 79, 61,195,217,115, 23,152, 21, 83,182,206,196,108, 60,191,198,225,206,132,173,179,155, 28, 92,217,231,165, 43,
+123, 20,212,172,102,231, 2, 50, 59,138,241, 94, 98,100,193,196, 86,104, 63, 64,107,131,241,129,202,231,109,201,122,186,198, 81,
+ 53,102,179, 19, 97,108,142,195,115,156,231, 40,239,145, 40, 58,186, 67,237, 26, 6, 41, 88, 41,216,200, 82,174, 30, 31, 35,125,
+151,178,158,177,154,117,185, 54,217,225,114,127,155, 73, 33, 24, 54, 5, 25, 49,137,142, 16,206, 49,181, 67,212, 15,221,183,253,
+190,151,221,126,137, 56, 77,249,216,147,207,113, 80, 86,220,222,209,172, 38, 9,107,155,235, 40, 45, 57,250,218,149,160, 44,189,
+ 5,166,191,112,178,250,214, 82,229, 90, 5,172,247, 97, 17, 42, 23,188,185,157,111,251, 46,110, 30,143,184,173, 31, 49,159,206,
+184,113, 60,101,165, 40,217,254,204, 31,240,242,230,152, 59, 71, 55,121,200,207, 16,103,239, 98,123,173,207,249,254, 42, 55,110,
+236,128,173,184, 62, 45,201,210, 14,247,157,219,166,151,198,108, 14,122,156, 95,233,241,250, 59,206,243,186,151,109, 83,207, 15,
+144, 82, 35,188, 65, 8, 80, 66, 96,170, 10,189,190, 6,167, 78,227,176,184,170,193, 54, 65,220,229, 93, 8,255,192, 4,140,105,
+145, 87,220,220, 31, 49, 44,106,210, 72, 49,175, 26,134,181,101, 90, 91,254,230,197, 3,254,195,231,158,229, 11,207, 93,231,109,
+ 15, 94, 36, 22, 48,156,230,100,145,194, 90, 27,236, 90, 11, 65, 81,155, 63, 44, 91,107, 26,206, 44,173, 20, 56, 23,178,148,165,
+ 12,106,107, 2,167, 92,181, 21,176,148, 26,133, 39,137, 99,192,211,233,118,233,100, 9, 73,183, 75, 28, 69, 36,177, 10,246, 58,
+ 28, 73, 36, 73,179,152,172,219, 33, 74, 19,226, 36, 67, 41, 77, 85,220,164,202,131, 47, 52,210, 49, 81, 27,142,160,100, 56,192,
+227, 52, 69,199, 17,113, 18, 33, 37,216, 38,132,161, 52,141, 9, 52,169, 88,243,129, 39, 95, 36,213, 42, 68,180,202,246,115,108,
+ 43, 48,219, 42, 76,172,135,123, 79,173,209,215,158,243, 43, 25, 47, 29, 78,168,139,156, 94, 44, 67,229,109, 12,222, 52, 72, 9,
+145,148, 40, 21, 70, 0,162, 37,147, 45,152,225,214,216,118,110,232,131, 88,201,187,208, 5,105, 59, 40,161, 66,113, 88,231,169,
+138,154,249,100, 74, 81, 84,225,226, 86, 7,112,207,104, 50,225, 63,126,254, 41, 62,244,249,167,121,122,239,152,126, 26,161,149,
+228,117, 61,184,124,240, 84,176, 66,106, 17, 0, 38, 11,101,151, 18,109,182,243, 34, 17, 74,180,110, 41, 25, 80,148, 8, 50,103,
+121, 65,172, 96,157, 39, 55, 14,173, 66, 42,184,240,158, 72,122, 20,158,157,113,206, 44, 47,112,222, 98, 29, 52,166,230,204,218,
+ 10,169,146,228, 85,131,245,142,198, 58,242,202,160,148, 70, 73, 69, 89,134, 92,233, 52, 73, 16, 66,144,215, 13,149, 49, 88,130,
+120,206,249,182,231,236, 44, 90, 8, 34,165,112, 62, 0,144,186, 89,140,107,106,238,189,253, 62,206,172,159,162,147,198,172,116,
+186,220,247,224, 93,156,190,208, 33,223,185,202,141, 63,249,237,101, 70,249,162,230,110, 83,102, 91, 20,171,248,134,249,184,229,
+150, 84, 54, 47, 2,153,107, 33,140,187,101,206,237, 57, 49, 97, 44,198,109, 39, 24,209, 5, 8,177, 77, 82, 19, 39,169,108,254,
+150, 8, 87,111,218,139,191,227,150, 80,162,197,252,188,125, 75, 45,231, 93,184,147, 96,153,133, 74, 92,200, 32,178,148, 26,122,
+247,125, 11, 43,175,124, 3,206, 26,168,115,188,148,216,217,144,106,114,136,169, 74, 76,213, 80, 77, 70, 1, 82, 84, 86,152,124,
+134,169, 13,217,230, 57,170,124,198,238,147, 95, 96,239,171, 79, 48, 59, 58,166,202, 75,154,188, 33, 74, 4, 43,171, 25, 49, 13,
+ 23, 46,245,136,149, 33,203, 52,189,174,132,166,166,183,158,145,104,193,160, 23,227,202,154, 78,228, 24,172,199, 36,137, 66,120,
+232,247, 18, 18,229,233,119, 97,125, 35, 33,138, 37,162,105, 88, 93,141, 73, 19, 65,150, 10, 38,195,146,186,178, 28,190,248, 60,
+219, 47,187,171,157, 45,180,128, 31, 23,184, 24, 33, 51,194, 33,116,140, 43, 75,164, 14, 22, 84,107,170,150,244, 25, 4,155, 74,
+106,172,151, 76,174,189,192,100,103,135,211,151, 46, 96, 77,195,193,254, 30,194, 26,242, 89,201,141,131, 33, 47,237, 29, 51,175,
+ 13, 71,243,130,113,217,112, 92,213, 84,198, 97, 60, 52,158,160, 61,104,193, 44,165, 49,148,141,165, 52, 1, 30, 37,219,239, 96,
+162, 3,135, 63,177, 5,103, 55, 78,177,185,117,158,184,219,199, 10, 73, 93,214,140,166, 51,174,237,238,112,126,251, 20, 82, 39,
+172,244,187, 28, 28, 13, 41,173,194, 84, 37,123, 55,175,113,249,226, 54,195,241,136,166,168,216,218, 26,208, 79, 28, 15,221,255,
+ 38, 62,255,197,207,176,210, 95,225,220,165, 7,185,237,212, 25,174, 63,247,105, 86,157, 65,227, 57,155,106, 82, 47,136,156, 35,
+139, 36,131,243,167,137,215,215,153,125,233, 10, 23,223,244,102,110,220,156,208,137, 5,101, 94,115,148, 87, 28,238,239, 80, 25,
+ 79,175, 27,179, 63,173,136, 35,197, 90, 47,102,146, 27,102, 70,240,186,119,253, 48,207,124,232,253, 97,228, 7,120,175,120,121,
+214,208,145,142,124,178, 79,114,238,213,108,157, 61,197,100, 60,167, 46, 11, 78,157, 57,203,206, 75,215,217, 58,127,134,227,253,
+ 3,202,202, 49,154,140,137, 84,130, 23, 21,249,108, 78,182,174,240,133,102, 52, 25, 50,172,230, 8, 39, 89, 95,233,227,242,140,
+170,178, 28,149, 7,236,205,135,100, 50,163,168, 74, 10,103, 2, 86,155, 6, 47, 60, 85,109, 25,153, 81,123,209, 21,156,238,247,
+ 72, 84, 66,213, 52, 28,149, 51,148,215,236, 76,231,244,163,140,181, 30,104, 17,113, 56,159,160, 69, 28, 96, 65,102, 70,170, 18,
+188,144,173,248, 14,238,220, 24,160,222,241,178,211,239, 59,115,122,155, 65, 55,229,175,158,124,142,207,237, 15, 89, 83,138,251,
+207,172, 81, 57,201,106,191, 75, 51,159,147, 31, 28, 45,131,194,150, 43, 90, 44,211,151, 79,200,178,237,173,219,121, 88,187,255,
+229,124,224,153, 33,231,187,130,103,118,135,188,180,127,204, 35,179, 29,182,175,125, 25,135, 68, 88,207,224,155, 94,203,255,176,
+171, 24, 63,247,117,110,219,121,134,189,233,132,104,109,147,157, 89,197, 74,191,199, 61,219,171, 92, 58,181,194,165,205, 1, 15,
+156, 94,227,225, 75,103, 72,234, 33,117, 62,100,101, 48, 8, 2, 15, 33,104,170,146,178,106, 16,206,163,188,131,186, 9,115, 59,
+ 88,122,158, 77, 19,216,233, 18,143, 86, 17,107,171, 61,206,157, 94,227,244, 74,135,245, 68,161, 27,195, 56,175,153, 3, 29, 45,
+233,105,201,184, 52,252,230,231,158, 99,247,120,196, 91,238, 61,207,164,168, 9, 38, 35,219,146,139, 78, 2, 90,228, 2, 3, 43,
+229,137,176,199, 59,104,154, 16,141,110,220,210, 59,233, 26,131,214, 26,209,250,232,165, 86,193, 74,227, 66, 43, 95,223, 74,210,
+194,163,180,250, 70, 47,177,247,204,199, 19,240, 5,163,227,171, 72, 17, 2, 33,108, 99, 65,171,165,106, 28, 1,174,110, 78, 34,
+ 47, 91, 17, 83, 80,226,134, 47, 83, 63,139,249,200,151, 94, 36,211, 10,169, 90,146, 87,251, 58, 11,107,145, 16, 2, 45, 52, 15,
+175,167, 12, 18,205, 90, 22,113,182,151, 6,230, 71,221,144, 70, 26,173, 36, 90,171, 54,186, 55, 0,102,156,181,248,198,134, 56,
+ 90,235,176,110,145,186, 6,166,170, 49,206,227, 27,139,177,134,170,170, 40,203,154,162, 40,153, 23, 37,101, 17, 66, 35,106, 99,
+ 41,170,154,225,116,206,147,215, 15,248,237,207, 61,197, 95, 61,183,195,172,170,201,226,136, 88, 5,120,135,117,240,222,179,154,
+ 76,130,214,242, 36, 32, 28,240,173,222,193,138,240,247,181,214, 47,219,195,139,239,178,243,193, 77,112, 62, 50, 60,103, 51,172,
+ 11, 80, 36, 5,120,111, 73,149,194,123,207,193,120,142,181,150,188,108,176,206, 49,154, 87, 92, 88,239, 81,153,160,242,118,173,
+ 7,212, 24, 67,154, 40,226, 56,162, 40, 10, 34,173, 66,104, 17, 80,213, 13,206, 7, 22, 65,109, 2,227,189,117, 37, 6,139,165,
+115,225,178,167, 21,117,211, 32,132,103,144,116, 89, 77, 58,188,226,129, 7,120,228,251,222,192,250,118, 2, 2,158,253,223,126,
+129,252,230,243,203, 51, 51, 28,208,225,247, 81,203, 17, 3,203,207, 20, 23, 32, 25,126,249,179,126,121,192,123, 43,194,154,241,
+254,196,151,126,130,114, 71,222, 10,128,243, 39, 57,216,170, 93,243, 11,229, 60,237, 76,125,153,139,189,248, 28,236, 55, 42,224,
+189, 59,201,195,110, 49, 12,225,192,111, 78,218,247,139,215,114, 30,186,119,220, 75,255,222, 7, 17,102,142,175, 10,108, 85, 97,
+170,130,166, 40,176,182, 14,109,103, 3,229,228,144,122, 54,195,202, 4,157,246, 56,124,225,235, 60,243, 87,127,206,252,240,144,
+249,104,136, 4,250, 29,197,217,179, 25,107, 43,138, 44, 19, 68, 90, 32,133,110,137,141,224,156, 14,126,246,218, 18,175, 12, 48,
+101, 73,210,139, 73, 6,221,214,150, 25,230,193, 90, 75,178,126,130,212, 17,211,131, 41,120,200,186, 49,117,105, 66,124,116, 28,
+147, 68, 96,171,146,233,216,144, 31,239,210, 63,125, 26, 41, 90,135, 71,148,224,165,196,215, 21, 58,206, 66,122,153,142,112,206,
+162,226, 4,172, 65,199, 25,222,134, 11,175,140,123,140,119,119,185,246,228,227, 12, 58,154,193,230, 38,135, 55,110,114,227,230,
+ 17, 55, 14,167,188,112, 52,227, 96, 94, 49,171, 45,123,243,146,113,105, 40,141,197,180,151,116, 99,109,160,119, 6,145, 11,181,
+179, 40, 41,241, 94,208, 88, 71, 39,137, 88,237, 36, 40, 33,169, 77,232,160, 37,113, 4,243, 99,100,127, 64, 28, 71,212,214, 82,
+214, 51,168,115,182,215, 87,216, 59, 58,100,115,125,192,254,241,152,170,246,116,211,136,201,112,143,157,253, 3,180, 52,156,219,
+222, 96, 56,157, 50,158, 85,244, 98,205,230,170,226,237,223,247,247,168, 26,201,245,155, 59,236, 28,231,124,215, 27,223,194, 87,
+ 63,251,103, 92,236,119, 89,143, 37,171,189, 20, 29,105,180,247,108,158,217, 68,119, 7,248,221, 33,167,222,240,157,188,120,117,
+140,144,112,115,239, 38, 43, 89,196,254,222, 14,171,157, 20,109,115, 98, 29,209,235,245, 56,181, 30, 35,189,103,181,167,153,161,
+120,249, 59,254, 22, 47,252,222, 7,131, 2, 94, 90, 82,239, 22,174, 74,142,163,117, 78,223,118, 27, 85, 61, 99, 54, 42,168,108,
+ 73,154, 38, 12, 71, 67,226,158, 39,138, 18,154,178,102, 56, 30,179,186,217, 97, 58, 44,241, 77,132,143,107,170,194, 97,156,160,
+147, 36,236, 21,199,220,121,231, 22,199,163, 10,239, 36,133,157, 97, 81,164, 58, 65, 8,137,206,102,100, 73,204,225,100,200,126,
+121,128,150, 17,131, 56, 99,173,155,209,233, 6,157,205,184,204, 41,155, 2, 41, 52,206, 91, 6,137, 36,209,130,227,162,192, 88,
+219,142,188, 45, 18,205, 86, 47, 35,146, 26,111, 21, 86, 52,204, 75,208, 85,210,225,153,155,135,108,108, 12,216,153,228,212,214,
+243,210,164, 96, 52, 47,121,106,255, 25,148, 82,108,221,119, 31,199,207, 60, 19,132, 70,183, 36, 48, 45,111,241,136,147, 22,253,
+130, 26,229,224,175,229, 6,159,249,250, 23,137,210,138,239,136, 75,214, 34,255, 13, 49,163,151,126,224,111,241,159,191,240, 28,
+159,252,242,215,248,240, 29, 49, 10,199,157,179, 29,110,228, 67,234, 83,151,217, 94, 27,112,126,165,199,122, 26,177, 50, 57,194,
+124,226,147,152, 50,167,115,241, 34,245,197, 75,124,255,175,125,136,126,172,121,213,109, 91,188,233,254, 75, 92,222, 90, 67, 71,
+146, 44,137,192,123,140,113, 20, 77,168, 72,105, 43, 23,225, 91,176,137, 11,106,106,103, 29,157, 36,230,210,217, 45, 46,108,175,
+241,173,211,130,159,250,227, 47,177,145,106, 12,225, 0, 88,137, 20,143,190,120,204, 95,255,214,163,124,248,157,175,194,233,240,
+133,215,145, 11, 2, 18,123,114,152,139,182,177, 37,151,241,145, 44,209,167, 90,122,106,239,177,141,197, 9,133, 49, 37,198,216,
+ 80,173,107, 21,152,203,197, 28,111, 67, 16, 73,148,132, 10, 59, 4,108,132, 67,223,122,143, 45,231,228,243,130,186,170,112,245,
+ 14, 90, 36, 32, 61, 90,197,161,157,105, 67,224, 11, 4,193, 18, 74,133,249,160,103,233,163,199, 75, 36,150, 88,192,213,163,233,
+ 73,186,150,151, 24,104, 85,208, 98,137, 35,137,148, 32, 85,154,215,220,113,138,162,177,100,113, 20,222, 19,158, 88,105,188,244,
+ 96, 29,166,106,176,141, 67,171,197,140,181, 85,236,123,217, 86,228,150,198,186,165, 72,174,106,106,154, 42, 8, 62, 68, 27, 49,
+ 42,148, 8,155, 29, 81, 80,147,123, 79,164, 12, 23, 55,215,248,183,159,252, 58,171,169,102, 32,195, 88, 96, 97,153, 82, 66, 16,
+197,138,245, 88,225,112,212,141, 67, 70, 2,237, 85,232,168,180, 34, 66, 33, 5,214,123,164,110,201,104, 1,238, 30,148,216, 46,
+ 4,152,116,235, 25,119,235,148,167,125, 74, 89,214,116,180, 34,150,146, 94, 44,136,188,230,238,173, 62,166,169,201,171,134,198,
+ 52,100,113,151,235,135,199,156,223, 62,139, 55,150, 36, 86,164, 89, 76, 83,215,225,194,105, 13,105,150,210,212,205, 50,253, 80,
+ 9,137,214, 34, 96, 60,105, 72,163,136,121, 85, 83,153, 6,235, 53, 37,150,110,146,224,157, 35,214, 49,175,184,243, 97,190,237,
+117,111,228,117,111,248, 22,146, 21, 77, 83,148,204, 84, 77,210, 84, 28,126,246,163, 45,245,241, 22,107, 90, 59,192,182, 45, 97,
+144,101,164, 67, 96, 1,208, 70,135, 10, 68, 64, 40, 59,183,172,200,157,240,203, 52, 53,121, 75, 4,107,235,186, 97,241,148,246,
+150,214,188, 17,254,196,234,182, 24,191, 44, 42,117, 1, 77,221,114, 1,190,129, 43,223,210, 8,219,199,120, 31,198, 14, 65,112,
+218,238, 53, 46,164,196, 73, 5, 42,237,130,200, 0,141,183, 5,214, 26, 92, 99,104,230,163,208, 37, 52,130,114, 54,165,154, 77,
+208, 73, 15,209, 84,204,255,127,198,222, 51,198,178, 52,189,239,251,189,225,132, 27, 43, 87,117,117,156,153,157,176, 51,228, 70,
+114,185, 32,119, 73,237,146, 10, 54, 73, 16,150, 41,138, 38, 8, 75,176, 44,128,176, 45,152, 95,228, 15,134,236, 47, 14,132,224,
+ 4,138,146, 41,201,166, 1, 38, 88, 6, 37, 80, 98, 16,204,180, 36,119,185, 75,114, 3,185,105,118,114,232,158, 14, 85, 93,249,
+166,115,207, 57,111,242,135,247,189, 97,150, 48,236, 30, 96,186, 81,221, 85,117,235,158,115,222,231,121,254,207, 63,140,231,156,
+125,249,139,156,189,249, 38, 90, 40,100, 30, 53,192,189, 50,122,203, 95, 93, 76,209, 69, 39, 6,156, 76,106,242, 1,100, 10, 76,
+ 29, 80,170,193, 26,152,207,230,108,170, 28,215, 66,125, 57,167, 28, 6,132,131, 16, 36,189, 65,142,169, 45,161,245,180,141,161,
+110, 3,189, 66,115, 53,242, 88, 39,153,207,107, 70,213,148, 96, 49,152, 36, 0, 0, 32, 0, 73, 68, 65, 84,178, 44, 33,128, 6,
+154,139, 43, 94,253,157,223,225,230, 7,158,103,120,227, 73,122, 91, 57,152, 22,153,119,240,206,160,179,156,224, 13, 82,119,112,
+198,197,100, 56, 51,143,103,172,212,248,118,134, 8,150,147,135, 39, 28,126,228, 91, 40, 50,197,239,126,238, 27, 60,106, 98, 99,
+104, 66,252,125,230, 29,185,202,232,228,209,231,162, 50, 81, 37,147, 73, 13, 66,144,105,137,150, 26, 45, 5,211,214,224,129, 77,
+ 85, 82,230,154, 78,166,201,179,140,190, 53,137,228,107,113,121, 73,247,226, 62,199,189, 27,152, 16, 48, 22,182,250, 37,168,104,
+188, 51,157,205,209, 4, 58,133,224,248,232, 46,103, 23, 99, 62,244,236, 13,246,246,250, 84, 77,205,238,193, 30, 15,143, 78, 49,
+141, 33, 47, 58,228,121,203, 39, 62,250,126,254,202,199,190,147, 63,127,241, 21,142,143,207,185,211,209,116,132,199,181, 30,223,
+ 56,124, 38, 17,153,198, 77,231,132,254, 12,217,235, 70, 95,143, 0,151,163, 41,211,185, 97,124, 81,113,239,254, 49, 95,121,249,
+ 1, 91, 91,219,252,149, 79,124, 23, 27, 5,152, 22, 90,111,120,116, 50,229,246,193, 6, 87,253, 62, 31,248,201,127,192,151,127,
+250,191,199,165,227,205, 6,208, 66,243, 83,159,254, 93,254,229, 7, 63,201,219, 47,191,193,193,205, 91,140, 46,198,212, 77, 69,
+ 87,111, 83,208,229,244,244, 8,219,194,222,206, 22,247,222, 60, 65, 40,199,233,116,204,118,103,200,230,102,143,250,212,208,248,
+ 25,130,154, 55, 31,188,193,216, 7, 14,251, 7,204,236, 12, 41,114,230,182, 66,235,128,240, 37,143, 70,231, 56, 15,154, 12, 21,
+ 36,141,109,217,144,154,249, 60, 32,136, 50,233, 92,101, 20, 42, 71, 16, 19, 34,223, 30,157, 33, 4,116,101, 73, 47, 69,242,206,
+109, 77,213, 56,118, 7, 25, 77,235, 49,198,147,103,160,127,238, 51, 47,242, 83, 63,250,239, 32,148,226,112,208,103,167, 51,166,
+ 65,240, 91,223,120,135, 31,255,203,223,197,191,253,163, 63,227, 71, 63,249, 97, 42,183, 92,181, 46,137, 51, 36,105,208,210, 23,
+101,241,144, 91,207,240,217,231,248,244,139,175,243, 83, 59,147, 4, 73, 67,147, 32, 78,137,162,119,109,143,119,190,242, 53, 62,
+ 52, 40,249,169, 59, 3,138,155, 55,104,239,191, 65, 0,110,216, 57,215, 31,189, 4, 15,211, 33, 4,204,211,132,233, 29,132,183,
+238, 17,222,184,203,158, 82,140,157,231,183, 94,121,192,191,122,241,254,146, 86,179, 85,104, 10, 37,248,192,225, 38, 47, 28,108,
+242, 29, 79, 92,163, 95,228,116,202, 12, 21, 52, 99,219,208, 54, 6,188, 67, 46,116,224, 33,122,114,239,110,246,150,208,159, 64,
+ 96, 67, 52,209, 40,149,192, 35,248,137, 95,251, 50,255,221,119, 63, 77,111,216,167,231, 59, 75, 31, 77,111,147,255,186,140,134,
+ 22, 34, 37, 84, 41,169,162,213,110, 34, 20,134,214,198,108, 99, 29, 13,113,250,131, 33,117, 53, 37,184,150,121, 93, 83,118,250,
+204,171, 41,214,212,136, 76,209, 41, 59,232, 34, 67,201,140,166,154,226,133, 98,107, 48, 96, 58, 57,167,163,107,122,221, 97,154,
+192, 3, 14,207,172,137,246,143,190,170,227,100,152,103,177, 64, 10,145,244,186,177,248,122, 31,137, 56, 27,253, 30,191,241,135,
+ 95,163,151,165,168, 74,191,130,223,150, 80,170,140, 48,118,235, 60,215,247,119,152,183, 22, 37,245, 18, 86, 95, 28,210,113,255,
+158, 26,166, 32, 81, 11,221,191, 90,145,232,252, 34,130,214, 5,164, 8,116,242,146, 94, 25, 63,110, 83, 1,208, 82, 46,227, 21,
+189,139,164,187,188, 44,249,227, 55, 30, 44,229, 86, 97, 57, 5,198,198, 75, 34,216, 43, 20,222,184,232,175,173, 5,194, 11,188,
+ 12,132, 54,160, 11,181,220,253, 74,145, 24, 89, 74,196,200, 96, 45, 86,177,142, 38,190,206, 15,203, 83,102,157, 59, 60,152,182,
+ 92,140, 3, 87, 34,208, 17, 27, 12, 59,154,107, 27, 5, 23,211,146,203,241,140,169, 16, 12,123, 3,142, 46,207,121,242,154,167,
+241,158,100,178, 71,145, 69,180,196,152, 24,185,218, 41,115,230,141,139, 70, 70, 74,161,165,100, 92,213,108,111,244, 24,205, 42,
+110, 31, 30,242,232,241, 9, 90, 70,232,125,107,235,144,167,111,189,159,253,193,144, 23, 94,120,158,155,215,247, 48,110,194,134,
+188, 67,222, 53, 20,206,114,244, 59,255, 50, 78,216, 42,196, 61,245,186,174, 92, 45,118,209,139,132,171, 68, 56, 12,139, 92, 0,
+191, 42,214, 11, 35,163,119,201,216, 22,156,131,149,227, 92,240, 41,145,109,137, 10,176,148,176,173,112,247, 85,147,239,151,134,
+112, 17, 29,201,178, 24,246, 18,117,248,169,145,244, 81, 46, 23, 29, 87, 5,214,166, 6,192, 38, 41,173, 76,177,173,245,140,249,
+189,175,224,235, 9,184,121,244,100,168,174, 16, 65,210,206,166, 52,117,154,110, 76, 75,109, 42,108, 40,184,184,255, 58,199, 47,
+125,131,126, 47, 71, 43,135,171, 91,202, 94,129,148, 57,179,139, 57,251,195,146,250,106,140, 14, 53,123,101, 73,115,117, 70,222,
+ 43, 35,148,111, 29, 50,120,230, 86,210,220,171,200,164, 66, 58,197,124, 30, 80, 2,154,198,113,117,217,198,128,167,243, 57, 69,
+167,196, 9,193,168,110, 56,191,170,105,173,195,122,199,238,176,192,155,134, 94, 55,227,106,220,240,250,209,132,219, 7,125,202,
+151, 94,197,163,144, 50, 39, 43, 52, 42, 19, 41, 82, 57,146, 75, 69, 30, 39,121,231,106,100,158, 19, 42, 19,209, 47,111,233, 12,
+ 6, 12,118,182,153, 94, 94, 97,174, 95,227,112,103,128, 25,213, 52,198, 49, 49,150,218, 5,246,203, 18,143,136, 80,123, 0, 41,
+212,114, 45,162, 51,193, 86,191,207,172,110, 56,158, 84, 20, 74,211, 43,115,106,103,176,206, 51,246, 13,147,209,132,126,158,163,
+148, 36,211,154, 97,161, 9,206,115,125,144, 51,170, 13,151,109,195,188,201,152, 28, 95,209, 41, 11,174, 46,175,200,139, 30, 82,
+ 79,121,234,230, 13,170,214, 49,170, 45,123, 10,118,134, 57,165, 86,220, 57,220,230,114, 60, 3, 17,152, 91,207,236,178,198, 52,
+ 35, 58,189, 33,207, 62,123,131, 63,253, 12,108,119, 10, 74, 2,173,117, 20, 78,163, 92, 92,185,137,198, 32, 58, 37, 8, 73,219,
+ 90, 76,109,121,227,209,140,251,175,189,130, 55,151,216,186,230,224,233, 59,108,170,138, 65,103, 11,235, 12,123, 91, 61,130, 82,
+ 76,230, 13,179, 22, 94,248,196, 95,230,203,255,244,127,193, 87,213,242,254,181, 24,156,135, 95,254,195, 95,224,199, 62,241,183,
+248,202, 87,254,140,178,200,217, 63,216,231,232,222, 25, 35,123,193, 86,119,155,251,151,199,100,189,156,126,217,197, 4, 79,107,
+102,248, 60,112,122,117,193,185,157,112,189,123, 8,149,230,106,100,152,217, 41,247,253, 17,221,188,135,214, 30,193,144,139,217,
+ 57,175,158,127,157,219,189,167,232,103,201, 91, 3, 79,161, 50, 94,122,124,143,110, 54,160,163, 21,115, 87,179, 87,238, 48,109,
+199, 12,203, 30,243, 6,114,169,232,170, 14,165, 46, 40,114, 79, 33, 20,231,205,148, 78, 40,208,114,147, 11,123,197, 97,103, 31,
+ 23, 26,244,199,159, 60,224,236,242, 10,239,174,241,141,243, 49,231,115,131, 2, 62,121,103,135, 87,239, 31, 49,113,150,135, 15,
+207,169, 2,204,109,146, 0,173,217,142, 71, 50,212, 34, 54, 47,186,174, 73,173,185,175, 55,121,120,122,202,249,208, 47, 55,117,
+113,197, 28,232, 12, 59, 92, 77, 42,182,103, 45, 97,119,147,239,254,200,211, 76,103,134,226,253, 31,226,254,203, 47,211,206, 42,
+ 82,204,114,244, 91,111,109,108, 34,218,248,128, 11, 31,167,238,109, 5, 39,109,116, 65,218, 92, 60,248,137, 8, 53,247,129,223,
+127,235,148,223,126,243, 20,254,248,245, 72,210, 2, 14,251, 5,127,253,153, 61,190,247,185,219,232, 82, 71, 91,210,228,183, 94,
+100,138,174, 82,244,243, 56, 29,250, 0,150,176,204,227,149, 4,166, 14,254,203,207,190,201, 47,254,240, 71, 24,205, 42,116,166,
+ 80, 82,147,134, 95,132,147, 75, 94,129,148, 10,169, 2, 34,203,144, 34, 32,132,164, 44, 52, 54, 33, 5,101,145, 33,125,195,112,
+ 56,192, 57, 67,145,119,144, 42, 68, 35, 27,107,240, 77,197, 85, 53,161,219, 27,226, 77, 67,183,211,229,226,106,196,127,241,139,
+191,202,171,231,147,248, 51, 9,216, 40, 52,251,189,146,103,118,135,124,252, 61,135,236,109,246,217, 26,246,201,148, 68, 38,104,
+223,185,168, 19,175,109, 74,201, 74, 63,159, 0,222, 56,159, 80,234, 8, 45,187, 36,113,146,114,117,112,139, 4, 81, 91, 23,184,
+172, 44,131,110,134, 32,114, 4, 98, 72, 68, 72,159,235, 8, 54, 26,222, 40, 25,187,233,152,152, 20, 8, 54,162, 12, 33,196, 41,
+ 39,134,184,136,101,178,156, 82,113, 15,239,146,166,125, 1,225, 7, 21,141,142,122,121,135,127,241,213,183, 25,230, 49,229,205,
+133, 16,217,187, 41, 76, 68, 74,120,111,145,226,103, 67,252,249,156,243, 72, 98, 67,227,189,143, 19,159, 20,160, 3,194,199,160,
+ 14, 41, 37,206,196, 85,132,179, 81,225, 33,210,122,251,123,196, 17,191,162,247,160, 53,209,135,222, 25,240,146, 97,145,113,107,
+216,227,168, 59,101, 82, 53, 40,225, 25,148, 5,151,227,105,242,140,119, 4, 33,177, 46,250,251,187, 0,219,131, 14,117,237,168,
+154,154, 66, 65, 46, 53, 38,120,122,157, 46,179,105,205,147,215,159,230,124,116,198,118,255,128,110,145,211,235,245,217, 26,236,
+240,236, 19,183,184,121,176,203,173, 59,135,108,237,247, 24,118, 54,217,217,183,204,231, 21,133,128,187,191,252, 63, 71, 95,130,
+ 69, 71,155,158,143,165, 42, 81, 71, 82,218, 10,119, 73, 10, 5,239,211, 20, 29,145, 14,145, 24, 68, 33,136,213, 84,239, 87,147,
+185, 8, 43, 7, 64,155,144,249,133, 51,160, 84,105,109,144,234,191, 82, 97, 17, 58,152,154,189,152, 75, 40, 69,160, 49, 97,137,
+154, 57, 27, 63, 55, 36, 4, 48, 57,236, 46, 19, 84,149,142, 67, 96, 76, 50, 76, 19,255,204,129,200,192, 55,120, 51,197, 25, 67,
+ 83,141,104,235, 22,111, 90,230,163, 75,130, 26, 82,238,223,228, 51, 63,255,243,248,227,123, 92, 43, 61, 91, 58,163,110,106,178,
+ 96, 80, 87,115,144,134,173,224, 81, 35, 65,185,216, 31,214, 45, 93, 13,180, 45, 42, 64, 39,139,207,113, 71,186, 20, 61,237,216,
+ 85,177,200,138, 0, 20,158,186, 5,131, 68,236,120, 26,107,104,230, 1,183,217,227,230,126,135, 76, 9, 76, 20,203,112,122,210,
+208,214, 53, 85,235, 65, 42, 30, 93, 54,212,174, 98,243,236,203,220,120,230,136, 27,239,251, 16,253,162, 76,228,218, 16,145, 54,
+239, 9,182, 69, 21,121,228,182,200,144,120, 65, 14,221,221,196,215, 21,146, 14,163,211, 83,180, 80,228, 90,225, 61, 12,181, 64,
+155, 64,109, 61, 82, 75,186, 42,174, 17, 42, 99,201,181,102,103,216, 39,211,146,119,206, 46, 57,175, 26, 60,208,235, 20, 40, 1,
+165,212, 52,196, 51,113,163,204, 41,180, 78, 22,200,241,222,200,242, 28, 49, 62, 39,219,186,201,205,110, 75,107, 97,236, 36, 42,
+215, 20, 89, 70,219,204,168,102,158, 87,222,124,132,199, 48,175, 20,111,189,115,194, 19, 55,110,209,217,241, 4,165, 40,202, 30,
+135, 91, 29, 26, 7, 15, 78, 4, 13, 57,253,174,160,223,237, 50, 28,116, 41,164,162, 80, 1,229, 2,166,106,144,133, 38, 43, 53,
+ 97,102, 40,222,251, 28,147, 81,195,217,168,166,154, 92,114,118,113, 74,183,107, 25,159,143,216,234,151,200, 96, 80,120, 50,237,
+113, 6,102,227, 10, 93,104,118,119,123,145, 44,236, 37, 31,250,207,254, 62, 95,248, 31,255,155, 72, 34, 77,125,232,123,202,130,
+127,246,165, 63,231,111,124,252,251,185,118,120,192,213,213,152,199,199, 71,168, 60,199,212, 45,199,211, 83,114, 85,226,108,205,
+227,217, 21,219,221, 14, 79,238,236,240,198,217, 99,164, 44, 56,232,110,240,120,122,204, 70,103, 72,225, 2, 90,149, 92,213, 21,
+186,212,132,144, 97,204,156, 65,161,233,214, 61, 6,185, 70,101,158,110, 54,224,104,122,193,173, 97,206,101,221,163,167, 51,114,
+153,225,149, 71, 98, 24,228, 69,228,111, 17,200,101, 70,169, 36,131,142, 39,151,154,135,227, 17, 90, 68,159,255, 71,151, 19,114,
+169,177, 97, 70, 38, 75,244, 78,175,207,193,181,107,252,227,127,243, 41, 6,133, 96, 43, 83, 52,214,243,184, 17, 60,165,115, 62,
+241,225,247,243,226,231, 62,139,180, 44,189,201,125, 8, 81,115, 41, 67, 60, 27, 76,124,128, 77,128, 66, 56,254,198,223,253, 17,
+ 70, 95,125,137, 79,124,242, 54,199,243, 3,142,206,175, 24,108, 14,184,254,220, 83, 28, 8, 75,171,186,100,155,123,252,210, 63,
+249,231,124, 84, 43,132,243,184, 60,167, 23,106,158,120,239,211, 75, 40,120,120,243, 26,191,252,171,159,227,227, 31,250, 48, 95,
+255,226,231,145, 2, 84,202, 66,151,192,199,114,207, 43,141, 88,134,160,248, 37, 73, 39, 22,143, 92, 10,242,181, 32,168, 16, 2,
+ 15,167, 13, 63,243,229, 7,252,204,151, 31,240, 19, 47, 28,240,253,223,122,135,121, 99,200,180,166,204, 20, 66, 36, 23, 57,151,
+108, 46,223,237,191, 17, 53,209,214,243, 3,255,231,159,240,111,126,244,163,244,178, 12, 27, 92,218, 9, 10,132,136,187,111,161,
+ 98,168,130, 13, 2, 23,162, 91, 26, 50, 18,180,202, 76, 97,172,197,154,150,217,188, 66,138, 10,149,201,232, 72,214,122,138, 60,
+103,208, 45,144,178,160,109, 45,243,209, 5,156, 60,230, 51,175,188,201, 63,188, 95, 49,204, 37, 27,185, 90,238, 44,141,247,220,
+ 27,205,120,245, 98,202,175,191,250,232,155, 52,230,138, 92, 41,158,223, 29,240,220,181, 77, 62,254,212, 33, 91,219, 27, 24,153,
+ 17,106,147,148, 12, 62, 38,170, 45,172, 57,137,123, 97, 23, 22, 44,228,216,144,117,181,224,127,253,131, 23,249,169,127,239,163,
+156,141,167,209, 19, 63,133,111, 68,105,146,194,137,136,199, 70, 67,146,248, 96,197, 41,221, 39, 34,161,136,147, 59, 2,161,228,
+178, 9, 11, 8,124,146,220, 44, 24, 88, 62, 56,164, 44, 24,246, 11,254,236,222,163,168,147, 94,196, 1, 39, 46, 71, 36,244, 8,
+122, 90,241,124, 87, 36,147,164,232,219, 46, 23,190,207, 58, 78,135, 50, 21,155,104, 77,224, 35,107,216,249,104,118,146,194, 99,
+228, 66,228, 33, 4,189,219, 79,240,239,254,249,203,252,250,240, 54,210, 24,142, 47, 43,122, 90,178,211, 41,144, 67,199,197,222,
+128,171,170,193,121, 73,169, 51, 26,211,198,125,163, 15,200, 96,240, 66, 98,210,168, 42, 5, 20,153,160,200, 98,142,183, 84, 34,
+238,141, 69, 96,119,123,139,139,241, 21, 79,221,124,129, 7,231, 21,251,251, 59,104,225, 24, 12, 55,217,221,223,161, 59, 24,114,
+176,155, 51,232, 14, 25, 94,147,204, 47,198,200,174,231,141,127,241, 51,145, 8,183,220,111, 7,132, 93, 16,225,226,234,229, 93,
+ 94,234, 33,238,175,227, 30, 61, 69,152,134,176,102,247, 42,214,164,110, 43, 13,185,124,215, 14,124, 97,126,180,246, 76,172, 37,
+173, 5, 34, 43,158,212, 24, 70,136, 63, 90,193,134, 16, 61,228, 67,186,159,130,128, 96,211,215,138,181, 46,249, 19,196,201,221,
+154,200, 39, 83, 33,250, 11,196,191,148, 4,107,161,157, 99,167, 99,124,107,177,243, 6, 91,215,180,179,105,204, 58,232, 12,249,
+244, 47,254, 50,217,213, 49,223, 58,152,196,198,101, 60,141,197, 91,130,200, 98,216, 17, 90, 98, 76, 68, 5, 98, 51,146,116,251,
+137,219,176,104,150, 22,206,120,113, 75,225,215,108,241, 5,185, 14,228,137, 40,176,171, 5,147,155,183,120,243,254, 25, 18,131,
+207, 37,214,120,156, 20,156,143, 90,174, 90,143,117, 2, 21, 34, 87, 98,103,187, 71, 57,232,113,122, 60,163, 24,188,141,200, 11,
+134, 59,187,132,224, 16, 42,143, 77,104, 46, 9,198, 18,156, 65,138, 16,109,184,123, 3,236,124, 78,127,107, 64, 38, 3,243,217,
+140,218, 58,246, 54,186,100,121, 78,221, 24, 38,181, 89, 94, 83,227, 19,129,222, 7,178, 60,163,219,237,128,210,228, 74,113,163,
+ 53,209, 9, 79,169, 24, 17, 12, 84, 77, 75,109, 93,242,188,144, 12,180, 66,167, 6, 80,105, 73, 41, 3, 46, 11,156, 95, 25,106,
+ 99,233,150, 29,166,117,139,111, 44, 27,195, 46, 77,219,240,204,147,251,156,158, 92,209, 56, 79,230, 21, 1,199,241,197,148, 97,
+167,160,223,203,113,120, 30,157, 53,204,106, 65,167,219,167, 91, 72,166,179, 49,147,121,197, 86,209,163,200, 21,193, 5,118,186,
+ 61,118, 95,184, 67,214,217,160,208, 61,228,238, 22,223,120,253,146, 94,230, 49, 74, 82, 29,191,193,241,201,107, 28,238,238,144,
+ 23, 25, 55,183, 10, 10, 37,169,166, 83, 26, 11,206,100, 20, 54,199,247, 51,156, 53, 76, 38,129,195, 15,126,219, 18,177, 90, 72,
+ 45,159,208,134,175,170,130,191,251,191,255, 35,254,241,143,252, 61,238,142, 47,200,116, 78, 85, 89, 6,131, 46, 94,102,156,159,
+ 92, 50,169, 12,131, 28, 46,231,134,142,174,177, 4,250, 82,224,131,229,172,154,128,147,140,204,156,218,215, 88,103,226, 46,222,
+205, 9, 65, 50,171, 27,118,179, 33, 71,213, 49,133, 84,220,222,220, 66,166,243,123,144,119, 0,207,245, 93,205,209, 69, 14, 78,
+112, 92, 95,162, 5, 40, 20,187,157, 1, 85, 91, 99,140,226,168,185, 98,160, 59, 84,205,140, 27,189, 45,242, 44,227,222,165, 97,
+208,201,105,141, 71,119,132,229,242,193,219, 60,189, 81, 80,202,125,222,183,215,231, 98,214,240,225,155,219, 60,185, 59,100,124,
+244,128, 34, 88,198, 11, 15,104,214,117,164,177,176, 19, 4,173,143,109,207,214,238, 22,125,209,208,249,192,211,144,229,108, 74,
+201,243, 69, 1, 90,227,172, 99,126,255,156,199,175,190,202,141,239,216, 97,112,243, 22,191,246,230, 59,104, 15,223,123,176,201,
+145,202,232,110,148,232, 60,231,205,139, 25,213,189, 83,126,240,125,135,252,254, 27, 15,121,230,219, 63,194, 31,254,233, 23, 48,
+ 46, 78,204, 66, 64,129,163, 43, 53,149, 95,249, 81, 47,109,126,215,236, 46,229,162,224, 11, 65, 38, 23, 5, 7,190,114,217, 32,
+191,241,144, 31,248,200,243,252,225,215,223, 98,100, 26,254,234,115,183,150,187, 61, 23,194,242,162,175,162, 46,226,231,239,228,
+154,191,249, 43, 95,164,159, 9, 42, 23, 73,115, 54,188,219,180,197, 3,255,219,181,140,162,208,209,117,174,219, 65,117, 10,178,
+110, 23, 61,232,147, 23, 25,253,188, 36,151,150,151, 46, 26, 90, 23, 53,241,247, 70, 51, 62,253,230, 17,199,211,154,202, 4, 62,
+214, 21,252,205, 13,216, 11,176,145,107,220,194, 23, 61,125, 15,153,138, 92, 39, 25,116, 44, 62,102, 3, 24,231,105,172,231,115,
+247,207,249,236,253,115,254,143, 47,190, 73, 33,225,187,111,108,242,125,207,220, 96,119,107,128, 73,185,237,139,139,235,136,144,
+183,100,193,126, 15,100,233,189, 56,153,205,121,233,193, 9,207, 28,110,209,186, 16,175, 5, 2,239, 18,166, 26, 34,178,177,176,
+ 14, 85, 16,215, 17, 90, 69, 56, 62, 77,230, 54, 56,100,154,212,145,130,186,141,144,161, 34,160, 69,108,174,130, 3,113,239,117,
+234,203, 49, 63,123,119,198, 48,139,254,231,137,194,144,118,211,130, 28, 65, 38, 21,251, 68,247, 58, 37, 3,198, 64,150, 69,126,
+135, 49,209,235, 31, 4, 74, 69,175, 5, 73,188,198,107, 33, 97, 32, 2, 54, 77,233,229,225, 77, 46, 79,207,105,166, 45,223, 85,
+156,242,105,177, 65,222, 52, 52,117,134,151,129, 94, 33,185,179,217,225,248,178,195,212,150,156, 92, 94,146,101, 29,130,143,105,
+128,181,141,137,132,222, 47,140,236, 60,247, 38, 13,193,218,232,129, 96, 28,185,138,154,128,203,217,140, 82, 41,154,160,216,221,
+ 26, 80,148, 93,158,218,221, 98,115,103,147,155,123,219,108,110,118, 17,193,163,132, 66,183,115,102,174, 65,190,252, 58,143, 63,
+243, 27,137, 39,145, 28,220, 18,210, 16,156, 79,206,121, 97, 89,132, 73, 50, 62,111, 83,144,138, 19,203,160,181,133,219,223,242,
+ 57, 89, 16,102, 18, 95,193,165, 68, 53,181,240, 17, 88, 16,235, 22,140,120,183,198,190, 88, 51,169,114,206, 35,149, 76, 95, 70,
+ 36,143,119,177, 10,133, 89,172, 79,210,173,231, 12,132, 4,201,167,237, 8, 88,176,137,239, 32,157,160,122,240, 70, 76, 79, 51,
+ 45, 88,131,171,167,216,121,133,157, 87,113,199,159,111,242,246,151,254,132,243, 7, 71,124,104, 27, 92,155,130,145, 68,140,196,
+245, 62,114, 41, 22,238,119, 90,137,132,196, 69,216, 31, 9, 50,136,196, 59, 16,233,117, 36, 50,223,178,203, 93, 52, 62, 34,161,
+113,130,157, 23,174,211,182,125, 30,156, 84, 96, 90, 92,153, 45, 3, 85,155,185, 71,105, 73,110, 64, 43,207,176, 83,146,119,114,
+242,188,164, 40,186,140, 47,198, 60,120,229, 33,198, 8,204,211, 13,219,215,111,197,235,102, 91,112, 38,250,197,203, 2, 65, 75,
+230, 90,130, 15,212,163, 75,154,113,197,222,243,207, 51,185,156,178,183, 51,196, 65,244,125,215,130, 65,174, 80, 89, 70,211, 90,
+122, 90, 99, 67, 96, 50,111, 40,116,204,119, 55,245, 28,132, 35,242,111, 5, 33, 56, 50, 41,217, 30, 14, 80, 90, 49,111,154, 72,
+168,243,158,198,218,229,110,197, 58,135,105, 44,123,237,152, 89,183, 79,215, 5,166,141,167,144,150,188,219, 35, 88,131,107, 26,
+222,124,251, 17, 69, 81, 46,239,195,106,222,144,229,138,199,151, 45,131, 78,193,131,218,210, 45, 58, 12, 6, 29,202, 76, 50,157,
+ 54,220,184,126,200,231, 47,106, 62,124, 35,103, 54,155,179, 49,236, 50, 40, 36,221,205, 33,202,130,191,115,192,222, 51, 31,229,
+143,127,239, 62,253,142,226,149,211, 11,218,233,155,220, 62,216,194,152,192,222,176,139, 48, 35, 6, 29, 65,211, 26, 70, 70,113,
+ 57,158,112,227,112,147,233,116, 70,161, 5,151, 99, 65,111,211, 83,110,237, 48, 59, 59, 95,214,179, 3, 29, 40,145,188, 51,155,
+242,104,250, 58,153,206, 80, 90, 33,179,138,217,220,208,216,192,188,109,216,217, 29,112,124, 60, 99, 30, 26,174,239, 13, 56,153,
+ 84,244, 59, 37,199,211, 41, 79,244, 15, 57,105,174, 40, 85,142, 15, 45,150,140, 81,117, 74,153,117, 80,100, 92, 27,244, 25,205,
+ 27,138,224,168, 92,197, 43,231,143, 81, 40,206,199, 51,180,204, 57,173, 79, 25, 63,152,178, 93,246,152,184, 57,153,210,104, 52,
+ 61,149, 49,107, 91,140,183, 40,171,233,208, 37,120,201,110,177,201,104, 62, 99, 58,109,145,228,156, 76, 91,110,246,247,209, 23,
+111,221,195,189,121,151,171, 0, 99, 34,220, 92, 0,231, 95, 31,241,226,215, 95, 66,231, 18,149, 11,122, 74,188, 43,129,105, 21,
+185, 25,161,181, 82, 11,164,131,231,118, 6, 28,125,230, 75,244, 14,118, 16, 59, 27,200, 34,135,209,132,233,163, 51,142,207,174,
+216,222, 57,224,252,238, 67, 58,252, 57, 31,123,223, 11,252,209,107,119,169, 28,124,237,157, 11, 14,180,228,147,147, 46,227,137,
+ 33,207, 37,131, 76,243,226,249,136,173,160, 57, 12,135,188, 60,143, 7,143, 92, 56,126, 6,248, 54,105,249, 90, 80,180, 74,160,
+124,192, 9,193,101,235, 16, 33,234,252,114, 33,151, 30,214, 90,172, 24,185,173,247,124,219,193, 54,167, 87, 99,158,187,115,141,
+ 31,253,133, 79, 49, 11,129, 65, 57,228,102,175,228,203,231, 83,186, 42,237, 2, 89,139, 56, 79,144,183,245,129,173, 66,113,213,
+ 24,132,140, 83, 73,182, 30,116, 1,236,107,193,253,214,163, 77, 74, 20,155, 38,107, 72, 41,144,233, 32,150, 2,126,107,236,248,
+253,234,221, 29, 65,169,162,212,108,187,212, 12, 10,129, 23,134, 34, 4,178, 68,238, 16, 9, 49,145, 41,105,140,176,242,233, 86,
+ 50,166,182, 73, 86,141,152,150,171, 84, 56, 7,252,222,253, 43,174, 55, 21,223, 51, 80,148, 34,162, 44, 50,133,170,196, 73, 56,
+ 68,169, 23, 43, 52, 64, 10,193,102, 39,231,167, 63,253, 10,191,240, 31,125,130,179,203, 73,156, 60,141, 69,248, 72,142,155,183,
+ 45, 34,229,195, 55,173,229,114, 86,227,130, 96,220,180,156,215,150, 73,221,114, 86, 71, 95,125, 2,156, 86, 13, 46,192,191, 63,
+204,185,233, 42,240, 96,189, 79, 18,202,168,167,254,111, 47, 2,189, 76,226, 72,211,102, 84,157, 71,102,177,140, 54,174, 93, 45,
+201,132,133, 0,173,245,100,153,194,217, 16,237,188,165, 72, 54,174,129, 5,183,223, 18, 15,218, 54, 77,162, 66,186,248, 94, 6,
+200,247,110, 70,171,216,227,115,178,157, 30,135,213,140, 27, 82,240, 80,150,140,167,154,173, 92, 35,133,103,168, 36,251,165,228,
+201,206, 22, 38, 28,243,178, 19,220,217,232,114,247,114, 10, 46,160,117, 32, 87,113,143,121, 49,107, 99,124,167,138,161, 22, 72,
+ 73,161, 37, 70,128,118,146,221,189,111, 97, 86,157,241, 45,239,121, 63,231,211,154,243,121, 77,175,169,232, 21,129, 44, 88,188,
+ 9,228,217,140,241,131,154, 66,156,242,226, 79,255,125,124,114,122,243, 11,162, 95,194,191, 23,211,179, 72,227,112, 32,128, 91,
+133,179, 96,150,115,120, 92, 19, 45, 27,225,149,118,121, 97,219,206, 90,170,154, 79,220,137,176,226, 39,190, 43,177, 45,176,144,
+175,145,252,250,227, 10, 2, 1,210,198, 85,140, 77,197, 58, 72,177,218,241,167,255, 9, 1, 65,250, 4,235, 11,236, 26,177, 78,
+ 74,176, 65,192,116, 14,174,194,215, 51,218,201,152,106,116,137,109, 26,234,217,148,144,245,169,199, 23, 28,221,125,135, 45,221,
+208,157, 94,224,228,194,178, 54, 16,212,130,105,159,154, 12, 23, 48, 65, 32, 67,114,122, 83, 34, 90, 6, 3,184,101, 96, 60,214,
+132,181,136,216,216, 32,121, 4, 69,158, 81,234,156, 92, 43,154, 90,241,218,163, 11,234,113, 69, 94,168,213,116,161, 36,158, 40,
+203,210, 82, 48,220,219,197, 52,142,157,189, 45,154,121, 67,145, 43,122,221,146,211,179, 17,211,175,204, 41,250, 93, 54,118,119,
+208, 89,137, 84, 42,162,133,206,198,247,190,109, 98, 56,140,241,200, 60,167, 74,249, 20,167,167, 23, 52,109,131,113,177, 57,207,
+133,164, 24,228, 72,149,211,237,248,168, 48, 9,176,187, 57,192, 11,133,113, 30, 95, 4, 26,227, 80, 58, 5,218, 68, 23,125,156,
+141, 42,149,110,174, 16, 34,167,181,134, 80, 69,238,145,150,130,178,236, 81,230, 57, 93, 5,199,231, 30, 43, 2,195, 66,225,101,
+134, 84,158,203,203,138,172,232, 96, 29,108,117, 58,220,185, 54,224,106,102,121,243,254, 99,158,189,181,135,243,129,199, 23, 53,
+253,178, 96, 82,213,108,109,244,217,232, 23,100, 66,242,214,203, 95,227,245, 54, 99,103, 88, 80,246, 74,134,133, 98,243, 96,139,
+ 50,239, 35, 59, 61, 54,159,121,138, 63,253,218,132, 78,238, 57,185,152,243,133, 63,249, 93,234,182,101, 39,203,216,236,150,108,
+119, 51,114, 33, 56, 61, 61,102,127,111,159, 78,107,216,222,202,145, 62,174, 69,242,126,129,198, 49,110, 4, 59, 47,188,159,249,
+ 31,253, 65,116,235,244,240, 76,222,112, 43,235, 81,200, 46,111,125,230,215,248,206, 31,252, 9, 94,124,233, 17,135, 55, 6,188,
+242,218, 9,189,162, 71,109,230,104,209,229,164,185,224,185,253,235, 60, 60,157, 80,102,154,147,217, 57,133,204,232,109, 25,122,
+167, 5,142,192,182, 30, 32,155, 49,149,179,140,234, 17,185,204,105, 92,195,118, 47,167,200,115,122, 77,206,189,233, 3,158,217,
+220,197, 57, 24,116, 13,143,166,145,143,101,156,165,106, 27,182,139, 30,221, 50,163, 54,241,243,174,102,138, 54,204,217, 27, 14,
+208, 58, 48,169,224,157,241, 21,183,123,251, 12, 59, 37, 51, 83, 99,228, 24,237,137, 19,237,150,128,203, 16, 15,114, 33, 96,228,
+161, 43, 98, 52,117,208,130, 66,197, 3,222,167, 98,146, 8,178, 75,157,171, 76,240,204,139,175, 63, 64, 7, 7,175,189,179,212,
+200, 46,136, 49,141, 9,184,215, 31, 51,243,160, 30,125,137, 66,194,237, 66, 97,124,136, 69, 37,192, 87,175,102, 52, 2,204,108,
+ 69,132, 2,193,139,159,251, 2,183,178, 85,140,179,247, 96, 5, 52, 30, 62,162, 29, 58, 49,205, 37, 48,216, 41, 99,150,176, 11,
+220,247,112,214, 88, 38, 65,240,168,106, 49, 46,158, 82, 91, 2,126,251,149,119,120,102,216,231,199,126,230, 95, 35, 9,244, 4,
+252,219, 23, 95,103, 67, 43,254,234,193, 6, 15,170,154, 71, 85, 75,161, 4,237, 98, 82, 17, 43,171, 43,227, 61,106,221,191, 90,
+172,161, 24, 34,240, 66, 38,120, 96,124,210,208, 39,107,204, 84,168, 72,251,230,223,156,122, 30, 59,232,232,149,142, 88,132, 88,
+168, 8, 49, 24,165,113,158,183,234, 24,237,121, 71,195,235,109,124,239,197,218, 33, 28,190, 73, 58,180,248,220,120,180, 70,233,
+218, 18, 84, 13,144, 75,248,205, 43,199,119,102, 14,157, 96, 98,183,234,214,112,196,201, 38, 90,115, 46, 62, 63, 18,233, 54, 59,
+154,159,254,191,254,128, 31,202, 91,126,242, 34, 80, 39,184, 82, 74,104,191,201, 98,246,255,235,151, 18,160,165,160,155, 89,156,
+ 51,139,188,151, 37,121,241, 87,166,129, 81,136, 48,117,156,176,253,114, 39,171,164, 32, 19,130, 82, 70,190, 68,198,154,149,177,
+ 15, 8, 21,167, 76, 66, 32, 83,169,144,120,143, 79, 83,155, 75,250,233, 0, 96, 3,109, 86, 64, 94, 64, 61, 35,212, 45, 20, 57,
+230, 98,134,239,229,124,232,228,146,179,253, 67, 92, 93, 99,219,140, 66, 11, 74,229, 41,133,228,187,119, 53,121, 21,184,222, 90,
+ 30, 90, 75, 47, 19, 92, 85, 45,141,141,138, 8, 37,147, 17,141,148,120, 17,232,104,137, 12, 2, 99, 29,131, 34,231,188,109,144,
+230,152, 15, 60,241, 28,165,110,217,217,235, 83,217,150,110, 38,208,161,161,144, 1,230, 30, 55,179,180,231, 15,121,249,159,255,
+131,149, 44,108,141, 64,138,136,129, 66,209,130, 53,217, 8,251,176,156,228, 9,137,241,159,166, 77,145,138,182, 99,137,198, 39,
+214,123, 42,246, 34, 65,229, 94, 44, 89,245,193,175,200,120,126, 13, 49,193, 71, 53,130, 88,147,173,201,197,142, 62, 53,139, 33,
+164,224,158, 20,224,179, 92, 29,167, 23,160, 84,140, 42,144, 2,188, 2,145,160,241,184, 2, 16,209, 44, 38,239,226,171, 57,118,
+ 54, 78,198, 49,129,217,227, 71, 24,145,163,135, 3,190,241,251,159,226,213, 87, 31,240, 61,183, 59, 8,227,163,188,208,173,180,
+241, 66, 70, 72,127, 49,124,202,116, 63,120,191,104,138, 86, 94, 28, 11,163,156,165,165,110,162,242, 71, 90,134,160,171, 99, 46,
+196,116,208,103,236,123,244,122,138, 66, 43,180,238, 49,187, 28,131,212,145, 13,222,209,232, 18,242,162,192,121,141, 55, 6,149,
+105,218,241,148,102, 50,198,204, 43,186, 90, 33, 11,205,232,209, 57,253,237, 19,246,158,184,137,105, 44, 90,105,130,240, 96,155,
+216,232, 6,137, 49, 35, 92,107,233,151, 10,233,163,207,187,150,106,233,158, 40,180, 70, 10, 29, 37,173, 89,150,226,157,227,228,
+177, 32,202, 77,109,155, 60,242,109, 50,198,178,104,169,233,246, 75,138, 44,163,215, 41, 81,185,198, 26,199,214, 32, 70,172, 26,
+111, 81, 90, 67,128,218, 7,254,210,134,229, 83, 87,145, 60,215, 90,195,120, 6,239,185,189,203,108, 50,103,106, 29,167,151, 83,
+206,175,198, 92,223,219, 64, 73,201, 59,199,231,108, 14,186,236, 13,187, 60, 60, 31,211, 41,251,160, 43,130,200,185,121,237, 6,
+255,213,207,253, 12, 55,118,118,249,149,251, 51,254,243,247, 31,210,100, 37,219,215,174, 83, 92,127,130,205, 15, 63,205, 23,222,
+216,160,241, 35,180, 10, 84,163, 11,238,221,123,133,195,195,235,132,224,232,246,114,182,135, 5, 90, 53, 88, 99,105,155,134, 78,
+166, 24,148,130,160, 2,181,113,204,235,134,221,161,162,192, 51, 56,188, 30,221, 5,211,121,227, 60,124,127,191,225, 83,179,140,
+219,210,113,254,213,207,178,123,240, 45,188,115,111, 68, 39,203,233,246, 21,219,110,192,235, 71,143,233, 75,205,107, 39,239,160,
+133,224,112,227, 26,245,216, 48, 49, 13,254,178, 69,233,140, 59,187,125,198, 35,199, 27,163, 75,134,249, 22,221,188,203,220,183,
+ 12,242, 28,107, 97, 82, 55,160, 12,153,204,120, 48, 26, 35,164,194,186, 62,251,157, 33,153,150,140,230,115,186,186,228,202, 84,
+140,140, 32, 19, 42, 42, 41,236,132,198,195,248,124,206, 48,239,113,101,230,108,102, 3, 30,206,206, 80,226,128,139,166,161, 84,
+ 18, 61, 81,130,107, 8,242, 94,134,154,180, 75,211,148, 45, 21, 15,202, 49,112, 16, 64, 43,129, 13, 2, 77,124,208, 93, 8,100,
+ 66, 70,216, 78,196, 9, 63,164,226, 46, 61,152,202,167, 66, 43,176, 10,188,134,172, 4, 59,243,241,144,202, 5, 38, 8, 54, 8,
+212, 8,132, 13,212,233, 80, 40, 3,204,210,179,216, 15,130, 41,208, 33,230, 40, 47,138,142, 74, 68, 46, 45, 2,103, 46, 94,148,
+ 5, 44, 59,173,106,204,172, 70,134, 8,255,222,208,154, 60,207,248,246,221, 30,115,107,168, 91,131,179, 41,113,183,154,178,225,
+ 61, 31,233, 68,198,181,192, 83, 32,185,209, 54,148,166,225,102, 6, 35, 31, 24, 3,231,233,123,228,233,181, 89,160, 47, 83, 65,
+ 36,162, 4, 50, 21,191,142, 20,220, 53,158,183, 77,226, 1, 36, 40, 90,138,200,156,213, 2, 38, 65,112, 22,100,132,105, 67,148,
+ 18,121, 32, 83, 34,241,139, 98,133, 82,222,242,200,196, 98,252,173,185,224, 77,155, 14,161, 16, 18,108,188, 34, 45, 46,127, 19,
+ 44,181,195, 44,201,233, 97, 13,114,133,218,122, 30,154,120, 96,134, 52,161, 47,186, 18, 25, 18, 20,157,144, 17, 31, 60,141, 39,
+154,162, 56,207,105, 81,242,211,151, 13,117, 88, 28,224,241, 51,115,249,255,179,154, 47,195,185, 4, 90, 72,250,222, 18,222,221,
+ 19,241,199, 77,224,203,173, 88, 78,146,203,200,206, 52, 34,230,196, 73, 61,151,146, 2,143, 98,245, 53, 23, 19,160, 74,211, 86,
+ 16,145,221,237,130, 64,234,144,180,228,139,120, 80,133, 81, 5, 25, 32,219, 6,156,197, 85, 53,182,118,168, 66,209,142,106,102,
+ 74,240,241,203, 11, 94,218,219,228,242,106, 66,183,204,152, 86, 53,123,131, 77,244,221,175, 98, 2, 92, 87,142,111, 84, 53, 87,
+243,150,166, 49,164,122, 74,191,204,104,173, 35,147, 81,226,103,156,195,167,230,228, 98,222,224,156,165,236,108,115,255,252,156,
+239,121,110,147,185,107,216, 40, 20,155,178,229,193, 27,119, 9,192,199,190,243,125,140,191,244, 41,222,254,245, 95, 90,178, 23,
+ 23,158,249,114, 33, 19,117,145,172,233, 23,138, 4,181,154,182, 69,170,218, 11, 15,252,133,172,116, 25,214,178, 48,161, 73, 28,
+ 7, 17,179,132,146, 85,108, 44,236,139, 95,110, 97,245,154,214, 88,107, 28,186,165,110, 61,248,176,132,246, 23, 77,237,226,235,
+ 6, 23,150, 31,183,172,238,221,214, 69,235, 97, 36, 56, 19,215, 5,164,226,187,104, 86, 84,183,139,111,231,248,217,136,234,241,
+ 17,179,203, 51,234,233, 12, 57,216,101,124,118, 78, 61,153, 50, 80,138, 77,115,177, 44,212,203,201, 60,120,132,147,203, 55, 77,
+ 36,148, 75,132,176, 36,231, 17,226,251,150,250,188,165,164,207, 89, 31,125,238,133, 32,223, 28,176,243,158,235, 4, 74,206,173,
+165,181, 5, 97, 58, 69,117, 10, 66,104,233,237,236, 83, 12, 58, 52,149, 65,151, 37,211,139, 43, 74,153,211, 54,142,222,102, 15,
+211,182,120, 23,147, 31,171,209, 24, 77,244, 32, 23, 22,218,217,132,201,197,136,178,223,165,183,181, 27, 51,194, 67,204,150,176,
+213, 60, 78,212,141,139, 68,213, 78,201,193, 83, 79,114,255,193, 9,163, 89, 67,166,163,204, 84,169,232,102,103,156, 37, 24,129,
+ 40,242,180, 66,136,164,130, 60,151,108,234,184, 22,113,214,209,182, 54,122, 35, 40, 77,191,223, 91,118,120,190,109, 49,117,139,
+ 49, 38,229,217, 11,108, 27,195, 75,124,107, 9,222,240, 61,174,229, 43,161,207, 36, 43,217,218, 28,242,240,254, 25, 66, 8, 54,
+ 7, 5, 51, 51,227,224,218, 54,199, 23, 99,118, 55,182,184,182,221, 99,110, 61,111, 31, 95,144,103,113,247,127,227,176, 96, 62,
+ 27,115,122, 42, 57, 57,127,196,179, 55,111, 50, 42, 7,252,250,169,231,199,191,235, 26, 59, 79,223,193, 30,222,224,255,254, 82,
+ 31,153,207,217,236, 74,204,188,230,143,191,248, 71, 12, 58, 25, 77, 51, 97,175,191,203,245, 97, 31,231, 5,221,197,106,210,182,
+232,188,164,109, 98, 12,107,167, 91,160,144,132, 68, 60,147, 9, 65, 11,107,135,206, 13,101,249,145, 65, 36,248, 78,238,127,141,
+237,219, 31,164, 40, 2,247, 30,157,177,121,176,199, 19,187, 61,238,127,241,140,157,193, 6, 29,163,120,229,242, 81, 36, 7,122,
+ 79, 33, 2, 39,147, 25, 55, 7, 27, 72,109,241,162,165,175,251,120,111, 25,118, 59,148, 54, 67, 8, 75,235, 91, 90, 95, 51,110,
+166,244,178, 62,214, 89,148,128,153,153, 71, 75,104, 9,221, 76, 80, 22,138,147,137,197, 5,135,193,242,120,118,138, 22, 57,135,
+221, 29,198,237,140,137,169, 40, 85,137, 36,112,208,217,230,188,157,242,244,246, 1,119, 71,199,232,235, 82,160,210,158, 76, 47,
+ 28,142,210, 36,211, 77, 15,105,222,141,110,103,121,154,110,144, 34,222,104, 36,166,171, 12,232, 32, 83, 24,125,192, 7,205,184,
+182,156, 10,120,182, 27,205, 59,156,139, 32,184, 42,162,109,167, 23, 33,154,217, 55,129, 78,218,251,117, 22,190,209, 4, 58,105,
+247, 54, 39,176, 45,160, 80, 48, 72, 94,227,142, 72,158, 1,184,103, 88,178,113, 23, 77,185, 90,184, 93, 45,122, 0,103,105, 43,
+ 75,195,124, 57,149,200,181, 34,184, 11,140,150,164,159,128,109, 91,238,174,253,187,174,132, 82,192,126, 82,186, 84,136, 91, 0,
+ 0, 32, 0, 73, 68, 65, 84, 66, 45, 10,163,128,184,223,206, 86, 26,219,176,118,136,233,181,221,186, 16, 17,245,180, 30,230, 62,
+254,121,150,224,116,147, 8, 57,209,127, 60,213,188,180, 42,112,206,241,181, 54,122, 56, 47,190,167, 2,156, 84,177,137, 90, 22,
+178,144,164,103, 43,162, 20, 98, 49,148,165,163,109,225, 12,151, 14,219,158, 86, 60,178,142,158,136, 77,203,138, 55, 16,225,184,
+165, 30,121, 73,122, 10, 52,214, 82, 40,197,220, 58,142,194, 42,134,115,157,119,176, 52,222, 33,252,191, 23,245,101,129, 14, 20,
+ 10,188,115, 75, 75, 88,128, 51, 7,191, 81, 45,246, 61, 98,165,163, 23,209, 9, 32, 79,197, 92, 11,200, 4, 28,168,176, 12, 16,
+137, 59,154, 20, 60, 34, 35, 18,101,157,143,228, 58,145, 10, 68,130,130, 5, 42, 54,127,222, 16,218, 64,200, 52,243,241,156,188,
+ 87, 32,149,143,110,111, 82,176, 93, 20,232,190,196, 93, 77, 56, 34, 48,182,144, 5,193,247,234,147,120,221,125,124,127,206,219,
+ 26, 19, 2, 23,179, 26, 1,244, 50,201,196,199, 37, 70,174, 37, 77,235, 40, 51, 73,157, 8, 24, 74,122,134,221, 33, 91, 29,193,
+ 51,215,174,195,124,198,217,201, 35, 94,126,120,143,147,209,152, 32, 4,255,245,223,250, 59,188,253,243,255,144,217,195,183,227,
+ 91, 38, 19, 9, 46, 89,177,106,185, 34,137, 10,159,238, 67, 25, 31, 6, 17, 4,206, 71, 34,100,112, 1,181,240, 92, 79,150,185,
+137, 11, 21, 7,103, 27, 25,234, 98, 45,219, 97,201,130, 79,255, 45,167,251,101, 97, 23, 75,242,236, 58,171, 52,164, 70,207,249,
+ 85, 20,171,124, 23, 10,147,200,116, 97,205,231, 61, 53, 27, 54,193,237,222,196, 7, 61, 1, 8,241,158,116, 45,225,242, 33,205,
+197, 41,118,124, 73, 59,155, 80,207, 29, 58,243, 76, 31, 31, 49,186, 28,243,209,189,168,115, 22,136,101,211,235, 9,232, 60, 14,
+ 33, 66, 18,117,230,114,237,158, 21,107, 40,215,178,233, 16,233,245, 39, 47,132, 60,167,215, 47,217,184,189,143,216,186,206,232,
+114, 66, 59,157,163, 7,125,124,167, 75, 91, 77,176,243,154,118, 58,194, 89, 67,127,103,135, 32, 52, 66, 73,172,149,152,147,115,
+154,241,132,106, 50,165,211, 45,201, 11,205,213,101, 69,107, 12, 50, 68, 94,136,105, 90, 70,247,143,184,184,255, 14,251,183, 15,
+184,249,194,183,196, 92, 11, 27, 7, 36, 95,205, 9, 66,163, 85, 65,152, 55, 60,124,229,229,216, 36, 6, 73,174,114,130, 16,201,
+172, 40, 26, 65,233,162, 64,101, 89,204,122, 79,221,191, 86, 10,155,220, 27, 27, 31,232,244, 59,113,144,207,116,140,167,109,154,
+168,212,233,118, 40,183, 59,241,253,183,142,249,188,166,109, 91, 76,235,176,222, 66, 99, 8,182,229,219,155,135, 84,173,227,179,
+245, 45, 6, 58,163, 51,216,224,114, 90,211,205, 36,211,203, 10, 25, 28,184, 57, 71,103,130,186,177,116,138,140,241,164, 6,198,
+ 84,173,231,253,239,253, 16,255,236,151,126,150,103,111, 29,114,176,115, 64, 89,150, 92,109,221,224, 23, 31, 31,242,100,126,135,
+236,184,207,238,102, 96,179, 12, 8, 83,243,224, 98,194, 43,223,248, 60,166,109,120, 98,123, 64,167,200,233,118, 51,182,186,154,
+201,220,176, 29, 26,102,115, 75, 71,180,228, 69, 78,145,199,247, 68, 11, 71, 47,203,145, 62,112,245,246, 91,139,203,188,146,121,
+ 2,229, 98,253, 35, 21,255,195,239,253, 43,254,167,255,224, 63, 38,208,242,226,107,143,232,116,114,250, 61,197,229,252,138,173,
+ 94,159,253,222,128,105,235,201,181, 36, 71,209,214, 87, 60, 28,143, 56,154, 94,177, 83,246,184,178, 83,158,232,239,129,112,228,
+ 37, 84,179, 72, 64, 22, 65,177,153,109,161, 37,116,178,140,185,117,148,185,160, 54, 45,239,140,170,232, 45,208,198,117,130,105,
+ 51,206,154, 17,215,203,125, 90,215, 50,119,211, 72, 34,207,187, 12,186, 30,211,102,140,219,154,190, 46,121,245,252, 46,183,135,
+183,209,125, 41,209, 58,178,197, 99, 46, 53,116, 4,236,164,213,219,118, 71, 33,213, 74,132, 42,114,150, 7,237,226, 81, 95,218,
+ 62, 38, 50, 78,112,129,189,142,230,210, 56,180, 86,120, 31,208,105, 26, 13, 82, 70, 72,207,248,248, 48, 38, 66,155, 84, 17,226,
+ 21,153, 88, 74,200,130,141,240, 72, 55, 8,188, 76,196, 25,177,154,216,102,201,226, 80, 39,109,130, 15, 43,194, 14,169,251,118,
+107,147,235,162,174,249, 53,147, 14, 31,224,154, 74,114, 61, 9, 3,224,106,173, 22,185,197, 68, 34,120,215,148,171, 82,195,160,
+196,154, 41,135,120,215,249,196,158,134,108,113, 82,136, 88,208,209,139,221,188,160, 14,129,209, 34,234, 50,201,145,220,114, 55,
+ 30,101, 52,138,200,198, 95,188,110, 23, 2, 22,104,130,227, 82, 74, 38, 62,238,200,109,154,170,220,218,129,236,150,147,187, 95,
+ 57,255, 37,184,219, 5, 16,193,243,219,227, 8,187,103, 66,166, 34,183, 40,200,126,117,200,177,144,232, 37,170,160, 15,120, 25,
+213, 5, 46,188,155, 24, 72, 88,241, 45,132, 88, 43,240,225, 47, 14,234,136,248,243, 60, 95,104, 30, 58,143,242,145,125,174, 36,
+252,163,169,120, 23,251,241, 93,205,131, 76,171, 1, 17,200,133,160, 43, 5, 27,210,211, 63,184, 78, 83,199, 28,108, 18,251,221,
+170,200, 14, 11, 22, 50, 29, 95,139, 74,100, 62,149,224, 87,145, 18,239,188, 15,184,214,161,114, 69, 61,139, 25,243,198,120, 54,
+138,104,244, 16,106, 65, 71,148,220,159,107,254,122,103,138,183, 30,103, 98,213,114, 46, 48, 5,106, 99, 49, 78,112,109,184,201,
+217,116, 70, 95, 88,178, 82,211, 24,139,198, 51,119,142,169,133, 50,211,244, 50,133, 8,138, 39,118, 15,120,127, 87,242,187, 95,
+254, 52, 71, 87,231, 60,185,183,205, 43,199, 23,220,220,221,162,151,247,184,109,142, 56,185,255,214,242,190,115, 54, 65, 25,137,
+101,110,213, 2, 98, 95,113, 70, 2,145,229, 46,214, 76, 97, 16, 33,238,184,191,137,209,238,237,106, 98,119,126,245,156,136,176,
+ 38, 85, 19,188,139, 49,172, 82, 14,251, 98, 21,135, 88,217,190,146,246,230,173,143,164,214,197, 16,224, 21, 72, 23,215, 32,248,
+ 5,244, 30,150, 4,187,133,198, 40, 36, 70,190, 82, 2,183, 16, 68, 36,246,121,121,243, 5,234,211, 7, 52,147, 41,190, 26, 49,
+ 31,205, 16, 50,167,157, 77,120,237, 79,190, 68, 46, 21,218,182, 24,187,138,112, 21, 34,222,187, 38,153, 34, 57, 23,207,155,133,
+ 34, 96,209,224, 44, 59, 0,201,146, 92,184,104, 90, 50,169,232,109, 13, 24,220,222, 71,119,182,153,142, 42,130, 44,200,202, 62,
+147,147, 99,108, 85, 71, 31, 8,235, 48,147, 43,218,218,145,247, 58,120,227, 17, 82,114,254,230, 93,170,218, 98,188,160, 54,129,
+147,199, 87, 52, 77, 67, 89,230,224, 2,181,247,248,218,208,154, 11,198, 87, 51,242, 94,151,171,199,103, 60,249,193,111,167,157,
+ 77, 8,120,100, 94,160,140,195,204, 44,170, 23,213, 47, 66,101,188,243,224,140, 94,167,196, 89, 67,150,231,168,162, 64, 40,133,
+206,114,116,166, 17, 82,208,214,113,114,247,214, 51,183, 49, 53, 82, 41,133, 12, 30,156, 71,169,156,174,206,176,210,147, 17, 48,
+206,225,154, 26,188,141,118,197,173,193, 88, 7,214,146,203, 64,158, 73,240,130,198,198,247,104, 83, 5,190,215,158,240,175,231,
+ 61,116, 53,162, 95,118,153, 54,129,129,132,166,246,156,204, 90,164, 56, 38, 47, 11,166,162,160,169, 43, 58,101,201,213,249, 37,
+175,189,250, 85,180,178,244,135,215,120,226,230, 1, 94,245,217,217,220, 97,115,119,200,238,160,160, 55, 40,217, 24, 20,216,214,
+112,121,113,201,221,215, 95,231,106,124, 65, 55, 87, 24, 23,184,177,213,101,160, 37,133, 10, 80, 40,122,101, 78,235, 26, 10, 93,
+226,189,197, 25, 65,167, 8,200,160,112,206,208, 17,112,250,202, 75,203,251,219, 39,194, 84, 88,205, 16,200, 96, 57,116,129, 95,
+249,252,167,248,240,193, 83,116, 50,205,233,213,140,202,214, 92,223,216,228,149,199, 15, 48,210, 35,131, 96,187, 51,224,178,169,
+233, 42,141, 18,138, 76,100, 92,204, 27,186, 34,227,180, 30,225,103,240,236,254, 6,247,235, 43,158,222,223,196,187,156,171,153,
+225,241,252,132,157,124, 7,227, 13,213, 60,112,222,142,217, 80, 61,114, 33,105,105, 80, 30, 92, 80,248, 0, 15,171, 99, 10, 93,
+178,171,186, 24, 44, 33, 24,198, 51, 29,165,222,210,160,181,166,173, 29,133, 46,208, 74, 8,138,110, 12, 8,201,100,172, 74,123,
+ 1, 74,160,219, 85,104, 29, 61,138,157, 15,201,224, 36,185, 40,166, 73,200,167,100,178, 16, 2, 34, 75, 85, 48,139,133,231,154,
+241,220,175, 29,123,185,100,160,227, 54,212, 37, 29,115, 80,130, 66,197, 98, 49,151,208,211,177,160, 71,134,229, 34,230, 81, 80,
+ 38, 88, 88, 38, 73,154, 74, 91,118,235, 2, 23, 62, 78,105, 65,164, 50,180,176, 66, 93,236,153, 5,100, 62, 70, 58,134,176, 34,
+249,132, 53,153,219,117, 17,215, 5,119,100, 60, 35, 75, 96,206,154,215,117, 82,191,248,181,194,229,215,135, 77,193,242, 80,123,
+ 23,178, 44,226, 36,184,173, 86,132,162, 40,171,142,220, 4, 1, 12,145, 56,235, 35,132,157,166, 29,189, 44,120,171, 5,253,126,
+ 38, 41,196,170, 72,223, 55,158, 2, 24,136,176,160,190, 39,118,255,202, 10,212,167, 41, 37, 36, 50,163, 88, 35, 52, 19, 60,153,
+ 0, 37, 2, 61, 9, 83, 15, 51,239, 25, 35,105,188,164,101,221,166, 59, 94,227, 32, 98, 86,115,176,129, 38,217,127,213,118,117,
+237, 23, 69, 65, 39, 25,205,194,106, 84,165, 93,164, 18, 98, 29,117, 95,254,185,147,101,108,217,134,119,128,115, 11,207,222,216,
+161,215,235,178,249,202,125,174, 88, 5,113, 47,118,250, 75, 11,218,228, 77,239,131,167,113,112, 48,136, 9, 83,166,169, 17,198,
+162, 50,137, 49,142,188,147,199, 24,211, 69,103, 38, 33,182, 75, 50,106,217,165, 79, 50,170,120, 95,197,181, 76,100, 91, 23, 89,
+100, 10,207,109, 19, 39, 89,231,184, 52,142,241,172,230, 37, 15, 31,187,117,157,199,143, 31, 17,108,196, 62, 46, 29, 24,231,216,
+234, 12,217,216, 56,224, 39, 15, 79, 49,231,199,220,147,134,111,228, 37,149,208,108,117, 61,181,181,104,239,169,154,150, 78,166,
+248,107,246, 62,159,127,241,130, 55,155,156,255,228,137, 3,182, 38,143,121,179,204,152,207, 27,126,236, 47,253, 0,231,127,242,
+171,113,255, 47,214,211, 17,215,200,108, 54,221,131,110, 37,193, 90,176,216, 69, 88,101,161, 47, 32,236, 4, 94, 69,158,193,194,
+175, 96,109,106, 89, 44,205,215, 63,180, 14,201,171,116, 47, 6,151,158,163,196,121, 16,201,116,198,165,103, 46,194,243, 17, 89,
+241,196,130,238, 83, 83,216, 59,220, 69,231, 25,118, 58, 79,246,180, 13,205,168,138,104, 65,234,152, 77, 72,134,127,139,181,130,
+ 11, 84, 15, 95,165, 61, 31, 96,170,154,234,114,130,173, 5,217,214, 46,103,111,191, 69,153,133,200,171,104, 99, 78,128, 79,197,
+220, 17,121, 61, 74,129,113, 43,222,202, 98,213, 44, 18,187, 95,234,116, 47,219,119, 63,203,101,167, 32,223,232,210,125,242, 26,
+ 74,247, 48,173,199,180, 45,205,249, 49,151, 87, 83, 66,240,168,142,102,118, 50,166, 40, 51,108,144,216,121,203,252,236, 60,170,
+ 66,148, 34,203, 37,186, 17, 88, 31,144,214, 81,185,154,170,118, 84, 6, 58,165,198, 27, 79, 43, 28,194, 6,230,115,131,156,205,
+ 48, 62,112,247,139,159,231,246, 7,191,141,230,234,108,213,236,183, 83,212, 96,131, 91,207, 63,143,175,103,188,239,217, 91,188,
+125,255,113, 12,228,113,150,224, 44, 58,228, 72, 37, 9, 38, 62,255, 4, 79, 38, 5,178,147,163, 27,104,155, 54, 54,251, 2,242,
+ 60,134,129,204,171,138, 44,207,200,181,140,196, 68,107, 49,243,121,108,190,211,126, 51, 16,112,198,162,172, 37, 83, 50, 54, 19,
+ 4,108, 11, 7,205,148,131,225, 53, 94, 63, 59,231,120, 52,163,208, 18,107, 27,202, 60,231,178,106, 8,120,148,202,104,155, 64,
+183,215,103, 58, 25, 83,246, 55,233,150,154, 39,110, 60,201,176,200, 16, 89,201, 70, 87,179,181, 57, 96,103,208,199,121,207,181,
+237,130,170,106,184, 58,189,160,174,103,124,254,207,191,128, 20, 22, 33, 50,158,216,223,100,163,215,163, 83, 40, 10, 1,181,115,
+140, 70, 99,246,119,247,168,230,134, 92, 7, 6, 3,137,177,208, 31, 10, 76,211,160,189,164,190, 56, 79,207, 73,248, 11,104,227,
+ 2,150,127,166, 80,252,236,215, 94,199, 30,156,242,220, 51, 31,224,254,213, 21,219,221, 62, 71,211, 49, 83, 63,143, 54,210, 50,
+227,193,244,156,221,206,128,105,219,226, 66,195, 65,111, 72, 38, 36,162,145, 84,173,199,227,121,227,116,196,118, 89,112,116, 49,
+165, 9, 48, 53, 19,114, 89, 50, 55,177,238, 58,239,232,169,130,110,174,240,161,225,250,176,207,253,171, 43, 14, 58, 27, 76,140,
+ 96,183,236,211, 58,195,105, 51,102, 35,235, 96,189,163,114, 13,224, 41,117,135,163,201,132, 59,189,155,156, 77, 79,209, 66, 73,
+ 36, 30,239,227,133, 20,192, 80,130, 46, 2, 42,207,210, 62,149, 36,191, 73, 18, 37, 18, 75, 53, 72,100, 18,185,106, 82,193, 79,
+190,201,185, 10,168, 0,109,235,208, 33,112,209,196,135,106, 43,147,203,112, 13, 43,225, 97,229,105,129,107,221,148, 17, 14,204,
+109,160,117,129, 78,218,137,231, 11,218,121,234,248, 33,164, 67, 67, 80,170,164,149,231,155,138,198, 98,130, 94,176,117, 19, 82,
+ 64, 90, 43,108,175,177,217, 93,218,217,147,208,137,124, 45, 10,210,125, 83, 33, 95, 35,197, 46,235,174, 23,235,138, 0,177,252,
+222, 66, 64, 41, 23,123,246, 21,227, 56,136,213,174,251,118, 38,185,112,129,145, 91, 59, 68,197,218,201,156, 14,208, 92,197,239,
+251,216,120,242,149,111,203, 95,128,180,195, 10,108,127,183,188, 78,132,245,243,122, 89, 28, 14,181,224,145,137, 16,238, 16,159,
+166,175,213, 78,209,173, 53, 11,126, 97, 32, 20, 64, 90,203,166,142,239,107,235, 69, 28, 26, 69, 76,148,107, 67,160,151,171, 40,
+209, 91, 54, 25, 43,116,214, 47, 28,225,132, 96,232, 12,119, 61,244, 5, 12,180,224,235,143,206,241,156, 51,148,113, 77,209, 44,
+147, 64, 23,177,160,105,122, 74,126,227, 33,192,200, 5, 74,103,153,207, 42,230,117, 77, 46, 65,185,168,139, 23,198, 32, 92,160,
+ 37,160, 22,214,176, 65, 32,164, 95,131, 90,211,222, 52, 77,102,193, 5,140,181,140,172, 89,194,199,193,195,133,129,243,201,148,
+231, 51,201,221,185, 96,187,114, 84,109, 65,199, 86, 4, 60, 67,233, 24,234, 28, 91, 85,252,157,239,185,206,221,223,253, 42, 65,
+192, 46,115,190, 79,206,147,109,176, 64,139, 72,226,147,189,248,134,188,113, 58,227,211,166,228,135,191,237, 35,220,124,227,143,
+112, 33,240, 67,157,192,111, 86, 5, 63,244, 29, 7,252,217, 23,166, 17,202, 94, 76,180,235, 38,111, 97, 61,169, 52, 54, 95,146,
+ 85, 7, 40,146,140,107,185, 3, 15, 43, 20,197,248,149, 61, 43, 98,165, 17, 95,185, 21,164,123,210,177,230,178,152, 34,192,195,
+162,136,135,229,115,183,244,177, 72,198, 51, 34,164,231,197, 65,247,218, 30,239,253,225, 31,164, 79, 1, 23, 21, 15, 94,122,141,
+ 60,147, 12,158, 30,128,214, 84,179, 57,221,142,224,236,193, 93, 46, 31,159,208, 78, 12,222,212,216,228,100,233,108,226,165,104,
+ 73,123, 53,198, 25, 75,211, 88,218,170,101, 30, 78, 17,193, 50,154, 57, 94,232, 26,218,214,167,115, 40, 34, 73, 33,169, 77,188,
+ 18,120, 27, 77,109,124,146, 46,170, 44,157, 91, 2,108,106,156, 22,176,132, 20, 18,149, 73,188, 9, 20,123, 67,220,220, 96,154,
+ 11,234,121,131,187,156,112,213, 18, 59, 35, 27, 48,211, 8,245, 74,225,113,181, 33, 24,143,171, 90,124, 8,152, 54,166,160, 21,
+ 58,238,239, 91, 39,208, 54,202,201,140,177, 92,153, 64,175,140,254, 5, 42,211, 17,255, 76,215,239,232,245,183,233,111,111,210,
+219,220,194,155,232, 37,111,173,161,158, 92, 98,102, 19,106,233,216,222, 30,240,232,100,132, 76, 54,159, 58,207,163, 89,146, 15,
+ 4, 31,221, 31, 89,200, 86,173,139, 33, 69,153, 78, 67,142, 32, 56,139,144,138, 76,128, 8,113, 95, 95,230, 25, 94, 73,140,146,
+180, 54,126, 12, 17,163, 96,109, 8,132,224, 32,165,191, 57, 31,243, 45,166,206,243, 49,115,206, 85,111, 19,213,233,210,180,150,
+211,171, 11,202,204,179,191,127,141,203,139, 17,103,163, 43,118,134, 27, 49,204,138,192,110, 71,114,251,214, 62,111, 61, 28, 33,
+ 16,244,105,216,218,221,100,119,152,163, 51,193,198, 70, 78, 64, 48,159,141, 57, 57,123,204,235,111, 63,224,205,187, 95, 39,215,
+146,253,237, 1,253,162,160, 87, 40, 10,145,188, 16, 16,116,242,156, 73,213, 34,116, 96, 80,150,212, 77, 75, 89,102, 52,181,101,
+123, 16,120,248,133, 47, 47,167, 58,181,230,111,194, 55,197,254, 62, 52, 25, 27,210,242, 65,127,130,122,252, 18,221,124,151,227,
+217, 37, 51,107,217, 46, 75,206,234, 57,133, 2,139,227,120,118,129, 72, 3,219,189, 81,195, 97,183, 79, 99, 44,141, 55,236,150,
+ 67,164,116,244, 10, 73,238, 60,178,118, 52, 72,172,247,244, 51,207,227,122,194,173,254,144,185,209, 92,212,147,104, 86,244,184,
+198,225,105,236,152, 39, 55,187,188, 51,174,200,181, 98, 39,235,112, 94, 27,246,122,158,204,106,206,231,115,198,102,204,115, 27,
+ 79,130, 52, 56,147,161, 75,173,146, 93,163,164,212,241,103, 45, 5,200, 66, 46,201, 4,121, 90, 46,123, 31, 25,199, 98, 1,237,
+ 41,129, 20, 49, 70, 84, 10, 17, 11,124,122,119,180, 18,104, 47,185, 97, 3,141, 15,108,132, 40, 3,115, 6,138,168,168, 71, 10,
+197,117, 7,119,141,103,236, 98,151, 93,183,158,214,194, 36,113,125,186, 33,254, 33,147,209,250, 83, 47,164, 73,110,181,183,206,
+ 20,108,166,165,157, 77,159,103, 67, 44,222,101, 4, 14,222, 85, 88,236,218, 84,191,128, 91,220,154, 6, 63, 91,131,123,213, 74,
+197,178,202,251, 78,223,247,250, 58,148,191,174,120, 89, 52, 0,196,104,218,176, 56,108,215,216,229,122, 77, 30,120,144,252,206,
+155, 5, 47,104, 65,128, 74,200, 73, 41,160, 35, 99,151,239, 72,232,196,250,129,190, 86,221, 23,210, 34,191, 38, 75, 82,146,101,
+210, 90, 88,179,252, 68, 64,145, 94, 87,177, 86,223, 22, 92,132, 44,253,124,198,191,251,103,103,141, 91,224, 60,148,139, 34, 16,
+ 2,219,105, 83,227,157, 67,126,211, 10,125, 97, 47, 42,101, 4, 24, 50, 34,105,112, 32, 97, 83,197,195,226,154,142, 13,228, 61,
+ 39,208, 30, 42, 4,115, 31, 8, 66,190,203,158, 52, 19, 17,243,168, 93,224, 35,157,156,174, 15,204,198, 85,100,128,203,216, 48,
+102, 73, 35, 43,147, 92, 41,184,200,134,150,233,162,122,239, 81, 8, 12, 16,132,199,250, 40,123,180,206,209, 18, 39,219, 54, 73,
+190, 76,128,199,117, 96,183,147, 83, 58,203,110,174, 25,141,167,124,228,201, 67, 94,190,184,228,238,195, 19, 4,158, 15,247, 52,
+159,169,227,162,230, 75,243,136, 2, 12, 4, 20, 58,170, 53, 22, 13,167,146,160, 17, 84, 33,112, 95,246,200,167, 21,127,239,125,
+ 55,249, 79,191, 36, 40,139,146,235,193, 99,235, 9,213,212, 83,249, 2, 53,159,163,242,184,134, 89,152, 24,137,181,155, 64,138,
+133,254, 58, 21,215,164, 70, 17,169, 57, 12, 73, 43, 46,215,186,128,144,136,150, 98,225, 44,183, 38,137, 36,196,176,149,224, 23,
+118,175,107,100,146,133, 66, 98,193, 37, 72,215,150,165, 47,124,242, 18, 72, 68,205,167,126,240,251,121,246,123,191, 11,127,239,
+140,179,151, 95,225,236,232, 33,183,159,122,130,118, 84,113,254,232,138,121,219, 98,125, 67, 61,245,168,162,164,183,243, 52, 59,
+ 55, 21,157,204, 50, 58,122, 76,101, 26,182,158,187,129,111,231,228,210,227, 70, 35,174,170,138,171,177,193,169,130, 48,185,207,
+217,253, 75,202, 92,147,203,200, 81,113, 73, 13, 32,149, 88,122, 54,200, 54,173,100, 44,232,100, 93,103,140, 64,138,176, 36,236,
+ 45,238,253,120,175, 69,212, 70, 15, 10,218,139, 41,162,231,176,151,115,194,184,102,148,235,200,230,119, 62,186, 30,214, 30,103,
+ 28, 34,143,238,134, 82, 6,204,188, 69, 21,139,208,121,143, 80, 80, 32,216, 20,112, 62,141, 67,143,129,104, 32, 83,187,165,225,
+138, 22, 2,167, 36,185,240, 92, 94, 76, 80, 82, 97,235, 58,146, 9,171, 25,190,153, 51, 25,143,217,216,221,103,252,224, 30,215,
+110,246, 49,243, 22,145,103,132, 16,162,132, 45,249, 78, 56,103, 81, 82,160,148, 70,107, 65, 99, 60,214,216,200, 77,209,146, 76,
+197,220, 9,145, 72,148,193,185,152,195,110,160,113, 22,219,218,116,157, 93, 92, 47, 56,135,118, 22, 91, 27,108,221,196,124, 3,
+107,144,214,160, 2,236, 95, 30,179,119,243, 58,111, 60, 58,103,115,216,165, 16,146,110,222,229,226,252,140,157,205,109,246,182,
+ 54,152,205,198, 24,211,112,253,240, 16, 31, 60,199, 23,115,182,134, 93, 6,221,130,214, 4, 38, 85, 67,118, 49,226,206,173, 13,
+132, 7, 51,155,114,245,248,136,251,143,142,120,235,157, 55,208, 50,160,148,166, 40, 58, 12, 74, 77,169,161,173, 13, 6,168, 91,
+ 75, 85, 77,168,188,227,112,187,131,242,146,128, 66,187, 64,183, 20,132, 22,134,201,104,203,175, 41,135,214, 61, 88, 22,176,188,
+ 1,190,175, 23,201,225,246,242, 33,207,248, 99,142,175,189,143, 87, 79, 47,105, 93,131, 35,112, 58, 31, 49,200,122,140, 77,195,
+ 48, 47,144, 8,186, 82,115, 81,207,145, 66,208,248,134,113, 59, 35, 19,240,206,228,130, 92, 9,106, 99, 25,230, 61,206,154,115,
+182,203,109, 6, 42,227,181,209, 57,187, 89,135, 76, 74,174,204,156,141,162,160, 35, 74, 38,198,240,133,147,199, 60, 59,220,228,
+104, 54, 99,220,214,145,236,237, 50,250, 89,193, 65, 55,231,237,201,132,147,234,138,146,146,143,188,255,105,116, 46, 5,153,210,
+160, 45,185, 16,108,138,120,179,105, 37, 17, 42, 90,114, 70,167, 37,159,164, 50, 9,102,149, 17, 87,246,248, 20,215,185, 80, 15,
+199, 3, 29, 41,144, 90, 35,115,129,180,142, 34, 4, 10,226, 52, 20, 18,139,212, 7, 24,148,146,231, 20,212,141, 79,211,161,160,
+ 77,123,176,121, 8, 24, 4, 61, 29,187,253,220, 36,182,178,143, 7,229,183, 46, 18,177, 0,175,210,225,189,134,237, 46,229,111,
+139,125,123, 88, 48,162,197,170, 48, 45,162, 41,211,191,105,129, 78, 88, 21,174,197,116,233,210, 86,218,133,192, 32,192, 38, 96,
+ 82,220,235,138,124,182,130, 39,197, 66, 98,181,248,158, 11,178, 79, 8,209, 11,126, 77,134,230, 67, 36,225, 45, 86, 27,141, 32,
+238,103, 89,105,204, 59, 18, 38, 30,138,133,214, 94, 44,226, 67, 87,135,180, 95, 67, 31,252, 90, 1, 89, 52, 17, 36, 23,172,197,
+ 73, 62, 84,130, 34,177,242,181, 88,241, 13, 22, 48,239,194,183,123,241,119,118,237,198,215, 50, 34, 26, 83,191,118,214, 47,216,
+194,172,136, 81, 98,237, 65, 81, 98, 69, 62, 92, 20, 1,149, 10,102,103,177,251, 20, 17,186,223, 20,145,135, 33, 69, 12,222, 80,
+184,212,108, 9, 50,153, 94,179,138, 15,156, 14, 13, 15,141,224,102,202,241,214,106,105, 76, 28, 77, 86,164, 72,150,167,177,234,
+ 36, 5,124,186,127, 19,210,147,236,108,103, 62,174,135, 92, 16,204,147,171, 96, 99, 61,173, 3,139, 68, 57,199,101,227, 9,214,
+208, 76, 90,154,195, 93,178,202,242, 86, 19,155,183,188,173,176, 65,243,233, 63,248, 44,103, 13,144,101,220,218,238,112,247,114,
+188, 36, 58,106, 17, 40,100, 44, 38,189, 76,179,239, 45,243, 82,242,183,255,201, 47,114,123,163,195,157,205,130,211,179, 41,127,
+251,153,235,252,222,151, 94,225,147,255,225,143,243,185,127,250,115,232,164, 14, 81, 62,229,154, 39, 79,245,104,235, 27, 93, 22,
+189, 17, 75,249,154, 16,160, 85,186, 23,146,135,187, 75,234, 0, 17, 86,156,137, 32,226,123,176,152,214,109,154,180, 23,251,117,
+193,202,117,110, 9, 81,250,119, 7, 54, 46,217,247,132,212, 20, 8,130,148, 60,247, 3,127,141,247,124,242,227, 52,175,223,231,
+232,165, 87,113,237,152,247,126,232,131, 28,189,122,151,217,172,198,249,216,104,217,185, 36,224,104,218, 54,106,174, 31, 91,218,
+198,160, 50,133,247, 37, 15, 62,119,140,192, 32, 59,224, 56,229,246,173, 46,173,151,180,102,142,153, 27, 64,208,203, 52,182,154,
+ 97, 23,158,241, 10, 76,136, 3,198,226, 30,180, 33,170,117,204,226,172, 10,158, 32,227,123,182, 8,168,145, 42,224,124,188, 62,
+193,122, 52,208, 86, 6,115, 57, 39, 76, 91, 68, 39,163,177, 49, 32, 40, 32, 9,173,101, 60, 54,177, 72,166,251, 85,166,104, 83,
+146,250,197, 25, 31, 9,201, 2, 10, 9,155,101, 12, 56,178,134, 8,223, 35,176, 38,146, 26,149, 86,100,104, 92,128,249,188,101,
+122,114,204,206,157,167,240,117, 69,104, 13,222, 70, 75, 92,223,206,200,178,156,141,219, 7,132,224,201, 18,135,192, 59, 23,101,
+119,153,198, 11,141,144,209, 67, 62,248, 64,161,117,204, 71, 15,145,168, 44, 4, 56, 99,113,174,198, 59, 79,240, 46,134, 46,153,
+184,192, 51, 62, 25, 24, 37, 47,138, 96, 45, 77,107, 16,182, 69,123,143, 78, 46,116,145,247, 16, 21, 69, 7,221,156,163,110,159,
+ 60,239,114,125,127,131,163,139, 43,138,172, 67,219, 26,124, 16,116, 7,155, 81,249,208,214, 60,121,253, 0,131, 39, 56, 79,142,
+228,218, 94,151,186,105, 40,115,197,233,197,152, 15,221,186,201,171, 95,255, 6, 95,123,243,109, 38,213,156,203,203,139,255,167,
+173, 55,139,185, 44,187,238,251,126,107,239,115,238,248,205, 53,116,117,117, 85, 15,100,179, 73,118, 55, 77, 82, 34, 41, 41,178,
+131,200,130,109,129,146,163, 56,182, 3, 25,201,147,135,228,197, 48,242, 22,192, 72, 0, 7, 1,132, 32, 49, 2, 56, 64, 28, 32,
+ 72, 30, 98, 32, 49, 2,200,177,149, 4,142,141,216,134, 45, 89,110,137, 18,217, 20,155,100, 15, 98,143,213,213, 93,227, 55,223,
+233,156,179,247,202,195, 94,251,156,125,139,124,104, 84, 87,213, 87,223,119,239,185,231,236,181,214,127,253, 7, 14,231,187,116,
+ 26,120,238,104,135,219, 71,187,104,215,177,220, 4,156, 19,150,235, 14, 46, 58,246, 14,106, 38,147, 9, 49, 68,246,167, 98,195,
+ 7,220,251,225,219,252,193,127,243, 63,243,205,191,253, 55,249, 39,255,229,175,167,192,163, 98, 64,138,197,217,244, 83,163,205,
+ 64,182, 38,125, 78,111,253,232, 77,100,247,144,143,214, 45, 87,198, 19,162, 84,156,183,151, 92,159,205,232, 66,228,162, 93,114,
+ 28, 34,179,106,204, 65, 61,161,139,129,203,110,133, 23,101,175, 26, 83,185,228,163, 33,210,114,173,218,227,147,203, 53,141, 54,
+ 84,226,120,220, 94,226,196,179, 91,141, 56, 91,109, 88, 85, 45,179,202,161,109,224,120,179,230, 11,215,102,188,123,188,164,211,
+196,205,136, 90,243,193,249,130,219,243,107, 28,238,120,174,237, 79,248, 23,223,121, 29,255,231,110,238,254,173,122, 84,209, 68,
+ 88, 57,225,138,115, 76,156,163, 26, 85, 84,163,202, 44, 27,197,220,147,132,202, 37,199, 20,231,147,247,119,134,124,162, 40, 77,
+163, 44,219,200,163, 54,242,168, 9, 92,116,202,152, 68,168,242, 62, 77,217,181,145,147,215,109,228, 34, 40, 77,167,108, 52,185,
+ 70,101,220,186,114,208,138,244,186,240,206, 58,232,214,165, 52,174, 25,233,215,220,100,120, 43, 4,206,100, 23, 94,172, 91,182,
+137,200, 27, 27, 29,151, 38,126,231,210,164, 39,217,196,198, 68,228, 42,194,169,133,153, 56,251,254, 25, 13,200, 73,179,207, 10,
+236,219,255,143,140,116, 86,219,215,213, 38,233,170,141,145,157, 53,216,117,126, 93,164,235,231,114,145,179,194, 88,219,251,168,
+237,245, 76,132,212, 56, 56,225, 80,132, 25, 32, 81, 88, 2,141, 57, 92,121,187, 62,158,244, 51,188, 8,222,165, 34,231,179,110,
+ 59,191, 6, 25, 20, 1,206,246,210, 94,132, 93,148, 77,110,162,160,176,225, 77,135, 82, 38,145,251,226, 90,229,239, 55, 23,216,
+119,176,206, 42,136,126,122, 30,254,171, 25,190, 62,255,157, 55, 15,126, 95,188,166,218,193, 85,159,175,181, 41, 47,236,123,123,
+179,139,201,159, 91,122,159,246, 30,237, 26,140,236,253, 95,153, 56,155, 94,205,124,199, 73,111,206,211, 7,212,152,190,189, 39,
+125,149,146, 44, 10,199, 51,107,102,132, 20, 48,227, 17, 38,192,101, 80, 26,187, 79, 87, 33,112,222,116,212, 18, 57, 95,111,112,
+154,246,234, 51, 34, 63,183, 83,241,149, 43, 19, 94, 26, 9,135, 26,113,251, 59,188,113,186,228, 52, 42,199, 1, 30,117,202, 73,
+ 80, 46, 58,225,221, 85,219,187,158,213, 40, 85,219,161, 65,121,247,124,201,111,191,243, 46,223,122,237,117,254,189, 63,254, 53,
+ 62,190,123, 55,145, 37,227, 16,206,226,116,104,154, 84,123, 70, 92,223, 76,133,194,109, 49,147,222,138, 75, 49, 68,172,250,237,
+130,157,253,222,123,254,137,234,214, 90, 38,146, 38, 98,223, 55,127,153, 92, 50,104, 40,174,188,244, 10,175,252,165, 95, 69,239,
+ 62,228,222,219,239,178,124,252, 41, 47,254,252,207,243,201,155,239,177, 88,175, 18,148, 27, 35,109,215, 17,124,164, 89,182,104,
+ 5, 93, 27,104,218, 64, 27, 35,171, 77,203, 58, 68,214, 33,176,136,202,170,141,108, 52, 57,226,197,174,193, 35,136,175, 56,189,
+104, 57, 91,118, 28,152, 47,123,206,166,240,214, 64,187, 30, 25,147, 94,217,145,237,134,123, 3,159,252,222,123,132, 34,217, 61,
+199, 38, 33, 46,235,211, 85, 82, 19,120, 79, 23, 52, 73,225, 90,101,121,154,140, 95, 66, 84,166,117,122, 14,157, 36, 2, 98, 66,
+ 51, 5,109,181, 95, 89,120,159, 26,177, 90, 32, 57, 35,155, 61,175,106,242, 53,176, 11, 93,143, 42, 54,155,200,201,189,135,236,
+ 77,149,233,238, 30,205,201, 35,218,203, 51,206, 31, 62, 76,170, 6, 25,113,245,198, 30,159,188,247, 9,203, 77,135,160,172, 55,
+ 9,114, 79, 71,106,178,112, 86, 43,206,196,180,154,112, 81, 9, 49, 32, 81, 83,131,103,156, 41, 98,164,109, 59, 98, 8,196, 16,
+240,161,163,234, 26,170, 60,141,183, 13,210,181,248, 16,241, 49, 38,159,245,216, 81,199,212, 16,136, 8,254,224,136, 79,163,227,
+188, 13,180,102,145,188,110,215, 84,126,204,200, 41,171, 54,240,217, 27, 87,145,218,211, 52, 29,243, 81,141,119,194,184,114,108,
+ 90,165,219, 52, 76,198, 35,118,230, 59,108, 46,206,249,206,155,111,243,201,131, 99, 86,151,231,124,122,255, 19, 86,235,199,188,
+252,252,109,254,216,173,171, 60,117,184,203,166,105, 8, 33, 16,186,196, 81,152,212, 35,110, 94,221,199, 73,100, 50,174, 80, 51,
+ 74,185, 58,134,255,246,111,252, 58,237,164,226,217,143,238,240,226,207,125,157, 59,127,244,110, 79,240,237,213, 66,118, 27, 79,
+ 93,100,110, 75,165,160,233,172, 60,211,138, 95,190,253, 44,110,178,199,221,139, 51, 46, 99,195,211,211, 41,155,216,242,120,157,
+108, 99, 39,174,162,118, 85, 34,129, 91, 34,163, 71,184, 8, 27,206,154, 21,149, 8,119,150, 39, 92,198, 13, 99, 73,220,158,189,
+177,239,155,206,147,110,201, 78, 85,179,232, 90, 58, 85, 42, 28, 23,221,134,183, 78,206,104, 98,199,254,104,202,172, 74,233,157,
+ 87,231,158, 24,106, 62,186, 56,197,109,166,124,243,231,190, 70,229,157, 80, 87, 21, 23, 46, 50, 22, 24,169,226, 39,224,146,199,
+ 38,117, 45,125, 28,147,171, 60, 26, 34, 21, 41, 12,195, 87,142,208,164,182,184,217, 4, 84, 19,140,187,235, 93,234,131, 99,196,
+197, 68,213,242, 34, 84, 35,143, 88, 98,155, 56,199,153,166,253,235, 20,165,237,210, 9, 46, 81,169, 68,217, 15,137,153,186, 38,
+145, 52,162, 77,139, 23,166,231, 62, 32,145, 93, 84, 5,121,130,128, 85, 46,215, 51,220,172,113, 72,131,172, 34, 4, 55, 28, 80,
+173,194,210, 52,249,121,146, 82, 82,145,215,152, 38,157, 43, 2, 7, 58, 64,236,117,185,107, 87,251,189, 51, 6,127, 9,199,231,
+208, 27,147,199, 6, 85,106, 43,186,229, 10, 39,144, 31,110,237, 73,125,253,110,211,118,208, 71,214, 17, 95, 74, 54,130, 25,204,
+ 83, 6, 61, 46,131,223,247,214,117, 72,175,113,215, 16, 18, 85,101,164,112,142, 14,235,134,188, 95,114, 3, 19, 58, 43, 8,170,
+252, 26,141, 71,116, 5, 88,199,180,130,208, 98,221,208,152, 59,221, 70,122, 85, 89,226, 97, 20,241,159, 94, 6,121,158,179,107,
+233,205,241, 79,101, 64, 58,110, 34,220,143, 22, 64, 99,187,226,202, 94, 67,239, 42,104,211, 70,101, 63,203, 85, 66,237, 92,255,
+185,103, 98,152, 56, 51, 15,201, 26,109,147, 53,132, 80, 42, 34,212,114,224,197,116,214,230, 9, 78, 98, 94,183,168,249,248, 39,
+121,231,129,131,139,243, 51,142, 73,107,140,214, 9,181,201, 19,127,243,209,130,167,108, 66,108, 84, 9, 44,184,110, 42,134,170,
+ 48, 34,218,173,224,107, 7, 51, 70,149, 99, 26,225,116,221, 81, 79, 43, 22,151, 13,175,206, 42,166, 59, 99,252,166, 99, 18, 59,
+158,254,252,231,248,248,205,119,210, 94,219,165,239,211,230, 53, 73, 10, 36,237, 19,251, 50,161,208, 25,145, 49,216, 84,223,103,
+154, 27,195, 91,237,208,141,221,160, 93,247,174,200,161,239, 27, 31, 25,116,233,150, 64, 40, 36,175,137,158,124, 26, 51,251, 94,
+169,167, 51, 94,254,143,126, 25,150,107, 86,199,143, 88,159, 61,230,165, 63,249,117, 46, 62,190, 79, 39, 9,173, 10, 49, 49,178,
+131,198, 20, 12, 84, 57,218,182, 65, 5, 46,215,129, 46, 38,155,217,182, 11, 52, 17, 54,157, 50,157, 37,135,200, 7,199, 27,158,
+186, 86,247, 83,250,186,129,163,221, 49,122,188, 32,214,102, 93,108,145,187, 98,112,171,235, 17,178, 33,122, 55,102, 45,188,203,
+112,155,246,233,113, 93, 43,212, 68,212, 11,235,243, 53, 26, 83,194,141, 55, 78, 9, 10,109, 19, 9, 33, 57,174,197, 16,105,219,
+148,203, 46,153,132, 23, 6,242, 67, 14,197,113, 85,106, 45,188,131,253, 90, 57,219,164,193,194,197, 20,203,204,184,162,114,138,
+174,215,236,140,199,116,157,178, 57,191,224,220,125,146,252,223,215, 75, 30,126,112,159,201,222, 57,207, 63,123, 13,109,158,225,
+167, 63,127, 21, 89,195,120, 58,167, 81,229,237,143,238,114,190, 90,115,177, 8,136,171, 24,215, 85,207, 27, 9,109,151, 26, 11,
+151, 2,135,212, 38,116,231, 61, 94, 35, 83, 73, 40, 68,219, 54,104,211, 37,239,249,174, 35,134, 14, 66, 96,100,132,132,218,252,
+ 43,208, 2, 25, 84,101,255,209, 93, 14, 14, 62,203, 97,229,185,243,120,201, 83, 71, 59, 52,205,148,211,213,154,123, 23, 13,211,
+ 90,120,243,227, 79,248,202, 11, 55, 8,157,112,122,177,164,174,107,154,186, 99,226,132,229, 58,176,183,218,240,242,149, 67,254,
+249,107,191,203, 91, 31, 63, 74,171,151,208,129, 56, 70,117,205,171, 55, 15,185,125,117,135,177, 68, 98,215,177,110, 2,171, 54,
+ 48,114,158,131,221, 57,203,213,138,221,201,148,102,181,161, 30, 9, 7, 71, 35,254,249,127,247, 63, 50,242,233,121,252,157, 15,
+ 62, 97,242,195, 15,249,169,191,250, 23,248,131,191,255, 27, 61, 23,196,185, 65,241,164, 3, 39, 21, 47,194,158,139,252,204,164,
+101,245,240, 29, 70,251, 47, 37,217,159,119,188,123,121,154,126,110, 85,179, 8,129,153,119, 76, 70,201, 9,112, 19, 58, 38,190,
+226,113,187, 98, 44, 21, 83, 87, 83, 57,184, 49,222,195,139,208,198,150,139,208,178, 92,119,116, 26,168, 84,232, 52,210,106,139,
+119,202, 89,183,224,176,154,226, 17, 14, 76, 19,127,178, 89, 48,245, 53, 27, 85, 62, 92, 4,158,158,116, 92,153,142,121,239,242,
+ 46, 95, 95,125,158,106, 50,173,146,235,152, 23,174, 3, 19,241,184,145,117,119, 57,166,201,129,243, 14, 49,108,214, 89, 90,131,
+118, 9, 54,161, 85,198,222, 89, 17,140,140, 85, 19,113,206,198,187,168,137,180,225, 67,242,175,214, 42,237,104,124, 20, 42, 36,
+121,143,123, 59, 84, 29,132, 32, 84, 30,198, 10,123,170,108, 72, 83, 42, 33, 21,188,181, 8, 39, 10, 87,205,200, 37,246,169, 11,
+153, 41,157,246, 82, 82,176, 30, 2,131, 12, 47,186,148, 74,149,189,172, 23,230,160, 54,137,106,187,245,129,116,119,213,193,216,
+220,214,122,137,143, 12, 80,123,236,137,109,105, 90,201,196,188,188,127,142, 5,196,158,209, 5, 74, 73,157, 29,150,254, 39, 16,
+218,120,130, 41,174,166, 76,184,170, 74,103, 86,155, 61, 35,223,224,237,153, 53, 6,174,216, 97,103,147,143,174,223,159,166, 98,
+224,141,233, 95,149, 18, 99, 63,164,111,229, 66,239,138,239,175, 2, 79,219,123,159,148,156, 3,155,204,235,226,250,120, 35, 42,
+230,213,196, 70,210,122,163,247,132, 47, 38,124, 45, 16, 11, 12,125,169,157,210, 70,225, 34,166,139,214, 23, 67,251,251,172, 59,
+207,187,208,140,172,100, 14, 67,229,156, 89,144, 70, 43, 94,105,159,222,134,228, 55,158, 59, 46, 49,235,216,188,162,201,127, 37,
+ 26, 45,112, 33,221, 79, 25,125, 8, 36, 82, 95, 48,214,161, 24,215,164, 85,237, 13,112, 84,225, 60, 42, 83, 73,132,191, 85, 17,
+150,211, 35, 34,162, 44, 66,100,213, 6,150, 40,139, 0,159, 25, 59, 70,151, 27, 46, 98,228,131,243,134,151,214, 11,106, 47,124,
+235,245,215,137, 33,153, 26,229,224, 19, 87, 24,183, 84, 67, 47,102,190, 2, 58, 72, 17, 37, 21,111,188,105,175, 81, 92, 76, 82,
+199,172,180,200, 62, 11,217, 71, 62, 90, 31, 0, 0, 32, 0, 73, 68, 65, 84,124, 38,244, 69, 80,251,189,122, 63,196, 68, 16, 63,
+100, 40,244,123,249, 72,178, 93,117,138,212, 19, 70,235, 51, 88, 41,231,199,199,156,156, 94,194,244,144,229,250,152,150,192,170,
+217,176, 89, 53, 56, 21,186,208, 17, 66, 68, 93,250, 89,109,103,208, 57,202,178, 9, 61, 65,179,114, 46,117,206, 68,234, 74, 88,
+ 44, 34,211, 73,197,102,221,178,142, 74, 19, 34, 58, 25,211, 53,107,124,149,190,151,183,247,158,154, 83,237,229,156,125,163, 25,
+139, 4, 58, 73,104, 71,236,178,243,162,237,218, 3,132, 16,136, 1,246, 38, 21,113,221,166,248, 98,132,118,221, 17, 84,240,146,
+ 38,247,208, 69, 98,151, 10,166, 87, 69,187,100, 99,151,209,185, 96,200, 72,237, 29,161,237, 24,137,178, 83, 11,235, 46,210,137,
+ 80,121, 77, 50,172,174, 98, 92,121, 66,179,198, 85,158,211,123, 15,113,116,204,166, 21,114,121,194,243, 55,166, 60,247,211,175,
+ 48,189,246, 28,250,225, 99,226, 3,135,171, 91,226, 76, 25,143, 70,124,233,165, 87,184,188,243, 35,226,166, 67,247,119,249,206,
+ 59,239,115,209,192,108, 50, 74,158, 13,149,103, 84, 37,199,187,208,117,180,155, 13,177,235,168, 80,188, 42, 93, 23,240,109,160,
+ 11, 29, 93, 27,112, 49, 82,197,148,199,238, 53, 13, 94, 81,211,125,100,118,162,198,101,114,232,197, 57,183, 94,152,243,209,163,
+115,174,204,199,220,125,124,194,181,189, 29,102,181,227,185, 91,135,124,116,178,100,236,107,222,252,240, 33, 95,126,225, 58, 59,
+227, 49, 65, 3,151,203, 53, 93,229, 25, 57,152,184,128,196,134,215,223,122,135,201,168,194, 69,225,252,114,205, 98,181,224,149,
+103, 14,121,233,198, 62,243,113, 77,219, 69,186, 54,176, 94,183,172,214, 27,246,247, 15,216,171, 97,111,238,168, 98, 71,215, 69,
+170,122,204,219,255,219,255, 78,124,255,125,110, 77,107, 68,224,173,243, 21,191,252,212, 1, 59,111,190,199,205, 87,190,192,221,
+239,191,217, 59, 41,150, 92, 43,197,130,173, 68, 13,249, 76,234, 2,191,217,176,104, 87, 4, 75, 56,108, 66, 32, 84, 53, 93, 84,
+206,187, 53, 15, 54,129, 89, 85, 83,225,144,232,185, 57,157,114,222, 54, 4, 13,140,125,197, 50, 52, 92,116, 29, 51, 95, 51,247,
+ 21,171, 24,168, 36, 69, 22,206,188,163,141,129, 38, 6, 98, 84,238,111,150, 28,212, 9, 53,239,136, 76,157,167,213,150,243,174,
+ 99,207,215, 28, 55,107, 30, 53, 13,207, 76,246,217,108, 22,248, 95,123,118,255,111, 57, 28, 75, 85,246,213,160,163,218, 81,187,
+ 42,249,253, 90, 2,151, 0,149,175,122,114, 78,237,146,179,152, 51,141,171,243,206, 36,103, 9, 14, 22,163,210,247, 80,179,201,
+154,134, 73,210,177,148, 1,222,205, 83,151, 51, 72,117,236, 96, 68,122, 88,198, 34, 28, 10,169, 73,112, 98,251,251, 52,217,141,
+ 12, 98,207,147, 92, 45,169,144,120, 39,246,103,244,210, 22, 47,218,239, 0,189,193,252,181,164, 93,139, 26,129,171, 6,174, 56,
+120, 90,224,154,253,190,246,146,160, 94,103,215,199,126,173, 37,173, 33,114,129,169,220,176,162,200,113,160, 9,130,177, 63,115,
+121, 53,144,254,253,200, 57,170,254,181,219,117, 21,199,200,156,233,188,189, 39,143,244,144,187,104,186,190,149, 24,156,111,176,
+240, 68,132, 49,121,210,117,189,199,181, 43,160,245,158,115, 96,123, 85,135,176,148, 68, 20,203, 43,138,173,221,183, 93, 91, 87,
+236,234, 15,141, 84,151,215, 5, 34,219,176,123,101,215,213,219,207,170,141,104,153, 36,120,112, 32,176, 67,250,117, 79, 18,235,
+125,150,153,215, 69,250,151, 24, 44, 63,246,194,218, 10, 83,134,255,115,231,236, 4, 11,228,128,185, 23,118,237,250,247, 15,100,
+ 79, 10,148,222, 61, 44,218, 58, 41,195,238,209,188,209,123,104, 54,239, 93,123, 14,196,128,232,116, 10, 75,107,228,206,186, 68,
+162,219,241,210, 95,183, 78, 19,122,225, 12, 57,137, 8, 27,155,248,157,221,255,249,126,119, 69,179, 71,209,216,100, 6,249,185,
+ 17, 65, 37, 38,211, 37,177, 38,192,217, 33, 34,189,204, 51,193, 80,222,160,190,236,229,222,239,187, 51, 89, 80,182, 67, 87, 6,
+ 95,227, 84,128,196,144, 47, 39, 3,154, 66, 17,195,235,101,176, 72, 77, 94,234, 6,237,187,116, 93,131, 33, 58,153,164,186, 90,
+173,168, 46,143,105, 46, 31,113,255,225, 61, 86,139, 21, 15,126,244, 54, 93,136, 44,151, 75,150,103, 75, 98,108,233, 98, 67,212,
+ 14, 25, 57,226, 38, 77,221,222,140, 98,188,192,168,182,117, 96, 45,212, 36,255,241,113,157, 14,254, 86, 97, 84, 9, 77, 80, 46,
+ 55, 29, 77, 39,232,122,205, 58, 70,154,144,114,196, 91,235,106,187, 66,205,226,236,158, 17,123, 24,242,125,144, 17, 61, 3, 19,
+251,166, 58,118,145, 54, 64, 37, 62, 73,123, 5,154, 54, 18, 99,100,101,166, 70, 85,239,204,151, 63,107, 75,121,203, 81,182,153,
+123, 99, 95,239, 43, 65, 59,237, 99,130, 35,233,153,174, 36,249,207,139, 36, 40,190,174, 60,116, 1,223,182, 92, 57,156, 32, 26,
+169,187,134,207,124,227,103,240,251, 87,208,198, 65,211,208, 92,172, 89, 94, 28, 51,217,219, 69,198, 83,154,197, 37, 50, 59,224,
+252,211, 59,140,199,115, 94,120,254, 5,102,205, 25,143,239,159,176,227,148, 81, 8,184,118,131,111, 26,220,106, 69, 88,172,136,
+235,134,184,222,176,186, 92,209,174, 55,208, 52,208,118, 72, 23,168,236,138, 84, 98, 48,189,173,180, 18,135, 40,221,205,206,200,
+200,117,136,124, 60, 63,100, 60,169,137,161,101, 50, 30,211,117,145, 85,219,113,190, 94,115,117, 54,198,123,199,180,246,156, 45,
+147,161,205,233,229,130,197,106,195,164,114, 60,181, 59,226,246,245,235,156, 93, 94,242,207,190,253,125,230, 46, 89, 4, 55,237,
+146,227,197, 37,191,248,133,103,248,204,205,171, 76,199,158,179,203, 13, 15,207, 87,156, 44, 87,204, 71, 19,118,119,230,220, 58,
+218,163, 18,184,247,224,148,113,132, 31,253,175,127,151,227,247, 63,100, 35,112, 99, 62,230,131,139,142,155,211,154, 80, 59,228,
+114,205, 31,251,153,111,240,246, 15,127, 48,168, 67,164, 80,234, 60, 65,140,207, 5,255,176,121,196,254,100,159,247, 55, 99,130,
+ 83,188,140, 24,251,154, 24, 55,120,169,248,217,171,175,240, 82,181,225, 81,187, 66,188,231,164,221, 48, 98,132, 35,114,214,172,
+ 24,185,154,131,186,230,188, 93,211, 1,149, 56,246, 42,207, 42,116,204,252,184, 31,166,246,235, 49,215,199, 83,118,235, 58,169,
+ 85, 68, 88,134,142,141, 53,219,139,152,248, 19,183,166,187,172,186, 22,183,154, 80, 73, 16, 84, 34,187,226, 24,213, 32,211, 10,
+239, 42, 66, 8,120, 73, 58, 42,223, 7,168, 43,222,167, 92,174, 16,186,100,226, 97,169, 70, 17, 24,121,215, 23, 92,186,152, 24,
+152,201, 96, 57, 17, 79, 80, 36, 42,170,177,183,128,221,248,204,146, 77,120,111,212, 52, 45, 70, 11,238, 8, 65,168, 28,116, 81,
+184,230, 19,147,254,130, 4,155,173, 20,118,141,221, 35,214,125, 43, 66,109,251,189,206,246, 86, 89,131,235,122,253,180,193,108,
+ 6, 90,143, 60,236,154,231, 53,213,224,107,173,198, 14,207,112,120, 52,137, 87,134,161,179, 0,215,121, 99,207, 27,137, 77,123,
+105,159, 24, 44,154,255,254,199, 13,106, 68,237, 64, 48,121, 73, 93,216,118, 6, 29, 60,213,123, 29,165, 85,220, 96, 29,114,204,
+ 86,177, 12,211,177,160, 5,129,170, 72,214,210,109,195, 28,103, 5,118,165,121, 90,211, 30,174,206,214,172, 90, 56,132,169, 17,
+ 4,131,193,221,165, 60, 46,115, 14,194, 79, 98,228, 23, 82,189, 50,178,179,112,253,181,247, 59, 68,232, 86,154, 52,206, 83,159,
+180,254, 39, 58,188,102,201, 12,250, 60,165,102, 83, 28, 39, 91,242,148,172,119,246, 94, 18,148,107,220,111, 53,109,106, 52, 29,
+116,204, 19,167,166,146,234,140,204, 40, 81, 7, 11,211, 46,153,203, 84,170, 76,172,248,174,128,139, 78,217,171,210,189,157,185,
+ 3, 42,131,229,106,242,155,215,129,144, 89, 56,170,229,247,210, 50, 40, 45,214,209,144, 1,107,140,150, 12,215,218,153,165,105,
+225,175,212, 31, 59, 57,105,172,255,254,133, 7,190,115, 37,121, 81,251,192,161,188,214, 8,237,246,235,234,101,111,197, 33,166,
+106, 36,215,194, 19, 72, 11,187,216,124,207, 86,146, 73,165,240, 7,191,255, 30,149,255,128, 73, 93,113,126,209,208, 86, 53,135,
+ 59, 31, 51,155,214, 76,118,167, 73,222, 55, 26,209,109, 90,180,117, 68, 2, 85,149,248, 60,155,203, 6, 63,118,172, 54, 29,123,
+ 59,137,232, 53, 25,215,104, 8,140,188,167,139,202,129, 75,231, 80,140, 30, 79,228,218,124, 70, 8, 13,235,166, 75,197,127,232,
+ 91,122,100, 72, 92,118, 20, 76, 46,151,130, 82, 85,233,139, 98,199,150,100, 16, 67,105, 40, 34,157,187, 54, 77,227,138,169,121,
+ 84,112, 18, 77,246,152,204,126,180, 17, 66, 48,131, 39,151, 82, 10, 53, 67,125, 42,196, 54, 38,119, 63,227,184,212,146, 16,152,
+ 70,211,154,167,242,105,213,160,109, 3, 84, 84,149,231, 98, 29,104,207, 79, 97, 54,229,232,169, 91,232,254, 62,122, 25,147,219,
+ 92,229,211,121,184,114,236, 44,215,184,217,140,216,181,200,120, 66,179,129, 16, 26, 22,167,143,217,191,245, 28,254, 7,239,209,
+ 94,122,186, 24, 7,103, 76,107,100, 37, 68,196, 26, 90, 40, 26,123,179,254,142, 50,112, 56,176,179,206, 57,233,137,152,217,148,
+ 40, 10,248,213,130, 31,220,121,192,231,158,127, 26,191,233, 96, 58,230,112, 84,177,232, 58,238, 31,159, 49,118, 48,159, 84, 56,
+129, 77, 80, 58,148,182,221,112,124, 82, 51,171,110,176,216,192,155, 31,188,197,184,118,120, 34,235,118, 73, 12,129, 89,237,120,
+124,126,193,254,172, 78,100,190,174, 99,185,105, 89,173, 54, 76,171, 49,175,222,190,193,199, 31,188,207,143,254,224, 13,110, 60,
+252,144,179,216, 20, 14,162,202,249,122,201,207,222,152,115,255, 50,242,112,185, 97,181,233,152,252, 95,255,140,175,254,251,191,
+194,119,255,193,255, 67, 78,229,205, 3,105, 44, 29, 72, 25,206, 79, 5, 62,215, 61,224,223,253, 89,207,255,249,189,192,253, 14,
+102,206,241,125,119,155,231,103,123, 60, 27,239, 83, 93,124,192,159, 1, 22,177,226,141,234, 58, 43, 39,204,170, 25,227,198, 51,
+173, 60, 77,232,120,106, 60,227,128,134,103, 71,202,199, 11,199, 39, 45,156, 54, 75, 34,137, 95,163,116, 56, 28, 47,213,135,252,
+ 92,181, 98,191,106,185,235, 43, 94,107, 59,212, 7, 54,209,211, 70,120,220, 42, 55,252,156,175,124,238, 54, 21,149, 39,198,200,
+142, 42,212,158, 74, 28,161,235,250, 3, 68,109,119, 38,189,121, 75, 52,107, 71, 33, 86,201,242,206, 27,220, 30,205, 34, 21,146,
+115, 92,154, 32, 20, 85,103, 80,166, 38, 29,116,116,228,111, 56,118,137, 97, 26,173,235,110, 99, 26,173, 29, 74, 75,218,135, 85,
+ 36,187,200, 77,132, 29, 15,123, 81,120, 96, 39,250,218,152,240,153,121,221, 9, 61,139, 62,168, 36,136,216, 76, 54,212, 78,194,
+154,244, 48,102, 25, 71,232, 64,170, 33, 27, 58, 74,214, 47, 90,134,178, 77, 97,222,167,155,186,202, 78, 68, 36,253,120,200,135,
+ 89, 46,138,246,122,186,172,127,213, 66,206,101, 19,146, 26, 92,231,220,144, 99,237,164,152, 14,236, 80,245,110, 96,164,111, 17,
+163,242,222,219,200,101, 91,190,233, 78,135,162,156, 11,189, 75, 19,121,173,195,251, 11,154, 12,108, 78,115,168, 9, 67,166,122,
+180, 59, 57,107,151, 51,156, 95,194,241, 82, 76,156, 53, 67,200, 76, 14, 3,201,135,191,127,130, 63, 32,229, 78,189,128,206,243,
+ 67, 84,185, 97, 69,209,198,180,243,175,172,121,171,172,249,240,121, 71,172, 73,127,235, 84, 18, 81,199,185,190,113, 82, 45,229,
+254,150,208, 85,178, 93, 13, 50,244, 46,169, 56,188,221,179, 65,237,192, 50,155, 83, 15,180, 46,177,194,167,249,189,218,231,218,
+136,224, 66,114,182,187, 80,237, 85, 6, 3,159, 34, 85,187,206, 56, 13,101, 65,118, 12,242,177, 76, 34,220, 19, 88,202, 64,164,
+140, 10,109, 27,153,140,164,160,139,104, 79, 6,139, 90,124,246,206,118,201, 49, 53,198, 82,236,126,196,144,141, 12, 47,246, 72,
+ 70, 70, 49,138, 66,237,101,152, 48, 67, 97,174, 36,170, 67,152, 75,230, 70,152, 33, 84,230, 84,228,162,159, 81,145,179, 46,242,
+193,122,131, 15,176,211, 53,124,186, 6,213, 53, 94,206,105, 52,113, 48,214, 49,145, 34, 27, 6,174, 73,120,194,127, 33,228,148,
+ 69,148,218, 9,123,206,177, 55,242, 76,106,207,205,195, 57, 83, 17, 62,248,244, 33, 7, 46, 21,116,162,210,201,224,128,104, 30,
+ 61,212, 12, 43,178, 92,213,210,170, 86,183, 89,253,214, 16,229,207, 73, 69,104, 67,100,100,193, 50,185,201,205,102, 75,209,138,
+116,232, 44,175, 62, 26, 50, 36,105,175, 30,109,192,137,125, 3,150, 72,116, 41, 30, 57, 25, 59, 5, 28, 26,148,186,118,140,170,
+ 72, 8,208,109, 90,170,218, 39,100,201, 85,196, 85,203,236,250,211,189,201, 12,209, 27,227,189, 5, 55,162,221, 44,169,186, 25,
+170,145,205,201, 5,211, 43,251, 52,203, 13,110, 44,140,199,202,149,163, 61,206, 30,157, 80,227,240, 6,161,247,197,216,222,183,
+ 47, 62,227,220, 8,149,196,201,222,180,165, 24, 93, 59, 77,107,147,218,194, 94,228,236,140,209,120,135,215,223,250,128,207, 28,
+204,249,249,112,204, 15,143, 94, 96, 62,159,161, 97,202, 98,189, 97,177,110,112, 50,162,197,179, 51, 27, 51, 25,239,176, 89,158,
+243,193,253,115, 94,121,105,202, 31,125,252, 9, 59,149,163,242, 35,118,240,116,245,136,105,213,242, 91,127,244,136,191,242,167,
+160, 11, 77,207, 33, 57,185,220,112,251,208, 35,247,223,227,141,127,244, 15,121,222,208,188, 32, 3,210,152,145,183, 59,167, 11,
+158,187,178,199,253, 79,150,184,153,231,241,102,197, 87, 15,175,243,109, 77,207, 76, 62,163,202, 1, 76,115, 74,161, 14, 86,199,
+ 59, 71,112,231, 94,224,184, 77,196,222, 27,147,200, 95,254, 19, 31,242,189,223,169,233,206,218, 94,194, 58,211,142,229,178,229,
+251,237,154,202, 7,214, 93,210,137,237, 75,197, 21,239,248, 19,163, 19,104,224, 66,103, 76,165,166,209,192,216,124,250, 85, 59,
+246,253, 24,207, 25, 87,184,100, 20,148,207,146, 50, 36, 78, 36,240, 48,180, 28, 84,107,142,170, 11, 94,253,252, 47,241,135,223,
+253, 46,149,183, 32, 12,169, 61,222, 37,237,165,115,201, 46, 37, 31, 12, 98, 58, 94,130,237,217, 36,193,231,201,242, 49, 26,188,
+231,112, 33,117,160,174,210,148,139,220, 73,175, 91, 85,159,152,201, 18,149, 80,199,254,144,203, 48, 88,244,138, 55,241,184,184,
+ 72,140, 48,245, 41, 88, 36,154,149,149, 86, 41,194,145, 42,133,204, 28,171, 16,253, 16,253,216, 5,225,210, 96,231,169,153,232,
+148, 33, 37,105,135, 43,201, 99, 93, 7,239,107,231,146,172,167,179,169, 78,236, 31, 85, 22,187,154,167, 80,103,164,186, 28, 61,
+ 30,204, 42, 51, 31,158, 89,182, 22, 53, 57,158, 85,126,208,162, 71,172, 27, 22,151,136,118, 86,156, 58, 29, 66, 47,250, 0,173,
+ 98,146,206,134, 55,244,250,117,221,130,135,156,237, 10,209,237, 46, 50,203,147,156,125,142,217, 9, 84, 92,250,194, 78, 6,103,
+176,126,207,111, 48,108,106,201,135, 7, 27,209, 94, 46,183, 46, 50, 47,134,181,193, 80,160,137, 9, 54,215,194,245,172,223,175,
+ 23, 14,124, 63,246,239, 13, 38,175,116, 40, 88,185,200,143, 51,188,239, 6,213, 67,246,187,239, 97,103, 75,113,203,211,167, 98,
+201,129,246,208,227,211, 97,236, 43, 71, 23, 98, 58,148,109,138, 13, 6,201, 39,155,227,212, 33,183, 93, 42,226,181, 75,118,196,
+ 77,201,240,215,196,193,136, 40,173,170,161, 8, 74, 99, 97, 63,137,100, 57,228,120, 71, 67,187, 50, 3, 59,218, 5,201, 43, 11,
+ 41,204,138,156,131,221,152,222,243, 44, 14,166, 67, 49, 14,142,114,253,125,145, 81,170, 76, 18,180, 2,175,230, 1,239, 68,141,
+ 64, 40,253,189, 62, 16, 51,181,160,116, 14,254, 6, 57,160, 73,204,214,184,180,147,197,136,163,153,152,168, 58,160, 63,117,206,
+144,208, 33,131, 97,236, 97, 71,225,104,148, 96,112, 85,232,218,244,124, 52, 49,173,101, 42, 75, 12,172, 99, 82,118, 56,151,254,
+ 44,115, 39, 50, 47, 37,216,222,187,209, 52,197,222,211,192,186, 11,140, 29,156, 94,174,250,117, 80, 24,167,117, 72, 39,137,120,
+ 22,157, 20,104,146, 20,254, 13, 41, 39, 32, 39,209,161,153, 93, 97, 68, 85,221,246,190,119,198,206,204, 41,143, 89,226, 39, 12,
+159, 77, 20,187, 31,205, 15, 33,230,168, 99,151, 78, 0, 17,233,165,147, 77,167,248,218, 17, 68,232, 4,218, 78,233, 72,254,181,
+ 93, 23,241,222,225,124, 76, 73,131, 26,137, 93, 10, 92,153, 77,119,137, 59,187,200,250, 18, 90, 69,169, 32, 42,193,193, 58,116,
+ 56,173,208, 78,232,214, 27,214,171,200,228,224,136,139,143, 63,162,174, 61, 77,219,178,174,199, 44,227,112, 51, 72,129,202,185,
+162, 88, 15,233,142,219,126, 23,189,179,102,164, 63,223, 40,207, 28, 15,203, 32,252,112, 5, 31, 93,222, 99, 58,154,242,239,156,
+223,197,199,150,175, 94,252, 97, 82, 77,248,154,227,233, 33, 15,235, 41,241,230,211,104, 50,210, 96,209,117,188,243,112,193,115,
+135, 87, 65, 28,161,105,185, 49,159, 39, 4,108, 62, 97,177, 94,178,214, 17, 79, 31, 93,229,127,250,167,111,240, 23,190,241, 44,
+ 62,180,204, 93,224,214, 92, 16, 55,226,185,207,222, 30,172, 20,204,227, 36,216, 42, 52, 39, 12, 86,192,199,143,206,249,133, 47,
+ 63,195,119,223,122,204, 93, 7, 47,190,254, 6,211,201,140,229,114, 73, 83,160,141, 89,208,145,209,178, 14,216,219,131,221,107,
+ 32, 53,124,251,125, 56,239,224,133, 29,184,125, 0,151,199,208,174, 90,212, 21, 9,134,182, 74,156, 24, 71,104,234, 29,129,200,
+190,192, 23,125, 75, 27,210,103,112,232, 86,188,232, 39,124, 63,182,204,164,226, 84, 91,118,253,148, 25, 13,215, 36, 38,100,220,
+158,135, 91, 62,112, 12,236, 41, 44, 34,220,244,240,170,252, 19,218,182,166, 66, 5,169, 52, 73,211, 36,226,240,137,205, 41,158,
+168, 70,227,178, 67,177,167,202,136, 16,218, 46, 21, 71,155,214, 53,167,126, 72, 28,224, 24,243,218,118,142, 68,170, 67, 44,225,
+ 77,168, 17,162, 11, 3, 59, 59, 38, 2,208, 88,180,152,170,134,120, 73, 68,104, 80, 90, 47, 76,173, 56,140, 85, 25,171,177,142,
+ 21, 86,149, 82,217,135, 48, 47,111, 52,155, 74, 92, 49,233,120,155, 66,146,117,101,130,171, 43,211, 57, 85,222, 28,167,156,117,
+176,118, 88, 71,236, 70,206,158,240,190, 15, 62,178,212, 47,240, 86, 73,130,104,138,116,180, 98, 19,237, 6, 9, 36, 13,108,107,
+242,150, 11,115,247,218, 69,217, 97, 56, 68, 66, 1,249,248,173,225, 82, 6,121,146, 21,207,170, 48,205,200,205,129,194, 64,104,
+176,207,208,185, 1,206,175, 52, 29,162, 93,150,150, 37,179,169, 45,243, 25, 87, 22, 91,123,224,243, 13,223, 20,123,247, 57, 48,
+210, 33, 62, 83,216, 70, 23,226,147,196,191, 76, 44,236, 25,214,130, 22,133, 59, 71,171, 22, 36,108,246, 81, 86,118,232,102,142,
+135,239, 73,117,244,106,133,168,195, 78, 91,179, 65,139,100, 86,119,122,208,189, 79,174,113,206, 13,171,148, 60,181,122, 73, 38,
+ 71,106, 69,100, 25, 97,233, 5, 31, 18,236, 94, 27,202,130,105,217, 61,218, 27, 23, 85,146, 21, 17,186, 53,169,231,215, 26,178,
+241, 76, 28,174,129,232,160,202, 64, 97,105,197,162,211,116, 15, 87,209,166,193, 14, 92,157, 77,132,172,240,218,148,149,239,173,
+104,247, 82, 79,250, 42,194,132, 74,158,129, 56,147,109, 25, 95, 2, 87, 4,175,232,128,182,248,194,116, 41,203,195,186,220, 64,
+ 90, 17, 76,113,199, 67,211, 87,134,183, 72, 49,185,227,134, 4, 55, 52, 61,119,249, 62, 81, 96,238,134,162,161,190,240,153,135,
+173,207,154,110, 72,108,219,210,205,219,174,127,142, 90, 26,158,145, 17,213,194,111,236,135, 69,151, 6, 5,103,250,252, 46, 14,
+141,160,160, 67,254,129,125,243,152, 99,133,237, 30,113, 50, 68,203,170, 17, 18,181,183,226, 77,124,135,124,191,101, 85,138,203,
+ 25,137,226,232, 66,250,217, 21,105, 47, 31, 68,210,127, 86,116,218, 46, 36, 23,187, 24,211,174,218,200,154, 82, 9,109, 19,104,
+103, 21,225,228,152,230,228, 4,223, 86,184,170, 38, 32,156,159, 47,160,142,172, 86, 27,244,252,132,205, 38,176, 94,119,140,231,
+ 51, 54, 93,131,211, 41,237,229, 5,171,233,156, 15,215,214,164, 12,219,188,158,104,233,123,182,183,246,163,144, 24,122, 22,187,
+164,109,143,246,108,118,113,136,240,189,148, 26,246,175, 48,175, 91,254,197,157, 11,206,180,229, 27, 71, 7, 28,156,124,146,188,
+ 70,101, 72, 91, 28,105,203,245,243,251, 92,143, 16, 30,126,192,247, 71, 83,238, 78, 15,121,230,233, 27, 60, 59,159,243, 31,254,
+217,111,242,247,255,239,223,224,233,153,176, 55, 85, 36,180,184,230,130,163,205, 37,179,110,195, 81,179,100,252,254,130,247, 63,
+120,131, 7,159,125,145,166, 30, 81,171,242,213,103,246,184,123, 25,248,197, 95,248,183,184,243, 91,175, 33, 85,186,242,206, 12,
+121, 92, 70,224, 76,182, 20,230,115,174,204, 79,185,123,222,176,222, 44,153, 95, 57, 96,181, 94, 34, 53, 52,164,220,136,176,232,
+ 88, 3,183,106,144, 49,132, 67,120,233, 69,248,237, 63, 20,100,164,188,250, 5,224,189, 68, 63,248,220,243,240,246,191, 74,131,
+ 31, 33,153,162,229,231,250, 21,127,198, 59,237, 12, 47, 13, 81, 19,226,131, 40, 7,186,160,203,171,177,168, 60,205, 5,151,126,
+194,134,138, 51, 93,179,139, 48,142,158,219,254,130,209, 20,218,101,122, 86, 47, 28,248, 26, 62,109, 82, 83,220, 5,168,142, 4,
+ 31, 90,170, 30, 87, 55, 83,151,160, 93, 79,123, 22, 73,174, 91,206, 22,229, 98, 7,176,104,239,176,222,159,218,206,168,228, 49,
+164,221,181,102,154,117, 97,121,168, 49, 18, 53, 90,162,147,237,180, 37, 61,132, 41,230, 49, 38, 57, 73,200,141,114,218,167, 59,
+211,209,122,201, 16,200,144, 64,166,177, 40,184,185, 8,196, 1, 22,170, 76, 51,234,158,200,249,238,161,112, 59,137, 84,212, 10,
+151, 21,155, 98,202,204, 55, 35,174, 56,232,138,189,183,207,133,193, 37,246,111, 46, 92, 46,155,227,216,161, 89,187, 36,243, 19,
+171,150, 19,133,163,204,180,215,194, 0, 67,210,235,142, 49, 31,150,217, 99,125,216, 79, 71,217, 54,248,210,162,136, 86, 36, 56,
+ 79, 36,145,133,156,233,229, 51,246,234, 76,126,215, 70, 88, 59, 11,217,208,212, 77,102, 19, 25,149,129, 5,159,119,242,253,190,
+152, 33,115,251,168, 64, 21, 68, 11,199,180,226,235,188, 22, 12,245,226,250,215,217,229,206,253,120,241, 47,217, 41,193,193, 28,
+161,147,161,202,187, 94, 59, 47,125, 88,137, 35, 29,170,209,238, 71,151, 67, 90, 44,210, 83,109,111, 48,164,206,165, 67,171, 11,
+209,220,214,146, 85, 40, 70,178,108,128,115, 77,177,163,149, 42,181,125,255, 0, 44,172,176,186,173,207, 96,200,227,206,216, 93,
+ 46,100,153, 89,159, 45,232, 43, 25, 80, 36,239,100,139, 25,159,175,103,229, 6, 27, 87,151,227, 71,157, 77,199, 69, 80, 80, 14,
+ 67,201,211, 73,249, 89,104, 31,185, 59, 88,186,198, 66,199, 29,237, 0,170, 44,156,133, 66,221,213,233,182,129, 80, 86,192,139,
+232,150, 77,173,133, 24, 39,226,148, 49,229, 93, 1,233,151,188, 10,111,107,140,122, 52, 16,210, 74, 71,175, 88, 10, 89, 92,113,
+191,219,125, 93, 46, 58,251,112, 37, 55, 60,168, 99, 47,140,173, 49,172,179,172, 44,199,137,155,199,129,235, 17, 42, 43,246,121,
+165,227, 6,191,231, 88, 24, 50,249,130, 63,146,205,122, 52,216, 26,203, 94,112,180,208,153,254, 1, 40,252, 0, 8,209,160,223,
+ 20, 71,157,213, 4, 53,174, 87, 17, 84,226,146, 9, 14, 16,219, 36, 23,118, 26,204, 9, 81,113,157,114,126, 17,232,170,134,205,
+ 7, 15, 56,127,124,204,229,229,165,169, 19, 2, 46, 8,163,113,205,167,159,108,216,223, 29,227,234, 49,209,213, 44,219, 5,199,
+ 23, 75,198,139,142,249,238, 46,163,195, 61, 62,110, 98,239, 93, 81, 89,193,246,110, 32,201,142, 10,178,164,151, 33,153,207,153,
+ 97,146,100,197,131,157, 75,162,112,184, 91, 67,115,194,225,243, 47,241,231, 14, 61, 63,120,231, 45,206, 31, 62,226, 20,229,219,
+157,240, 76,165, 60,180,161,161, 65,120,250,169,219,252,238,221, 79,121,121, 54,226, 79,191,248, 89,226,115,183,248,219,191,249,
+ 59,252,218,175,252, 10,127,231,191,254,207,121,189,122,138, 95,110, 63, 37,154, 49, 85,206, 15, 80, 39, 44, 37,173,195,110, 76,
+198,140,191,255, 38, 46, 42, 31,118,194,239,253,224, 93,254,105, 55,226,175,255,197, 95, 66,221,107,140,167, 19,220,168, 66,196,
+ 51, 59,216,199,213,158,157,163, 67,118,175, 95,101,178,187,139,171, 91,214, 39,103, 28, 47, 79, 56,125,188,226,133, 87, 31,241,
+249,167,224,219, 63,130,135, 43,229,232, 10, 92,236, 8,171, 99,229,119, 91,184,177, 3,191,246, 69,248,222, 59, 80, 79,149,229,
+ 6,218,247,225,203,215, 96, 83, 65,104, 96,127, 31,154, 13,108, 86,219, 74,160,169, 68,118,165,194, 81,243, 40,174,104,169,217,
+ 85,104, 93,205, 84,155,190,150,206,104,249,156, 58,206,213,243, 32,206,241,174,225,155, 87, 47,210,115,110,241,229,135, 35,240,
+107,120,169,134, 23,191, 1,247, 34,252,189,223,133,199,247,172, 46,253,230, 31,191,173,162,130,247, 62, 25, 76,152,113,139, 72,
+ 98,179,187, 30,127,147, 65,247, 29,213,246,143,253,246, 21,141, 17,241,206, 92,137,204,173, 42, 70,211,111,134, 68, 22,242, 36,
+ 9, 66,134,126,132, 36,137,195,140, 28,212,136,116, 46, 89,193,198, 24,211, 14, 44,127,141,164, 66, 87, 89,209, 89, 27,219, 94,
+ 25,216,199, 98,114,166,153,237, 71,114,113,206,211, 74,206, 20, 39, 22,161, 76, 38,197,131,109, 87, 45,205, 89,212,206, 32, 69,
+243,161,110,181,136,186, 20,233, 59, 86,124, 34,199,196,152,152,209,157,166,169,163,138,219,112,142, 47, 36,100, 81, 6, 22, 89,
+ 40, 96,193,193, 33, 78,183,114,127,179,103,186,151,109, 67,144,152,167,143, 62,250,148, 33,199,218,214, 6, 29,131,190,190, 69,
+105, 67, 42,152,143,227,118,202,154, 43, 44, 99, 51, 97, 74, 11,191,113,117, 48,142,176, 87, 76,152,177, 32,214,148,214,161, 79,
+250, 7,184, 18,134, 47,164,131,121,114,210,130,165,173,110, 91,250,215,217,245,150, 98, 74,115, 5,233,236,200, 11, 99, 51, 69,
+138,182,234,224,137, 29,160,154,106, 32, 90,113, 70,135, 92,237,126,186, 50, 22,251,105, 72, 82,198, 24,149,218,214, 69, 65,149,
+ 85, 76,107,136,114,154,140,133,119,191, 60,145, 88,167, 69,192, 16, 69, 92,173, 74, 74,165,235,205, 96,138,154, 48, 17,216,103,
+216,225, 59, 82,103,142,203,174,123,186, 93,104, 92,134, 82,135, 84,187, 60,141, 33, 50,172,117,156,177,220,173,145,238,225,230,
+162,152,150, 90, 74,141,244,249, 15,253,250,160,128,106, 93, 89,148,251,107,169,101,116,129,101, 51, 12,133, 91,139,103, 47, 20,
+ 13,114, 44,214, 65,250, 4, 89,171,191,166,193, 2,108,138,134,198,101,143,121,129,105, 37,204, 19,147, 17,103,202, 4, 12, 97,
+163, 63,219,204, 50,215,222,176, 20,205, 98,254, 28,242,144,227,178,119,132,105, 88,189,157,131, 33, 24,159, 32,251, 68,184, 1,
+134,114,162,253, 36, 31, 98, 25,180, 68, 31, 7,219,217, 51,182, 54, 34,202,198,226,108, 91, 59, 59,130, 53,152,121,253, 23, 66,
+ 58, 55,174, 28,204,216, 4,229, 96,103,194,254,222, 46, 46, 4,218, 77,195,168,114,172,150,107,198,147,154, 54, 4,154, 46,208,
+118,145, 81,237, 89,172, 59, 30,174, 90,150, 81,121,247,241,146, 40,137,240, 57, 20,112,233,163,181,123, 85,137, 12,196,199,140,
+ 0,250,114,231,158,125, 53, 50,247, 64, 6,226,234, 38, 42,159,180, 38,227,140,195,243,157, 27,197, 87,159,189,206, 81, 83,241,
+238,230,130, 63,117,251, 26,187,123, 71, 84,251,115, 94,124,225, 51,196,157, 49, 65,225, 47,253,247,127,143, 87, 63,247, 37,254,
+218,171, 71, 28,183, 74,236, 26,186,197,130, 14,101,134,242,255,126,231, 93,126,246,139, 47,242,229, 47, 62, 15,178, 78, 33, 54,
+179, 25,218, 53,252,167,255,224,117,254,135,255,224,167, 9,109, 76, 76,175,106,148,116,246,171, 85, 98, 53,111, 86,168, 38, 77,
+202,157,127,253, 61,238, 60,190,228,243,183,158,227,218,139, 31,242,123,191,213,242,105, 11,199,192,157, 13,236, 78,225,178,129,
+233, 12,254,230, 95,133,147,111,193,183,222,132,187, 45,236,239,192, 51,192,222, 1, 28,237,193,238, 4, 62,188, 11,223,249, 20,
+158, 57,244,172,238,133,190,177,142,192,194, 85,252,197,159,234,120,235, 93,248,116, 3,127,230,167,225,206,189,100, 88,117,185,
+ 72,255,205, 39, 48,159,193,179, 7,176,218,164,115,230,116, 41,184, 29,225,173,143, 35,218,194,205, 93,152, 77, 97,231, 16, 78,
+ 47,225,185,231,210,121,117,109, 23,254,229, 63,130,170,107, 99,218,237,196,206, 44, 79,179,182, 53,251, 70, 15,123, 85,177, 39,
+ 81,140, 77,140,177,217,197,187,244, 0,231, 24,209,220,217,229,246,207,110,138,204,158,173,164,100,236, 40, 26, 98,255, 32,137,
+ 75,112,181, 71,241, 57, 22,209,219, 30, 20,139, 50,181,105, 37, 63,112, 89, 27, 92,229, 18,100,238, 1, 9,174, 76, 55,159,198,
+ 68,210,235,209,131,173, 41, 32,253, 44,205,133, 82, 6, 13,171,214,185,219, 54, 66,149,237, 41, 85,134, 93,183,183,226, 29, 67,
+ 68,213, 37,130, 68,149, 26, 11,215, 71,180,166,201,165, 39, 19,161, 91,251,246, 12,211, 58, 51,246, 8, 5, 75,220,217,142, 54,
+ 7,100,136, 29, 56, 72,177,143,181, 41, 82,101,219,132, 70,117,128,212, 70,182, 19,239, 44,165,170,118, 73,106, 54,118,112, 63,
+235,246,227, 48, 93,107, 97, 64,146, 93,229,118, 44,193, 79,101, 43, 62,187,215,252, 11, 3,212, 26, 10, 41,156,150,178,186, 30,
+105,208, 45, 84, 67,217,102,105,171, 14,147, 83, 46,228,209, 96,204,188,190,232,175,155, 77, 75,121, 47, 44, 78,136, 33,246, 76,
+188,124,157,189,232, 22,139,187,143,137,213,100, 39,235,156,112,177, 9,201, 23, 65, 64, 66,100,156,201,154,118, 47,117,164,169,
+ 61, 50, 20,181,232,134,195, 63,234, 19, 44,245, 66,243,223,103,143, 23, 44,117, 74,212,168,248,218,214,212, 27,163, 39, 51,232,
+ 85,123,116,163,111, 20,182,138,187,246,240, 56, 3,233,186,231, 75,196, 66,250,166,197, 7, 84,198, 2,244,191, 47,120, 41,165,
+ 97, 80,138,238, 29, 14,245,252,231, 93,102,219,235,112, 61,164, 48,127, 82, 67,137, 92,225,218,151, 95,155,152,247,190, 20,225,
+ 48, 90, 56, 20,198,242,190, 46, 50, 18,242,189,217,228,215, 29,210,138,101,251,122,202,118, 0,142,108, 27,210, 72, 65, 62,205,
+ 22,204,131, 5,174,121,115,104, 50,124,200,185, 12,174,216,213,151, 72, 89,214,253,151, 10, 2, 41,208, 28, 45, 26,187,145, 75,
+ 22,220,181,147,254,190,246,181, 17,232,188, 16,187,228,177,128, 75, 65, 87,143, 30,157,179,136,202,189,199, 23,168, 62, 68, 80,
+206, 34,220,239, 96, 99, 13,249,142,104, 58, 39,251, 85, 92, 38, 80,106,218, 47,219,189, 17, 72, 5,216, 91,244,172,195,140,117,
+242,116,110, 82,192,188, 27,206, 30, 61, 29,233,251,120,251, 0, 98,217,168, 1, 43, 21, 46,163,246,195, 79, 96, 32, 22,127,249,
+202,156, 47,132,150,199,103, 11,174,187,142,197,233,134,187, 15, 63,226,203, 95,124,137, 31,190,241, 22, 85, 93,115,120,176,199,
+127,246,242,231,208,121, 77,115,118,198,229, 15,223,102, 62,174, 24,183,145, 43,183,174,242, 27,175,253,136,163,163, 61,190,244,
+252, 45, 94,251,246, 31,242,139,191,250, 77,238,127,247,117, 78,127,255, 13,254,139,111,223,101, 19,133,199,143, 94,225,195,127,
+245, 59,248,209,136,157,195, 57,174,170,122,233,230, 24, 37,224,216,156, 47,184,115,177, 65,124,197,229,179, 23, 84,103, 45,237,
+ 12,154,179,244,117, 47, 76,210, 71,190, 43,240,215,126, 13,218,199,240,240,177,121,116,212,176,211,130,159, 39,164,195,249,116,
+192, 94,153, 65, 92,194,248,170,176,145,225,253, 7,133, 63,251,243, 29,247, 31,193,102, 12,183,174,129, 27, 65,215,193,253,199,
+105,157,121,222,192,247, 78,224, 63,254, 85, 24,159,193,233, 73,106, 40,158,122, 90,217, 92, 42,127,254, 87,110,114,249,254, 61,
+222,249, 65,228,214,139, 48,158,142,184,121,181,225, 98,147, 38,247,247, 62,130,201,204,234,107,232, 66,154,204,125,218,125, 59,
+163,228, 70,183,173, 57,234,101, 85, 33, 29,168, 98, 55, 36, 33,152,131, 89, 50,172,201,147,145, 26,155,204,147,138,161,196, 68,
+ 84, 11, 93, 34, 42, 73,140,125,247,239,197,210,159, 44,255,219,229,131, 79, 7, 22,186,216,174,186, 63,160,141, 4,150,137, 60,
+ 61, 51,220, 75, 63,197,122, 49, 15,230,108,255, 57,240,192,250, 7,203, 25,228, 94,134, 90,144, 15,150,172, 51,245,105, 26, 19,
+211, 14,119, 58, 96,114, 25, 54, 87, 73,222,240, 99, 77,254,242,229,132, 29, 13,211, 78, 59, 54, 73, 15, 69, 62, 4,243,196, 96,
+144, 99, 20,161,178,194, 19,237,129,118,182,151,175,200, 30,230,177,159,132, 52, 79, 18,174,156,232,135,131,164, 43,166,229,169,
+ 89,205, 46,116,240,131,151,168, 60, 69,193, 8, 38, 71,103,234,192,114,215,193, 53, 78, 11,184, 61, 22,112,187, 22, 68, 48,151,
+101,125,197,196, 90, 66,240,190, 32,125, 61,153, 54, 87,234,228,133, 1, 94,118,206, 98,107, 53, 82, 33,108, 98, 34, 18,121,115,
+ 77, 91,199,228, 0,230,141,201,152, 15, 92,162,166,181,134, 73, 37, 85,134,233, 83,138, 10,161,154,214, 77, 27,155,188,147,133,
+237, 96, 14, 20, 37, 49,123,235,130,163,145, 27, 65,220,128,216,212,197, 46,154,156, 59,222,219,142, 26,226,243, 4,187, 54, 35,
+ 66, 82,120,169,119,214, 56,118, 89,181,208, 65,109,141,170,211,159,224, 80,100,104, 67,249,231,133,175,138, 93,203,216,243, 36,
+122, 35, 25, 41,136, 82, 79,124,219, 82,247, 30, 98, 97,183,154,243, 17,114, 17,163,224,207,144, 44, 73,125,230,166,232, 0,187,
+247,153,240, 37, 65,243, 73,238, 75,145, 91, 80,198, 26, 87, 86,120,163,161, 95, 89,109,145,253, 18, 36, 59,221, 89, 99,224, 10,
+ 8, 34, 35, 92, 72, 94, 93,216,179,108, 63, 44,111,167, 50, 97,208, 27,243,181,215,133,216, 17, 34, 70,232,205,207,156,147, 97,
+221, 80,122, 44,100, 94,140, 47,114,232,183,197,206, 57, 16, 73,251,152, 98, 33, 80,145,252,223, 51, 67,176, 54,163,151, 32,137,
+175, 51,117,142, 35,148, 46, 14,217, 12,215, 21,174,214,106, 9,106,208, 21, 55, 68, 40,116,250,173,216, 74, 98,208, 80,244, 50,
+ 95,183,133,172,201, 22, 95, 33,147,233,122,137, 94,225,101,145, 51, 33,162, 53,161, 77, 84,206, 3,156,134,193,156, 43, 22,166,
+ 93,175, 61, 92,240,219,186, 96, 82, 57,174,213, 53,239, 63, 56,102,207,193,244,221,119,121,241,230,117,166,126, 66, 56,126,204,
+ 87, 63,255, 28,107,133,197,225, 17,191,254, 15,255, 77,127,238,200,155, 15,249, 79,110, 31,176, 63,134,223,255,255,254, 37,179,
+233,132,245,102,195,225,151,190,204,254,171, 95,226,127,249,133, 37,247,190,247, 67,214,213,156, 55,206, 55,140,234, 72,125,188,
+ 68, 66,100, 82, 37,124,107,213,180, 56, 95,177,232, 34, 11, 17, 30, 44,214, 60,243,218,138,207, 94, 73, 7,228,205,153, 41, 85,
+234, 52, 45,207, 38,112,252,238, 28,255,212,130, 79, 23,176,119,148,248, 46,143,143, 83,113, 95, 52,214, 96, 46, 97,114, 8,215,
+ 15,225,104,174,188, 31,134, 70,111, 54,203, 94, 44,240,240, 12,254,237,159,129,243,187,233,153,152,213,233, 76,152,143,224, 41,
+ 67,100, 42,129, 56,130,105, 35,184, 78, 25,207, 96,245,224,152,195,151, 15,184,249,224,152,176,128,189,195,134, 22,184,125, 11,
+ 30,190, 11,227,155,240,204,103,160,234,140,245, 81,105, 0,241,118, 67, 70,243,197,182, 46,178,170,172,179, 29,124, 67,213, 41,
+177,141, 6,207, 27,188, 24, 99, 63, 33, 57, 39,168,153,253, 7,115,103,138,153, 88, 97,134,209, 78,211,215,246, 19, 24,113,216,
+127,199, 28,245,169,253, 65, 66,145, 72, 90,217, 65,169, 93,222,155,217,100,208, 31,142, 25,194, 78,198, 14, 89, 63,239,122, 8,
+108,120, 40, 53, 67,120,229,195,106, 6, 54, 33, 23,221, 98,210, 8,110,128, 17,213, 13,218,245,138, 36,185,203, 9, 86,195, 40,
+149,186,167,141,233,163,131,237,125, 51,235, 56,179,100,181, 96, 72,247, 7,143,151,173, 98, 27,140,109,235,202,172,107,201,121,
+233,249,112,209,194, 8, 35,177,114,139, 21, 44, 53,105,226, 94,106, 50,147,240,110,136,152,205, 48,123,182, 28,245,108,239, 47,
+ 51, 43, 93,139, 3, 53,239,139,181, 64, 14, 74, 25, 91,175,153, 46, 14,185,210,218,215, 61,113,128,244, 19, 86, 94, 7,101,137,
+145,153,172,100,104,185, 50, 73, 90,107, 59,241, 40,105,226, 78,204,243,244,193,230,226,236,141,204,152, 8,157, 89,150, 34,253,
+ 30, 57, 23,196,243, 64,111, 48,226, 93, 33,188, 55, 66,156,151,225,243,117, 38,170, 29, 95, 0, 0, 6,177, 73, 68, 65, 84,153,
+247, 96, 71,228,200, 13, 54,164, 79, 54,195,206, 96,222,160,131, 51, 94,158,128,157,152, 81, 90,113,224,123, 51,175,185,208,194,
+125, 79,161,109, 19,105,138, 2, 54,231,201,235,151, 11,174, 69,201,230,166, 40,145,113,242,231,148,213, 2, 58, 52,108,113, 32,
+ 70,150,222, 4, 90, 6, 93, 20, 30, 4,131,250, 34, 51,203,181,247,160, 79,156, 5, 29,214, 47, 70,232,140,197,110,189, 92, 73,
+100,164,226, 73, 25, 81,223, 24,201, 96, 15,156, 11, 75, 85,174, 9,172,102,111, 98,226,136,236,122, 35, 50,186,226,123,229,201,
+156, 18, 18,183,102, 78,183,191, 46,186, 60, 60, 36, 94, 79,176, 95,105, 82, 32,144,203,166, 70,174,120, 15,101, 82,157, 3,143,
+ 35,228,251, 67,180,164,250,144,235,118, 45,195,123,236,101,196, 86,228,199,168,169,100, 82,131, 82,249,172,141, 79,252,151, 46,
+ 19, 37, 17,102,182, 55,104,236, 89,108,237,194,119, 54, 8, 80, 72,186,134,196,190,129,213, 78,161, 56,233,139,183,157,113,149,
+ 13, 56, 35, 55,116,226, 82,160,103, 62, 19, 9,179,244, 19,184, 18,183,215,126, 33, 14,240,123,101,134, 62, 15,186, 77, 47, 95,
+252,189,179, 21,225, 71,159,210, 69,184, 86,193,245,186,226,235, 55,175,241,226,222, 14, 27, 77, 40, 68,254,184,255,206, 71,167,
+160, 48,169,224, 86,237,249,199,255,213,223,229,218,222,148,175,188,252, 25,158,255,202,171,236,124,249,101,214,247, 30,240,131,
+241, 46,143,238, 63,102,228,182,117,230,109,132,165,182,125,163,187, 7, 92, 92,192,157, 6,158,221,135,147, 75, 56, 89,109,175,
+ 12,223,252,116,197, 11, 59, 66,125,164,172, 3,156, 63,132, 77, 7,255,250, 99, 56, 94,195, 47, 41, 28,206,161, 91,194,245,219,
+240,143,223, 8,169, 22, 89,243,246, 39, 95, 78, 80,251,227, 5,172, 60,116,199,240,254, 3,104,218, 36,231,236, 52, 69, 2,239,
+ 78, 97,189,132, 79, 63,129,218, 24,225,235, 21, 28,220, 80,218,227, 6,247,226,156, 27, 47,192,163, 79, 96,118, 5,214, 43,152,
+205, 18,163, 59, 25, 36,129,252, 31, 95,127, 74,243,142,220,155,251,153,144, 66, 7,156,243,116, 33,244,140,228, 65,150,152,164,
+ 63, 33,116,198,236, 28,160,166, 72, 50,249, 16, 81,243, 68, 54,242, 18,195, 8, 25, 67,138,240,203,198, 54,138, 49,179,131,246,
+105, 18, 90, 64,210,146,163, 82,173,234, 68,131, 94, 67, 72, 59, 45,177,187, 83, 25, 96, 61,177,131, 92,109,186,214, 66, 27, 76,
+180, 66, 87,102,120,228, 46,221,228, 41, 25, 53,200, 93,119,126,112,187, 98, 2, 14, 20,154,236,226,112,225,137,157,106, 44,172,
+103, 99,145,101, 30, 24,200,118,226,182,119,142, 20,222,195,165, 33, 70, 57,129,247,122,246,130,188, 87,234,221, 7,232, 92,249,
+177,243, 95,147, 76, 43,191,134, 42, 90,236, 43,195, 26,192,214,151, 73,218, 84, 90, 39,234,118, 1, 46, 9, 81,108,203,192,183,
+138,192,147, 80,164,176,173,133,245, 67, 61,121, 34, 15, 94,182,118,243,153,153, 44,133,123, 92, 32, 57, 14,142, 36, 89, 22,147,
+249, 32,121,167,108,190,215,222,154, 42,113, 73,186,168,249,144, 39, 77,243,103,161,104, 54, 10,203, 88,213,196,225,200,213, 56,
+ 40, 91,133, 53,232, 96,246,162, 91,217,204, 67,163, 40,100,100,102,187, 65, 45,171,121,223, 72, 62,113,221,118, 53,161, 44,206,
+100,111, 84,210,115, 51,228,137,175,237,111, 71,209,193, 97,239, 39, 76,190,133,179,114,239,104,168,229, 53,182,226,220, 19,235,
+182,123,149,129,192, 87, 76,115,177, 32, 11,150, 90,231,158, 5, 31,117, 59,242,184,252,148, 11,144, 65,101, 59,105,209, 11, 3,
+217, 47,135,212,196,237,245, 65, 43,201,246,120, 94, 9,243, 58,121,176,247,226, 29,111,236,116,187, 80,149, 31,220,245, 50, 31,
+ 33,102, 35, 35, 55, 20,102, 41,214, 1, 94,205, 41,200, 48,213,188,222,160, 88, 21,136, 69, 83, 43,210, 19,231,242, 42, 5, 82,
+106, 92,134,194,123,165,134, 75,124,145,172,139,207, 97, 57, 99,147,252, 69,151, 8,194, 73, 85,108, 83,186, 33, 56, 49, 36, 52,
+ 39,239,225,179,156, 54,104,236,135, 5, 10,178,107,118, 71,244, 61,178,177,157,156, 24,202,207,214,158,141, 32,169,201,196, 6,
+ 15, 91,178,226,220,118, 19,153,185, 40,119, 54,202, 42,123,121,196,129, 63, 16,116, 72,122,212, 2,146,215, 66, 23,175,197,170,
+197, 65,127, 70,149, 95, 91,254,191,148, 94, 6,246,141,159, 31,123,110, 31,236,240, 40,194,221,199,103,204,221, 48, 84, 92,196,
+ 66,162, 9,204, 12,189,244, 21, 91, 67, 76,121, 79,150,228,205, 45, 51, 26,133,211, 56, 32,161, 19,159,134, 58, 9,195,247,201,
+213,241,212,234,203,151,175,195,215,174,195, 59,247,225,225, 26,126,241,153, 52,165, 63,184,128,239, 60, 74, 77,209,216,195,159,
+127, 41, 33,139,237,169, 99,103, 63,114,103, 1, 93, 39,236, 79,149,229, 5, 28,222,132,189,125,184,118, 13,190,245, 86, 90, 5,
+140, 42,168,230, 32,191,241,181,235, 9, 61,244,201,218, 52,183,202, 94, 48,143,244,225,102,197, 2, 31, 36,187,100,185, 12, 33,
+ 25,171,218,165, 29, 80,234,164,109,146,209,228, 15, 47, 34,132, 24,140,157,155,136,105, 82, 84,170,100,221, 24,183, 18,235,165,
+ 36, 25,153, 92, 76,159, 56, 88,242,169,170, 97,123, 39,230, 92,102,209,219,238, 53,232, 86,225,204,210,154, 50,193, 41,147, 97,
+156, 47, 60,128, 25,220,229, 52, 14,135,184, 22,108, 96,108,170, 42, 3, 92,144,193, 94, 52, 75, 94,122, 56, 62,107,171,117,219,
+189,170, 12, 70,225, 9, 91,194,242, 6,115, 79,160, 22,169,129,210,173, 9, 42,239, 11, 93, 81,101,123, 66,150,237, 61,181,232,
+128, 71, 85,146,172,180,113,216,157,161, 67, 49,239, 39,249,254,115, 41,175,229, 86, 2,108, 95,204,159,168,203, 67,136, 87,182,
+ 47, 85,221,154,204,134, 98, 52,124, 3,145, 31, 47,236,137,249,238,250,127,159, 15,231, 65, 78,101,145,172, 35, 25,156,214,158,
+112,180, 19, 55,232,237,212, 37, 50,230,178, 63,128,148,177,184,158, 4, 74,138, 55,232, 63, 23, 45,118,241,177,248, 92,243,212,
+175, 5,172,148,247,205, 90,248,238,111,191,163,237, 38, 73,133,159, 96, 76,153,126, 55, 33,169, 0,106, 39,125, 33, 26,106,154,
+246, 36,176, 30,110, 31,170,245, 54, 9,110,171, 65,226,199,246, 31,174,220,169,231,221,179,219, 54, 30,114, 79, 56, 6,254, 24,
+156, 94, 24, 17,121, 43, 74,177,159, 4,211, 10, 42,199, 16,187,178,185,165, 64,230,158,124,205,102,145,219,175,204,194,118,228,
+176, 74, 42,236,136, 48, 31, 75, 47,175,116,102,179, 43,144,236, 89,213,164,147,110,224,130,244,235, 30, 95,250, 32, 72,239, 73,
+ 33, 5, 10,229, 58, 37,110,202,142,116, 48, 55,113, 98, 65, 41, 81,251,125, 60, 49, 38,139, 79, 91, 65,148,198, 72, 93,220,190,
+207,147,219, 95,186,243, 70, 73, 34,146,154, 23, 67, 89,186, 80, 72, 94,109, 32,106, 99,249,204, 15,188,230,220,108,230,117, 87,
+136,165,185,149,157, 39, 61, 39, 71,173,120, 13,135, 72,230,231,244,232, 69,206,211,144,180, 47,207, 9,152,249,190,168,156,112,
+222, 40,239, 54,197,115, 97,136,107, 44,134, 18,236, 94,118,102, 31,157, 7, 8, 95, 52,114, 99,243, 47, 88, 3,247,109,218,207,
+235, 30, 39,112,203,184, 61,209,250,172,141,253, 58, 49, 95,139,172,184,233, 52, 17, 76, 37,194, 42,192,165, 14,231,196,145,201,
+ 54, 93,253, 99, 57, 96, 91,247,115,110,176,195, 19,145,222,103, 93,138,158,190,124,242,172, 83,184,237,179,103, 69, 66,143,238,
+218, 25, 82,206, 62,149,189,255,103, 76, 38,125,170,112, 18,135,219,106, 92,240, 89,246, 5,174,249,193,233,110, 21,225, 1,105,
+202,143, 10,215, 4,158,114, 48,217,133,255, 31,241, 38, 60, 68,184, 86,227, 95, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+};
diff --git a/source/blender/src/toets.c b/source/blender/src/toets.c
index df0a2921578..804660c3433 100644
--- a/source/blender/src/toets.c
+++ b/source/blender/src/toets.c
@@ -291,6 +291,18 @@ void persptoetsen(unsigned short event)
}
}
else if(event==PAD0) {
+ /* lastview - */
+ if(G.vd->persp != V3D_CAMOB) {
+ /* store settings of current view before allowing overwriting with camera view */
+ QUATCOPY(G.vd->lviewquat, G.vd->viewquat);
+ G.vd->lview= G.vd->view;
+ G.vd->lpersp= G.vd->persp;
+ }
+ else {
+ /* return to settings of last view */
+ axis_set_view(G.vd->lviewquat[0], G.vd->lviewquat[1], G.vd->lviewquat[2], G.vd->lviewquat[3], G.vd->lview, G.vd->lpersp);
+ }
+
if(G.qual==LR_ALTKEY) {
if(oldcamera && is_an_active_object(oldcamera)) {
G.vd->camera= oldcamera;
@@ -313,6 +325,7 @@ void persptoetsen(unsigned short event)
handle_view3d_lock();
}
}
+
if(G.vd->camera==0) {
G.vd->camera= scene_find_camera(G.scene);
handle_view3d_lock();
@@ -342,8 +355,6 @@ void persptoetsen(unsigned short event)
VECCOPY(G.vd->ofs, orig_ofs);
G.vd->lens = orig_lens;
}
-
-
}
}
else if(event==PAD9) {
diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c
index 55feb4c0305..1c028c3f18b 100644
--- a/source/blender/src/toolbox.c
+++ b/source/blender/src/toolbox.c
@@ -121,8 +121,10 @@
#include "mydevice.h"
/* bpymenu */
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
#include "BPY_menus.h"
+#endif
#include "BLO_sys_types.h" // for intptr_t support
@@ -1924,12 +1926,15 @@ static TBitem *create_mesh_sublevel(ListBase *storage)
Link *link;
TBitem *meshmenu, *mm;
int totmenu= 10, totpymenu=0, a=0;
-
+
+#ifndef DISABLE_PYTHON
/* Python Menu */
BPyMenu *pym;
/* count the python menu items*/
for (pym = BPyMenuTable[PYMENU_ADDMESH]; pym; pym = pym->next, totpymenu++) {}
+#endif
+
if (totpymenu) totmenu += totpymenu+1; /* add 1 for the seperator */
link= MEM_callocN(sizeof(Link) + sizeof(TBitem)*(totmenu+1), "mesh menu");
@@ -1948,6 +1953,7 @@ static TBitem *create_mesh_sublevel(ListBase *storage)
mm->icon = 0; mm->retval= a; mm->name = "Monkey"; mm++; a++;
/* a == 10 */
+#ifndef DISABLE_PYTHON
if (totpymenu) {
int i=0;
mm->icon = 0; mm->retval= 0; mm->name = "SEPR"; mm++;
@@ -1960,7 +1966,8 @@ static TBitem *create_mesh_sublevel(ListBase *storage)
mm++; a++;
}
}
-
+#endif
+
/* terminate the menu */
mm->icon= -1; mm->retval= a; mm->name= ""; mm->poin= do_info_add_meshmenu;
diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c
index e21d543d34e..b9b8a4a21a9 100644
--- a/source/blender/src/transform.c
+++ b/source/blender/src/transform.c
@@ -1502,6 +1502,10 @@ static void constraintTransLim(TransInfo *t, TransData *td)
for (con= td->con; con; con= con->next) {
float tmat[4][4];
+ /* only consider constraint if enabled */
+ if (con->flag & CONSTRAINT_DISABLE) continue;
+ if (con->enforce == 0.0f) continue;
+
/* only use it if it's tagged for this purpose (and the right type) */
if (con->type == CONSTRAINT_TYPE_LOCLIMIT) {
bLocLimitConstraint *data= con->data;
@@ -1585,7 +1589,11 @@ static void constraintRotLim(TransInfo *t, TransData *td)
/* Evaluate valid constraints */
for (con= td->con; con; con= con->next) {
- /* we're only interested in Limit-Scale constraints */
+ /* only consider constraint if enabled */
+ if (con->flag & CONSTRAINT_DISABLE) continue;
+ if (con->enforce == 0.0f) continue;
+
+ /* we're only interested in Limit-Rotation constraints */
if (con->type == CONSTRAINT_TYPE_ROTLIMIT) {
bRotLimitConstraint *data= con->data;
float tmat[4][4];
@@ -1675,6 +1683,10 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
/* Evaluate valid constraints */
for (con= td->con; con; con= con->next) {
+ /* only consider constraint if enabled */
+ if (con->flag & CONSTRAINT_DISABLE) continue;
+ if (con->enforce == 0.0f) continue;
+
/* we're only interested in Limit-Scale constraints */
if (con->type == CONSTRAINT_TYPE_SIZELIMIT) {
bSizeLimitConstraint *data= con->data;
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index 7a2ca3f088b..3465983d110 100644
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -397,7 +397,7 @@ static bKinematicConstraint *has_targetless_ik(bPoseChannel *pchan)
bConstraint *con= pchan->constraints.first;
for(;con; con= con->next) {
- if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ if(con->type==CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0)) {
bKinematicConstraint *data= con->data;
if(data->tar==NULL)
@@ -505,12 +505,17 @@ static short apply_targetless_ik(Object *ob)
Mat3ToQuat(rmat3, parchan->quat);
/* for size, remove rotation */
- QuatToMat3(parchan->quat, qmat);
- Mat3Inv(imat, qmat);
- Mat3MulMat3(smat, rmat3, imat);
- Mat3ToSize(smat, parchan->size);
+ /* causes problems with some constraints (so apply only if needed) */
+ if (data->flag & CONSTRAINT_IK_STRETCH) {
+ QuatToMat3(parchan->quat, qmat);
+ Mat3Inv(imat, qmat);
+ Mat3MulMat3(smat, rmat3, imat);
+ Mat3ToSize(smat, parchan->size);
+ }
- VECCOPY(parchan->loc, rmat[3]);
+ /* causes problems with some constraints (e.g. childof), so disable this */
+ /* as it is IK shouldn't affect location directly */
+ /* VECCOPY(parchan->loc, rmat[3]); */
}
}
@@ -711,7 +716,7 @@ static void pchan_autoik_adjust (bPoseChannel *pchan, short chainlen)
/* check if pchan has ik-constraint */
for (con= pchan->constraints.first; con; con= con->next) {
- if (con->type == CONSTRAINT_TYPE_KINEMATIC) {
+ if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0)) {
bKinematicConstraint *data= con->data;
/* only accept if a temporary one (for auto-ik) */
@@ -763,6 +768,7 @@ static void pose_grab_with_ik_clear(Object *ob)
/* clear all temporary lock flags */
pchan->ikflag &= ~(BONE_IK_NO_XDOF_TEMP|BONE_IK_NO_YDOF_TEMP|BONE_IK_NO_ZDOF_TEMP);
+ pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_TARGET);
/* remove all temporary IK-constraints added */
for (con= pchan->constraints.first; con; con= con->next) {
if (con->type==CONSTRAINT_TYPE_KINEMATIC) {
@@ -771,9 +777,11 @@ static void pose_grab_with_ik_clear(Object *ob)
BLI_remlink(&pchan->constraints, con);
MEM_freeN(con->data);
MEM_freeN(con);
- pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_TARGET);
- break;
+ continue;
}
+ pchan->constflag |= PCHAN_HAS_IK;
+ if(data->tar==NULL || (data->tar->type==OB_ARMATURE && data->subtarget[0]==0))
+ pchan->constflag |= PCHAN_HAS_TARGET;
}
}
}
@@ -784,6 +792,7 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
{
bKinematicConstraint *data;
bConstraint *con;
+ bConstraint *targetless = 0;
/* Sanity check */
if (pchan == NULL)
@@ -791,23 +800,31 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
/* Rule: not if there's already an IK on this channel */
for (con= pchan->constraints.first; con; con= con->next) {
- if (con->type==CONSTRAINT_TYPE_KINEMATIC)
- break;
- }
-
- if (con) {
- /* but, if this is a targetless IK, we make it auto anyway (for the children loop) */
- data= has_targetless_ik(pchan);
- if (data)
- data->flag |= CONSTRAINT_IK_AUTO;
- return 0;
+ if (con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ bKinematicConstraint *data= con->data;
+ if(data->tar==NULL || (data->tar->type==OB_ARMATURE && data->subtarget[0]==0)) {
+ targetless = con;
+ /* but, if this is a targetless IK, we make it auto anyway (for the children loop) */
+ if (con->enforce!=0.0) {
+ targetless->flag |= CONSTRAINT_IK_AUTO;
+ return 0;
+ }
+ }
+ if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0))
+ return 0;
+ }
}
con = add_new_constraint(CONSTRAINT_TYPE_KINEMATIC);
BLI_addtail(&pchan->constraints, con);
pchan->constflag |= (PCHAN_HAS_IK|PCHAN_HAS_TARGET); /* for draw, but also for detecting while pose solving */
data= con->data;
- data->flag= CONSTRAINT_IK_TIP|CONSTRAINT_IK_TEMP|CONSTRAINT_IK_AUTO;
+ if (targetless) { /* if exists use values from last targetless IK-constraint as base */
+ *data = *((bKinematicConstraint*)targetless->data);
+ }
+ else
+ data->flag= CONSTRAINT_IK_TIP;
+ data->flag |= CONSTRAINT_IK_TEMP|CONSTRAINT_IK_AUTO;
VECCOPY(data->grabtarget, pchan->pose_tail);
data->rootbone= 1;
@@ -1411,7 +1428,10 @@ static void createTransCurveVerts(TransInfo *t)
if (propmode && head != tail)
calc_distanceCurveVerts(head, tail-1);
- testhandlesNurb(nu); /* sets the handles based on their selection, do this after the data is copied to the TransData */
+ /* TODO - in the case of tilt and radius we can also avoid allocating the initTransDataCurveHandes
+ * but for now just dont change handle types */
+ if (ELEM(t->mode, TFM_CURVE_SHRINKFATTEN, TFM_TILT) == 0)
+ testhandlesNurb(nu); /* sets the handles based on their selection, do this after the data is copied to the TransData */
}
else {
TransData *head, *tail;
@@ -2388,8 +2408,8 @@ void flushTransUVs(TransInfo *t)
td->loc2d[1]= td->loc[1]*invy;
if((G.sima->flag & SI_PIXELSNAP) && (t->state != TRANS_CANCEL)) {
- td->loc2d[0]= floor(width*td->loc2d[0] + 0.5f)/width;
- td->loc2d[1]= floor(height*td->loc2d[1] + 0.5f)/height;
+ td->loc2d[0]= (float)floor(width*td->loc2d[0] + 0.5f)/width;
+ td->loc2d[1]= (float)floor(height*td->loc2d[1] + 0.5f)/height;
}
}
@@ -2501,6 +2521,7 @@ static void posttrans_gpd_clean (bGPdata *gpd)
* (these need to be sorted as they are isolated)
*/
for (gpf= gpl->frames.first; gpf; gpf= gpfn) {
+ short added= 0;
gpfn= gpf->next;
if (gpf->flag & GP_FRAME_SELECT) {
@@ -2514,10 +2535,11 @@ static void posttrans_gpd_clean (bGPdata *gpd)
/* if current (gpf) occurs after this one in buffer, add! */
if (gfs->framenum < gpf->framenum) {
BLI_insertlinkafter(&sel_buffer, gfs, gpf);
+ added= 1;
break;
}
}
- if (gfs == NULL)
+ if (added == 0)
BLI_addhead(&sel_buffer, gpf);
}
}
@@ -2535,12 +2557,9 @@ static void posttrans_gpd_clean (bGPdata *gpd)
}
/* loop 2: remove duplicates of frames in buffers */
- //gfs= sel_buffer.first;
- //gfsn= gfs->next;
-
for (gpf= gpl->frames.first; gpf && sel_buffer.first; gpf= gpfn) {
gpfn= gpf->next;
-
+
/* loop through sel_buffer, emptying stuff from front of buffer if ok */
for (gfs= sel_buffer.first; gfs && gpf; gfs= gfsn) {
gfsn= gfs->next;
@@ -2700,13 +2719,13 @@ static void posttrans_nla_clean (TransInfo *t)
ob= base->object;
/* Check object ipos */
- i= count_ipo_keys(ob->ipo, side, CFRA);
+ i= count_ipo_keys(ob->ipo, side, (float)CFRA);
if (i) posttrans_ipo_clean(ob->ipo);
/* Check object constraint ipos */
for (conchan=ob->constraintChannels.first; conchan; conchan=conchan->next) {
- i= count_ipo_keys(conchan->ipo, side, CFRA);
- if (i) posttrans_ipo_clean(ob->ipo);
+ i= count_ipo_keys(conchan->ipo, side, (float)CFRA);
+ if (i) posttrans_ipo_clean(conchan->ipo);
}
/* skip actions and nlastrips if object is collapsed */
@@ -2723,7 +2742,7 @@ static void posttrans_nla_clean (TransInfo *t)
}
}
if (strip==NULL) {
- cfra = get_action_frame(ob, CFRA);
+ cfra = get_action_frame(ob, (float)CFRA);
for (achan=ob->action->chanbase.first; achan; achan=achan->next) {
if (EDITABLE_ACHAN(achan)) {
@@ -2809,7 +2828,7 @@ static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra)
/* only include points that occur on the right side of cfra */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
if (gpf->flag & GP_FRAME_SELECT) {
- if (FrameOnMouseSide(side, gpf->framenum, cfra))
+ if (FrameOnMouseSide(side, (float)gpf->framenum, cfra))
count++;
}
}
@@ -2901,7 +2920,7 @@ void flushTransGPactionData (TransInfo *t)
* The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data
* on the named side are used.
*/
-static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl, short side, float cfra)
+static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl, char side, float cfra)
{
bGPDframe *gpf;
int count= 0;
@@ -2909,12 +2928,12 @@ static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl
/* check for select frames on right side of current frame */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
if (gpf->flag & GP_FRAME_SELECT) {
- if (FrameOnMouseSide(side, gpf->framenum, cfra)) {
+ if (FrameOnMouseSide(side, (float)gpf->framenum, cfra)) {
/* memory is calloc'ed, so that should zero everything nicely for us */
td->val= &tfd->val;
- td->ival= gpf->framenum;
+ td->ival= (float)gpf->framenum;
- tfd->val= gpf->framenum;
+ tfd->val= (float)gpf->framenum;
tfd->sdata= &gpf->framenum;
/* advance td now */
@@ -2976,9 +2995,9 @@ static void createTransActionData(TransInfo *t)
* higher scaling ratios, but is faster than converting all points)
*/
if (ob)
- cfra = get_action_frame(ob, CFRA);
+ cfra = get_action_frame(ob, (float)CFRA);
else
- cfra = CFRA;
+ cfra = (float)CFRA;
/* loop 1: fully select ipo-keys and count how many BezTriples are selected */
for (ale= act_data.first; ale; ale= ale->next) {
@@ -3033,7 +3052,7 @@ static void createTransActionData(TransInfo *t)
/* check if we're supposed to be setting minx/maxx for TimeSlide */
if (t->mode == TFM_TIME_SLIDE) {
- float min=999999999.0f, max=-999999999.0;
+ float min=999999999.0f, max=-999999999.0f;
int i;
td= (t->data + 1);
@@ -3082,13 +3101,13 @@ static void createTransNlaData(TransInfo *t)
/* Ensure that partial selections result in beztriple selections */
for (base=G.scene->base.first; base; base=base->next) {
/* Check object ipos */
- i= count_ipo_keys(base->object->ipo, side, CFRA);
+ i= count_ipo_keys(base->object->ipo, side, (float)CFRA);
if (i) base->flag |= BA_HAS_RECALC_OB;
count += i;
/* Check object constraint ipos */
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next)
- count += count_ipo_keys(conchan->ipo, side, CFRA);
+ count += count_ipo_keys(conchan->ipo, side, (float)CFRA);
/* skip actions and nlastrips if object is collapsed */
if (base->object->nlaflag & OB_NLA_COLLAPSED)
@@ -3104,7 +3123,7 @@ static void createTransNlaData(TransInfo *t)
}
}
if (strip==NULL) {
- cfra = get_action_frame(base->object, CFRA);
+ cfra = get_action_frame(base->object, (float)CFRA);
for (achan=base->object->action->chanbase.first; achan; achan=achan->next) {
if (EDITABLE_ACHAN(achan)) {
@@ -3129,8 +3148,8 @@ static void createTransNlaData(TransInfo *t)
if (strip->flag & ACTSTRIP_SELECT) {
base->flag |= BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA;
- if (FrameOnMouseSide(side, strip->start, CFRA)) count++;
- if (FrameOnMouseSide(side, strip->end, CFRA)) count++;
+ if (FrameOnMouseSide(side, strip->start, (float)CFRA)) count++;
+ if (FrameOnMouseSide(side, strip->end, (float)CFRA)) count++;
}
}
}
@@ -3148,12 +3167,12 @@ static void createTransNlaData(TransInfo *t)
for (base=G.scene->base.first; base; base=base->next) {
/* Manipulate object ipos */
/* - no scaling of keyframe times is allowed here */
- td= IpoToTransData(td, base->object->ipo, NULL, side, CFRA);
+ td= IpoToTransData(td, base->object->ipo, NULL, side, (float)CFRA);
/* Manipulate object constraint ipos */
/* - no scaling of keyframe times is allowed here */
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next)
- td= IpoToTransData(td, conchan->ipo, NULL, side, CFRA);
+ td= IpoToTransData(td, conchan->ipo, NULL, side, (float)CFRA);
/* skip actions and nlastrips if object collapsed */
if (base->object->nlaflag & OB_NLA_COLLAPSED)
@@ -3171,7 +3190,7 @@ static void createTransNlaData(TransInfo *t)
/* can include if no strip found */
if (strip==NULL) {
- cfra = get_action_frame(base->object, CFRA);
+ cfra = get_action_frame(base->object, (float)CFRA);
for (achan=base->object->action->chanbase.first; achan; achan=achan->next) {
if (EDITABLE_ACHAN(achan)) {
@@ -3193,12 +3212,12 @@ static void createTransNlaData(TransInfo *t)
for (strip=base->object->nlastrips.first; strip; strip=strip->next) {
if (strip->flag & ACTSTRIP_SELECT) {
/* first TransData is the start, second is the end */
- if (FrameOnMouseSide(side, strip->start, CFRA)) {
+ if (FrameOnMouseSide(side, strip->start, (float)CFRA)) {
td->val = &strip->start;
td->ival = strip->start;
td++;
}
- if (FrameOnMouseSide(side, strip->end, CFRA)) {
+ if (FrameOnMouseSide(side, strip->end, (float)CFRA)) {
td->val = &strip->end;
td->ival = strip->end;
td++;
@@ -3882,7 +3901,17 @@ void special_aftertrans_update(TransInfo *t)
/* remove duplicate frames and also make sure points are in order! */
if ((cancelled == 0) || (duplicate))
{
- posttrans_gpd_clean(data);
+ ScrArea *sa;
+
+ /* BAD... we need to loop over all screen areas for current screen...
+ * - sync this with actdata_filter_gpencil() in editaction.c
+ */
+ for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
+ bGPdata *gpd= gpencil_data_getactive(sa);
+
+ if (gpd)
+ posttrans_gpd_clean(gpd);
+ }
}
}
@@ -4279,3 +4308,4 @@ void createTransData(TransInfo *t)
+
diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c
index 709879f142b..b5a5ecd05ce 100644
--- a/source/blender/src/transform_manipulator.c
+++ b/source/blender/src/transform_manipulator.c
@@ -282,8 +282,17 @@ int calc_manipulator_stats(ScrArea *sa)
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- /* exception */
- if( (bezt->f1 & SELECT) + (bezt->f2 & SELECT) + (bezt->f3 & SELECT) > SELECT ) {
+ /* exceptions
+ * if handles are hidden then only check the center points.
+ * If 2 or more are selected then only use the center point too.
+ */
+ if (G.f & G_HIDDENHANDLES) {
+ if (bezt->f2 & SELECT) {
+ calc_tw_center(bezt->vec[1]);
+ totsel++;
+ }
+ }
+ else if ( (bezt->f1 & SELECT) + (bezt->f2 & SELECT) + (bezt->f3 & SELECT) > SELECT ) {
calc_tw_center(bezt->vec[1]);
totsel++;
}
diff --git a/source/blender/src/transform_ndofinput.c b/source/blender/src/transform_ndofinput.c
index b7362197423..a22c7ed6472 100644
--- a/source/blender/src/transform_ndofinput.c
+++ b/source/blender/src/transform_ndofinput.c
@@ -38,8 +38,8 @@
#include "transform.h"
-int updateNDofMotion(NDofInput *n); // return 0 when motion is null
-void resetNDofInput(NDofInput *n);
+static int updateNDofMotion(NDofInput *n); // return 0 when motion is null
+static void resetNDofInput(NDofInput *n);
void initNDofInput(NDofInput *n)
{
@@ -56,7 +56,7 @@ void initNDofInput(NDofInput *n)
}
}
-void resetNDofInput(NDofInput *n)
+static void resetNDofInput(NDofInput *n)
{
int i;
for(i = 0; i < 6; i++)
@@ -122,7 +122,7 @@ void applyNDofInput(NDofInput *n, float *vec)
}
-int updateNDofMotion(NDofInput *n)
+static int updateNDofMotion(NDofInput *n)
{
float fval[7];
int i;
diff --git a/source/blender/src/transform_snap.c b/source/blender/src/transform_snap.c
index 8c5e1f85a3d..e7937e72c2b 100644
--- a/source/blender/src/transform_snap.c
+++ b/source/blender/src/transform_snap.c
@@ -814,7 +814,7 @@ int snapDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_sta
{
efa = EM_get_face_for_index(index);
- if (efa && ((efa->v1->f & SELECT) || (efa->v2->f & SELECT) || (efa->v3->f & SELECT) || (efa->v4 && efa->v4->f & SELECT)))
+ if (efa && (efa->h || (efa->v1->f & SELECT) || (efa->v2->f & SELECT) || (efa->v3->f & SELECT) || (efa->v4 && efa->v4->f & SELECT)))
{
test = 0;
}
@@ -957,7 +957,7 @@ int snapDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_sta
{
eve = EM_get_vert_for_index(index);
- if (eve && eve->f & SELECT)
+ if (eve && (eve->h || (eve->f & SELECT)))
{
test = 0;
}
@@ -1050,7 +1050,7 @@ int snapDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_sta
{
eed = EM_get_edge_for_index(index);
- if (eed && ((eed->v1->f & SELECT) || (eed->v2->f & SELECT)))
+ if (eed && (eed->h || (eed->v1->f & SELECT) || (eed->v2->f & SELECT)))
{
test = 0;
}
diff --git a/source/blender/src/unwrapper.c b/source/blender/src/unwrapper.c
index ee5ce0c914e..612e068c6ca 100644
--- a/source/blender/src/unwrapper.c
+++ b/source/blender/src/unwrapper.c
@@ -202,8 +202,7 @@ ParamHandle *construct_param_handle(EditMesh *em, short implicit, short fill, sh
handle = param_construct_begin();
if ((G.scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT)==0) {
- EditMesh *em = G.editMesh;
- EditFace *efa = EM_get_actFace(1);
+ efa = EM_get_actFace(1);
if (efa) {
float aspx, aspy;
MTFace *tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
diff --git a/source/blender/src/usiblender.c b/source/blender/src/usiblender.c
index 88cdc558f2b..16c26336b89 100644
--- a/source/blender/src/usiblender.c
+++ b/source/blender/src/usiblender.c
@@ -134,7 +134,9 @@
#include "BDR_imagepaint.h"
#include "BDR_vpaint.h"
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "blendef.h"
@@ -147,6 +149,8 @@
#include "PIL_time.h"
+#include "reeb.h"
+
#include "GPU_extensions.h"
#include "GPU_draw.h"
@@ -201,6 +205,9 @@ static void init_userdef_file(void)
if (U.ndof_rotate==0) {
U.ndof_rotate = 100;
}
+ if (U.gp_eraser == 0) {
+ U.gp_eraser= 25;
+ }
if(U.flag & USER_CUSTOM_RANGE)
vDM_ColorBand_store(&U.coba_weight); /* signal for derivedmesh to use colorband */
@@ -501,10 +508,11 @@ static void init_userdef_file(void)
col = btheme->tv3d.vertex_select;
SETCOL(btheme->tseq.vertex_select, col[0], col[1], col[2], 255);
}
-
+ }
+ if ((G.main->versionfile < 247) || (G.main->versionfile == 247 && G.main->subversionfile <= 9)) {
/* define grease-pencil distances */
- U.gp_manhattendist= 3;
- U.gp_euclideandist= 20;
+ U.gp_manhattendist= 2;
+ U.gp_euclideandist= 15;
}
/* GL Texture Garbage Collection (variable abused above!) */
@@ -673,11 +681,13 @@ int BIF_read_homefile(int from_memory)
undo_imagepaint_clear();
BKE_reset_undo();
BKE_write_undo("Original"); /* save current state */
-
+
+#ifndef DISABLE_PYTHON
/* if from memory, need to refresh python scripts */
if (from_memory) {
BPY_path_update();
}
+#endif
return success;
}
@@ -910,8 +920,10 @@ void BIF_write_file(char *target)
return;
}
+#ifndef DISABLE_PYTHON
/* send the OnSave event */
if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript(&G.scene->id, SCRIPT_ONSAVE);
+#endif
for (li= G.main->library.first; li; li= li->id.next) {
if (li->parent==NULL && BLI_streq(li->name, target)) {
@@ -1089,6 +1101,9 @@ void exit_usiblender(void)
BIF_clear_tempfiles();
+ BIF_GlobalReebFree();
+ BIF_freeRetarget();
+
tf= G.ttfdata.first;
while(tf)
{
@@ -1121,15 +1136,18 @@ void exit_usiblender(void)
free_editArmature();
free_posebuf();
+#ifndef DISABLE_PYTHON
/* before free_blender so py's gc happens while library still exists */
/* needed at least for a rare sigsegv that can happen in pydrivers */
BPY_end_python();
+#endif
fastshade_free_render(); /* shaded view */
free_blender(); /* blender.c, does entire library */
free_matcopybuf();
free_ipocopybuf();
free_actcopybuf();
+ free_gpcopybuf();
free_vertexpaint();
free_texttools();
diff --git a/source/blender/src/view.c b/source/blender/src/view.c
index d6bc9cea311..258e4fd99e0 100644
--- a/source/blender/src/view.c
+++ b/source/blender/src/view.c
@@ -111,7 +111,7 @@ void persp_general(int a)
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
- myortho2(-0.375, ((float)(curarea->winx))-0.375, -0.375, ((float)(curarea->winy))-0.375);
+ myortho2(-0.375f, ((float)(curarea->winx))-0.375f, -0.375f, ((float)(curarea->winy))-0.375f);
glLoadIdentity();
}
else if(a== 1) {
@@ -134,7 +134,7 @@ void persp(int a)
mygetmatrix(G.vd->viewmat1);
}
else if(a== PERSP_WIN) { // only set
- myortho2(-0.375, (float)(curarea->winx)-0.375, -0.375, (float)(curarea->winy)-0.375);
+ myortho2(-0.375f, (float)(curarea->winx)-0.375f, -0.375f, (float)(curarea->winy)-0.375f);
glLoadIdentity();
}
else if(a== PERSP_VIEW) {
@@ -242,8 +242,8 @@ void project_short(float *vec, short *adr) /* clips */
fy= (curarea->winy/2)*(1 + vec4[1]/vec4[3]);
if(fy>0.0 && fy< (float)curarea->winy) {
- adr[0]= floor(fx);
- adr[1]= floor(fy);
+ adr[0]= (short)floor(fx);
+ adr[1]= (short)floor(fy);
}
}
}
@@ -253,7 +253,7 @@ void project_int(float *vec, int *adr)
{
float fx, fy, vec4[4];
- adr[0]= 2140000000.0f;
+ adr[0]= (int)2140000000.0f;
VECCOPY(vec4, vec);
vec4[3]= 1.0;
@@ -266,8 +266,8 @@ void project_int(float *vec, int *adr)
fy= (curarea->winy/2)*(1 + vec4[1]/vec4[3]);
if(fy>-2140000000.0f && fy<2140000000.0f) {
- adr[0]= floor(fx);
- adr[1]= floor(fy);
+ adr[0]= (int)floor(fx);
+ adr[1]= (int)floor(fy);
}
}
}
@@ -286,8 +286,8 @@ void project_int_noclip(float *vec, int *adr)
fx = (curarea->winx/2)*(1 + vec4[0]/vec4[3]);
fy = (curarea->winy/2)*(1 + vec4[1]/vec4[3]);
- adr[0] = floor(fx);
- adr[1] = floor(fy);
+ adr[0] = (int)floor(fx);
+ adr[1] = (int)floor(fy);
}
else
{
@@ -314,8 +314,8 @@ void project_short_noclip(float *vec, short *adr)
fy= (curarea->winy/2)*(1 + vec4[1]/vec4[3]);
if(fy>-32700.0 && fy<32700.0) {
- adr[0]= floor(fx);
- adr[1]= floor(fy);
+ adr[0]= (short)floor(fx);
+ adr[1]= (short)floor(fy);
}
}
}
@@ -332,8 +332,8 @@ void project_float(float *vec, float *adr)
Mat4MulVec4fl(G.vd->persmat, vec4);
if( vec4[3]>BL_NEAR_CLIP ) {
- adr[0] = (curarea->winx/2.0)+(curarea->winx/2.0)*vec4[0]/vec4[3];
- adr[1] = (curarea->winy/2.0)+(curarea->winy/2.0)*vec4[1]/vec4[3];
+ adr[0] = (float)(curarea->winx/2.0)+(curarea->winx/2.0)*vec4[0]/vec4[3];
+ adr[1] = (float)(curarea->winy/2.0)+(curarea->winy/2.0)*vec4[1]/vec4[3];
}
}
@@ -347,8 +347,8 @@ void project_float_noclip(float *vec, float *adr)
Mat4MulVec4fl(G.vd->persmat, vec4);
if( fabs(vec4[3]) > BL_NEAR_CLIP ) {
- adr[0] = (curarea->winx/2.0)+(curarea->winx/2.0)*vec4[0]/vec4[3];
- adr[1] = (curarea->winy/2.0)+(curarea->winy/2.0)*vec4[1]/vec4[3];
+ adr[0] = (float)(curarea->winx/2.0)+(curarea->winx/2.0)*vec4[0]/vec4[3];
+ adr[1] = (float)(curarea->winy/2.0)+(curarea->winy/2.0)*vec4[1]/vec4[3];
}
else
{
@@ -401,8 +401,8 @@ void view3d_project_short_clip(ScrArea *area, float *vec, short *adr, float proj
fy= (area->winy/2)*(1 + vec4[1]/vec4[3]);
if(fy>0.0 && fy< (float)area->winy) {
- adr[0]= floor(fx);
- adr[1]= floor(fy);
+ adr[0]= (short)floor(fx);
+ adr[1]= (short)floor(fy);
}
}
}
@@ -427,8 +427,8 @@ void view3d_project_short_noclip(ScrArea *area, float *vec, short *adr, float ma
fy= (area->winy/2)*(1 + vec4[1]/vec4[3]);
if(fy>-32700.0 && fy<32700.0) {
- adr[0]= floor(fx);
- adr[1]= floor(fy);
+ adr[0]= (short)floor(fx);
+ adr[1]= (short)floor(fy);
}
}
}
@@ -445,10 +445,10 @@ void view3d_project_float(ScrArea *area, float *vec, float *adr, float mat[4][4]
Mat4MulVec4fl(mat, vec4);
if( vec4[3]>FLT_EPSILON ) {
- adr[0] = (area->winx/2.0)+(area->winx/2.0)*vec4[0]/vec4[3];
- adr[1] = (area->winy/2.0)+(area->winy/2.0)*vec4[1]/vec4[3];
+ adr[0] = (float)(area->winx/2.0f)+(area->winx/2.0f)*vec4[0]/vec4[3];
+ adr[1] = (float)(area->winy/2.0f)+(area->winy/2.0f)*vec4[1]/vec4[3];
} else {
- adr[0] = adr[1] = 0.0;
+ adr[0] = adr[1] = 0.0f;
}
}
@@ -999,7 +999,6 @@ void viewmove(int mode)
/* are we translating, rotating or zooming? */
if(mode==0) {
if(G.vd->view!=0) scrarea_queue_headredraw(curarea); /*for button */
- G.vd->view= 0;
}
if(G.vd->persp==V3D_CAMOB && mode!=1 && G.vd->camera) {
G.vd->persp= V3D_PERSP;
@@ -1009,6 +1008,8 @@ void viewmove(int mode)
}
if(mode==0) { /* view rotate */
+ G.vd->view= 0; /* need to reset everytime because of view snapping */
+
if (U.uiflag & USER_AUTOPERSP) G.vd->persp= V3D_PERSP;
if (U.flag & USER_TRACKBALL) mvalball[0]= mval[0];
@@ -1113,7 +1114,7 @@ void viewmove(int mode)
int i;
float viewmat[3][3];
- static const float thres = 0.93; //cos(20 deg);
+ static const float thres = 0.93f; //cos(20 deg);
static float snapquats[39][6] = {
/*{q0, q1, q3, q4, view, oposite_direction}*/
@@ -1261,7 +1262,6 @@ void viewmove(int mode)
mvalo[1]= mval[1];
if(G.f & G_PLAYANIM) inner_play_anim_loop(0, 0);
- if(G.f & G_SIMULATION) break;
/* If in retopo paint mode, update lines */
if(retopo_mesh_paint_check() && G.vd->retopo_view_data) {
@@ -2159,20 +2159,20 @@ void centerview() /* like a localview without local! */
afm[0]= (max[0]-min[0]);
afm[1]= (max[1]-min[1]);
afm[2]= (max[2]-min[2]);
- size= 0.7*MAX3(afm[0], afm[1], afm[2]);
+ size= 0.7f*MAX3(afm[0], afm[1], afm[2]);
- if(size <= G.vd->near*1.5) size= G.vd->near*1.5;
+ if(size <= G.vd->near*1.5f) size= G.vd->near*1.5f;
- new_ofs[0]= -(min[0]+max[0])/2.0;
- new_ofs[1]= -(min[1]+max[1])/2.0;
- new_ofs[2]= -(min[2]+max[2])/2.0;
+ new_ofs[0]= -(min[0]+max[0])/2.0f;
+ new_ofs[1]= -(min[1]+max[1])/2.0f;
+ new_ofs[2]= -(min[2]+max[2])/2.0f;
new_dist = size;
/* correction for window aspect ratio */
if(curarea->winy>2 && curarea->winx>2) {
size= (float)curarea->winx/(float)curarea->winy;
- if(size<1.0) size= 1.0/size;
+ if(size<1.0f) size= 1.0f/size;
new_dist*= size;
}
@@ -2184,7 +2184,7 @@ void centerview() /* like a localview without local! */
float orig_lens= G.vd->lens;
G.vd->persp=V3D_PERSP;
- G.vd->dist= 0.0;
+ G.vd->dist= 0.0f;
view_settings_from_ob(G.vd->camera, G.vd->ofs, NULL, NULL, &G.vd->lens);
smooth_view(G.vd, new_ofs, NULL, &new_dist, &orig_lens);
} else {
@@ -2267,8 +2267,8 @@ void view3d_home(int center)
int ok= 1, onedone=0;
if(center) {
- min[0]= min[1]= min[2]= 0.0;
- max[0]= max[1]= max[2]= 0.0;
+ min[0]= min[1]= min[2]= 0.0f;
+ max[0]= max[1]= max[2]= 0.0f;
}
else {
INIT_MINMAX(min, max);
@@ -2285,7 +2285,7 @@ void view3d_home(int center)
afm[0]= (max[0]-min[0]);
afm[1]= (max[1]-min[1]);
afm[2]= (max[2]-min[2]);
- size= 0.7*MAX3(afm[0], afm[1], afm[2]);
+ size= 0.7f*MAX3(afm[0], afm[1], afm[2]);
if(size==0.0) ok= 0;
if(ok) {
@@ -2293,14 +2293,14 @@ void view3d_home(int center)
float new_ofs[3];
new_dist = size;
- new_ofs[0]= -(min[0]+max[0])/2.0;
- new_ofs[1]= -(min[1]+max[1])/2.0;
- new_ofs[2]= -(min[2]+max[2])/2.0;
+ new_ofs[0]= -(min[0]+max[0])/2.0f;
+ new_ofs[1]= -(min[1]+max[1])/2.0f;
+ new_ofs[2]= -(min[2]+max[2])/2.0f;
// correction for window aspect ratio
if(curarea->winy>2 && curarea->winx>2) {
size= (float)curarea->winx/(float)curarea->winy;
- if(size<1.0) size= 1.0/size;
+ if(size<1.0) size= 1.0f/size;
new_dist*= size;
}
@@ -2335,7 +2335,7 @@ void view3d_align_axis_to_vector(View3D *v3d, int axisidx, float vec[3])
VECCOPY(norm, vec);
Normalize(norm);
- angle= acos(Inpf(alignaxis, norm));
+ angle= (float)acos(Inpf(alignaxis, norm));
Crossf(axis, alignaxis, norm);
VecRotToQuat(axis, -angle, new_quat);
@@ -2434,8 +2434,8 @@ void smooth_view(View3D *v3d, float *ofs, float *quat, float *dist, float *lens)
step = (float)((time_current-time_start) / time_allowed);
/* ease in/out */
- if (step < 0.5) step = pow(step*2, 2)/2;
- else step = 1-(pow(2*(1-step) ,2)/2);
+ if (step < 0.5) step = (float)pow(step*2, 2)/2;
+ else step = (float)1-(pow(2*(1-step),2)/2);
step_inv = 1-step;
diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c
index 935c546a235..8da5e1b2572 100644
--- a/source/blender/src/vpaint.c
+++ b/source/blender/src/vpaint.c
@@ -740,7 +740,7 @@ static void vpaint_blend( unsigned int *col, unsigned int *colorig, unsigned int
}
-static int sample_backbuf_area(VPaint *vp, int *indexar, int totface, int x, int y, float size)
+static int sample_backbuf_area(int *indexar, int totface, int x, int y, float size)
{
unsigned int *rt;
struct ImBuf *ibuf;
@@ -1196,7 +1196,7 @@ void weight_paint(void)
/* which faces are involved */
if(Gwp.flag & VP_AREA) {
- totindex= sample_backbuf_area(&Gwp, indexar, me->totface, mval[0], mval[1], Gwp.size);
+ totindex= sample_backbuf_area(indexar, me->totface, mval[0], mval[1], Gwp.size);
}
else {
indexar[0]= sample_backbuf(mval[0], mval[1]);
@@ -1428,7 +1428,7 @@ void vertex_paint()
/* which faces are involved */
if(Gvp.flag & VP_AREA) {
- totindex= sample_backbuf_area(&Gvp, indexar, me->totface, mval[0], mval[1], Gvp.size);
+ totindex= sample_backbuf_area(indexar, me->totface, mval[0], mval[1], Gvp.size);
}
else {
indexar[0]= sample_backbuf(mval[0], mval[1]);
diff --git a/source/blender/yafray/intern/export_Plugin.cpp b/source/blender/yafray/intern/export_Plugin.cpp
index 92ec7ba8d82..db9fb7ccc72 100644
--- a/source/blender/yafray/intern/export_Plugin.cpp
+++ b/source/blender/yafray/intern/export_Plugin.cpp
@@ -171,7 +171,9 @@ bool yafrayPluginRender_t::initExport()
corehandle = PIL_dynlib_open((char *)(location + "\\yafraycore.dll").c_str());
if (corehandle==NULL)
{
- cerr << "Error loading yafray plugin: " << PIL_dynlib_get_error_as_string(corehandle) << endl;
+ char *err = PIL_dynlib_get_error_as_string(corehandle);
+ if (err) cerr << "Error loading yafray plugin: " << err << endl;
+ else cerr << "Error loading yafray plugin: Unknown." << endl;
return false;
}
location += "\\yafrayplugin.dll";
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 99e8b576412..e84d1aac3a7 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -49,6 +49,10 @@ IF(WITH_QUICKTIME)
ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
+IF(WITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
+ENDIF(WITH_OPENEXR)
+
IF(LINUX)
ADD_DEFINITIONS(-DWITH_BINRELOC)
INCLUDE_DIRECTORIES(${BINRELOC_INC})
@@ -129,16 +133,16 @@ IF(WIN32)
ADD_CUSTOM_COMMAND(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
- COMMAND if not exist \"$\(TargetDir\)\\.blender\" mkdir \"$\(TargetDir\)\\.blender\"
- COMMAND if not exist \"$\(TargetDir\)\\.blender\\locale\" mkdir \"$\(TargetDir\)\\.blender\\locale\"
- COMMAND if not exist \"$\(TargetDir\)\\.blender\\scripts\" mkdir \"$\(TargetDir\)\\.blender\\scripts\"
- COMMAND if not exist \"$\(TargetDir\)\\plugins\" mkdir \"$\(TargetDir\)\\plugins\"
- COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"$\(TargetDir\)\\.blender\\\"
- COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"$\(TargetDir\)\\.blender\\\"
- COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"$\(TargetDir\)\\.blender\\locale\"
- COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\scripts\\*.*\" \"$\(TargetDir\)\\.blender\\scripts\"
- COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\plugins\\*.*\" \"$\(TargetDir\)\\plugins\"
- COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\text\\*.*\" \"$\(TargetDir\)\"
+ COMMAND if not exist \"${TARGETDIR}\\.blender\" mkdir \"${TARGETDIR}\\.blender\"
+ COMMAND if not exist \"${TARGETDIR}\\.blender\\locale\" mkdir \"${TARGETDIR}\\.blender\\locale\"
+ COMMAND if not exist \"${TARGETDIR}\\.blender\\scripts\" mkdir \"${TARGETDIR}\\.blender\\scripts\"
+ COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\"
+ COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\"
+ COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\"
+ COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\"
+ COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\"
+ COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\"
+ COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\"
)
FILE(TO_NATIVE_PATH "${LIBDIR}" WIN_LIBDIR)
@@ -146,22 +150,20 @@ IF(WIN32)
ADD_CUSTOM_COMMAND(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${WIN_LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\png\\lib\\libpng.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\sdl\\lib\\SDL.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\zlib\\lib\\zlib.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\tiff\\lib\\libtiff.dll\" \"$\(TargetDir\)\\\"
- COMMAND if $\(ConfigurationName\)==Debug copy /Y \"${WIN_LIBDIR}\\python\\lib\\python25_D.dll\" \"$\(TargetDir\)\\\"
- COMMAND if $\(ConfigurationName\)==Debug copy /Y \"${WIN_LIBDIR}\\CRTL\\lib\\msvcrtd.dll\" \"$\(TargetDir\)\\\"
- COMMAND if NOT $\(ConfigurationName\)==Debug copy /Y \"${WIN_LIBDIR}\\python\\lib\\python25.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"$\(TargetDir\)\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\tiff\\lib\\libtiff.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\python\\lib\\python25.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\"
)
IF(WITH_INTERNATIONAL)
ADD_CUSTOM_COMMAND(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${WIN_LIBDIR}\\iconv\\lib\\iconv.dll\" \"$\(TargetDir\)\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\"
)
ENDIF(WITH_INTERNATIONAL)
@@ -169,16 +171,16 @@ IF(WIN32)
ADD_CUSTOM_COMMAND(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avcodec-51.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avutil-49.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaad-0.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libx264-59.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"$\(TargetDir\)\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"$\(TargetDir\)\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avcodec-51.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avutil-49.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaad-0.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libx264-59.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\"
)
ENDIF(WITH_FFMPEG)
ENDIF(WIN32)
@@ -187,7 +189,11 @@ ADD_DEPENDENCIES(blender makesdna)
FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS)
-SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} src blender_python blender_render blender_radiosity bf_elbeem)
+SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} src blender_python blender_render blender_radiosity)
+
+IF(WITH_ELBEEM)
+ SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} bf_elbeem)
+ENDIF(WITH_ELBEEM)
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc)
@@ -216,6 +222,7 @@ IF(UNIX)
bf_avi
bf_cineon
bf_openexr
+ bf_dds
bf_readblenfile
blender_bop
bf_kernel
diff --git a/source/creator/SConscript b/source/creator/SConscript
index a4c218f89d6..16556643707 100644
--- a/source/creator/SConscript
+++ b/source/creator/SConscript
@@ -11,15 +11,21 @@ incs += ' ../kernel/gen_system #/extern/glew/include ../blender/gpu'
incs += ' ' + env['BF_OPENGL_INC']
defs = []
-if env['WITH_BF_QUICKTIME']==1:
+if env['WITH_BF_QUICKTIME']:
incs += ' ' + env['BF_QUICKTIME_INC']
defs.append('WITH_QUICKTIME')
-if env['WITH_BF_BINRELOC']==1:
+if env['WITH_BF_BINRELOC']:
incs += ' ../../extern/binreloc/include'
defs.append('WITH_BINRELOC')
-if env['WITH_BF_OPENEXR']==1:
+if env['WITH_BF_OPENEXR']:
defs.append('WITH_OPENEXR')
+if not env['WITH_BF_SDL']:
+ defs.append('DISABLE_SDL')
+
+if not env['WITH_BF_PYTHON']:
+ defs.append('DISABLE_PYTHON')
+
env.BlenderLib ( libname = 'blender_creator', sources = Split(sources), includes = Split(incs), defines = defs, libtype='core', priority = 1 )
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 8d46d1b130b..872a5f4d497 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -72,11 +72,14 @@
#include "IMB_imbuf.h" // for quicktime_init
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "RE_pipeline.h"
#include "GPU_draw.h"
+#include "GPU_extensions.h"
#include "playanim_ext.h"
#include "mydevice.h"
@@ -107,8 +110,8 @@ extern char * build_type;
#endif
/* Local Function prototypes */
-static void print_help();
-static void print_version();
+static void print_help(void);
+static void print_version(void);
/* defined in ghostwinlay and winlay, we can't include carbon here, conflict with DNA */
@@ -128,7 +131,7 @@ char bprogname[FILE_MAXDIR+FILE_MAXFILE]; /* from blenpluginapi:pluginapi.c */
char btempdir[FILE_MAXDIR+FILE_MAXFILE];
/* Initialise callbacks for the modules that need them */
-void setCallbacks(void);
+static void setCallbacks(void);
#if defined(__sgi) || defined(__alpha__)
static void fpe_handler(int sig)
@@ -220,6 +223,7 @@ static void print_help(void)
printf (" -d\t\tTurn debugging on\n");
printf (" -noaudio\tDisable audio on systems that support audio\n");
printf (" -nojoystick\tDisable joystick support\n");
+ printf (" -noglsl\tDisable GLSL shading\n");
printf (" -h\t\tPrint this help text\n");
printf (" -y\t\tDisable automatic python script execution (scriptlinks, pydrivers, pyconstraints, pynodes)\n");
printf (" -P <filename>\tRun the given Python script (filename or Blender Text)\n");
@@ -235,9 +239,11 @@ static void print_help(void)
printf (" $TEMP\t\tStore temporary files here.\n");
#else
printf (" $TMP or $TMPDIR\tStore temporary files here.\n");
- printf (" $SDL_AUDIODRIVER\tLibSDL audio driver - alsa, esd, alsa, dma.\n");
printf (" $BF_TIFF_LIB\t\tUse an alternative libtiff.so for loading tiff image files.\n");
#endif
+#ifndef DISABLE_SDL
+ printf (" $SDL_AUDIODRIVER\tLibSDL audio driver - alsa, esd, alsa, dma.\n");
+#endif
printf (" $IMAGEEDITOR\t\tImage editor executable, launch with the IKey from the file selector.\n");
printf (" $WINEDITOR\t\tText editor executable, launch with the EKey from the file selector.\n");
printf (" $PYTHONHOME\t\tPath to the python directory, eg. /usr/lib/python.\n");
@@ -324,10 +330,6 @@ int main(int argc, char **argv)
#ifdef __linux__
#ifdef __alpha__
signal (SIGFPE, fpe_handler);
- #else
- if ( getenv("SDL_AUDIODRIVER") == NULL) {
- setenv("SDL_AUDIODRIVER", "alsa", 1);
- }
#endif
#endif
#if defined(__sgi)
@@ -379,6 +381,10 @@ int main(int argc, char **argv)
else if(argv[a][0] == '-') {
switch(argv[a][1]) {
case 'a': /* -b was not given, play an animation */
+
+ /* exception here, see below, it probably needs happens after qt init? */
+ libtiff_init();
+
playanim(argc-1, argv+1);
exit(0);
break;
@@ -426,7 +432,7 @@ int main(int argc, char **argv)
/* for all platforms, even windos has it! */
if(G.background) signal(SIGINT, blender_esc); /* ctrl c out bg render */
-
+
/* background render uses this font too */
BKE_font_register_builtin(datatoc_Bfont, datatoc_Bfont_size);
@@ -502,6 +508,8 @@ int main(int argc, char **argv)
SYS_WriteCommandLineInt(syshandle,"nojoystick",1);
if (G.f & G_DEBUG) printf("disabling nojoystick\n");
}
+ if (BLI_strcasecmp(argv[a], "-noglsl") == 0)
+ GPU_extensions_disable();
break;
}
}
@@ -509,9 +517,9 @@ int main(int argc, char **argv)
if ( (G.windowstate == G_WINDOWSTATE_BORDER) || (G.windowstate == G_WINDOWSTATE_FULLSCREEN))
setprefsize(stax, stay, sizx, sizy, 0);
-
+#ifndef DISABLE_PYTHON
BPY_start_python(argc, argv);
-
+#endif
/**
* NOTE: sound_init_audio() *must be* after start_python,
* at least on FreeBSD.
@@ -522,10 +530,20 @@ int main(int argc, char **argv)
BLI_where_is_temp( btempdir, 1 ); /* call after loading the .B.blend so we can read U.tempdir */
+#ifndef DISABLE_SDL
+#ifdef __linux__
+ /* On linux the default SDL driver dma often would not play
+ * use alsa if none is set */
+ if ( getenv("SDL_AUDIODRIVER") == NULL) {
+ setenv("SDL_AUDIODRIVER", "alsa", 1);
+ }
+#endif
+#endif
}
else {
+#ifndef DISABLE_PYTHON
BPY_start_python(argc, argv);
-
+#endif
BLI_where_is_temp( btempdir, 0 ); /* call after loading the .B.blend so we can read U.tempdir */
// (ton) Commented out. I have no idea whats thisfor... will mail around!
@@ -534,7 +552,7 @@ int main(int argc, char **argv)
// sound_init_audio();
// if (G.f & G_DEBUG) printf("setting audio to: %d\n", audio);
}
-
+#ifndef DISABLE_PYTHON
/**
* NOTE: the U.pythondir string is NULL until BIF_init() is executed,
* so we provide the BPY_ function below to append the user defined
@@ -544,7 +562,8 @@ int main(int argc, char **argv)
* on U.pythondir.
*/
BPY_post_start_python();
-
+#endif
+
#ifdef WITH_QUICKTIME
quicktime_init();
@@ -629,13 +648,14 @@ int main(int argc, char **argv)
if (a < argc) {
int frame= MIN2(MAXFRAME, MAX2(1, atoi(argv[a])));
Render *re= RE_NewRender(G.scene->id.name);
-
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS)
BPY_do_all_scripts(SCRIPT_RENDER, 0);
-
+#endif
RE_BlenderAnim(re, G.scene, frame, frame, G.scene->frame_step);
-
+#ifndef DISABLE_PYTHON
BPY_do_all_scripts(SCRIPT_POSTRENDER, 0);
+#endif
}
} else {
printf("\nError: no blend loaded. cannot use '-f'.\n");
@@ -644,14 +664,15 @@ int main(int argc, char **argv)
case 'a':
if (G.scene) {
Render *re= RE_NewRender(G.scene->id.name);
-
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS)
BPY_do_all_scripts(SCRIPT_RENDER, 1);
-
+#endif
RE_BlenderAnim(re, G.scene, G.scene->r.sfra, G.scene->r.efra, G.scene->frame_step);
-
+#ifndef DISABLE_PYTHON
if (G.f & G_DOSCRIPTLINKS)
BPY_do_all_scripts(SCRIPT_POSTRENDER, 1);
+#endif
} else {
printf("\nError: no blend loaded. cannot use '-a'.\n");
}
@@ -689,6 +710,7 @@ int main(int argc, char **argv)
}
break;
case 'P':
+#ifndef DISABLE_PYTHON
a++;
if (a < argc) {
/* If we're not running in background mode, then give python a valid screen */
@@ -699,6 +721,9 @@ int main(int argc, char **argv)
BPY_run_python_script (argv[a]);
}
else printf("\nError: you must specify a Python script after '-P '.\n");
+#else
+ printf("This blender was built without python support\n");
+#endif /* DISABLE_PYTHON */
break;
case 'o':
a++;
@@ -831,7 +856,7 @@ static void mem_error_cb(char *errorStr)
fflush(stderr);
}
-void setCallbacks(void)
+static void setCallbacks(void)
{
/* Error output from the alloc routines: */
MEM_set_error_callback(mem_error_cb);
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 0d58810e156..9fbdc3fa1c9 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -70,6 +70,7 @@
#include "DNA_view3d_types.h"
#include "DNA_screen_types.h"
#include "BKE_global.h"
+#include "BKE_utildefines.h"
#include "BIF_screen.h"
#include "BIF_scrarea.h"
@@ -110,11 +111,14 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
Main* blenderdata = maggie1;
char* startscenename = scenename;
- char pathname[160];
- strcpy (pathname, blenderdata->name);
+ char pathname[FILE_MAXDIR+FILE_MAXFILE], oldsce[FILE_MAXDIR+FILE_MAXFILE];
STR_String exitstring = "";
BlendFileData *bfd= NULL;
+ BLI_strncpy(pathname, blenderdata->name, sizeof(pathname));
+ BLI_strncpy(oldsce, G.sce, sizeof(oldsce));
+ setGamePythonPath(G.sce);
+
// Acquire Python's GIL (global interpreter lock)
// so we can safely run Python code and API calls
PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -135,15 +139,6 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
bool game2ipo = (SYS_GetCommandLineInt(syshandle, "game2ipo", 0) != 0);
bool displaylists = (SYS_GetCommandLineInt(syshandle, "displaylists", 0) != 0);
- bool usemat = false, useglslmat = false;
-
- if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
- usemat = (SYS_GetCommandLineInt(syshandle, "blender_material", 1) != 0);
-
- if(GPU_extensions_minimum_support())
- useglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", 1) != 0);
- else if(G.fileflags & G_FILE_GAME_MAT_GLSL)
- usemat = false;
// create the canvas, rasterizer and rendertools
RAS_ICanvas* canvas = new KX_BlenderCanvas(area);
@@ -200,7 +195,16 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
ketsjiengine->SetUseFixedTime(usefixed);
ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
-
+
+ //lock frame and camera enabled - storing global values
+ int tmp_lay= G.scene->lay;
+ Object *tmp_camera = G.scene->camera;
+
+ if (G.vd->scenelock==0){
+ G.scene->lay= v3d->lay;
+ G.scene->camera= v3d->camera;
+ }
+
// some blender stuff
MT_CmMatrix4x4 projmat;
@@ -240,9 +244,14 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
char basedpath[240];
// base the actuator filename with respect
// to the original file working directory
+
if (exitstring != "")
strcpy(basedpath, exitstring.Ptr());
+ // load relative to the last loaded file, this used to be relative
+ // to the first file but that makes no sense, relative paths in
+ // blend files should be relative to that file, not some other file
+ // that happened to be loaded first
BLI_convertstringcode(basedpath, pathname);
bfd = load_game_data(basedpath);
@@ -263,6 +272,11 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
{
blenderdata = bfd->main;
startscenename = bfd->curscene->id.name + 2;
+
+ if(blenderdata) {
+ BLI_strncpy(G.sce, blenderdata->name, sizeof(G.sce));
+ BLI_strncpy(pathname, blenderdata->name, sizeof(pathname));
+ }
}
// else forget it, we can't find it
else
@@ -316,7 +330,17 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
if (always_use_expand_framing)
sceneconverter->SetAlwaysUseExpandFraming(true);
- if(usemat && (G.fileflags & G_FILE_GAME_MAT))
+ bool usemat = false, useglslmat = false;
+
+ if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
+ usemat = true;
+
+ if(GPU_extensions_minimum_support())
+ useglslmat = true;
+ else if(G.fileflags & G_FILE_GAME_MAT_GLSL)
+ usemat = false;
+
+ if(usemat && (G.fileflags & G_FILE_GAME_MAT))
sceneconverter->SetMaterials(true);
if(useglslmat && (G.fileflags & G_FILE_GAME_MAT_GLSL))
sceneconverter->SetGLSLMaterials(true);
@@ -404,7 +428,8 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
}
printf("\nBlender Game Engine Finished\n\n");
exitstring = ketsjiengine->GetExitString();
-
+
+
// when exiting the mainloop
// Clears the dictionary by hand:
@@ -440,6 +465,12 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
Py_DECREF(gameLogic_keys);
gameLogic_keys = NULL;
}
+ //lock frame and camera enabled - restoring global values
+ if (G.vd->scenelock==0){
+ G.scene->lay= tmp_lay;
+ G.scene->camera= tmp_camera;
+ }
+
// set the cursor back to normal
canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
@@ -492,6 +523,8 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
if (bfd) BLO_blendfiledata_free(bfd);
+ BLI_strncpy(G.sce, oldsce, sizeof(G.sce));
+
// Release Python's GIL
PyGILState_Release(gilstate);
}
@@ -507,10 +540,10 @@ extern "C" void StartKetsjiShellSimulation(struct ScrArea *area,
Main* blenderdata = maggie;
char* startscenename = scenename;
- char pathname[160];
- strcpy (pathname, maggie->name);
+ char pathname[FILE_MAXDIR+FILE_MAXFILE];
STR_String exitstring = "";
- BlendFileData *bfd= NULL;
+
+ BLI_strncpy(pathname, blenderdata->name, sizeof(pathname));
// Acquire Python's GIL (global interpreter lock)
// so we can safely run Python code and API calls
@@ -568,20 +601,17 @@ extern "C" void StartKetsjiShellSimulation(struct ScrArea *area,
KX_KetsjiEngine* ketsjiengine = new KX_KetsjiEngine(kxsystem);
Scene *blscene = NULL;
- if (!bfd)
+
+ blscene = (Scene*) maggie->scene.first;
+ for (Scene *sce= (Scene*) maggie->scene.first; sce; sce= (Scene*) sce->id.next)
{
- blscene = (Scene*) maggie->scene.first;
- for (Scene *sce= (Scene*) maggie->scene.first; sce; sce= (Scene*) sce->id.next)
+ if (startscenename == (sce->id.name+2))
{
- if (startscenename == (sce->id.name+2))
- {
- blscene = sce;
- break;
- }
+ blscene = sce;
+ break;
}
- } else {
- blscene = bfd->curscene;
}
+
int cframe = 1, startFrame;
if (blscene)
{
@@ -702,7 +732,6 @@ extern "C" void StartKetsjiShellSimulation(struct ScrArea *area,
SND_DeviceManager::Unsubscribe();
} while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
- if (bfd) BLO_blendfiledata_free(bfd);
// Release Python's GIL
PyGILState_Release(gilstate);
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index 669e7bd1b3f..54d1eb7e011 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -102,16 +102,28 @@ void DisableForText()
glDisable(GL_COLOR_MATERIAL);
}
- if(GLEW_ARB_multitexture)
- for(int i=0; i<MAXTEX; i++)
+ if(GLEW_ARB_multitexture) {
+ for(int i=0; i<MAXTEX; i++) {
glActiveTextureARB(GL_TEXTURE0_ARB+i);
- if(GLEW_ARB_texture_cube_map)
- if(glIsEnabled(GL_TEXTURE_CUBE_MAP_ARB))
- glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ if(GLEW_ARB_texture_cube_map)
+ if(glIsEnabled(GL_TEXTURE_CUBE_MAP_ARB))
+ glDisable(GL_TEXTURE_CUBE_MAP_ARB);
- if(glIsEnabled(GL_TEXTURE_2D))
- glDisable(GL_TEXTURE_2D);
+ if(glIsEnabled(GL_TEXTURE_2D))
+ glDisable(GL_TEXTURE_2D);
+ }
+
+ glActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ else {
+ if(GLEW_ARB_texture_cube_map)
+ if(glIsEnabled(GL_TEXTURE_CUBE_MAP_ARB))
+ glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+
+ if(glIsEnabled(GL_TEXTURE_2D))
+ glDisable(GL_TEXTURE_2D);
+ }
}
void BL_print_gamedebug_line(char* text, int xco, int yco, int width, int height)
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index 16bdbe6269b..4d748948c27 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -448,28 +448,28 @@ PyParentObject BL_ActionActuator::Parents[] = {
};
PyMethodDef BL_ActionActuator::Methods[] = {
- {"setAction", (PyCFunction) BL_ActionActuator::sPySetAction, METH_VARARGS, SetAction_doc},
- {"setStart", (PyCFunction) BL_ActionActuator::sPySetStart, METH_VARARGS, SetStart_doc},
- {"setEnd", (PyCFunction) BL_ActionActuator::sPySetEnd, METH_VARARGS, SetEnd_doc},
- {"setBlendin", (PyCFunction) BL_ActionActuator::sPySetBlendin, METH_VARARGS, SetBlendin_doc},
- {"setPriority", (PyCFunction) BL_ActionActuator::sPySetPriority, METH_VARARGS, SetPriority_doc},
- {"setFrame", (PyCFunction) BL_ActionActuator::sPySetFrame, METH_VARARGS, SetFrame_doc},
- {"setProperty", (PyCFunction) BL_ActionActuator::sPySetProperty, METH_VARARGS, SetProperty_doc},
- {"setFrameProperty", (PyCFunction) BL_ActionActuator::sPySetFrameProperty, METH_VARARGS, SetFrameProperty_doc},
- {"setBlendtime", (PyCFunction) BL_ActionActuator::sPySetBlendtime, METH_VARARGS, SetBlendtime_doc},
-
- {"getAction", (PyCFunction) BL_ActionActuator::sPyGetAction, METH_VARARGS, GetAction_doc},
- {"getStart", (PyCFunction) BL_ActionActuator::sPyGetStart, METH_VARARGS, GetStart_doc},
- {"getEnd", (PyCFunction) BL_ActionActuator::sPyGetEnd, METH_VARARGS, GetEnd_doc},
- {"getBlendin", (PyCFunction) BL_ActionActuator::sPyGetBlendin, METH_VARARGS, GetBlendin_doc},
- {"getPriority", (PyCFunction) BL_ActionActuator::sPyGetPriority, METH_VARARGS, GetPriority_doc},
- {"getFrame", (PyCFunction) BL_ActionActuator::sPyGetFrame, METH_VARARGS, GetFrame_doc},
- {"getProperty", (PyCFunction) BL_ActionActuator::sPyGetProperty, METH_VARARGS, GetProperty_doc},
- {"getFrameProperty", (PyCFunction) BL_ActionActuator::sPyGetFrameProperty, METH_VARARGS, GetFrameProperty_doc},
- {"setChannel", (PyCFunction) BL_ActionActuator::sPySetChannel, METH_VARARGS, SetChannel_doc},
+ {"setAction", (PyCFunction) BL_ActionActuator::sPySetAction, METH_VARARGS, (PY_METHODCHAR)SetAction_doc},
+ {"setStart", (PyCFunction) BL_ActionActuator::sPySetStart, METH_VARARGS, (PY_METHODCHAR)SetStart_doc},
+ {"setEnd", (PyCFunction) BL_ActionActuator::sPySetEnd, METH_VARARGS, (PY_METHODCHAR)SetEnd_doc},
+ {"setBlendin", (PyCFunction) BL_ActionActuator::sPySetBlendin, METH_VARARGS, (PY_METHODCHAR)SetBlendin_doc},
+ {"setPriority", (PyCFunction) BL_ActionActuator::sPySetPriority, METH_VARARGS, (PY_METHODCHAR)SetPriority_doc},
+ {"setFrame", (PyCFunction) BL_ActionActuator::sPySetFrame, METH_VARARGS, (PY_METHODCHAR)SetFrame_doc},
+ {"setProperty", (PyCFunction) BL_ActionActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+ {"setFrameProperty", (PyCFunction) BL_ActionActuator::sPySetFrameProperty, METH_VARARGS, (PY_METHODCHAR)SetFrameProperty_doc},
+ {"setBlendtime", (PyCFunction) BL_ActionActuator::sPySetBlendtime, METH_VARARGS, (PY_METHODCHAR)SetBlendtime_doc},
+
+ {"getAction", (PyCFunction) BL_ActionActuator::sPyGetAction, METH_VARARGS, (PY_METHODCHAR)GetAction_doc},
+ {"getStart", (PyCFunction) BL_ActionActuator::sPyGetStart, METH_VARARGS, (PY_METHODCHAR)GetStart_doc},
+ {"getEnd", (PyCFunction) BL_ActionActuator::sPyGetEnd, METH_VARARGS, (PY_METHODCHAR)GetEnd_doc},
+ {"getBlendin", (PyCFunction) BL_ActionActuator::sPyGetBlendin, METH_VARARGS, (PY_METHODCHAR)GetBlendin_doc},
+ {"getPriority", (PyCFunction) BL_ActionActuator::sPyGetPriority, METH_VARARGS, (PY_METHODCHAR)GetPriority_doc},
+ {"getFrame", (PyCFunction) BL_ActionActuator::sPyGetFrame, METH_VARARGS, (PY_METHODCHAR)GetFrame_doc},
+ {"getProperty", (PyCFunction) BL_ActionActuator::sPyGetProperty, METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
+ {"getFrameProperty", (PyCFunction) BL_ActionActuator::sPyGetFrameProperty, METH_VARARGS, (PY_METHODCHAR)GetFrameProperty_doc},
+ {"setChannel", (PyCFunction) BL_ActionActuator::sPySetChannel, METH_VARARGS, (PY_METHODCHAR)SetChannel_doc},
// {"getChannel", (PyCFunction) BL_ActionActuator::sPyGetChannel, METH_VARARGS},
- {"getType", (PyCFunction) BL_ActionActuator::sPyGetType, METH_VARARGS, GetType_doc},
- {"setType", (PyCFunction) BL_ActionActuator::sPySetType, METH_VARARGS, SetType_doc},
+ {"getType", (PyCFunction) BL_ActionActuator::sPyGetType, METH_VARARGS, (PY_METHODCHAR)GetType_doc},
+ {"setType", (PyCFunction) BL_ActionActuator::sPySetType, METH_VARARGS, (PY_METHODCHAR)SetType_doc},
{"getContinue", (PyCFunction) BL_ActionActuator::sPyGetContinue, METH_NOARGS, 0},
{"setContinue", (PyCFunction) BL_ActionActuator::sPySetContinue, METH_O, 0},
{NULL,NULL} //Sentinel
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 09b0f063e2a..9c699b67b28 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -1414,6 +1414,12 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
objprop.m_dynamic_parent=NULL;
objprop.m_isdeformable = ((blenderobject->gameflag2 & 2)) != 0;
objprop.m_boundclass = objprop.m_dyna?KX_BOUNDSPHERE:KX_BOUNDMESH;
+
+ if ((blenderobject->gameflag & OB_SOFT_BODY) && !(blenderobject->gameflag & OB_BOUNDS))
+ {
+ objprop.m_boundclass = KX_BOUNDMESH;
+ }
+
KX_BoxBounds bb;
my_get_local_bounds(blenderobject,objprop.m_boundobject.box.m_center,bb.m_extends);
if (blenderobject->gameflag & OB_BOUNDS)
@@ -2472,7 +2478,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
(float)dat->pivY,(float)dat->pivZ,
(float)axis0.x(),(float)axis0.y(),(float)axis0.z(),
(float)axis1.x(),(float)axis1.y(),(float)axis1.z(),
- (float)axis2.x(),(float)axis2.y(),(float)axis2.z());
+ (float)axis2.x(),(float)axis2.y(),(float)axis2.z(),dat->flag);
if (constraintId)
{
//if it is a generic 6DOF constraint, set all the limits accordingly
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
index 7a73420fc7c..46f3141be29 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
@@ -448,26 +448,26 @@ PyParentObject BL_ShapeActionActuator::Parents[] = {
};
PyMethodDef BL_ShapeActionActuator::Methods[] = {
- {"setAction", (PyCFunction) BL_ShapeActionActuator::sPySetAction, METH_VARARGS, SetAction_doc},
- {"setStart", (PyCFunction) BL_ShapeActionActuator::sPySetStart, METH_VARARGS, SetStart_doc},
- {"setEnd", (PyCFunction) BL_ShapeActionActuator::sPySetEnd, METH_VARARGS, SetEnd_doc},
- {"setBlendin", (PyCFunction) BL_ShapeActionActuator::sPySetBlendin, METH_VARARGS, SetBlendin_doc},
- {"setPriority", (PyCFunction) BL_ShapeActionActuator::sPySetPriority, METH_VARARGS, SetPriority_doc},
- {"setFrame", (PyCFunction) BL_ShapeActionActuator::sPySetFrame, METH_VARARGS, SetFrame_doc},
- {"setProperty", (PyCFunction) BL_ShapeActionActuator::sPySetProperty, METH_VARARGS, SetProperty_doc},
- {"setFrameProperty", (PyCFunction) BL_ShapeActionActuator::sPySetFrameProperty, METH_VARARGS, SetFrameProperty_doc},
- {"setBlendtime", (PyCFunction) BL_ShapeActionActuator::sPySetBlendtime, METH_VARARGS, SetBlendtime_doc},
-
- {"getAction", (PyCFunction) BL_ShapeActionActuator::sPyGetAction, METH_NOARGS, GetAction_doc},
- {"getStart", (PyCFunction) BL_ShapeActionActuator::sPyGetStart, METH_NOARGS, GetStart_doc},
- {"getEnd", (PyCFunction) BL_ShapeActionActuator::sPyGetEnd, METH_NOARGS, GetEnd_doc},
- {"getBlendin", (PyCFunction) BL_ShapeActionActuator::sPyGetBlendin, METH_NOARGS, GetBlendin_doc},
- {"getPriority", (PyCFunction) BL_ShapeActionActuator::sPyGetPriority, METH_NOARGS, GetPriority_doc},
- {"getFrame", (PyCFunction) BL_ShapeActionActuator::sPyGetFrame, METH_NOARGS, GetFrame_doc},
- {"getProperty", (PyCFunction) BL_ShapeActionActuator::sPyGetProperty, METH_NOARGS, GetProperty_doc},
- {"getFrameProperty", (PyCFunction) BL_ShapeActionActuator::sPyGetFrameProperty, METH_NOARGS, GetFrameProperty_doc},
- {"getType", (PyCFunction) BL_ShapeActionActuator::sPyGetType, METH_NOARGS, GetType_doc},
- {"setType", (PyCFunction) BL_ShapeActionActuator::sPySetType, METH_NOARGS, SetType_doc},
+ {"setAction", (PyCFunction) BL_ShapeActionActuator::sPySetAction, METH_VARARGS, (PY_METHODCHAR)SetAction_doc},
+ {"setStart", (PyCFunction) BL_ShapeActionActuator::sPySetStart, METH_VARARGS, (PY_METHODCHAR)SetStart_doc},
+ {"setEnd", (PyCFunction) BL_ShapeActionActuator::sPySetEnd, METH_VARARGS, (PY_METHODCHAR)SetEnd_doc},
+ {"setBlendin", (PyCFunction) BL_ShapeActionActuator::sPySetBlendin, METH_VARARGS, (PY_METHODCHAR)SetBlendin_doc},
+ {"setPriority", (PyCFunction) BL_ShapeActionActuator::sPySetPriority, METH_VARARGS, (PY_METHODCHAR)SetPriority_doc},
+ {"setFrame", (PyCFunction) BL_ShapeActionActuator::sPySetFrame, METH_VARARGS, (PY_METHODCHAR)SetFrame_doc},
+ {"setProperty", (PyCFunction) BL_ShapeActionActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+ {"setFrameProperty", (PyCFunction) BL_ShapeActionActuator::sPySetFrameProperty, METH_VARARGS, (PY_METHODCHAR)SetFrameProperty_doc},
+ {"setBlendtime", (PyCFunction) BL_ShapeActionActuator::sPySetBlendtime, METH_VARARGS, (PY_METHODCHAR)SetBlendtime_doc},
+
+ {"getAction", (PyCFunction) BL_ShapeActionActuator::sPyGetAction, METH_NOARGS, (PY_METHODCHAR)GetAction_doc},
+ {"getStart", (PyCFunction) BL_ShapeActionActuator::sPyGetStart, METH_NOARGS, (PY_METHODCHAR)GetStart_doc},
+ {"getEnd", (PyCFunction) BL_ShapeActionActuator::sPyGetEnd, METH_NOARGS, (PY_METHODCHAR)GetEnd_doc},
+ {"getBlendin", (PyCFunction) BL_ShapeActionActuator::sPyGetBlendin, METH_NOARGS, (PY_METHODCHAR)GetBlendin_doc},
+ {"getPriority", (PyCFunction) BL_ShapeActionActuator::sPyGetPriority, METH_NOARGS, (PY_METHODCHAR)GetPriority_doc},
+ {"getFrame", (PyCFunction) BL_ShapeActionActuator::sPyGetFrame, METH_NOARGS, (PY_METHODCHAR)GetFrame_doc},
+ {"getProperty", (PyCFunction) BL_ShapeActionActuator::sPyGetProperty, METH_NOARGS, (PY_METHODCHAR)GetProperty_doc},
+ {"getFrameProperty", (PyCFunction) BL_ShapeActionActuator::sPyGetFrameProperty, METH_NOARGS, (PY_METHODCHAR)GetFrameProperty_doc},
+ {"getType", (PyCFunction) BL_ShapeActionActuator::sPyGetType, METH_NOARGS, (PY_METHODCHAR)GetType_doc},
+ {"setType", (PyCFunction) BL_ShapeActionActuator::sPySetType, METH_NOARGS, (PY_METHODCHAR)SetType_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
index f58d60b026a..4d79febb7b4 100644
--- a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
+++ b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
@@ -28,13 +28,10 @@
#include "KX_BlenderScalarInterpolator.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-extern "C" int IPO_GetChannels(struct Ipo *ipo, short *channels);
-extern "C" float IPO_GetFloatValue(struct Ipo *ipo, /*IPO_Channel*/ short channel, float ctime);
-
+extern "C" {
+#include "DNA_ipo_types.h"
+#include "BKE_ipo.h"
+}
static const int BL_MAX_CHANNELS = 32;
@@ -42,7 +39,7 @@ float BL_ScalarInterpolator::GetValue(float currentTime) const {
return IPO_GetFloatValue(m_blender_ipo, m_channel, currentTime);
}
-typedef short IPO_Channel;
+
BL_InterpolatorList::BL_InterpolatorList(struct Ipo *ipo) {
IPO_Channel channels[BL_MAX_CHANNELS];
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index 78791c53d7c..4f152acc918 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -235,7 +235,8 @@ void BL_ConvertActuators(char* maggiename,
{
bIpoActuator* ipoact = (bIpoActuator*) bact->data;
bool ipochild = (ipoact->flag & ACT_IPOCHILD) !=0;
- STR_String propname = ( ipoact->name ? ipoact->name : "");
+ STR_String propname = ipoact->name;
+ STR_String frameProp = ipoact->frameProp;
// first bit?
bool ipo_as_force = (ipoact->flag & ACT_IPOFORCE);
bool local = (ipoact->flag & ACT_IPOLOCAL);
@@ -244,6 +245,7 @@ void BL_ConvertActuators(char* maggiename,
KX_IpoActuator* tmpbaseact = new KX_IpoActuator(
gameobj,
propname ,
+ frameProp,
ipoact->sta,
ipoact->end,
ipochild,
@@ -289,15 +291,19 @@ void BL_ConvertActuators(char* maggiename,
STR_String toPropName = (msgAct->toPropName
? (char*) msgAct->toPropName
: "");
- /**
- * Get the Message Subject to send.
+ /* BGE Wants "OB" prefix */
+ if (toPropName != "")
+ toPropName = "OB" + toPropName;
+
+ /**
+ * Get the Message Subject to send.
*/
STR_String subject = (msgAct->subject
? (char*) msgAct->subject
: "");
- /**
- * Get the bodyType
+ /**
+ * Get the bodyType
*/
int bodyType = msgAct->bodyType;
@@ -719,6 +725,40 @@ void BL_ConvertActuators(char* maggiename,
break;
}
prop = conact->matprop;
+ } else if (conact->type == ACT_CONST_TYPE_FH) {
+ switch (conact->mode) {
+ case ACT_CONST_DIRPX:
+ locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX;
+ min = conact->minloc[0];
+ max = conact->maxloc[0];
+ break;
+ case ACT_CONST_DIRPY:
+ locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY;
+ min = conact->minloc[1];
+ max = conact->maxloc[1];
+ break;
+ case ACT_CONST_DIRPZ:
+ locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ;
+ min = conact->minloc[2];
+ max = conact->maxloc[2];
+ break;
+ case ACT_CONST_DIRNX:
+ locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX;
+ min = conact->minloc[0];
+ max = conact->maxloc[0];
+ break;
+ case ACT_CONST_DIRNY:
+ locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY;
+ min = conact->minloc[1];
+ max = conact->maxloc[1];
+ break;
+ case ACT_CONST_DIRNZ:
+ locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ;
+ min = conact->minloc[2];
+ max = conact->maxloc[2];
+ break;
+ }
+ prop = conact->matprop;
} else {
switch (conact->flag) {
case ACT_CONST_LOCX:
diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp
index be0bb8103c0..13b7f43195d 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.cpp
+++ b/source/gameengine/Converter/KX_ConvertSensors.cpp
@@ -433,8 +433,8 @@ void BL_ConvertSensors(struct Object* blenderobject,
{
gamesensor = new SCA_KeyboardSensor(eventmgr,
gReverseKeyTranslateTable[blenderkeybdsensor->key],
- blenderkeybdsensor->qual,
- blenderkeybdsensor->qual2,
+ gReverseKeyTranslateTable[blenderkeybdsensor->qual],
+ gReverseKeyTranslateTable[blenderkeybdsensor->qual2],
(blenderkeybdsensor->type == SENS_ALL_KEYS),
blenderkeybdsensor->targetName,
blenderkeybdsensor->toggleName,
@@ -685,7 +685,6 @@ void BL_ConvertSensors(struct Object* blenderobject,
int axis =0;
int axisf =0;
int button =0;
- int buttonf =0;
int hat =0;
int hatf =0;
int prec =0;
@@ -700,7 +699,6 @@ void BL_ConvertSensors(struct Object* blenderobject,
break;
case SENS_JOY_BUTTON:
button = bjoy->button;
- buttonf = bjoy->buttonf;
joysticktype = SCA_JoystickSensor::KX_JOYSENSORMODE_BUTTON;
break;
case SENS_JOY_HAT:
@@ -719,8 +717,9 @@ void BL_ConvertSensors(struct Object* blenderobject,
joysticktype,
axis,axisf,
prec,
- button,buttonf,
- hat,hatf);
+ button,
+ hat,hatf,
+ (bjoy->flag & SENS_JOY_ANY_EVENT));
}
else
{
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h
index 9d5e31aa757..3a054454a0b 100644
--- a/source/gameengine/Expressions/PyObjectPlus.h
+++ b/source/gameengine/Expressions/PyObjectPlus.h
@@ -64,10 +64,12 @@
typedef int Py_ssize_t;
#define PY_SSIZE_T_MAX INT_MAX
#define PY_SSIZE_T_MIN INT_MIN
+#define PY_METHODCHAR char *
#else
/* Py 2.5 and later */
#define intargfunc ssizeargfunc
#define intintargfunc ssizessizeargfunc
+#define PY_METHODCHAR const char *
#endif
// some basic python macros
@@ -181,10 +183,10 @@ static inline void Py_Fatal(const char *M) {
* Method table macro (with doc)
*/
#define KX_PYMETHODTABLE(class_name, method_name) \
- {#method_name , (PyCFunction) class_name::sPy##method_name, METH_VARARGS, class_name::method_name##_doc}
+ {#method_name , (PyCFunction) class_name::sPy##method_name, METH_VARARGS, (PY_METHODCHAR)class_name::method_name##_doc}
#define KX_PYMETHODTABLE_NOARG(class_name, method_name) \
- {#method_name , (PyCFunction) class_name::sPy##method_name, METH_NOARGS, class_name::method_name##_doc}
+ {#method_name , (PyCFunction) class_name::sPy##method_name, METH_NOARGS, (PY_METHODCHAR)class_name::method_name##_doc}
/**
* Function implementation macro
diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
index 092956e6489..e8e29fb2769 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
+++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
@@ -24,7 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+#ifndef DISABLE_SDL
#include <SDL.h>
+#endif
+
+#include <stdio.h>
#include "SCA_Joystick.h"
#include "SCA_JoystickPrivate.h"
@@ -40,7 +44,12 @@ SCA_Joystick::SCA_Joystick(short int index)
m_buttonnum(-2),
m_hatdir(-2),
m_isinit(0),
- m_istrig(0)
+ m_istrig_axis(0),
+ m_istrig_button(0),
+ m_istrig_hat(0),
+ m_axismax(-1),
+ m_buttonmax(-1),
+ m_hatmax(-1)
{
#ifndef DISABLE_SDL
m_private = new PrivateData();
@@ -116,12 +125,19 @@ void SCA_Joystick::cSetPrecision(int val)
}
+bool SCA_Joystick::aAnyAxisIsPositive(int axis)
+{
+ bool result;
+ int res = pAxisTest(axis);
+ res > m_prec? result = true: result = false;
+ return result;
+}
+
bool SCA_Joystick::aRightAxisIsPositive(int axis)
{
bool result;
int res = pGetAxis(axis,1);
res > m_prec? result = true: result = false;
- m_istrig = result;
return result;
}
@@ -131,7 +147,6 @@ bool SCA_Joystick::aUpAxisIsPositive(int axis)
bool result;
int res = pGetAxis(axis,0);
res < -m_prec? result = true : result = false;
- m_istrig = result;
return result;
}
@@ -141,7 +156,6 @@ bool SCA_Joystick::aLeftAxisIsPositive(int axis)
bool result;
int res = pGetAxis(axis,1);
res < -m_prec ? result = true : result = false;
- m_istrig = result;
return result;
}
@@ -151,10 +165,18 @@ bool SCA_Joystick::aDownAxisIsPositive(int axis)
bool result;
int res = pGetAxis(axis,0);
res > m_prec ? result = true:result = false;
- m_istrig = result;
return result;
}
+bool SCA_Joystick::aAnyButtonPressIsPositive(void)
+{
+ return (m_buttonnum==-2) ? false : true;
+}
+
+bool SCA_Joystick::aAnyButtonReleaseIsPositive(void)
+{
+ return (m_buttonnum==-2) ? true : false;
+}
bool SCA_Joystick::aButtonPressIsPositive(int button)
{
@@ -163,7 +185,6 @@ bool SCA_Joystick::aButtonPressIsPositive(int button)
#else
bool result;
SDL_JoystickGetButton(m_private->m_joystick, button)? result = true:result = false;
- m_istrig = result;
return result;
#endif
}
@@ -176,7 +197,6 @@ bool SCA_Joystick::aButtonReleaseIsPositive(int button)
#else
bool result;
SDL_JoystickGetButton(m_private->m_joystick, button)? result = false : result = true;
- m_istrig = result;
return result;
#endif
}
@@ -187,27 +207,9 @@ bool SCA_Joystick::aHatIsPositive(int dir)
bool result;
int res = pGetHat(dir);
res == dir? result = true : result = false;
- m_istrig = result;
return result;
}
-
-int SCA_Joystick::pGetButtonPress(int button)
-{
- if(button == m_buttonnum)
- return m_buttonnum;
- return -2;
-}
-
-
-int SCA_Joystick::pGetButtonRelease(int button)
-{
- if(button == m_buttonnum)
- return m_buttonnum;
- return -2;
-}
-
-
int SCA_Joystick::pGetHat(int direction)
{
if(direction == m_hatdir){
@@ -218,52 +220,19 @@ int SCA_Joystick::pGetHat(int direction)
int SCA_Joystick::GetNumberOfAxes()
{
-#ifdef DISABLE_SDL
- return -1;
-#else
- int number;
- if(m_isinit){
- if(m_private->m_joystick){
- number = SDL_JoystickNumAxes(m_private->m_joystick);
- return number;
- }
- }
- return -1;
-#endif
+ return m_axismax;
}
int SCA_Joystick::GetNumberOfButtons()
{
-#ifdef DISABLE_SDL
- return -1;
-#else
- int number;
- if(m_isinit){
- if(m_private->m_joystick){
- number = SDL_JoystickNumButtons(m_private->m_joystick);
- return number;
- }
- }
- return -1;
-#endif
+ return m_buttonmax;
}
int SCA_Joystick::GetNumberOfHats()
{
-#ifdef DISABLE_SDL
- return -1;
-#else
- int number;
- if(m_isinit){
- if(m_private->m_joystick){
- number = SDL_JoystickNumHats(m_private->m_joystick);
- return number;
- }
- }
- return -1;
-#endif
+ return m_hatmax;
}
bool SCA_Joystick::CreateJoystickDevice(void)
@@ -280,9 +249,14 @@ bool SCA_Joystick::CreateJoystickDevice(void)
m_private->m_joystick = SDL_JoystickOpen(m_joyindex);
SDL_JoystickEventState(SDL_ENABLE);
-
- echo("Joystick " << m_joyindex << " initialized");
m_isinit = true;
+
+ echo("Joystick " << m_joyindex << " initialized");
+
+ /* must run after being initialized */
+ m_axismax = SDL_JoystickNumAxes(m_private->m_joystick);
+ m_buttonmax = SDL_JoystickNumButtons(m_private->m_joystick);
+ m_hatmax = SDL_JoystickNumHats(m_private->m_joystick);
}
return true;
#endif
@@ -314,10 +288,10 @@ int SCA_Joystick::Connected(void)
void SCA_Joystick::pFillAxes()
{
#ifndef DISABLE_SDL
- if(GetNumberOfAxes() == 1){
+ if(m_axismax == 1){
m_axis10 = SDL_JoystickGetAxis(m_private->m_joystick, 0);
m_axis11 = SDL_JoystickGetAxis(m_private->m_joystick, 1);
- }else if(GetNumberOfAxes() > 1){
+ }else if(m_axismax > 1){
m_axis10 = SDL_JoystickGetAxis(m_private->m_joystick, 0);
m_axis11 = SDL_JoystickGetAxis(m_private->m_joystick, 1);
m_axis20 = SDL_JoystickGetAxis(m_private->m_joystick, 2);
@@ -340,3 +314,25 @@ int SCA_Joystick::pGetAxis(int axisnum, int udlr)
return 0;
}
+int SCA_Joystick::pAxisTest(int axisnum)
+{
+#ifndef DISABLE_SDL
+ short i1,i2;
+ if(axisnum == 1) {
+ i1 = m_axis10; i2 = m_axis11;
+ }
+ else if(axisnum == 2) {
+ i1 = m_axis20; i2 = m_axis21;
+ }
+ /* long winded way to do
+ * return MAX2(abs(i1), abs(i2))
+ * avoid abs from math.h */
+ if (i1 < 0) i1 = -i1;
+ if (i2 < 0) i2 = -i2;
+ if (i1 <i2) return i2;
+ else return i1;
+#else
+ return 0;
+#endif
+}
+
diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.h b/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
index ea7ecf7cefe..8335d5538ad 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
+++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
@@ -29,7 +29,9 @@
#define _SCA_JOYSTICK_H_
#include "SCA_JoystickDefines.h"
+#ifndef DISABLE_SDL
#include "SDL.h"
+#endif
/*
* Basic Joystick class
@@ -83,9 +85,12 @@ class SCA_Joystick
/*
* max # of buttons avail
*/
-
+
+ int m_axismax;
int m_buttonmax;
- /*
+ int m_hatmax;
+
+ /*
* hat values stored here
*/
int m_hatnum;
@@ -101,8 +106,10 @@ class SCA_Joystick
bool m_isinit;
- /* is triggered */
- bool m_istrig;
+ /* is triggered for each event type */
+ bool m_istrig_axis;
+ bool m_istrig_button;
+ bool m_istrig_hat;
#ifndef DISABLE_SDL
/*
@@ -134,18 +141,12 @@ class SCA_Joystick
/*
* returns m_axis10,m_axis11...
*/
- int pGetAxis(int axisnum, int udlr);
-
- /*
- * gets the current button
- */
-
- int pGetButtonPress(int button);
+ int pAxisTest(int axisnum);
/*
- * returns if no button is pressed
+ * returns m_axis10,m_axis11...
*/
- int pGetButtonRelease(int button);
+ int pGetAxis(int axisnum, int udlr);
/*
* gets the current hat direction
@@ -165,11 +166,14 @@ public:
/*
*/
-
+ bool aAnyAxisIsPositive(int axis);
bool aUpAxisIsPositive(int axis);
bool aDownAxisIsPositive(int axis);
bool aLeftAxisIsPositive(int axis);
bool aRightAxisIsPositive(int axis);
+
+ bool aAnyButtonPressIsPositive(void);
+ bool aAnyButtonReleaseIsPositive(void);
bool aButtonPressIsPositive(int button);
bool aButtonReleaseIsPositive(int button);
bool aHatIsPositive(int dir);
@@ -210,8 +214,16 @@ public:
return m_prec;
}
- bool IsTrig(void){
- return m_istrig;
+ bool IsTrigAxis(void){
+ return m_istrig_axis;
+ }
+
+ bool IsTrigButton(void){
+ return m_istrig_button;
+ }
+
+ bool IsTrigHat(void){
+ return m_istrig_hat;
}
/*
diff --git a/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp b/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
index 0e2078265c9..73ca288861d 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
+++ b/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
@@ -24,7 +24,10 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+#ifndef DISABLE_SDL
#include <SDL.h>
+#endif
+
#include "SCA_Joystick.h"
#include "SCA_JoystickPrivate.h"
@@ -35,7 +38,7 @@ void SCA_Joystick::OnAxisMotion(SDL_Event* sdl_event)
pFillAxes();
m_axisnum = sdl_event->jaxis.axis;
m_axisvalue = sdl_event->jaxis.value;
- m_istrig = 1;
+ m_istrig_axis = 1;
}
@@ -43,22 +46,31 @@ void SCA_Joystick::OnHatMotion(SDL_Event* sdl_event)
{
m_hatdir = sdl_event->jhat.value;
m_hatnum = sdl_event->jhat.hat;
- m_istrig = 1;
+ m_istrig_hat = 1;
}
-
void SCA_Joystick::OnButtonUp(SDL_Event* sdl_event)
{
+ m_istrig_button = 1;
+
+ /* this is needed for the "all events" option
+ * so we know if there are no buttons pressed */
+ int i;
+ for (i=0; i<m_buttonmax; i++) {
+ if (SDL_JoystickGetButton(m_private->m_joystick, i)) {
+ m_buttonnum = i;
+ return;
+ }
+ }
m_buttonnum = -2;
}
void SCA_Joystick::OnButtonDown(SDL_Event* sdl_event)
{
- m_buttonmax = GetNumberOfButtons();
- if(sdl_event->jbutton.button >= 1 || sdl_event->jbutton.button <= m_buttonmax)
+ if(sdl_event->jbutton.button >= 0 || sdl_event->jbutton.button <= m_buttonmax)
{
- m_istrig = 1;
+ m_istrig_button = 1;
m_buttonnum = sdl_event->jbutton.button;
}
}
@@ -66,7 +78,7 @@ void SCA_Joystick::OnButtonDown(SDL_Event* sdl_event)
void SCA_Joystick::OnNothing(SDL_Event* sdl_event)
{
- m_istrig = 0;
+ m_istrig_axis = m_istrig_button = m_istrig_hat = 0;
}
/* only handle events for 1 joystick */
@@ -74,7 +86,13 @@ void SCA_Joystick::OnNothing(SDL_Event* sdl_event)
void SCA_Joystick::HandleEvents(void)
{
SDL_Event sdl_event;
-
+
+ int i;
+ for (i=0; i<JOYINDEX_MAX; i++) {
+ if(SCA_Joystick::m_instance[i])
+ SCA_Joystick::m_instance[i]->OnNothing(&sdl_event);
+ }
+
if(SDL_PollEvent(&sdl_event))
{
/* Note! m_instance[sdl_event.jaxis.which]
diff --git a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
index 95fb7e20ad0..7c37b237d60 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
@@ -149,8 +149,8 @@ PyParentObject SCA_ActuatorSensor::Parents[] = {
};
PyMethodDef SCA_ActuatorSensor::Methods[] = {
- {"getActuator", (PyCFunction) SCA_ActuatorSensor::sPyGetActuator, METH_NOARGS, GetActuator_doc},
- {"setActuator", (PyCFunction) SCA_ActuatorSensor::sPySetActuator, METH_VARARGS, SetActuator_doc},
+ {"getActuator", (PyCFunction) SCA_ActuatorSensor::sPyGetActuator, METH_NOARGS, (PY_METHODCHAR)GetActuator_doc},
+ {"setActuator", (PyCFunction) SCA_ActuatorSensor::sPySetActuator, METH_VARARGS, (PY_METHODCHAR)SetActuator_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GameLogic/SCA_DelaySensor.cpp b/source/gameengine/GameLogic/SCA_DelaySensor.cpp
index 577c523f51f..f15d4c7249f 100644
--- a/source/gameengine/GameLogic/SCA_DelaySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_DelaySensor.cpp
@@ -159,13 +159,13 @@ PyParentObject SCA_DelaySensor::Parents[] = {
PyMethodDef SCA_DelaySensor::Methods[] = {
/* setProperty */
- {"setDelay", (PyCFunction) SCA_DelaySensor::sPySetDelay, METH_VARARGS, SetDelay_doc},
- {"setDuration", (PyCFunction) SCA_DelaySensor::sPySetDuration, METH_VARARGS, SetDuration_doc},
- {"setRepeat", (PyCFunction) SCA_DelaySensor::sPySetRepeat, METH_VARARGS, SetRepeat_doc},
+ {"setDelay", (PyCFunction) SCA_DelaySensor::sPySetDelay, METH_VARARGS, (PY_METHODCHAR)SetDelay_doc},
+ {"setDuration", (PyCFunction) SCA_DelaySensor::sPySetDuration, METH_VARARGS, (PY_METHODCHAR)SetDuration_doc},
+ {"setRepeat", (PyCFunction) SCA_DelaySensor::sPySetRepeat, METH_VARARGS, (PY_METHODCHAR)SetRepeat_doc},
/* getProperty */
- {"getDelay", (PyCFunction) SCA_DelaySensor::sPyGetDelay, METH_NOARGS, GetDelay_doc},
- {"getDuration", (PyCFunction) SCA_DelaySensor::sPyGetDuration, METH_NOARGS, GetDuration_doc},
- {"getRepeat", (PyCFunction) SCA_DelaySensor::sPyGetRepeat, METH_NOARGS, GetRepeat_doc},
+ {"getDelay", (PyCFunction) SCA_DelaySensor::sPyGetDelay, METH_NOARGS, (PY_METHODCHAR)GetDelay_doc},
+ {"getDuration", (PyCFunction) SCA_DelaySensor::sPyGetDuration, METH_NOARGS, (PY_METHODCHAR)GetDuration_doc},
+ {"getRepeat", (PyCFunction) SCA_DelaySensor::sPyGetRepeat, METH_NOARGS, (PY_METHODCHAR)GetRepeat_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GameLogic/SCA_ISensor.cpp b/source/gameengine/GameLogic/SCA_ISensor.cpp
index 260805e0aa8..b10ac676464 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ISensor.cpp
@@ -168,31 +168,31 @@ PyParentObject SCA_ISensor::Parents[] = {
};
PyMethodDef SCA_ISensor::Methods[] = {
{"isPositive", (PyCFunction) SCA_ISensor::sPyIsPositive,
- METH_NOARGS, IsPositive_doc},
+ METH_NOARGS, (PY_METHODCHAR)IsPositive_doc},
{"isTriggered", (PyCFunction) SCA_ISensor::sPyIsTriggered,
- METH_VARARGS, IsTriggered_doc},
+ METH_VARARGS, (PY_METHODCHAR)IsTriggered_doc},
{"getUsePosPulseMode", (PyCFunction) SCA_ISensor::sPyGetUsePosPulseMode,
- METH_NOARGS, GetUsePosPulseMode_doc},
+ METH_NOARGS, (PY_METHODCHAR)GetUsePosPulseMode_doc},
{"setUsePosPulseMode", (PyCFunction) SCA_ISensor::sPySetUsePosPulseMode,
- METH_VARARGS, SetUsePosPulseMode_doc},
+ METH_VARARGS, (PY_METHODCHAR)SetUsePosPulseMode_doc},
{"getFrequency", (PyCFunction) SCA_ISensor::sPyGetFrequency,
- METH_NOARGS, GetFrequency_doc},
+ METH_NOARGS, (PY_METHODCHAR)GetFrequency_doc},
{"setFrequency", (PyCFunction) SCA_ISensor::sPySetFrequency,
- METH_VARARGS, SetFrequency_doc},
+ METH_VARARGS, (PY_METHODCHAR)SetFrequency_doc},
{"getUseNegPulseMode", (PyCFunction) SCA_ISensor::sPyGetUseNegPulseMode,
- METH_NOARGS, GetUseNegPulseMode_doc},
+ METH_NOARGS, (PY_METHODCHAR)GetUseNegPulseMode_doc},
{"setUseNegPulseMode", (PyCFunction) SCA_ISensor::sPySetUseNegPulseMode,
- METH_VARARGS, SetUseNegPulseMode_doc},
+ METH_VARARGS, (PY_METHODCHAR)SetUseNegPulseMode_doc},
{"getInvert", (PyCFunction) SCA_ISensor::sPyGetInvert,
- METH_NOARGS, GetInvert_doc},
+ METH_NOARGS, (PY_METHODCHAR)GetInvert_doc},
{"setInvert", (PyCFunction) SCA_ISensor::sPySetInvert,
- METH_VARARGS, SetInvert_doc},
+ METH_VARARGS, (PY_METHODCHAR)SetInvert_doc},
{"getLevel", (PyCFunction) SCA_ISensor::sPyGetLevel,
- METH_NOARGS, GetLevel_doc},
+ METH_NOARGS, (PY_METHODCHAR)GetLevel_doc},
{"setLevel", (PyCFunction) SCA_ISensor::sPySetLevel,
- METH_VARARGS, SetLevel_doc},
+ METH_VARARGS, (PY_METHODCHAR)SetLevel_doc},
{"reset", (PyCFunction) SCA_ISensor::sPyReset,
- METH_NOARGS, Reset_doc},
+ METH_NOARGS, (PY_METHODCHAR)Reset_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GameLogic/SCA_ISensor.h b/source/gameengine/GameLogic/SCA_ISensor.h
index 0d65270dc7b..d1872009291 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.h
+++ b/source/gameengine/GameLogic/SCA_ISensor.h
@@ -116,8 +116,8 @@ public:
/** set the level detection on or off */
void SetLevel(bool lvl);
- void RegisterToManager();
- void UnregisterToManager();
+ virtual void RegisterToManager();
+ virtual void UnregisterToManager();
virtual float GetNumber();
diff --git a/source/gameengine/GameLogic/SCA_JoystickManager.cpp b/source/gameengine/GameLogic/SCA_JoystickManager.cpp
index d874b5b013a..f3ce549a637 100644
--- a/source/gameengine/GameLogic/SCA_JoystickManager.cpp
+++ b/source/gameengine/GameLogic/SCA_JoystickManager.cpp
@@ -51,7 +51,8 @@ SCA_JoystickManager::~SCA_JoystickManager()
{
int i;
for (i=0; i<JOYINDEX_MAX; i++) {
- m_joystick[i]->ReleaseInstance();
+ if(m_joystick[i])
+ m_joystick[i]->ReleaseInstance();
}
}
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
index f486e7985b3..8b96840b149 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
@@ -45,27 +45,26 @@ SCA_JoystickSensor::SCA_JoystickSensor(class SCA_JoystickManager* eventmgr,
short int joyindex,
short int joymode,
int axis, int axisf,int prec,
- int button, int buttonf,
- int hat, int hatf,
+ int button,
+ int hat, int hatf, bool allevents,
PyTypeObject* T )
:SCA_ISensor(gameobj,eventmgr,T),
m_pJoystickMgr(eventmgr),
m_axis(axis),
m_axisf(axisf),
m_button(button),
- m_buttonf(buttonf),
m_hat(hat),
m_hatf(hatf),
m_precision(prec),
m_joymode(joymode),
- m_joyindex(joyindex)
+ m_joyindex(joyindex),
+ m_bAllEvents(allevents)
{
/*
std::cout << " axis " << m_axis << std::endl;
std::cout << " axis flag " << m_axisf << std::endl;
std::cout << " precision " << m_precision << std::endl;
std::cout << " button " << m_button << std::endl;
-std::cout << " button flag "<< m_buttonf << std::endl;
std::cout << " hat " << m_hat << std::endl;
std::cout << " hat flag " << m_hatf << std::endl;
*/
@@ -75,6 +74,7 @@ std::cout << " hat flag " << m_hatf << std::endl;
void SCA_JoystickSensor::Init()
{
m_istrig=(m_invert)?1:0;
+ m_istrig_prev=0;
m_reset = true;
}
@@ -108,7 +108,7 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
bool result = false;
bool reset = m_reset && m_level;
- if(js==NULL)
+ if(js==NULL) /* no joystick - dont do anything */
return false;
m_reset = false;
@@ -123,8 +123,23 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
m_axisf == 3 == down
numberof== m_axis -- max 2
*/
+
+ if (!js->IsTrigAxis() && !reset) /* No events from SDL? - dont bother */
+ return false;
+
js->cSetPrecision(m_precision);
- if(m_axisf == 1){
+ if (m_bAllEvents) {
+ if(js->aAnyAxisIsPositive(m_axis)){
+ m_istrig = 1;
+ result = true;
+ }else{
+ if(m_istrig){
+ m_istrig = 0;
+ result = true;
+ }
+ }
+ }
+ else if(m_axisf == 1){
if(js->aUpAxisIsPositive(m_axis)){
m_istrig = 1;
result = true;
@@ -135,7 +150,7 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
}
}
}
- if(m_axisf == 3){
+ else if(m_axisf == 3){
if(js->aDownAxisIsPositive(m_axis)){
m_istrig = 1;
result = true;
@@ -146,7 +161,7 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
}
}
}
- if(m_axisf == 2){
+ else if(m_axisf == 2){
if(js->aLeftAxisIsPositive(m_axis)){
m_istrig = 1;
result = true;
@@ -157,7 +172,7 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
}
}
}
- if(m_axisf == 0){
+ else if(m_axisf == 0){
if(js->aRightAxisIsPositive(m_axis)){
m_istrig = 1;
result = true;
@@ -173,32 +188,20 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
case KX_JOYSENSORMODE_BUTTON:
{
/* what is what!
- pressed = m_buttonf == 0
- released = m_buttonf == 1
m_button = the actual button in question
*/
- if(m_buttonf == 0){
- if(js->aButtonPressIsPositive(m_button)){
- m_istrig = 1;
+ if (!js->IsTrigButton() && !reset) /* No events from SDL? - dont bother */
+ return false;
+
+ if(( m_bAllEvents && js->aAnyButtonPressIsPositive()) || (!m_bAllEvents && js->aButtonPressIsPositive(m_button))) {
+ m_istrig = 1;
+ result = true;
+ }else {
+ if(m_istrig){
+ m_istrig = 0;
result = true;
- }else {
- if(m_istrig){
- m_istrig = 0;
- result = true;
- }
}
}
- if(m_buttonf == 1){
- if(js->aButtonReleaseIsPositive(m_button)){
- m_istrig = 1;
- result = true;
- }else {
- if(m_istrig){
- m_istrig = 0;
- result = true;
- }
- }
- }
break;
}
case KX_JOYSENSORMODE_HAT:
@@ -207,6 +210,10 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
numberof = m_hat -- max 2
direction= m_hatf -- max 12
*/
+
+ if (!js->IsTrigHat() && !reset) /* No events from SDL? - dont bother */
+ return false;
+
if(m_hat == 1){
if(js->aHatIsPositive(m_hatf)){
m_istrig = 1;
@@ -229,19 +236,6 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
}
}
}
- /*
- if(m_hat == 3){
- if(js->aHatIsPositive(m_hatf)){
- m_istrig = 1;
- result = true;
- }else{
- if(m_istrig){
- m_istrig = 0;
- result = true;
- }
- }
- }
- */
break;
}
/* test for ball anyone ?*/
@@ -250,25 +244,14 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
break;
}
- if (js->IsTrig()) {
- /* The if below detects changes with the joystick trigger state.
- * js->IsTrig() will stay true as long as the key is held.
- * even though the event from SDL will only be sent once.
- * (js->IsTrig() && m_istrig_lastjs) - when true it means this sensor
- * had the same joystick trigger state last time,
- * Setting the result false this time means it wont run the sensors
- * controller every time (like a pulse sensor)
- *
- * This is not done with the joystick its self incase other sensors use
- * it or become active.
- */
- if (m_istrig_lastjs) {
+ /* if not all events are enabled, only send a positive pulse when
+ * the button state changes */
+ if (!m_bAllEvents) {
+ if (m_istrig_prev == m_istrig) {
result = false;
+ } else {
+ m_istrig_prev = m_istrig;
}
- m_istrig_lastjs = true;
- } else {
- m_istrig = 0;
- m_istrig_lastjs = false;
}
if (reset)
@@ -321,21 +304,22 @@ PyParentObject SCA_JoystickSensor::Parents[] = {
PyMethodDef SCA_JoystickSensor::Methods[] = {
- {"getIndex", (PyCFunction) SCA_JoystickSensor::sPyGetIndex, METH_NOARGS, GetIndex_doc},
- {"setIndex", (PyCFunction) SCA_JoystickSensor::sPySetIndex, METH_O, SetIndex_doc},
- {"getAxis", (PyCFunction) SCA_JoystickSensor::sPyGetAxis, METH_NOARGS, GetAxis_doc},
- {"setAxis", (PyCFunction) SCA_JoystickSensor::sPySetAxis, METH_VARARGS, SetAxis_doc},
- {"getAxisValue", (PyCFunction) SCA_JoystickSensor::sPyGetRealAxis, METH_NOARGS, GetRealAxis_doc},
- {"getThreshold", (PyCFunction) SCA_JoystickSensor::sPyGetThreshold, METH_NOARGS, GetThreshold_doc},
- {"setThreshold", (PyCFunction) SCA_JoystickSensor::sPySetThreshold, METH_VARARGS, SetThreshold_doc},
- {"getButton", (PyCFunction) SCA_JoystickSensor::sPyGetButton, METH_NOARGS, GetButton_doc},
- {"setButton", (PyCFunction) SCA_JoystickSensor::sPySetButton, METH_VARARGS, SetButton_doc},
- {"getHat", (PyCFunction) SCA_JoystickSensor::sPyGetHat, METH_NOARGS, GetHat_doc},
- {"setHat", (PyCFunction) SCA_JoystickSensor::sPySetHat, METH_VARARGS, SetHat_doc},
- {"getNumAxes", (PyCFunction) SCA_JoystickSensor::sPyNumberOfAxes, METH_NOARGS, NumberOfAxes_doc},
- {"getNumButtons",(PyCFunction) SCA_JoystickSensor::sPyNumberOfButtons,METH_NOARGS, NumberOfButtons_doc},
- {"getNumHats", (PyCFunction) SCA_JoystickSensor::sPyNumberOfHats, METH_NOARGS, NumberOfHats_doc},
- {"isConnected", (PyCFunction) SCA_JoystickSensor::sPyConnected, METH_NOARGS, Connected_doc},
+ {"getIndex", (PyCFunction) SCA_JoystickSensor::sPyGetIndex, METH_NOARGS, (PY_METHODCHAR)GetIndex_doc},
+ {"setIndex", (PyCFunction) SCA_JoystickSensor::sPySetIndex, METH_O, (PY_METHODCHAR)SetIndex_doc},
+ {"getAxis", (PyCFunction) SCA_JoystickSensor::sPyGetAxis, METH_NOARGS, (PY_METHODCHAR)GetAxis_doc},
+ {"setAxis", (PyCFunction) SCA_JoystickSensor::sPySetAxis, METH_VARARGS, (PY_METHODCHAR)SetAxis_doc},
+ {"getAxisValue", (PyCFunction) SCA_JoystickSensor::sPyGetAxisValue, METH_NOARGS, (PY_METHODCHAR)GetAxisValue_doc},
+ {"getThreshold", (PyCFunction) SCA_JoystickSensor::sPyGetThreshold, METH_NOARGS, (PY_METHODCHAR)GetThreshold_doc},
+ {"setThreshold", (PyCFunction) SCA_JoystickSensor::sPySetThreshold, METH_VARARGS, (PY_METHODCHAR)SetThreshold_doc},
+ {"getButton", (PyCFunction) SCA_JoystickSensor::sPyGetButton, METH_NOARGS, (PY_METHODCHAR)GetButton_doc},
+ {"setButton", (PyCFunction) SCA_JoystickSensor::sPySetButton, METH_O, (PY_METHODCHAR)SetButton_doc},
+ {"getButtonValue",(PyCFunction) SCA_JoystickSensor::sPyGetButtonValue, METH_NOARGS,(PY_METHODCHAR)GetButtonValue_doc},
+ {"getHat", (PyCFunction) SCA_JoystickSensor::sPyGetHat, METH_NOARGS, (PY_METHODCHAR)GetHat_doc},
+ {"setHat", (PyCFunction) SCA_JoystickSensor::sPySetHat, METH_VARARGS, (PY_METHODCHAR)SetHat_doc},
+ {"getNumAxes", (PyCFunction) SCA_JoystickSensor::sPyNumberOfAxes, METH_NOARGS, (PY_METHODCHAR)NumberOfAxes_doc},
+ {"getNumButtons",(PyCFunction) SCA_JoystickSensor::sPyNumberOfButtons,METH_NOARGS, (PY_METHODCHAR)NumberOfButtons_doc},
+ {"getNumHats", (PyCFunction) SCA_JoystickSensor::sPyNumberOfHats, METH_NOARGS, (PY_METHODCHAR)NumberOfHats_doc},
+ {"isConnected", (PyCFunction) SCA_JoystickSensor::sPyConnected, METH_NOARGS, (PY_METHODCHAR)Connected_doc},
{NULL,NULL} //Sentinel
};
@@ -372,16 +356,16 @@ PyObject* SCA_JoystickSensor::PySetIndex( PyObject* self, PyObject* value ) {
/* get axis ---------------------------------------------------------- */
const char SCA_JoystickSensor::GetAxis_doc[] =
"getAxis\n"
-"\tReturns the current state of the axis.\n";
+"\tReturns the current axis this sensor reacts to.\n";
PyObject* SCA_JoystickSensor::PyGetAxis( PyObject* self) {
- return PyInt_FromLong(m_joyindex);
+ return Py_BuildValue("[ii]",m_axis, m_axisf);
}
/* set axis ---------------------------------------------------------- */
const char SCA_JoystickSensor::SetAxis_doc[] =
"setAxis\n"
-"\tSets the current state of the axis.\n";
+"\tSets the current axis this sensor reacts to.\n";
PyObject* SCA_JoystickSensor::PySetAxis( PyObject* self, PyObject* args ) {
int axis,axisflag;
@@ -395,10 +379,10 @@ PyObject* SCA_JoystickSensor::PySetAxis( PyObject* self, PyObject* args ) {
/* get axis value ----------------------------------------------------- */
-const char SCA_JoystickSensor::GetRealAxis_doc[] =
+const char SCA_JoystickSensor::GetAxisValue_doc[] =
"getAxisValue\n"
-"\tReturns a list of the values for each axis .\n";
-PyObject* SCA_JoystickSensor::PyGetRealAxis( PyObject* self) {
+"\tReturns a list of the values for the current state of each axis.\n";
+PyObject* SCA_JoystickSensor::PyGetAxisValue( PyObject* self) {
SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
if(joy)
return Py_BuildValue("[iiii]", joy->GetAxis10(), joy->GetAxis11(), joy->GetAxis20(), joy->GetAxis21());
@@ -429,30 +413,49 @@ PyObject* SCA_JoystickSensor::PySetThreshold( PyObject* self, PyObject* args ) {
Py_RETURN_NONE;
}
-
/* get button -------------------------------------------------------- */
const char SCA_JoystickSensor::GetButton_doc[] =
"getButton\n"
-"\tReturns the currently pressed button.\n";
+"\tReturns the current button this sensor is checking.\n";
PyObject* SCA_JoystickSensor::PyGetButton( PyObject* self) {
- return Py_BuildValue("[ii]",m_button, m_buttonf);
+ return PyInt_FromLong(m_button);
}
-
/* set button -------------------------------------------------------- */
const char SCA_JoystickSensor::SetButton_doc[] =
"setButton\n"
"\tSets the button the sensor reacts to.\n";
-PyObject* SCA_JoystickSensor::PySetButton( PyObject* self, PyObject* args ) {
- int button,buttonflag;
- if(!PyArg_ParseTuple(args, "ii", &button, &buttonflag)){
+PyObject* SCA_JoystickSensor::PySetButton( PyObject* self, PyObject* value ) {
+ int button = PyInt_AsLong(value);
+ if(button==-1 && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_ValueError, "expected an int");
return NULL;
}
m_button = button;
- m_buttonf = buttonflag;
Py_RETURN_NONE;
}
+/* get button value -------------------------------------------------- */
+const char SCA_JoystickSensor::GetButtonValue_doc[] =
+"getButtonValue\n"
+"\tReturns a list containing the indicies of the current pressed state of each button.\n";
+PyObject* SCA_JoystickSensor::PyGetButtonValue( PyObject* self) {
+ SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
+ PyObject *ls = PyList_New(0);
+ PyObject *value;
+ int i;
+
+ if(joy) {
+ for (i=0; i < joy->GetNumberOfButtons(); i++) {
+ if (joy->aButtonPressIsPositive(i)) {
+ value = PyInt_FromLong(i);
+ PyList_Append(ls, value);
+ Py_DECREF(value);
+ }
+ }
+ }
+ return ls;
+}
/* get hat ----------------------------------------------------------- */
const char SCA_JoystickSensor::GetHat_doc[] =
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.h b/source/gameengine/GameLogic/SCA_JoystickSensor.h
index 8b74f6e0296..d316ad1119c 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.h
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.h
@@ -73,7 +73,7 @@ class SCA_JoystickSensor :public SCA_ISensor
* Otherwise it will trigger all the time
* this is used to see if the trigger state changes.
*/
- bool m_istrig_lastjs;
+ bool m_istrig_prev;
/**
* The mode to determine axis,button or hat
*/
@@ -83,6 +83,11 @@ class SCA_JoystickSensor :public SCA_ISensor
*/
short int m_joyindex;
+ /**
+ * Detect all events for the currently selected type
+ */
+ bool m_bAllEvents;
+
enum KX_JOYSENSORMODE {
KX_JOYSENSORMODE_NODEF = 0,
KX_JOYSENSORMODE_AXIS,
@@ -98,8 +103,8 @@ public:
short int joyindex,
short int joymode,
int axis, int axisf,int prec,
- int button, int buttonf,
- int hat, int hatf,
+ int button,
+ int hat, int hatf, bool allevents,
PyTypeObject* T=&Type );
virtual ~SCA_JoystickSensor();
virtual CValue* GetReplica();
@@ -124,12 +129,13 @@ public:
/* Axes*/
KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetAxis);
KX_PYMETHOD_DOC_VARARGS(SCA_JoystickSensor,SetAxis);
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetRealAxis);
+ KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetAxisValue);
KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetThreshold);
KX_PYMETHOD_DOC_VARARGS(SCA_JoystickSensor,SetThreshold);
/* Buttons */
KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetButton);
- KX_PYMETHOD_DOC_VARARGS(SCA_JoystickSensor,SetButton);
+ KX_PYMETHOD_DOC_O(SCA_JoystickSensor,SetButton);
+ KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetButtonValue);
/* Hats */
KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetHat);
KX_PYMETHOD_DOC_VARARGS(SCA_JoystickSensor,SetHat);
diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
index ac773139794..fa39a13679f 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
@@ -122,6 +122,10 @@ bool SCA_KeyboardSensor::Evaluate(CValue* eventval)
{
bool result = false;
bool reset = m_reset && m_level;
+ bool qual = true;
+ bool qual_change = false;
+ short int m_val_orig = m_val;
+
SCA_IInputDevice* inputdev = m_pKeyboardMgr->GetInputDevice();
// cerr << "SCA_KeyboardSensor::Eval event, sensing for "<< m_hotkey << " at device " << inputdev << "\n";
@@ -202,7 +206,43 @@ bool SCA_KeyboardSensor::Evaluate(CValue* eventval)
(SCA_IInputDevice::KX_EnumInputs) m_hotkey);
// cerr << "======= SCA_KeyboardSensor::Evaluate:: status: " << inevent.m_status << endl;
-
+
+
+ /* Check qualifier keys
+ * - see if the qualifiers we request are pressed - 'qual' true/false
+ * - see if the qualifiers we request changed their state - 'qual_change' true/false
+ */
+ if (m_qual > 0) {
+ const SCA_InputEvent & qualevent = inputdev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) m_qual);
+ switch(qualevent.m_status) {
+ case SCA_InputEvent::KX_NO_INPUTSTATUS:
+ qual = false;
+ break;
+ case SCA_InputEvent::KX_JUSTRELEASED:
+ qual_change = true;
+ qual = false;
+ break;
+ case SCA_InputEvent::KX_JUSTACTIVATED:
+ qual_change = true;
+ }
+ }
+ if (m_qual2 > 0 && qual==true) {
+ const SCA_InputEvent & qualevent = inputdev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) m_qual2);
+ /* copy of above */
+ switch(qualevent.m_status) {
+ case SCA_InputEvent::KX_NO_INPUTSTATUS:
+ qual = false;
+ break;
+ case SCA_InputEvent::KX_JUSTRELEASED:
+ qual_change = true;
+ qual = false;
+ break;
+ case SCA_InputEvent::KX_JUSTACTIVATED:
+ qual_change = true;
+ }
+ }
+ /* done reading qualifiers */
+
if (inevent.m_status == SCA_InputEvent::KX_NO_INPUTSTATUS)
{
if (m_val == 1)
@@ -240,7 +280,33 @@ bool SCA_KeyboardSensor::Evaluate(CValue* eventval)
}
}
}
+
+ /* Modify the key state based on qual(s)
+ * Tested carefuly. dont touch unless your really sure.
+ * note, this will only change the results if key modifiers are set.
+ *
+ * When all modifiers and keys are positive
+ * - pulse true
+ *
+ * When ANY of the modifiers or main key become inactive,
+ * - pulse false
+ */
+ if (qual==false) { /* one of the qualifiers are not pressed */
+ if (m_val_orig && qual_change) { /* we were originally enabled, but a qualifier changed */
+ result = true;
+ } else {
+ result = false;
+ }
+ m_val = 0; /* since one of the qualifiers is not on, set the state to false */
+ } else { /* we done have any qualifiers or they are all pressed */
+ if (m_val && qual_change) { /* the main key state is true and our qualifier just changed */
+ result = true;
+ }
+ }
+ /* done with key quals */
+
}
+
if (reset)
// force an event
result = true;
@@ -710,17 +776,17 @@ PyParentObject SCA_KeyboardSensor::Parents[] = {
};
PyMethodDef SCA_KeyboardSensor::Methods[] = {
- {"getKey", (PyCFunction) SCA_KeyboardSensor::sPyGetKey, METH_VARARGS, GetKey_doc},
- {"setKey", (PyCFunction) SCA_KeyboardSensor::sPySetKey, METH_VARARGS, SetKey_doc},
- {"getHold1", (PyCFunction) SCA_KeyboardSensor::sPyGetHold1, METH_VARARGS, GetHold1_doc},
- {"setHold1", (PyCFunction) SCA_KeyboardSensor::sPySetHold1, METH_VARARGS, SetHold1_doc},
- {"getHold2", (PyCFunction) SCA_KeyboardSensor::sPyGetHold2, METH_VARARGS, GetHold2_doc},
- {"setHold2", (PyCFunction) SCA_KeyboardSensor::sPySetHold2, METH_VARARGS, SetHold2_doc},
-// {"getUseAllKeys", (PyCFunction) SCA_KeyboardSensor::sPyGetUseAllKeys, METH_VARARGS, GetUseAllKeys_doc},
-// {"setUseAllKeys", (PyCFunction) SCA_KeyboardSensor::sPySetUseAllKeys, METH_VARARGS, SetUseAllKeys_doc},
- {"getPressedKeys", (PyCFunction) SCA_KeyboardSensor::sPyGetPressedKeys, METH_VARARGS, GetPressedKeys_doc},
- {"getCurrentlyPressedKeys", (PyCFunction) SCA_KeyboardSensor::sPyGetCurrentlyPressedKeys, METH_VARARGS, GetCurrentlyPressedKeys_doc},
-// {"getKeyEvents", (PyCFunction) SCA_KeyboardSensor::sPyGetKeyEvents, METH_VARARGS, GetKeyEvents_doc},
+ {"getKey", (PyCFunction) SCA_KeyboardSensor::sPyGetKey, METH_VARARGS, (PY_METHODCHAR)GetKey_doc},
+ {"setKey", (PyCFunction) SCA_KeyboardSensor::sPySetKey, METH_VARARGS, (PY_METHODCHAR)SetKey_doc},
+ {"getHold1", (PyCFunction) SCA_KeyboardSensor::sPyGetHold1, METH_VARARGS, (PY_METHODCHAR)GetHold1_doc},
+ {"setHold1", (PyCFunction) SCA_KeyboardSensor::sPySetHold1, METH_VARARGS, (PY_METHODCHAR)SetHold1_doc},
+ {"getHold2", (PyCFunction) SCA_KeyboardSensor::sPyGetHold2, METH_VARARGS, (PY_METHODCHAR)GetHold2_doc},
+ {"setHold2", (PyCFunction) SCA_KeyboardSensor::sPySetHold2, METH_VARARGS, (PY_METHODCHAR)SetHold2_doc},
+// {"getUseAllKeys", (PyCFunction) SCA_KeyboardSensor::sPyGetUseAllKeys, METH_VARARGS, (PY_METHODCHAR)GetUseAllKeys_doc},
+// {"setUseAllKeys", (PyCFunction) SCA_KeyboardSensor::sPySetUseAllKeys, METH_VARARGS, (PY_METHODCHAR)SetUseAllKeys_doc},
+ {"getPressedKeys", (PyCFunction) SCA_KeyboardSensor::sPyGetPressedKeys, METH_VARARGS, (PY_METHODCHAR)GetPressedKeys_doc},
+ {"getCurrentlyPressedKeys", (PyCFunction) SCA_KeyboardSensor::sPyGetCurrentlyPressedKeys, METH_VARARGS, (PY_METHODCHAR)GetCurrentlyPressedKeys_doc},
+// {"getKeyEvents", (PyCFunction) SCA_KeyboardSensor::sPyGetKeyEvents, METH_VARARGS, (PY_METHODCHAR)GetKeyEvents_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.cpp b/source/gameengine/GameLogic/SCA_MouseSensor.cpp
index 8f56d153f02..d4952ce4777 100644
--- a/source/gameengine/GameLogic/SCA_MouseSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_MouseSensor.cpp
@@ -283,8 +283,8 @@ PyParentObject SCA_MouseSensor::Parents[] = {
};
PyMethodDef SCA_MouseSensor::Methods[] = {
- {"getXPosition", (PyCFunction) SCA_MouseSensor::sPyGetXPosition, METH_VARARGS, GetXPosition_doc},
- {"getYPosition", (PyCFunction) SCA_MouseSensor::sPyGetYPosition, METH_VARARGS, GetYPosition_doc},
+ {"getXPosition", (PyCFunction) SCA_MouseSensor::sPyGetXPosition, METH_VARARGS, (PY_METHODCHAR)GetXPosition_doc},
+ {"getYPosition", (PyCFunction) SCA_MouseSensor::sPyGetYPosition, METH_VARARGS, (PY_METHODCHAR)GetYPosition_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
index e5ddd8d121c..3b541e87f02 100644
--- a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
@@ -245,10 +245,10 @@ PyParentObject SCA_PropertyActuator::Parents[] = {
};
PyMethodDef SCA_PropertyActuator::Methods[] = {
- {"setProperty", (PyCFunction) SCA_PropertyActuator::sPySetProperty, METH_VARARGS, SetProperty_doc},
- {"getProperty", (PyCFunction) SCA_PropertyActuator::sPyGetProperty, METH_VARARGS, GetProperty_doc},
- {"setValue", (PyCFunction) SCA_PropertyActuator::sPySetValue, METH_VARARGS, SetValue_doc},
- {"getValue", (PyCFunction) SCA_PropertyActuator::sPyGetValue, METH_VARARGS, GetValue_doc},
+ {"setProperty", (PyCFunction) SCA_PropertyActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+ {"getProperty", (PyCFunction) SCA_PropertyActuator::sPyGetProperty, METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
+ {"setValue", (PyCFunction) SCA_PropertyActuator::sPySetValue, METH_VARARGS, (PY_METHODCHAR)SetValue_doc},
+ {"getValue", (PyCFunction) SCA_PropertyActuator::sPyGetValue, METH_VARARGS, (PY_METHODCHAR)GetValue_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.cpp b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
index b1a4b776860..64e3d49c6cb 100644
--- a/source/gameengine/GameLogic/SCA_PropertySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
@@ -333,12 +333,12 @@ PyParentObject SCA_PropertySensor::Parents[] = {
};
PyMethodDef SCA_PropertySensor::Methods[] = {
- {"getType", (PyCFunction) SCA_PropertySensor::sPyGetType, METH_VARARGS, GetType_doc},
- {"setType", (PyCFunction) SCA_PropertySensor::sPySetType, METH_VARARGS, SetType_doc},
- {"getProperty", (PyCFunction) SCA_PropertySensor::sPyGetProperty, METH_VARARGS, GetProperty_doc},
- {"setProperty", (PyCFunction) SCA_PropertySensor::sPySetProperty, METH_VARARGS, SetProperty_doc},
- {"getValue", (PyCFunction) SCA_PropertySensor::sPyGetValue, METH_VARARGS, GetValue_doc},
- {"setValue", (PyCFunction) SCA_PropertySensor::sPySetValue, METH_VARARGS, SetValue_doc},
+ {"getType", (PyCFunction) SCA_PropertySensor::sPyGetType, METH_VARARGS, (PY_METHODCHAR)GetType_doc},
+ {"setType", (PyCFunction) SCA_PropertySensor::sPySetType, METH_VARARGS, (PY_METHODCHAR)SetType_doc},
+ {"getProperty", (PyCFunction) SCA_PropertySensor::sPyGetProperty, METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
+ {"setProperty", (PyCFunction) SCA_PropertySensor::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+ {"getValue", (PyCFunction) SCA_PropertySensor::sPyGetValue, METH_VARARGS, (PY_METHODCHAR)GetValue_doc},
+ {"setValue", (PyCFunction) SCA_PropertySensor::sPySetValue, METH_VARARGS, (PY_METHODCHAR)SetValue_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp
index 7e2fb081083..c354ab39747 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonController.cpp
@@ -229,10 +229,10 @@ PyParentObject SCA_PythonController::Parents[] = {
NULL
};
PyMethodDef SCA_PythonController::Methods[] = {
- {"getActuators", (PyCFunction) SCA_PythonController::sPyGetActuators, METH_NOARGS, SCA_PythonController::GetActuators_doc},
- {"getActuator", (PyCFunction) SCA_PythonController::sPyGetActuator, METH_O, SCA_PythonController::GetActuator_doc},
- {"getSensors", (PyCFunction) SCA_PythonController::sPyGetSensors, METH_NOARGS, SCA_PythonController::GetSensors_doc},
- {"getSensor", (PyCFunction) SCA_PythonController::sPyGetSensor, METH_O, SCA_PythonController::GetSensor_doc},
+ {"getActuators", (PyCFunction) SCA_PythonController::sPyGetActuators, METH_NOARGS, (PY_METHODCHAR)SCA_PythonController::GetActuators_doc},
+ {"getActuator", (PyCFunction) SCA_PythonController::sPyGetActuator, METH_O, (PY_METHODCHAR)SCA_PythonController::GetActuator_doc},
+ {"getSensors", (PyCFunction) SCA_PythonController::sPyGetSensors, METH_NOARGS, (PY_METHODCHAR)SCA_PythonController::GetSensors_doc},
+ {"getSensor", (PyCFunction) SCA_PythonController::sPyGetSensor, METH_O, (PY_METHODCHAR)SCA_PythonController::GetSensor_doc},
{"getScript", (PyCFunction) SCA_PythonController::sPyGetScript, METH_NOARGS},
{"setScript", (PyCFunction) SCA_PythonController::sPySetScript, METH_O},
{"getState", (PyCFunction) SCA_PythonController::sPyGetState, METH_NOARGS},
@@ -262,6 +262,14 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
printf("Python compile error from controller \"%s\": \n", GetName().Ptr());
//PyRun_SimpleString(m_scriptText.Ptr());
PyErr_Print();
+
+ /* Added in 2.48a, the last_traceback can reference Objects for example, increasing
+ * their user count. Not to mention holding references to wrapped data.
+ * This is especially bad when the PyObject for the wrapped data is free'd, after blender
+ * has alredy dealocated the pointer */
+ PySys_SetObject( "last_traceback", Py_None);
+ PyErr_Clear(); /* just to be sure */
+
return;
}
m_bModified=false;
@@ -298,6 +306,14 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
// something is wrong, tell the user what went wrong
printf("Python script error from controller \"%s\": \n", GetName().Ptr());
PyErr_Print();
+
+ /* Added in 2.48a, the last_traceback can reference Objects for example, increasing
+ * their user count. Not to mention holding references to wrapped data.
+ * This is especially bad when the PyObject for the wrapped data is free'd, after blender
+ * has alredy dealocated the pointer */
+ PySys_SetObject( "last_traceback", Py_None);
+ PyErr_Clear(); /* just to be sure */
+
//PyRun_SimpleString(m_scriptText.Ptr());
}
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.cpp b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
index e87b3dba458..7b50a483cd8 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
@@ -339,23 +339,23 @@ PyParentObject SCA_RandomActuator::Parents[] = {
};
PyMethodDef SCA_RandomActuator::Methods[] = {
- {"setSeed", (PyCFunction) SCA_RandomActuator::sPySetSeed, METH_VARARGS, SetSeed_doc},
- {"getSeed", (PyCFunction) SCA_RandomActuator::sPyGetSeed, METH_VARARGS, GetSeed_doc},
- {"getPara1", (PyCFunction) SCA_RandomActuator::sPyGetPara1, METH_VARARGS, GetPara1_doc},
- {"getPara2", (PyCFunction) SCA_RandomActuator::sPyGetPara2, METH_VARARGS, GetPara2_doc},
- {"getDistribution", (PyCFunction) SCA_RandomActuator::sPyGetDistribution, METH_VARARGS, GetDistribution_doc},
- {"setProperty", (PyCFunction) SCA_RandomActuator::sPySetProperty, METH_VARARGS, SetProperty_doc},
- {"getProperty", (PyCFunction) SCA_RandomActuator::sPyGetProperty, METH_VARARGS, GetProperty_doc},
- {"setBoolConst", (PyCFunction) SCA_RandomActuator::sPySetBoolConst, METH_VARARGS, SetBoolConst_doc},
- {"setBoolUniform", (PyCFunction) SCA_RandomActuator::sPySetBoolUniform, METH_VARARGS, SetBoolUniform_doc},
- {"setBoolBernouilli",(PyCFunction) SCA_RandomActuator::sPySetBoolBernouilli, METH_VARARGS, SetBoolBernouilli_doc},
- {"setIntConst", (PyCFunction) SCA_RandomActuator::sPySetIntConst, METH_VARARGS, SetIntConst_doc},
- {"setIntUniform", (PyCFunction) SCA_RandomActuator::sPySetIntUniform, METH_VARARGS, SetIntUniform_doc},
- {"setIntPoisson", (PyCFunction) SCA_RandomActuator::sPySetIntPoisson, METH_VARARGS, SetIntPoisson_doc},
- {"setFloatConst", (PyCFunction) SCA_RandomActuator::sPySetFloatConst, METH_VARARGS, SetFloatConst_doc},
- {"setFloatUniform", (PyCFunction) SCA_RandomActuator::sPySetFloatUniform, METH_VARARGS, SetFloatUniform_doc},
- {"setFloatNormal", (PyCFunction) SCA_RandomActuator::sPySetFloatNormal, METH_VARARGS, SetFloatNormal_doc},
- {"setFloatNegativeExponential", (PyCFunction) SCA_RandomActuator::sPySetFloatNegativeExponential, METH_VARARGS, SetFloatNegativeExponential_doc},
+ {"setSeed", (PyCFunction) SCA_RandomActuator::sPySetSeed, METH_VARARGS, (PY_METHODCHAR)SetSeed_doc},
+ {"getSeed", (PyCFunction) SCA_RandomActuator::sPyGetSeed, METH_VARARGS, (PY_METHODCHAR)GetSeed_doc},
+ {"getPara1", (PyCFunction) SCA_RandomActuator::sPyGetPara1, METH_VARARGS, (PY_METHODCHAR)GetPara1_doc},
+ {"getPara2", (PyCFunction) SCA_RandomActuator::sPyGetPara2, METH_VARARGS, (PY_METHODCHAR)GetPara2_doc},
+ {"getDistribution", (PyCFunction) SCA_RandomActuator::sPyGetDistribution, METH_VARARGS, (PY_METHODCHAR)GetDistribution_doc},
+ {"setProperty", (PyCFunction) SCA_RandomActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+ {"getProperty", (PyCFunction) SCA_RandomActuator::sPyGetProperty, METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
+ {"setBoolConst", (PyCFunction) SCA_RandomActuator::sPySetBoolConst, METH_VARARGS, (PY_METHODCHAR)SetBoolConst_doc},
+ {"setBoolUniform", (PyCFunction) SCA_RandomActuator::sPySetBoolUniform, METH_VARARGS, (PY_METHODCHAR)SetBoolUniform_doc},
+ {"setBoolBernouilli",(PyCFunction) SCA_RandomActuator::sPySetBoolBernouilli, METH_VARARGS, (PY_METHODCHAR)SetBoolBernouilli_doc},
+ {"setIntConst", (PyCFunction) SCA_RandomActuator::sPySetIntConst, METH_VARARGS, (PY_METHODCHAR)SetIntConst_doc},
+ {"setIntUniform", (PyCFunction) SCA_RandomActuator::sPySetIntUniform, METH_VARARGS, (PY_METHODCHAR)SetIntUniform_doc},
+ {"setIntPoisson", (PyCFunction) SCA_RandomActuator::sPySetIntPoisson, METH_VARARGS, (PY_METHODCHAR)SetIntPoisson_doc},
+ {"setFloatConst", (PyCFunction) SCA_RandomActuator::sPySetFloatConst, METH_VARARGS, (PY_METHODCHAR)SetFloatConst_doc},
+ {"setFloatUniform", (PyCFunction) SCA_RandomActuator::sPySetFloatUniform, METH_VARARGS, (PY_METHODCHAR)SetFloatUniform_doc},
+ {"setFloatNormal", (PyCFunction) SCA_RandomActuator::sPySetFloatNormal, METH_VARARGS, (PY_METHODCHAR)SetFloatNormal_doc},
+ {"setFloatNegativeExponential", (PyCFunction) SCA_RandomActuator::sPySetFloatNegativeExponential, METH_VARARGS, (PY_METHODCHAR)SetFloatNegativeExponential_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GameLogic/SCA_RandomSensor.cpp b/source/gameengine/GameLogic/SCA_RandomSensor.cpp
index 2caca1a27ec..202fd6382e6 100644
--- a/source/gameengine/GameLogic/SCA_RandomSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomSensor.cpp
@@ -154,9 +154,9 @@ PyParentObject SCA_RandomSensor::Parents[] = {
};
PyMethodDef SCA_RandomSensor::Methods[] = {
- {"setSeed", (PyCFunction) SCA_RandomSensor::sPySetSeed, METH_VARARGS, SetSeed_doc},
- {"getSeed", (PyCFunction) SCA_RandomSensor::sPyGetSeed, METH_VARARGS, GetSeed_doc},
- {"getLastDraw", (PyCFunction) SCA_RandomSensor::sPyGetLastDraw, METH_VARARGS, GetLastDraw_doc},
+ {"setSeed", (PyCFunction) SCA_RandomSensor::sPySetSeed, METH_VARARGS, (PY_METHODCHAR)SetSeed_doc},
+ {"getSeed", (PyCFunction) SCA_RandomSensor::sPyGetSeed, METH_VARARGS, (PY_METHODCHAR)GetSeed_doc},
+ {"getLastDraw", (PyCFunction) SCA_RandomSensor::sPyGetLastDraw, METH_VARARGS, (PY_METHODCHAR)GetLastDraw_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
index 9700e6387f2..0bf0317d8f2 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
@@ -44,6 +44,7 @@
#endif // __APPLE__
#include "GEN_messaging.h"
#include "KX_KetsjiEngine.h"
+#include "KX_PythonInit.h"
/**********************************
* Begin Blender include block
@@ -599,8 +600,8 @@ int main(int argc, char** argv)
GPG_Application app(system);
bool firstTimeRunning = true;
char filename[FILE_MAXDIR + FILE_MAXFILE];
+ char pathname[FILE_MAXDIR + FILE_MAXFILE];
char *titlename;
- char pathname[160];
get_filename(argc, argv, filename);
if(filename[0])
@@ -616,8 +617,7 @@ int main(int argc, char** argv)
{
char basedpath[240];
- // base the actuator filename with respect
- // to the original file working directory
+ // base the actuator filename relative to the last file
strcpy(basedpath, exitstring.Ptr());
BLI_convertstringcode(basedpath, pathname);
@@ -659,7 +659,9 @@ int main(int argc, char** argv)
Main *maggie = bfd->main;
Scene *scene = bfd->curscene;
G.main = maggie;
- G.fileflags = bfd->fileflags;
+
+ if (firstTimeRunning)
+ G.fileflags = bfd->fileflags;
//Seg Fault; icon.c gIcons == 0
BKE_icons_init(1);
@@ -698,15 +700,14 @@ int main(int argc, char** argv)
// GPG_Application app (system, maggie, startscenename);
app.SetGameEngineData(maggie, scene);
+ BLI_strncpy(pathname, maggie->name, sizeof(pathname));
+ BLI_strncpy(G.sce, maggie->name, sizeof(G.sce));
+
if (firstTimeRunning)
{
+ setGamePythonPath(G.sce);
firstTimeRunning = false;
- // set the filename only the first time as in KetsjiEmbedded
- strcpy (pathname, maggie->name);
- // also copy here (used by GameLogic.getBaseDirectory)
- strcpy (G.sce, maggie->name);
-
if (fullScreen)
{
#ifdef WIN32
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
index 16dbe65d508..8956df9c96b 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
@@ -197,19 +197,19 @@ PyParentObject KX_NetworkMessageSensor::Parents[] = {
PyMethodDef KX_NetworkMessageSensor::Methods[] = {
{"setSubjectFilterText", (PyCFunction)
KX_NetworkMessageSensor::sPySetSubjectFilterText, METH_O,
- SetSubjectFilterText_doc},
+ (PY_METHODCHAR)SetSubjectFilterText_doc},
{"getFrameMessageCount", (PyCFunction)
KX_NetworkMessageSensor::sPyGetFrameMessageCount, METH_NOARGS,
- GetFrameMessageCount_doc},
+ (PY_METHODCHAR)GetFrameMessageCount_doc},
{"getBodies", (PyCFunction)
KX_NetworkMessageSensor::sPyGetBodies, METH_NOARGS,
- GetBodies_doc},
+ (PY_METHODCHAR)GetBodies_doc},
{"getSubject", (PyCFunction)
KX_NetworkMessageSensor::sPyGetSubject, METH_NOARGS,
- GetSubject_doc},
+ (PY_METHODCHAR)GetSubject_doc},
{"getSubjects", (PyCFunction)
KX_NetworkMessageSensor::sPyGetSubjects, METH_NOARGS,
- GetSubjects_doc},
+ (PY_METHODCHAR)GetSubjects_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
index d7bd1e9c7cd..bf838e60210 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
@@ -115,7 +115,7 @@ MT_Vector3 KX_BulletPhysicsController::GetAngularVelocity()
MT_Vector3 KX_BulletPhysicsController::GetVelocity(const MT_Point3& pos)
{
float linVel[3];
- CcdPhysicsController::GetLinearVelocity(linVel[0],linVel[1],linVel[2]);
+ CcdPhysicsController::GetVelocity(pos[0], pos[1], pos[2], linVel[0],linVel[1],linVel[2]);
return MT_Vector3(linVel[0],linVel[1],linVel[2]);
}
@@ -160,6 +160,12 @@ MT_Scalar KX_BulletPhysicsController::GetMass()
return 0.f;
}
+
+MT_Scalar KX_BulletPhysicsController::GetRadius()
+{
+ return MT_Scalar(CcdPhysicsController::GetRadius());
+}
+
MT_Vector3 KX_BulletPhysicsController::getReactionForce()
{
assert(0);
@@ -211,6 +217,9 @@ SG_Controller* KX_BulletPhysicsController::GetReplica(class SG_Node* destnode)
//parentcontroller is here be able to avoid collisions between parent/child
PHY_IPhysicsController* parentctrl = NULL;
+ KX_BulletPhysicsController* parentKxCtrl = NULL;
+ CcdPhysicsController* ccdParent = NULL;
+
if (destnode != destnode->GetRootSGParent())
{
@@ -230,12 +239,15 @@ SG_Controller* KX_BulletPhysicsController::GetReplica(class SG_Node* destnode)
KX_GameObject *clientgameobj = static_cast<KX_GameObject*>( (*childit)->GetSGClientObject());
if (clientgameobj)
{
- parentctrl = (KX_BulletPhysicsController*)clientgameobj->GetPhysicsController();
+ parentKxCtrl = (KX_BulletPhysicsController*)clientgameobj->GetPhysicsController();
+ parentctrl = parentKxCtrl;
+ ccdParent = parentKxCtrl;
}
}
}
}
+ physicsreplica->setParentCtrl(ccdParent);
physicsreplica->PostProcessReplica(motionstate,parentctrl);
physicsreplica->m_userdata = (PHY_IPhysicsController*)physicsreplica;
return physicsreplica;
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
index 2efe0474b30..cdcb82c87ca 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
@@ -49,9 +49,7 @@ public:
virtual SG_Controller* GetReplica(class SG_Node* destnode);
- void SetDyna(bool isDynamic) {
- m_bDyna = isDynamic;
- }
+ virtual MT_Scalar GetRadius();
virtual void SetSumoTransform(bool nondynaonly);
diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp
index 099b0d90870..4d24e83843e 100644
--- a/source/gameengine/Ketsji/KX_CameraActuator.cpp
+++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp
@@ -397,16 +397,16 @@ PyParentObject KX_CameraActuator::Parents[] = {
};
PyMethodDef KX_CameraActuator::Methods[] = {
- {"setObject",(PyCFunction) KX_CameraActuator::sPySetObject, METH_O, SetObject_doc},
- {"getObject",(PyCFunction) KX_CameraActuator::sPyGetObject, METH_VARARGS, GetObject_doc},
- {"setMin" ,(PyCFunction) KX_CameraActuator::sPySetMin, METH_VARARGS, SetMin_doc},
- {"getMin" ,(PyCFunction) KX_CameraActuator::sPyGetMin, METH_NOARGS, GetMin_doc},
- {"setMax" ,(PyCFunction) KX_CameraActuator::sPySetMax, METH_VARARGS, SetMax_doc},
- {"getMax" ,(PyCFunction) KX_CameraActuator::sPyGetMax, METH_NOARGS, GetMax_doc},
- {"setHeight",(PyCFunction) KX_CameraActuator::sPySetHeight, METH_VARARGS, SetHeight_doc},
- {"getHeight",(PyCFunction) KX_CameraActuator::sPyGetHeight, METH_NOARGS, GetHeight_doc},
- {"setXY" ,(PyCFunction) KX_CameraActuator::sPySetXY, METH_VARARGS, SetXY_doc},
- {"getXY" ,(PyCFunction) KX_CameraActuator::sPyGetXY, METH_VARARGS, GetXY_doc},
+ {"setObject",(PyCFunction) KX_CameraActuator::sPySetObject, METH_O, (PY_METHODCHAR)SetObject_doc},
+ {"getObject",(PyCFunction) KX_CameraActuator::sPyGetObject, METH_VARARGS, (PY_METHODCHAR)GetObject_doc},
+ {"setMin" ,(PyCFunction) KX_CameraActuator::sPySetMin, METH_VARARGS, (PY_METHODCHAR)SetMin_doc},
+ {"getMin" ,(PyCFunction) KX_CameraActuator::sPyGetMin, METH_NOARGS, (PY_METHODCHAR)GetMin_doc},
+ {"setMax" ,(PyCFunction) KX_CameraActuator::sPySetMax, METH_VARARGS, (PY_METHODCHAR)SetMax_doc},
+ {"getMax" ,(PyCFunction) KX_CameraActuator::sPyGetMax, METH_NOARGS, (PY_METHODCHAR)GetMax_doc},
+ {"setHeight",(PyCFunction) KX_CameraActuator::sPySetHeight, METH_VARARGS, (PY_METHODCHAR)SetHeight_doc},
+ {"getHeight",(PyCFunction) KX_CameraActuator::sPyGetHeight, METH_NOARGS, (PY_METHODCHAR)GetHeight_doc},
+ {"setXY" ,(PyCFunction) KX_CameraActuator::sPySetXY, METH_VARARGS, (PY_METHODCHAR)SetXY_doc},
+ {"getXY" ,(PyCFunction) KX_CameraActuator::sPyGetXY, METH_VARARGS, (PY_METHODCHAR)GetXY_doc},
{NULL,NULL,NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
index 49534ccbd4a..76357e9c58f 100644
--- a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
@@ -112,7 +112,7 @@ KX_ConstraintActuator::~KX_ConstraintActuator()
bool KX_ConstraintActuator::RayHit(KX_ClientObjectInfo* client, KX_RayCast* result, void * const data)
{
- KX_GameObject* hitKXObj = client->m_gameobject;
+ m_hitObject = client->m_gameobject;
bool bFound = false;
@@ -131,7 +131,7 @@ bool KX_ConstraintActuator::RayHit(KX_ClientObjectInfo* client, KX_RayCast* resu
}
else
{
- bFound = hitKXObj->GetProperty(m_property) != NULL;
+ bFound = m_hitObject->GetProperty(m_property) != NULL;
}
}
// update the hit status
@@ -372,7 +372,7 @@ bool KX_ConstraintActuator::Update(double curtime, bool frame)
// logically we should cancel the speed along the ray direction as we set the
// position along that axis
spc = obj->GetPhysicsController();
- if (spc) {
+ if (spc && spc->IsDyna()) {
MT_Vector3 linV = spc->GetLinearVelocity();
// cancel the projection along the ray direction
MT_Scalar fallspeed = linV.dot(direction);
@@ -390,6 +390,110 @@ bool KX_ConstraintActuator::Update(double curtime, bool frame)
}
}
break;
+ case KX_ACT_CONSTRAINT_FHPX:
+ case KX_ACT_CONSTRAINT_FHPY:
+ case KX_ACT_CONSTRAINT_FHPZ:
+ case KX_ACT_CONSTRAINT_FHNX:
+ case KX_ACT_CONSTRAINT_FHNY:
+ case KX_ACT_CONSTRAINT_FHNZ:
+ switch (m_locrot) {
+ case KX_ACT_CONSTRAINT_FHPX:
+ normal[0] = -rotation[0][0];
+ normal[1] = -rotation[1][0];
+ normal[2] = -rotation[2][0];
+ direction = MT_Vector3(1.0,0.0,0.0);
+ break;
+ case KX_ACT_CONSTRAINT_FHPY:
+ normal[0] = -rotation[0][1];
+ normal[1] = -rotation[1][1];
+ normal[2] = -rotation[2][1];
+ direction = MT_Vector3(0.0,1.0,0.0);
+ break;
+ case KX_ACT_CONSTRAINT_FHPZ:
+ normal[0] = -rotation[0][2];
+ normal[1] = -rotation[1][2];
+ normal[2] = -rotation[2][2];
+ direction = MT_Vector3(0.0,0.0,1.0);
+ break;
+ case KX_ACT_CONSTRAINT_FHNX:
+ normal[0] = rotation[0][0];
+ normal[1] = rotation[1][0];
+ normal[2] = rotation[2][0];
+ direction = MT_Vector3(-1.0,0.0,0.0);
+ break;
+ case KX_ACT_CONSTRAINT_FHNY:
+ normal[0] = rotation[0][1];
+ normal[1] = rotation[1][1];
+ normal[2] = rotation[2][1];
+ direction = MT_Vector3(0.0,-1.0,0.0);
+ break;
+ case KX_ACT_CONSTRAINT_FHNZ:
+ normal[0] = rotation[0][2];
+ normal[1] = rotation[1][2];
+ normal[2] = rotation[2][2];
+ direction = MT_Vector3(0.0,0.0,-1.0);
+ break;
+ }
+ normal.normalize();
+ {
+ PHY_IPhysicsEnvironment* pe = obj->GetPhysicsEnvironment();
+ KX_IPhysicsController *spc = obj->GetPhysicsController();
+
+ if (!pe) {
+ std::cout << "WARNING: Constraint actuator " << GetName() << ": There is no physics environment!" << std::endl;
+ goto CHECK_TIME;
+ }
+ if (!spc || !spc->IsDyna()) {
+ // the object is not dynamic, it won't support setting speed
+ goto CHECK_TIME;
+ }
+ m_hitObject = NULL;
+ // distance of Fh area is stored in m_minimum
+ MT_Point3 topoint = position + (m_minimumBound+spc->GetRadius()) * direction;
+ KX_RayCast::Callback<KX_ConstraintActuator> callback(this,spc);
+ result = KX_RayCast::RayTest(pe, position, topoint, callback);
+ // we expect a hit object
+ if (!m_hitObject)
+ result = false;
+ if (result)
+ {
+ MT_Vector3 newnormal = callback.m_hitNormal;
+ // compute new position & orientation
+ MT_Scalar distance = (callback.m_hitPoint-position).length()-spc->GetRadius();
+ // estimate the velocity of the hit point
+ MT_Point3 relativeHitPoint;
+ relativeHitPoint = (callback.m_hitPoint-m_hitObject->NodeGetWorldPosition());
+ MT_Vector3 velocityHitPoint = m_hitObject->GetVelocity(relativeHitPoint);
+ MT_Vector3 relativeVelocity = spc->GetLinearVelocity() - velocityHitPoint;
+ MT_Scalar relativeVelocityRay = direction.dot(relativeVelocity);
+ MT_Scalar springExtent = 1.0 - distance/m_minimumBound;
+ // Fh force is stored in m_maximum
+ MT_Scalar springForce = springExtent * m_maximumBound;
+ // damping is stored in m_refDirection [0] = damping, [1] = rot damping
+ MT_Scalar springDamp = relativeVelocityRay * m_refDirection[0];
+ MT_Vector3 newVelocity = spc->GetLinearVelocity()-(springForce+springDamp)*direction;
+ if (m_option & KX_ACT_CONSTRAINT_NORMAL)
+ {
+ newVelocity+=(springForce+springDamp)*(newnormal-newnormal.dot(direction)*direction);
+ }
+ spc->SetLinearVelocity(newVelocity, false);
+ if (m_option & KX_ACT_CONSTRAINT_DOROTFH)
+ {
+ MT_Vector3 angSpring = (normal.cross(newnormal))*m_maximumBound;
+ MT_Vector3 angVelocity = spc->GetAngularVelocity();
+ // remove component that is parallel to normal
+ angVelocity -= angVelocity.dot(newnormal)*newnormal;
+ MT_Vector3 angDamp = angVelocity * ((m_refDirection[1]>MT_EPSILON)?m_refDirection[1]:m_refDirection[0]);
+ spc->SetAngularVelocity(spc->GetAngularVelocity()+(angSpring-angDamp), false);
+ }
+ } else if (m_option & KX_ACT_CONSTRAINT_PERMANENT) {
+ // no contact but still keep running
+ result = true;
+ }
+ // don't set the position with this constraint
+ goto CHECK_TIME;
+ }
+ break;
case KX_ACT_CONSTRAINT_LOCX:
case KX_ACT_CONSTRAINT_LOCY:
case KX_ACT_CONSTRAINT_LOCZ:
@@ -483,28 +587,28 @@ PyParentObject KX_ConstraintActuator::Parents[] = {
};
PyMethodDef KX_ConstraintActuator::Methods[] = {
- {"setDamp", (PyCFunction) KX_ConstraintActuator::sPySetDamp, METH_VARARGS, SetDamp_doc},
- {"getDamp", (PyCFunction) KX_ConstraintActuator::sPyGetDamp, METH_NOARGS, GetDamp_doc},
- {"setRotDamp", (PyCFunction) KX_ConstraintActuator::sPySetRotDamp, METH_VARARGS, SetRotDamp_doc},
- {"getRotDamp", (PyCFunction) KX_ConstraintActuator::sPyGetRotDamp, METH_NOARGS, GetRotDamp_doc},
- {"setDirection", (PyCFunction) KX_ConstraintActuator::sPySetDirection, METH_VARARGS, SetDirection_doc},
- {"getDirection", (PyCFunction) KX_ConstraintActuator::sPyGetDirection, METH_NOARGS, GetDirection_doc},
- {"setOption", (PyCFunction) KX_ConstraintActuator::sPySetOption, METH_VARARGS, SetOption_doc},
- {"getOption", (PyCFunction) KX_ConstraintActuator::sPyGetOption, METH_NOARGS, GetOption_doc},
- {"setTime", (PyCFunction) KX_ConstraintActuator::sPySetTime, METH_VARARGS, SetTime_doc},
- {"getTime", (PyCFunction) KX_ConstraintActuator::sPyGetTime, METH_NOARGS, GetTime_doc},
- {"setProperty", (PyCFunction) KX_ConstraintActuator::sPySetProperty, METH_VARARGS, SetProperty_doc},
- {"getProperty", (PyCFunction) KX_ConstraintActuator::sPyGetProperty, METH_NOARGS, GetProperty_doc},
- {"setMin", (PyCFunction) KX_ConstraintActuator::sPySetMin, METH_VARARGS, SetMin_doc},
- {"getMin", (PyCFunction) KX_ConstraintActuator::sPyGetMin, METH_NOARGS, GetMin_doc},
- {"setDistance", (PyCFunction) KX_ConstraintActuator::sPySetMin, METH_VARARGS, SetDistance_doc},
- {"getDistance", (PyCFunction) KX_ConstraintActuator::sPyGetMin, METH_NOARGS, GetDistance_doc},
- {"setMax", (PyCFunction) KX_ConstraintActuator::sPySetMax, METH_VARARGS, SetMax_doc},
- {"getMax", (PyCFunction) KX_ConstraintActuator::sPyGetMax, METH_NOARGS, GetMax_doc},
- {"setRayLength", (PyCFunction) KX_ConstraintActuator::sPySetMax, METH_VARARGS, SetRayLength_doc},
- {"getRayLength", (PyCFunction) KX_ConstraintActuator::sPyGetMax, METH_NOARGS, GetRayLength_doc},
- {"setLimit", (PyCFunction) KX_ConstraintActuator::sPySetLimit, METH_VARARGS, SetLimit_doc},
- {"getLimit", (PyCFunction) KX_ConstraintActuator::sPyGetLimit, METH_NOARGS, GetLimit_doc},
+ {"setDamp", (PyCFunction) KX_ConstraintActuator::sPySetDamp, METH_VARARGS, (PY_METHODCHAR)SetDamp_doc},
+ {"getDamp", (PyCFunction) KX_ConstraintActuator::sPyGetDamp, METH_NOARGS, (PY_METHODCHAR)GetDamp_doc},
+ {"setRotDamp", (PyCFunction) KX_ConstraintActuator::sPySetRotDamp, METH_VARARGS, (PY_METHODCHAR)SetRotDamp_doc},
+ {"getRotDamp", (PyCFunction) KX_ConstraintActuator::sPyGetRotDamp, METH_NOARGS, (PY_METHODCHAR)GetRotDamp_doc},
+ {"setDirection", (PyCFunction) KX_ConstraintActuator::sPySetDirection, METH_VARARGS, (PY_METHODCHAR)SetDirection_doc},
+ {"getDirection", (PyCFunction) KX_ConstraintActuator::sPyGetDirection, METH_NOARGS, (PY_METHODCHAR)GetDirection_doc},
+ {"setOption", (PyCFunction) KX_ConstraintActuator::sPySetOption, METH_VARARGS, (PY_METHODCHAR)SetOption_doc},
+ {"getOption", (PyCFunction) KX_ConstraintActuator::sPyGetOption, METH_NOARGS, (PY_METHODCHAR)GetOption_doc},
+ {"setTime", (PyCFunction) KX_ConstraintActuator::sPySetTime, METH_VARARGS, (PY_METHODCHAR)SetTime_doc},
+ {"getTime", (PyCFunction) KX_ConstraintActuator::sPyGetTime, METH_NOARGS, (PY_METHODCHAR)GetTime_doc},
+ {"setProperty", (PyCFunction) KX_ConstraintActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+ {"getProperty", (PyCFunction) KX_ConstraintActuator::sPyGetProperty, METH_NOARGS, (PY_METHODCHAR)GetProperty_doc},
+ {"setMin", (PyCFunction) KX_ConstraintActuator::sPySetMin, METH_VARARGS, (PY_METHODCHAR)SetMin_doc},
+ {"getMin", (PyCFunction) KX_ConstraintActuator::sPyGetMin, METH_NOARGS, (PY_METHODCHAR)GetMin_doc},
+ {"setDistance", (PyCFunction) KX_ConstraintActuator::sPySetMin, METH_VARARGS, (PY_METHODCHAR)SetDistance_doc},
+ {"getDistance", (PyCFunction) KX_ConstraintActuator::sPyGetMin, METH_NOARGS, (PY_METHODCHAR)GetDistance_doc},
+ {"setMax", (PyCFunction) KX_ConstraintActuator::sPySetMax, METH_VARARGS, (PY_METHODCHAR)SetMax_doc},
+ {"getMax", (PyCFunction) KX_ConstraintActuator::sPyGetMax, METH_NOARGS, (PY_METHODCHAR)GetMax_doc},
+ {"setRayLength", (PyCFunction) KX_ConstraintActuator::sPySetMax, METH_VARARGS, (PY_METHODCHAR)SetRayLength_doc},
+ {"getRayLength", (PyCFunction) KX_ConstraintActuator::sPyGetMax, METH_NOARGS, (PY_METHODCHAR)GetRayLength_doc},
+ {"setLimit", (PyCFunction) KX_ConstraintActuator::sPySetLimit, METH_VARARGS, (PY_METHODCHAR)SetLimit_doc},
+ {"getLimit", (PyCFunction) KX_ConstraintActuator::sPyGetLimit, METH_NOARGS, (PY_METHODCHAR)GetLimit_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.h b/source/gameengine/Ketsji/KX_ConstraintActuator.h
index b2ef0dae553..28b9b1e6a0b 100644
--- a/source/gameengine/Ketsji/KX_ConstraintActuator.h
+++ b/source/gameengine/Ketsji/KX_ConstraintActuator.h
@@ -38,6 +38,7 @@
#include "KX_ClientObjectInfo.h"
class KX_RayCast;
+class KX_GameObject;
class KX_ConstraintActuator : public SCA_IActuator
{
@@ -65,6 +66,8 @@ protected:
int m_option;
// property to check
char m_property[32];
+ // hit object
+ KX_GameObject* m_hitObject;
/**
* Clamp <var> to <min>, <max>. Borders are included (in as far as
@@ -92,6 +95,12 @@ protected:
KX_ACT_CONSTRAINT_ORIX,
KX_ACT_CONSTRAINT_ORIY,
KX_ACT_CONSTRAINT_ORIZ,
+ KX_ACT_CONSTRAINT_FHPX,
+ KX_ACT_CONSTRAINT_FHPY,
+ KX_ACT_CONSTRAINT_FHPZ,
+ KX_ACT_CONSTRAINT_FHNX,
+ KX_ACT_CONSTRAINT_FHNY,
+ KX_ACT_CONSTRAINT_FHNZ,
KX_ACT_CONSTRAINT_MAX
};
// match ACT_CONST_... values from BIF_interface.h
@@ -100,7 +109,8 @@ protected:
KX_ACT_CONSTRAINT_MATERIAL = 128,
KX_ACT_CONSTRAINT_PERMANENT = 256,
KX_ACT_CONSTRAINT_DISTANCE = 512,
- KX_ACT_CONSTRAINT_LOCAL = 1024
+ KX_ACT_CONSTRAINT_LOCAL = 1024,
+ KX_ACT_CONSTRAINT_DOROTFH = 2048
};
bool IsValidMode(KX_CONSTRAINTTYPE m);
bool RayHit(KX_ClientObjectInfo* client, KX_RayCast* result, void * const data);
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
index e4c7e7f9317..0e7a6d92ec1 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
@@ -1025,6 +1025,20 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
//need a bit of damping, else system doesn't behave well
ci.m_inertiaFactor = shapeprops->m_inertia/0.4f;//defaults to 0.4, don't want to change behaviour
+ ci.m_do_anisotropic = shapeprops->m_do_anisotropic;
+ ci.m_anisotropicFriction.setValue(shapeprops->m_friction_scaling[0],shapeprops->m_friction_scaling[1],shapeprops->m_friction_scaling[2]);
+
+
+//////////
+ //do Fh, do Rot Fh
+ ci.m_do_fh = shapeprops->m_do_fh;
+ ci.m_do_rot_fh = shapeprops->m_do_rot_fh ;
+ ci.m_fh_damping = smmaterial->m_fh_damping;
+ ci.m_fh_distance = smmaterial->m_fh_distance;
+ ci.m_fh_normal = smmaterial->m_fh_normal;
+ ci.m_fh_spring = smmaterial->m_fh_spring;
+ ci.m_radius = objprop->m_radius;
+
///////////////////
ci.m_gamesoftFlag = objprop->m_gamesoftFlag;
@@ -1090,6 +1104,10 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
if (rbody && objprop->m_disableSleeping)
rbody->setActivationState(DISABLE_DEACTIVATION);
}
+
+ CcdPhysicsController* parentCtrl = objprop->m_dynamic_parent ? (KX_BulletPhysicsController*)objprop->m_dynamic_parent->GetPhysicsController() : 0;
+ physicscontroller->setParentCtrl(parentCtrl);
+
//Now done directly in ci.m_collisionFlags so that it propagates to replica
//if (objprop->m_ghost)
diff --git a/source/gameengine/Ketsji/KX_GameActuator.cpp b/source/gameengine/Ketsji/KX_GameActuator.cpp
index db9333eafa7..76459e46731 100644
--- a/source/gameengine/Ketsji/KX_GameActuator.cpp
+++ b/source/gameengine/Ketsji/KX_GameActuator.cpp
@@ -241,8 +241,8 @@ PyParentObject KX_GameActuator::Parents[] =
PyMethodDef KX_GameActuator::Methods[] =
{
- {"getFile", (PyCFunction) KX_GameActuator::sPyGetFile, METH_VARARGS, GetFile_doc},
- {"setFile", (PyCFunction) KX_GameActuator::sPySetFile, METH_VARARGS, SetFile_doc},
+ {"getFile", (PyCFunction) KX_GameActuator::sPyGetFile, METH_VARARGS, (PY_METHODCHAR)GetFile_doc},
+ {"setFile", (PyCFunction) KX_GameActuator::sPySetFile, METH_VARARGS, (PY_METHODCHAR)SetFile_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 15055a9cf93..739c122a5ef 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -214,7 +214,8 @@ KX_GameObject* KX_GameObject::GetParent()
void KX_GameObject::SetParent(KX_Scene *scene, KX_GameObject* obj)
{
- if (obj && GetSGNode()->GetSGParent() != obj->GetSGNode())
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (obj && GetSGNode() && obj->GetSGNode() && GetSGNode()->GetSGParent() != obj->GetSGNode())
{
// Make sure the objects have some scale
MT_Vector3 scale1 = NodeGetWorldScaling();
@@ -256,7 +257,8 @@ void KX_GameObject::SetParent(KX_Scene *scene, KX_GameObject* obj)
void KX_GameObject::RemoveParent(KX_Scene *scene)
{
- if (GetSGNode()->GetSGParent())
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (GetSGNode() && GetSGNode()->GetSGParent())
{
// Set us to the right spot
GetSGNode()->SetLocalScale(GetSGNode()->GetWorldScaling());
@@ -642,6 +644,10 @@ void KX_GameObject::AlignAxisToVect(const MT_Vector3& dir, int axis, float fac)
MT_Vector3 vect,ori,z,x,y;
MT_Scalar len;
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (!GetSGNode())
+ return;
+
vect = dir;
len = vect.length();
if (MT_fuzzyZero(len))
@@ -772,13 +778,24 @@ MT_Vector3 KX_GameObject::GetAngularVelocity(bool local)
return velocity;
}
-
+MT_Vector3 KX_GameObject::GetVelocity(const MT_Point3& point)
+{
+ if (m_pPhysicsController1)
+ {
+ return m_pPhysicsController1->GetVelocity(point);
+ }
+ return MT_Vector3(0.0,0.0,0.0);
+}
// scenegraph node stuff
void KX_GameObject::NodeSetLocalPosition(const MT_Point3& trans)
{
- if (m_pPhysicsController1 && (!GetSGNode() || !GetSGNode()->GetSGParent()))
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (!GetSGNode())
+ return;
+
+ if (m_pPhysicsController1 && !GetSGNode()->GetSGParent())
{
// don't update physic controller if the object is a child:
// 1) the transformation will not be right
@@ -787,35 +804,39 @@ void KX_GameObject::NodeSetLocalPosition(const MT_Point3& trans)
m_pPhysicsController1->setPosition(trans);
}
- if (GetSGNode())
- GetSGNode()->SetLocalPosition(trans);
+ GetSGNode()->SetLocalPosition(trans);
}
void KX_GameObject::NodeSetLocalOrientation(const MT_Matrix3x3& rot)
{
- if (m_pPhysicsController1 && (!GetSGNode() || !GetSGNode()->GetSGParent()))
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (!GetSGNode())
+ return;
+
+ if (m_pPhysicsController1 && !GetSGNode()->GetSGParent())
{
// see note above
m_pPhysicsController1->setOrientation(rot);
}
- if (GetSGNode())
- GetSGNode()->SetLocalOrientation(rot);
+ GetSGNode()->SetLocalOrientation(rot);
}
void KX_GameObject::NodeSetLocalScale(const MT_Vector3& scale)
{
- if (m_pPhysicsController1 && (!GetSGNode() || !GetSGNode()->GetSGParent()))
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (!GetSGNode())
+ return;
+
+ if (m_pPhysicsController1 && !GetSGNode()->GetSGParent())
{
// see note above
m_pPhysicsController1->setScaling(scale);
}
-
- if (GetSGNode())
- GetSGNode()->SetLocalScale(scale);
+ GetSGNode()->SetLocalScale(scale);
}
@@ -873,6 +894,13 @@ void KX_GameObject::NodeUpdateGS(double time,bool bInitiator)
const MT_Matrix3x3& KX_GameObject::NodeGetWorldOrientation() const
{
+ static MT_Matrix3x3 defaultOrientation = MT_Matrix3x3( 1.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0,
+ 0.0, 0.0, 1.0);
+
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (!GetSGNode())
+ return defaultOrientation;
return GetSGNode()->GetWorldOrientation();
}
@@ -880,6 +908,12 @@ const MT_Matrix3x3& KX_GameObject::NodeGetWorldOrientation() const
const MT_Vector3& KX_GameObject::NodeGetWorldScaling() const
{
+ static MT_Vector3 defaultScaling = MT_Vector3(1.0, 1.0, 1.0);
+
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (!GetSGNode())
+ return defaultScaling;
+
return GetSGNode()->GetWorldScaling();
}
@@ -887,6 +921,12 @@ const MT_Vector3& KX_GameObject::NodeGetWorldScaling() const
const MT_Point3& KX_GameObject::NodeGetWorldPosition() const
{
+ static MT_Point3 defaultPosition = MT_Point3(0.0, 0.0, 0.0);
+
+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (!GetSGNode())
+ return defaultPosition;
+
return GetSGNode()->GetWorldPosition();
}
@@ -958,6 +998,7 @@ PyMethodDef KX_GameObject::Methods[] = {
{"getMesh", (PyCFunction)KX_GameObject::sPyGetMesh,METH_VARARGS},
{"getPhysicsId", (PyCFunction)KX_GameObject::sPyGetPhysicsId,METH_NOARGS},
{"getPropertyNames", (PyCFunction)KX_GameObject::sPyGetPropertyNames,METH_NOARGS},
+ {"replaceMesh",(PyCFunction) KX_GameObject::sPyReplaceMesh, METH_O},
{"endObject",(PyCFunction) KX_GameObject::sPyEndObject, METH_NOARGS},
KX_PYMETHODTABLE(KX_GameObject, rayCastTo),
KX_PYMETHODTABLE(KX_GameObject, rayCast),
@@ -984,6 +1025,28 @@ bool KX_GameObject::ConvertPythonVectorArgs(PyObject* args,
}
*/
+PyObject* KX_GameObject::PyReplaceMesh(PyObject* self, PyObject* value)
+{
+ KX_Scene *scene = PHY_GetActiveScene();
+ char* meshname;
+ void* mesh_pt;
+
+ meshname = PyString_AsString(value);
+ if (meshname==NULL) {
+ PyErr_SetString(PyExc_ValueError, "Expected a mesh name");
+ return NULL;
+ }
+ mesh_pt = SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String(meshname));
+
+ if (mesh_pt==NULL) {
+ PyErr_SetString(PyExc_ValueError, "The mesh name given does not exist");
+ return NULL;
+ }
+ scene->ReplaceMesh(this, (class RAS_MeshObject*)mesh_pt);
+
+ Py_RETURN_NONE;
+}
+
PyObject* KX_GameObject::PyEndObject(PyObject* self)
{
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index 12e29cf3294..20b15787d27 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -264,6 +264,15 @@ public:
bool local=false
);
+ /**
+ * Return the linear velocity of a given point in world coordinate
+ * but relative to center of object ([0,0,0]=center of object)
+ */
+ MT_Vector3
+ GetVelocity(
+ const MT_Point3& position
+ );
+
/**
* Return the mass of the object
*/
@@ -792,6 +801,7 @@ public:
KX_PYMETHOD_VARARGS(KX_GameObject,GetMesh);
KX_PYMETHOD_NOARGS(KX_GameObject,GetPhysicsId);
KX_PYMETHOD_NOARGS(KX_GameObject,GetPropertyNames);
+ KX_PYMETHOD_O(KX_GameObject,ReplaceMesh);
KX_PYMETHOD_NOARGS(KX_GameObject,EndObject);
KX_PYMETHOD_DOC(KX_GameObject,rayCastTo);
KX_PYMETHOD_DOC(KX_GameObject,rayCast);
diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.h b/source/gameengine/Ketsji/KX_IPhysicsController.h
index ecfdb8c4275..4ea283e9f98 100644
--- a/source/gameengine/Ketsji/KX_IPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_IPhysicsController.h
@@ -88,7 +88,11 @@ public:
m_bDyna = isDynamic;
}
+ bool IsDyna(void) {
+ return m_bDyna;
+ }
+ virtual MT_Scalar GetRadius()=0;
virtual void SetSumoTransform(bool nondynaonly)=0;
// todo: remove next line !
virtual void SetSimulatedTime(double time)=0;
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp
index d9945a4b131..f5e17118ffb 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.cpp
+++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp
@@ -37,6 +37,7 @@
#include "KX_IpoActuator.h"
#include "KX_GameObject.h"
+#include "FloatValue.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -62,6 +63,7 @@ STR_String KX_IpoActuator::S_KX_ACT_IPO_FROM_PROP_STRING = "FromProp";
KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj,
const STR_String& propname,
+ const STR_String& framePropname,
float starttime,
float endtime,
bool recurse,
@@ -78,6 +80,7 @@ KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj,
m_localtime(starttime),
m_direction(1),
m_propname(propname),
+ m_framepropname(framePropname),
m_ipo_as_force(ipo_as_force),
m_ipo_add(ipo_add),
m_ipo_local(ipo_local),
@@ -356,7 +359,20 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
default:
result = false;
}
-
+
+ /* Set the property if its defined */
+ if (m_framepropname[0] != '\0') {
+ CValue* propowner = GetParent();
+ CValue* oldprop = propowner->GetProperty(m_framepropname);
+ CValue* newval = new CFloatValue(m_localtime);
+ if (oldprop) {
+ oldprop->SetValue(newval);
+ } else {
+ propowner->SetProperty(m_framepropname, newval);
+ }
+ newval->Release();
+ }
+
if (!result)
{
if (m_type != KX_ACT_IPO_LOOPSTOP)
@@ -424,34 +440,20 @@ PyParentObject KX_IpoActuator::Parents[] = {
};
PyMethodDef KX_IpoActuator::Methods[] = {
- {"set", (PyCFunction) KX_IpoActuator::sPySet,
- METH_VARARGS, Set_doc},
- {"setProperty", (PyCFunction) KX_IpoActuator::sPySetProperty,
- METH_VARARGS, SetProperty_doc},
- {"setStart", (PyCFunction) KX_IpoActuator::sPySetStart,
- METH_VARARGS, SetStart_doc},
- {"getStart", (PyCFunction) KX_IpoActuator::sPyGetStart,
- METH_NOARGS, GetStart_doc},
- {"setEnd", (PyCFunction) KX_IpoActuator::sPySetEnd,
- METH_VARARGS, SetEnd_doc},
- {"getEnd", (PyCFunction) KX_IpoActuator::sPyGetEnd,
- METH_NOARGS, GetEnd_doc},
- {"setIpoAsForce", (PyCFunction) KX_IpoActuator::sPySetIpoAsForce,
- METH_VARARGS, SetIpoAsForce_doc},
- {"getIpoAsForce", (PyCFunction) KX_IpoActuator::sPyGetIpoAsForce,
- METH_NOARGS, GetIpoAsForce_doc},
- {"setIpoAdd", (PyCFunction) KX_IpoActuator::sPySetIpoAdd,
- METH_VARARGS, SetIpoAdd_doc},
- {"getIpoAdd", (PyCFunction) KX_IpoActuator::sPyGetIpoAdd,
- METH_NOARGS, GetIpoAdd_doc},
- {"setType", (PyCFunction) KX_IpoActuator::sPySetType,
- METH_VARARGS, SetType_doc},
- {"getType", (PyCFunction) KX_IpoActuator::sPyGetType,
- METH_NOARGS, GetType_doc},
- {"setForceIpoActsLocal", (PyCFunction) KX_IpoActuator::sPySetForceIpoActsLocal,
- METH_VARARGS, SetForceIpoActsLocal_doc},
- {"getForceIpoActsLocal", (PyCFunction) KX_IpoActuator::sPyGetForceIpoActsLocal,
- METH_NOARGS, GetForceIpoActsLocal_doc},
+ {"set", (PyCFunction) KX_IpoActuator::sPySet, METH_VARARGS, (PY_METHODCHAR)Set_doc},
+ {"setProperty", (PyCFunction) KX_IpoActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+ {"setStart", (PyCFunction) KX_IpoActuator::sPySetStart, METH_VARARGS, (PY_METHODCHAR)SetStart_doc},
+ {"getStart", (PyCFunction) KX_IpoActuator::sPyGetStart, METH_NOARGS, (PY_METHODCHAR)GetStart_doc},
+ {"setEnd", (PyCFunction) KX_IpoActuator::sPySetEnd, METH_VARARGS, (PY_METHODCHAR)SetEnd_doc},
+ {"getEnd", (PyCFunction) KX_IpoActuator::sPyGetEnd, METH_NOARGS, (PY_METHODCHAR)GetEnd_doc},
+ {"setIpoAsForce", (PyCFunction) KX_IpoActuator::sPySetIpoAsForce, METH_VARARGS, (PY_METHODCHAR)SetIpoAsForce_doc},
+ {"getIpoAsForce", (PyCFunction) KX_IpoActuator::sPyGetIpoAsForce, METH_NOARGS, (PY_METHODCHAR)GetIpoAsForce_doc},
+ {"setIpoAdd", (PyCFunction) KX_IpoActuator::sPySetIpoAdd, METH_VARARGS, (PY_METHODCHAR)SetIpoAdd_doc},
+ {"getIpoAdd", (PyCFunction) KX_IpoActuator::sPyGetIpoAdd, METH_NOARGS, (PY_METHODCHAR)GetIpoAdd_doc},
+ {"setType", (PyCFunction) KX_IpoActuator::sPySetType, METH_VARARGS, (PY_METHODCHAR)SetType_doc},
+ {"getType", (PyCFunction) KX_IpoActuator::sPyGetType, METH_NOARGS, (PY_METHODCHAR)GetType_doc},
+ {"setForceIpoActsLocal", (PyCFunction) KX_IpoActuator::sPySetForceIpoActsLocal, METH_VARARGS, (PY_METHODCHAR)SetForceIpoActsLocal_doc},
+ {"getForceIpoActsLocal", (PyCFunction) KX_IpoActuator::sPyGetForceIpoActsLocal, METH_NOARGS, (PY_METHODCHAR)GetForceIpoActsLocal_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.h b/source/gameengine/Ketsji/KX_IpoActuator.h
index d6f52f8d59d..8e5baed0530 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.h
+++ b/source/gameengine/Ketsji/KX_IpoActuator.h
@@ -72,6 +72,9 @@ protected:
/** Name of the property (only used in from_prop mode). */
STR_String m_propname;
+ /** Name of the property where we write the current frame number */
+ STR_String m_framepropname;
+
/** Interpret the ipo as a force? */
bool m_ipo_as_force;
@@ -111,6 +114,7 @@ public:
KX_IpoActuator(SCA_IObject* gameobj,
const STR_String& propname,
+ const STR_String& framePropname,
float starttime,
float endtime,
bool recurse,
diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
index c2e4430d1bc..28279b9a6b8 100644
--- a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
+++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
@@ -320,14 +320,12 @@ PyParentObject KX_MouseFocusSensor::Parents[] = {
};
PyMethodDef KX_MouseFocusSensor::Methods[] = {
- {"getRayTarget", (PyCFunction) KX_MouseFocusSensor::sPyGetRayTarget,
- METH_VARARGS, GetRayTarget_doc},
- {"getRaySource", (PyCFunction) KX_MouseFocusSensor::sPyGetRaySource,
- METH_VARARGS, GetRaySource_doc},
- {"getHitObject",(PyCFunction) KX_MouseFocusSensor::sPyGetHitObject,METH_VARARGS, GetHitObject_doc},
- {"getHitPosition",(PyCFunction) KX_MouseFocusSensor::sPyGetHitPosition,METH_VARARGS, GetHitPosition_doc},
- {"getHitNormal",(PyCFunction) KX_MouseFocusSensor::sPyGetHitNormal,METH_VARARGS, GetHitNormal_doc},
- {"getRayDirection",(PyCFunction) KX_MouseFocusSensor::sPyGetRayDirection,METH_VARARGS, GetRayDirection_doc},
+ {"getRayTarget", (PyCFunction) KX_MouseFocusSensor::sPyGetRayTarget, METH_VARARGS, (PY_METHODCHAR)GetRayTarget_doc},
+ {"getRaySource", (PyCFunction) KX_MouseFocusSensor::sPyGetRaySource, METH_VARARGS, (PY_METHODCHAR)GetRaySource_doc},
+ {"getHitObject",(PyCFunction) KX_MouseFocusSensor::sPyGetHitObject,METH_VARARGS, (PY_METHODCHAR)GetHitObject_doc},
+ {"getHitPosition",(PyCFunction) KX_MouseFocusSensor::sPyGetHitPosition,METH_VARARGS, (PY_METHODCHAR)GetHitPosition_doc},
+ {"getHitNormal",(PyCFunction) KX_MouseFocusSensor::sPyGetHitNormal,METH_VARARGS, (PY_METHODCHAR)GetHitNormal_doc},
+ {"getRayDirection",(PyCFunction) KX_MouseFocusSensor::sPyGetRayDirection,METH_VARARGS, (PY_METHODCHAR)GetRayDirection_doc},
{NULL,NULL} //Sentinel
diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp
index 140dd37f5c6..bae87c28123 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.cpp
+++ b/source/gameengine/Ketsji/KX_NearSensor.cpp
@@ -190,13 +190,13 @@ bool KX_NearSensor::Evaluate(CValue* event)
{
if (m_physCtrl)
{
- m_physCtrl->SetMargin(m_ResetMargin);
+ m_physCtrl->SetRadius(m_ResetMargin);
}
} else
{
if (m_physCtrl)
{
- m_physCtrl->SetMargin(m_Margin);
+ m_physCtrl->SetRadius(m_Margin);
}
}
@@ -252,8 +252,10 @@ bool KX_NearSensor::NewHandleCollision(void* obj1,void* obj2,const PHY_CollData
client_info->m_gameobject :
NULL);
- // these checks are done already in BroadPhaseFilterCollision()
- if (gameobj /*&& (gameobj != parent)*/)
+ // Add the same check as in SCA_ISensor::Activate(),
+ // we don't want to record collision when the sensor is not active.
+ if (m_links && !m_suspended &&
+ gameobj /* done in BroadPhaseFilterCollision() && (gameobj != parent)*/)
{
if (!m_colliders->SearchValue(gameobj))
m_colliders->Add(gameobj->AddRef());
@@ -309,14 +311,10 @@ PyParentObject KX_NearSensor::Parents[] = {
PyMethodDef KX_NearSensor::Methods[] = {
- {"setProperty",
- (PyCFunction) KX_NearSensor::sPySetProperty, METH_VARARGS, SetProperty_doc},
- {"getProperty",
- (PyCFunction) KX_NearSensor::sPyGetProperty, METH_VARARGS, GetProperty_doc},
- {"getHitObject",
- (PyCFunction) KX_NearSensor::sPyGetHitObject, METH_VARARGS, GetHitObject_doc},
- {"getHitObjectList",
- (PyCFunction) KX_NearSensor::sPyGetHitObjectList, METH_VARARGS, GetHitObjectList_doc},
+ {"setProperty", (PyCFunction) KX_NearSensor::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+ {"getProperty", (PyCFunction) KX_NearSensor::sPyGetProperty, METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
+ {"getHitObject",(PyCFunction) KX_NearSensor::sPyGetHitObject, METH_VARARGS, (PY_METHODCHAR)GetHitObject_doc},
+ {"getHitObjectList", (PyCFunction) KX_NearSensor::sPyGetHitObjectList, METH_VARARGS, (PY_METHODCHAR)GetHitObjectList_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_OdePhysicsController.cpp b/source/gameengine/Ketsji/KX_OdePhysicsController.cpp
index 05feb11a2bc..6a701a5f25b 100644
--- a/source/gameengine/Ketsji/KX_OdePhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_OdePhysicsController.cpp
@@ -169,6 +169,11 @@ MT_Scalar KX_OdePhysicsController::GetMass()
return ODEPhysicsController::getMass();
}
+MT_Scalar KX_OdePhysicsController::GetRadius()
+{
+ return MT_Scalar(0.f);
+}
+
MT_Vector3 KX_OdePhysicsController::getReactionForce()
{
return MT_Vector3(0,0,0);
diff --git a/source/gameengine/Ketsji/KX_OdePhysicsController.h b/source/gameengine/Ketsji/KX_OdePhysicsController.h
index 18f9edc6835..53050f6ce3e 100644
--- a/source/gameengine/Ketsji/KX_OdePhysicsController.h
+++ b/source/gameengine/Ketsji/KX_OdePhysicsController.h
@@ -76,7 +76,7 @@ public:
virtual void SuspendDynamics(bool);
virtual void RestoreDynamics();
-
+ virtual MT_Scalar GetRadius();
virtual SG_Controller* GetReplica(class SG_Node* destnode);
diff --git a/source/gameengine/Ketsji/KX_ParentActuator.cpp b/source/gameengine/Ketsji/KX_ParentActuator.cpp
index 2dc2702ac27..eb56e8de679 100644
--- a/source/gameengine/Ketsji/KX_ParentActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ParentActuator.cpp
@@ -166,8 +166,8 @@ PyParentObject KX_ParentActuator::Parents[] = {
};
PyMethodDef KX_ParentActuator::Methods[] = {
- {"setObject", (PyCFunction) KX_ParentActuator::sPySetObject, METH_O, SetObject_doc},
- {"getObject", (PyCFunction) KX_ParentActuator::sPyGetObject, METH_VARARGS, GetObject_doc},
+ {"setObject", (PyCFunction) KX_ParentActuator::sPySetObject, METH_O, (PY_METHODCHAR)SetObject_doc},
+ {"getObject", (PyCFunction) KX_ParentActuator::sPyGetObject, METH_VARARGS, (PY_METHODCHAR)GetObject_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
index ac63e3fade5..fb37eded450 100644
--- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
+++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
@@ -435,7 +435,7 @@ static PyObject* gPyCreateConstraint(PyObject* self,
PHY_IPhysicsController* physctrl2 = (PHY_IPhysicsController*) physicsid2;
if (physctrl) //TODO:check for existance of this pointer!
{
- int constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype,pivotX,pivotY,pivotZ,axisX,axisY,axisZ);
+ int constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype,pivotX,pivotY,pivotZ,axisX,axisY,axisZ,0);
KX_ConstraintWrapper* wrap = new KX_ConstraintWrapper((enum PHY_ConstraintType)constrainttype,constraintid,PHY_GetActiveEnvironment());
@@ -510,54 +510,54 @@ static PyObject* gPyRemoveConstraint(PyObject* self,
static struct PyMethodDef physicsconstraints_methods[] = {
{"setGravity",(PyCFunction) gPySetGravity,
- METH_VARARGS, gPySetGravity__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetGravity__doc__},
{"setDebugMode",(PyCFunction) gPySetDebugMode,
- METH_VARARGS, gPySetDebugMode__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetDebugMode__doc__},
/// settings that influence quality of the rigidbody dynamics
{"setNumIterations",(PyCFunction) gPySetNumIterations,
- METH_VARARGS, gPySetNumIterations__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetNumIterations__doc__},
{"setNumTimeSubSteps",(PyCFunction) gPySetNumTimeSubSteps,
- METH_VARARGS, gPySetNumTimeSubSteps__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetNumTimeSubSteps__doc__},
{"setDeactivationTime",(PyCFunction) gPySetDeactivationTime,
- METH_VARARGS, gPySetDeactivationTime__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetDeactivationTime__doc__},
{"setDeactivationLinearTreshold",(PyCFunction) gPySetDeactivationLinearTreshold,
- METH_VARARGS, gPySetDeactivationLinearTreshold__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetDeactivationLinearTreshold__doc__},
{"setDeactivationAngularTreshold",(PyCFunction) gPySetDeactivationAngularTreshold,
- METH_VARARGS, gPySetDeactivationAngularTreshold__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetDeactivationAngularTreshold__doc__},
{"setContactBreakingTreshold",(PyCFunction) gPySetContactBreakingTreshold,
- METH_VARARGS, gPySetContactBreakingTreshold__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetContactBreakingTreshold__doc__},
{"setCcdMode",(PyCFunction) gPySetCcdMode,
- METH_VARARGS, gPySetCcdMode__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetCcdMode__doc__},
{"setSorConstant",(PyCFunction) gPySetSorConstant,
- METH_VARARGS, gPySetSorConstant__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetSorConstant__doc__},
{"setSolverTau",(PyCFunction) gPySetSolverTau,
- METH_VARARGS, gPySetSolverTau__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetSolverTau__doc__},
{"setSolverDamping",(PyCFunction) gPySetSolverDamping,
- METH_VARARGS, gPySetSolverDamping__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetSolverDamping__doc__},
{"setLinearAirDamping",(PyCFunction) gPySetLinearAirDamping,
- METH_VARARGS, gPySetLinearAirDamping__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetLinearAirDamping__doc__},
{"setUseEpa",(PyCFunction) gPySetUseEpa,
- METH_VARARGS, gPySetUseEpa__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetUseEpa__doc__},
{"setSolverType",(PyCFunction) gPySetSolverType,
- METH_VARARGS, gPySetSolverType__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPySetSolverType__doc__},
{"createConstraint",(PyCFunction) gPyCreateConstraint,
- METH_VARARGS, gPyCreateConstraint__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPyCreateConstraint__doc__},
{"getVehicleConstraint",(PyCFunction) gPyGetVehicleConstraint,
- METH_VARARGS, gPyGetVehicleConstraint__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPyGetVehicleConstraint__doc__},
{"removeConstraint",(PyCFunction) gPyRemoveConstraint,
- METH_VARARGS, gPyRemoveConstraint__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPyRemoveConstraint__doc__},
{"getAppliedImpulse",(PyCFunction) gPyGetAppliedImpulse,
- METH_VARARGS, gPyGetAppliedImpulse__doc__},
+ METH_VARARGS, (PY_METHODCHAR)gPyGetAppliedImpulse__doc__},
//sentinel
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 3e271be7984..a30d9f4022d 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -97,6 +97,7 @@ static RAS_ICanvas* gp_Canvas = NULL;
static KX_Scene* gp_KetsjiScene = NULL;
static KX_KetsjiEngine* gp_KetsjiEngine = NULL;
static RAS_IRasterizer* gp_Rasterizer = NULL;
+static char gp_GamePythonPath[FILE_MAXDIR + FILE_MAXFILE] = "";
void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
{
@@ -155,7 +156,7 @@ static PyObject* gPyExpandPath(PyObject*, PyObject* args)
return NULL;
BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
- BLI_convertstringcode(expanded, G.sce);
+ BLI_convertstringcode(expanded, gp_GamePythonPath);
return PyString_FromString(expanded);
}
@@ -281,7 +282,7 @@ static PyObject* gPyGetAverageFrameRate(PyObject*)
static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
{
- char cpath[sizeof(G.sce)];
+ char cpath[sizeof(gp_GamePythonPath)];
char *searchpath = NULL;
PyObject* list, *value;
@@ -295,10 +296,10 @@ static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
if (searchpath) {
BLI_strncpy(cpath, searchpath, FILE_MAXDIR + FILE_MAXFILE);
- BLI_convertstringcode(cpath, G.sce);
+ BLI_convertstringcode(cpath, gp_GamePythonPath);
} else {
/* Get the dir only */
- BLI_split_dirfile_basic(G.sce, cpath, NULL);
+ BLI_split_dirfile_basic(gp_GamePythonPath, cpath, NULL);
}
if((dp = opendir(cpath)) == NULL) {
@@ -401,26 +402,26 @@ static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
static struct PyMethodDef game_methods[] = {
- {"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, gPyExpandPath_doc},
+ {"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (PY_METHODCHAR)gPyExpandPath_doc},
{"getCurrentController",
(PyCFunction) SCA_PythonController::sPyGetCurrentController,
- METH_NOARGS, SCA_PythonController::sPyGetCurrentController__doc__},
+ METH_NOARGS, (PY_METHODCHAR)SCA_PythonController::sPyGetCurrentController__doc__},
{"getCurrentScene", (PyCFunction) gPyGetCurrentScene,
- METH_NOARGS, gPyGetCurrentScene_doc.Ptr()},
+ METH_NOARGS, (PY_METHODCHAR)gPyGetCurrentScene_doc.Ptr()},
{"addActiveActuator",(PyCFunction) SCA_PythonController::sPyAddActiveActuator,
- METH_VARARGS, SCA_PythonController::sPyAddActiveActuator__doc__},
+ METH_VARARGS, (PY_METHODCHAR)SCA_PythonController::sPyAddActiveActuator__doc__},
{"getRandomFloat",(PyCFunction) gPyGetRandomFloat,
- METH_NOARGS,gPyGetRandomFloat_doc.Ptr()},
- {"setGravity",(PyCFunction) gPySetGravity, METH_VARARGS,"set Gravitation"},
- {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS,"get audio spectrum"},
- {"stopDSP",(PyCFunction) gPyStopDSP, METH_VARARGS,"stop using the audio dsp (for performance reasons)"},
- {"getLogicTicRate", (PyCFunction) gPyGetLogicTicRate, METH_NOARGS, "Gets the logic tic rate"},
- {"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, "Sets the logic tic rate"},
- {"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, "Gets the physics tic rate"},
- {"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, "Sets the physics tic rate"},
- {"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, "Gets the estimated average frame rate"},
- {"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, "Gets a list of blend files in the same directory as the current blend file"},
- {"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, "Prints GL Extension Info"},
+ METH_NOARGS, (PY_METHODCHAR)gPyGetRandomFloat_doc.Ptr()},
+ {"setGravity",(PyCFunction) gPySetGravity, METH_VARARGS, (PY_METHODCHAR)"set Gravitation"},
+ {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (PY_METHODCHAR)"get audio spectrum"},
+ {"stopDSP",(PyCFunction) gPyStopDSP, METH_VARARGS, (PY_METHODCHAR)"stop using the audio dsp (for performance reasons)"},
+ {"getLogicTicRate", (PyCFunction) gPyGetLogicTicRate, METH_NOARGS, (PY_METHODCHAR)"Gets the logic tic rate"},
+ {"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (PY_METHODCHAR)"Sets the logic tic rate"},
+ {"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (PY_METHODCHAR)"Gets the physics tic rate"},
+ {"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (PY_METHODCHAR)"Sets the physics tic rate"},
+ {"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (PY_METHODCHAR)"Gets the estimated average frame rate"},
+ {"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (PY_METHODCHAR)"Gets a list of blend files in the same directory as the current blend file"},
+ {"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (PY_METHODCHAR)"Prints GL Extension Info"},
{NULL, (PyCFunction) NULL, 0, NULL }
};
@@ -826,27 +827,19 @@ static PyObject* gPyDrawLine(PyObject*, PyObject* args)
Py_RETURN_NONE;
}
-
-STR_String gPyGetWindowHeight__doc__="getWindowHeight doc";
-STR_String gPyGetWindowWidth__doc__="getWindowWidth doc";
-STR_String gPyEnableVisibility__doc__="enableVisibility doc";
-STR_String gPyMakeScreenshot__doc__="make Screenshot doc";
-STR_String gPyShowMouse__doc__="showMouse(bool visible)";
-STR_String gPySetMousePosition__doc__="setMousePosition(int x,int y)";
-
static struct PyMethodDef rasterizer_methods[] = {
{"getWindowWidth",(PyCFunction) gPyGetWindowWidth,
- METH_VARARGS, gPyGetWindowWidth__doc__.Ptr()},
+ METH_VARARGS, "getWindowWidth doc"},
{"getWindowHeight",(PyCFunction) gPyGetWindowHeight,
- METH_VARARGS, gPyGetWindowHeight__doc__.Ptr()},
+ METH_VARARGS, "getWindowHeight doc"},
{"makeScreenshot",(PyCFunction)gPyMakeScreenshot,
- METH_VARARGS, gPyMakeScreenshot__doc__.Ptr()},
+ METH_VARARGS, "make Screenshot doc"},
{"enableVisibility",(PyCFunction) gPyEnableVisibility,
- METH_VARARGS, gPyEnableVisibility__doc__.Ptr()},
+ METH_VARARGS, "enableVisibility doc"},
{"showMouse",(PyCFunction) gPyShowMouse,
- METH_VARARGS, gPyShowMouse__doc__.Ptr()},
+ METH_VARARGS, "showMouse(bool visible)"},
{"setMousePosition",(PyCFunction) gPySetMousePosition,
- METH_VARARGS, gPySetMousePosition__doc__.Ptr()},
+ METH_VARARGS, "setMousePosition(int x,int y)"},
{"setBackgroundColor",(PyCFunction)gPySetBackgroundColor,METH_VARARGS,"set Background Color (rgb)"},
{"setAmbientColor",(PyCFunction)gPySetAmbientColor,METH_VARARGS,"set Ambient Color (rgb)"},
{"setMistColor",(PyCFunction)gPySetMistColor,METH_VARARGS,"set Mist Color (rgb)"},
@@ -1085,9 +1078,17 @@ PyObject *KXpy_import(PyObject *self, PyObject *args)
PyObject *fromlist = NULL;
PyObject *l, *m, *n;
+#if (PY_VERSION_HEX >= 0x02060000)
+ int dummy_val; /* what does this do?*/
+
+ if (!PyArg_ParseTuple(args, "s|OOOi:m_import",
+ &name, &globals, &locals, &fromlist, &dummy_val))
+ return NULL;
+#else
if (!PyArg_ParseTuple(args, "s|OOO:m_import",
&name, &globals, &locals, &fromlist))
return NULL;
+#endif
/* check for builtin modules */
m = PyImport_AddModule("sys");
@@ -1311,7 +1312,7 @@ static PyObject* gPyEventToString(PyObject*, PyObject* value)
}
static struct PyMethodDef gamekeys_methods[] = {
- {"EventToString", (PyCFunction)gPyEventToString, METH_O, gPyEventToString_doc},
+ {"EventToString", (PyCFunction)gPyEventToString, METH_O, (PY_METHODCHAR)gPyEventToString_doc},
{ NULL, (PyCFunction) NULL, 0, NULL }
};
@@ -1500,6 +1501,7 @@ int saveGamePythonConfig( char **marshal_buffer)
}
Py_DECREF(gameLogic);
} else {
+ PyErr_Clear();
printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
}
return marshal_length;
@@ -1513,10 +1515,17 @@ int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
if (gameLogic) {
PyObject* pyGlobalDict = PyMarshal_ReadObjectFromString(marshal_buffer, marshal_length);
-
if (pyGlobalDict) {
- PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
+ PyObject* pyGlobalDict_orig = PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as importing the module.
+ if (pyGlobalDict_orig) {
+ PyDict_Clear(pyGlobalDict_orig);
+ PyDict_Update(pyGlobalDict_orig, pyGlobalDict);
+ } else {
+ /* this should not happen, but cant find the original globalDict, just assign it then */
+ PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
+ }
Py_DECREF(gameLogic);
+ Py_DECREF(pyGlobalDict);
return 1;
} else {
Py_DECREF(gameLogic);
@@ -1524,6 +1533,7 @@ int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
printf("Error could not marshall string\n");
}
} else {
+ PyErr_Clear();
printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
}
}
@@ -1532,9 +1542,10 @@ int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
void pathGamePythonConfig( char *path )
{
- int len = strlen(G.sce);
+ int len = strlen(gp_GamePythonPath);
- strncpy(path, G.sce, sizeof(G.sce));
+ BLI_strncpy(path, gp_GamePythonPath, sizeof(gp_GamePythonPath));
+
/* replace extension */
if (BLI_testextensie(path, ".blend")) {
strcpy(path+(len-6), ".bgeconf");
@@ -1542,3 +1553,9 @@ void pathGamePythonConfig( char *path )
strcpy(path+len, ".bgeconf");
}
}
+
+void setGamePythonPath(char *path)
+{
+ BLI_strncpy(gp_GamePythonPath, path, sizeof(gp_GamePythonPath));
+}
+
diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h
index 28d9d72a4c3..36e3db6ec35 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.h
+++ b/source/gameengine/Ketsji/KX_PythonInit.h
@@ -49,6 +49,7 @@ void exitGamePlayerPythonScripting();
PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLevel level);
void exitGamePythonScripting();
+void setGamePythonPath(char *path);
void pathGamePythonConfig( char *path );
int saveGamePythonConfig( char **marshal_buffer);
int loadGamePythonConfig(char *marshal_buffer, int marshal_length);
diff --git a/source/gameengine/Ketsji/KX_RadarSensor.cpp b/source/gameengine/Ketsji/KX_RadarSensor.cpp
index 9a75e58c8ca..244e9b75d8e 100644
--- a/source/gameengine/Ketsji/KX_RadarSensor.cpp
+++ b/source/gameengine/Ketsji/KX_RadarSensor.cpp
@@ -221,11 +221,11 @@ PyParentObject KX_RadarSensor::Parents[] = {
PyMethodDef KX_RadarSensor::Methods[] = {
{"getConeOrigin", (PyCFunction) KX_RadarSensor::sPyGetConeOrigin,
- METH_VARARGS, GetConeOrigin_doc},
+ METH_VARARGS, (PY_METHODCHAR)GetConeOrigin_doc},
{"getConeTarget", (PyCFunction) KX_RadarSensor::sPyGetConeTarget,
- METH_VARARGS, GetConeTarget_doc},
+ METH_VARARGS, (PY_METHODCHAR)GetConeTarget_doc},
{"getConeHeight", (PyCFunction) KX_RadarSensor::sPyGetConeHeight,
- METH_VARARGS, GetConeHeight_doc},
+ METH_VARARGS, (PY_METHODCHAR)GetConeHeight_doc},
{NULL,NULL,NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_RaySensor.cpp b/source/gameengine/Ketsji/KX_RaySensor.cpp
index 64897bd62ba..e24fb773eac 100644
--- a/source/gameengine/Ketsji/KX_RaySensor.cpp
+++ b/source/gameengine/Ketsji/KX_RaySensor.cpp
@@ -335,10 +335,10 @@ PyParentObject KX_RaySensor::Parents[] = {
};
PyMethodDef KX_RaySensor::Methods[] = {
- {"getHitObject",(PyCFunction) KX_RaySensor::sPyGetHitObject,METH_VARARGS, GetHitObject_doc},
- {"getHitPosition",(PyCFunction) KX_RaySensor::sPyGetHitPosition,METH_VARARGS, GetHitPosition_doc},
- {"getHitNormal",(PyCFunction) KX_RaySensor::sPyGetHitNormal,METH_VARARGS, GetHitNormal_doc},
- {"getRayDirection",(PyCFunction) KX_RaySensor::sPyGetRayDirection,METH_VARARGS, GetRayDirection_doc},
+ {"getHitObject",(PyCFunction) KX_RaySensor::sPyGetHitObject,METH_VARARGS, (PY_METHODCHAR)GetHitObject_doc},
+ {"getHitPosition",(PyCFunction) KX_RaySensor::sPyGetHitPosition,METH_VARARGS, (PY_METHODCHAR)GetHitPosition_doc},
+ {"getHitNormal",(PyCFunction) KX_RaySensor::sPyGetHitNormal,METH_VARARGS, (PY_METHODCHAR)GetHitNormal_doc},
+ {"getRayDirection",(PyCFunction) KX_RaySensor::sPyGetRayDirection,METH_VARARGS, (PY_METHODCHAR)GetRayDirection_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
index ba4a23eb427..5777f54b799 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
@@ -188,14 +188,14 @@ PyParentObject KX_SCA_AddObjectActuator::Parents[] = {
NULL
};
PyMethodDef KX_SCA_AddObjectActuator::Methods[] = {
- {"setObject", (PyCFunction) KX_SCA_AddObjectActuator::sPySetObject, METH_O, SetObject_doc},
- {"setTime", (PyCFunction) KX_SCA_AddObjectActuator::sPySetTime, METH_O, SetTime_doc},
- {"getObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetObject, METH_VARARGS, GetObject_doc},
- {"getTime", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetTime, METH_NOARGS, GetTime_doc},
- {"getLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLinearVelocity, METH_NOARGS, GetLinearVelocity_doc},
- {"setLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetLinearVelocity, METH_VARARGS, SetLinearVelocity_doc},
- {"getAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetAngularVelocity, METH_NOARGS, GetAngularVelocity_doc},
- {"setAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetAngularVelocity, METH_VARARGS, SetAngularVelocity_doc},
+ {"setObject", (PyCFunction) KX_SCA_AddObjectActuator::sPySetObject, METH_O, (PY_METHODCHAR)SetObject_doc},
+ {"setTime", (PyCFunction) KX_SCA_AddObjectActuator::sPySetTime, METH_O, (PY_METHODCHAR)SetTime_doc},
+ {"getObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetObject, METH_VARARGS, (PY_METHODCHAR)GetObject_doc},
+ {"getTime", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetTime, METH_NOARGS, (PY_METHODCHAR)GetTime_doc},
+ {"getLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLinearVelocity, METH_NOARGS, (PY_METHODCHAR)GetLinearVelocity_doc},
+ {"setLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetLinearVelocity, METH_VARARGS, (PY_METHODCHAR)SetLinearVelocity_doc},
+ {"getAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetAngularVelocity, METH_NOARGS, (PY_METHODCHAR)GetAngularVelocity_doc},
+ {"setAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetAngularVelocity, METH_VARARGS, (PY_METHODCHAR)SetAngularVelocity_doc},
{"getLastCreatedObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLastCreatedObject, METH_NOARGS,"getLastCreatedObject() : get the object handle to the last created object\n"},
{"instantAddObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyInstantAddObject, METH_NOARGS,"instantAddObject() : immediately add object without delay\n"},
diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
index a5cd3f85f85..261d9ec8f0c 100644
--- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
@@ -82,7 +82,7 @@ PyParentObject KX_SCA_ReplaceMeshActuator::Parents[] = {
PyMethodDef KX_SCA_ReplaceMeshActuator::Methods[] = {
- {"setMesh", (PyCFunction) KX_SCA_ReplaceMeshActuator::sPySetMesh, METH_O, SetMesh_doc},
+ {"setMesh", (PyCFunction) KX_SCA_ReplaceMeshActuator::sPySetMesh, METH_O, (PY_METHODCHAR)SetMesh_doc},
KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, instantReplaceMesh),
KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, getMesh),
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index f5d6d7e8e0a..caa71441b1d 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -614,7 +614,8 @@ void KX_Scene::DupliGroupRecurse(CValue* obj, int level)
GroupObject *go;
vector<KX_GameObject*> duplilist;
- if (!groupobj->IsDupliGroup() ||
+ if (!groupobj->GetSGNode() ||
+ !groupobj->IsDupliGroup() ||
level>MAX_DUPLI_RECUR)
return;
@@ -1232,7 +1233,7 @@ void KX_Scene::MarkSubTreeVisible(SG_Tree *node, RAS_IRasterizer* rasty, bool vi
void KX_Scene::MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj,KX_Camera* cam,int layer)
{
// User (Python/Actuator) has forced object invisible...
- if (!gameobj->GetVisible())
+ if (!gameobj->GetSGNode() || !gameobj->GetVisible())
return;
// Shadow lamp layers
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.cpp b/source/gameengine/Ketsji/KX_SceneActuator.cpp
index 7d0181b162f..35484699b17 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SceneActuator.cpp
@@ -259,12 +259,12 @@ PyParentObject KX_SceneActuator::Parents[] =
PyMethodDef KX_SceneActuator::Methods[] =
{
- {"setUseRestart", (PyCFunction) KX_SceneActuator::sPySetUseRestart, METH_VARARGS, SetUseRestart_doc},
- {"setScene", (PyCFunction) KX_SceneActuator::sPySetScene, METH_VARARGS, SetScene_doc},
- {"setCamera", (PyCFunction) KX_SceneActuator::sPySetCamera, METH_VARARGS, SetCamera_doc},
- {"getUseRestart", (PyCFunction) KX_SceneActuator::sPyGetUseRestart, METH_VARARGS, GetUseRestart_doc},
- {"getScene", (PyCFunction) KX_SceneActuator::sPyGetScene, METH_VARARGS, GetScene_doc},
- {"getCamera", (PyCFunction) KX_SceneActuator::sPyGetCamera, METH_VARARGS, GetCamera_doc},
+ {"setUseRestart", (PyCFunction) KX_SceneActuator::sPySetUseRestart, METH_VARARGS, (PY_METHODCHAR)SetUseRestart_doc},
+ {"setScene", (PyCFunction) KX_SceneActuator::sPySetScene, METH_VARARGS, (PY_METHODCHAR)SetScene_doc},
+ {"setCamera", (PyCFunction) KX_SceneActuator::sPySetCamera, METH_VARARGS, (PY_METHODCHAR)SetCamera_doc},
+ {"getUseRestart", (PyCFunction) KX_SceneActuator::sPyGetUseRestart, METH_VARARGS, (PY_METHODCHAR)GetUseRestart_doc},
+ {"getScene", (PyCFunction) KX_SceneActuator::sPyGetScene, METH_VARARGS, (PY_METHODCHAR)GetScene_doc},
+ {"getCamera", (PyCFunction) KX_SceneActuator::sPyGetCamera, METH_VARARGS, (PY_METHODCHAR)GetCamera_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp
index f75a1ee5c62..afa5af3bc04 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp
@@ -110,6 +110,9 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
if (!m_soundObject)
return false;
+ // actual audio device playing state
+ bool isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED) ? true : false;
+
if (m_pino)
{
bNegativeEvent = true;
@@ -119,30 +122,40 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
if (bNegativeEvent)
{
// here must be a check if it is still playing
- m_isplaying = false;
-
- switch (m_type)
+ if (m_isplaying && isplaying)
{
- case KX_SOUNDACT_PLAYSTOP:
- case KX_SOUNDACT_LOOPSTOP:
- case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP:
- {
- m_soundScene->RemoveActiveObject(m_soundObject);
- break;
- }
- case KX_SOUNDACT_PLAYEND:
+ switch (m_type)
{
- m_soundObject->SetPlaystate(SND_MUST_STOP_WHEN_FINISHED);
+ case KX_SOUNDACT_PLAYSTOP:
+ case KX_SOUNDACT_LOOPSTOP:
+ case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP:
+ {
+ m_soundScene->RemoveActiveObject(m_soundObject);
+ break;
+ }
+ case KX_SOUNDACT_PLAYEND:
+ {
+ m_soundObject->SetPlaystate(SND_MUST_STOP_WHEN_FINISHED);
+ break;
+ }
+ case KX_SOUNDACT_LOOPEND:
+ case KX_SOUNDACT_LOOPBIDIRECTIONAL:
+ {
+ m_soundObject->SetLoopMode(SND_LOOP_OFF);
+ m_soundObject->SetPlaystate(SND_MUST_STOP_WHEN_FINISHED);
+ break;
+ }
+ default:
+ // implement me !!
break;
}
- default:
- // implement me !!
- break;
}
+ // remember that we tried to stop the actuator
+ m_isplaying = false;
}
else
{
- if (m_soundObject && !m_isplaying)
+ if (!m_isplaying)
{
switch (m_type)
{
@@ -179,8 +192,10 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
}
}
}
+ // verify that the sound is still playing
+ isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED) ? true : false;
- if (m_isplaying)
+ if (isplaying)
{
m_soundObject->SetPosition(((KX_GameObject*)this->GetParent())->NodeGetWorldPosition());
m_soundObject->SetVelocity(((KX_GameObject*)this->GetParent())->GetLinearVelocity());
@@ -189,14 +204,15 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
}
else
{
+ m_isplaying = false;
result = false;
}
-
+ /*
if (result && (m_soundObject->IsLifeSpanOver(curtime)) && ((m_type == KX_SOUNDACT_PLAYEND) || (m_type == KX_SOUNDACT_PLAYSTOP)))
{
m_pino = true;
}
-
+ */
return result;
}
@@ -312,6 +328,9 @@ PyObject* KX_SoundActuator::PyGetFilename(PyObject* self, PyObject* args, PyObje
PyObject* KX_SoundActuator::PyStartSound(PyObject* self, PyObject* args, PyObject* kwds)
{
if (m_soundObject)
+ // This has no effect if the actuator is not active.
+ // To start the sound you must activate the actuator.
+ // This function is to restart the sound.
m_soundObject->StartSound();
Py_Return;
}
@@ -321,6 +340,7 @@ PyObject* KX_SoundActuator::PyStartSound(PyObject* self, PyObject* args, PyObjec
PyObject* KX_SoundActuator::PyPauseSound(PyObject* self, PyObject* args, PyObject* kwds)
{
if (m_soundObject)
+ // unfortunately, openal does not implement pause correctly, it is equivalent to a stop
m_soundObject->PauseSound();
Py_Return;
}
diff --git a/source/gameengine/Ketsji/KX_StateActuator.cpp b/source/gameengine/Ketsji/KX_StateActuator.cpp
index be874c97b3c..e360c4bac1f 100644
--- a/source/gameengine/Ketsji/KX_StateActuator.cpp
+++ b/source/gameengine/Ketsji/KX_StateActuator.cpp
@@ -140,9 +140,9 @@ KX_StateActuator::Parents[] = {
PyMethodDef
KX_StateActuator::Methods[] = {
{"setOperation", (PyCFunction) KX_StateActuator::sPySetOperation,
- METH_VARARGS, SetOperation_doc},
+ METH_VARARGS, (PY_METHODCHAR)SetOperation_doc},
{"setMask", (PyCFunction) KX_StateActuator::sPySetMask,
- METH_VARARGS, SetMask_doc},
+ METH_VARARGS, (PY_METHODCHAR)SetMask_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp b/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp
index 4032a795ce3..c842ca1ee14 100644
--- a/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp
@@ -205,6 +205,11 @@ MT_Scalar KX_SumoPhysicsController::GetMass()
return SumoPhysicsController::getMass();
}
+MT_Scalar KX_SumoPhysicsController::GetRadius()
+{
+ return SumoPhysicsController::GetRadius();
+}
+
MT_Vector3 KX_SumoPhysicsController::getReactionForce()
{
float force[3];
diff --git a/source/gameengine/Ketsji/KX_SumoPhysicsController.h b/source/gameengine/Ketsji/KX_SumoPhysicsController.h
index 1dd930bf3d9..abe48d99043 100644
--- a/source/gameengine/Ketsji/KX_SumoPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_SumoPhysicsController.h
@@ -84,6 +84,7 @@ public:
virtual void setPosition(const MT_Point3& pos);
virtual void setScaling(const MT_Vector3& scaling);
virtual MT_Scalar GetMass();
+ virtual MT_Scalar GetRadius();
virtual MT_Vector3 getReactionForce();
virtual void setRigidBody(bool rigid);
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp
index ad0b7428a24..1935a0bde39 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.cpp
+++ b/source/gameengine/Ketsji/KX_TouchSensor.cpp
@@ -55,9 +55,17 @@ void KX_TouchSensor::SynchronizeTransform()
void KX_TouchSensor::EndFrame() {
m_colliders->ReleaseAndRemoveAll();
+ m_hitObject = NULL;
m_bTriggered = false;
}
+void KX_TouchSensor::UnregisterToManager()
+{
+ // before unregistering the sensor, make sure we release all references
+ EndFrame();
+ m_eventmgr->RemoveSensor(this);
+}
+
bool KX_TouchSensor::Evaluate(CValue* event)
{
bool result = false;
@@ -176,7 +184,10 @@ bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_Coll
client_info->m_gameobject :
NULL);
- if (gameobj && (gameobj != parent) && client_info->isActor())
+ // add the same check as in SCA_ISensor::Activate(),
+ // we don't want to record collision when the sensor is not active.
+ if (m_links && !m_suspended &&
+ gameobj && (gameobj != parent) && client_info->isActor())
{
if (!m_colliders->SearchValue(gameobj))
m_colliders->Add(gameobj->AddRef());
@@ -240,13 +251,13 @@ PyParentObject KX_TouchSensor::Parents[] = {
PyMethodDef KX_TouchSensor::Methods[] = {
{"setProperty",
- (PyCFunction) KX_TouchSensor::sPySetProperty, METH_VARARGS, SetProperty_doc},
+ (PyCFunction) KX_TouchSensor::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
{"getProperty",
- (PyCFunction) KX_TouchSensor::sPyGetProperty, METH_VARARGS, GetProperty_doc},
+ (PyCFunction) KX_TouchSensor::sPyGetProperty, METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
{"getHitObject",
- (PyCFunction) KX_TouchSensor::sPyGetHitObject, METH_VARARGS, GetHitObject_doc},
+ (PyCFunction) KX_TouchSensor::sPyGetHitObject, METH_VARARGS, (PY_METHODCHAR)GetHitObject_doc},
{"getHitObjectList",
- (PyCFunction) KX_TouchSensor::sPyGetHitObjectList, METH_VARARGS, GetHitObjectList_doc},
+ (PyCFunction) KX_TouchSensor::sPyGetHitObjectList, METH_VARARGS, (PY_METHODCHAR)GetHitObjectList_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.h b/source/gameengine/Ketsji/KX_TouchSensor.h
index b611d296939..8fbb1c676ba 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.h
+++ b/source/gameengine/Ketsji/KX_TouchSensor.h
@@ -77,6 +77,7 @@ public:
virtual void RegisterSumo(KX_TouchEventManager* touchman);
virtual void UnregisterSumo(KX_TouchEventManager* touchman);
+ virtual void UnregisterToManager();
// virtual DT_Bool HandleCollision(void* obj1,void* obj2,
// const DT_CollData * coll_data);
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.cpp b/source/gameengine/Ketsji/KX_TrackToActuator.cpp
index 42f11adf004..acc4a6ab5d7 100644
--- a/source/gameengine/Ketsji/KX_TrackToActuator.cpp
+++ b/source/gameengine/Ketsji/KX_TrackToActuator.cpp
@@ -456,12 +456,12 @@ PyParentObject KX_TrackToActuator::Parents[] = {
PyMethodDef KX_TrackToActuator::Methods[] = {
- {"setObject", (PyCFunction) KX_TrackToActuator::sPySetObject, METH_O, SetObject_doc},
- {"getObject", (PyCFunction) KX_TrackToActuator::sPyGetObject, METH_VARARGS, GetObject_doc},
- {"setTime", (PyCFunction) KX_TrackToActuator::sPySetTime, METH_VARARGS, SetTime_doc},
- {"getTime", (PyCFunction) KX_TrackToActuator::sPyGetTime, METH_VARARGS, GetTime_doc},
- {"setUse3D", (PyCFunction) KX_TrackToActuator::sPySetUse3D, METH_VARARGS, SetUse3D_doc},
- {"getUse3D", (PyCFunction) KX_TrackToActuator::sPyGetUse3D, METH_VARARGS, GetUse3D_doc},
+ {"setObject", (PyCFunction) KX_TrackToActuator::sPySetObject, METH_O, (PY_METHODCHAR)SetObject_doc},
+ {"getObject", (PyCFunction) KX_TrackToActuator::sPyGetObject, METH_VARARGS, (PY_METHODCHAR)GetObject_doc},
+ {"setTime", (PyCFunction) KX_TrackToActuator::sPySetTime, METH_VARARGS, (PY_METHODCHAR)SetTime_doc},
+ {"getTime", (PyCFunction) KX_TrackToActuator::sPyGetTime, METH_VARARGS, (PY_METHODCHAR)GetTime_doc},
+ {"setUse3D", (PyCFunction) KX_TrackToActuator::sPySetUse3D, METH_VARARGS, (PY_METHODCHAR)SetUse3D_doc},
+ {"getUse3D", (PyCFunction) KX_TrackToActuator::sPyGetUse3D, METH_VARARGS, (PY_METHODCHAR)GetUse3D_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
index 342e71c5093..028f96f6c5b 100644
--- a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
@@ -49,26 +49,29 @@ PyObject* KX_VehicleWrapper::PyAddWheel(PyObject* self,
if (PyArg_ParseTuple(args,"OOOOffi",&wheelGameObject,&pylistPos,&pylistDir,&pylistAxleDir,&suspensionRestLength,&wheelRadius,&hasSteering))
{
KX_GameObject* gameOb = (KX_GameObject*) wheelGameObject;
-
- PHY_IMotionState* motionState = new KX_MotionState(gameOb->GetSGNode());
-
- MT_Vector3 attachPos,attachDir,attachAxle;
- PyVecTo(pylistPos,attachPos);
- PyVecTo(pylistDir,attachDir);
- PyVecTo(pylistAxleDir,attachAxle);
- PHY__Vector3 aPos,aDir,aAxle;
- aPos[0] = attachPos[0];
- aPos[1] = attachPos[1];
- aPos[2] = attachPos[2];
- aDir[0] = attachDir[0];
- aDir[1] = attachDir[1];
- aDir[2] = attachDir[2];
- aAxle[0] = -attachAxle[0];//someone reverse some conventions inside Bullet (axle winding)
- aAxle[1] = -attachAxle[1];
- aAxle[2] = -attachAxle[2];
-
- printf("attempt for addWheel: suspensionRestLength%f wheelRadius %f, hasSteering:%d\n",suspensionRestLength,wheelRadius,hasSteering);
- m_vehicle->AddWheel(motionState,aPos,aDir,aAxle,suspensionRestLength,wheelRadius,hasSteering);
+
+ if (gameOb->GetSGNode())
+ {
+ PHY_IMotionState* motionState = new KX_MotionState(gameOb->GetSGNode());
+
+ MT_Vector3 attachPos,attachDir,attachAxle;
+ PyVecTo(pylistPos,attachPos);
+ PyVecTo(pylistDir,attachDir);
+ PyVecTo(pylistAxleDir,attachAxle);
+ PHY__Vector3 aPos,aDir,aAxle;
+ aPos[0] = attachPos[0];
+ aPos[1] = attachPos[1];
+ aPos[2] = attachPos[2];
+ aDir[0] = attachDir[0];
+ aDir[1] = attachDir[1];
+ aDir[2] = attachDir[2];
+ aAxle[0] = -attachAxle[0];//someone reverse some conventions inside Bullet (axle winding)
+ aAxle[1] = -attachAxle[1];
+ aAxle[2] = -attachAxle[2];
+
+ printf("attempt for addWheel: suspensionRestLength%f wheelRadius %f, hasSteering:%d\n",suspensionRestLength,wheelRadius,hasSteering);
+ m_vehicle->AddWheel(motionState,aPos,aDir,aAxle,suspensionRestLength,wheelRadius,hasSteering);
+ }
} else {
return NULL;
diff --git a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
index 7fe9d81e2e1..4b0db5a7953 100644
--- a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
+++ b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
@@ -122,7 +122,7 @@ KX_VisibilityActuator::Parents[] = {
PyMethodDef
KX_VisibilityActuator::Methods[] = {
{"set", (PyCFunction) KX_VisibilityActuator::sPySetVisible,
- METH_VARARGS, SetVisible_doc},
+ METH_VARARGS, (PY_METHODCHAR)SetVisible_doc},
{NULL,NULL} //Sentinel
};
diff --git a/source/gameengine/Physics/BlOde/OdePhysicsController.h b/source/gameengine/Physics/BlOde/OdePhysicsController.h
index d3eb443ed3a..925f5b6686a 100644
--- a/source/gameengine/Physics/BlOde/OdePhysicsController.h
+++ b/source/gameengine/Physics/BlOde/OdePhysicsController.h
@@ -111,6 +111,8 @@ public:
virtual void calcXform(){}
virtual void SetMargin(float margin) {}
virtual float GetMargin() const {return 0.f;}
+ virtual float GetRadius() const {return 0.f;}
+ virtual void SetRadius(float margin) {}
// clientinfo for raycasts for example
virtual void* getNewClientInfo() { return m_clientInfo;}
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index 166731459e7..c9c30c1b450 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -54,7 +54,7 @@ CcdPhysicsController::CcdPhysicsController (const CcdConstructionInfo& ci)
m_newClientInfo = 0;
m_registerCount = 0;
m_softBodyTransformInitialized = false;
-
+ m_parentCtrl = 0;
// copy pointers locally to allow smart release
m_MotionState = ci.m_MotionState;
m_collisionShape = ci.m_collisionShape;
@@ -500,6 +500,11 @@ void CcdPhysicsController::CreateRigidbody()
body->setAngularFactor(0.f);
}
}
+ if (m_object && m_cci.m_do_anisotropic)
+ {
+ m_object->setAnisotropicFriction(m_cci.m_anisotropicFriction);
+ }
+
}
static void DeleteBulletShape(btCollisionShape* shape)
@@ -623,6 +628,7 @@ void CcdPhysicsController::WriteDynamicsToMotionState()
// controller replication
void CcdPhysicsController::PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl)
{
+
m_softBodyTransformInitialized=false;
m_MotionState = motionstate;
m_registerCount = 0;
@@ -956,8 +962,12 @@ void CcdPhysicsController::ApplyForce(float forceX,float forceY,float forceZ,bo
body->applyCentralForce(force);
btSoftBody* soft = GetSoftBody();
if (soft)
+ {
+ // the force is applied on each node, must reduce it in the same extend
+ if (soft->m_nodes.size() > 0)
+ force /= soft->m_nodes.size();
soft->addForce(force);
-
+ }
}
}
}
@@ -970,7 +980,7 @@ void CcdPhysicsController::SetAngularVelocity(float ang_velX,float ang_velY,flo
if (m_object->isStaticObject())
{
m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
- }
+ } else
{
btTransform xform = m_object->getWorldTransform();
if (local)
@@ -995,6 +1005,7 @@ void CcdPhysicsController::SetLinearVelocity(float lin_velX,float lin_velY,floa
if (m_object->isStaticObject())
{
m_object->setCollisionFlags(m_object->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
+ return;
}
btSoftBody* soft = GetSoftBody();
@@ -1083,8 +1094,7 @@ void CcdPhysicsController::GetVelocity(const float posX,const float posY,const
btRigidBody* body = GetRigidBody();
if (body)
{
- btVector3 rel_pos = pos-body->getCenterOfMassPosition();
- btVector3 linvel = body->getVelocityInLocalPoint(rel_pos);
+ btVector3 linvel = body->getVelocityInLocalPoint(pos);
linvX = linvel.x();
linvY = linvel.y();
linvZ = linvel.z();
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
index 1366764eb63..054ec91122a 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
@@ -186,7 +186,9 @@ struct CcdConstructionInfo
m_MotionState(0),
m_shapeInfo(0),
m_physicsEnv(0),
- m_inertiaFactor(1.f)
+ m_inertiaFactor(1.f),
+ m_do_anisotropic(false),
+ m_anisotropicFriction(1.f,1.f,1.f)
{
}
@@ -259,6 +261,17 @@ struct CcdConstructionInfo
CcdPhysicsEnvironment* m_physicsEnv; //needed for self-replication
float m_inertiaFactor;//tweak the inertia (hooked up to Blender 'formfactor'
+ bool m_do_anisotropic;
+ btVector3 m_anisotropicFriction;
+
+ bool m_do_fh; ///< Should the object have a linear Fh spring?
+ bool m_do_rot_fh; ///< Should the object have an angular Fh spring?
+ btScalar m_fh_spring; ///< Spring constant (both linear and angular)
+ btScalar m_fh_damping; ///< Damping factor (linear and angular) in range [0, 1]
+ btScalar m_fh_distance; ///< The range above the surface where Fh is active.
+ bool m_fh_normal; ///< Should the object slide off slopes?
+ float m_radius;//for fh backwards compatibility
+
};
@@ -290,6 +303,9 @@ class CcdPhysicsController : public PHY_IPhysicsController
void* m_newClientInfo;
int m_registerCount; // needed when multiple sensors use the same controller
CcdConstructionInfo m_cci;//needed for replication
+
+ CcdPhysicsController* m_parentCtrl;
+
void GetWorldOrientation(btMatrix3x3& mat);
void CreateRigidbody();
@@ -313,6 +329,15 @@ class CcdPhysicsController : public PHY_IPhysicsController
virtual ~CcdPhysicsController();
+ CcdConstructionInfo& getConstructionInfo()
+ {
+ return m_cci;
+ }
+ const CcdConstructionInfo& getConstructionInfo() const
+ {
+ return m_cci;
+ }
+
btRigidBody* GetRigidBody();
btCollisionObject* GetCollisionObject();
@@ -388,8 +413,29 @@ class CcdPhysicsController : public PHY_IPhysicsController
}
virtual void calcXform() {} ;
- virtual void SetMargin(float margin) {};
- virtual float GetMargin() const {return 0.f;};
+ virtual void SetMargin(float margin)
+ {
+ if (m_collisionShape)
+ m_collisionShape->setMargin(btScalar(margin));
+ }
+ virtual float GetMargin() const
+ {
+ return (m_collisionShape) ? m_collisionShape->getMargin() : 0.f;
+ }
+ virtual float GetRadius() const
+ {
+ // this is not the actual shape radius, it's only used for Fh support
+ return m_cci.m_radius;
+ }
+ virtual void SetRadius(float margin)
+ {
+ if (m_collisionShape && m_collisionShape->getShapeType() == SPHERE_SHAPE_PROXYTYPE)
+ {
+ btSphereShape* sphereShape = static_cast<btSphereShape*>(m_collisionShape);
+ sphereShape->setUnscaledRadius(margin);
+ }
+ m_cci.m_radius = margin;
+ }
bool wantsSleeping();
@@ -417,6 +463,23 @@ class CcdPhysicsController : public PHY_IPhysicsController
{
return m_cci.m_physicsEnv;
}
+
+ void setParentCtrl(CcdPhysicsController* parentCtrl)
+ {
+ m_parentCtrl = parentCtrl;
+ }
+
+ CcdPhysicsController* getParentCtrl()
+ {
+ return m_parentCtrl;
+ }
+
+ const CcdPhysicsController* getParentCtrl() const
+ {
+ return m_parentCtrl;
+ }
+
+
};
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index 763fc148a04..4fe35630784 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -33,6 +33,7 @@ subject to the following restrictions:
#include "PHY_IMotionState.h"
+#define CCD_CONSTRAINT_DISABLE_LINKED_COLLISION 0x80
bool useIslands = true;
@@ -558,6 +559,8 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
(*it)->SynchronizeMotionStates(timeStep);
}
+ processFhSprings(curTime,timeStep);
+
float subStep = timeStep / float(m_numTimeSubSteps);
for (i=0;i<m_numTimeSubSteps;i++)
{
@@ -570,6 +573,11 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
(*it)->SynchronizeMotionStates(timeStep);
}
+ for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
+ {
+ (*it)->SynchronizeMotionStates(timeStep);
+ }
+
for (i=0;i<m_wrapperVehicles.size();i++)
{
WrapperVehicle* veh = m_wrapperVehicles[i];
@@ -585,6 +593,172 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
return true;
}
+class ClosestRayResultCallbackNotMe : public btCollisionWorld::ClosestRayResultCallback
+{
+ btCollisionObject* m_owner;
+ btCollisionObject* m_parent;
+
+public:
+ ClosestRayResultCallbackNotMe(const btVector3& rayFromWorld,const btVector3& rayToWorld,btCollisionObject* owner,btCollisionObject* parent)
+ :btCollisionWorld::ClosestRayResultCallback(rayFromWorld,rayToWorld),
+ m_owner(owner)
+ {
+
+ }
+
+ virtual bool needsCollision(btBroadphaseProxy* proxy0) const
+ {
+ //don't collide with self
+ if (proxy0->m_clientObject == m_owner)
+ return false;
+
+ if (proxy0->m_clientObject == m_parent)
+ return false;
+
+ return btCollisionWorld::ClosestRayResultCallback::needsCollision(proxy0);
+ }
+
+};
+
+void CcdPhysicsEnvironment::processFhSprings(double curTime,float timeStep)
+{
+ std::set<CcdPhysicsController*>::iterator it;
+
+ for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
+ {
+ CcdPhysicsController* ctrl = (*it);
+ btRigidBody* body = ctrl->GetRigidBody();
+
+ if (body && (ctrl->getConstructionInfo().m_do_fh || ctrl->getConstructionInfo().m_do_rot_fh))
+ {
+ //printf("has Fh or RotFh\n");
+ //re-implement SM_FhObject.cpp using btCollisionWorld::rayTest and info from ctrl->getConstructionInfo()
+ //send a ray from {0.0, 0.0, 0.0} towards {0.0, 0.0, -10.0}, in local coordinates
+
+
+ CcdPhysicsController* parentCtrl = ctrl->getParentCtrl();
+ btRigidBody* parentBody = parentCtrl?parentCtrl->GetRigidBody() : 0;
+ btRigidBody* cl_object = parentBody ? parentBody : body;
+
+ if (body->isStaticOrKinematicObject())
+ continue;
+
+ btVector3 rayDirLocal(0,0,-10);
+
+ //m_dynamicsWorld
+ //ctrl->GetRigidBody();
+ btVector3 rayFromWorld = body->getCenterOfMassPosition();
+ //btVector3 rayToWorld = rayFromWorld + body->getCenterOfMassTransform().getBasis() * rayDirLocal;
+ //ray always points down the z axis in world space...
+ btVector3 rayToWorld = rayFromWorld + rayDirLocal;
+
+ ClosestRayResultCallbackNotMe resultCallback(rayFromWorld,rayToWorld,body,parentBody);
+
+ m_dynamicsWorld->rayTest(rayFromWorld,rayToWorld,resultCallback);
+ if (resultCallback.hasHit())
+ {
+ //we hit this one: resultCallback.m_collisionObject;
+ CcdPhysicsController* controller = static_cast<CcdPhysicsController*>(resultCallback.m_collisionObject->getUserPointer());
+
+ if (controller)
+ {
+ if (controller->getConstructionInfo().m_fh_distance < SIMD_EPSILON)
+ continue;
+
+ btRigidBody* hit_object = controller->GetRigidBody();
+ if (!hit_object)
+ continue;
+
+ CcdConstructionInfo& hitObjShapeProps = controller->getConstructionInfo();
+
+ float distance = resultCallback.m_closestHitFraction*rayDirLocal.length()-ctrl->getConstructionInfo().m_radius;
+ if (distance >= hitObjShapeProps.m_fh_distance)
+ continue;
+
+
+
+ //btVector3 ray_dir = cl_object->getCenterOfMassTransform().getBasis()* rayDirLocal.normalized();
+ btVector3 ray_dir = rayDirLocal.normalized();
+ btVector3 normal = resultCallback.m_hitNormalWorld;
+ normal.normalize();
+
+
+ if (ctrl->getConstructionInfo().m_do_fh)
+ {
+ btVector3 lspot = cl_object->getCenterOfMassPosition()
+ + rayDirLocal * resultCallback.m_closestHitFraction;
+
+
+
+
+ lspot -= hit_object->getCenterOfMassPosition();
+ btVector3 rel_vel = cl_object->getLinearVelocity() - hit_object->getVelocityInLocalPoint(lspot);
+ btScalar rel_vel_ray = ray_dir.dot(rel_vel);
+ btScalar spring_extent = 1.0 - distance / hitObjShapeProps.m_fh_distance;
+
+ btScalar i_spring = spring_extent * hitObjShapeProps.m_fh_spring;
+ btScalar i_damp = rel_vel_ray * hitObjShapeProps.m_fh_damping;
+
+ cl_object->setLinearVelocity(cl_object->getLinearVelocity() + (-(i_spring + i_damp) * ray_dir));
+ if (hitObjShapeProps.m_fh_normal)
+ {
+ cl_object->setLinearVelocity(cl_object->getLinearVelocity()+(i_spring + i_damp) *(normal - normal.dot(ray_dir) * ray_dir));
+ }
+
+ btVector3 lateral = rel_vel - rel_vel_ray * ray_dir;
+
+
+ if (ctrl->getConstructionInfo().m_do_anisotropic) {
+ //Bullet basis contains no scaling/shear etc.
+ const btMatrix3x3& lcs = cl_object->getCenterOfMassTransform().getBasis();
+ btVector3 loc_lateral = lateral * lcs;
+ const btVector3& friction_scaling = cl_object->getAnisotropicFriction();
+ loc_lateral *= friction_scaling;
+ lateral = lcs * loc_lateral;
+ }
+
+ btScalar rel_vel_lateral = lateral.length();
+
+ if (rel_vel_lateral > SIMD_EPSILON) {
+ btScalar friction_factor = hit_object->getFriction();//cl_object->getFriction();
+
+ btScalar max_friction = friction_factor * btMax(btScalar(0.0), i_spring);
+
+ btScalar rel_mom_lateral = rel_vel_lateral / cl_object->getInvMass();
+
+ btVector3 friction = (rel_mom_lateral > max_friction) ?
+ -lateral * (max_friction / rel_vel_lateral) :
+ -lateral;
+
+ cl_object->applyCentralImpulse(friction);
+ }
+ }
+
+
+ if (ctrl->getConstructionInfo().m_do_rot_fh) {
+ btVector3 up2 = cl_object->getWorldTransform().getBasis().getColumn(2);
+
+ btVector3 t_spring = up2.cross(normal) * hitObjShapeProps.m_fh_spring;
+ btVector3 ang_vel = cl_object->getAngularVelocity();
+
+ // only rotations that tilt relative to the normal are damped
+ ang_vel -= ang_vel.dot(normal) * normal;
+
+ btVector3 t_damp = ang_vel * hitObjShapeProps.m_fh_damping;
+
+ cl_object->setAngularVelocity(cl_object->getAngularVelocity() + (t_spring - t_damp));
+ }
+
+ }
+
+
+ }
+
+
+ }
+ }
+
+}
void CcdPhysicsEnvironment::setDebugMode(int debugMode)
{
@@ -709,13 +883,16 @@ int CcdPhysicsEnvironment::createUniversalD6Constraint(
const btVector3& linearMinLimits,
const btVector3& linearMaxLimits,
const btVector3& angularMinLimits,
- const btVector3& angularMaxLimits
+ const btVector3& angularMaxLimits,int flags
)
{
+ bool disableCollisionBetweenLinkedBodies = (0!=(flags & CCD_CONSTRAINT_DISABLE_LINKED_COLLISION));
+
//we could either add some logic to recognize ball-socket and hinge, or let that up to the user
//perhaps some warning or hint that hinge/ball-socket is more efficient?
+
btGeneric6DofConstraint* genericConstraint = 0;
CcdPhysicsController* ctrl0 = (CcdPhysicsController*) ctrlRef;
CcdPhysicsController* ctrl1 = (CcdPhysicsController*) ctrlOther;
@@ -745,7 +922,7 @@ int CcdPhysicsEnvironment::createUniversalD6Constraint(
if (genericConstraint)
{
// m_constraints.push_back(genericConstraint);
- m_dynamicsWorld->addConstraint(genericConstraint);
+ m_dynamicsWorld->addConstraint(genericConstraint,disableCollisionBetweenLinkedBodies);
genericConstraint->setUserConstraintId(gConstraintUid++);
genericConstraint->setUserConstraintType(PHY_GENERIC_6DOF_CONSTRAINT);
@@ -1291,14 +1468,37 @@ PHY_IPhysicsController* CcdPhysicsEnvironment::CreateSphereController(float radi
return sphereController;
}
+int findClosestNode(btSoftBody* sb,const btVector3& worldPoint);
+int findClosestNode(btSoftBody* sb,const btVector3& worldPoint)
+{
+ int node = -1;
+
+ btSoftBody::tNodeArray& nodes(sb->m_nodes);
+ float maxDistSqr = 1e30f;
+
+ for (int n=0;n<nodes.size();n++)
+ {
+ btScalar distSqr = (nodes[n].m_x - worldPoint).length2();
+ if (distSqr<maxDistSqr)
+ {
+ maxDistSqr = distSqr;
+ node = n;
+ }
+ }
+ return node;
+}
+
int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl0,class PHY_IPhysicsController* ctrl1,PHY_ConstraintType type,
float pivotX,float pivotY,float pivotZ,
float axisX,float axisY,float axisZ,
float axis1X,float axis1Y,float axis1Z,
- float axis2X,float axis2Y,float axis2Z
+ float axis2X,float axis2Y,float axis2Z,int flags
)
{
+ bool disableCollisionBetweenLinkedBodies = (0!=(flags & CCD_CONSTRAINT_DISABLE_LINKED_COLLISION));
+
+
CcdPhysicsController* c0 = (CcdPhysicsController*)ctrl0;
CcdPhysicsController* c1 = (CcdPhysicsController*)ctrl1;
@@ -1306,14 +1506,166 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
btRigidBody* rb0 = c0 ? c0->GetRigidBody() : 0;
btRigidBody* rb1 = c1 ? c1->GetRigidBody() : 0;
+
+
+
bool rb0static = rb0 ? rb0->isStaticOrKinematicObject() : true;
bool rb1static = rb1 ? rb1->isStaticOrKinematicObject() : true;
+
+ btCollisionObject* colObj0 = c0->GetCollisionObject();
+ if (!colObj0)
+ {
+ return 0;
+ }
+
+ btVector3 pivotInA(pivotX,pivotY,pivotZ);
+
+ //it might be a soft body, let's try
+ btSoftBody* sb0 = c0 ? c0->GetSoftBody() : 0;
+ btSoftBody* sb1 = c1 ? c1->GetSoftBody() : 0;
+ if (sb0 && sb1)
+ {
+ //not between two soft bodies?
+ return 0;
+ }
+
+ if (sb0)
+ {
+ //either cluster or node attach, let's find closest node first
+ //the soft body doesn't have a 'real' world transform, so get its initial world transform for now
+ btVector3 pivotPointSoftWorld = sb0->m_initialWorldTransform(pivotInA);
+ int node=findClosestNode(sb0,pivotPointSoftWorld);
+ if (node >=0)
+ {
+ bool clusterconstaint = false;
+/*
+ switch (type)
+ {
+ case PHY_LINEHINGE_CONSTRAINT:
+ {
+ if (sb0->clusterCount() && rb1)
+ {
+ btSoftBody::LJoint::Specs ls;
+ ls.erp=0.5f;
+ ls.position=sb0->clusterCom(0);
+ sb0->appendLinearJoint(ls,rb1);
+ clusterconstaint = true;
+ break;
+ }
+ }
+ case PHY_GENERIC_6DOF_CONSTRAINT:
+ {
+ if (sb0->clusterCount() && rb1)
+ {
+ btSoftBody::AJoint::Specs as;
+ as.erp = 1;
+ as.cfm = 1;
+ as.axis.setValue(axisX,axisY,axisZ);
+ sb0->appendAngularJoint(as,rb1);
+ clusterconstaint = true;
+ break;
+ }
+
+ break;
+ }
+ default:
+ {
+
+ }
+ };
+ */
+
+ if (!clusterconstaint)
+ {
+ if (rb1)
+ {
+ sb0->appendAnchor(node,rb1,disableCollisionBetweenLinkedBodies);
+ } else
+ {
+ sb0->setMass(node,0.f);
+ }
+ }
+
+
+ }
+ return 0;//can't remove soft body anchors yet
+ }
+
+ if (sb1)
+ {
+ btVector3 pivotPointAWorld = colObj0->getWorldTransform()(pivotInA);
+ int node=findClosestNode(sb1,pivotPointAWorld);
+ if (node >=0)
+ {
+ bool clusterconstaint = false;
+
+ /*
+ switch (type)
+ {
+ case PHY_LINEHINGE_CONSTRAINT:
+ {
+ if (sb1->clusterCount() && rb0)
+ {
+ btSoftBody::LJoint::Specs ls;
+ ls.erp=0.5f;
+ ls.position=sb1->clusterCom(0);
+ sb1->appendLinearJoint(ls,rb0);
+ clusterconstaint = true;
+ break;
+ }
+ }
+ case PHY_GENERIC_6DOF_CONSTRAINT:
+ {
+ if (sb1->clusterCount() && rb0)
+ {
+ btSoftBody::AJoint::Specs as;
+ as.erp = 1;
+ as.cfm = 1;
+ as.axis.setValue(axisX,axisY,axisZ);
+ sb1->appendAngularJoint(as,rb0);
+ clusterconstaint = true;
+ break;
+ }
+
+ break;
+ }
+ default:
+ {
+
+
+ }
+ };*/
+
+
+ if (!clusterconstaint)
+ {
+ if (rb0)
+ {
+ sb1->appendAnchor(node,rb0,disableCollisionBetweenLinkedBodies);
+ } else
+ {
+ sb1->setMass(node,0.f);
+ }
+ }
+
+
+ }
+ return 0;//can't remove soft body anchors yet
+ }
+
if (rb0static && rb1static)
+ {
+
return 0;
+ }
+
- btVector3 pivotInA(pivotX,pivotY,pivotZ);
+ if (!rb0)
+ return 0;
+
+
btVector3 pivotInB = rb1 ? rb1->getCenterOfMassTransform().inverse()(rb0->getCenterOfMassTransform()(pivotInA)) :
rb0->getCenterOfMassTransform() * pivotInA;
btVector3 axisInA(axisX,axisY,axisZ);
@@ -1338,7 +1690,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
pivotInA);
}
- m_dynamicsWorld->addConstraint(p2p);
+ m_dynamicsWorld->addConstraint(p2p,disableCollisionBetweenLinkedBodies);
// m_constraints.push_back(p2p);
p2p->setUserConstraintId(gConstraintUid++);
@@ -1408,7 +1760,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
if (genericConstraint)
{
//m_constraints.push_back(genericConstraint);
- m_dynamicsWorld->addConstraint(genericConstraint);
+ m_dynamicsWorld->addConstraint(genericConstraint,disableCollisionBetweenLinkedBodies);
genericConstraint->setUserConstraintId(gConstraintUid++);
genericConstraint->setUserConstraintType(type);
//64 bit systems can't cast pointer to int. could use size_t instead.
@@ -1474,7 +1826,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
if (coneTwistContraint)
{
//m_constraints.push_back(genericConstraint);
- m_dynamicsWorld->addConstraint(coneTwistContraint);
+ m_dynamicsWorld->addConstraint(coneTwistContraint,disableCollisionBetweenLinkedBodies);
coneTwistContraint->setUserConstraintId(gConstraintUid++);
coneTwistContraint->setUserConstraintType(type);
//64 bit systems can't cast pointer to int. could use size_t instead.
@@ -1513,7 +1865,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
hinge->setAngularOnly(angularOnly);
//m_constraints.push_back(hinge);
- m_dynamicsWorld->addConstraint(hinge);
+ m_dynamicsWorld->addConstraint(hinge,disableCollisionBetweenLinkedBodies);
hinge->setUserConstraintId(gConstraintUid++);
hinge->setUserConstraintType(type);
//64 bit systems can't cast pointer to int. could use size_t instead.
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
index 56a639509c5..74384dd8cf2 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
@@ -74,6 +74,7 @@ protected:
btContactSolverInfo m_solverInfo;
+ void processFhSprings(double curTime,float timeStep);
public:
CcdPhysicsEnvironment(btDispatcher* dispatcher=0, btOverlappingPairCache* pairCache=0);
@@ -126,7 +127,7 @@ protected:
float pivotX,float pivotY,float pivotZ,
float axisX,float axisY,float axisZ,
float axis1X=0,float axis1Y=0,float axis1Z=0,
- float axis2X=0,float axis2Y=0,float axis2Z=0
+ float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0
);
@@ -138,7 +139,7 @@ protected:
const btVector3& linearMinLimits,
const btVector3& linearMaxLimits,
const btVector3& angularMinLimits,
- const btVector3& angularMaxLimits
+ const btVector3& angularMaxLimits,int flags
);
virtual void setConstraintParam(int constraintId,int param,float value,float value1);
diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
index d78958b746c..ba196b5cf55 100644
--- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
@@ -92,8 +92,7 @@ void DummyPhysicsEnvironment::setGravity(float x,float y,float z)
int DummyPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsController* ctrl2,PHY_ConstraintType type,
float pivotX,float pivotY,float pivotZ,float axisX,float axisY,float axisZ,
float axis1X,float axis1Y,float axis1Z,
- float axis2X,float axis2Y,float axis2Z
-
+ float axis2X,float axis2Y,float axis2Z,int flag
)
{
diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
index 975be84f2a7..a92b1e7f4a6 100644
--- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
@@ -58,7 +58,7 @@ public:
float pivotX,float pivotY,float pivotZ,
float axisX,float axisY,float axisZ,
float axis1X=0,float axis1Y=0,float axis1Z=0,
- float axis2X=0,float axis2Y=0,float axis2Z=0
+ float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0
);
virtual void removeConstraint(int constraintid);
diff --git a/source/gameengine/Physics/Sumo/SConscript b/source/gameengine/Physics/Sumo/SConscript
index be7922efd44..86e8db5919f 100644
--- a/source/gameengine/Physics/Sumo/SConscript
+++ b/source/gameengine/Physics/Sumo/SConscript
@@ -1,7 +1,6 @@
#!/usr/bin/python
Import ('env')
-sumoenv = env.Copy()
sources = ['SumoPHYCallbackBridge.cpp',
'SumoPhysicsController.cpp',
'SumoPhysicsEnvironment.cpp',
@@ -16,7 +15,7 @@ incs =['.',
'Fuzzics/include',
'#/intern/moto/include'
]
-incs += [sumoenv['BF_SOLID_INC']]
+incs += [env['BF_SOLID_INC']]
cflags = []
if env['OURPLATFORM']=='win32-vc':
diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsController.h b/source/gameengine/Physics/Sumo/SumoPhysicsController.h
index 95f01b45f2b..d8ee54935d7 100644
--- a/source/gameengine/Physics/Sumo/SumoPhysicsController.h
+++ b/source/gameengine/Physics/Sumo/SumoPhysicsController.h
@@ -120,6 +120,7 @@ public:
virtual void SetMargin(float margin) ;
virtual float GetMargin() const;
virtual float GetRadius() const ;
+ virtual void SetRadius(float margin) { SetMargin(margin); }
// clientinfo for raycasts for example
diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp
index 80e4dc4044e..3be5e027345 100644
--- a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp
@@ -111,8 +111,8 @@ int SumoPhysicsEnvironment::createConstraint(
float pivotX,float pivotY,float pivotZ,
float axisX,float axisY,float axisZ,
float axis1X,float axis1Y,float axis1Z,
- float axis2X,float axis2Y,float axis2Z
-
+ float axis2X,float axis2Y,float axis2Z,
+ int flag
)
{
int constraintid = 0;
diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h
index 100adf969d5..65b07a7a0be 100644
--- a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h
@@ -63,7 +63,7 @@ public:
float pivotX,float pivotY,float pivotZ,
float axisX,float axisY,float axisZ,
float axis1X=0,float axis1Y=0,float axis1Z=0,
- float axis2X=0,float axis2Y=0,float axis2Z=0
+ float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0
);
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h
index ca8edea114a..884e14cfb5a 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsController.h
+++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h
@@ -90,7 +90,8 @@ class PHY_IPhysicsController
virtual void calcXform() =0;
virtual void SetMargin(float margin) =0;
virtual float GetMargin() const=0;
- virtual float GetRadius() const { return 0.f;}
+ virtual float GetRadius() const=0;
+ virtual void SetRadius(float margin) = 0;
PHY__Vector3 GetWorldPosition(PHY__Vector3& localpos);
};
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
index 98496fb7f9e..0e9c571924c 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
+++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
@@ -129,7 +129,7 @@ class PHY_IPhysicsEnvironment
float pivotX,float pivotY,float pivotZ,
float axis0X,float axis0Y,float axis0Z,
float axis1X=0,float axis1Y=0,float axis1Z=0,
- float axis2X=0,float axis2Y=0,float axis2Z=0
+ float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0
)=0;
virtual void removeConstraint(int constraintid)=0;
virtual float getAppliedImpulse(int constraintid){ return 0.f;}
diff --git a/source/gameengine/PyDoc/GameLogic.py b/source/gameengine/PyDoc/GameLogic.py
index af3d2810553..9dab7db6081 100644
--- a/source/gameengine/PyDoc/GameLogic.py
+++ b/source/gameengine/PyDoc/GameLogic.py
@@ -13,10 +13,10 @@ Documentation for the GameLogic Module.
See L{WhatsNew} for updates, changes and new functionality in the Game Engine Python API.
Examples::
- # To get a controller:
+ # To get the controller thats running this python script:
co = GameLogic.getCurrentController() # GameLogic is automatically imported
- # To get the game object associated with this controller:
+ # To get the game object this controller is on:
obj = co.getOwner()
L{KX_GameObject} and L{KX_Camera} or L{KX_Light} methods are
available depending on the type of object::
@@ -31,17 +31,18 @@ Documentation for the GameLogic Module.
sensors = co.getSensors()
See the sensor's reference for available methods:
- - L{KX_NetworkMessageSensor}
- - L{KX_RaySensor}
- - L{KX_MouseFocusSensor}
- - L{KX_NearSensor}
- - L{KX_RadarSensor}
- - L{KX_TouchSensor}
- - L{SCA_KeyboardSensor}
- - L{SCA_MouseSensor}
- - L{SCA_PropertySensor}
- - L{SCA_RandomSensor}
- - L{SCA_DelaySensor}
+ - L{DelaySensor<SCA_DelaySensor.SCA_DelaySensor>}
+ - L{JoystickSensor<SCA_JoystickSensor.SCA_JoystickSensor>}
+ - L{KeyboardSensor<SCA_KeyboardSensor.SCA_KeyboardSensor>}
+ - L{MouseFocusSensor<KX_MouseFocusSensor.KX_MouseFocusSensor>}
+ - L{MouseSensor<SCA_MouseSensor.SCA_MouseSensor>}
+ - L{NearSensor<KX_NearSensor.KX_NearSensor>}
+ - L{NetworkMessageSensor<KX_NetworkMessageSensor.KX_NetworkMessageSensor>}
+ - L{PropertySensor<SCA_PropertySensor.SCA_PropertySensor>}
+ - L{RadarSensor<KX_RadarSensor.KX_RadarSensor>}
+ - L{RandomSensor<SCA_RandomSensor.SCA_RandomSensor>}
+ - L{RaySensor<KX_RaySensor.KX_RaySensor>}
+ - L{TouchSensor<KX_TouchSensor.KX_TouchSensor>}
You can also access actuators linked to the controller::
# To get an actuator attached to the controller:
@@ -54,23 +55,23 @@ Documentation for the GameLogic Module.
GameLogic.addActiveActuator(actuator, True)
See the actuator's reference for available methods:
- - L{BL_ActionActuator}
- - L{KX_CameraActuator}
- - L{KX_CDActuator}
- - L{KX_ConstraintActuator}
- - L{KX_GameActuator}
- - L{KX_IpoActuator}
- - L{KX_NetworkMessageActuator}
- - L{KX_ObjectActuator}
- - L{KX_SCA_AddObjectActuator}
- - L{KX_SCA_EndObjectActuator}
- - L{KX_SCA_ReplaceMeshActuator}
- - L{KX_SceneActuator}
- - L{KX_SoundActuator}
- - L{KX_TrackToActuator}
- - L{KX_VisibilityActuator}
- - L{SCA_PropertyActuator}
- - L{SCA_RandomActuator}
+ - L{ActionActuator<BL_ActionActuator.BL_ActionActuator>}
+ - L{AddObjectActuator<KX_SCA_AddObjectActuator.KX_SCA_AddObjectActuator>}
+ - L{CameraActuator<KX_CameraActuator.KX_CameraActuator>}
+ - L{CDActuator<KX_CDActuator.KX_CDActuator>}
+ - L{ConstraintActuator<KX_ConstraintActuator.KX_ConstraintActuator>}
+ - L{EndObjectActuator<KX_SCA_EndObjectActuator.KX_SCA_EndObjectActuator>}
+ - L{GameActuator<KX_GameActuator.KX_GameActuator>}
+ - L{IpoActuator<KX_IpoActuator.KX_IpoActuator>}
+ - L{NetworkMessageActuator<KX_NetworkMessageActuator.KX_NetworkMessageActuator>}
+ - L{ObjectActuator<KX_ObjectActuator.KX_ObjectActuator>}
+ - L{PropertyActuator<SCA_PropertyActuator.SCA_PropertyActuator>}
+ - L{RandomActuator<SCA_RandomActuator.SCA_RandomActuator>}
+ - L{ReplaceMeshActuator<KX_SCA_ReplaceMeshActuator.KX_SCA_ReplaceMeshActuator>}
+ - L{SceneActuator<KX_SceneActuator.KX_SceneActuator>}
+ - L{SoundActuator<KX_SoundActuator.KX_SoundActuator>}
+ - L{TrackToActuator<KX_TrackToActuator.KX_TrackToActuator>}
+ - L{VisibilityActuator<KX_VisibilityActuator.KX_VisibilityActuator>}
Most logic brick's methods are accessors for the properties available in the logic buttons.
Consult the logic bricks documentation for more information on how each logic brick works.
diff --git a/source/gameengine/PyDoc/KX_ActuatorSensor.py b/source/gameengine/PyDoc/KX_ActuatorSensor.py
index f9aef86f7f0..cdfbf27576e 100644
--- a/source/gameengine/PyDoc/KX_ActuatorSensor.py
+++ b/source/gameengine/PyDoc/KX_ActuatorSensor.py
@@ -1,6 +1,7 @@
# $Id$
# Documentation for KX_ActuatorSensor
from SCA_IActuator import *
+from SCA_ISensor import *
class KX_ActuatorSensor(SCA_ISensor):
"""
diff --git a/source/gameengine/PyDoc/KX_ConstraintActuator.py b/source/gameengine/PyDoc/KX_ConstraintActuator.py
index b1c6f3c0f4e..7c7ad5aa0fa 100644
--- a/source/gameengine/PyDoc/KX_ConstraintActuator.py
+++ b/source/gameengine/PyDoc/KX_ConstraintActuator.py
@@ -58,11 +58,11 @@ class KX_ConstraintActuator(SCA_IActuator):
See module L{GameLogic} for valid constraint types.
- @param limit: Position constraints: KX_CONSTRAINTACT_LOCX, KX_CONSTRAINTACT_LOCY, KX_CONSTRAINTACT_LOCZ,
- Rotation constraints: KX_CONSTRAINTACT_ROTX, KX_CONSTRAINTACT_ROTY or KX_CONSTRAINTACT_ROTZ
- Distance contraints: KX_ACT_CONSTRAINT_DIRPX, KX_ACT_CONSTRAINT_DIRPY, KX_ACT_CONSTRAINT_DIRPZ,
- KX_ACT_CONSTRAINT_DIRNX, KX_ACT_CONSTRAINT_DIRNY, KX_ACT_CONSTRAINT_DIRNZ,
- Orientation constraints: KX_ACT_CONSTRAINT_ORIX, KX_ACT_CONSTRAINT_ORIY, KX_ACT_CONSTRAINT_ORIZ
+ @param limit:
+ Position constraints: KX_CONSTRAINTACT_LOCX, KX_CONSTRAINTACT_LOCY, KX_CONSTRAINTACT_LOCZ
+ Rotation constraints: KX_CONSTRAINTACT_ROTX, KX_CONSTRAINTACT_ROTY or KX_CONSTRAINTACT_ROTZ
+ Distance contraints: KX_ACT_CONSTRAINT_DIRPX, KX_ACT_CONSTRAINT_DIRPY, KX_ACT_CONSTRAINT_DIRPZ, KX_ACT_CONSTRAINT_DIRNX, KX_ACT_CONSTRAINT_DIRNY, KX_ACT_CONSTRAINT_DIRNZ
+ Orientation constraints: KX_ACT_CONSTRAINT_ORIX, KX_ACT_CONSTRAINT_ORIY, KX_ACT_CONSTRAINT_ORIZ
"""
def getLimit():
"""
@@ -70,11 +70,11 @@ class KX_ConstraintActuator(SCA_IActuator):
See module L{GameLogic} for valid constraints.
- @return: Position constraints: KX_CONSTRAINTACT_LOCX, KX_CONSTRAINTACT_LOCY, KX_CONSTRAINTACT_LOCZ,
- Rotation constraints: KX_CONSTRAINTACT_ROTX, KX_CONSTRAINTACT_ROTY, KX_CONSTRAINTACT_ROTZ,
- Distance contraints: KX_ACT_CONSTRAINT_DIRPX, KX_ACT_CONSTRAINT_DIRPY, KX_ACT_CONSTRAINT_DIRPZ,
- KX_ACT_CONSTRAINT_DIRNX, KX_ACT_CONSTRAINT_DIRNY, KX_ACT_CONSTRAINT_DIRNZ,
- Orientation constraints: KX_ACT_CONSTRAINT_ORIX, KX_ACT_CONSTRAINT_ORIY, KX_ACT_CONSTRAINT_ORIZ
+ @return:
+ Position constraints: KX_CONSTRAINTACT_LOCX, KX_CONSTRAINTACT_LOCY, KX_CONSTRAINTACT_LOCZ,
+ Rotation constraints: KX_CONSTRAINTACT_ROTX, KX_CONSTRAINTACT_ROTY, KX_CONSTRAINTACT_ROTZ,
+ Distance contraints: KX_ACT_CONSTRAINT_DIRPX, KX_ACT_CONSTRAINT_DIRPY, KX_ACT_CONSTRAINT_DIRPZ, KX_ACT_CONSTRAINT_DIRNX, KX_ACT_CONSTRAINT_DIRNY, KX_ACT_CONSTRAINT_DIRNZ,
+ Orientation constraints: KX_ACT_CONSTRAINT_ORIX, KX_ACT_CONSTRAINT_ORIY, KX_ACT_CONSTRAINT_ORIZ
"""
def setRotDamp(duration):
"""
@@ -107,7 +107,7 @@ class KX_ConstraintActuator(SCA_IActuator):
@type option: integer
@param option: Binary combination of the following values:
- 64 : Activate alignment to surface
+ 64 : Activate alignment to surface
128 : Detect material rather than property
256 : No deactivation if ray does not hit target
512 : Activate distance control
diff --git a/source/gameengine/PyDoc/KX_GameObject.py b/source/gameengine/PyDoc/KX_GameObject.py
index ff9b4ffc95b..505ce253dd1 100644
--- a/source/gameengine/PyDoc/KX_GameObject.py
+++ b/source/gameengine/PyDoc/KX_GameObject.py
@@ -30,6 +30,11 @@ class KX_GameObject:
Delete this object, can be used inpace of the EndObject Actuator.
The actual removal of the object from the scene is delayed.
"""
+ def replaceMesh(mesh_name):
+ """
+ Replace the mesh of this object with a new mesh. This works the same was as the actuator.
+ @type mesh_name: string
+ """
def getVisible():
"""
Gets the game object's visible flag.
diff --git a/source/gameengine/PyDoc/KX_IpoActuator.py b/source/gameengine/PyDoc/KX_IpoActuator.py
index 1cdab829385..e2fe3b289e3 100644
--- a/source/gameengine/PyDoc/KX_IpoActuator.py
+++ b/source/gameengine/PyDoc/KX_IpoActuator.py
@@ -6,7 +6,7 @@ class KX_IpoActuator(SCA_IActuator):
"""
IPO actuator activates an animation.
"""
- def set(mode, startframe, endframe, mode):
+ def set(mode, startframe, endframe, force):
"""
Sets the properties of the actuator.
@@ -16,8 +16,8 @@ class KX_IpoActuator(SCA_IActuator):
@type startframe: integer
@param endframe: last frame to use
@type endframe: integer
- @param mode: special mode
- @type mode: integer (0=normal, 1=interpret location as force, 2=additive)
+ @param force: special mode
+ @type force: integer (0=normal, 1=interpret location as force, 2=additive)
"""
def setProperty(property):
"""
diff --git a/source/gameengine/PyDoc/Rasterizer.py b/source/gameengine/PyDoc/Rasterizer.py
index cdda87fcb49..6a67cdcc71b 100644
--- a/source/gameengine/PyDoc/Rasterizer.py
+++ b/source/gameengine/PyDoc/Rasterizer.py
@@ -40,8 +40,8 @@ Example Uses an L{SCA_MouseSensor}, and two L{KX_ObjectActuator}s to implement M
@group Material Types: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
@var KX_TEXFACE_MATERIAL: Materials as defined by the texture face settings.
@var KX_BLENDER_MULTITEX_MATERIAL: Materials approximating blender materials with multitexturing.
-@var KX_BLENDER_BLENDER_MATERIAL: Materials approximating blender materials with GLSL.
-
+@var KX_BLENDER_GLSL_MATERIAL: Materials approximating blender materials with GLSL.
+
"""
def getWindowWidth():
@@ -181,14 +181,15 @@ def getGLSLMaterialSetting(setting, enable):
@type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures)
@rtype: boolean
"""
-def drawLine(from,to,color):
+
+def drawLine(fromVec,toVec,color):
"""
Draw a line in the 3D scene.
- @param from: the origin of the line
- @type from: list [x, y, z]
- @param to: the end of the line
- @type to: list [x, y, z]
+ @param fromVec: the origin of the line
+ @type fromVec: list [x, y, z]
+ @param toVec: the end of the line
+ @type toVec: list [x, y, z]
@param color: the color of the line
@type color: list [r, g, b]
"""
diff --git a/source/gameengine/PyDoc/SCA_JoystickSensor.py b/source/gameengine/PyDoc/SCA_JoystickSensor.py
new file mode 100644
index 00000000000..d1dab9afcaf
--- /dev/null
+++ b/source/gameengine/PyDoc/SCA_JoystickSensor.py
@@ -0,0 +1,106 @@
+# $Id: SCA_RandomSensor.py 15444 2008-07-05 17:05:05Z lukep $
+# Documentation for SCA_RandomSensor
+from SCA_ISensor import *
+
+class SCA_JoystickSensor(SCA_ISensor):
+ """
+ This sensor detects player joystick events.
+ """
+
+ def getIndex():
+ """
+ Returns the joystick index to use (from 1 to 8).
+ @rtype: integer
+ """
+ def setIndex(index):
+ """
+ Sets the joystick index to use.
+ @param index: The index of this joystick sensor, Clamped between 1 and 8.
+ @type index: integer
+ @note: This is only useful when you have more then 1 joystick connected to your computer - multiplayer games.
+ """
+ def getAxis():
+ """
+ Returns the current axis this sensor reacts to. See L{getAxisValue()<SCA_JoystickSensor.getAxisValue>} for the current axis state.
+ @rtype: list
+ @return: 2 values returned are [axisIndex, axisDirection] - see L{setAxis()<SCA_JoystickSensor.setAxis>} for their purpose.
+ @note: When the "All Events" toggle is set, this option has no effect.
+ """
+ def setAxis(axisIndex, axisDirection):
+ """
+ @param axisIndex: Set the axis index to use when detecting axis movement.
+ @type axisIndex: integer from 1 to 2
+ @param axisDirection: Set the axis direction used for detecting motion. 0:right, 1:up, 2:left, 3:down.
+ @type axisDirection: integer from 0 to 3
+ @note: When the "All Events" toggle is set, this option has no effect.
+ """
+ def getAxisValue():
+ """
+ Returns the state of the joysticks axis. See differs to L{getAxis()<SCA_JoystickSensor.getAxis>} returning the current state of the joystick.
+ @rtype: list
+ @return: 4 values, each spesifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing.
+
+ The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls.
+
+ left:[-32767, 0, ...], right:[32767, 0, ...], up:[0, -32767, ...], down:[0, 32767, ...]
+ @note: Some gamepads only set the axis on and off like a button.
+ """
+ def getThreshold():
+ """
+ Get the axis threshold. See L{setThreshold()<SCA_JoystickSensor.setThreshold>} for details.
+ @rtype: integer
+ """
+ def setThreshold(threshold):
+ """
+ Set the axis threshold.
+ @param threshold: Joystick axis motion below this threshold wont trigger an event. Use values between (0 and 32767), lower values are more sensitive.
+ @type threshold: integer
+ """
+ def getButton():
+ """
+ Returns the button index the sensor reacts to. See L{getButtonValue()<SCA_JoystickSensor.getButtonValue>} for a list of pressed buttons.
+ @rtype: integer
+ @note: When the "All Events" toggle is set, this option has no effect.
+ """
+ def setButton(index):
+ """
+ Sets the button index the sensor reacts to when the "All Events" option is not set.
+ @note: When the "All Events" toggle is set, this option has no effect.
+ """
+ def getButtonValue():
+ """
+ Returns a list containing the indicies of the currently pressed buttons.
+ @rtype: list
+ """
+ def getHat():
+ """
+ Returns the current hat direction this sensor is set to.
+ [hatNumber, hatDirection].
+ @rtype: list
+ @note: When the "All Events" toggle is set, this option has no effect.
+ """
+ def setHat(index):
+ """
+ Sets the hat index the sensor reacts to when the "All Events" option is not set.
+ @type index: integer
+ """
+ def getNumAxes():
+ """
+ Returns the number of axes for the joystick at this index.
+ @rtype: integer
+ """
+ def getNumButtons():
+ """
+ Returns the number of buttons for the joystick at this index.
+ @rtype: integer
+ """
+ def getNumHats():
+ """
+ Returns the number of hats for the joystick at this index.
+ @rtype: integer
+ """
+ def isConnected():
+ """
+ Returns True if a joystick is detected at this joysticks index.
+ @rtype: bool
+ """
diff --git a/source/gameengine/PyDoc/SConscript b/source/gameengine/PyDoc/SConscript
new file mode 100644
index 00000000000..ac0b163d7bd
--- /dev/null
+++ b/source/gameengine/PyDoc/SConscript
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+Import ('env')
+
+
+from optparse import OptionParser
+try:
+ import epydoc
+except ImportError:
+ print "No epydoc install detected, Python API Docs will not be generated "
+if epydoc:
+ from epydoc.docbuilder import build_doc_index
+ from epydoc import cli
+ names = env.Glob("source/gameengine/PyDoc/*.py")
+ docindex = build_doc_index(names)
+ optvalues = cli.OPTION_DEFAULTS
+ optvalues["verbose"] = 1
+ optvalues["target"] = env["BF_DOCDIR"]+"/BGE_API/"
+ optvalues["url"] = "http://www.blender.org"
+ optvalues["top"] = "Game Engine API"
+ optvalues["name"] = "Blender"
+ optvalues["noprivate"] = 1
+ optvalues["noframes"] = 1
+ optvalues["names"] = names
+ optparser = OptionParser()
+ optparser.set_defaults(**optvalues)
+ (options, args) = optparser.parse_args([])
+ cli.write_html(docindex, options)
+
diff --git a/source/gameengine/PyDoc/epy_docgen.sh b/source/gameengine/PyDoc/epy_docgen.sh
index 7fb5e49c996..b243101ddcb 100644
--- a/source/gameengine/PyDoc/epy_docgen.sh
+++ b/source/gameengine/PyDoc/epy_docgen.sh
@@ -7,5 +7,5 @@
# set posix locale so regex works properly for [A-Z]*.py
LC_ALL=POSIX
-epydoc -v -o BPY_GE --url "http://www.blender.org" --top GameLogic \
+epydoc --debug -v -o BPY_GE --url "http://www.blender.org" --top GameLogic \
--name "Blender GameEngine" --no-private --no-frames *.py