merge with trunk at r31523
authorJoseph Eagar <joeedh@gmail.com>
Sat, 4 Sep 2010 05:31:25 +0000 (05:31 +0000)
committerJoseph Eagar <joeedh@gmail.com>
Sat, 4 Sep 2010 05:31:25 +0000 (05:31 +0000)
186 files changed:
1  2 
SConstruct
intern/ghost/intern/GHOST_SystemCocoa.mm
intern/guardedalloc/MEM_guardedalloc.h
projectfiles_vc9/blender/BPY_python/BPY_python.vcproj
projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj
projectfiles_vc9/blender/editors/ED_editors.vcproj
projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj
projectfiles_vc9/blender/makesrna/RNA_rna.vcproj
release/scripts/modules/rigify/stretch_twist.py
source/blender/CMakeLists.txt
source/blender/SConscript
source/blender/blenkernel/BKE_blender.h
source/blender/blenkernel/BKE_bmesh.h
source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/BKE_paint.h
source/blender/blenkernel/CMakeLists.txt
source/blender/blenkernel/SConscript
source/blender/blenkernel/intern/BME_Customdata.c
source/blender/blenkernel/intern/BME_conversions.c
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/anim.c
source/blender/blenkernel/intern/armature.c
source/blender/blenkernel/intern/blender.c
source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/blenkernel/intern/cloth.c
source/blender/blenkernel/intern/constraint.c
source/blender/blenkernel/intern/curve.c
source/blender/blenkernel/intern/deform.c
source/blender/blenkernel/intern/displist.c
source/blender/blenkernel/intern/effect.c
source/blender/blenkernel/intern/fluidsim.c
source/blender/blenkernel/intern/fmodifier.c
source/blender/blenkernel/intern/key.c
source/blender/blenkernel/intern/lattice.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/mesh.c
source/blender/blenkernel/intern/node.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/particle.c
source/blender/blenkernel/intern/particle_system.c
source/blender/blenkernel/intern/shrinkwrap.c
source/blender/blenkernel/intern/smoke.c
source/blender/blenkernel/intern/softbody.c
source/blender/blenkernel/intern/sound.c
source/blender/blenkernel/intern/subsurf_ccg.c
source/blender/blenlib/BLI_cellalloc.h
source/blender/blenlib/BLI_ghash.h
source/blender/blenlib/BLI_math_vector.h
source/blender/blenlib/CMakeLists.txt
source/blender/blenlib/intern/BLI_ghash.c
source/blender/blenlib/intern/math_vector_inline.c
source/blender/blenlib/intern/pbvh.c
source/blender/blenlib/intern/scanfill.c
source/blender/blenloader/intern/readfile.c
source/blender/blenloader/intern/writefile.c
source/blender/editors/armature/editarmature.c
source/blender/editors/armature/meshlaplacian.c
source/blender/editors/armature/poseobject.c
source/blender/editors/armature/reeb.c
source/blender/editors/curve/editcurve.c
source/blender/editors/curve/editfont.c
source/blender/editors/datafiles/SConscript
source/blender/editors/include/ED_mesh.h
source/blender/editors/include/ED_view3d.h
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/resources.c
source/blender/editors/mesh/editface.c
source/blender/editors/mesh/loopcut.c
source/blender/editors/mesh/mesh_data.c
source/blender/editors/mesh/mesh_intern.h
source/blender/editors/mesh/mesh_ops.c
source/blender/editors/mesh/meshtools.c
source/blender/editors/metaball/mball_edit.c
source/blender/editors/object/object_constraint.c
source/blender/editors/object/object_edit.c
source/blender/editors/object/object_hook.c
source/blender/editors/object/object_lattice.c
source/blender/editors/object/object_modifier.c
source/blender/editors/object/object_relations.c
source/blender/editors/object/object_transform.c
source/blender/editors/object/object_vgroup.c
source/blender/editors/physics/particle_edit.c
source/blender/editors/physics/particle_object.c
source/blender/editors/render/render_shading.c
source/blender/editors/screen/Makefile
source/blender/editors/screen/screen_edit.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/sculpt_paint/paint_image.c
source/blender/editors/sculpt_paint/paint_utils.c
source/blender/editors/sculpt_paint/paint_vertex.c
source/blender/editors/sculpt_paint/sculpt.c
source/blender/editors/space_api/spacetypes.c
source/blender/editors/space_image/CMakeLists.txt
source/blender/editors/space_image/Makefile
source/blender/editors/space_image/image_buttons.c
source/blender/editors/space_image/image_header.c
source/blender/editors/space_image/image_ops.c
source/blender/editors/space_image/space_image.c
source/blender/editors/space_info/Makefile
source/blender/editors/space_info/info_stats.c
source/blender/editors/space_logic/logic_buttons.c
source/blender/editors/space_view3d/drawarmature.c
source/blender/editors/space_view3d/drawmesh.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/view3d_buttons.c
source/blender/editors/space_view3d/view3d_draw.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_header.c
source/blender/editors/space_view3d/view3d_select.c
source/blender/editors/space_view3d/view3d_snap.c
source/blender/editors/space_view3d/view3d_view.c
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform_constraints.c
source/blender/editors/transform/transform_conversions.c
source/blender/editors/transform/transform_generics.c
source/blender/editors/transform/transform_manipulator.c
source/blender/editors/transform/transform_orientations.c
source/blender/editors/transform/transform_snap.c
source/blender/editors/util/ed_util.c
source/blender/editors/util/editmode_undo.c
source/blender/editors/uvedit/uvedit_draw.c
source/blender/editors/uvedit/uvedit_ops.c
source/blender/editors/uvedit/uvedit_unwrap_ops.c
source/blender/gpu/GPU_material.h
source/blender/gpu/intern/gpu_buffers.c
source/blender/gpu/intern/gpu_draw.c
source/blender/gpu/intern/gpu_material.c
source/blender/gpu/intern/gpu_shader_material.glsl
source/blender/gpu/intern/gpu_shader_material.glsl.c
source/blender/makesdna/DNA_color_types.h
source/blender/makesdna/DNA_mesh_types.h
source/blender/makesdna/DNA_object_types.h
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesdna/intern/SConscript
source/blender/makesrna/SConscript
source/blender/makesrna/intern/CMakeLists.txt
source/blender/makesrna/intern/SConscript
source/blender/makesrna/intern/rna_animviz.c
source/blender/makesrna/intern/rna_image_api.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_mesh_api.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/makesrna/intern/rna_nla.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/makesrna/intern/rna_wm_api.c
source/blender/modifiers/CMakeLists.txt
source/blender/modifiers/intern/MOD_array.c
source/blender/modifiers/intern/MOD_bevel.c
source/blender/modifiers/intern/MOD_boolean_util.c
source/blender/modifiers/intern/MOD_build.c
source/blender/modifiers/intern/MOD_collision.c
source/blender/modifiers/intern/MOD_displace.c
source/blender/modifiers/intern/MOD_mask.c
source/blender/modifiers/intern/MOD_meshdeform.c
source/blender/modifiers/intern/MOD_mirror.c
source/blender/modifiers/intern/MOD_multires.c
source/blender/modifiers/intern/MOD_particleinstance.c
source/blender/modifiers/intern/MOD_screw.c
source/blender/modifiers/intern/MOD_util.c
source/blender/modifiers/intern/MOD_uvproject.c
source/blender/modifiers/intern/MOD_wave.c
source/blender/python/generic/bpy_internal_import.c
source/blender/python/generic/bpy_internal_import.h
source/blender/python/intern/bpy.c
source/blender/python/intern/bpy_operator_wrap.c
source/blender/render/CMakeLists.txt
source/blender/render/SConscript
source/blender/render/intern/raytrace/reorganize.h
source/blender/render/intern/source/convertblender.c
source/blender/render/intern/source/pointdensity.c
source/blender/render/intern/source/shadeoutput.c
source/blender/windowmanager/intern/wm_init_exit.c
source/blender/windowmanager/intern/wm_operators.c
source/creator/CMakeLists.txt
source/creator/creator.c
source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
source/gameengine/Converter/BL_ArmatureChannel.cpp
source/gameengine/Converter/BL_ArmatureConstraint.cpp
source/gameengine/Converter/BL_ArmatureObject.cpp
source/gameengine/Ketsji/KX_KetsjiEngine.cpp
source/gameengine/Ketsji/KX_PythonInit.cpp
source/gameengine/Ketsji/KX_SoundActuator.cpp
source/gameengine/Ketsji/KX_SoundActuator.h
source/gameengine/Physics/Bullet/CcdPhysicsController.cpp

diff --cc SConstruct
Simple merge
                                        >\r
                                </File>\r
                                <File\r
 -                                      RelativePath="..\..\..\source\blender\python\intern\bpy_rna.h"\r
 +                                      RelativePath="..\..\..\source\blender\python\intern\bpy_ui.h"\r
                                        >\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\source\blender\python\intern\bpy_rna_callback.h"\r
+                                       >\r
+                               </File>\r
                                <File\r
                                        RelativePath="..\..\..\source\blender\python\intern\bpy_util.h"\r
                                        >\r
++<<<<<<< .working
 +# ##### 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 +#
 +# ##### END GPL LICENSE BLOCK #####
 +
 +# <pep8 compliant>
 +
 +import bpy
 +from rigify import RigifyError
 +from rigify_utils import copy_bone_simple
 +
 +METARIG_NAMES = tuple()
 +RIG_TYPE = "stretch_twist"
 +
 +# TODO
 +#def metarig_template():
 +#    # generated by rigify.write_meta_rig
 +#    bpy.ops.object.mode_set(mode='EDIT')
 +#    obj = bpy.context.active_object
 +#    arm = obj.data
 +#    bone = arm.edit_bones.new('Bone')
 +#    bone.head[:] = 0.0000, 0.0000, 0.0000
 +#    bone.tail[:] = 0.0000, 0.0000, 1.0000
 +#    bone.roll = 0.0000
 +#    bone.connected = False
 +#
 +#    bpy.ops.object.mode_set(mode='OBJECT')
 +#    pbone = obj.pose.bones['Bone']
 +#    pbone['type'] = 'copy'
 +
 +bool_map = {0:False, 1:True,
 +            0.0:False, 1.0:True,
 +            "false":False, "true":True,
 +            "False":False, "True":True,
 +            "no":False, "yes":True,
 +            "No":False, "Yes":True}
 +
 +def metarig_definition(obj, orig_bone_name):
 +    return (orig_bone_name,)
 +
 +
 +
 +
 +def main(obj, bone_definition, base_names, options):
 +    """ A dual-bone stretchy bone setup.  Each half follows the twist of the
 +        bone on its side.
 +        Deformation only (no controls).
 +    """
 +    # Verify required parameter
 +    if "to" not in options:
 +        raise RigifyError("'%s' rig type requires a 'to' parameter (bone: %s)" % (RIG_TYPE, base_names[0]))
 +    if type(options["to"]) is not str:
 +        raise RigifyError("'%s' rig type 'to' parameter must be a string (bone: %s)" % (RIG_TYPE, base_names[0]))
 +    if ("ORG-" + options["to"]) not in obj.data.bones:
 +        raise RigifyError("'%s' rig type 'to' parameter must name a bone in the metarig (bone: %s)" % (RIG_TYPE, base_names[0]))
 +
 +    preserve_volume = None
 +    # Check optional parameter
 +    if "preserve_volume" in options:
 +        try:
 +            preserve_volume = bool_map[options["preserve_volume"]]
 +        except KeyError:
 +            preserve_volume = False
 +
 +    eb = obj.data.edit_bones
 +    bb = obj.data.bones
 +    pb = obj.pose.bones
 +
 +    bpy.ops.object.mode_set(mode='EDIT')
 +    arm = obj.data
 +
 +    mbone1 = bone_definition[0]
 +    mbone2 = "ORG-" + options["to"]
 +
 +    bone_e = copy_bone_simple(obj.data, mbone1, "MCH-%s" % base_names[bone_definition[0]])
 +    bone_e.connected = False
 +    bone_e.parent = None
 +    bone_e.head = (eb[mbone1].head + eb[mbone2].head) / 2
 +    bone_e.tail = (bone_e.head[0], bone_e.head[1], bone_e.head[2]+0.1)
 +    mid_bone = bone_e.name
 +
 +    bone_e = copy_bone_simple(obj.data, mbone1, "DEF-%s.01" % base_names[bone_definition[0]])
 +    bone_e.connected = False
 +    bone_e.parent = eb[mbone1]
 +    bone_e.tail = eb[mid_bone].head
 +    bone1 = bone_e.name
 +
 +    bone_e = copy_bone_simple(obj.data, mbone2, "DEF-%s.02" % base_names[bone_definition[0]])
 +    bone_e.connected = False
 +    bone_e.parent = eb[mbone2]
 +    bone_e.tail = eb[mid_bone].head
 +    bone2 = bone_e.name
 +
 +
 +
 +    bpy.ops.object.mode_set(mode='OBJECT')
 +
 +    # Constraints
 +
 +    # Mid bone
 +    con = pb[mid_bone].constraints.new('COPY_LOCATION')
 +    con.target = obj
 +    con.subtarget = mbone1
 +
 +    con = pb[mid_bone].constraints.new('COPY_LOCATION')
 +    con.target = obj
 +    con.subtarget = mbone2
 +    con.influence = 0.5
 +
 +    # Bone 1
 +    con = pb[bone1].constraints.new('DAMPED_TRACK')
 +    con.target = obj
 +    con.subtarget = mid_bone
 +
 +    con = pb[bone1].constraints.new('STRETCH_TO')
 +    con.target = obj
 +    con.subtarget = mid_bone
 +    con.original_length = bb[bone1].length
 +    if preserve_volume:
 +        con.volume = 'VOLUME_XZX'
 +    else:
 +        con.volume = 'NO_VOLUME'
 +
 +    # Bone 2
 +    con = pb[bone2].constraints.new('DAMPED_TRACK')
 +    con.target = obj
 +    con.subtarget = mid_bone
 +
 +    con = pb[bone2].constraints.new('STRETCH_TO')
 +    con.target = obj
 +    con.subtarget = mid_bone
 +    con.original_length = bb[bone2].length
 +    if preserve_volume:
 +        con.volume = 'VOLUME_XZX'
 +    else:
 +        con.volume = 'NO_VOLUME'
 +
 +    return tuple()
 +
++=======
+ # ##### 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ #
+ # ##### END GPL LICENSE BLOCK #####
+ # <pep8 compliant>
+ import bpy
+ from rigify import RigifyError
+ from rigify_utils import copy_bone_simple
+ METARIG_NAMES = tuple()
+ RIG_TYPE = "stretch_twist"
+ # TODO
+ #def metarig_template():
+ #    # generated by rigify.write_meta_rig
+ #    bpy.ops.object.mode_set(mode='EDIT')
+ #    obj = bpy.context.active_object
+ #    arm = obj.data
+ #    bone = arm.edit_bones.new('Bone')
+ #    bone.head[:] = 0.0000, 0.0000, 0.0000
+ #    bone.tail[:] = 0.0000, 0.0000, 1.0000
+ #    bone.roll = 0.0000
+ #    bone.use_connect = False
+ #
+ #    bpy.ops.object.mode_set(mode='OBJECT')
+ #    pbone = obj.pose.bones['Bone']
+ #    pbone['type'] = 'copy'
+ bool_map = {0:False, 1:True,
+             0.0:False, 1.0:True,
+             "false":False, "true":True,
+             "False":False, "True":True,
+             "no":False, "yes":True,
+             "No":False, "Yes":True}
+ def metarig_definition(obj, orig_bone_name):
+     return (orig_bone_name,)
+ def main(obj, bone_definition, base_names, options):
+     """ A dual-bone stretchy bone setup.  Each half follows the twist of the
+         bone on its side.
+         Deformation only (no controls).
+     """
+     # Verify required parameter
+     if "to" not in options:
+         raise RigifyError("'%s' rig type requires a 'to' parameter (bone: %s)" % (RIG_TYPE, base_names[0]))
+     if type(options["to"]) is not str:
+         raise RigifyError("'%s' rig type 'to' parameter must be a string (bone: %s)" % (RIG_TYPE, base_names[0]))
+     if ("ORG-" + options["to"]) not in obj.data.bones:
+         raise RigifyError("'%s' rig type 'to' parameter must name a bone in the metarig (bone: %s)" % (RIG_TYPE, base_names[0]))
+     preserve_volume = None
+     # Check optional parameter
+     if "preserve_volume" in options:
+         try:
+             preserve_volume = bool_map[options["preserve_volume"]]
+         except KeyError:
+             preserve_volume = False
+     eb = obj.data.edit_bones
+     bb = obj.data.bones
+     pb = obj.pose.bones
+     bpy.ops.object.mode_set(mode='EDIT')
+     arm = obj.data
+     mbone1 = bone_definition[0]
+     mbone2 = "ORG-" + options["to"]
+     bone_e = copy_bone_simple(obj.data, mbone1, "MCH-%s" % base_names[bone_definition[0]])
+     bone_e.use_connect = False
+     bone_e.parent = None
+     bone_e.head = (eb[mbone1].head + eb[mbone2].head) / 2
+     bone_e.tail = (bone_e.head[0], bone_e.head[1], bone_e.head[2]+0.1)
+     mid_bone = bone_e.name
+     bone_e = copy_bone_simple(obj.data, mbone1, "DEF-%s.01" % base_names[bone_definition[0]])
+     bone_e.use_connect = False
+     bone_e.parent = eb[mbone1]
+     bone_e.tail = eb[mid_bone].head
+     bone1 = bone_e.name
+     bone_e = copy_bone_simple(obj.data, mbone2, "DEF-%s.02" % base_names[bone_definition[0]])
+     bone_e.use_connect = False
+     bone_e.parent = eb[mbone2]
+     bone_e.tail = eb[mid_bone].head
+     bone2 = bone_e.name
+     bpy.ops.object.mode_set(mode='OBJECT')
+     # Constraints
+     # Mid bone
+     con = pb[mid_bone].constraints.new('COPY_LOCATION')
+     con.target = obj
+     con.subtarget = mbone1
+     con = pb[mid_bone].constraints.new('COPY_LOCATION')
+     con.target = obj
+     con.subtarget = mbone2
+     con.influence = 0.5
+     # Bone 1
+     con = pb[bone1].constraints.new('DAMPED_TRACK')
+     con.target = obj
+     con.subtarget = mid_bone
+     con = pb[bone1].constraints.new('STRETCH_TO')
+     con.target = obj
+     con.subtarget = mid_bone
+     con.rest_length = bb[bone1].length
+     if preserve_volume:
+         con.volume = 'VOLUME_XZX'
+     else:
+         con.volume = 'NO_VOLUME'
+     # Bone 2
+     con = pb[bone2].constraints.new('DAMPED_TRACK')
+     con.target = obj
+     con.subtarget = mid_bone
+     con = pb[bone2].constraints.new('STRETCH_TO')
+     con.target = obj
+     con.subtarget = mid_bone
+     con.rest_length = bb[bone2].length
+     if preserve_volume:
+         con.volume = 'VOLUME_XZX'
+     else:
+         con.volume = 'NO_VOLUME'
+     return tuple()
++>>>>>>> .merge-right.r31523
Simple merge
Simple merge
Simple merge
  struct BoundBox;
  struct DispList;
  struct ListBase;
--struct EditMesh;
--struct MDeformVert;
++struct BMEditMesh;
++struct BMesh;
  struct Mesh;
++struct MPoly;
++struct MLoop;
  struct MFace;
  struct MEdge;
  struct MVert;
++struct MDeformVert;
  struct MCol;
- struct BMesh;
  struct Object;
  struct MTFace;
  struct VecNor;
Simple merge
Simple merge
@@@ -607,7 -610,8 +612,8 @@@ DerivedMesh *BME_bmesh_to_derivedmesh(B
                }
        }
        if(totface){
 -              mface = CDDM_get_faces(result);
 +              mface = CDDM_get_tessfaces(result);
+               origindex = result->getFaceDataArray(result, CD_ORIGINDEX);
                /*make faces*/
                for(i=0,f=bm->polys.first;f;f=f->next){
                        mf = &mface[i];
@@@ -652,987 -434,987 +652,6 @@@ static DerivedMesh *getMeshDerivedMesh(
        return dm;
  }
  
--///
--
--typedef struct {
--      DerivedMesh dm;
--
--      EditMesh *em;
--      float (*vertexCos)[3];
--      float (*vertexNos)[3];
--      float (*faceNos)[3];
--} EditMeshDerivedMesh;
--
- static void emDM_foreachMappedVert(void *dm, void (*func)(void *userData, int index, float *co, float *no_f, short *no_s), void *userData)
 -static void emDM_foreachMappedVert(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no_f, short *no_s), void *userData)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditVert *eve;
--      int i;
--
--      for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
--              if (emdm->vertexCos) {
--                      func(userData, i, emdm->vertexCos[i], emdm->vertexNos[i], NULL);
--              } else {
--                      func(userData, i, eve->co, eve->no, NULL);
--              }
--      }
--}
- static void emDM_foreachMappedEdge(void *dm, void (*func)(void *userData, int index, float *v0co, float *v1co), void *userData)
 -static void emDM_foreachMappedEdge(DerivedMesh *dm, void (*func)(void *userData, int index, float *v0co, float *v1co), void *userData)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditEdge *eed;
--      int i;
--
--      if (emdm->vertexCos) {
--              EditVert *eve;
--
--              for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
--                      eve->tmp.l = (intptr_t) i++;
--              for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next)
--                      func(userData, i, emdm->vertexCos[(int) eed->v1->tmp.l], emdm->vertexCos[(int) eed->v2->tmp.l]);
--      } else {
--              for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next)
--                      func(userData, i, eed->v1->co, eed->v2->co);
--      }
--}
- static void emDM_drawMappedEdges(void *dm, int (*setDrawOptions)(void *userData, int index), void *userData) 
 -static void emDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData) 
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditEdge *eed;
--      int i;
--
--      if (emdm->vertexCos) {
--              EditVert *eve;
--
--              for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
--                      eve->tmp.l = (intptr_t) i++;
--
--              glBegin(GL_LINES);
--              for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
--                      if(!setDrawOptions || setDrawOptions(userData, i)) {
--                              glVertex3fv(emdm->vertexCos[(int) eed->v1->tmp.l]);
--                              glVertex3fv(emdm->vertexCos[(int) eed->v2->tmp.l]);
--                      }
--              }
--              glEnd();
--      } else {
--              glBegin(GL_LINES);
--              for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
--                      if(!setDrawOptions || setDrawOptions(userData, i)) {
--                              glVertex3fv(eed->v1->co);
--                              glVertex3fv(eed->v2->co);
--                      }
--              }
--              glEnd();
--      }
--}
--static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges)
--{
--      emDM_drawMappedEdges(dm, NULL, NULL);
--}
- static void emDM_drawMappedEdgesInterp(void *dm, int (*setDrawOptions)(void *userData, int index), void (*setDrawInterpOptions)(void *userData, int index, float t), void *userData) 
 -static void emDM_drawMappedEdgesInterp(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void (*setDrawInterpOptions)(void *userData, int index, float t), void *userData) 
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditEdge *eed;
--      int i;
--
--      if (emdm->vertexCos) {
--              EditVert *eve;
--
--              for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
--                      eve->tmp.l = (intptr_t) i++;
--
--              glBegin(GL_LINES);
--              for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
--                      if(!setDrawOptions || setDrawOptions(userData, i)) {
--                              setDrawInterpOptions(userData, i, 0.0);
--                              glVertex3fv(emdm->vertexCos[(int) eed->v1->tmp.l]);
--                              setDrawInterpOptions(userData, i, 1.0);
--                              glVertex3fv(emdm->vertexCos[(int) eed->v2->tmp.l]);
--                      }
--              }
--              glEnd();
--      } else {
--              glBegin(GL_LINES);
--              for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
--                      if(!setDrawOptions || setDrawOptions(userData, i)) {
--                              setDrawInterpOptions(userData, i, 0.0);
--                              glVertex3fv(eed->v1->co);
--                              setDrawInterpOptions(userData, i, 1.0);
--                              glVertex3fv(eed->v2->co);
--                      }
--              }
--              glEnd();
--      }
--}
--
- static void emDM_drawUVEdges(void *dm)
 -static void emDM_drawUVEdges(DerivedMesh *dm)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditFace *efa;
--      MTFace *tf;
--
--      glBegin(GL_LINES);
--      for(efa= emdm->em->faces.first; efa; efa= efa->next) {
--              tf = CustomData_em_get(&emdm->em->fdata, efa->data, CD_MTFACE);
--
--              if(tf && !(efa->h)) {
--                      glVertex2fv(tf->uv[0]);
--                      glVertex2fv(tf->uv[1]);
--
--                      glVertex2fv(tf->uv[1]);
--                      glVertex2fv(tf->uv[2]);
--
--                      if (!efa->v4) {
--                              glVertex2fv(tf->uv[2]);
--                              glVertex2fv(tf->uv[0]);
--                      } else {
--                              glVertex2fv(tf->uv[2]);
--                              glVertex2fv(tf->uv[3]);
--                              glVertex2fv(tf->uv[3]);
--                              glVertex2fv(tf->uv[0]);
--                      }
--              }
--      }
--      glEnd();
--}
--
--static void emDM__calcFaceCent(EditFace *efa, float cent[3], float (*vertexCos)[3])
--{
--      if (vertexCos) {
--              VECCOPY(cent, vertexCos[(int) efa->v1->tmp.l]);
--              add_v3_v3(cent, vertexCos[(int) efa->v2->tmp.l]);
--              add_v3_v3(cent, vertexCos[(int) efa->v3->tmp.l]);
--              if (efa->v4) add_v3_v3(cent, vertexCos[(int) efa->v4->tmp.l]);
--      } else {
--              VECCOPY(cent, efa->v1->co);
--              add_v3_v3(cent, efa->v2->co);
--              add_v3_v3(cent, efa->v3->co);
--              if (efa->v4) add_v3_v3(cent, efa->v4->co);
--      }
--
--      if (efa->v4) {
--              mul_v3_fl(cent, 0.25f);
--      } else {
--              mul_v3_fl(cent, 0.33333333333f);
--      }
--}
- static void emDM_foreachMappedFaceCenter(void *dm, void (*func)(void *userData, int index, float *co, float *no), void *userData)
 -static void emDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no), void *userData)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditVert *eve;
--      EditFace *efa;
--      float cent[3];
--      int i;
--
--      if (emdm->vertexCos) {
--              for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
--                      eve->tmp.l = (intptr_t) i++;
--      }
--
--      for(i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
--              emDM__calcFaceCent(efa, cent, emdm->vertexCos);
--              func(userData, i, cent, emdm->vertexCos?emdm->faceNos[i]:efa->n);
--      }
--}
- static void emDM_drawMappedFaces(void *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
 -static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditFace *efa;
--      int i, draw;
--
--      if (emdm->vertexCos) {
--              EditVert *eve;
--
--              for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
--                      eve->tmp.l = (intptr_t) i++;
--
--              for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
--                      int drawSmooth = (efa->flag & ME_SMOOTH);
--                      draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
--                      if(draw) {
--                              if (draw==2) { /* enabled with stipple */
--                                        glEnable(GL_POLYGON_STIPPLE);
--                                        glPolygonStipple(stipple_quarttone);
--                              }
--                              
--                              glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
--
--                              glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
--                              if (!drawSmooth) {
--                                      glNormal3fv(emdm->faceNos[i]);
--                                      glVertex3fv(emdm->vertexCos[(int) efa->v1->tmp.l]);
--                                      glVertex3fv(emdm->vertexCos[(int) efa->v2->tmp.l]);
--                                      glVertex3fv(emdm->vertexCos[(int) efa->v3->tmp.l]);
--                                      if(efa->v4) glVertex3fv(emdm->vertexCos[(int) efa->v4->tmp.l]);
--                              } else {
--                                      glNormal3fv(emdm->vertexNos[(int) efa->v1->tmp.l]);
--                                      glVertex3fv(emdm->vertexCos[(int) efa->v1->tmp.l]);
--                                      glNormal3fv(emdm->vertexNos[(int) efa->v2->tmp.l]);
--                                      glVertex3fv(emdm->vertexCos[(int) efa->v2->tmp.l]);
--                                      glNormal3fv(emdm->vertexNos[(int) efa->v3->tmp.l]);
--                                      glVertex3fv(emdm->vertexCos[(int) efa->v3->tmp.l]);
--                                      if(efa->v4) {
--                                              glNormal3fv(emdm->vertexNos[(int) efa->v4->tmp.l]);
--                                              glVertex3fv(emdm->vertexCos[(int) efa->v4->tmp.l]);
--                                      }
--                              }
--                              glEnd();
--                              
--                              if (draw==2)
--                                      glDisable(GL_POLYGON_STIPPLE);
--                      }
--              }
--      } else {
--              for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
--                      int drawSmooth = (efa->flag & ME_SMOOTH);
--                      draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
--                      if(draw) {
--                              if (draw==2) { /* enabled with stipple */
--                                      glEnable(GL_POLYGON_STIPPLE);
--                                      glPolygonStipple(stipple_quarttone);
--                              }
--                              glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
--
--                              glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
--                              if (!drawSmooth) {
--                                      glNormal3fv(efa->n);
--                                      glVertex3fv(efa->v1->co);
--                                      glVertex3fv(efa->v2->co);
--                                      glVertex3fv(efa->v3->co);
--                                      if(efa->v4) glVertex3fv(efa->v4->co);
--                              } else {
--                                      glNormal3fv(efa->v1->no);
--                                      glVertex3fv(efa->v1->co);
--                                      glNormal3fv(efa->v2->no);
--                                      glVertex3fv(efa->v2->co);
--                                      glNormal3fv(efa->v3->no);
--                                      glVertex3fv(efa->v3->co);
--                                      if(efa->v4) {
--                                              glNormal3fv(efa->v4->no);
--                                              glVertex3fv(efa->v4->co);
--                                      }
--                              }
--                              glEnd();
--                              
--                              if (draw==2)
--                                      glDisable(GL_POLYGON_STIPPLE);
--                      }
--              }
--      }
--}
--
- static void emDM_drawFacesTex_common(void *dm,
 -static void emDM_drawFacesTex_common(DerivedMesh *dm,
--                         int (*drawParams)(MTFace *tface, MCol *mcol, int matnr),
--                         int (*drawParamsMapped)(void *userData, int index),
--                         void *userData) 
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditMesh *em= emdm->em;
--      float (*vertexCos)[3]= emdm->vertexCos;
--      float (*vertexNos)[3]= emdm->vertexNos;
--      EditFace *efa;
--      int i;
--
--      /* always use smooth shading even for flat faces, else vertex colors wont interpolate */
--      glShadeModel(GL_SMOOTH);
--      
--      if (vertexCos) {
--              EditVert *eve;
--
--              for (i=0,eve=em->verts.first; eve; eve= eve->next)
--                      eve->tmp.l = (intptr_t) i++;
--
--              for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
--                      MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
--                      MCol *mcol= CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
--                      unsigned char *cp= NULL;
--                      int drawSmooth= (efa->flag & ME_SMOOTH);
--                      int flag;
--
--                      if(drawParams)
--                              flag= drawParams(tf, mcol, efa->mat_nr);
--                      else if(drawParamsMapped)
--                              flag= drawParamsMapped(userData, i);
--                      else
--                              flag= 1;
--
--                      if(flag != 0) { /* flag 0 == the face is hidden or invisible */
--                              
--                              /* we always want smooth here since otherwise vertex colors dont interpolate */
--                              if (mcol) {
--                                      if (flag==1) {
--                                              cp= (unsigned char*)mcol;
--                                      }
--                              } else {
--                                      glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
--                              } 
--                              
--                              glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
--                              if (!drawSmooth) {
--                                      glNormal3fv(emdm->faceNos[i]);
--
--                                      if(tf) glTexCoord2fv(tf->uv[0]);
--                                      if(cp) glColor3ub(cp[3], cp[2], cp[1]);
--                                      glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
--
--                                      if(tf) glTexCoord2fv(tf->uv[1]);
--                                      if(cp) glColor3ub(cp[7], cp[6], cp[5]);
--                                      glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
--
--                                      if(tf) glTexCoord2fv(tf->uv[2]);
--                                      if(cp) glColor3ub(cp[11], cp[10], cp[9]);
--                                      glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
--
--                                      if(efa->v4) {
--                                              if(tf) glTexCoord2fv(tf->uv[3]);
--                                              if(cp) glColor3ub(cp[15], cp[14], cp[13]);
--                                              glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
--                                      }
--                              } else {
--                                      if(tf) glTexCoord2fv(tf->uv[0]);
--                                      if(cp) glColor3ub(cp[3], cp[2], cp[1]);
--                                      glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
--                                      glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
--
--                                      if(tf) glTexCoord2fv(tf->uv[1]);
--                                      if(cp) glColor3ub(cp[7], cp[6], cp[5]);
--                                      glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
--                                      glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
--
--                                      if(tf) glTexCoord2fv(tf->uv[2]);
--                                      if(cp) glColor3ub(cp[11], cp[10], cp[9]);
--                                      glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
--                                      glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
--
--                                      if(efa->v4) {
--                                              if(tf) glTexCoord2fv(tf->uv[3]);
--                                              if(cp) glColor3ub(cp[15], cp[14], cp[13]);
--                                              glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
--                                              glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
--                                      }
--                              }
--                              glEnd();
--                      }
--              }
--      } else {
--              for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
--                      MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
--                      MCol *mcol= CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
--                      unsigned char *cp= NULL;
--                      int drawSmooth= (efa->flag & ME_SMOOTH);
--                      int flag;
--
--                      if(drawParams)
--                              flag= drawParams(tf, mcol, efa->mat_nr);
--                      else if(drawParamsMapped)
--                              flag= drawParamsMapped(userData, i);
--                      else
--                              flag= 1;
--
--                      if(flag != 0) { /* flag 0 == the face is hidden or invisible */
--                              /* we always want smooth here since otherwise vertex colors dont interpolate */
--                              if (mcol) {
--                                      if (flag==1) {
--                                              cp= (unsigned char*)mcol;
--                                      }
--                              } else {
--                                      glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
--                              } 
--
--                              glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
--                              if (!drawSmooth) {
--                                      glNormal3fv(efa->n);
--
--                                      if(tf) glTexCoord2fv(tf->uv[0]);
--                                      if(cp) glColor3ub(cp[3], cp[2], cp[1]);
--                                      glVertex3fv(efa->v1->co);
--
--                                      if(tf) glTexCoord2fv(tf->uv[1]);
--                                      if(cp) glColor3ub(cp[7], cp[6], cp[5]);
--                                      glVertex3fv(efa->v2->co);
--
--                                      if(tf) glTexCoord2fv(tf->uv[2]);
--                                      if(cp) glColor3ub(cp[11], cp[10], cp[9]);
--                                      glVertex3fv(efa->v3->co);
--
--                                      if(efa->v4) {
--                                              if(tf) glTexCoord2fv(tf->uv[3]);
--                                              if(cp) glColor3ub(cp[15], cp[14], cp[13]);
--                                              glVertex3fv(efa->v4->co);
--                                      }
--                              } else {
--                                      if(tf) glTexCoord2fv(tf->uv[0]);
--                                      if(cp) glColor3ub(cp[3], cp[2], cp[1]);
--                                      glNormal3fv(efa->v1->no);
--                                      glVertex3fv(efa->v1->co);
--
--                                      if(tf) glTexCoord2fv(tf->uv[1]);
--                                      if(cp) glColor3ub(cp[7], cp[6], cp[5]);
--                                      glNormal3fv(efa->v2->no);
--                                      glVertex3fv(efa->v2->co);
--
--                                      if(tf) glTexCoord2fv(tf->uv[2]);
--                                      if(cp) glColor3ub(cp[11], cp[10], cp[9]);
--                                      glNormal3fv(efa->v3->no);
--                                      glVertex3fv(efa->v3->co);
--
--                                      if(efa->v4) {
--                                              if(tf) glTexCoord2fv(tf->uv[3]);
--                                              if(cp) glColor3ub(cp[15], cp[14], cp[13]);
--                                              glNormal3fv(efa->v4->no);
--                                              glVertex3fv(efa->v4->co);
--                                      }
--                              }
--                              glEnd();
--                      }
--              }
--      }
--}
--
- static void emDM_drawFacesTex(void *dm, int (*setDrawOptions)(MTFace *tface, int has_vcol, int matnr))
 -static void emDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
--{
-       emDM_drawFacesTex_common(dm, (int (*)(struct MTFace *, struct MCol *, int))setDrawOptions, NULL, NULL);
 -      emDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
--}
--
- static void emDM_drawMappedFacesTex(void *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
 -static void emDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
--{
--      emDM_drawFacesTex_common(dm, NULL, setDrawOptions, userData);
--}
--
- static void emDM_drawMappedFacesGLSL(void *dm,
 -static void emDM_drawMappedFacesGLSL(DerivedMesh *dm,
--                         int (*setMaterial)(int, void *attribs),
--                         int (*setDrawOptions)(void *userData, int index), void *userData) 
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditMesh *em= emdm->em;
--      float (*vertexCos)[3]= emdm->vertexCos;
--      float (*vertexNos)[3]= emdm->vertexNos;
--      EditVert *eve;
--      EditFace *efa;
--      DMVertexAttribs attribs;
--      GPUVertexAttribs gattribs;
--      MTFace *tf;
--      int transp, new_transp, orig_transp, tfoffset;
--      int i, b, matnr, new_matnr, dodraw, layer;
--
--      dodraw = 0;
--      matnr = -1;
--
--      transp = GPU_get_material_blend_mode();
--      orig_transp = transp;
--      layer = CustomData_get_layer_index(&em->fdata, CD_MTFACE);
--      tfoffset = (layer == -1)? -1: em->fdata.layers[layer].offset;
--
--      memset(&attribs, 0, sizeof(attribs));
--
--      /* always use smooth shading even for flat faces, else vertex colors wont interpolate */
--      glShadeModel(GL_SMOOTH);
--
--      for (i=0,eve=em->verts.first; eve; eve= eve->next)
--              eve->tmp.l = (intptr_t) i++;
--
--#define PASSATTRIB(efa, eve, vert) {                                                                                  \
--      if(attribs.totorco) {                                                                                                           \
--              float *orco = attribs.orco.array[eve->tmp.l];                                                   \
--              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]);                  \
--      }                                                                                                                                                       \
--      for(b = 0; b < attribs.totmcol; b++) {                                                                          \
--              MCol *cp = (MCol*)((char*)efa->data + attribs.mcol[b].emOffset);                \
--              GLubyte col[4];                                                                                                                 \
--              col[0]= cp->b; col[1]= cp->g; col[2]= cp->r; col[3]= cp->a;                             \
--              glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, col);                                    \
--      }                                                                                                                                                       \
--      if(attribs.tottang) {                                                                                                           \
--              float *tang = attribs.tang.array[i*4 + vert];                                                   \
--              glVertexAttrib3fvARB(attribs.tang.glIndex, tang);                                               \
--      }                                                                                                                                                       \
--}
--
--      for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
--              int drawSmooth= (efa->flag & ME_SMOOTH);
--
--              if(setDrawOptions && !setDrawOptions(userData, i))
--                      continue;
--
--              new_matnr = efa->mat_nr + 1;
--              if(new_matnr != matnr) {
--                      dodraw = setMaterial(matnr = new_matnr, &gattribs);
--                      if(dodraw)
--                              DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
--              }
--
--              if(tfoffset != -1) {
--                      tf = (MTFace*)((char*)efa->data)+tfoffset;
--                      new_transp = tf->transp;
--
--                      if(new_transp != transp) {
--                              if(new_transp == GPU_BLEND_SOLID && orig_transp != GPU_BLEND_SOLID)
--                                      GPU_set_material_blend_mode(orig_transp);
--                              else
--                                      GPU_set_material_blend_mode(new_transp);
--                              transp = new_transp;
--                      }
--              }
--
--              if(dodraw) {
--                      glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
--                      if (!drawSmooth) {
--                              if(vertexCos) glNormal3fv(emdm->faceNos[i]);
--                              else glNormal3fv(efa->n);
--
--                              PASSATTRIB(efa, efa->v1, 0);
--                              if(vertexCos) glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
--                              else glVertex3fv(efa->v1->co);
--
--                              PASSATTRIB(efa, efa->v2, 1);
--                              if(vertexCos) glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
--                              else glVertex3fv(efa->v2->co);
--
--                              PASSATTRIB(efa, efa->v3, 2);
--                              if(vertexCos) glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
--                              else glVertex3fv(efa->v3->co);
--
--                              if(efa->v4) {
--                                      PASSATTRIB(efa, efa->v4, 3);
--                                      if(vertexCos) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
--                                      else glVertex3fv(efa->v4->co);
--                              }
--                      } else {
--                              PASSATTRIB(efa, efa->v1, 0);
--                              if(vertexCos) {
--                                      glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
--                                      glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
--                              }
--                              else {
--                                      glNormal3fv(efa->v1->no);
--                                      glVertex3fv(efa->v1->co);
--                              }
--
--                              PASSATTRIB(efa, efa->v2, 1);
--                              if(vertexCos) {
--                                      glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
--                                      glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
--                              }
--                              else {
--                                      glNormal3fv(efa->v2->no);
--                                      glVertex3fv(efa->v2->co);
--                              }
--
--                              PASSATTRIB(efa, efa->v3, 2);
--                              if(vertexCos) {
--                                      glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
--                                      glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
--                              }
--                              else {
--                                      glNormal3fv(efa->v3->no);
--                                      glVertex3fv(efa->v3->co);
--                              }
--
--                              if(efa->v4) {
--                                      PASSATTRIB(efa, efa->v4, 3);
--                                      if(vertexCos) {
--                                              glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
--                                              glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
--                                      }
--                                      else {
--                                              glNormal3fv(efa->v4->no);
--                                              glVertex3fv(efa->v4->co);
--                                      }
--                              }
--                      }
--                      glEnd();
--              }
--      }
--}
--
- static void emDM_drawFacesGLSL(void *dm,
 -static void emDM_drawFacesGLSL(DerivedMesh *dm,
--                         int (*setMaterial)(int, void *attribs))
--{
-       ((DerivedMesh*)dm)->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL);
 -      dm->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL);
--}
--
- static void emDM_getMinMax(void *dm, float min_r[3], float max_r[3])
 -static void emDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditVert *eve;
--      int i;
--
--      if (emdm->em->verts.first) {
--              for (i=0,eve= emdm->em->verts.first; eve; i++,eve= eve->next) {
--                      if (emdm->vertexCos) {
--                              DO_MINMAX(emdm->vertexCos[i], min_r, max_r);
--                      } else {
--                              DO_MINMAX(eve->co, min_r, max_r);
--                      }
--              }
--      } else {
--              min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
--      }
--}
- static int emDM_getNumVerts(void *dm)
 -static int emDM_getNumVerts(DerivedMesh *dm)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--
--      return BLI_countlist(&emdm->em->verts);
--}
--
- static int emDM_getNumEdges(void *dm)
 -static int emDM_getNumEdges(DerivedMesh *dm)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--
--      return BLI_countlist(&emdm->em->edges);
--}
--
- static int emDM_getNumTessFaces(void *dm)
 -static int emDM_getNumFaces(DerivedMesh *dm)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--
--      return BLI_countlist(&emdm->em->faces);
--}
--
--static void emDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
--{
--      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditVert *eve;
--      int i;
--
--      for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
--              if (emdm->vertexCos) {
--                      copy_v3_v3(cos_r[i], emdm->vertexCos[i]);
--              } else {
--                      copy_v3_v3(cos_r[i], eve->co);
--              }
--      }
--}
--
--static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
--{
--      EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
--      int i;
--
--      for(i = 0; i < index; ++i) ev = ev->next;
--
--      VECCOPY(vert_r->co, ev->co);
--
--      vert_r->no[0] = ev->no[0] * 32767.0;
--      vert_r->no[1] = ev->no[1] * 32767.0;
--      vert_r->no[2] = ev->no[2] * 32767.0;
--
--      /* TODO what to do with vert_r->flag and vert_r->mat_nr? */
--      vert_r->mat_nr = 0;
--      vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
--}
--
- static void emDM_getEdge(void *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;
--      EditVert *ev, *v1, *v2;
--      int i;
--
--      for(i = 0; i < index; ++i) ee = ee->next;
--
--      edge_r->crease = (unsigned char) (ee->crease*255.0f);
--      edge_r->bweight = (unsigned char) (ee->bweight*255.0f);
--      /* TODO what to do with edge_r->flag? */
--      edge_r->flag = ME_EDGEDRAW|ME_EDGERENDER;
--      if (ee->seam) edge_r->flag |= ME_SEAM;
--      if (ee->sharp) edge_r->flag |= ME_SHARP;
--#if 0
--      /* this needs setup of f2 field */
--      if (!ee->f2) edge_r->flag |= ME_LOOSEEDGE;
--#endif
--
--      /* goddamn, we have to search all verts to find indices */
--      v1 = ee->v1;
--      v2 = ee->v2;
--      for(i = 0, ev = em->verts.first; v1 || v2; i++, ev = ev->next) {
--              if(ev == v1) {
--                      edge_r->v1 = i;
--                      v1 = NULL;
--              }
--              if(ev == v2) {
--                      edge_r->v2 = i;
--                      v2 = NULL;
--              }
--      }
--}
--
- static void emDM_getFace(void *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;
--      EditVert *ev, *v1, *v2, *v3, *v4;
--      int i;
--
--      for(i = 0; i < index; ++i) ef = ef->next;
--
--      face_r->mat_nr = ef->mat_nr;
--      face_r->flag = ef->flag;
--
--      /* goddamn, we have to search all verts to find indices */
--      v1 = ef->v1;
--      v2 = ef->v2;
--      v3 = ef->v3;
--      v4 = ef->v4;
--      if(!v4) face_r->v4 = 0;
--
--      for(i = 0, ev = em->verts.first; v1 || v2 || v3 || v4;
--              i++, ev = ev->next) {
--              if(ev == v1) {
--                      face_r->v1 = i;
--                      v1 = NULL;
--              }
--              if(ev == v2) {
--                      face_r->v2 = i;
--                      v2 = NULL;
--              }
--              if(ev == v3) {
--                      face_r->v3 = i;
--                      v3 = NULL;
--              }
--              if(ev == v4) {
--                      face_r->v4 = i;
--                      v4 = NULL;
--              }
--      }
--
--      test_index_face(face_r, NULL, 0, ef->v4?4:3);
--}
--
- static void emDM_copyVertArray(void *dm, MVert *vert_r)
 -static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
--{
-       EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
 -      EditVert *ev = emdm->em->verts.first;
 -      int i;
--
-       for( ; ev; ev = ev->next, ++vert_r) {
-               VECCOPY(vert_r->co, ev->co);
 -      for(i=0; ev; ev = ev->next, ++vert_r, ++i) {
 -              if(emdm->vertexCos)
 -                      copy_v3_v3(vert_r->co, emdm->vertexCos[i]);
 -              else
 -                      copy_v3_v3(vert_r->co, ev->co);
--
--              vert_r->no[0] = ev->no[0] * 32767.0;
--              vert_r->no[1] = ev->no[1] * 32767.0;
--              vert_r->no[2] = ev->no[2] * 32767.0;
--
--              /* TODO what to do with vert_r->flag and vert_r->mat_nr? */
--              vert_r->mat_nr = 0;
--              vert_r->flag = 0;
--              vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
--      }
--}
--
- static void emDM_copyEdgeArray(void *dm, MEdge *edge_r)
 -static void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
--{
--      EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
--      EditEdge *ee = em->edges.first;
--      EditVert *ev;
--      int i;
--
--      /* store vertex indices in tmp union */
--      for(ev = em->verts.first, i = 0; ev; ev = ev->next, ++i)
--              ev->tmp.l = (intptr_t) i;
--
--      for( ; ee; ee = ee->next, ++edge_r) {
--              edge_r->crease = (unsigned char) (ee->crease*255.0f);
--              edge_r->bweight = (unsigned char) (ee->bweight*255.0f);
--              /* TODO what to do with edge_r->flag? */
--              edge_r->flag = ME_EDGEDRAW|ME_EDGERENDER;
--              if (ee->seam) edge_r->flag |= ME_SEAM;
--              if (ee->sharp) edge_r->flag |= ME_SHARP;
--#if 0
--              /* this needs setup of f2 field */
--              if (!ee->f2) edge_r->flag |= ME_LOOSEEDGE;
--#endif
--
--              edge_r->v1 = (int)ee->v1->tmp.l;
--              edge_r->v2 = (int)ee->v2->tmp.l;
--      }
--}
--
- static void emDM_copyFaceArray(void *dm, MFace *face_r)
 -static void emDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
--{
--      EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
--      EditFace *ef = em->faces.first;
--      EditVert *ev;
--      int i;
--
--      /* store vertexes indices in tmp union */
--      for(ev = em->verts.first, i = 0; ev; ev = ev->next, ++i)
--              ev->tmp.l = (intptr_t) i;
--
--      for( ; ef; ef = ef->next, ++face_r) {
--              face_r->mat_nr = ef->mat_nr;
--              face_r->flag = ef->flag;
--
--              face_r->v1 = (int)ef->v1->tmp.l;
--              face_r->v2 = (int)ef->v2->tmp.l;
--              face_r->v3 = (int)ef->v3->tmp.l;
--              if(ef->v4) face_r->v4 = (int)ef->v4->tmp.l;
--              else face_r->v4 = 0;
--
--              test_index_face(face_r, NULL, 0, ef->v4?4:3);
--      }
--}
--
- static void *emDM_getFaceDataArray(void *dm, int type)
 -static void *emDM_getFaceDataArray(DerivedMesh *dm, int type)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--      EditMesh *em= emdm->em;
--      EditFace *efa;
--      char *data, *emdata;
--      void *datalayer;
--      int index, offset, size;
--
-       datalayer = DM_get_tessface_data_layer(dm, type);
 -      datalayer = DM_get_face_data_layer(dm, type);
--      if(datalayer)
--              return datalayer;
--
--      /* layers are store per face for editmesh, we convert to a temporary
--       * data layer array in the derivedmesh when these are requested */
--      if(type == CD_MTFACE || type == CD_MCOL) {
--              index = CustomData_get_layer_index(&em->fdata, type);
--
--              if(index != -1) {
--                      offset = em->fdata.layers[index].offset;
--                      size = CustomData_sizeof(type);
--
-                       DM_add_tessface_layer(dm, type, CD_CALLOC, NULL);
-                       index = CustomData_get_layer_index(&emdm->dm.faceData, type);
-                       emdm->dm.faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
 -                      DM_add_face_layer(dm, type, CD_CALLOC, NULL);
 -                      index = CustomData_get_layer_index(&dm->faceData, type);
 -                      dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
--
-                       data = datalayer = DM_get_tessface_data_layer(dm, type);
 -                      data = datalayer = DM_get_face_data_layer(dm, type);
--                      for(efa=em->faces.first; efa; efa=efa->next, data+=size) {
--                              emdata = CustomData_em_get(&em->fdata, efa->data, type);
--                              memcpy(data, emdata, size);
--                      }
--              }
--      }
--
--      return datalayer;
--}
--
- static void emDM_release(void *dm)
 -static void emDM_release(DerivedMesh *dm)
--{
-       EditMeshDerivedMesh *emdm= dm;
 -      EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
--
--      if (DM_release(dm)) {
--              if (emdm->vertexCos) {
--                      MEM_freeN(emdm->vertexCos);
--                      MEM_freeN(emdm->vertexNos);
--                      MEM_freeN(emdm->faceNos);
--              }
--
--              MEM_freeN(emdm);
--      }
--}
--
--static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
--                                                                                 float (*vertexCos)[3])
--{
- #if 0
--      EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "emdm");
--
--      DM_init(&emdm->dm, DM_TYPE_EDITMESH, BLI_countlist(&em->verts),
-                        BLI_countlist(&em->edges), BLI_countlist(&em->faces),
-                                        0, 0);
 -                                       BLI_countlist(&em->edges), BLI_countlist(&em->faces));
--
--      emdm->dm.getMinMax = emDM_getMinMax;
--
--      emdm->dm.getNumVerts = emDM_getNumVerts;
--      emdm->dm.getNumEdges = emDM_getNumEdges;
-       emdm->dm.getNumTessFaces = emDM_getNumTessFaces;
 -      emdm->dm.getNumFaces = emDM_getNumFaces;
--
--      emdm->dm.getVertCos = emDM_getVertCos;
--
--      emdm->dm.getVert = emDM_getVert;
--      emdm->dm.getEdge = emDM_getEdge;
-       emdm->dm.getTessFace = emDM_getFace;
 -      emdm->dm.getFace = emDM_getFace;
--      emdm->dm.copyVertArray = emDM_copyVertArray;
--      emdm->dm.copyEdgeArray = emDM_copyEdgeArray;
-       emdm->dm.copyTessFaceArray = emDM_copyFaceArray;
-       emdm->dm.getTessFaceDataArray = emDM_getFaceDataArray;
 -      emdm->dm.copyFaceArray = emDM_copyFaceArray;
 -      emdm->dm.getFaceDataArray = emDM_getFaceDataArray;
--
--      emdm->dm.foreachMappedVert = emDM_foreachMappedVert;
--      emdm->dm.foreachMappedEdge = emDM_foreachMappedEdge;
--      emdm->dm.foreachMappedFaceCenter = emDM_foreachMappedFaceCenter;
--
--      emdm->dm.drawEdges = emDM_drawEdges;
--      emdm->dm.drawMappedEdges = emDM_drawMappedEdges;
--      emdm->dm.drawMappedEdgesInterp = emDM_drawMappedEdgesInterp;
--      emdm->dm.drawMappedFaces = emDM_drawMappedFaces;
--      emdm->dm.drawMappedFacesTex = emDM_drawMappedFacesTex;
--      emdm->dm.drawMappedFacesGLSL = emDM_drawMappedFacesGLSL;
--      emdm->dm.drawFacesTex = emDM_drawFacesTex;
--      emdm->dm.drawFacesGLSL = emDM_drawFacesGLSL;
--      emdm->dm.drawUVEdges = emDM_drawUVEdges;
--
--      emdm->dm.release = emDM_release;
--      
--      emdm->em = em;
--      emdm->vertexCos = vertexCos;
--
--      if(CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
--              EditVert *eve;
--              int i;
--
--              DM_add_vert_layer(&emdm->dm, CD_MDEFORMVERT, CD_CALLOC, NULL);
--
--              for(eve = em->verts.first, i = 0; eve; eve = eve->next, ++i)
--                      DM_set_vert_data(&emdm->dm, i, CD_MDEFORMVERT,
--                                                       CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT));
--      }
--
--      if(vertexCos) {
--              EditVert *eve;
--              EditFace *efa;
--              int totface = BLI_countlist(&em->faces);
--              int i;
--
--              for (i=0,eve=em->verts.first; eve; eve= eve->next)
--                      eve->tmp.l = (intptr_t) i++;
--
--              emdm->vertexNos = MEM_callocN(sizeof(*emdm->vertexNos)*i, "emdm_vno");
--              emdm->faceNos = MEM_mallocN(sizeof(*emdm->faceNos)*totface, "emdm_vno");
--
--              for(i=0, efa= em->faces.first; efa; i++, efa=efa->next) {
--                      float *v1 = vertexCos[(int) efa->v1->tmp.l];
--                      float *v2 = vertexCos[(int) efa->v2->tmp.l];
--                      float *v3 = vertexCos[(int) efa->v3->tmp.l];
--                      float *no = emdm->faceNos[i];
--                      
--                      if(efa->v4) {
--                              float *v4 = vertexCos[(int) efa->v4->tmp.l];
--
--                              normal_quad_v3( no,v1, v2, v3, v4);
--                              add_v3_v3(emdm->vertexNos[(int) efa->v4->tmp.l], no);
--                      }
--                      else {
--                              normal_tri_v3( no,v1, v2, v3);
--                      }
--
--                      add_v3_v3(emdm->vertexNos[(int) efa->v1->tmp.l], no);
--                      add_v3_v3(emdm->vertexNos[(int) efa->v2->tmp.l], no);
--                      add_v3_v3(emdm->vertexNos[(int) efa->v3->tmp.l], no);
--              }
--
--              for(i=0, eve= em->verts.first; eve; i++, eve=eve->next) {
--                      float *no = emdm->vertexNos[i];
--                      /* following Mesh convention; we use vertex coordinate itself
--                       * for normal in this case */
--                      if (normalize_v3(no)==0.0) {
-                               VECCOPY(no, vertexCos[i]);
-                               normalize_v3(no);
 -                              normalize_v3_v3(no, vertexCos[i]);
--                      }
--              }
--      }
--
--      return (DerivedMesh*) emdm;
- #endif
-       return NULL;
--}
--
  /***/
  
  DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, ModifierData *md)
@@@ -1716,7 -1499,7 +735,7 @@@ static void *get_orco_coords_dm(Object 
        return NULL;
  }
  
--static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, EditMesh *em, int layer)
++static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, BMEditMesh *em, int layer)
  {
        DerivedMesh *dm;
        float (*orco)[3];
@@@ -2853,15 -2608,15 +1870,8 @@@ void DM_vertex_attributes_from_gpu(Deri
        memset(attribs, 0, sizeof(DMVertexAttribs));
  
        vdata = &dm->vertData;
--      fdata = &dm->faceData;
--
--      /* ugly hack, editmesh derivedmesh doesn't copy face data, this way we
--       * can use offsets instead */
--      if(dm->release == emDM_release)
--              tfdata = &((EditMeshDerivedMesh*)dm)->em->fdata;
--      else
--              tfdata = fdata;
--
++      fdata = tfdata = dm->getTessFaceDataLayout(dm);
++      
        /* add a tangent layer if necessary */
        for(b = 0; b < gattribs->totlayer; b++)
                if(gattribs->layer[b].type == CD_TANGENT)
  #include "DNA_key_types.h"
  #include "DNA_meshdata_types.h"
  #include "DNA_scene_types.h"
 +#include "DNA_windowmanager_types.h"
 +#include "DNA_view3d_types.h"
  #include "DNA_vfont_types.h"
  
- #include "BKE_anim.h"
  #include "BKE_curve.h"
  #include "BKE_DerivedMesh.h"
  #include "BKE_depsgraph.h"
  #include "BKE_particle.h"
  #include "BKE_scene.h"
  #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  #include "BKE_depsgraph.h"
  
  // XXX bad level call...
  
  /* --------------------- */
@@@ -2082,8 -1674,13 +2083,13 @@@ DerivedMesh *CDDM_from_template(Derived
        CDDerivedMesh *cddm = cdDM_create("CDDM_from_template dest");
        DerivedMesh *dm = &cddm->dm;
  
 -      source->getFaceDataArray(source, CD_ORIGINDEX);
+       /* ensure these are created if they are made on demand */
+       source->getVertDataArray(source, CD_ORIGINDEX);
+       source->getEdgeDataArray(source, CD_ORIGINDEX);
++      source->getTessFaceDataArray(source, CD_ORIGINDEX);
        /* this does a copy of all non mvert/medge/mface layers */
 -      DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numFaces);
 +      DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numFaces, numLoops, numPolys);
  
        /* now add mvert/medge/mface layers */
        CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);
@@@ -2158,61 -1746,44 +2164,59 @@@ void CDDM_calc_normals(DerivedMesh *dm
        temp_nors = MEM_callocN(numVerts * sizeof(*temp_nors),
                                                        "CDDM_calc_normals temp_nors");
  
 -      /* we don't want to overwrite any referenced layers */
 -      mv = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
 -      cddm->mvert = mv;
 +      /*recalc tesselation to ensure we have valid origindex values
 +        for mface->mpoly lookups.*/
 +      cdDM_recalcTesselation2(dm);
  
 -      /* make a face normal layer if not present */
 -      face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
 -      if(!face_nors)
 -              face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_CALLOC,
 -                                                                               NULL, dm->numFaceData);
 +      numFaces = dm->numFaceData;
  
 -      /* calculate face normals and add to vertex normals */
 -      mf = CDDM_get_faces(dm);
 -      for(i = 0; i < numFaces; i++, mf++) {
 -              float *f_no = face_nors[i];
 +      /*first go through and calculate normals for all the polys*/
 +      temp_nors = MEM_callocN(sizeof(float)*3*dm->numPolyData, "temp_nors cdderivedmesh.c");
 +      vert_nors = MEM_callocN(sizeof(float)*3*dm->numVertData, "vert_nors cdderivedmesh.c");
 +      
 +      mp = cddm->mpoly;
 +      for (i=0; i<dm->numPolyData; i++, mp++) {
 +              mesh_calc_poly_normal(mp, cddm->mloop+mp->loopstart, cddm->mvert, temp_nors[i]);
  
 -              if(mf->v4)
 -                      normal_quad_v3( f_no,mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co, mv[mf->v4].co);
 -              else
 -                      normal_tri_v3( f_no,mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co);
 -              
 -              add_v3_v3(temp_nors[mf->v1], f_no);
 -              add_v3_v3(temp_nors[mf->v2], f_no);
 -              add_v3_v3(temp_nors[mf->v3], f_no);
 -              if(mf->v4)
 -                      add_v3_v3(temp_nors[mf->v4], f_no);
 +              ml = cddm->mloop + mp->loopstart;
 +              for (j=0; j<mp->totloop; j++, ml++) {
 +                      VECADD(vert_nors[ml->v], vert_nors[ml->v], temp_nors[i]);
 +              }
        }
  
 -      /* normalize vertex normals and assign */
 -      for(i = 0; i < numVerts; i++, mv++) {
 -              float *no = temp_nors[i];
 +      face_nors = MEM_callocN(sizeof(float)*3*dm->numFaceData, "face_nors cdderivedmesh.c");
 +      origIndex = CustomData_get_layer(&dm->faceData, CD_ORIGINDEX);
 +
 +      mf = cddm->mface;
 +      for (i=0; i<dm->numFaceData; i++, mf++, origIndex++) {
 +              VECCOPY(face_nors[i], temp_nors[*origIndex]);
 +      }
 +
 +      mv = cddm->mvert;
 +      for (i=0; i<dm->numVertData; i++, mv++) {
 +              float *no = vert_nors[i];
                
 -              if (normalize_v3(no) == 0.0)
 -                      normalize_v3_v3(no, mv->co);
 +              if (normalize_v3(no) == 0.0) {
 +                      VECCOPY(no, mv->co);
 +                      if (normalize_v3(no) == 0.0) {
 +                              no[0] = 0.0f;
 +                              no[1] = 0.0f;
 +                              no[2] = 1.0f;
 +                      }
 +              }
  
-               mv->no[0] = (short)(no[0] * 32767.0f);
-               mv->no[1] = (short)(no[1] * 32767.0f);
-               mv->no[2] = (short)(no[2] * 32767.0f);
+               normal_float_to_short_v3(mv->no, no);
        }
 -      
 +
        MEM_freeN(temp_nors);
 +      MEM_freeN(vert_nors);
 +
 +      /*this restores original poly origindex -> tessface origindex mapping,
 +        instead of the poly index -> tessface origindex one we generated
 +        with cdDM_recalcTesselation2*/
 +      cdDM_recalcTesselation(dm);
 +      CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_ASSIGN, 
 +              face_nors, dm->numFaceData);
  }
  
  void CDDM_calc_edges(DerivedMesh *dm)
@@@ -403,8 -399,8 +403,8 @@@ static void contarget_get_mesh_mat (Sce
  {
        DerivedMesh *dm = NULL;
        Mesh *me= ob->data;
 -      EditMesh *em = BKE_mesh_get_editmesh(me);
 +      BMEditMesh *em = me->edit_btmesh;
-       float vec[3] = {0.0f, 0.0f, 0.0f}, tvec[3];
+       float vec[3] = {0.0f, 0.0f, 0.0f};
        float normal[3] = {0.0f, 0.0f, 0.0f}, plane[3];
        float imat[3][3], tmat[3][3];
        int dgroup;
@@@ -2536,11 -2480,9 +2482,9 @@@ static void locktrack_evaluate (bConstr
                }
                        break;
                default:
 -              {
 -                      unit_m3(totmat);
 -              }
 +                      {
-                               totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
-                               totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
-                               totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
++                              unit_m3(totmat);
 +                      }
                        break;
                }
                /* Block to keep matrix heading */
@@@ -45,7 -45,7 +45,8 @@@
  #include "DNA_key_types.h"  
  #include "DNA_scene_types.h"  
  #include "DNA_vfont_types.h"  
 +#include "DNA_meshdata_types.h"  
+ #include "DNA_object_types.h"
  
  #include "BKE_animsys.h"
  #include "BKE_anim.h"  
@@@ -1037,11 -1004,9 +1051,10 @@@ static void do_key(int start, int end, 
  
  static float *get_weights_array(Object *ob, char *vgroup)
  {
-       bDeformGroup *curdef;
        MDeformVert *dvert= NULL;
 -      EditMesh *em= NULL;
 -      EditVert *eve;
 +      BMEditMesh *em= NULL;
 +      BMIter iter;
 +      BMVert *eve;
        int totvert= 0, index= 0;
        
        /* no vgroup string set? */
@@@ -1618,274 -1482,58 +1601,330 @@@ void mesh_pmv_off(Object *ob, Mesh *me
        }
  }
  
 +static void mesh_loops_to_corners(CustomData *fdata, CustomData *ldata, 
 +                         CustomData *pdata, int lindex[3], int findex, 
 +                         int polyindex, int numTex, int numCol) 
 +{
 +      MTFace *texface;
 +      MTexPoly *texpoly;
 +      MCol *mcol;
 +      MLoopCol *mloopcol;
 +      MLoopUV *mloopuv;
 +      int i, j, hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
 +
 +      for(i=0; i < numTex; i++){
 +              texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
 +              texpoly = CustomData_get_n(pdata, CD_MTEXPOLY, polyindex, i);
 +              
 +              texface->tpage = texpoly->tpage;
 +              texface->flag = texpoly->flag;
 +              texface->transp = texpoly->transp;
 +              texface->mode = texpoly->mode;
 +              texface->tile = texpoly->tile;
 +              texface->unwrap = texpoly->unwrap;
 +
 +              for (j=0; j<3; j++) {
 +                      mloopuv = CustomData_get_n(ldata, CD_MLOOPUV, lindex[j], i);
 +                      texface->uv[j][0] = mloopuv->uv[0];
 +                      texface->uv[j][1] = mloopuv->uv[1];
 +              }
 +      }
 +
 +      for(i=0; i < numCol; i++){
 +              mcol = CustomData_get_n(fdata, CD_MCOL, findex, i);
 +
 +              for (j=0; j<3; j++) {
 +                      mloopcol = CustomData_get_n(ldata, CD_MLOOPCOL, lindex[j], i);
 +                      mcol[j].r = mloopcol->r;
 +                      mcol[j].g = mloopcol->g;
 +                      mcol[j].b = mloopcol->b;
 +                      mcol[j].a = mloopcol->a;
 +              }
 +      }
 +
 +      if (hasWCol) {
 +              mcol = CustomData_get(fdata,  findex, CD_WEIGHT_MCOL);
 +
 +              for (j=0; j<3; j++) {
 +                      mloopcol = CustomData_get(ldata, lindex[j], CD_WEIGHT_MLOOPCOL);
 +                      mcol[j].r = mloopcol->r;
 +                      mcol[j].g = mloopcol->g;
 +                      mcol[j].b = mloopcol->b;
 +                      mcol[j].a = mloopcol->a;
 +              }
 +      }
 +}
 +
 +/*
 +  this function recreates a tesselation.
 +  returns number of tesselation faces.
 +
 +  use_poly_origindex sets whether or not the tesselation faces' origindex
 +  layer should point to original poly indices or real poly indices.
 +
 +  use_face_origindex sets the tesselation faces' origindex layer
 +  to point to the tesselation faces themselves, not the polys.
 +
 +  if both of the above are 0, it'll use the indices of the mpolys of the MPoly
 +  data in pdata, and ignore the origindex layer altogether.
 + */
 +int mesh_recalcTesselation(CustomData *fdata, 
 +                           CustomData *ldata, CustomData *pdata,
 +                           MVert *mvert, int totface, int totloop, 
 +                           int totpoly, int use_poly_origindex, 
 +                         int use_face_origindex)
 +{
 +      MPoly *mp, *mpoly;
 +      MLoop *ml, *mloop;
 +      MFace *mf = NULL, *mface;
 +      BLI_array_declare(mf);
 +      EditVert *v, *lastv, *firstv;
 +      EditFace *f;
 +      BLI_array_declare(origIndex);
 +      int i, j, k, lindex[3], *origIndex = NULL, *polyorigIndex;
 +      int numTex, numCol;
 +
 +      mpoly = CustomData_get_layer(pdata, CD_MPOLY);
 +      mloop = CustomData_get_layer(ldata, CD_MLOOP);
 +
 +      numTex = CustomData_number_of_layers(ldata, CD_MLOOPUV);
 +      numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
 +      
 +      k = 0;
 +      mp = mpoly;
 +      polyorigIndex = use_poly_origindex? CustomData_get_layer(pdata, CD_ORIGINDEX) : NULL;
 +      for (i=0; i<totpoly; i++, mp++) {
 +              ml = mloop + mp->loopstart;
 +              firstv = NULL;
 +              lastv = NULL;
 +              for (j=0; j<mp->totloop; j++, ml++) {
 +                      v = BLI_addfillvert(mvert[ml->v].co);
 +                      if (polyorigIndex)
 +                              v->tmp.l = polyorigIndex[i];
 +                      else
 +                              v->tmp.l = i;
 +
 +                      v->keyindex = mp->loopstart + j;
 +
 +                      if (lastv)
 +                              BLI_addfilledge(lastv, v);
 +
 +                      if (!firstv)
 +                              firstv = v;
 +                      lastv = v;
 +              }
 +              BLI_addfilledge(lastv, firstv);
 +              
 +              BLI_edgefill(0, 0);
 +              for (f=fillfacebase.first; f; f=f->next) {
 +                      BLI_array_growone(mf);
 +                      BLI_array_growone(origIndex);
 +
 +                      /*these are loop indices, they'll be transformed
 +                        into vert indices later.*/
 +                      mf[k].v1 = f->v1->keyindex;
 +                      mf[k].v2 = f->v2->keyindex;
 +                      mf[k].v3 = f->v3->keyindex;
 +                      mf[k].mat_nr = mp->mat_nr;
 +                      mf[k].flag = mp->flag;
 +                      origIndex[k] = use_face_origindex ? k : f->v1->tmp.l;
 +
 +                      k++;
 +              }
 +
 +              BLI_end_edgefill();
 +      }
 +
 +      CustomData_free(fdata, totface);
 +      memset(fdata, 0, sizeof(CustomData));
 +      totface = k;
 +      
 +      CustomData_add_layer(fdata, CD_MFACE, CD_ASSIGN, mf, totface);
 +      CustomData_add_layer(fdata, CD_ORIGINDEX, CD_ASSIGN, origIndex, totface);
 +      CustomData_from_bmeshpoly(fdata, pdata, ldata, totface);
 +
 +      mface = mf;
 +      for (i=0; i<totface; i++, mf++) {
 +              /*ensure winding is correct*/
 +              if (mf->v1 > mf->v2) {
 +                      SWAP(int, mf->v1, mf->v2);
 +              }
 +              if (mf->v2 > mf->v3) {
 +                      SWAP(int, mf->v2, mf->v3);
 +              }
 +              if (mf->v1 > mf->v2) {
 +                      SWAP(int, mf->v1, mf->v2);
 +              }
 +
 +              lindex[0] = mf->v1;
 +              lindex[1] = mf->v2;
 +              lindex[2] = mf->v3;
 +
 +              /*transform loop indices to vert indices*/
 +              mf->v1 = mloop[mf->v1].v;
 +              mf->v2 = mloop[mf->v2].v;
 +              mf->v3 = mloop[mf->v3].v;
 +
 +              mesh_loops_to_corners(fdata, ldata, pdata,
 +                      lindex, i, origIndex[i], numTex, numCol);
 +      }
 +
 +      return totface;
 +}
 +
 +/*
 + * COMPUTE POLY NORMAL
 + *
 + * Computes the normal of a planar 
 + * polygon See Graphics Gems for 
 + * computing newell normal.
 + *
 +*/
 +static void mesh_calc_ngon_normal(MPoly *mpoly, MLoop *loopstart, 
 +                                MVert *mvert, float *normal)
 +{
 +
 +      MVert *v1, *v2, *v3;
 +      double u[3],  v[3], w[3];
 +      double n[3] = {0.0, 0.0, 0.0}, l;
 +      int i, s=0;
 +
 +      for(i = 0; i < mpoly->totloop; i++){
 +              v1 = mvert + loopstart[i].v;
 +              v2 = mvert + loopstart[(i+1)%mpoly->totloop].v;
 +              v3 = mvert + loopstart[(i+2)%mpoly->totloop].v;
 +              
 +              VECCOPY(u, v1->co);
 +              VECCOPY(v, v2->co);
 +              VECCOPY(w, v3->co);
 +
 +              /*this fixes some weird numerical error*/
 +              if (i==0) {
 +                      u[0] += 0.0001f;
 +                      u[1] += 0.0001f;
 +                      u[2] += 0.0001f;
 +              }
 +              
 +              /* newell's method
 +              
 +              so thats?:
 +              (a[1] - b[1]) * (a[2] + b[2]);
 +              a[1]*b[2] - b[1]*a[2] - b[1]*b[2] + a[1]*a[2]
 +
 +              odd.  half of that is the cross product. . .what's the
 +              other half?
 +
 +              also could be like a[1]*(b[2] + a[2]) - b[1]*(a[2] - b[2])
 +              */
 +
 +              n[0] += (u[1] - v[1]) * (u[2] + v[2]);
 +              n[1] += (u[2] - v[2]) * (u[0] + v[0]);
 +              n[2] += (u[0] - v[0]) * (u[1] + v[1]);
 +      }
 +      
 +      l = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
 +      l = sqrt(l);
 +
 +      if (l == 0.0) {
 +              normal[0] = 0.0f;
 +              normal[1] = 0.0f;
 +              normal[2] = 1.0f;
 +
 +              return;
 +      } else l = 1.0f / l;
 +
 +      n[0] *= l;
 +      n[1] *= l;
 +      n[2] *= l;
 +      
 +      normal[0] = (float) n[0];
 +      normal[1] = (float) n[1];
 +      normal[2] = (float) n[2];
 +
 +}
 +
 +void mesh_calc_poly_normal(MPoly *mpoly, MLoop *loopstart, 
 +                           MVert *mvarray, float *no)
 +{
 +      if(mpoly->totloop > 4) {
 +              mesh_calc_ngon_normal(mpoly, loopstart, mvarray, no);
 +      }
 +      else if(mpoly->totloop == 3){
 +              MVert *v1, *v2, *v3;
 +
 +              v1 = mvarray + (loopstart++)->v;
 +              v2 = mvarray + (loopstart++)->v;
 +              v3 = mvarray + loopstart->v;
 +              normal_tri_v3( no,v1->co, v2->co, v3->co);
 +      }
 +      else if(mpoly->totloop == 4){
 +              MVert *v1, *v2, *v3, *v4;
 +
 +              v1 = mvarray + (loopstart++)->v;
 +              v2 = mvarray + (loopstart++)->v;
 +              v3 = mvarray + (loopstart++)->v;
 +              v4 = mvarray + loopstart->v;
 +              normal_quad_v3( no,v1->co, v2->co, v3->co, v4->co);
 +      }
 +      else{ /*horrible, two sided face!*/
 +              no[0] = 0.0;
 +              no[1] = 0.0;
 +              no[2] = 1.0;
 +      }
 +}
++
+ /* basic vertex data functions */
+ int minmax_mesh(Mesh *me, float min[3], float max[3])
+ {
+       int i= me->totvert;
+       MVert *mvert;
+       for(mvert= me->mvert; i--; mvert++) {
+               DO_MINMAX(mvert->co, min, max);
+       }
+       
+       return (me->totvert != 0);
+ }
+ int mesh_center_median(Mesh *me, float cent[3])
+ {
+       int i= me->totvert;
+       MVert *mvert;
+       zero_v3(cent);
+       for(mvert= me->mvert; i--; mvert++) {
+               add_v3_v3(cent, mvert->co);
+       }
+       mul_v3_fl(cent, 1.0f/(float)me->totvert);
+       return (me->totvert != 0);
+ }
+ int mesh_center_bounds(Mesh *me, float cent[3])
+ {
+       float min[3], max[3];
+       INIT_MINMAX(min, max);
+       if(minmax_mesh(me, min, max)) {
+               mid_v3_v3v3(cent, min, max);
+               return 1;
+       }
+       return 0;
+ }
+ void mesh_translate(Mesh *me, float offset[3], int do_keys)
+ {
+       int i= me->totvert;
+       MVert *mvert;
+       for(mvert= me->mvert; i--; mvert++) {
+               add_v3_v3(mvert->co, offset);
+       }
+       
+       if (do_keys && me->key) {
+               KeyBlock *kb;
+               for (kb=me->key->block.first; kb; kb=kb->next) {
+                       float *fp= kb->data;
+                       for (i= kb->totelem; i--; fp+=3) {
+                               add_v3_v3(fp, offset);
+                       }
+               }
+       }
+ }
@@@ -1846,49 -1838,38 +1839,49 @@@ static void give_parvert(Object *par, i
        
        if(par->type==OB_MESH) {
                Mesh *me= par->data;
 +              em = me->edit_btmesh;
+               DerivedMesh *dm;
  
 -              em = BKE_mesh_get_editmesh(me);
 +              if(em) {
 +                      BMVert *eve;
 +                      BMIter iter;
 +
 +                      BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
 +                              int *keyindex = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
 +                              
 +                              if(keyindex && *keyindex==nr) {
 +                                      memcpy(vec, eve->co, sizeof(float)*3);
 +                                      break;
 +                              }
 +                      }
 +              }
-               else {
-                       DerivedMesh *dm = par->derivedFinal;
++
+               dm = (em)? em->derivedFinal: par->derivedFinal;
                        
-                       if(dm) {
-                               MVert *mvert= dm->getVertArray(dm);
-                               int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
-                               int i, count = 0, vindex, numVerts = dm->getNumVerts(dm);
-                               /* get the average of all verts with (original index == nr) */
-                               for(i = 0; i < numVerts; i++) {
-                                       vindex= (index)? index[i]: i;
-                                       if(vindex == nr) {
-                                               add_v3_v3(vec, mvert[i].co);
-                                               count++;
-                                       }
-                               }
+               if(dm) {
+                       MVert *mvert= dm->getVertArray(dm);
+                       int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
+                       int i, count = 0, vindex, numVerts = dm->getNumVerts(dm);
+                       /* get the average of all verts with (original index == nr) */
+                       for(i = 0; i < numVerts; i++) {
+                               vindex= (index)? index[i]: i;
  
-                               if (count==0) {
-                                       /* keep as 0,0,0 */
-                               } else if(count > 0) {
-                                       mul_v3_fl(vec, 1.0f / count);
-                               } else {
-                                       /* use first index if its out of range */
-                                       dm->getVertCo(dm, 0, vec);
+                               if(vindex == nr) {
+                                       add_v3_v3(vec, mvert[i].co);
+                                       count++;
                                }
                        }
+                       if (count==0) {
+                               /* keep as 0,0,0 */
+                       } else if(count > 0) {
+                               mul_v3_fl(vec, 1.0f / count);
+                       } else {
+                               /* use first index if its out of range */
+                               dm->getVertCo(dm, 0, vec);
+                       }
                }
 -
 -              if(em)
 -                      BKE_mesh_end_editmesh(me, em);
        }
        else if (ELEM(par->type, OB_CURVE, OB_SURF)) {
                Nurb *nu;
@@@ -2527,7 -2505,7 +2517,7 @@@ void object_handle_update(Scene *scene
                        
                        /* includes all keys and modifiers */
                        if(ob->type==OB_MESH) {
-                               BMEditMesh *em = ((Mesh*)ob->data)->edit_btmesh;
 -                              EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
++                              BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
                                
                                /* evaluate drivers */
                                // XXX: should we push this to derivedmesh instead?
@@@ -46,7 -49,7 +49,8 @@@
  #include "BLI_kdtree.h"
  #include "BLI_rand.h"
  #include "BLI_threads.h"
 +#include "BLI_cellalloc.h"
+ #include "BLI_math.h"
  
  #include "BKE_anim.h"
  #include "BKE_animsys.h"
@@@ -376,10 -382,8 +382,8 @@@ void sound_move_scene_sound(struct Scen
  
  void sound_start_play_scene(struct Scene *scene)
  {
-       AUD_Sound* sound;
-       sound = AUD_loopSound(scene->sound_scene);
-       scene->sound_scene_handle = AUD_play(sound, 1);
-       AUD_unload(sound);
+       scene->sound_scene_handle = AUD_play(scene->sound_scene, 1);
 -      AUD_setLoop(scene->sound_scene_handle, -1);
++      AUD_setLoop(scene->sound_scene_handle, -1, 0);
  }
  
  void sound_play_scene(struct Scene *scene)
@@@ -437,6 -439,10 +439,10 @@@ void sound_seek_scene(struct bContext *
                else
                        AUD_seek(scene->sound_scene_handle, CFRA / FPS);
                AUD_resume(scene->sound_scene_handle);
 -              else
 -                      scene->sound_scrub_handle = AUD_pauseAfter(scene->sound_scene_handle, 1 / FPS);
+               if(AUD_getStatus(scene->sound_scrub_handle) != AUD_STATUS_INVALID)
+                       AUD_seek(scene->sound_scrub_handle, 0);
++              //XXX merge EEK! else
++                      //scene->sound_scrub_handle = AUD_pauseAfter(scene->sound_scene_handle, 1 / FPS);
        }
        else
        {
  
  #include "CCGSubSurf.h"
  
 -static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v);
 -static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e);
 -static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f);
 +static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 +                                         int drawInteriorEdges,
 +                                         int useSubsurfUv,
 +                                         DerivedMesh *dm);
  
+ static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm);
  ///
  
  static void *arena_alloc(CCGAllocatorHDL a, int numBytes) {
index c5cba0c,0000000..d2aa7f9
mode 100644,000000..100644
--- /dev/null
@@@ -1,50 -1,0 +1,51 @@@
- void *BLI_cellalloc_dupalloc(void *mem);
 +/**
 + *
 + * ***** 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) 2008 by Blender Foundation.
 + * All rights reserved.
 + *
 + * The Original Code is: all of this file.
 + *
 + * Contributor(s): none yet.
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +/*
 +      I wrote this as a hack so vgroups won't be quite so slow.  I really
 +      should replace it with something else, but I need to spend some time
 +      thinking as to what the proper solution would be (other then totally
 +      rewriting vgroups, of course).
 +
 +      this is just a simple allocator that spawns mempools for unique size
 +      requests.  hardly ideal, I know.  *something* like this may be
 +      unavoidable, but it should certainly be possible to make it
 +      non-global and internal to the vgroup code.
 +
 +      -joeedh sep. 17 2009
 +*/
 +
 +//BMESH_TODO: kill this library before merging with trunk.  it's evil! -joeedh
++
 +void *BLI_cellalloc_malloc(long size, char *tag);
 +void *BLI_cellalloc_calloc(long size, char *tag);
 +void BLI_cellalloc_free(void *mem);
 +void BLI_cellalloc_printleaks(void);
 +int BLI_cellalloc_get_totblock(void);
 +void BLI_cellalloc_destroy(void);
++void *BLI_cellalloc_dupalloc(void *mem);
  #ifndef BLI_GHASH_H
  #define BLI_GHASH_H
  
- #include "stdio.h"
- #include "stdlib.h"
- #include "string.h"
 -#ifdef __cplusplus
 -extern "C" {
 -#endif
 -
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
  
 +#ifdef __cplusplus
 +extern "C" {
 +#endif
 +
  #include "BKE_utildefines.h"
 +#include "MEM_guardedalloc.h"
  
  #include "BLI_mempool.h"
  #include "BLI_blenlib.h"
Simple merge
Simple merge
@@@ -145,8 -138,8 +145,8 @@@ struct mem_elements 
  static void *new_mem_element(int size)
  {
        int blocksize= 16384;
-       static int offs= 0;             /* the current free adress */
+       static int offs= 0;             /* the current free address */
 -      static struct mem_elements *cur= 0;
 +      static struct mem_elements *cur= 0, *first;
        static ListBase lb= {0, 0};
        void *adr;
        
  #include "DNA_smoke_types.h"
  #include "DNA_sound_types.h"
  #include "DNA_space_types.h"
- #include "DNA_texture_types.h"
- #include "DNA_userdef_types.h"
  #include "DNA_vfont_types.h"
  #include "DNA_world_types.h"
- #include "DNA_windowmanager_types.h"
  
  #include "MEM_guardedalloc.h"
  #include "BLI_blenlib.h"
  #include "BLI_math.h"
 +#include "BLI_cellalloc.h"
 +#include "BLI_edgehash.h"
  
  #include "BKE_anim.h"
  #include "BKE_action.h"
@@@ -3464,10 -3282,8 +3451,11 @@@ static void direct_link_mesh(FileData *
        mesh->mcol= newdataadr(fd, mesh->mcol);
        mesh->msticky= newdataadr(fd, mesh->msticky);
        mesh->dvert= newdataadr(fd, mesh->dvert);
 -      
 +      mesh->mloopcol= newdataadr(fd, mesh->mloopcol);
 +      mesh->mloopuv= newdataadr(fd, mesh->mloopuv);
 +      mesh->mtpoly= newdataadr(fd, mesh->mtpoly);
 +
+       /* animdata */
        mesh->adt= newdataadr(fd, mesh->adt);
        direct_link_animdata(fd, mesh->adt);
  
  //#include "BIF_interface.h"
  //#include "BIF_toolbox.h"
  //#include "BIF_graphics.h"
- #include "BIF_gl.h"
  
- #include "BKE_global.h"
- #include "BKE_utildefines.h"
- #include "BKE_customdata.h"
 +#include "BKE_mesh.h"
  
  //#include "blendef.h"
  
@@@ -5638,7 -6374,7 +6374,7 @@@ static void *undo_check_lastsel(void *l
        return NULL;
  }
  
--static void undoCurve_to_editCurve(void *ucu, void *cue)
++static void undoCurve_to_editCurve(void *ucu, void *cue, void *obdata)
  {
        Curve *cu= cue;
        UndoCurve *undoCurve= ucu;
        cu->lastsel= lastsel;
  }
  
 -static void *editCurve_to_undoCurve(void *cue)
 +static void *editCurve_to_undoCurve(void *lbe, void *cue)
  {
        Curve *cu= cue;
-       ListBase *nubase= cu->editnurb;
+       ListBase *nubase= ED_curve_editnurbs(cu);
        UndoCurve *undoCurve;
+       EditNurb *editnurb= cu->editnurb, tmpEditnurb;
        Nurb *nu, *newnu;
        void *lastsel= NULL;
  
@@@ -4,6 -4,6 +4,6 @@@ Import ('env'
  sources = env.Glob('*.c')
  
  incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
 -incs += ' #/intern/guardedalloc'
 +incs += ' ../../bmesh #/intern/guardedalloc'
  
- env.BlenderLib ( 'bf_editor_datafiles', sources, Split(incs), [], libtype=['core'], priority=[135] )
+ env.BlenderLib ( 'bf_editor_datafiles', sources, Split(incs), [], libtype=['core'], priority=[235] )
@@@ -61,20 -54,18 +61,21 @@@ struct UvMapVert
  struct Material;
  struct Object;
  struct rcti;
++struct wmOperator;
  
 -#define EM_FGON_DRAW  1 // face flag
 -#define EM_FGON                       2 // edge and face flag both
 +// edge and face flag both
 +#define EM_FGON               2
 +// face flag
 +#define EM_FGON_DRAW  1
  
  /* editbutflag */
 -#define B_CLOCKWISE                   1
 -#define B_KEEPORIG                    2
 -#define B_BEAUTY                      4
 -#define B_SMOOTH                      8
 -#define B_BEAUTY_SHORT        0x10
 -#define B_AUTOFGON                    0x20
 -#define B_KNIFE                               0x80
 +#define B_CLOCKWISE           1
 +#define B_KEEPORIG            2
 +#define B_BEAUTY              4
 +#define B_SMOOTH              8
 +#define B_BEAUTY_SHORT        16
 +#define B_AUTOFGON            32
 +#define B_KNIFE                       0x80
  #define B_PERCENTSUBD         0x40
  //#define B_MESH_X_MIRROR             0x100 // deprecated, use mesh
  #define B_JOINTRIA_UV         0x200
  #include "DNA_object_types.h"
  #include "DNA_scene_types.h"
  
- #include "BKE_brush.h"
- #include "BKE_customdata.h"
- #include "BKE_depsgraph.h"
  #include "BKE_DerivedMesh.h"
- #include "BKE_displist.h"
  #include "BKE_global.h"
  #include "BKE_mesh.h"
- #include "BKE_object.h"
- #include "BKE_texture.h"
- #include "BKE_utildefines.h"
- #include "BKE_customdata.h"
  #include "BKE_context.h"
 +#include "BKE_tessmesh.h"
  
  #include "BIF_gl.h"
- #include "BIF_glutil.h"
  
  
  #ifndef DISABLE_PYTHON
  #include "BKE_context.h"
  #include "BKE_depsgraph.h"
  #include "BKE_scene.h"
- #include "BKE_utildefines.h"
  #include "BKE_mesh.h"
 +#include "BKE_tessmesh.h"
 +#include "BKE_depsgraph.h"
  
  #include "BIF_gl.h"
  #include "BIF_glutil.h" /* for paint cursor */
@@@ -54,47 -39,11 +54,48 @@@ struct wmOperator
  
  #define UVCOPY(t, s) memcpy(t, s, 2 * sizeof(float));
  
- int EDBM_CallAndSelectOpf(struct BMEditMesh *em, struct wmOperator *op, char *selslot, char *fmt, ...);
 +/* ******************** bmeshutils.c */
 +
 +/*
 +ok: the EDBM module is for editmode bmesh stuff.  in contrast, the 
 +    BMEdit module is for code shared with blenkernel that concerns
 +    the BMEditMesh structure.
 +*/
 +
 +/*calls a bmesh op, reporting errors to the user, etc*/
 +int EDBM_CallOpf(struct BMEditMesh *em, struct wmOperator *op, char *fmt, ...);
 +
 +/*calls a bmesh op, reporting errors to the user, etc.
 +
 +  selects an output slot specified by selslot*/
++//int EDBM_CallAndSelectOpf(struct BMEditMesh *em, struct wmOperator *op, char *selslot, char *fmt, ...);
++//moved to ED_mesh.h
 +
 +/*same as above, but doesn't report errors.*/
 +int EDBM_CallOpfSilent(struct BMEditMesh *em, char *fmt, ...);
 +
 +/*these next two functions are the split version of EDBM_CallOpf, so you can
 +  do stuff with a bmesh operator, after initializing it but before executing
 +  it.
 +  
 +  execute the operator with BM_Exec_Op*/
 +int EDBM_InitOpf(struct BMEditMesh *em, struct BMOperator *bmop,
 +              struct wmOperator *op, char *fmt, ...);
 +/*cleans up after a bmesh operator*/
 +int EDBM_FinishOp(struct BMEditMesh *em, struct BMOperator *bmop,
 +              struct wmOperator *op, int report);
 +
 +void EDBM_clear_flag_all(struct BMEditMesh *em, int flag);
 +void EDBM_store_selection(struct BMEditMesh *em, void *data);
 +void EDBM_validate_selections(struct BMEditMesh *em);
 +void EDBM_remove_selection(struct BMEditMesh *em, void *data);
 +void EDBM_stats_update(struct BMEditMesh *em);
 +
  /* ******************** editface.c */
  
 -int edgetag_context_check(Scene *scene, EditEdge *eed);
 -void edgetag_context_set(Scene *scene, EditEdge *eed, int val);
 -int edgetag_shortest_path(Scene *scene, EditMesh *em, EditEdge *source, EditEdge *target);
 +int edgetag_context_check(Scene *scene, BMEditMesh *em, BMEdge *eed);
 +void edgetag_context_set(BMEditMesh *em, Scene *scene, BMEdge *eed, int val);
 +int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, BMEdge *target);
  
  /* ******************* editmesh.c */
  
  #include "BKE_main.h"
  #include "BKE_mesh.h"
  #include "BKE_material.h"
- #include "BKE_object.h"
- #include "BKE_utildefines.h"
  #include "BKE_report.h"
 +#include "BKE_tessmesh.h"
  
  #include "BLO_sys_types.h" // for intptr_t support
  
  #include "BKE_material.h"
  #include "BKE_mball.h"
  #include "BKE_mesh.h"
- #include "BKE_nla.h"
  #include "BKE_object.h"
  #include "BKE_paint.h"
- #include "BKE_particle.h"
  #include "BKE_pointcache.h"
  #include "BKE_property.h"
- #include "BKE_report.h"
  #include "BKE_sca.h"
- #include "BKE_scene.h"
  #include "BKE_softbody.h"
- #include "BKE_subsurf.h"
- #include "BKE_texture.h"
- #include "BKE_utildefines.h"
  #include "BKE_modifier.h"
 +#include "BKE_tessmesh.h"
  
  #include "ED_armature.h"
  #include "ED_curve.h"
@@@ -50,8 -50,6 +50,7 @@@
  #include "BKE_object.h"
  #include "BKE_report.h"
  #include "BKE_scene.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "RNA_define.h"
  #include "RNA_access.h"
@@@ -352,24 -361,24 +361,24 @@@ typedef struct UndoLattice 
        int pntsu, pntsv, pntsw;
  } UndoLattice;
  
 -static void undoLatt_to_editLatt(void *data, void *edata)
 +static void undoLatt_to_editLatt(void *data, void *edata, void *obdata)
  {
        UndoLattice *ult= (UndoLattice*)data;
-       Lattice *editlatt= (Lattice *)edata;
-       int a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
+       EditLatt *editlatt= (EditLatt *)edata;
+       int a= editlatt->latt->pntsu*editlatt->latt->pntsv*editlatt->latt->pntsw;
  
-       memcpy(editlatt->def, ult->def, a*sizeof(BPoint));
+       memcpy(editlatt->latt->def, ult->def, a*sizeof(BPoint));
  }
  
 -static void *editLatt_to_undoLatt(void *edata)
 +static void *editLatt_to_undoLatt(void *edata, void *obdata)
  {
        UndoLattice *ult= MEM_callocN(sizeof(UndoLattice), "UndoLattice");
-       Lattice *editlatt= (Lattice *)edata;
+       EditLatt *editlatt= (EditLatt *)edata;
        
-       ult->def= MEM_dupallocN(editlatt->def);
-       ult->pntsu= editlatt->pntsu;
-       ult->pntsv= editlatt->pntsv;
-       ult->pntsw= editlatt->pntsw;
+       ult->def= MEM_dupallocN(editlatt->latt->def);
+       ult->pntsu= editlatt->latt->pntsu;
+       ult->pntsv= editlatt->latt->pntsv;
+       ult->pntsw= editlatt->latt->pntsw;
        
        return ult;
  }
@@@ -68,8 -69,6 +69,7 @@@
  #include "BKE_sca.h"
  #include "BKE_scene.h"
  #include "BKE_texture.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "WM_api.h"
  #include "WM_types.h"
@@@ -98,10 -97,10 +98,11 @@@ static int vertex_parent_set_poll(bCont
  
  static int vertex_parent_set_exec(bContext *C, wmOperator *op)
  {
+       Main *bmain= CTX_data_main(C);
        Scene *scene= CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
 -      EditVert *eve;
 +      BMVert *eve;
 +      BMIter iter;
        Curve *cu;
        Nurb *nu;
        BezTriple *bezt;
@@@ -1164,14 -1180,14 +1177,14 @@@ static int make_links_scene_exec(bConte
        {
                if(!object_in_scene(base->object, scene_to)) {
                        Base *nbase= MEM_mallocN( sizeof(Base), "newbase");
 -                      *nbase= *base;
 +                                      *nbase= *base;
                        BLI_addhead( &(scene_to->base), nbase);
 -                      id_us_plus((ID *)base->object);
 -              }
 -      }
 +                                      id_us_plus((ID *)base->object);
 +                              }
 +                      }
        CTX_DATA_END;
  
-       DAG_ids_flush_update(0);
+       DAG_ids_flush_update(bmain, 0);
  
        /* one day multiple scenes will be visible, then we should have some update function for them */
        return OPERATOR_FINISHED;
@@@ -47,8 -47,6 +47,7 @@@
  #include "BKE_mesh.h"
  #include "BKE_object.h"
  #include "BKE_report.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "RNA_define.h"
  #include "RNA_access.h"
@@@ -710,69 -706,63 +707,66 @@@ static int object_origin_set_exec(bCont
  {
        Main *bmain= CTX_data_main(C);
        Scene *scene= CTX_data_scene(C);
-       ScrArea *sa= CTX_wm_area(C);
-       View3D *v3d= sa->spacedata.first;
        Object *obedit= CTX_data_edit_object(C);
-       Mesh *me, *tme;
-       Curve *cu;
- /*    BezTriple *bezt;
-       BPoint *bp; */
-       Nurb *nu, *nu1;
-       float cent[3], centn[3], min[3], max[3], omat[3][3];
-       int a, total= 0;
-       int centermode = RNA_enum_get(op->ptr, "type"); 
+       Object *tob;
+       float cursor[3], cent[3], cent_neg[3], centn[3], min[3], max[3];
+       int centermode = RNA_enum_get(op->ptr, "type");
+       int around = RNA_enum_get(op->ptr, "center"); /* initialized from v3d->around */
        /* keep track of what is changed */
        int tot_change=0, tot_lib_error=0, tot_multiuser_arm_error=0;
-       MVert *mvert;
  
-       if(scene->id.lib || v3d==NULL){
-               BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed on Lib data");
-                return OPERATOR_CANCELLED;
-       }
-       if (obedit && centermode > 0) {
+       if (obedit && centermode != GEOMETRY_TO_ORIGIN) {
                BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed in EditMode");
                return OPERATOR_CANCELLED;
-       }       
-       cent[0]= cent[1]= cent[2]= 0.0; 
-       
+       }
+       else {
+               /* get the view settings if 'around' isnt set and the view is available */
+               View3D *v3d= CTX_wm_view3d(C);
+               copy_v3_v3(cursor, give_cursor(scene, v3d));
+               if(v3d && !RNA_property_is_set(op->ptr, "around"))
+                       around= v3d->around;
+       }
 -
+       zero_v3(cent);
        if(obedit) {
--              INIT_MINMAX(min, max);
-       
 -
--              if(obedit->type==OB_MESH) {
++          INIT_MINMAX(min, max);
++          
++          if(obedit->type==OB_MESH) {
                        Mesh *me= obedit->data;
 -                      EditMesh *em = BKE_mesh_get_editmesh(me);
 -                      EditVert *eve;
 -
 -                      if(around==V3D_CENTROID) {
 -                              int total= 0;
 -                              for(eve= em->verts.first; eve; eve= eve->next) {
 -                                      total++;
 -                                      add_v3_v3(cent, eve->co);
 -                              }
 -                              mul_v3_fl(cent, 1.0f/(float)total);
 -                      }
 -                      else {
 -                              for(eve= em->verts.first; eve; eve= eve->next) {
 -                                      DO_MINMAX(eve->co, min, max);
 +                      BMEditMesh *em = me->edit_btmesh;
 +                      BMVert *eve;
 +                      BMIter iter;
-                       BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
-                               if(v3d->around==V3D_CENTROID) {
-                                       total++;
-                                       VECADD(cent, cent, eve->co);
-                               }
-                               else {
-                                       DO_MINMAX(eve->co, min, max);
-                               }
-                       }
++                      int total = 0;
 +                      
-                       if(v3d->around==V3D_CENTROID) {
-                               mul_v3_fl(cent, 1.0f/(float)total);
-                       }
-                       else {
-                               cent[0]= (min[0]+max[0])/2.0f;
-                               cent[1]= (min[1]+max[1])/2.0f;
-                               cent[2]= (min[2]+max[2])/2.0f;
++                      if(centermode == ORIGIN_TO_CURSOR) {
++                              copy_v3_v3(cent, cursor);
++                              invert_m4_m4(obedit->imat, obedit->obmat);
++                              mul_m4_v3(obedit->imat, cent);
++                      } else {
++                              BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
++                                      if(around==V3D_CENTROID) {
++                                              total++;
++                                              add_v3_v3(cent, eve->co);
++                                              mul_v3_fl(cent, 1.0f/(float)total);
++                                      }
++                                      else {
++                                              DO_MINMAX(eve->co, min, max);
++                                              mid_v3_v3v3(cent, min, max);
++                                      }
+                               }
 -                              mid_v3_v3v3(cent, min, max);
                        }
 -
 -                      for(eve= em->verts.first; eve; eve= eve->next) {
 +                      
 +                      BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
-                               sub_v3_v3(eve->co, cent);                       
+                               sub_v3_v3(eve->co, cent);
                        }
-                       
 -
 -                      recalc_editnormals(em);
++      
 +                      EDBM_RecalcNormals(em);
                        tot_change++;
                        DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
 -                      BKE_mesh_end_editmesh(me, em);
--              }
++          }
        }
-       
        /* reset flags */
        CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
                        ob->flag &= ~OB_DONE;
  #include "BKE_customdata.h"
  #include "BKE_deform.h"
  #include "BKE_depsgraph.h"
- #include "BKE_DerivedMesh.h"
- #include "BKE_displist.h"
  #include "BKE_global.h"
- #include "BKE_lattice.h"
  #include "BKE_mesh.h"
- #include "BKE_paint.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  #include "BKE_report.h"
  
  #include "RNA_access.h"
@@@ -52,9 -52,7 +52,8 @@@
  #include "BKE_report.h"
  #include "BKE_scene.h"
  #include "BKE_texture.h"
- #include "BKE_utildefines.h"
  #include "BKE_world.h"
 +#include "BKE_tessmesh.h"
  
  #include "IMB_imbuf.h"
  #include "IMB_imbuf_types.h"
@@@ -369,10 -383,9 +386,10 @@@ static int material_slot_de_select(bCon
                        else
                                EM_deselect_by_material(em, ob->actcol-1);
                }
 +*/
        }
        else if ELEM(ob->type, OB_CURVE, OB_SURF) {
-               ListBase *editnurb= ((Curve*)ob->data)->editnurb;
+               ListBase *nurbs= ED_curve_editnurbs((Curve*)ob->data);
                Nurb *nu;
                BPoint *bp;
                BezTriple *bezt;
@@@ -53,9 -48,6 +48,7 @@@
  #include "BKE_report.h"
  #include "BKE_scene.h"
  #include "BKE_screen.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  #include "BKE_sound.h"
  
  #include "WM_api.h"
@@@ -2570,22 -2547,22 +2540,22 @@@ int ED_screen_animation_play(bContext *
                /* timeline gets special treatment since it has it's own menu for determining redraws */
                if ((sa) && (sa->spacetype == SPACE_TIME)) {
                        SpaceTime *stime= (SpaceTime *)sa->spacedata.first;
+                       
                        ED_screen_animation_timer(C, stime->redraws, refresh, sync, mode);
+                       
                        /* update region if TIME_REGION was set, to leftmost 3d window */
                        ED_screen_animation_timer_update(screen, stime->redraws, refresh);
 -              }
 +                      }
                else {
                        int redraws = TIME_REGION|TIME_ALL_3D_WIN;
+                       
                        /* XXX - would like a better way to deal with this situation - Campbell */
-                       if((!sa) || (sa->spacetype == SPACE_SEQ)) {
+                       if ((!sa) || (sa->spacetype == SPACE_SEQ)) {
                                redraws |= TIME_SEQ;
                        }
+                       
                        ED_screen_animation_timer(C, redraws, refresh, sync, mode);
+                       
                        if(screen->animtimer) {
                                wmTimer *wt= screen->animtimer;
                                ScreenAnimData *sad= wt->customdata;
@@@ -4653,11 -4654,9 +4654,11 @@@ static int texture_paint_init(bContext 
        if(pop->mode == PAINT_MODE_3D && (pop->s.tool == PAINT_TOOL_CLONE))
                pop->s.tool = PAINT_TOOL_DRAW;
        pop->s.blend = brush->blend;
-       pop->brush_size_orig= brush->size;
+       pop->orig_brush_size= brush_size(brush);
  
        if(pop->mode != PAINT_MODE_2D) {
 +              Mesh *me;
 +
                pop->s.ob = OBACT;
                pop->s.me = get_mesh(pop->s.ob);
                if (!pop->s.me) return 0;
  
  #include "MEM_guardedalloc.h"
  
- #include "IMB_imbuf.h"
- #include "IMB_imbuf_types.h"
  #include "BLI_blenlib.h"
  #include "BLI_math.h"
 +#include "BLI_memarena.h"
 +#include "BLI_cellalloc.h"
  #include "BLI_ghash.h"
  
+ #include "IMB_imbuf.h"
+ #include "IMB_imbuf_types.h"
  #include "DNA_armature_types.h"
  #include "DNA_mesh_types.h"
  #include "DNA_particle_types.h"
@@@ -1964,7 -1880,7 +1970,7 @@@ static void vpaint_stroke_update_step(b
                        
        /* which faces are involved */
        if(vp->flag & VP_AREA) {
-               totindex= sample_backbuf_area(vc, indexar, me->totpoly, mval[0], mval[1], brush->size);
 -              totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush_size(brush));
++              totindex= sample_backbuf_area(vc, indexar, me->totpoly, mval[0], mval[1], brush_size(brush));
        }
        else {
                indexar[0]= view3d_sample_backbuf(vc, mval[0], mval[1]);
@@@ -270,15 -262,6 +265,15 @@@ int sculpt_get_redraw_rect(ARegion *ar
        float bb_min[3], bb_max[3], pmat[4][4];
        int i, j, k;
  
-       if (G.rt == 1) {
++/*    if (G.rt == 1) {
 +              rect->xmin = cache->prect.xmin;
 +              rect->xmax = cache->prect.xmax;
 +              rect->ymin = cache->prect.ymin;
 +              rect->ymax = cache->prect.ymax;
 +
 +              return rect->xmin < rect->xmax && rect->ymin < rect->ymax;;
 +      }
++*/
        view3d_get_object_project_mat(rv3d, ob, pmat);
  
        if(!pbvh)
  #include "BKE_context.h"
  #include "BKE_customdata.h"
  #include "BKE_image.h"
- #include "BKE_global.h"
- #include "BKE_library.h"
- #include "BKE_main.h"
  #include "BKE_mesh.h"
  #include "BKE_node.h"
- #include "BKE_packedFile.h"
- #include "BKE_paint.h"
  #include "BKE_screen.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "RE_pipeline.h"
  
  #include "BLI_editVert.h"
  
  #include "BKE_context.h"
- #include "BKE_customdata.h"
- #include "BKE_image.h"
- #include "BKE_mesh.h"
- #include "BKE_screen.h"
- #include "BKE_utildefines.h"
 +#include "BKE_mesh.h"
  
  
  #include "ED_image.h"
  #include "MEM_guardedalloc.h"
  
  #include "DNA_object_types.h"
+ #include "DNA_node_types.h"
  #include "DNA_packedFile_types.h"
  #include "DNA_scene_types.h"
 +#include "DNA_meshdata_types.h"
  
  #include "BKE_colortools.h"
  #include "BKE_context.h"
  #include "BKE_image.h"
  #include "BKE_mesh.h"
  #include "BKE_screen.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
- #include "IMB_imbuf.h"
  #include "IMB_imbuf_types.h"
  
  #include "ED_mesh.h"
  #include <string.h>
  #include <stdio.h>
  
- #include "DNA_object_types.h"
 +#include "DNA_meshdata_types.h"
  
- #include "MEM_guardedalloc.h"
  
  #include "BLI_blenlib.h"
  #include "BLI_math.h"
  #include "DNA_scene_types.h"
  #include "DNA_screen_types.h"
  #include "DNA_view3d_types.h"
 +#include "DNA_windowmanager_types.h"
+ #include "DNA_object_types.h"
  
- #include "BKE_bmfont.h"
- #include "BKE_displist.h"
  #include "BKE_DerivedMesh.h"
  #include "BKE_effect.h"
- #include "BKE_global.h"
  #include "BKE_image.h"
- #include "BKE_main.h"
  #include "BKE_material.h"
- #include "BKE_mesh.h"
- #include "BKE_object.h"
  #include "BKE_paint.h"
  #include "BKE_property.h"
  #include "BKE_utildefines.h"
  #include "BKE_paint.h"
  #include "BKE_particle.h"
  #include "BKE_pointcache.h"
- #include "BKE_property.h"
- #include "BKE_softbody.h"
- #include "BKE_smoke.h"
  #include "BKE_unit.h"
  #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
 +
  #include "smoke_API.h"
  
  #include "BIF_gl.h"
  #include "BKE_curve.h"
  #include "BKE_customdata.h"
  #include "BKE_depsgraph.h"
- #include "BKE_idprop.h"
+ #include "BKE_main.h"
  #include "BKE_mesh.h"
- #include "BKE_object.h"
- #include "BKE_global.h"
- #include "BKE_scene.h"
  #include "BKE_screen.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  #include "BKE_deform.h"
  
- #include "BIF_gl.h"
  
  #include "WM_api.h"
  #include "WM_types.h"
  #include "BKE_paint.h"
  #include "BKE_report.h"
  #include "BKE_scene.h"
- #include "BKE_screen.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  
  #include "BIF_gl.h"
  #include "BKE_mesh.h"
  #include "BKE_modifier.h"
  #include "BKE_paint.h"
- #include "BKE_particle.h"
  #include "BKE_screen.h"
- #include "BKE_utildefines.h" /* for VECCOPY */
 +#include "BKE_tessmesh.h"
  
  #include "ED_mesh.h"
  #include "ED_util.h"
  #include "BLI_rand.h"
  #include "BLI_linklist.h"
  
- #include "BKE_action.h"
  #include "BKE_context.h"
- #include "BKE_depsgraph.h"
- #include "BKE_object.h"
- #include "BKE_global.h"
  #include "BKE_paint.h"
- #include "BKE_scene.h"
- #include "BKE_screen.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
 +#include "RE_pipeline.h"      // make_stars
  
  #include "BIF_gl.h"
  
  
  #include "MEM_guardedalloc.h"
  
 +#include "DNA_action_types.h"
  #include "DNA_armature_types.h"
  #include "DNA_curve_types.h"
 +#include "DNA_group_types.h"
 +#include "DNA_ipo_types.h"
  #include "DNA_lattice_types.h"
  #include "DNA_meta_types.h"
 +#include "DNA_mesh_types.h"
 +#include "DNA_modifier_types.h"
 +#include "DNA_object_types.h"
 +#include "DNA_screen_types.h"
  #include "DNA_scene_types.h"
 +#include "DNA_space_types.h"
 +#include "DNA_view3d_types.h"
+ #include "DNA_object_types.h"
  
  #include "BLI_blenlib.h"
  #include "BLI_math.h"
  #include "BLI_editVert.h"
  #include "BLI_linklist.h"
  
- #include "BKE_action.h"
- #include "BKE_anim.h"
- #include "BKE_context.h"
  #include "BKE_armature.h"
+ #include "BKE_context.h"
  #include "BKE_curve.h"
  #include "BKE_depsgraph.h"
- #include "BKE_DerivedMesh.h"
- #include "BKE_displist.h"
- #include "BKE_global.h"
  #include "BKE_lattice.h"
- #include "BKE_mesh.h"
- #include "BKE_modifier.h"
+ #include "BKE_main.h"
  #include "BKE_object.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "WM_api.h"
  #include "WM_types.h"
@@@ -80,7 -60,7 +74,8 @@@
  #include "ED_armature.h"
  #include "ED_mesh.h"
  #include "ED_screen.h"
 +#include "ED_view3d.h"
+ #include "ED_curve.h" /* for ED_curve_editnurbs */
  
  #include "view3d_intern.h"
  
@@@ -321,18 -284,19 +317,19 @@@ static void make_trans_verts(Object *ob
        else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
                Curve *cu= obedit->data;
                int totmalloc= 0;
-               
-               for(nu= cu->editnurb->first; nu; nu= nu->next) {
+               ListBase *nurbs= ED_curve_editnurbs(cu);
+               for(nu= nurbs->first; nu; nu= nu->next) {
 -                      if(nu->type == CU_BEZIER)
 +                      if((nu->type & 7)==CU_BEZIER)
                                totmalloc += 3*nu->pntsu;
                        else
                                totmalloc += nu->pntsu*nu->pntsv;
                }
                tv=transvmain= MEM_callocN(totmalloc*sizeof(TransVert), "maketransverts curve");
  
-               nu= cu->editnurb->first;
+               nu= nurbs->first;
                while(nu) {
 -                      if(nu->type == CU_BEZIER) {
 +                      if((nu->type & 7)==CU_BEZIER) {
                                a= nu->pntsu;
                                bezt= nu->bezt;
                                while(a--) {
@@@ -900,183 -864,20 +892,183 @@@ void VIEW3D_OT_snap_cursor_to_active(wm
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
  }
  
 -/* **************************************************** */
 -/*New Code - Snap Cursor to Center -*/
 -static int snap_curs_to_center(bContext *C, wmOperator *op)
 +/* ************************************** */
 +
 +static int snap_selected_to_center(bContext *C, wmOperator *op)
  {
 +      extern float originmat[3][3];   /* XXX object.c */
 +      Object *obedit= CTX_data_edit_object(C);
        Scene *scene= CTX_data_scene(C);
        View3D *v3d= CTX_wm_view3d(C);
 -      float *curs;
 -      curs= give_cursor(scene, v3d);
 +      TransVert *tv;
 +      float snaploc[3], imat[3][3], bmat[3][3], vec[3], min[3], max[3], centroid[3];
 +      int count, a;
 +
 +      /*calculate the snaplocation (centerpoint) */
 +      count= 0;
 +      INIT_MINMAX(min, max);
 +      centroid[0]= centroid[1]= centroid[2]= 0.0f;
 +      snaploc[0]= snaploc[1]= snaploc[2]= 0.0f;
  
 -      curs[0]= 0.0;
 -      curs[1]= 0.0;
 -      curs[2]= 0.0;
 +      if(obedit) {
 +              tottrans= 0;
 +              
 +              if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL) 
 +                      make_trans_verts(obedit, bmat[0], bmat[1], 0);
 +              if(tottrans==0) return OPERATOR_CANCELLED;
 +              
 +              copy_m3_m4(bmat, obedit->obmat);
 +              invert_m3_m3(imat, bmat);
 +              
 +              tv= transvmain;
 +              for(a=0; a<tottrans; a++, tv++) {
 +                      VECCOPY(vec, tv->loc);
 +                      mul_m3_v3(bmat, vec);
 +                      add_v3_v3v3(vec, vec, obedit->obmat[3]);
 +                      add_v3_v3v3(centroid, centroid, vec);
 +                      DO_MINMAX(vec, min, max);
 +              }
 +              
 +              if(v3d->around==V3D_CENTROID) {
 +                      mul_v3_fl(centroid, 1.0/(float)tottrans);
 +                      VECCOPY(snaploc, centroid);
 +              }
 +              else {
 +                      snaploc[0]= (min[0]+max[0])/2;
 +                      snaploc[1]= (min[1]+max[1])/2;
 +                      snaploc[2]= (min[2]+max[2])/2;
 +              }
 +              
 +              MEM_freeN(transvmain);
 +              transvmain= NULL;
 +      }
 +      else {
 +              
 +              CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
 +                      if(ob->mode & OB_MODE_POSE) {
 +                              bPoseChannel *pchan;
 +                              bArmature *arm= ob->data;
 +                              
 +                              for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
 +                                      if(pchan->bone->flag & BONE_SELECTED) {
 +                                              if(pchan->bone->layer & arm->layer) {
 +                                                      VECCOPY(vec, pchan->pose_mat[3]);
 +                                                      add_v3_v3v3(centroid, centroid, vec);
 +                                                      DO_MINMAX(vec, min, max);
 +                                                      count++;
 +                                              }
 +                                      }
 +                              }
 +                      }
 +                      else {
 +                              /* not armature bones (i.e. objects) */
 +                              VECCOPY(vec, ob->obmat[3]);
 +                              add_v3_v3v3(centroid, centroid, vec);
 +                              DO_MINMAX(vec, min, max);
 +                              count++;
 +                      }
 +              }
 +              CTX_DATA_END;
 +
 +              if(count) {
 +                      if(v3d->around==V3D_CENTROID) {
 +                              mul_v3_fl(centroid, 1.0/(float)count);
 +                              VECCOPY(snaploc, centroid);
 +                      }
 +                      else {
 +                              snaploc[0]= (min[0]+max[0])/2;
 +                              snaploc[1]= (min[1]+max[1])/2;
 +                              snaploc[2]= (min[2]+max[2])/2;
 +                      }
 +              }
 +      }
 +
 +      /* Snap the selection to the snaplocation (duh!) */
 +      if(obedit) {
 +              tottrans= 0;
 +              
 +              if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL) 
 +                      make_trans_verts(obedit, bmat[0], bmat[1], 0);
 +              if(tottrans==0) return OPERATOR_CANCELLED;
 +              
 +              copy_m3_m4(bmat, obedit->obmat);
 +              invert_m3_m3(imat, bmat);
 +              
 +              tv= transvmain;
 +              for(a=0; a<tottrans; a++, tv++) {
 +                      vec[0]= snaploc[0]-obedit->obmat[3][0];
 +                      vec[1]= snaploc[1]-obedit->obmat[3][1];
 +                      vec[2]= snaploc[2]-obedit->obmat[3][2];
 +                      
 +                      mul_m3_v3(imat, vec);
 +                      VECCOPY(tv->loc, vec);
 +              }
 +              
 +              special_transvert_update(scene, obedit);
 +              
 +              MEM_freeN(transvmain);
 +              transvmain= NULL;
 +              
 +      }
 +      else {
 +
 +              CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
 +                      if(ob->mode & OB_MODE_POSE) {
 +                              bPoseChannel *pchan;
 +                              bArmature *arm= ob->data;
 +                              
 +                              for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
 +                                      if(pchan->bone->flag & BONE_SELECTED) {
 +                                              if(pchan->bone->layer & arm->layer) {
 +                                                      if((pchan->bone->flag & BONE_CONNECTED)==0) { 
 +                                                              /* get location of cursor in bone-space */
 +                                                              armature_loc_pose_to_bone(pchan, snaploc, vec);
 +                                                              
 +                                                              /* calculate new position */
 +                                                              VECCOPY(pchan->loc, vec);
 +                                                      }
 +                                                      /* if the bone has a parent and is connected to the parent, 
 +                                                       * don't do anything - will break chain unless we do auto-ik. 
 +                                                       */
 +                                              }
 +                                      }
 +                              }
 +                              
 +                              /* auto-keyframing */
 +                              ob->pose->flag |= POSE_DO_UNLOCK;
 +// XXX                                autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
 +                              DAG_id_flush_update(ob->data, OB_RECALC_DATA);
 +                      }
 +                      else {
 +                              ob->recalc |= OB_RECALC_OB;
 +                              
 +                              vec[0]= -ob->obmat[3][0] + snaploc[0];
 +                              vec[1]= -ob->obmat[3][1] + snaploc[1];
 +                              vec[2]= -ob->obmat[3][2] + snaploc[2];
 +                              
 +                              if(ob->parent) {
 +                                      where_is_object(scene, ob);
 +                                      
 +                                      invert_m3_m3(imat, originmat);
 +                                      mul_m3_v3(imat, vec);
 +                                      ob->loc[0]+= vec[0];
 +                                      ob->loc[1]+= vec[1];
 +                                      ob->loc[2]+= vec[2];
 +                              }
 +                              else {
 +                                      ob->loc[0]+= vec[0];
 +                                      ob->loc[1]+= vec[1];
 +                                      ob->loc[2]+= vec[2];
 +                              }
 +                              /* auto-keyframing */
 +// XXX                                autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
 +                      }
 +              }
 +              CTX_DATA_END;
 +      }
        
-       DAG_ids_flush_update(0);
 -      WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d);
++      DAG_ids_flush_update(CTX_data_main(C), 0);
 +      WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
        
        return OPERATOR_FINISHED;
  }
@@@ -685,8 -689,8 +689,9 @@@ void view3d_project_float(ARegion *ar, 
  {
        float vec4[4];
        
 +      VECCOPY(vec4, vec);
        adr[0]= IS_CLIPPED;
+       copy_v3_v3(vec4, vec);
        vec4[3]= 1.0;
        
        mul_m4_v4(mat, vec4);
  #include "BKE_particle.h"
  #include "BKE_sequencer.h"
  #include "BKE_pointcache.h"
- #include "BKE_softbody.h"
- #include "BKE_utildefines.h"
  #include "BKE_bmesh.h"
- #include "BKE_context.h"
- #include "BKE_report.h"
 +#include "BKE_tessmesh.h"
  #include "BKE_scene.h"
  
- #include "BIF_gl.h"
  
  #include "ED_anim_api.h"
  #include "ED_armature.h"
  #include "BKE_curve.h"
  #include "BKE_depsgraph.h"
  #include "BKE_displist.h"
- #include "BKE_depsgraph.h"
  #include "BKE_fcurve.h"
- #include "BKE_global.h"
- #include "BKE_group.h"
  #include "BKE_lattice.h"
- #include "BKE_key.h"
  #include "BKE_mesh.h"
- #include "BKE_modifier.h"
  #include "BKE_nla.h"
- #include "BKE_object.h"
- #include "BKE_utildefines.h"
  #include "BKE_context.h"
 +#include "BKE_tessmesh.h"
  
  #include "ED_anim_api.h"
  #include "ED_armature.h"
@@@ -642,31 -638,31 +639,30 @@@ void recalcData(TransInfo *t
                                if(t->state != TRANS_CANCEL) {
                                        clipMirrorModifier(t, t->obedit);
                                }
--
-                       DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA);  /* sets recalc flags */
-                               
-                       if (t->state == TRANS_CANCEL) {
-                               while(nu) {
-                                       calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */
-                                       nu= nu->next;
-                               }
-                       } else {
-                               /* Normal updating */
-                               while(nu) {
-                                       test2DNurb(nu);
-                                       calchandlesNurb(nu);
-                                       nu= nu->next;
 -                              DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA);  /* sets recalc flags */
 -
++#if 0 //XXX - possibly merged out? check if in trunk - joeedh
+                               if (t->state == TRANS_CANCEL) {
+                                       while(nu) {
+                                               calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */
+                                               nu= nu->next;
+                                       }
+                               } else {
+                                       /* Normal updating */
+                                       while(nu) {
+                                               test2DNurb(nu);
+                                               calchandlesNurb(nu);
+                                               nu= nu->next;
+                                       }
                                }
 -                      }
 -                      else if(t->obedit->type==OB_LATTICE) {
++#endif
++                      } else if(t->obedit->type==OB_LATTICE) {
+                               Lattice *la= t->obedit->data;
+                               DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA);  /* sets recalc flags */
+       
+                               if(la->editlatt->latt->flag & LT_OUTSIDE) outside_lattice(la->editlatt->latt);
                        }
-               }
-               else if(t->obedit->type==OB_LATTICE) {
-                       Lattice *la= t->obedit->data;
-                       DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA);  /* sets recalc flags */
-                       if(la->editlatt->flag & LT_OUTSIDE) outside_lattice(la->editlatt);
-               }
-               else if (t->obedit->type == OB_MESH) {
+                       else if (t->obedit->type == OB_MESH) {
 -                              EditMesh *em = ((Mesh*)t->obedit->data)->edit_mesh;
 +                              BMEditMesh *em = ((Mesh*)t->obedit->data)->edit_btmesh;
++
                                /* mirror modifier clipping? */
                                if(t->state != TRANS_CANCEL) {
                                        clipMirrorModifier(t, t->obedit);
                        }
                        else
                                DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA);  /* sets recalc flags */
++      
                }
                else if( (t->flag & T_POSE) && t->poseobj) {
                        Object *ob= t->poseobj;
@@@ -1032,59 -1026,66 +1029,37 @@@ int initTransInfo (bContext *C, TransIn
        {
                if (RNA_property_is_set(op->ptr, "proportional"))
                {
-               switch(RNA_enum_get(op->ptr, "proportional"))
-               {
-               case 2: /* XXX connected constant */
-                       t->flag |= T_PROP_CONNECTED;
-               case 1: /* XXX prop on constant */
-                       t->flag |= T_PROP_EDIT;
-                       break;
+                       switch(RNA_enum_get(op->ptr, "proportional"))
+                       {
+                       case PROP_EDIT_CONNECTED:
+                               t->flag |= T_PROP_CONNECTED;
+                       case PROP_EDIT_ON:
+                               t->flag |= T_PROP_EDIT;
+                               break;
+                       }
                }
 -              else
 -              {
 +      }
 +      else
 +      {
                        /* use settings from scene only if modal */
                        if (t->flag & T_MODAL)
                        {
-                               if ((t->options & CTX_NO_PET) == 0 && (ts->proportional != PROP_EDIT_OFF)) {
-                                       t->flag |= T_PROP_EDIT;
+                               if ((t->options & CTX_NO_PET) == 0)
+                               {
+                                       if (t->obedit && ts->proportional != PROP_EDIT_OFF)
+                                       {
+                                               t->flag |= T_PROP_EDIT;
  
-                                       if(ts->proportional == PROP_EDIT_CONNECTED)
-                                               t->flag |= T_PROP_CONNECTED;
+                                               if(ts->proportional == PROP_EDIT_CONNECTED)
+                                                       t->flag |= T_PROP_CONNECTED;
+                                       }
+                                       else if (t->obedit == NULL && ts->proportional_objects)
+                                       {
+                                               t->flag |= T_PROP_EDIT;
+                                       }
                                }
 -                      }
 -              }
 -              
 -              if (op && RNA_struct_find_property(op->ptr, "proportional_size") && RNA_property_is_set(op->ptr, "proportional_size"))
 -              {
 -                      t->prop_size = RNA_float_get(op->ptr, "proportional_size");
 -              }
 -              else
 -              {
 -                      t->prop_size = ts->proportional_size;
 -              }
 -              
 -              
 -              /* TRANSFORM_FIX_ME rna restrictions */
 -              if (t->prop_size <= 0)
 -              {
 -                      t->prop_size = 1.0f;
 -              }
 -              
 -              if (op && RNA_struct_find_property(op->ptr, "proportional_edit_falloff") && RNA_property_is_set(op->ptr, "proportional_edit_falloff"))
 -              {
 -                      t->prop_mode = RNA_enum_get(op->ptr, "proportional_edit_falloff");
 -              }
 -              else
 -              {
 -                      t->prop_mode = ts->prop_mode;
                }
        }
-       if (op && RNA_struct_find_property(op->ptr, "proportional_size") && RNA_property_is_set(op->ptr, "proportional_size"))
-       {
-               t->prop_size = RNA_float_get(op->ptr, "proportional_size");
-       }
-       else
-       {
-               t->prop_size = ts->proportional_size;
-       }
-               
-               /* TRANSFORM_FIX_ME rna restrictions */
-               if (t->prop_size <= 0)
-               {
-                       t->prop_size = 1.0f;
-               }
-               
-       if (op && RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && RNA_property_is_set(op->ptr, "proportional_editing_falloff"))
-       {
-               t->prop_mode = RNA_enum_get(op->ptr, "proportional_editing_falloff");
-       }
-       else
-       {
-               t->prop_mode = ts->prop_mode;
-       }
-       }
--      else /* add not pet option to context when not available */
--      {
--              t->options |= CTX_NO_PET;
--      }
        
        setTransformViewMatrices(t);
        initNumInput(&t->num);
  #include "RNA_access.h"
  
  #include "BKE_action.h"
- #include "BKE_armature.h"
  #include "BKE_context.h"
  #include "BKE_global.h"
- #include "BKE_lattice.h"
  #include "BKE_mesh.h"
- #include "BKE_object.h"
  #include "BKE_particle.h"
  #include "BKE_pointcache.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "BLI_math.h"
  #include "BLI_editVert.h"
Simple merge
  #include "DNA_screen_types.h"
  #include "DNA_space_types.h"
  
- #include "BKE_customdata.h"
  #include "BKE_DerivedMesh.h"
  #include "BKE_mesh.h"
- #include "BKE_object.h"
  #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "BLI_math.h"
  #include "BLI_editVert.h"
@@@ -52,8 -48,6 +52,7 @@@
  #include "BKE_library.h"
  #include "BKE_mesh.h"
  #include "BKE_report.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "ED_image.h"
  #include "ED_mesh.h"
  #include "BKE_context.h"
  #include "BKE_customdata.h"
  #include "BKE_depsgraph.h"
- #include "BKE_global.h"
  #include "BKE_image.h"
  #include "BKE_mesh.h"
- #include "BKE_utildefines.h"
 +#include "BKE_tessmesh.h"
  
  #include "BLI_math.h"
  #include "BLI_edgehash.h"
@@@ -158,8 -158,8 +158,8 @@@ int GPU_lamp_has_shadow_buffer(GPULamp 
  void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize, float winmat[][4]);
  void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp);
  
- void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4]);
+ void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[][4]);
 -void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy);
 +void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float power);
  int GPU_lamp_shadow_layer(GPULamp *lamp);
  
  #ifdef __cplusplus
Simple merge
@@@ -103,10 -99,10 +99,10 @@@ struct GPULamp 
        Object *par;
        Lamp *la;
  
-       int type, mode, lay;
+       int type, mode, lay, hide;
  
 -      float dynenergy, dyncol[3];
 -      float energy, col[3];
 +      float dynpower, dyncol[3];
 +      float power, col[3];
  
        float co[3], vec[3];
        float dynco[3], dynvec[3];
@@@ -256,8 -252,8 +252,8 @@@ void GPU_material_bind(GPUMaterial *mat
                for(nlink=material->lamps.first; nlink; nlink=nlink->next) {
                        lamp= nlink->data;
  
-                       if((lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
+                       if(!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
 -                              lamp->dynenergy = lamp->energy;
 +                              lamp->dynpower = lamp->power;
                                VECCOPY(lamp->dyncol, lamp->col);
                        }
                        else {
@@@ -1325,14 -1352,14 +1329,14 @@@ static void gpu_lamp_from_blender(Scen
        lamp->mode = la->mode;
        lamp->type = la->type;
  
 -      lamp->energy = la->energy;
 -      if(lamp->mode & LA_NEG) lamp->energy= -lamp->energy;
 +      lamp->power= (ELEM(la->type, LA_SUN, LA_HEMI))? la->energy*M_PI: la->energy*M_PI; //XXX la->power;
 +      if(lamp->mode & LA_NEG) lamp->power= -lamp->power;
  
 -      lamp->col[0]= la->r*lamp->energy;
 -      lamp->col[1]= la->g*lamp->energy;
 -      lamp->col[2]= la->b*lamp->energy;
 +      lamp->col[0]= la->r*lamp->power;
 +      lamp->col[1]= la->g*lamp->power;
 +      lamp->col[2]= la->b*lamp->power;
  
-       GPU_lamp_update(lamp, ob->lay, ob->obmat);
+       GPU_lamp_update(lamp, ob->lay, (ob->restrictflag & OB_RESTRICT_RENDER), ob->obmat);
  
        lamp->spotsi= la->spotsize;
        if(lamp->mode & LA_HALO)
  /* DataToC output of file <gpu_shader_material_glsl> */
  
- int datatoc_gpu_shader_material_glsl_size= 33401;
+ int datatoc_gpu_shader_material_glsl_size= 34245;
  char datatoc_gpu_shader_material_glsl[]= {
-  10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,
- 102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,
- 102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44,
-  32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44,
-  32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59,
-  10, 10,  9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93,
-  44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,
- 109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,100,101,108,116, 97, 32, 61, 32,
-  99,109, 97,120, 45, 99,109,105,110, 59, 10, 10,  9,118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,105,102, 32, 40, 99,109, 97,120,
-  33, 61, 48, 46, 48, 41, 10,  9,  9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10,  9,101,108,115,101, 32,
- 123, 10,  9,  9,115, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10, 10,  9,105,102, 32,
-  40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10,  9,101,108,115,101,
-  32,123, 10,  9,  9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41,
-  32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10,  9,  9,105,102, 32, 40,114,103, 98, 46,120,
-  61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10,  9,  9,101,108,115,101, 32,
- 105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32,
-  45, 32, 32, 99, 91, 50, 93, 59, 10,  9,  9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45,
-  32, 99, 91, 48, 93, 59, 10, 10,  9,  9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,102, 32, 40,104, 60, 48, 46, 48,
-  41, 10,  9,  9,  9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99,
-  52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,
- 111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
-  10,123, 10,  9,102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118,
-  59, 10,  9,118,101, 99, 51, 32,114,103, 98, 59, 10, 10,  9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10,  9,115, 32, 61, 32,
- 104,115,118, 91, 49, 93, 59, 10,  9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10,  9,105,102, 40,115, 61, 61, 48, 46, 48,
-  41, 32,123, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10,  9,125, 10,  9,101,
- 108,115,101, 32,123, 10,  9,  9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,
-   9, 10,  9,  9,104, 32, 42, 61, 32, 54, 46, 48, 59, 10,  9,  9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10,  9,  9,
- 102, 32, 61, 32,104, 32, 45, 32,105, 59, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41,
-  59, 10,  9,  9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,
-  40,115, 42,102, 41, 41, 59, 10,  9,  9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41,
-  41, 59, 10,  9,  9, 10,  9,  9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51,
-  40,118, 44, 32,116, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,
- 114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,
- 105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10,  9,
-   9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112,
-  44, 32,113, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103,
-  98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,114,103, 98, 32, 61, 32,
- 118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99,
-  52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51,
-  46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42,
-  42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
-  47, 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118,
-  99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10,  9,118, 99,111,108, 32, 61, 32,118,101,
-  99, 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53,
-  53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,
- 111,105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116,
-  32,118,101, 99, 51, 32,117,118, 41, 10,123, 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48,
-  32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
-  32,103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,
- 101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,
- 117,118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,
- 108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119,
-  44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,
- 116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,
- 116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,  9,108,111, 99, 97,108, 32, 61, 32, 99,111,
-  59, 10,  9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10,  9,103,108,111,
-  98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46,
-  48, 41, 41, 46,120,121,122, 59, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,  9,117,118, 95, 97,116,
- 116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10,  9,110,111,114,109, 97,108, 32, 61, 32, 45,110,
- 111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114,
-  32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,118, 99,111,108, 95, 97,116,116,114,
- 105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10,  9,102,114,111,110,116, 98, 97, 99,107,
-  32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99,
-  44, 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,
- 120,118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,
- 111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,
- 116, 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,105,102, 40,100,111,109,
- 105,110, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99,
-  44, 32,109,105,110,118,101, 99, 41, 59, 10,  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,
- 117,116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,
- 118,111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
- 116,118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,
- 108,111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40,
-  99,111, 46,122, 41, 59, 10,  9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10,  9,111,
- 117,116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
- 109, 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44,
-  32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,
-  97,108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,
- 116, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,
- 111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118,
-  97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116,
-  32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
- 118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10,
-  10,118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,
- 111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,
- 102, 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,
-   9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10,
-  10,118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,
- 108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108,
-  41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108,
-  44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,
-  99,111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,
- 108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,
- 117,116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,
- 115,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
-  10,123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46,
-  48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,
-   9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115,
+  10,102,108,111, 97,
+ 116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110,
+  32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+ 114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
+ 116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44,
+  32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120, 32, 61, 32,109, 97,
+ 120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,
+   9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,
+ 114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10,
+   9,118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10,  9,  9,115, 32, 61,
+  32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10,  9,101,108,115,101, 32,123, 10,  9,  9,115, 32, 61, 32, 48, 46, 48, 59,
+  10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10, 10,  9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123,
+  10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9, 99, 32, 61, 32, 40,118,101,
+  99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47,
+  99,100,101,108,116, 97, 59, 10, 10,  9,  9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32,
+  99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,
+ 109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10,  9,  9,101,
+ 108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10,  9,  9,104, 32,
+  47, 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10,  9,  9,  9,104, 32, 43, 61, 32, 49, 46,
+  48, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,
+ 103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,
+ 115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,105, 44,
+  32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10,  9,118,101, 99, 51, 32,114,103, 98, 59,
+  10, 10,  9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10,  9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10,  9,118, 32, 61,
+  32,104,115,118, 91, 50, 93, 59, 10, 10,  9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 32, 61, 32,
+ 118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9,105,102, 40,104,
+  61, 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9, 10,  9,  9,104, 32, 42, 61, 32, 54, 46, 48,
+  59, 10,  9,  9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10,  9,  9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10,  9,
+   9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10,  9,  9,112, 32, 61, 32,118, 42, 40, 49,
+  46, 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10,  9,  9,116, 32,
+  61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10,  9,  9, 10,  9,  9,105,102, 32, 40,
+ 105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10,  9,
+   9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113,
+  44, 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103,
+  98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32,
+  61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10,  9,  9,101,
+ 108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,
+ 112, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113,
+  41, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,119,
+  41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,
+ 111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10,  9,  9,114,101,116,117,
+ 114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57,
+  50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53,
+  53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,
+ 105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40,
+  99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48,
+  41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,
+ 110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53,
+  53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99,
+  52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9,
+  99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108,
+  95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,
+ 110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61,
+  32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,
+   9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,
+ 108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44,
+  32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,
+ 108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9,
+  99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108,
+  95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,
+ 116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61,
+  32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49,
+  52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+  42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10,
+  10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,
+ 108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10,  9,118, 99,111,108, 32, 61, 32,118,101, 99, 52,
+  40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46,
+  48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,
+ 100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,
+ 101, 99, 51, 32,117,118, 41, 10,123, 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45,
+  32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,
+ 101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,
+ 105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118,
+  44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44,
+  32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,
+ 111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,
+ 118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,
+ 102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,  9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10,
+   9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10,  9,103,108,111, 98, 97,
+ 108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41,
+  41, 46,120,121,122, 59, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,  9,117,118, 95, 97,116,116,114,
+ 105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10,  9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,
+ 109, 97,108,105,122,101, 40,110,111,114, 41, 59,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,
+ 111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,118, 99,111,108, 95, 97,116,116,114,105, 98,
+ 117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10,  9,102,114,111,110,116, 98, 97, 99,107, 32, 61,
+  32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,
+ 109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,
+ 101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,
+ 116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32,
+  42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,105,102, 40,100,111,109,105,110,
+  32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,
+ 109,105,110,118,101, 99, 41, 59, 10,  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,
+ 118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,
+ 105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,
+ 105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111,
+  97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111,
+  46,122, 41, 59, 10,  9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10,  9,111,117,116,
+ 118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,
+ 116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,
+ 117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108,
+  49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,
+ 102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,
+ 116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108,
+  50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118,
+  97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
+ 108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,
+ 111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,
+ 116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32,
+  40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,
+ 108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,
+ 111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111,
+  97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59,
+  10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,
+ 111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 99,111,
+ 115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111,
+  97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,
+ 118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,
+ 110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
+  10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41,
+  10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,
+ 117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,
+ 108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,
+ 102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,  9,  9,
+ 111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118,
+  97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,
+ 116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
+  97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119,
+  40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111,
+  97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10,  9,
+   9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101,
+  10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,
+ 103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,
+ 111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38,
+  32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49,
+  41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 61, 32,
+  48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49,
+  44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+ 123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,
+ 118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,
+ 118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,
+ 108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,
+ 104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
+ 118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41,
+  59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118,
+  97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
+ 108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61,
+  32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,
+ 111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49,
+  44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+ 123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46,
+  48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100,
+  32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44,
+  32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
+  10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49,
+  56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59,
+  10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,
+ 101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111,
+  97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,
+   9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,
+ 111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48,
+  59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,
+ 118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,
+ 111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59,
+  10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115,
+  40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46,
+  48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51,
+  32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,
+ 117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32,
+  43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,
+   9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,
+ 118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,
+ 118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+ 117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41,
+  59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100,
+  32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50,
+  44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
+ 118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10,
+   9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,
+ 100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116,
+  32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+ 123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,111,117,116,118,101, 99, 32, 61,
+  32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,
+ 110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10,
+   9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,
+ 100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,
+ 111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,110,111,114, 32, 61, 32,100,105,
+ 114, 59, 10,  9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,
+ 118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,
+ 118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99,
+  51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 49,
+  68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,120,
+  59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112,
+  44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10,  9,111,117,116,118,101, 99, 46,
+ 122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32, 43,
+  32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,
+   9,  9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40,
+  49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,
+ 108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,
+ 114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,
+ 111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,
+ 114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10,  9,111,117,116,
+  99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,
+ 117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10,  9,111,117,
+ 116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,
+ 116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 10,  9,
+ 105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, 99,
+ 111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,  9,111,117,116,
+  99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101,
   40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
 -  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,118,
 -101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116,
 - 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52,
 - 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,108,
 - 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111,
 -117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48,
 - 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97,
 -116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,
 -105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41,
 - 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
 -115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,123,
 - 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,
 -120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101,
 - 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99,
 - 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108,
 - 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108,
 - 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111,
 - 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,
 -116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
 - 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49,
 - 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61,
 - 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,
 -102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,
 -101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32,
 - 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,
 -111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,
 -108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102,
 - 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101,
 - 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48,
 - 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97,
 - 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,
 -102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42,
 - 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
 - 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97,
 +  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,
 +  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,
 +116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,
 +111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,
 +116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,
 +111,119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,
 +108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41,
 + 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,  9,101,108,
 +115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,
 +108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,
 +102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32,
 + 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,
 +108, 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108,
 + 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,
 +108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
 + 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125,
 + 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,
 +116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,
 +118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
 + 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
 +117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46,
 + 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116,
 + 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
 +118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108,
 + 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10,
 + 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,
 +108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
 + 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,
 + 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,
 +105,100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,
 +104, 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
 +108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46,
 + 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41,
 + 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44,
 + 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,
 +108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50,
 + 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,
 +115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51,
 + 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49,
 + 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,
 +102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118,
 + 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97,
 + 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47,
 + 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101,
 + 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44,
 + 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,
 + 49, 32, 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41,
 + 59, 10,  9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125,
 + 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99,
 + 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116,
 + 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32,
 + 48, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,
 +105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,
 +118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
 +117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41,
 + 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,
 +111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,
 +117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
 + 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,111,117,116,118,101, 99,
 + 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,
 +104, 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,
 +123, 10,  9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99,
 + 51, 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,
 + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,110,111,114, 32, 61, 32,
 +100,105,114, 59, 10,  9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125,
 + 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
 + 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,
 +101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,
 +101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41,
 + 46,120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109,
 + 97,112, 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10,  9,111,117,116,118,101,
 + 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122,
 + 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48,
 + 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99,
 + 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98,
 + 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32,
 + 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,
 +116, 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,
 +116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10,  9,111,
 +117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,
 +120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10,  9,
 +111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,
 +101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10,
 + 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,
 +116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,  9,111,
 +117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,
 +117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
 +123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98,
 + 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,
 +117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101,
 + 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,
 +111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111,
 + 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 48,
 + 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,
 +111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,
 +118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,
 +108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,
 +100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41,
 + 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
 +109,105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
 +118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,
 + 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,
 +111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,
 +111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,
 +108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,
 +111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,
 +102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,
 +108, 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97,
 + 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,
  116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
   32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
 - 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45,
 - 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,116, 99,
 -111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43,
 - 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,
 -114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45,
 - 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10,  9,105,102,
 - 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102,
 - 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,
 -116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40,
 - 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59,
 - 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98,
 - 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,101,108,115,101,
 - 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,
 -102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,
 -108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
 - 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
 -111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
 - 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32,
 - 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97,
 - 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
 - 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
 -111,108,&nb